GPUShaderCreateInfo: Add DepthWrite option

This option lets specify explicitely how the fragment shader will change
the fragment's depth.
This commit is contained in:
Clément Foucault 2022-03-30 15:12:11 +02:00
parent 5aa81594e6
commit fb524d1675
3 changed files with 40 additions and 0 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;