From a00db74d1afa717dd90dfcf3170c63d0d1c0d3d7 Mon Sep 17 00:00:00 2001 From: Darren Wihandi <65404740+fairywreath@users.noreply.github.com> Date: Fri, 20 Dec 2024 01:00:20 -0500 Subject: Add base vertex and base instance system values (#5918) * Add base vertex and base instance system values * Fixed incorrect stage in tests --- source/slang/glsl.meta.slang | 2 ++ source/slang/slang-emit-spirv.cpp | 10 ++++++++++ source/slang/slang-ir-glsl-legalize.cpp | 16 ++++++++++++++++ source/slang/slang-ir-legalize-varying-params.h | 2 ++ source/slang/slang-ir-metal-legalize.cpp | 12 ++++++++++++ source/slang/slang-ir-wgsl-legalize.cpp | 2 ++ source/slang/slang-language-server-completion.cpp | 2 ++ 7 files changed, 46 insertions(+) (limited to 'source') diff --git a/source/slang/glsl.meta.slang b/source/slang/glsl.meta.slang index 361a956f2..7bcc92f7d 100644 --- a/source/slang/glsl.meta.slang +++ b/source/slang/glsl.meta.slang @@ -146,6 +146,8 @@ public in int gl_SampleID : SV_SampleIndex; public in int gl_VertexIndex : SV_VertexID; public in int gl_ViewIndex : SV_ViewID; public in int gl_ViewportIndex : SV_ViewportArrayIndex; +public in int gl_BaseVertex : SV_StartVertexLocation; +public in int gl_BaseInstance : SV_StartInstanceLocation; // 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 63ebfcf6e..51ff9066c 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -5303,6 +5303,16 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex SpvBuiltInShadingRateKHR, inst); } + else if (semanticName == "sv_startvertexlocation") + { + requireSPIRVCapability(SpvCapabilityDrawParameters); + return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInBaseVertex, inst); + } + else if (semanticName == "sv_startinstancelocation") + { + requireSPIRVCapability(SpvCapabilityDrawParameters); + return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInBaseInstance, inst); + } SLANG_UNREACHABLE("Unimplemented system value in spirv emit."); } } diff --git a/source/slang/slang-ir-glsl-legalize.cpp b/source/slang/slang-ir-glsl-legalize.cpp index 619682692..09bf245df 100644 --- a/source/slang/slang-ir-glsl-legalize.cpp +++ b/source/slang/slang-ir-glsl-legalize.cpp @@ -831,6 +831,22 @@ GLSLSystemValueInfo* getGLSLSystemValueInfo( name = "gl_PrimitiveShadingRateEXT"; } } + else if (semanticName == "sv_startvertexlocation") + { + context->requireGLSLVersion(ProfileVersion::GLSL_460); + + // uint in hlsl, int in glsl (https://www.khronos.org/opengl/wiki/Built-in_Variable_(GLSL)) + requiredType = builder->getBasicType(BaseType::Int); + name = "gl_BaseVertex"; + } + else if (semanticName == "sv_startinstancelocation") + { + context->requireGLSLVersion(ProfileVersion::GLSL_460); + + // uint in hlsl, int in glsl (https://www.khronos.org/opengl/wiki/Built-in_Variable_(GLSL)) + requiredType = builder->getBasicType(BaseType::Int); + name = "gl_BaseInstance"; + } if (name) { diff --git a/source/slang/slang-ir-legalize-varying-params.h b/source/slang/slang-ir-legalize-varying-params.h index c8952f604..7604cb245 100644 --- a/source/slang/slang-ir-legalize-varying-params.h +++ b/source/slang/slang-ir-legalize-varying-params.h @@ -57,6 +57,8 @@ IRInst* emitCalcGroupIndex(IRBuilder& builder, IRInst* groupThreadID, IRInst* gr M(ViewID, SV_ViewID) \ M(ViewportArrayIndex, SV_ViewportArrayIndex) \ M(Target, SV_Target) \ + M(StartVertexLocation, SV_StartVertexLocation) \ + M(StartInstanceLocation, SV_StartInstanceLocation) \ /* end */ /// A known system-value semantic name that can be applied to a parameter diff --git a/source/slang/slang-ir-metal-legalize.cpp b/source/slang/slang-ir-metal-legalize.cpp index 65c547d82..835041a59 100644 --- a/source/slang/slang-ir-metal-legalize.cpp +++ b/source/slang/slang-ir-metal-legalize.cpp @@ -658,6 +658,18 @@ struct LegalizeMetalEntryPointContext .produceString(); result.permittedTypes = getPermittedTypes_sv_target(builder); + break; + } + case SystemValueSemanticName::StartVertexLocation: + { + result.metalSystemValueName = toSlice("base_vertex"); + result.permittedTypes.add(builder.getBasicType(BaseType::UInt)); + break; + } + case SystemValueSemanticName::StartInstanceLocation: + { + result.metalSystemValueName = toSlice("base_instance"); + result.permittedTypes.add(builder.getBasicType(BaseType::UInt)); break; } default: diff --git a/source/slang/slang-ir-wgsl-legalize.cpp b/source/slang/slang-ir-wgsl-legalize.cpp index afdf412b1..907c2b8ba 100644 --- a/source/slang/slang-ir-wgsl-legalize.cpp +++ b/source/slang/slang-ir-wgsl-legalize.cpp @@ -359,6 +359,8 @@ struct LegalizeWGSLEntryPointContext case SystemValueSemanticName::ViewID: case SystemValueSemanticName::ViewportArrayIndex: + case SystemValueSemanticName::StartVertexLocation: + case SystemValueSemanticName::StartInstanceLocation: { result.isUnsupported = true; break; diff --git a/source/slang/slang-language-server-completion.cpp b/source/slang/slang-language-server-completion.cpp index 03c6b88ed..77ed33002 100644 --- a/source/slang/slang-language-server-completion.cpp +++ b/source/slang/slang-language-server-completion.cpp @@ -126,6 +126,8 @@ static const char* hlslSemanticNames[] = { "SV_ViewID", "SV_ViewportArrayIndex", "SV_ShadingRate", + "SV_StartVertexLocation", + "SV_StartInstanceLocation", }; bool isDeclKeyword(const UnownedStringSlice& slice) -- cgit v1.2.3