GPUShaderCreateInfo: Add DepthWrite option
This option lets specify explicitely how the fragment shader will change the fragment's depth.
This commit is contained in:
parent
5aa81594e6
commit
fb524d1675
|
@ -65,6 +65,9 @@ void ShaderCreateInfo::finalize()
|
|||
if (info.early_fragment_test_) {
|
||||
early_fragment_test_ = true;
|
||||
}
|
||||
if (info.depth_write_ != DepthWrite::ANY) {
|
||||
depth_write_ = info.depth_write_;
|
||||
}
|
||||
|
||||
validate(info);
|
||||
|
||||
|
|
|
@ -130,6 +130,17 @@ enum class BuiltinBits {
|
|||
};
|
||||
ENUM_OPERATORS(BuiltinBits, BuiltinBits::WORK_GROUP_SIZE);
|
||||
|
||||
/**
|
||||
* Follow convention described in:
|
||||
* https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_conservative_depth.txt
|
||||
*/
|
||||
enum class DepthWrite {
|
||||
ANY = 0,
|
||||
GREATER,
|
||||
LESS,
|
||||
UNCHANGED,
|
||||
};
|
||||
|
||||
/* Samplers & images. */
|
||||
enum class ImageType {
|
||||
/** Color samplers/image. */
|
||||
|
@ -273,6 +284,8 @@ struct ShaderCreateInfo {
|
|||
bool auto_resource_location_ = false;
|
||||
/** If true, force depth and stencil tests to always happen before fragment shader invocation. */
|
||||
bool early_fragment_test_ = false;
|
||||
/** Allow optimisation when fragment shader writes to gl_FragDepth. */
|
||||
DepthWrite depth_write_ = DepthWrite::ANY;
|
||||
/**
|
||||
* Maximum length of all the resource names including each null terminator.
|
||||
* Only for names used by gpu::ShaderInterface.
|
||||
|
@ -695,6 +708,13 @@ struct ShaderCreateInfo {
|
|||
return *(Self *)this;
|
||||
}
|
||||
|
||||
/* Defines how the fragment shader will write to gl_FragDepth. */
|
||||
Self &depth_write(DepthWrite value)
|
||||
{
|
||||
depth_write_ = value;
|
||||
return *(Self *)this;
|
||||
}
|
||||
|
||||
Self &auto_resource_location(bool value)
|
||||
{
|
||||
auto_resource_location_ = value;
|
||||
|
|
|
@ -217,6 +217,20 @@ static const char *to_string(const PrimitiveOut &layout)
|
|||
}
|
||||
}
|
||||
|
||||
static const char *to_string(const DepthWrite &value)
|
||||
{
|
||||
switch (value) {
|
||||
case DepthWrite::ANY:
|
||||
return "depth_any";
|
||||
case DepthWrite::GREATER:
|
||||
return "depth_greater";
|
||||
case DepthWrite::LESS:
|
||||
return "depth_less";
|
||||
default:
|
||||
return "depth_unchanged";
|
||||
}
|
||||
}
|
||||
|
||||
static void print_image_type(std::ostream &os,
|
||||
const ImageType &type,
|
||||
const ShaderCreateInfo::Resource::BindType bind_type)
|
||||
|
@ -585,6 +599,9 @@ std::string GLShader::fragment_interface_declare(const ShaderCreateInfo &info) c
|
|||
if (info.early_fragment_test_) {
|
||||
ss << "layout(early_fragment_tests) in;\n";
|
||||
}
|
||||
if (GLEW_VERSION_4_2 || GLEW_ARB_conservative_depth) {
|
||||
ss << "layout(" << to_string(info.depth_write_) << ") out float gl_FragDepth;\n";
|
||||
}
|
||||
ss << "\n/* Outputs. */\n";
|
||||
for (const ShaderCreateInfo::FragOut &output : info.fragment_outputs_) {
|
||||
ss << "layout(location = " << output.index;
|
||||
|
|
Loading…
Reference in New Issue