From 05f0f5603561daed2c134e13bc64649362759968 Mon Sep 17 00:00:00 2001 From: davli-nv Date: Wed, 20 Aug 2025 17:30:44 -0700 Subject: Implement SV_VulkanSamplePosition (#8236) -Adds semantic SV_VulkanSamplePosition that emits corresponding gl_SamplePosition and SpvBuiltinSamplePosition -Adds gl_SamplePosition property to glsl.meta.slang -Adds SPIRV and GLSL tests for the semantic and property -Plan is to later implement SV_SamplePosition that follows HLSL range of -0.5 to +0.5, and emits GetRenderTargetSamplePosition(SV_SampleIndex) which needs more complicated IR manipulation for HLSL and Metal Fixes #7906 --------- Co-authored-by: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> --- source/slang/glsl.meta.slang | 2 ++ source/slang/slang-emit-spirv.cpp | 5 +++++ source/slang/slang-ir-glsl-legalize.cpp | 8 ++++++++ source/slang/slang-ir-legalize-varying-params.h | 1 + source/slang/slang-parameter-binding.cpp | 5 +++-- 5 files changed, 19 insertions(+), 2 deletions(-) (limited to 'source') diff --git a/source/slang/glsl.meta.slang b/source/slang/glsl.meta.slang index 5a78a9960..9112c1d2a 100644 --- a/source/slang/glsl.meta.slang +++ b/source/slang/glsl.meta.slang @@ -219,6 +219,8 @@ public in int gl_BaseInstance : SV_StartInstanceLocation; public in int gl_FragInvocationCountEXT : SV_FragInvocationCount; public in int2 gl_FragSizeEXT : SV_FragSize; +public in float2 gl_SamplePosition : SV_VulkanSamplePosition; + // Override operator* behavior to compute algebric product of matrices and vectors. diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index aa4c3bec8..6b42896d0 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -6182,6 +6182,11 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex requireSPIRVCapability(SpvCapabilitySampleRateShading); return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInSampleId, inst); } + else if (semanticName == "sv_vulkansampleposition") + { + requireSPIRVCapability(SpvCapabilitySampleRateShading); + return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInSamplePosition, inst); + } else if (semanticName == "sv_stencilref") { requireSPIRVCapability(SpvCapabilityStencilExportEXT); diff --git a/source/slang/slang-ir-glsl-legalize.cpp b/source/slang/slang-ir-glsl-legalize.cpp index d1a534c66..65b997195 100644 --- a/source/slang/slang-ir-glsl-legalize.cpp +++ b/source/slang/slang-ir-glsl-legalize.cpp @@ -756,6 +756,14 @@ GLSLSystemValueInfo* getGLSLSystemValueInfo( requiredType = builder->getBasicType(BaseType::Int); name = "gl_SampleID"; } + else if (semanticName == "sv_vulkansampleposition") + { + context->requireGLSLVersion(ProfileVersion::GLSL_400); + requiredType = builder->getVectorType( + builder->getBasicType(BaseType::Float), + builder->getIntValue(builder->getIntType(), 2)); + name = "gl_SamplePosition"; + } else if (semanticName == "sv_stencilref") { // uint in hlsl, int in glsl diff --git a/source/slang/slang-ir-legalize-varying-params.h b/source/slang/slang-ir-legalize-varying-params.h index 4f23b1e6d..14a5c5d97 100644 --- a/source/slang/slang-ir-legalize-varying-params.h +++ b/source/slang/slang-ir-legalize-varying-params.h @@ -75,6 +75,7 @@ void depointerizeInputParams(IRFunc* entryPoint); M(QuadLaneIndex, SV_QuadLaneIndex) \ M(VulkanVertexID, SV_VulkanVertexID) \ M(VulkanInstanceID, SV_VulkanInstanceID) \ + M(VulkanSamplePosition, SV_VulkanSamplePosition) \ M(Barycentrics, SV_Barycentrics) \ /* end */ diff --git a/source/slang/slang-parameter-binding.cpp b/source/slang/slang-parameter-binding.cpp index 89e633857..4b91056fc 100644 --- a/source/slang/slang-parameter-binding.cpp +++ b/source/slang/slang-parameter-binding.cpp @@ -1821,11 +1821,12 @@ static RefPtr processSimpleEntryPointParameter( // We need to compute whether an entry point consumes // any sample-rate inputs, and along with explicitly // `sample`-qualified parameters, we also need to - // detect use of `SV_SampleIndex` as an input. + // detect use of `SV_SampleIndex` and + // `SV_VulkanSamplePosition` as an input. // if (state.directionMask & kEntryPointParameterDirection_Input) { - if (sn == "sv_sampleindex") + if (sn == "sv_sampleindex" || sn == "sv_vulkansampleposition") { state.isSampleRate = true; } -- cgit v1.2.3