diff options
| author | davli-nv <davli@nvidia.com> | 2025-08-20 17:30:44 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-21 00:30:44 +0000 |
| commit | 05f0f5603561daed2c134e13bc64649362759968 (patch) | |
| tree | ff1ea0eb835dd636a459603ea0285290d504b9b7 /source | |
| parent | cbd73dde3dd2da790bb663385a229ce22965c43c (diff) | |
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>
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/glsl.meta.slang | 2 | ||||
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 5 | ||||
| -rw-r--r-- | source/slang/slang-ir-glsl-legalize.cpp | 8 | ||||
| -rw-r--r-- | source/slang/slang-ir-legalize-varying-params.h | 1 | ||||
| -rw-r--r-- | source/slang/slang-parameter-binding.cpp | 5 |
5 files changed, 19 insertions, 2 deletions
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<TypeLayout> 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; } |
