summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/slang/glsl.meta.slang3
-rw-r--r--source/slang/slang-emit-glsl.cpp8
-rw-r--r--source/slang/slang-emit-spirv.cpp17
-rw-r--r--source/slang/slang-ir-glsl-legalize.cpp18
4 files changed, 46 insertions, 0 deletions
diff --git a/source/slang/glsl.meta.slang b/source/slang/glsl.meta.slang
index dfa858eca..782c09bb9 100644
--- a/source/slang/glsl.meta.slang
+++ b/source/slang/glsl.meta.slang
@@ -216,6 +216,9 @@ public in int gl_ViewportIndex : SV_ViewportArrayIndex;
public in int gl_BaseVertex : SV_StartVertexLocation;
public in int gl_BaseInstance : SV_StartInstanceLocation;
+public in int gl_FragInvocationCountEXT : SV_FragInvocationCount;
+public in int2 gl_FragSizeEXT : SV_FragSize;
+
// Override operator* behavior to compute algebric product of matrices and vectors.
diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp
index eb71286a2..eb6d4c694 100644
--- a/source/slang/slang-emit-glsl.cpp
+++ b/source/slang/slang-emit-glsl.cpp
@@ -1246,6 +1246,14 @@ void GLSLSourceEmitter::_maybeEmitGLSLBuiltin(IRGlobalParam* var, UnownedStringS
{
_requireGLSLExtension(toSlice("GL_EXT_fragment_shading_rate_primitive"));
}
+ else if (name == "gl_FragSizeEXT")
+ {
+ _requireGLSLExtension(toSlice("GL_EXT_fragment_invocation_density"));
+ }
+ else if (name == "gl_FragInvocationCountEXT")
+ {
+ _requireGLSLExtension(toSlice("GL_EXT_fragment_invocation_density"));
+ }
else if (name == "gl_DrawID")
{
_requireGLSLVersion(460);
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp
index da2620856..a5a77e148 100644
--- a/source/slang/slang-emit-spirv.cpp
+++ b/source/slang/slang-emit-spirv.cpp
@@ -6226,6 +6226,23 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
SpvBuiltInCullPrimitiveEXT,
inst);
}
+ else if (semanticName == "sv_fragsize")
+ {
+ requireSPIRVCapability(SpvCapabilityFragmentDensityEXT);
+ ensureExtensionDeclaration(
+ UnownedStringSlice("SPV_EXT_fragment_invocation_density"));
+ return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInFragSizeEXT, inst);
+ }
+ else if (semanticName == "sv_fraginvocationcount")
+ {
+ requireSPIRVCapability(SpvCapabilityFragmentDensityEXT);
+ ensureExtensionDeclaration(
+ UnownedStringSlice("SPV_EXT_fragment_invocation_density"));
+ return getBuiltinGlobalVar(
+ inst->getFullType(),
+ SpvBuiltInFragInvocationCountEXT,
+ inst);
+ }
else if (semanticName == "sv_shadingrate")
{
requireSPIRVCapability(SpvCapabilityFragmentShadingRateKHR);
diff --git a/source/slang/slang-ir-glsl-legalize.cpp b/source/slang/slang-ir-glsl-legalize.cpp
index af14eaee0..dce85efd3 100644
--- a/source/slang/slang-ir-glsl-legalize.cpp
+++ b/source/slang/slang-ir-glsl-legalize.cpp
@@ -885,6 +885,24 @@ GLSLSystemValueInfo* getGLSLSystemValueInfo(
name = "gl_PrimitiveShadingRateEXT";
}
}
+ else if (semanticName == "sv_fragsize")
+ {
+ name = "gl_FragSizeEXT";
+ context->requireGLSLVersion(ProfileVersion::GLSL_450);
+ context->requireGLSLExtension(
+ UnownedStringSlice::fromLiteral("GL_EXT_fragment_invocation_density"));
+ requiredType = builder->getVectorType(
+ builder->getBasicType(BaseType::Int),
+ builder->getIntValue(builder->getIntType(), 2));
+ }
+ else if (semanticName == "sv_fraginvocationcount")
+ {
+ name = "gl_FragInvocationCountEXT";
+ context->requireGLSLVersion(ProfileVersion::GLSL_450);
+ context->requireGLSLExtension(
+ UnownedStringSlice::fromLiteral("GL_EXT_fragment_invocation_density"));
+ requiredType = builder->getIntType();
+ }
else if (semanticName == "sv_startvertexlocation")
{
context->requireGLSLVersion(ProfileVersion::GLSL_460);