diff --git a/source/blender/gpu/glsl_preprocess/glsl_preprocess.hh b/source/blender/gpu/glsl_preprocess/glsl_preprocess.hh index 3cb07d0fca6..763271fad7b 100644 --- a/source/blender/gpu/glsl_preprocess/glsl_preprocess.hh +++ b/source/blender/gpu/glsl_preprocess/glsl_preprocess.hh @@ -49,6 +49,7 @@ static uint64_t hash(const std::string &name) enum Builtin : uint64_t { FragCoord = hash("gl_FragCoord"), + FragStencilRef = hash("gl_FragStencilRefARB"), FrontFacing = hash("gl_FrontFacing"), GlobalInvocationID = hash("gl_GlobalInvocationID"), InstanceID = hash("gl_InstanceID"), @@ -1345,6 +1346,7 @@ class Preprocessor { using namespace metadata; /* TODO: This can trigger false positive caused by disabled #if blocks. */ std::string tokens[] = {"gl_FragCoord", + "gl_FragStencilRefARB", "gl_FrontFacing", "gl_GlobalInvocationID", "gl_InstanceID", diff --git a/source/blender/gpu/intern/gpu_shader_create_info.hh b/source/blender/gpu/intern/gpu_shader_create_info.hh index acb648e5158..256e22e0d2c 100644 --- a/source/blender/gpu/intern/gpu_shader_create_info.hh +++ b/source/blender/gpu/intern/gpu_shader_create_info.hh @@ -446,6 +446,7 @@ enum class BuiltinBits { * \note Emulated on OpenGL. */ BARYCENTRIC_COORD = (1 << 0), + STENCIL_REF = (1 << 1), FRAG_COORD = (1 << 2), FRONT_FACING = (1 << 4), GLOBAL_INVOCATION_ID = (1 << 5), diff --git a/source/blender/gpu/intern/gpu_shader_dependency.cc b/source/blender/gpu/intern/gpu_shader_dependency.cc index 4002ad136cd..979f18c69da 100644 --- a/source/blender/gpu/intern/gpu_shader_dependency.cc +++ b/source/blender/gpu/intern/gpu_shader_dependency.cc @@ -77,6 +77,8 @@ struct GPUSource { switch (builtin) { case Builtin::FragCoord: return BuiltinBits::FRAG_COORD; + case Builtin::FragStencilRef: + return BuiltinBits::STENCIL_REF; case Builtin::FrontFacing: return BuiltinBits::FRONT_FACING; case Builtin::GlobalInvocationID: diff --git a/source/blender/gpu/metal/mtl_shader_generator.mm b/source/blender/gpu/metal/mtl_shader_generator.mm index 0c956f1afc3..35630d02224 100644 --- a/source/blender/gpu/metal/mtl_shader_generator.mm +++ b/source/blender/gpu/metal/mtl_shader_generator.mm @@ -556,9 +556,7 @@ bool MTLShader::generate_msl_from_glsl(const shader::ShaderCreateInfo *info) shd_builder_->glsl_fragment_source_.find("gl_FragDepth") != std::string::npos; - /* TODO(fclem): Add to create info. */ - msl_iface.uses_gl_FragStencilRefARB = shd_builder_->glsl_fragment_source_.find( - "gl_FragStencilRefARB") != std::string::npos; + msl_iface.uses_gl_FragStencilRefARB = bool(info->builtins_ & BuiltinBits::STENCIL_REF); msl_iface.depth_write = info->depth_write_;