diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/glsl.meta.slang | 3 | ||||
| -rw-r--r-- | source/slang/slang-emit-glsl.cpp | 8 | ||||
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 17 | ||||
| -rw-r--r-- | source/slang/slang-ir-glsl-legalize.cpp | 18 |
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); |
