From 4eef0424a657e19f51f2734ba0199b69ee7354bd Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Mon, 26 Jun 2023 18:15:36 -0400 Subject: Handling SV_ClipDistance system semantic on GLSL/VK (#2942) * Small fixes and improvements around reflection tool. * Make PrettyWriter printing a class. * WIP support for gl_ClipDistance * Working but doesn't have layout. * Check out param works with gl_ClipDistance. * Test clip distance works with out parameters. * Enable file check. * Add a test that splits clip distance writing. --------- Co-authored-by: Yong He --- tests/bugs/sv-clip-distance-array.slang | 19 ++++++++++++++++ tests/bugs/sv-clip-distance-out-param.slang | 28 +++++++++++++++++++++++ tests/bugs/sv-clip-distance-split.slang | 35 +++++++++++++++++++++++++++++ tests/bugs/sv-clip-distance.slang | 32 ++++++++++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 tests/bugs/sv-clip-distance-array.slang create mode 100644 tests/bugs/sv-clip-distance-out-param.slang create mode 100644 tests/bugs/sv-clip-distance-split.slang create mode 100644 tests/bugs/sv-clip-distance.slang (limited to 'tests/bugs') diff --git a/tests/bugs/sv-clip-distance-array.slang b/tests/bugs/sv-clip-distance-array.slang new file mode 100644 index 000000000..f0c6c9acc --- /dev/null +++ b/tests/bugs/sv-clip-distance-array.slang @@ -0,0 +1,19 @@ +// sv-clip-distance.slang + +//TEST:SIMPLE(filecheck=CHECK): -profile sm_5_0 -stage vertex -entry mainVertex -target glsl + +//CHECK: out float gl_ClipDistance[2]; +//CHECK: gl_ClipDistance = + +struct VertexInput +{ + float3 position : POSITION; +}; + +void mainVertex(VertexInput vi, out float4 outPosition : SV_Position, out float outClips[2] : SV_ClipDistance) +{ + outPosition = float4(vi.position, 1); + outClips[0] = vi.position.x / 10; + outClips[1] = vi.position.z * 2; +} + diff --git a/tests/bugs/sv-clip-distance-out-param.slang b/tests/bugs/sv-clip-distance-out-param.slang new file mode 100644 index 000000000..776cd0c84 --- /dev/null +++ b/tests/bugs/sv-clip-distance-out-param.slang @@ -0,0 +1,28 @@ +// sv-clip-distance-out-param.slang + +//TEST:SIMPLE(filecheck=CHECK): -profile sm_5_0 -stage vertex -entry mainVertex -target glsl + +//CHECK: out float gl_ClipDistance[2]; +//CHECK: gl_ClipDistance[0] = +//CHECK: gl_ClipDistance[1] = + +struct VertexInput +{ + float3 position : POSITION; +}; + +struct VertexOutput +{ + float4 position : SV_Position; + + float clip0 : SV_ClipDistance0; + float clip1 : SV_ClipDistance1; +}; + +void mainVertex(VertexInput vi, out VertexOutput vo) +{ + vo.position = float4(vi.position, 1); + vo.clip0 = vi.position.x / 10; + vo.clip1 = vi.position.z * 2; +} + diff --git a/tests/bugs/sv-clip-distance-split.slang b/tests/bugs/sv-clip-distance-split.slang new file mode 100644 index 000000000..99adf4f31 --- /dev/null +++ b/tests/bugs/sv-clip-distance-split.slang @@ -0,0 +1,35 @@ +// sv-clip-distance-split.slang + +//TEST:SIMPLE(filecheck=CHECK): -profile sm_5_0 -stage vertex -entry mainVertex -target glsl + +//CHECK: out float gl_ClipDistance[3]; +//CHECK: gl_ClipDistance[0] = +//CHECK: gl_ClipDistance[1] = +//CHECK: gl_ClipDistance[2] = + +struct VertexInput +{ + float3 position : POSITION; +}; + +struct VertexOutput +{ + float4 position : SV_Position; + + float clip0 : SV_ClipDistance0; + float clip1 : SV_ClipDistance1; +}; + +VertexOutput mainVertex(VertexInput vi, out float outClip : SV_ClipDistance2) +{ + VertexOutput vo; + + vo.position = float4(vi.position, 1); + vo.clip0 = vi.position.x / 10; + vo.clip1 = vi.position.z * 2; + + outClip = vi.position.y + 1; + + return vo; +} + diff --git a/tests/bugs/sv-clip-distance.slang b/tests/bugs/sv-clip-distance.slang new file mode 100644 index 000000000..ccfafad85 --- /dev/null +++ b/tests/bugs/sv-clip-distance.slang @@ -0,0 +1,32 @@ +// sv-clip-distance.slang + +//TEST:SIMPLE(filecheck=CHECK): -profile sm_5_0 -stage vertex -entry mainVertex -target glsl + +//CHECK: out float gl_ClipDistance[2]; +//CHECK: gl_ClipDistance[0] = +//CHECK: gl_ClipDistance[1] = + +struct VertexInput +{ + float3 position : POSITION; +}; + +struct VertexOutput +{ + float4 position : SV_Position; + + float clip0 : SV_ClipDistance0; + float clip1 : SV_ClipDistance1; +}; + +VertexOutput mainVertex(VertexInput vi) +{ + VertexOutput vo; + + vo.position = float4(vi.position, 1); + vo.clip0 = vi.position.x / 10; + vo.clip1 = vi.position.z * 2; + + return vo; +} + -- cgit v1.2.3