diff options
| author | Darren Wihandi <65404740+fairywreath@users.noreply.github.com> | 2024-12-20 01:00:20 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-12-19 22:00:20 -0800 |
| commit | a00db74d1afa717dd90dfcf3170c63d0d1c0d3d7 (patch) | |
| tree | 0e286826852990c9fb5b4e531a5b3eeb1da48f96 /source | |
| parent | 2e9605e79c64315ecad7ae8297d996ae2ed4687b (diff) | |
Add base vertex and base instance system values (#5918)
* Add base vertex and base instance system values
* Fixed incorrect stage in tests
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/glsl.meta.slang | 2 | ||||
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 10 | ||||
| -rw-r--r-- | source/slang/slang-ir-glsl-legalize.cpp | 16 | ||||
| -rw-r--r-- | source/slang/slang-ir-legalize-varying-params.h | 2 | ||||
| -rw-r--r-- | source/slang/slang-ir-metal-legalize.cpp | 12 | ||||
| -rw-r--r-- | source/slang/slang-ir-wgsl-legalize.cpp | 2 | ||||
| -rw-r--r-- | source/slang/slang-language-server-completion.cpp | 2 |
7 files changed, 46 insertions, 0 deletions
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 @@ -660,6 +660,18 @@ struct LegalizeMetalEntryPointContext 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: m_sink->diagnose( parentVar, 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) |
