summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-03-10 21:23:57 -0700
committerGitHub <noreply@github.com>2024-03-10 21:23:57 -0700
commit25a7d51445e64253beca5c4f70ddd52f40226b1d (patch)
treec4548d82fa003d315de27270267411126390d86d
parent10c4d2e76af284903c7552a05ad757c2a608b803 (diff)
Fix spirv builtin for `SV_ShadingRate`. (#3730)
-rw-r--r--source/slang/slang-emit-glsl.cpp8
-rw-r--r--source/slang/slang-emit-spirv.cpp6
-rw-r--r--tests/spirv/shading-rate.slang7
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;
+}