diff options
| author | Yong He <yonghe@outlook.com> | 2024-03-10 21:23:57 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-10 21:23:57 -0700 |
| commit | 25a7d51445e64253beca5c4f70ddd52f40226b1d (patch) | |
| tree | c4548d82fa003d315de27270267411126390d86d | |
| parent | 10c4d2e76af284903c7552a05ad757c2a608b803 (diff) | |
Fix spirv builtin for `SV_ShadingRate`. (#3730)
| -rw-r--r-- | source/slang/slang-emit-glsl.cpp | 8 | ||||
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 6 | ||||
| -rw-r--r-- | tests/spirv/shading-rate.slang | 7 |
3 files changed, 20 insertions, 1 deletions
diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp index 55f6d140c..d37a6840b 100644 --- a/source/slang/slang-emit-glsl.cpp +++ b/source/slang/slang-emit-glsl.cpp @@ -928,6 +928,14 @@ void GLSLSourceEmitter::_maybeEmitGLSLBuiltin(IRGlobalParam* var, UnownedStringS m_writer->emit(";\n\n"); } } + else if (name == "gl_ShadingRateEXT") + { + _requireGLSLExtension(toSlice("GL_EXT_fragment_shading_rate")); + } + else if (name == "gl_PrimitiveShadingRateEXT") + { + _requireGLSLExtension(toSlice("GL_EXT_fragment_shading_rate_primitive")); + } } void GLSLSourceEmitter::_requireBaseType(BaseType baseType) diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index 1a661920a..2f318c464 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -3663,7 +3663,11 @@ struct SPIRVEmitContext { requireSPIRVCapability(SpvCapabilityFragmentShadingRateKHR); ensureExtensionDeclaration(UnownedStringSlice("SPV_KHR_fragment_shading_rate")); - return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInPrimitiveShadingRateKHR); + auto importDecor = inst->findDecoration<IRImportDecoration>(); + if (importDecor && importDecor->getMangledName() == "gl_PrimitiveShadingRateEXT") + return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInPrimitiveShadingRateKHR); + else + return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInShadingRateKHR); } SLANG_UNREACHABLE("Unimplemented system value in spirv emit."); } diff --git a/tests/spirv/shading-rate.slang b/tests/spirv/shading-rate.slang new file mode 100644 index 000000000..638ed7548 --- /dev/null +++ b/tests/spirv/shading-rate.slang @@ -0,0 +1,7 @@ +//TEST:SIMPLE(filecheck=CHECK): -target spirv -entry main -emit-spirv-directly + +// CHECK: BuiltIn ShadingRateKHR +[shader("fragment")] +uint main(uint shading_rate : SV_ShadingRate) : SV_Target { + return shading_rate; +} |
