Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add SV_DrawIndex. #5787

Merged
merged 2 commits into from
Dec 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion docs/user-guide/a2-01-spirv-target-specific.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ The system-value semantics are translated to the following SPIR-V code.
| `SV_DepthLessEqual` | `BuiltIn FragDepth` |
| `SV_DispatchThreadID` | `BuiltIn GlobalInvocationId` |
| `SV_DomainLocation` | `BuiltIn TessCoord` |
| `SV_DrawIndex` | `Builtin DrawIndex` |
| `SV_GSInstanceID` | `BuiltIn InvocationId` |
| `SV_GroupID` | `BuiltIn WorkgroupId` |
| `SV_GroupIndex` | `BuiltIn LocalInvocationIndex` |
Expand All @@ -68,7 +69,7 @@ The system-value semantics are translated to the following SPIR-V code.
| `SV_ViewID` | `BuiltIn ViewIndex` |
| `SV_ViewportArrayIndex` | `BuiltIn ViewportIndex` |

*Note* that `SV_PointSize` is a Slang-specific semantic that is not defined in HLSL.
*Note* that `SV_DrawIndex` and `SV_PointSize` are Slang-specific semantics that are not defined in HLSL.


Behavior of `discard` after SPIR-V 1.6
Expand Down
4 changes: 4 additions & 0 deletions source/slang/slang-emit-glsl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1127,6 +1127,10 @@ void GLSLSourceEmitter::_maybeEmitGLSLBuiltin(IRGlobalParam* var, UnownedStringS
{
_requireGLSLExtension(toSlice("GL_EXT_fragment_shading_rate_primitive"));
}
else if (name == "gl_DrawID")
{
_requireGLSLVersion(460);
}
}

void GLSLSourceEmitter::_requireBaseType(BaseType baseType)
Expand Down
5 changes: 5 additions & 0 deletions source/slang/slang-emit-spirv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5137,6 +5137,11 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
// float in hlsl & glsl
return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInPointSize, inst);
}
else if (semanticName == "sv_drawindex")
{
requireSPIRVCapability(SpvCapabilityDrawParameters);
return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInDrawIndex, inst);
}
else if (semanticName == "sv_primitiveid")
{
auto entryPoints = m_referencingEntryPoints.tryGetValue(inst);
Expand Down
5 changes: 5 additions & 0 deletions source/slang/slang-ir-glsl-legalize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,11 @@ GLSLSystemValueInfo* getGLSLSystemValueInfo(
name = "gl_PointSize";
requiredType = builder->getBasicType(BaseType::Float);
}
else if (semanticName == "sv_drawindex")
{
name = "gl_DrawID";
requiredType = builder->getBasicType(BaseType::Int);
}
else if (semanticName == "sv_primitiveid")
{
// uint in hlsl, int in glsl
Expand Down
1 change: 1 addition & 0 deletions source/slang/slang-ir-legalize-varying-params.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ IRInst* emitCalcGroupIndex(IRBuilder& builder, IRInst* groupThreadID, IRInst* gr
M(OutputControlPointID, SV_OutputControlPointID) \
M(PointSize, SV_PointSize) \
M(PrimitiveID, SV_PrimitiveID) \
M(DrawIndex, SV_DrawIndex) \
M(RenderTargetArrayIndex, SV_RenderTargetArrayIndex) \
M(SampleIndex, SV_SampleIndex) \
M(StencilRef, SV_StencilRef) \
Expand Down
1 change: 1 addition & 0 deletions source/slang/slang-language-server-completion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ static const char* hlslSemanticNames[] = {
"SV_Position",
"SV_PointSize",
"SV_PrimitiveID",
"SV_DrawIndex",
"SV_RenderTargetArrayIndex",
"SV_SampleIndex",
"SV_StencilRef",
Expand Down
18 changes: 18 additions & 0 deletions tests/spirv/draw-index.slang
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//TEST:SIMPLE(filecheck=SPIRV): -target spirv
//TEST:SIMPLE(filecheck=SPIRV): -target spirv -entry vsMain -stage vertex -emit-spirv-via-glsl
//TEST:SIMPLE(filecheck=GLSL): -target glsl -entry vsMain -stage vertex

// SPIRV: OpDecorate %{{.*}} BuiltIn DrawIndex
// GLSL: gl_DrawID

struct VertexIn
{
float3 position;
int drawIndex : SV_DrawIndex;
}

[shader("vertex")]
float4 vsMain(VertexIn vin) : SV_Position
{
return float4(vin.position, vin.drawIndex);
}
Loading