From 634e3960c2bc322bbd51fccc7ff395d9f24e35dc Mon Sep 17 00:00:00 2001 From: Darren Wihandi <65404740+fairywreath@users.noreply.github.com> Date: Mon, 19 May 2025 14:21:25 -0400 Subject: Map `SV_VertexID` to `gl_VertexIndex-gl_BaseVertex`, add `SV_Vulkan*ID` semantics (#7150) * Map SV_VertexID to `gl_VertexIndex - gl_BaseVertex`, provide SV_Vulkan* SV semantics * Fix docs * Regenerate toc * Fix affected pointer-2 test * Add tests --------- Co-authored-by: Yong He --- tests/spirv/pointer-2.slang | 2 +- tests/spirv/sv-vertex-id.slang | 16 ++++++++++ tests/spirv/sv-vulkan-instance-vertex-id.slang | 42 ++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 tests/spirv/sv-vertex-id.slang create mode 100644 tests/spirv/sv-vulkan-instance-vertex-id.slang (limited to 'tests') diff --git a/tests/spirv/pointer-2.slang b/tests/spirv/pointer-2.slang index 201d97001..1f2b2d0ea 100644 --- a/tests/spirv/pointer-2.slang +++ b/tests/spirv/pointer-2.slang @@ -44,7 +44,7 @@ ConstantBuffer constantBuffer; // CHECK_SPV_VIA_GLSL: OpTypePointer PhysicalStorageBuffer [shader("vertex")] -VSOutput vertexMain(int vertexIndex: SV_VertexID) +VSOutput vertexMain(int vertexIndex: SV_VulkanVertexID) { // // Test field access chains. diff --git a/tests/spirv/sv-vertex-id.slang b/tests/spirv/sv-vertex-id.slang new file mode 100644 index 000000000..c92f0351e --- /dev/null +++ b/tests/spirv/sv-vertex-id.slang @@ -0,0 +1,16 @@ +//TEST:SIMPLE(filecheck=GLSL): -target glsl -entry vertMain -stage vertex +//TEST:SIMPLE(filecheck=CHECK): -target spirv +//TEST:SIMPLE(filecheck=CHECK): -target spirv -emit-spirv-via-glsl + +// CHECK-DAG: %[[BASE_VERTEX:[0-9]+|[a-zA-Z_][a-zA-Z0-9_]*]] = OpVariable {{.*}} BuiltIn BaseVertex +// CHECK-DAG: %[[REG1:[0-9a-zA-Z_]+]] = OpLoad %int %[[BASE_VERTEX]] +// CHECK-DAG: %[[REG2:[0-9a-zA-Z_]+]] = OpLoad %int %gl_VertexIndex +// CHECK-DAG: OpISub %int %[[REG2]] %[[REG1]] + +// GLSL: gl_VertexIndex - gl_BaseVertex + +[shader("vertex")] +float4 vertMain(int i : SV_VertexID) : SV_Position +{ + return i; +} diff --git a/tests/spirv/sv-vulkan-instance-vertex-id.slang b/tests/spirv/sv-vulkan-instance-vertex-id.slang new file mode 100644 index 000000000..c8654c857 --- /dev/null +++ b/tests/spirv/sv-vulkan-instance-vertex-id.slang @@ -0,0 +1,42 @@ +//TEST:SIMPLE(filecheck=SPIRV): -entry main -stage vertex -target spirv -emit-spirv-directly +//TEST:SIMPLE(filecheck=GLSL): -entry main -stage vertex -target glsl +//TEST:SIMPLE(filecheck=METAL): -entry main -stage vertex -target metal +//TEST:SIMPLE(filecheck=WGSL): -entry main -stage vertex -target wgsl + +struct VSInput +{ + uint vertexID : SV_VulkanVertexID; + uint instanceID : SV_VulkanInstanceID; +}; + +struct VSOutput +{ + float4 position : SV_POSITION; +}; + +[shader("vertex")] +VSOutput main(VSInput input) +{ + VSOutput output; + output.position = float4(input.vertexID + input.instanceID); + + // SPIRV-DAG: BuiltIn InstanceIndex + // SPIRV-DAG: BuiltIn VertexIndex + // SPIRV-NOT: BuiltIn BaseInstance + // SPIRV-NOT: BuiltIn BaseVertex + + // GLSL-NOT: GL_ARB_shader_draw_parameters + // GLSL-DAG: gl_VertexIndex + // GLSL-NOT: gl_BaseVertex + // GLSL-DAG: gl_InstanceIndex + // GLSL-NOT: gl_BaseInstance + + // METAL-DAG: vertex_id + // METAL-DAG: instance_id + + // WGSL-DAG: vertex_index + // WGSL-DAG: instance_index + + return output; +} + -- cgit v1.2.3