From 307b6507b361119a71d028e512ff04d5341245ec Mon Sep 17 00:00:00 2001 From: LoopDawg Date: Wed, 5 Jul 2017 11:33:06 -0600 Subject: [PATCH] HLSL: handle multiple clip/cull semantic IDs HLSL allows several variables to be declared. There are packing rules involved: e.g, a float3 and a float1 can be packed into a single array[4], while for a float3 and another float3, the second one will skip the third array entry to avoid straddling This is implements that ability. Because there can be multiple variables involved, and the final output array will often be a different type altogether (to fuse the values into a single destination), a new variable is synthesized, unlike the prior clip/cull support which used the declared variable. The new variable name is taken from one of the declared ones, so the old tests are unchanged. Several new tests are added to test various packing scenarios. Only two semantic IDs are supported: 0, and 1, per HLSL rules. This is encapsulated in static const int maxClipCullRegs = 2; and the algorithm (probably :) ) generalizes to larger values, although there are a few issues around how HLSL would pack (e.g, would 4 scalars be packed into a single HLSL float4 out reg? Probably, and this algorithm assumes so). --- Test/baseResults/hlsl.clipdistance-4.vert.out | 2 + Test/baseResults/hlsl.clipdistance-5.vert.out | 2 + Test/baseResults/hlsl.clipdistance-6.vert.out | 562 ++++++++++++++++ Test/baseResults/hlsl.clipdistance-7.vert.out | 511 +++++++++++++++ Test/baseResults/hlsl.clipdistance-8.vert.out | 342 ++++++++++ Test/baseResults/hlsl.clipdistance-9.vert.out | 305 +++++++++ Test/baseResults/hlsl.semantic.geom.out | 4 + Test/baseResults/hlsl.semantic.vert.out | 620 ++++++++---------- Test/hlsl.clipdistance-6.vert | 23 + Test/hlsl.clipdistance-7.vert | 23 + Test/hlsl.clipdistance-8.vert | 20 + Test/hlsl.clipdistance-9.vert | 19 + Test/hlsl.semantic.vert | 8 +- gtests/Hlsl.FromFile.cpp | 4 + hlsl/hlslParseHelper.cpp | 201 ++++-- hlsl/hlslParseHelper.h | 15 +- hlsl/hlslScanContext.cpp | 26 - 17 files changed, 2257 insertions(+), 430 deletions(-) create mode 100644 Test/baseResults/hlsl.clipdistance-6.vert.out create mode 100644 Test/baseResults/hlsl.clipdistance-7.vert.out create mode 100644 Test/baseResults/hlsl.clipdistance-8.vert.out create mode 100644 Test/baseResults/hlsl.clipdistance-9.vert.out create mode 100644 Test/hlsl.clipdistance-6.vert create mode 100644 Test/hlsl.clipdistance-7.vert create mode 100644 Test/hlsl.clipdistance-8.vert create mode 100644 Test/hlsl.clipdistance-9.vert diff --git a/Test/baseResults/hlsl.clipdistance-4.vert.out b/Test/baseResults/hlsl.clipdistance-4.vert.out index 6cfa4b66d..acb1100fe 100644 --- a/Test/baseResults/hlsl.clipdistance-4.vert.out +++ b/Test/baseResults/hlsl.clipdistance-4.vert.out @@ -130,6 +130,7 @@ Shader version: 500 0:? Linker Objects 0:? '@entryPointOutput' (layout( location=0) out structure{}) 0:? 'Position' (layout( location=0) in 4-component vector of float) +0:? '@entryPointOutput_ClipRect' ( out 4-element array of float ClipDistance) Linked vertex stage: @@ -266,6 +267,7 @@ Shader version: 500 0:? Linker Objects 0:? '@entryPointOutput' (layout( location=0) out structure{}) 0:? 'Position' (layout( location=0) in 4-component vector of float) +0:? '@entryPointOutput_ClipRect' ( out 4-element array of float ClipDistance) // Module Version 10000 // Generated by (magic number): 80001 diff --git a/Test/baseResults/hlsl.clipdistance-5.vert.out b/Test/baseResults/hlsl.clipdistance-5.vert.out index 6ad45a5e3..643a67848 100644 --- a/Test/baseResults/hlsl.clipdistance-5.vert.out +++ b/Test/baseResults/hlsl.clipdistance-5.vert.out @@ -154,6 +154,7 @@ Shader version: 500 0:? Linker Objects 0:? '@entryPointOutput' (layout( location=0) out structure{}) 0:? 'Position' (layout( location=0) in 4-component vector of float) +0:? '@entryPointOutput_ClipRect' ( out 4-element array of float ClipDistance) Linked vertex stage: @@ -314,6 +315,7 @@ Shader version: 500 0:? Linker Objects 0:? '@entryPointOutput' (layout( location=0) out structure{}) 0:? 'Position' (layout( location=0) in 4-component vector of float) +0:? '@entryPointOutput_ClipRect' ( out 4-element array of float ClipDistance) // Module Version 10000 // Generated by (magic number): 80001 diff --git a/Test/baseResults/hlsl.clipdistance-6.vert.out b/Test/baseResults/hlsl.clipdistance-6.vert.out new file mode 100644 index 000000000..efce79620 --- /dev/null +++ b/Test/baseResults/hlsl.clipdistance-6.vert.out @@ -0,0 +1,562 @@ +hlsl.clipdistance-6.vert +Shader version: 500 +0:? Sequence +0:8 Function Definition: @main( ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Function Parameters: +0:? Sequence +0:10 move second child to first child ( temp 4-component vector of float) +0:10 Position: direct index for structure ( temp 4-component vector of float) +0:10 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:10 Constant: +0:10 0 (const int) +0:10 Constant: +0:10 0.000000 +0:10 0.000000 +0:10 0.000000 +0:10 0.000000 +0:12 move second child to first child ( temp float) +0:12 direct index ( temp float) +0:12 clip0: direct index for structure ( temp 4-component vector of float) +0:12 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:12 Constant: +0:12 1 (const int) +0:12 Constant: +0:12 0 (const int) +0:12 Constant: +0:12 0.000000 +0:13 move second child to first child ( temp float) +0:13 direct index ( temp float) +0:13 clip0: direct index for structure ( temp 4-component vector of float) +0:13 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:13 Constant: +0:13 1 (const int) +0:13 Constant: +0:13 1 (const int) +0:13 Constant: +0:13 1.000000 +0:14 move second child to first child ( temp float) +0:14 direct index ( temp float) +0:14 clip0: direct index for structure ( temp 4-component vector of float) +0:14 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:14 Constant: +0:14 1 (const int) +0:14 Constant: +0:14 2 (const int) +0:14 Constant: +0:14 2.000000 +0:15 move second child to first child ( temp float) +0:15 direct index ( temp float) +0:15 clip0: direct index for structure ( temp 4-component vector of float) +0:15 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:15 Constant: +0:15 1 (const int) +0:15 Constant: +0:15 3 (const int) +0:15 Constant: +0:15 3.000000 +0:17 move second child to first child ( temp float) +0:17 direct index ( temp float) +0:17 clip1: direct index for structure ( temp 4-component vector of float) +0:17 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:17 Constant: +0:17 2 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 4.000000 +0:18 move second child to first child ( temp float) +0:18 direct index ( temp float) +0:18 clip1: direct index for structure ( temp 4-component vector of float) +0:18 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:18 Constant: +0:18 2 (const int) +0:18 Constant: +0:18 1 (const int) +0:18 Constant: +0:18 5.000000 +0:19 move second child to first child ( temp float) +0:19 direct index ( temp float) +0:19 clip1: direct index for structure ( temp 4-component vector of float) +0:19 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:19 Constant: +0:19 2 (const int) +0:19 Constant: +0:19 2 (const int) +0:19 Constant: +0:19 6.000000 +0:20 move second child to first child ( temp float) +0:20 direct index ( temp float) +0:20 clip1: direct index for structure ( temp 4-component vector of float) +0:20 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:20 Constant: +0:20 2 (const int) +0:20 Constant: +0:20 3 (const int) +0:20 Constant: +0:20 7.000000 +0:22 Branch: Return with expression +0:22 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Function Definition: main( ( temp void) +0:8 Function Parameters: +0:? Sequence +0:8 Sequence +0:8 move second child to first child ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Function Call: @main( ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 move second child to first child ( temp 4-component vector of float) +0:? '@entryPointOutput_Position' ( out 4-component vector of float Position) +0:8 Position: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 0 (const int) +0:? Sequence +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 0 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 0 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 1 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 1 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 2 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 2 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 3 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 3 (const int) +0:? Sequence +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 4 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 0 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 5 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 1 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 6 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 2 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 7 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 3 (const int) +0:? Linker Objects +0:? '@entryPointOutput' (layout( location=0) out structure{}) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) + + +Linked vertex stage: + + +Shader version: 500 +0:? Sequence +0:8 Function Definition: @main( ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Function Parameters: +0:? Sequence +0:10 move second child to first child ( temp 4-component vector of float) +0:10 Position: direct index for structure ( temp 4-component vector of float) +0:10 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:10 Constant: +0:10 0 (const int) +0:10 Constant: +0:10 0.000000 +0:10 0.000000 +0:10 0.000000 +0:10 0.000000 +0:12 move second child to first child ( temp float) +0:12 direct index ( temp float) +0:12 clip0: direct index for structure ( temp 4-component vector of float) +0:12 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:12 Constant: +0:12 1 (const int) +0:12 Constant: +0:12 0 (const int) +0:12 Constant: +0:12 0.000000 +0:13 move second child to first child ( temp float) +0:13 direct index ( temp float) +0:13 clip0: direct index for structure ( temp 4-component vector of float) +0:13 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:13 Constant: +0:13 1 (const int) +0:13 Constant: +0:13 1 (const int) +0:13 Constant: +0:13 1.000000 +0:14 move second child to first child ( temp float) +0:14 direct index ( temp float) +0:14 clip0: direct index for structure ( temp 4-component vector of float) +0:14 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:14 Constant: +0:14 1 (const int) +0:14 Constant: +0:14 2 (const int) +0:14 Constant: +0:14 2.000000 +0:15 move second child to first child ( temp float) +0:15 direct index ( temp float) +0:15 clip0: direct index for structure ( temp 4-component vector of float) +0:15 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:15 Constant: +0:15 1 (const int) +0:15 Constant: +0:15 3 (const int) +0:15 Constant: +0:15 3.000000 +0:17 move second child to first child ( temp float) +0:17 direct index ( temp float) +0:17 clip1: direct index for structure ( temp 4-component vector of float) +0:17 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:17 Constant: +0:17 2 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 4.000000 +0:18 move second child to first child ( temp float) +0:18 direct index ( temp float) +0:18 clip1: direct index for structure ( temp 4-component vector of float) +0:18 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:18 Constant: +0:18 2 (const int) +0:18 Constant: +0:18 1 (const int) +0:18 Constant: +0:18 5.000000 +0:19 move second child to first child ( temp float) +0:19 direct index ( temp float) +0:19 clip1: direct index for structure ( temp 4-component vector of float) +0:19 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:19 Constant: +0:19 2 (const int) +0:19 Constant: +0:19 2 (const int) +0:19 Constant: +0:19 6.000000 +0:20 move second child to first child ( temp float) +0:20 direct index ( temp float) +0:20 clip1: direct index for structure ( temp 4-component vector of float) +0:20 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:20 Constant: +0:20 2 (const int) +0:20 Constant: +0:20 3 (const int) +0:20 Constant: +0:20 7.000000 +0:22 Branch: Return with expression +0:22 'Output' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Function Definition: main( ( temp void) +0:8 Function Parameters: +0:? Sequence +0:8 Sequence +0:8 move second child to first child ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Function Call: @main( ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 move second child to first child ( temp 4-component vector of float) +0:? '@entryPointOutput_Position' ( out 4-component vector of float Position) +0:8 Position: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 0 (const int) +0:? Sequence +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 0 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 0 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 1 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 1 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 2 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 2 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 3 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 3 (const int) +0:? Sequence +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 4 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 0 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 5 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 1 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 6 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 2 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 7 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 4-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 3 (const int) +0:? Linker Objects +0:? '@entryPointOutput' (layout( location=0) out structure{}) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) + +// Module Version 10000 +// Generated by (magic number): 80001 +// Id's are bound by 89 + + Capability Shader + Capability ClipDistance + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Vertex 4 "main" 49 55 88 + Source HLSL 500 + Name 4 "main" + Name 8 "VS_OUTPUT" + MemberName 8(VS_OUTPUT) 0 "Position" + MemberName 8(VS_OUTPUT) 1 "clip0" + MemberName 8(VS_OUTPUT) 2 "clip1" + Name 10 "@main(" + Name 13 "Output" + Name 46 "flattenTemp" + Name 49 "@entryPointOutput_Position" + Name 55 "@entryPointOutput_clip1" + Name 86 "VS_OUTPUT" + Name 88 "@entryPointOutput" + Decorate 49(@entryPointOutput_Position) BuiltIn Position + Decorate 55(@entryPointOutput_clip1) BuiltIn ClipDistance + Decorate 88(@entryPointOutput) Location 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeVector 6(float) 4 + 8(VS_OUTPUT): TypeStruct 7(fvec4) 7(fvec4) 7(fvec4) + 9: TypeFunction 8(VS_OUTPUT) + 12: TypePointer Function 8(VS_OUTPUT) + 14: TypeInt 32 1 + 15: 14(int) Constant 0 + 16: 6(float) Constant 0 + 17: 7(fvec4) ConstantComposite 16 16 16 16 + 18: TypePointer Function 7(fvec4) + 20: 14(int) Constant 1 + 21: TypeInt 32 0 + 22: 21(int) Constant 0 + 23: TypePointer Function 6(float) + 25: 6(float) Constant 1065353216 + 26: 21(int) Constant 1 + 28: 6(float) Constant 1073741824 + 29: 21(int) Constant 2 + 31: 6(float) Constant 1077936128 + 32: 21(int) Constant 3 + 34: 14(int) Constant 2 + 35: 6(float) Constant 1082130432 + 37: 6(float) Constant 1084227584 + 39: 6(float) Constant 1086324736 + 41: 6(float) Constant 1088421888 + 48: TypePointer Output 7(fvec4) +49(@entryPointOutput_Position): 48(ptr) Variable Output + 52: 21(int) Constant 8 + 53: TypeArray 6(float) 52 + 54: TypePointer Output 53 +55(@entryPointOutput_clip1): 54(ptr) Variable Output + 58: TypePointer Output 6(float) + 66: 14(int) Constant 3 + 70: 14(int) Constant 4 + 74: 14(int) Constant 5 + 78: 14(int) Constant 6 + 82: 14(int) Constant 7 + 86(VS_OUTPUT): TypeStruct + 87: TypePointer Output 86(VS_OUTPUT) +88(@entryPointOutput): 87(ptr) Variable Output + 4(main): 2 Function None 3 + 5: Label + 46(flattenTemp): 12(ptr) Variable Function + 47:8(VS_OUTPUT) FunctionCall 10(@main() + Store 46(flattenTemp) 47 + 50: 18(ptr) AccessChain 46(flattenTemp) 15 + 51: 7(fvec4) Load 50 + Store 49(@entryPointOutput_Position) 51 + 56: 23(ptr) AccessChain 46(flattenTemp) 20 22 + 57: 6(float) Load 56 + 59: 58(ptr) AccessChain 55(@entryPointOutput_clip1) 15 + Store 59 57 + 60: 23(ptr) AccessChain 46(flattenTemp) 20 26 + 61: 6(float) Load 60 + 62: 58(ptr) AccessChain 55(@entryPointOutput_clip1) 20 + Store 62 61 + 63: 23(ptr) AccessChain 46(flattenTemp) 20 29 + 64: 6(float) Load 63 + 65: 58(ptr) AccessChain 55(@entryPointOutput_clip1) 34 + Store 65 64 + 67: 23(ptr) AccessChain 46(flattenTemp) 20 32 + 68: 6(float) Load 67 + 69: 58(ptr) AccessChain 55(@entryPointOutput_clip1) 66 + Store 69 68 + 71: 23(ptr) AccessChain 46(flattenTemp) 34 22 + 72: 6(float) Load 71 + 73: 58(ptr) AccessChain 55(@entryPointOutput_clip1) 70 + Store 73 72 + 75: 23(ptr) AccessChain 46(flattenTemp) 34 26 + 76: 6(float) Load 75 + 77: 58(ptr) AccessChain 55(@entryPointOutput_clip1) 74 + Store 77 76 + 79: 23(ptr) AccessChain 46(flattenTemp) 34 29 + 80: 6(float) Load 79 + 81: 58(ptr) AccessChain 55(@entryPointOutput_clip1) 78 + Store 81 80 + 83: 23(ptr) AccessChain 46(flattenTemp) 34 32 + 84: 6(float) Load 83 + 85: 58(ptr) AccessChain 55(@entryPointOutput_clip1) 82 + Store 85 84 + Return + FunctionEnd + 10(@main():8(VS_OUTPUT) Function None 9 + 11: Label + 13(Output): 12(ptr) Variable Function + 19: 18(ptr) AccessChain 13(Output) 15 + Store 19 17 + 24: 23(ptr) AccessChain 13(Output) 20 22 + Store 24 16 + 27: 23(ptr) AccessChain 13(Output) 20 26 + Store 27 25 + 30: 23(ptr) AccessChain 13(Output) 20 29 + Store 30 28 + 33: 23(ptr) AccessChain 13(Output) 20 32 + Store 33 31 + 36: 23(ptr) AccessChain 13(Output) 34 22 + Store 36 35 + 38: 23(ptr) AccessChain 13(Output) 34 26 + Store 38 37 + 40: 23(ptr) AccessChain 13(Output) 34 29 + Store 40 39 + 42: 23(ptr) AccessChain 13(Output) 34 32 + Store 42 41 + 43:8(VS_OUTPUT) Load 13(Output) + ReturnValue 43 + FunctionEnd diff --git a/Test/baseResults/hlsl.clipdistance-7.vert.out b/Test/baseResults/hlsl.clipdistance-7.vert.out new file mode 100644 index 000000000..324320be6 --- /dev/null +++ b/Test/baseResults/hlsl.clipdistance-7.vert.out @@ -0,0 +1,511 @@ +hlsl.clipdistance-7.vert +Shader version: 500 +0:? Sequence +0:8 Function Definition: @main( ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Function Parameters: +0:? Sequence +0:10 move second child to first child ( temp 4-component vector of float) +0:10 Position: direct index for structure ( temp 4-component vector of float) +0:10 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:10 Constant: +0:10 0 (const int) +0:10 Constant: +0:10 0.000000 +0:10 0.000000 +0:10 0.000000 +0:10 0.000000 +0:12 move second child to first child ( temp float) +0:12 direct index ( temp float) +0:12 clip0: direct index for structure ( temp 3-component vector of float) +0:12 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:12 Constant: +0:12 1 (const int) +0:12 Constant: +0:12 0 (const int) +0:12 Constant: +0:12 0.000000 +0:13 move second child to first child ( temp float) +0:13 direct index ( temp float) +0:13 clip0: direct index for structure ( temp 3-component vector of float) +0:13 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:13 Constant: +0:13 1 (const int) +0:13 Constant: +0:13 1 (const int) +0:13 Constant: +0:13 1.000000 +0:14 move second child to first child ( temp float) +0:14 direct index ( temp float) +0:14 clip0: direct index for structure ( temp 3-component vector of float) +0:14 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:14 Constant: +0:14 1 (const int) +0:14 Constant: +0:14 2 (const int) +0:14 Constant: +0:14 2.000000 +0:17 move second child to first child ( temp float) +0:17 direct index ( temp float) +0:17 clip1: direct index for structure ( temp 4-component vector of float) +0:17 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:17 Constant: +0:17 2 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 4.000000 +0:18 move second child to first child ( temp float) +0:18 direct index ( temp float) +0:18 clip1: direct index for structure ( temp 4-component vector of float) +0:18 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:18 Constant: +0:18 2 (const int) +0:18 Constant: +0:18 1 (const int) +0:18 Constant: +0:18 5.000000 +0:19 move second child to first child ( temp float) +0:19 direct index ( temp float) +0:19 clip1: direct index for structure ( temp 4-component vector of float) +0:19 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:19 Constant: +0:19 2 (const int) +0:19 Constant: +0:19 2 (const int) +0:19 Constant: +0:19 6.000000 +0:20 move second child to first child ( temp float) +0:20 direct index ( temp float) +0:20 clip1: direct index for structure ( temp 4-component vector of float) +0:20 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:20 Constant: +0:20 2 (const int) +0:20 Constant: +0:20 3 (const int) +0:20 Constant: +0:20 7.000000 +0:22 Branch: Return with expression +0:22 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Function Definition: main( ( temp void) +0:8 Function Parameters: +0:? Sequence +0:8 Sequence +0:8 move second child to first child ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Function Call: @main( ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 move second child to first child ( temp 4-component vector of float) +0:? '@entryPointOutput_Position' ( out 4-component vector of float Position) +0:8 Position: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 0 (const int) +0:? Sequence +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 0 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 3-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 0 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 1 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 3-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 1 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 2 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 3-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 2 (const int) +0:? Sequence +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 4 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 0 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 5 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 1 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 6 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 2 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 7 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 3 (const int) +0:? Linker Objects +0:? '@entryPointOutput' (layout( location=0) out structure{}) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) + + +Linked vertex stage: + + +Shader version: 500 +0:? Sequence +0:8 Function Definition: @main( ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Function Parameters: +0:? Sequence +0:10 move second child to first child ( temp 4-component vector of float) +0:10 Position: direct index for structure ( temp 4-component vector of float) +0:10 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:10 Constant: +0:10 0 (const int) +0:10 Constant: +0:10 0.000000 +0:10 0.000000 +0:10 0.000000 +0:10 0.000000 +0:12 move second child to first child ( temp float) +0:12 direct index ( temp float) +0:12 clip0: direct index for structure ( temp 3-component vector of float) +0:12 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:12 Constant: +0:12 1 (const int) +0:12 Constant: +0:12 0 (const int) +0:12 Constant: +0:12 0.000000 +0:13 move second child to first child ( temp float) +0:13 direct index ( temp float) +0:13 clip0: direct index for structure ( temp 3-component vector of float) +0:13 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:13 Constant: +0:13 1 (const int) +0:13 Constant: +0:13 1 (const int) +0:13 Constant: +0:13 1.000000 +0:14 move second child to first child ( temp float) +0:14 direct index ( temp float) +0:14 clip0: direct index for structure ( temp 3-component vector of float) +0:14 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:14 Constant: +0:14 1 (const int) +0:14 Constant: +0:14 2 (const int) +0:14 Constant: +0:14 2.000000 +0:17 move second child to first child ( temp float) +0:17 direct index ( temp float) +0:17 clip1: direct index for structure ( temp 4-component vector of float) +0:17 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:17 Constant: +0:17 2 (const int) +0:17 Constant: +0:17 0 (const int) +0:17 Constant: +0:17 4.000000 +0:18 move second child to first child ( temp float) +0:18 direct index ( temp float) +0:18 clip1: direct index for structure ( temp 4-component vector of float) +0:18 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:18 Constant: +0:18 2 (const int) +0:18 Constant: +0:18 1 (const int) +0:18 Constant: +0:18 5.000000 +0:19 move second child to first child ( temp float) +0:19 direct index ( temp float) +0:19 clip1: direct index for structure ( temp 4-component vector of float) +0:19 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:19 Constant: +0:19 2 (const int) +0:19 Constant: +0:19 2 (const int) +0:19 Constant: +0:19 6.000000 +0:20 move second child to first child ( temp float) +0:20 direct index ( temp float) +0:20 clip1: direct index for structure ( temp 4-component vector of float) +0:20 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:20 Constant: +0:20 2 (const int) +0:20 Constant: +0:20 3 (const int) +0:20 Constant: +0:20 7.000000 +0:22 Branch: Return with expression +0:22 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Function Definition: main( ( temp void) +0:8 Function Parameters: +0:? Sequence +0:8 Sequence +0:8 move second child to first child ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Function Call: @main( ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 move second child to first child ( temp 4-component vector of float) +0:? '@entryPointOutput_Position' ( out 4-component vector of float Position) +0:8 Position: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 0 (const int) +0:? Sequence +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 0 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 3-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 0 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 1 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 3-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 1 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 2 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 3-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 2 (const int) +0:? Sequence +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 4 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 0 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 5 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 1 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 6 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 2 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) +0:8 Constant: +0:8 7 (const int) +0:8 direct index ( temp float) +0:8 clip1: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp 4-component vector of float clip1}) +0:8 Constant: +0:8 2 (const int) +0:8 Constant: +0:8 3 (const int) +0:? Linker Objects +0:? '@entryPointOutput' (layout( location=0) out structure{}) +0:? '@entryPointOutput_clip1' ( out 8-element array of float ClipDistance) + +// Module Version 10000 +// Generated by (magic number): 80001 +// Id's are bound by 84 + + Capability Shader + Capability ClipDistance + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Vertex 4 "main" 48 54 83 + Source HLSL 500 + Name 4 "main" + Name 9 "VS_OUTPUT" + MemberName 9(VS_OUTPUT) 0 "Position" + MemberName 9(VS_OUTPUT) 1 "clip0" + MemberName 9(VS_OUTPUT) 2 "clip1" + Name 11 "@main(" + Name 14 "Output" + Name 45 "flattenTemp" + Name 48 "@entryPointOutput_Position" + Name 54 "@entryPointOutput_clip1" + Name 81 "VS_OUTPUT" + Name 83 "@entryPointOutput" + Decorate 48(@entryPointOutput_Position) BuiltIn Position + Decorate 54(@entryPointOutput_clip1) BuiltIn ClipDistance + Decorate 83(@entryPointOutput) Location 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeVector 6(float) 4 + 8: TypeVector 6(float) 3 + 9(VS_OUTPUT): TypeStruct 7(fvec4) 8(fvec3) 7(fvec4) + 10: TypeFunction 9(VS_OUTPUT) + 13: TypePointer Function 9(VS_OUTPUT) + 15: TypeInt 32 1 + 16: 15(int) Constant 0 + 17: 6(float) Constant 0 + 18: 7(fvec4) ConstantComposite 17 17 17 17 + 19: TypePointer Function 7(fvec4) + 21: 15(int) Constant 1 + 22: TypeInt 32 0 + 23: 22(int) Constant 0 + 24: TypePointer Function 6(float) + 26: 6(float) Constant 1065353216 + 27: 22(int) Constant 1 + 29: 6(float) Constant 1073741824 + 30: 22(int) Constant 2 + 32: 15(int) Constant 2 + 33: 6(float) Constant 1082130432 + 35: 6(float) Constant 1084227584 + 37: 6(float) Constant 1086324736 + 39: 6(float) Constant 1088421888 + 40: 22(int) Constant 3 + 47: TypePointer Output 7(fvec4) +48(@entryPointOutput_Position): 47(ptr) Variable Output + 51: 22(int) Constant 8 + 52: TypeArray 6(float) 51 + 53: TypePointer Output 52 +54(@entryPointOutput_clip1): 53(ptr) Variable Output + 57: TypePointer Output 6(float) + 65: 15(int) Constant 4 + 69: 15(int) Constant 5 + 73: 15(int) Constant 6 + 77: 15(int) Constant 7 + 81(VS_OUTPUT): TypeStruct + 82: TypePointer Output 81(VS_OUTPUT) +83(@entryPointOutput): 82(ptr) Variable Output + 4(main): 2 Function None 3 + 5: Label + 45(flattenTemp): 13(ptr) Variable Function + 46:9(VS_OUTPUT) FunctionCall 11(@main() + Store 45(flattenTemp) 46 + 49: 19(ptr) AccessChain 45(flattenTemp) 16 + 50: 7(fvec4) Load 49 + Store 48(@entryPointOutput_Position) 50 + 55: 24(ptr) AccessChain 45(flattenTemp) 21 23 + 56: 6(float) Load 55 + 58: 57(ptr) AccessChain 54(@entryPointOutput_clip1) 16 + Store 58 56 + 59: 24(ptr) AccessChain 45(flattenTemp) 21 27 + 60: 6(float) Load 59 + 61: 57(ptr) AccessChain 54(@entryPointOutput_clip1) 21 + Store 61 60 + 62: 24(ptr) AccessChain 45(flattenTemp) 21 30 + 63: 6(float) Load 62 + 64: 57(ptr) AccessChain 54(@entryPointOutput_clip1) 32 + Store 64 63 + 66: 24(ptr) AccessChain 45(flattenTemp) 32 23 + 67: 6(float) Load 66 + 68: 57(ptr) AccessChain 54(@entryPointOutput_clip1) 65 + Store 68 67 + 70: 24(ptr) AccessChain 45(flattenTemp) 32 27 + 71: 6(float) Load 70 + 72: 57(ptr) AccessChain 54(@entryPointOutput_clip1) 69 + Store 72 71 + 74: 24(ptr) AccessChain 45(flattenTemp) 32 30 + 75: 6(float) Load 74 + 76: 57(ptr) AccessChain 54(@entryPointOutput_clip1) 73 + Store 76 75 + 78: 24(ptr) AccessChain 45(flattenTemp) 32 40 + 79: 6(float) Load 78 + 80: 57(ptr) AccessChain 54(@entryPointOutput_clip1) 77 + Store 80 79 + Return + FunctionEnd + 11(@main():9(VS_OUTPUT) Function None 10 + 12: Label + 14(Output): 13(ptr) Variable Function + 20: 19(ptr) AccessChain 14(Output) 16 + Store 20 18 + 25: 24(ptr) AccessChain 14(Output) 21 23 + Store 25 17 + 28: 24(ptr) AccessChain 14(Output) 21 27 + Store 28 26 + 31: 24(ptr) AccessChain 14(Output) 21 30 + Store 31 29 + 34: 24(ptr) AccessChain 14(Output) 32 23 + Store 34 33 + 36: 24(ptr) AccessChain 14(Output) 32 27 + Store 36 35 + 38: 24(ptr) AccessChain 14(Output) 32 30 + Store 38 37 + 41: 24(ptr) AccessChain 14(Output) 32 40 + Store 41 39 + 42:9(VS_OUTPUT) Load 14(Output) + ReturnValue 42 + FunctionEnd diff --git a/Test/baseResults/hlsl.clipdistance-8.vert.out b/Test/baseResults/hlsl.clipdistance-8.vert.out new file mode 100644 index 000000000..94750b13b --- /dev/null +++ b/Test/baseResults/hlsl.clipdistance-8.vert.out @@ -0,0 +1,342 @@ +hlsl.clipdistance-8.vert +Shader version: 500 +0:? Sequence +0:8 Function Definition: @main( ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Function Parameters: +0:? Sequence +0:10 move second child to first child ( temp 4-component vector of float) +0:10 Position: direct index for structure ( temp 4-component vector of float) +0:10 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:10 Constant: +0:10 0 (const int) +0:10 Constant: +0:10 0.000000 +0:10 0.000000 +0:10 0.000000 +0:10 0.000000 +0:12 move second child to first child ( temp float) +0:12 direct index ( temp float) +0:12 clip0: direct index for structure ( temp 3-component vector of float) +0:12 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:12 Constant: +0:12 1 (const int) +0:12 Constant: +0:12 0 (const int) +0:12 Constant: +0:12 0.000000 +0:13 move second child to first child ( temp float) +0:13 direct index ( temp float) +0:13 clip0: direct index for structure ( temp 3-component vector of float) +0:13 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:13 Constant: +0:13 1 (const int) +0:13 Constant: +0:13 1 (const int) +0:13 Constant: +0:13 1.000000 +0:14 move second child to first child ( temp float) +0:14 direct index ( temp float) +0:14 clip0: direct index for structure ( temp 3-component vector of float) +0:14 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:14 Constant: +0:14 1 (const int) +0:14 Constant: +0:14 2 (const int) +0:14 Constant: +0:14 2.000000 +0:17 move second child to first child ( temp float) +0:17 clip1: direct index for structure ( temp float) +0:17 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:17 Constant: +0:17 2 (const int) +0:17 Constant: +0:17 3.000000 +0:19 Branch: Return with expression +0:19 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Function Definition: main( ( temp void) +0:8 Function Parameters: +0:? Sequence +0:8 Sequence +0:8 move second child to first child ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Function Call: @main( ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 move second child to first child ( temp 4-component vector of float) +0:? '@entryPointOutput_Position' ( out 4-component vector of float Position) +0:8 Position: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Constant: +0:8 0 (const int) +0:? Sequence +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 4-element array of float ClipDistance) +0:8 Constant: +0:8 0 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 3-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 0 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 4-element array of float ClipDistance) +0:8 Constant: +0:8 1 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 3-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 1 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 4-element array of float ClipDistance) +0:8 Constant: +0:8 2 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 3-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 2 (const int) +0:? Sequence +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 4-element array of float ClipDistance) +0:8 Constant: +0:8 3 (const int) +0:8 clip1: direct index for structure ( temp float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Constant: +0:8 2 (const int) +0:? Linker Objects +0:? '@entryPointOutput' (layout( location=0) out structure{}) +0:? '@entryPointOutput_clip1' ( out 4-element array of float ClipDistance) + + +Linked vertex stage: + + +Shader version: 500 +0:? Sequence +0:8 Function Definition: @main( ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Function Parameters: +0:? Sequence +0:10 move second child to first child ( temp 4-component vector of float) +0:10 Position: direct index for structure ( temp 4-component vector of float) +0:10 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:10 Constant: +0:10 0 (const int) +0:10 Constant: +0:10 0.000000 +0:10 0.000000 +0:10 0.000000 +0:10 0.000000 +0:12 move second child to first child ( temp float) +0:12 direct index ( temp float) +0:12 clip0: direct index for structure ( temp 3-component vector of float) +0:12 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:12 Constant: +0:12 1 (const int) +0:12 Constant: +0:12 0 (const int) +0:12 Constant: +0:12 0.000000 +0:13 move second child to first child ( temp float) +0:13 direct index ( temp float) +0:13 clip0: direct index for structure ( temp 3-component vector of float) +0:13 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:13 Constant: +0:13 1 (const int) +0:13 Constant: +0:13 1 (const int) +0:13 Constant: +0:13 1.000000 +0:14 move second child to first child ( temp float) +0:14 direct index ( temp float) +0:14 clip0: direct index for structure ( temp 3-component vector of float) +0:14 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:14 Constant: +0:14 1 (const int) +0:14 Constant: +0:14 2 (const int) +0:14 Constant: +0:14 2.000000 +0:17 move second child to first child ( temp float) +0:17 clip1: direct index for structure ( temp float) +0:17 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:17 Constant: +0:17 2 (const int) +0:17 Constant: +0:17 3.000000 +0:19 Branch: Return with expression +0:19 'Output' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Function Definition: main( ( temp void) +0:8 Function Parameters: +0:? Sequence +0:8 Sequence +0:8 move second child to first child ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Function Call: @main( ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 move second child to first child ( temp 4-component vector of float) +0:? '@entryPointOutput_Position' ( out 4-component vector of float Position) +0:8 Position: direct index for structure ( temp 4-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Constant: +0:8 0 (const int) +0:? Sequence +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 4-element array of float ClipDistance) +0:8 Constant: +0:8 0 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 3-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 0 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 4-element array of float ClipDistance) +0:8 Constant: +0:8 1 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 3-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 1 (const int) +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 4-element array of float ClipDistance) +0:8 Constant: +0:8 2 (const int) +0:8 direct index ( temp float) +0:8 clip0: direct index for structure ( temp 3-component vector of float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Constant: +0:8 1 (const int) +0:8 Constant: +0:8 2 (const int) +0:? Sequence +0:8 move second child to first child ( temp float) +0:8 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 4-element array of float ClipDistance) +0:8 Constant: +0:8 3 (const int) +0:8 clip1: direct index for structure ( temp float) +0:8 'flattenTemp' ( temp structure{ temp 4-component vector of float Position, temp 3-component vector of float clip0, temp float clip1}) +0:8 Constant: +0:8 2 (const int) +0:? Linker Objects +0:? '@entryPointOutput' (layout( location=0) out structure{}) +0:? '@entryPointOutput_clip1' ( out 4-element array of float ClipDistance) + +// Module Version 10000 +// Generated by (magic number): 80001 +// Id's are bound by 65 + + Capability Shader + Capability ClipDistance + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Vertex 4 "main" 41 47 64 + Source HLSL 500 + Name 4 "main" + Name 9 "VS_OUTPUT" + MemberName 9(VS_OUTPUT) 0 "Position" + MemberName 9(VS_OUTPUT) 1 "clip0" + MemberName 9(VS_OUTPUT) 2 "clip1" + Name 11 "@main(" + Name 14 "Output" + Name 38 "flattenTemp" + Name 41 "@entryPointOutput_Position" + Name 47 "@entryPointOutput_clip1" + Name 62 "VS_OUTPUT" + Name 64 "@entryPointOutput" + Decorate 41(@entryPointOutput_Position) BuiltIn Position + Decorate 47(@entryPointOutput_clip1) BuiltIn ClipDistance + Decorate 64(@entryPointOutput) Location 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeVector 6(float) 4 + 8: TypeVector 6(float) 3 + 9(VS_OUTPUT): TypeStruct 7(fvec4) 8(fvec3) 6(float) + 10: TypeFunction 9(VS_OUTPUT) + 13: TypePointer Function 9(VS_OUTPUT) + 15: TypeInt 32 1 + 16: 15(int) Constant 0 + 17: 6(float) Constant 0 + 18: 7(fvec4) ConstantComposite 17 17 17 17 + 19: TypePointer Function 7(fvec4) + 21: 15(int) Constant 1 + 22: TypeInt 32 0 + 23: 22(int) Constant 0 + 24: TypePointer Function 6(float) + 26: 6(float) Constant 1065353216 + 27: 22(int) Constant 1 + 29: 6(float) Constant 1073741824 + 30: 22(int) Constant 2 + 32: 15(int) Constant 2 + 33: 6(float) Constant 1077936128 + 40: TypePointer Output 7(fvec4) +41(@entryPointOutput_Position): 40(ptr) Variable Output + 44: 22(int) Constant 4 + 45: TypeArray 6(float) 44 + 46: TypePointer Output 45 +47(@entryPointOutput_clip1): 46(ptr) Variable Output + 50: TypePointer Output 6(float) + 58: 15(int) Constant 3 + 62(VS_OUTPUT): TypeStruct + 63: TypePointer Output 62(VS_OUTPUT) +64(@entryPointOutput): 63(ptr) Variable Output + 4(main): 2 Function None 3 + 5: Label + 38(flattenTemp): 13(ptr) Variable Function + 39:9(VS_OUTPUT) FunctionCall 11(@main() + Store 38(flattenTemp) 39 + 42: 19(ptr) AccessChain 38(flattenTemp) 16 + 43: 7(fvec4) Load 42 + Store 41(@entryPointOutput_Position) 43 + 48: 24(ptr) AccessChain 38(flattenTemp) 21 23 + 49: 6(float) Load 48 + 51: 50(ptr) AccessChain 47(@entryPointOutput_clip1) 16 + Store 51 49 + 52: 24(ptr) AccessChain 38(flattenTemp) 21 27 + 53: 6(float) Load 52 + 54: 50(ptr) AccessChain 47(@entryPointOutput_clip1) 21 + Store 54 53 + 55: 24(ptr) AccessChain 38(flattenTemp) 21 30 + 56: 6(float) Load 55 + 57: 50(ptr) AccessChain 47(@entryPointOutput_clip1) 32 + Store 57 56 + 59: 24(ptr) AccessChain 38(flattenTemp) 32 + 60: 6(float) Load 59 + 61: 50(ptr) AccessChain 47(@entryPointOutput_clip1) 58 + Store 61 60 + Return + FunctionEnd + 11(@main():9(VS_OUTPUT) Function None 10 + 12: Label + 14(Output): 13(ptr) Variable Function + 20: 19(ptr) AccessChain 14(Output) 16 + Store 20 18 + 25: 24(ptr) AccessChain 14(Output) 21 23 + Store 25 17 + 28: 24(ptr) AccessChain 14(Output) 21 27 + Store 28 26 + 31: 24(ptr) AccessChain 14(Output) 21 30 + Store 31 29 + 34: 24(ptr) AccessChain 14(Output) 32 + Store 34 33 + 35:9(VS_OUTPUT) Load 14(Output) + ReturnValue 35 + FunctionEnd diff --git a/Test/baseResults/hlsl.clipdistance-9.vert.out b/Test/baseResults/hlsl.clipdistance-9.vert.out new file mode 100644 index 000000000..a3502b774 --- /dev/null +++ b/Test/baseResults/hlsl.clipdistance-9.vert.out @@ -0,0 +1,305 @@ +hlsl.clipdistance-9.vert +Shader version: 500 +0:? Sequence +0:7 Function Definition: @main(vf3;f1; ( temp structure{ temp 4-component vector of float Position}) +0:7 Function Parameters: +0:7 'clip0' ( out 3-component vector of float) +0:7 'clip1' ( out float) +0:? Sequence +0:9 move second child to first child ( temp 4-component vector of float) +0:9 Position: direct index for structure ( temp 4-component vector of float) +0:9 'Output' ( temp structure{ temp 4-component vector of float Position}) +0:9 Constant: +0:9 0 (const int) +0:9 Constant: +0:9 0.000000 +0:9 0.000000 +0:9 0.000000 +0:9 0.000000 +0:11 move second child to first child ( temp float) +0:11 direct index ( temp float) +0:11 'clip0' ( out 3-component vector of float) +0:11 Constant: +0:11 0 (const int) +0:11 Constant: +0:11 0.000000 +0:12 move second child to first child ( temp float) +0:12 direct index ( temp float) +0:12 'clip0' ( out 3-component vector of float) +0:12 Constant: +0:12 1 (const int) +0:12 Constant: +0:12 1.000000 +0:13 move second child to first child ( temp float) +0:13 direct index ( temp float) +0:13 'clip0' ( out 3-component vector of float) +0:13 Constant: +0:13 2 (const int) +0:13 Constant: +0:13 2.000000 +0:16 move second child to first child ( temp float) +0:16 'clip1' ( out float) +0:16 Constant: +0:16 3.000000 +0:18 Branch: Return with expression +0:18 'Output' ( temp structure{ temp 4-component vector of float Position}) +0:7 Function Definition: main( ( temp void) +0:7 Function Parameters: +0:? Sequence +0:7 Sequence +0:7 move second child to first child ( temp 4-component vector of float) +0:? '@entryPointOutput_Position' ( out 4-component vector of float Position) +0:7 Position: direct index for structure ( temp 4-component vector of float) +0:7 Function Call: @main(vf3;f1; ( temp structure{ temp 4-component vector of float Position}) +0:? 'clip0' ( temp 3-component vector of float) +0:? 'clip1' ( temp float) +0:7 Constant: +0:7 0 (const int) +0:? Sequence +0:7 move second child to first child ( temp float) +0:7 direct index ( temp float) +0:? 'clip0' ( out 4-element array of float ClipDistance) +0:7 Constant: +0:7 0 (const int) +0:7 direct index ( temp float) +0:? 'clip0' ( temp 3-component vector of float) +0:7 Constant: +0:7 0 (const int) +0:7 move second child to first child ( temp float) +0:7 direct index ( temp float) +0:? 'clip0' ( out 4-element array of float ClipDistance) +0:7 Constant: +0:7 1 (const int) +0:7 direct index ( temp float) +0:? 'clip0' ( temp 3-component vector of float) +0:7 Constant: +0:7 1 (const int) +0:7 move second child to first child ( temp float) +0:7 direct index ( temp float) +0:? 'clip0' ( out 4-element array of float ClipDistance) +0:7 Constant: +0:7 2 (const int) +0:7 direct index ( temp float) +0:? 'clip0' ( temp 3-component vector of float) +0:7 Constant: +0:7 2 (const int) +0:? Sequence +0:7 move second child to first child ( temp float) +0:7 direct index ( temp float) +0:? 'clip0' ( out 4-element array of float ClipDistance) +0:7 Constant: +0:7 3 (const int) +0:? 'clip1' ( temp float) +0:? Linker Objects +0:? '@entryPointOutput' (layout( location=0) out structure{}) +0:? 'clip0' ( out 4-element array of float ClipDistance) + + +Linked vertex stage: + + +Shader version: 500 +0:? Sequence +0:7 Function Definition: @main(vf3;f1; ( temp structure{ temp 4-component vector of float Position}) +0:7 Function Parameters: +0:7 'clip0' ( out 3-component vector of float) +0:7 'clip1' ( out float) +0:? Sequence +0:9 move second child to first child ( temp 4-component vector of float) +0:9 Position: direct index for structure ( temp 4-component vector of float) +0:9 'Output' ( temp structure{ temp 4-component vector of float Position}) +0:9 Constant: +0:9 0 (const int) +0:9 Constant: +0:9 0.000000 +0:9 0.000000 +0:9 0.000000 +0:9 0.000000 +0:11 move second child to first child ( temp float) +0:11 direct index ( temp float) +0:11 'clip0' ( out 3-component vector of float) +0:11 Constant: +0:11 0 (const int) +0:11 Constant: +0:11 0.000000 +0:12 move second child to first child ( temp float) +0:12 direct index ( temp float) +0:12 'clip0' ( out 3-component vector of float) +0:12 Constant: +0:12 1 (const int) +0:12 Constant: +0:12 1.000000 +0:13 move second child to first child ( temp float) +0:13 direct index ( temp float) +0:13 'clip0' ( out 3-component vector of float) +0:13 Constant: +0:13 2 (const int) +0:13 Constant: +0:13 2.000000 +0:16 move second child to first child ( temp float) +0:16 'clip1' ( out float) +0:16 Constant: +0:16 3.000000 +0:18 Branch: Return with expression +0:18 'Output' ( temp structure{ temp 4-component vector of float Position}) +0:7 Function Definition: main( ( temp void) +0:7 Function Parameters: +0:? Sequence +0:7 Sequence +0:7 move second child to first child ( temp 4-component vector of float) +0:? '@entryPointOutput_Position' ( out 4-component vector of float Position) +0:7 Position: direct index for structure ( temp 4-component vector of float) +0:7 Function Call: @main(vf3;f1; ( temp structure{ temp 4-component vector of float Position}) +0:? 'clip0' ( temp 3-component vector of float) +0:? 'clip1' ( temp float) +0:7 Constant: +0:7 0 (const int) +0:? Sequence +0:7 move second child to first child ( temp float) +0:7 direct index ( temp float) +0:? 'clip0' ( out 4-element array of float ClipDistance) +0:7 Constant: +0:7 0 (const int) +0:7 direct index ( temp float) +0:? 'clip0' ( temp 3-component vector of float) +0:7 Constant: +0:7 0 (const int) +0:7 move second child to first child ( temp float) +0:7 direct index ( temp float) +0:? 'clip0' ( out 4-element array of float ClipDistance) +0:7 Constant: +0:7 1 (const int) +0:7 direct index ( temp float) +0:? 'clip0' ( temp 3-component vector of float) +0:7 Constant: +0:7 1 (const int) +0:7 move second child to first child ( temp float) +0:7 direct index ( temp float) +0:? 'clip0' ( out 4-element array of float ClipDistance) +0:7 Constant: +0:7 2 (const int) +0:7 direct index ( temp float) +0:? 'clip0' ( temp 3-component vector of float) +0:7 Constant: +0:7 2 (const int) +0:? Sequence +0:7 move second child to first child ( temp float) +0:7 direct index ( temp float) +0:? 'clip0' ( out 4-element array of float ClipDistance) +0:7 Constant: +0:7 3 (const int) +0:? 'clip1' ( temp float) +0:? Linker Objects +0:? '@entryPointOutput' (layout( location=0) out structure{}) +0:? 'clip0' ( out 4-element array of float ClipDistance) + +// Module Version 10000 +// Generated by (magic number): 80001 +// Id's are bound by 70 + + Capability Shader + Capability ClipDistance + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Vertex 4 "main" 39 51 69 + Source HLSL 500 + Name 4 "main" + Name 11 "VS_OUTPUT" + MemberName 11(VS_OUTPUT) 0 "Position" + Name 15 "@main(vf3;f1;" + Name 13 "clip0" + Name 14 "clip1" + Name 18 "Output" + Name 39 "@entryPointOutput_Position" + Name 40 "clip0" + Name 41 "clip1" + Name 42 "param" + Name 43 "param" + Name 51 "clip0" + Name 67 "VS_OUTPUT" + Name 69 "@entryPointOutput" + Decorate 39(@entryPointOutput_Position) BuiltIn Position + Decorate 51(clip0) BuiltIn ClipDistance + Decorate 69(@entryPointOutput) Location 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeVector 6(float) 3 + 8: TypePointer Function 7(fvec3) + 9: TypePointer Function 6(float) + 10: TypeVector 6(float) 4 + 11(VS_OUTPUT): TypeStruct 10(fvec4) + 12: TypeFunction 11(VS_OUTPUT) 8(ptr) 9(ptr) + 17: TypePointer Function 11(VS_OUTPUT) + 19: TypeInt 32 1 + 20: 19(int) Constant 0 + 21: 6(float) Constant 0 + 22: 10(fvec4) ConstantComposite 21 21 21 21 + 23: TypePointer Function 10(fvec4) + 25: TypeInt 32 0 + 26: 25(int) Constant 0 + 28: 6(float) Constant 1065353216 + 29: 25(int) Constant 1 + 31: 6(float) Constant 1073741824 + 32: 25(int) Constant 2 + 34: 6(float) Constant 1077936128 + 38: TypePointer Output 10(fvec4) +39(@entryPointOutput_Position): 38(ptr) Variable Output + 48: 25(int) Constant 4 + 49: TypeArray 6(float) 48 + 50: TypePointer Output 49 + 51(clip0): 50(ptr) Variable Output + 54: TypePointer Output 6(float) + 56: 19(int) Constant 1 + 60: 19(int) Constant 2 + 64: 19(int) Constant 3 + 67(VS_OUTPUT): TypeStruct + 68: TypePointer Output 67(VS_OUTPUT) +69(@entryPointOutput): 68(ptr) Variable Output + 4(main): 2 Function None 3 + 5: Label + 40(clip0): 8(ptr) Variable Function + 41(clip1): 9(ptr) Variable Function + 42(param): 8(ptr) Variable Function + 43(param): 9(ptr) Variable Function + 44:11(VS_OUTPUT) FunctionCall 15(@main(vf3;f1;) 42(param) 43(param) + 45: 7(fvec3) Load 42(param) + Store 40(clip0) 45 + 46: 6(float) Load 43(param) + Store 41(clip1) 46 + 47: 10(fvec4) CompositeExtract 44 0 + Store 39(@entryPointOutput_Position) 47 + 52: 9(ptr) AccessChain 40(clip0) 26 + 53: 6(float) Load 52 + 55: 54(ptr) AccessChain 51(clip0) 20 + Store 55 53 + 57: 9(ptr) AccessChain 40(clip0) 29 + 58: 6(float) Load 57 + 59: 54(ptr) AccessChain 51(clip0) 56 + Store 59 58 + 61: 9(ptr) AccessChain 40(clip0) 32 + 62: 6(float) Load 61 + 63: 54(ptr) AccessChain 51(clip0) 60 + Store 63 62 + 65: 6(float) Load 41(clip1) + 66: 54(ptr) AccessChain 51(clip0) 64 + Store 66 65 + Return + FunctionEnd +15(@main(vf3;f1;):11(VS_OUTPUT) Function None 12 + 13(clip0): 8(ptr) FunctionParameter + 14(clip1): 9(ptr) FunctionParameter + 16: Label + 18(Output): 17(ptr) Variable Function + 24: 23(ptr) AccessChain 18(Output) 20 + Store 24 22 + 27: 9(ptr) AccessChain 13(clip0) 26 + Store 27 21 + 30: 9(ptr) AccessChain 13(clip0) 29 + Store 30 28 + 33: 9(ptr) AccessChain 13(clip0) 32 + Store 33 31 + Store 14(clip1) 34 + 35:11(VS_OUTPUT) Load 18(Output) + ReturnValue 35 + FunctionEnd diff --git a/Test/baseResults/hlsl.semantic.geom.out b/Test/baseResults/hlsl.semantic.geom.out index 9e00e514f..fef418fd1 100755 --- a/Test/baseResults/hlsl.semantic.geom.out +++ b/Test/baseResults/hlsl.semantic.geom.out @@ -69,6 +69,8 @@ output primitive = line_strip 0:? '@entryPointOutput' (layout( location=0) out structure{ temp int ii}) 0:? 'VertexID' (layout( location=0) in 3-element array of uint) 0:? 'OutputStream' (layout( location=1) out structure{ temp int ii}) +0:? 'OutputStream_clip0' ( out 1-element array of float ClipDistance) +0:? 'OutputStream_cull0' ( out 1-element array of float CullDistance) 0:? 'OutputStream_vpai' ( out uint ViewportIndex) @@ -145,6 +147,8 @@ output primitive = line_strip 0:? '@entryPointOutput' (layout( location=0) out structure{ temp int ii}) 0:? 'VertexID' (layout( location=0) in 3-element array of uint) 0:? 'OutputStream' (layout( location=1) out structure{ temp int ii}) +0:? 'OutputStream_clip0' ( out 1-element array of float ClipDistance) +0:? 'OutputStream_cull0' ( out 1-element array of float CullDistance) 0:? 'OutputStream_vpai' ( out uint ViewportIndex) // Module Version 10000 diff --git a/Test/baseResults/hlsl.semantic.vert.out b/Test/baseResults/hlsl.semantic.vert.out index ee794c98d..1ff53fa4d 100755 --- a/Test/baseResults/hlsl.semantic.vert.out +++ b/Test/baseResults/hlsl.semantic.vert.out @@ -1,141 +1,109 @@ hlsl.semantic.vert Shader version: 500 0:? Sequence -0:12 Function Definition: @main(struct-S-f1-f1-f1-f1-f1-f1-i11; ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Function Parameters: -0:12 'ins' ( in structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) +0:10 Function Definition: @main(struct-S-f1-f1-f1-f1-i11; ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Function Parameters: +0:10 'ins' ( in structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) 0:? Sequence -0:14 Branch: Return with expression -0:14 's' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Function Definition: main( ( temp void) -0:12 Function Parameters: +0:12 Branch: Return with expression +0:12 's' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Function Definition: main( ( temp void) +0:10 Function Parameters: 0:? Sequence -0:12 Sequence -0:12 move second child to first child ( temp float) -0:12 clip: direct index for structure ( temp float) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 0 (const int) -0:? 'clip' (layout( location=0) in float) -0:12 move second child to first child ( temp float) -0:12 clip0: direct index for structure ( temp float) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 1 (const int) -0:? 'clip0' (layout( location=1) in float) -0:12 move second child to first child ( temp float) -0:12 clip7: direct index for structure ( temp float) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 2 (const int) -0:? 'clip7' (layout( location=2) in float) -0:12 move second child to first child ( temp float) -0:12 cull: direct index for structure ( temp float) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 3 (const int) -0:? 'cull' (layout( location=3) in float) -0:12 move second child to first child ( temp float) -0:12 cull2: direct index for structure ( temp float) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 4 (const int) -0:? 'cull2' (layout( location=4) in float) -0:12 move second child to first child ( temp float) -0:12 cull5: direct index for structure ( temp float) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 5 (const int) -0:? 'cull5' (layout( location=5) in float) -0:12 move second child to first child ( temp int) -0:12 ii: direct index for structure ( temp int) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 6 (const int) +0:10 Sequence +0:10 move second child to first child ( temp float) +0:10 clip0: direct index for structure ( temp float) +0:? 'ins' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 0 (const int) +0:? 'clip0' (layout( location=0) in float) +0:10 move second child to first child ( temp float) +0:10 clip1: direct index for structure ( temp float) +0:? 'ins' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 1 (const int) +0:? 'clip1' (layout( location=1) in float) +0:10 move second child to first child ( temp float) +0:10 cull0: direct index for structure ( temp float) +0:? 'ins' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 2 (const int) +0:? 'cull0' (layout( location=2) in float) +0:10 move second child to first child ( temp float) +0:10 cull1: direct index for structure ( temp float) +0:? 'ins' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 3 (const int) +0:? 'cull1' (layout( location=3) in float) +0:10 move second child to first child ( temp int) +0:10 ii: direct index for structure ( temp int) +0:? 'ins' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 4 (const int) 0:? 'ii' ( in int InstanceIndex) -0:12 Sequence -0:12 move second child to first child ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Function Call: @main(struct-S-f1-f1-f1-f1-f1-f1-i11; ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) +0:10 Sequence +0:10 move second child to first child ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 'flattenTemp' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Function Call: @main(struct-S-f1-f1-f1-f1-i11; ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:? 'ins' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) 0:? Sequence -0:12 move second child to first child ( temp float) -0:12 direct index ( temp float) -0:? '@entryPointOutput_clip7' ( out 1-element array of float ClipDistance) -0:12 Constant: -0:12 0 (const int) -0:12 clip: direct index for structure ( temp float) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 0 (const int) +0:10 move second child to first child ( temp float) +0:10 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 2-element array of float ClipDistance) +0:10 Constant: +0:10 0 (const int) +0:10 clip0: direct index for structure ( temp float) +0:10 'flattenTemp' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 0 (const int) 0:? Sequence -0:12 move second child to first child ( temp float) -0:12 direct index ( temp float) -0:? '@entryPointOutput_clip7' ( out 1-element array of float ClipDistance) -0:12 Constant: -0:12 0 (const int) -0:12 clip0: direct index for structure ( temp float) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 1 (const int) +0:10 move second child to first child ( temp float) +0:10 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 2-element array of float ClipDistance) +0:10 Constant: +0:10 1 (const int) +0:10 clip1: direct index for structure ( temp float) +0:10 'flattenTemp' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 1 (const int) 0:? Sequence -0:12 move second child to first child ( temp float) -0:12 direct index ( temp float) -0:? '@entryPointOutput_clip7' ( out 1-element array of float ClipDistance) -0:12 Constant: -0:12 0 (const int) -0:12 clip7: direct index for structure ( temp float) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 2 (const int) +0:10 move second child to first child ( temp float) +0:10 direct index ( temp float) +0:? '@entryPointOutput_cull1' ( out 2-element array of float CullDistance) +0:10 Constant: +0:10 0 (const int) +0:10 cull0: direct index for structure ( temp float) +0:10 'flattenTemp' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 2 (const int) 0:? Sequence -0:12 move second child to first child ( temp float) -0:12 direct index ( temp float) -0:? '@entryPointOutput_cull5' ( out 1-element array of float CullDistance) -0:12 Constant: -0:12 0 (const int) -0:12 cull: direct index for structure ( temp float) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 3 (const int) -0:? Sequence -0:12 move second child to first child ( temp float) -0:12 direct index ( temp float) -0:? '@entryPointOutput_cull5' ( out 1-element array of float CullDistance) -0:12 Constant: -0:12 0 (const int) -0:12 cull2: direct index for structure ( temp float) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 4 (const int) -0:? Sequence -0:12 move second child to first child ( temp float) -0:12 direct index ( temp float) -0:? '@entryPointOutput_cull5' ( out 1-element array of float CullDistance) -0:12 Constant: -0:12 0 (const int) -0:12 cull5: direct index for structure ( temp float) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 5 (const int) -0:12 move second child to first child ( temp int) -0:12 ii: direct index for structure ( temp int) -0:12 '@entryPointOutput' (layout( location=0) out structure{ temp int ii}) -0:12 Constant: -0:12 0 (const int) -0:12 ii: direct index for structure ( temp int) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 6 (const int) +0:10 move second child to first child ( temp float) +0:10 direct index ( temp float) +0:? '@entryPointOutput_cull1' ( out 2-element array of float CullDistance) +0:10 Constant: +0:10 1 (const int) +0:10 cull1: direct index for structure ( temp float) +0:10 'flattenTemp' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 3 (const int) +0:10 move second child to first child ( temp int) +0:10 ii: direct index for structure ( temp int) +0:10 '@entryPointOutput' (layout( location=0) out structure{ temp int ii}) +0:10 Constant: +0:10 0 (const int) +0:10 ii: direct index for structure ( temp int) +0:10 'flattenTemp' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 4 (const int) 0:? Linker Objects 0:? '@entryPointOutput' (layout( location=0) out structure{ temp int ii}) -0:? 'clip' (layout( location=0) in float) -0:? 'clip0' (layout( location=1) in float) -0:? 'clip7' (layout( location=2) in float) -0:? 'cull' (layout( location=3) in float) -0:? 'cull2' (layout( location=4) in float) -0:? 'cull5' (layout( location=5) in float) +0:? 'clip0' (layout( location=0) in float) +0:? 'clip1' (layout( location=1) in float) +0:? 'cull0' (layout( location=2) in float) +0:? 'cull1' (layout( location=3) in float) 0:? 'ii' ( in int InstanceIndex) +0:? '@entryPointOutput_clip1' ( out 2-element array of float ClipDistance) +0:? '@entryPointOutput_cull1' ( out 2-element array of float CullDistance) Linked vertex stage: @@ -143,287 +111,231 @@ Linked vertex stage: Shader version: 500 0:? Sequence -0:12 Function Definition: @main(struct-S-f1-f1-f1-f1-f1-f1-i11; ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Function Parameters: -0:12 'ins' ( in structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) +0:10 Function Definition: @main(struct-S-f1-f1-f1-f1-i11; ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Function Parameters: +0:10 'ins' ( in structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) 0:? Sequence -0:14 Branch: Return with expression -0:14 's' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Function Definition: main( ( temp void) -0:12 Function Parameters: +0:12 Branch: Return with expression +0:12 's' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Function Definition: main( ( temp void) +0:10 Function Parameters: 0:? Sequence -0:12 Sequence -0:12 move second child to first child ( temp float) -0:12 clip: direct index for structure ( temp float) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 0 (const int) -0:? 'clip' (layout( location=0) in float) -0:12 move second child to first child ( temp float) -0:12 clip0: direct index for structure ( temp float) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 1 (const int) -0:? 'clip0' (layout( location=1) in float) -0:12 move second child to first child ( temp float) -0:12 clip7: direct index for structure ( temp float) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 2 (const int) -0:? 'clip7' (layout( location=2) in float) -0:12 move second child to first child ( temp float) -0:12 cull: direct index for structure ( temp float) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 3 (const int) -0:? 'cull' (layout( location=3) in float) -0:12 move second child to first child ( temp float) -0:12 cull2: direct index for structure ( temp float) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 4 (const int) -0:? 'cull2' (layout( location=4) in float) -0:12 move second child to first child ( temp float) -0:12 cull5: direct index for structure ( temp float) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 5 (const int) -0:? 'cull5' (layout( location=5) in float) -0:12 move second child to first child ( temp int) -0:12 ii: direct index for structure ( temp int) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 6 (const int) +0:10 Sequence +0:10 move second child to first child ( temp float) +0:10 clip0: direct index for structure ( temp float) +0:? 'ins' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 0 (const int) +0:? 'clip0' (layout( location=0) in float) +0:10 move second child to first child ( temp float) +0:10 clip1: direct index for structure ( temp float) +0:? 'ins' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 1 (const int) +0:? 'clip1' (layout( location=1) in float) +0:10 move second child to first child ( temp float) +0:10 cull0: direct index for structure ( temp float) +0:? 'ins' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 2 (const int) +0:? 'cull0' (layout( location=2) in float) +0:10 move second child to first child ( temp float) +0:10 cull1: direct index for structure ( temp float) +0:? 'ins' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 3 (const int) +0:? 'cull1' (layout( location=3) in float) +0:10 move second child to first child ( temp int) +0:10 ii: direct index for structure ( temp int) +0:? 'ins' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 4 (const int) 0:? 'ii' ( in int InstanceIndex) -0:12 Sequence -0:12 move second child to first child ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Function Call: @main(struct-S-f1-f1-f1-f1-f1-f1-i11; ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:? 'ins' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) +0:10 Sequence +0:10 move second child to first child ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 'flattenTemp' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Function Call: @main(struct-S-f1-f1-f1-f1-i11; ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:? 'ins' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) 0:? Sequence -0:12 move second child to first child ( temp float) -0:12 direct index ( temp float) -0:? '@entryPointOutput_clip7' ( out 1-element array of float ClipDistance) -0:12 Constant: -0:12 0 (const int) -0:12 clip: direct index for structure ( temp float) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 0 (const int) +0:10 move second child to first child ( temp float) +0:10 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 2-element array of float ClipDistance) +0:10 Constant: +0:10 0 (const int) +0:10 clip0: direct index for structure ( temp float) +0:10 'flattenTemp' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 0 (const int) 0:? Sequence -0:12 move second child to first child ( temp float) -0:12 direct index ( temp float) -0:? '@entryPointOutput_clip7' ( out 1-element array of float ClipDistance) -0:12 Constant: -0:12 0 (const int) -0:12 clip0: direct index for structure ( temp float) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 1 (const int) +0:10 move second child to first child ( temp float) +0:10 direct index ( temp float) +0:? '@entryPointOutput_clip1' ( out 2-element array of float ClipDistance) +0:10 Constant: +0:10 1 (const int) +0:10 clip1: direct index for structure ( temp float) +0:10 'flattenTemp' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 1 (const int) 0:? Sequence -0:12 move second child to first child ( temp float) -0:12 direct index ( temp float) -0:? '@entryPointOutput_clip7' ( out 1-element array of float ClipDistance) -0:12 Constant: -0:12 0 (const int) -0:12 clip7: direct index for structure ( temp float) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 2 (const int) +0:10 move second child to first child ( temp float) +0:10 direct index ( temp float) +0:? '@entryPointOutput_cull1' ( out 2-element array of float CullDistance) +0:10 Constant: +0:10 0 (const int) +0:10 cull0: direct index for structure ( temp float) +0:10 'flattenTemp' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 2 (const int) 0:? Sequence -0:12 move second child to first child ( temp float) -0:12 direct index ( temp float) -0:? '@entryPointOutput_cull5' ( out 1-element array of float CullDistance) -0:12 Constant: -0:12 0 (const int) -0:12 cull: direct index for structure ( temp float) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 3 (const int) -0:? Sequence -0:12 move second child to first child ( temp float) -0:12 direct index ( temp float) -0:? '@entryPointOutput_cull5' ( out 1-element array of float CullDistance) -0:12 Constant: -0:12 0 (const int) -0:12 cull2: direct index for structure ( temp float) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 4 (const int) -0:? Sequence -0:12 move second child to first child ( temp float) -0:12 direct index ( temp float) -0:? '@entryPointOutput_cull5' ( out 1-element array of float CullDistance) -0:12 Constant: -0:12 0 (const int) -0:12 cull5: direct index for structure ( temp float) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 5 (const int) -0:12 move second child to first child ( temp int) -0:12 ii: direct index for structure ( temp int) -0:12 '@entryPointOutput' (layout( location=0) out structure{ temp int ii}) -0:12 Constant: -0:12 0 (const int) -0:12 ii: direct index for structure ( temp int) -0:12 'flattenTemp' ( temp structure{ temp float clip, temp float clip0, temp float clip7, temp float cull, temp float cull2, temp float cull5, temp int ii}) -0:12 Constant: -0:12 6 (const int) +0:10 move second child to first child ( temp float) +0:10 direct index ( temp float) +0:? '@entryPointOutput_cull1' ( out 2-element array of float CullDistance) +0:10 Constant: +0:10 1 (const int) +0:10 cull1: direct index for structure ( temp float) +0:10 'flattenTemp' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 3 (const int) +0:10 move second child to first child ( temp int) +0:10 ii: direct index for structure ( temp int) +0:10 '@entryPointOutput' (layout( location=0) out structure{ temp int ii}) +0:10 Constant: +0:10 0 (const int) +0:10 ii: direct index for structure ( temp int) +0:10 'flattenTemp' ( temp structure{ temp float clip0, temp float clip1, temp float cull0, temp float cull1, temp int ii}) +0:10 Constant: +0:10 4 (const int) 0:? Linker Objects 0:? '@entryPointOutput' (layout( location=0) out structure{ temp int ii}) -0:? 'clip' (layout( location=0) in float) -0:? 'clip0' (layout( location=1) in float) -0:? 'clip7' (layout( location=2) in float) -0:? 'cull' (layout( location=3) in float) -0:? 'cull2' (layout( location=4) in float) -0:? 'cull5' (layout( location=5) in float) +0:? 'clip0' (layout( location=0) in float) +0:? 'clip1' (layout( location=1) in float) +0:? 'cull0' (layout( location=2) in float) +0:? 'cull1' (layout( location=3) in float) 0:? 'ii' ( in int InstanceIndex) +0:? '@entryPointOutput_clip1' ( out 2-element array of float ClipDistance) +0:? '@entryPointOutput_cull1' ( out 2-element array of float CullDistance) // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 87 +// Id's are bound by 73 Capability Shader Capability ClipDistance Capability CullDistance 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Vertex 4 "main" 21 26 30 34 38 42 47 59 70 82 + EntryPoint Vertex 4 "main" 21 26 30 34 39 51 59 68 Source HLSL 500 Name 4 "main" Name 8 "S" - MemberName 8(S) 0 "clip" - MemberName 8(S) 1 "clip0" - MemberName 8(S) 2 "clip7" - MemberName 8(S) 3 "cull" - MemberName 8(S) 4 "cull2" - MemberName 8(S) 5 "cull5" - MemberName 8(S) 6 "ii" - Name 12 "@main(struct-S-f1-f1-f1-f1-f1-f1-i11;" + MemberName 8(S) 0 "clip0" + MemberName 8(S) 1 "clip1" + MemberName 8(S) 2 "cull0" + MemberName 8(S) 3 "cull1" + MemberName 8(S) 4 "ii" + Name 12 "@main(struct-S-f1-f1-f1-f1-i11;" Name 11 "ins" Name 14 "s" Name 18 "ins" - Name 21 "clip" - Name 26 "clip0" - Name 30 "clip7" - Name 34 "cull" - Name 38 "cull2" - Name 42 "cull5" - Name 47 "ii" - Name 51 "flattenTemp" - Name 52 "param" - Name 59 "@entryPointOutput_clip7" - Name 70 "@entryPointOutput_cull5" - Name 80 "S" - MemberName 80(S) 0 "ii" - Name 82 "@entryPointOutput" - Decorate 21(clip) Location 0 - Decorate 26(clip0) Location 1 - Decorate 30(clip7) Location 2 - Decorate 34(cull) Location 3 - Decorate 38(cull2) Location 4 - Decorate 42(cull5) Location 5 - Decorate 47(ii) BuiltIn InstanceIndex - Decorate 59(@entryPointOutput_clip7) BuiltIn ClipDistance - Decorate 70(@entryPointOutput_cull5) BuiltIn CullDistance - Decorate 82(@entryPointOutput) Location 0 + Name 21 "clip0" + Name 26 "clip1" + Name 30 "cull0" + Name 34 "cull1" + Name 39 "ii" + Name 43 "flattenTemp" + Name 44 "param" + Name 51 "@entryPointOutput_clip1" + Name 59 "@entryPointOutput_cull1" + Name 66 "S" + MemberName 66(S) 0 "ii" + Name 68 "@entryPointOutput" + Decorate 21(clip0) Location 0 + Decorate 26(clip1) Location 1 + Decorate 30(cull0) Location 2 + Decorate 34(cull1) Location 3 + Decorate 39(ii) BuiltIn InstanceIndex + Decorate 51(@entryPointOutput_clip1) BuiltIn ClipDistance + Decorate 59(@entryPointOutput_cull1) BuiltIn CullDistance + Decorate 68(@entryPointOutput) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 7: TypeInt 32 1 - 8(S): TypeStruct 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 7(int) + 8(S): TypeStruct 6(float) 6(float) 6(float) 6(float) 7(int) 9: TypePointer Function 8(S) 10: TypeFunction 8(S) 9(ptr) 19: 7(int) Constant 0 20: TypePointer Input 6(float) - 21(clip): 20(ptr) Variable Input + 21(clip0): 20(ptr) Variable Input 23: TypePointer Function 6(float) 25: 7(int) Constant 1 - 26(clip0): 20(ptr) Variable Input + 26(clip1): 20(ptr) Variable Input 29: 7(int) Constant 2 - 30(clip7): 20(ptr) Variable Input + 30(cull0): 20(ptr) Variable Input 33: 7(int) Constant 3 - 34(cull): 20(ptr) Variable Input + 34(cull1): 20(ptr) Variable Input 37: 7(int) Constant 4 - 38(cull2): 20(ptr) Variable Input - 41: 7(int) Constant 5 - 42(cull5): 20(ptr) Variable Input - 45: 7(int) Constant 6 - 46: TypePointer Input 7(int) - 47(ii): 46(ptr) Variable Input - 49: TypePointer Function 7(int) - 55: TypeInt 32 0 - 56: 55(int) Constant 1 - 57: TypeArray 6(float) 56 - 58: TypePointer Output 57 -59(@entryPointOutput_clip7): 58(ptr) Variable Output - 62: TypePointer Output 6(float) -70(@entryPointOutput_cull5): 58(ptr) Variable Output - 80(S): TypeStruct 7(int) - 81: TypePointer Output 80(S) -82(@entryPointOutput): 81(ptr) Variable Output - 85: TypePointer Output 7(int) + 38: TypePointer Input 7(int) + 39(ii): 38(ptr) Variable Input + 41: TypePointer Function 7(int) + 47: TypeInt 32 0 + 48: 47(int) Constant 2 + 49: TypeArray 6(float) 48 + 50: TypePointer Output 49 +51(@entryPointOutput_clip1): 50(ptr) Variable Output + 54: TypePointer Output 6(float) +59(@entryPointOutput_cull1): 50(ptr) Variable Output + 66(S): TypeStruct 7(int) + 67: TypePointer Output 66(S) +68(@entryPointOutput): 67(ptr) Variable Output + 71: TypePointer Output 7(int) 4(main): 2 Function None 3 5: Label 18(ins): 9(ptr) Variable Function - 51(flattenTemp): 9(ptr) Variable Function - 52(param): 9(ptr) Variable Function - 22: 6(float) Load 21(clip) + 43(flattenTemp): 9(ptr) Variable Function + 44(param): 9(ptr) Variable Function + 22: 6(float) Load 21(clip0) 24: 23(ptr) AccessChain 18(ins) 19 Store 24 22 - 27: 6(float) Load 26(clip0) + 27: 6(float) Load 26(clip1) 28: 23(ptr) AccessChain 18(ins) 25 Store 28 27 - 31: 6(float) Load 30(clip7) + 31: 6(float) Load 30(cull0) 32: 23(ptr) AccessChain 18(ins) 29 Store 32 31 - 35: 6(float) Load 34(cull) + 35: 6(float) Load 34(cull1) 36: 23(ptr) AccessChain 18(ins) 33 Store 36 35 - 39: 6(float) Load 38(cull2) - 40: 23(ptr) AccessChain 18(ins) 37 - Store 40 39 - 43: 6(float) Load 42(cull5) - 44: 23(ptr) AccessChain 18(ins) 41 - Store 44 43 - 48: 7(int) Load 47(ii) - 50: 49(ptr) AccessChain 18(ins) 45 - Store 50 48 - 53: 8(S) Load 18(ins) - Store 52(param) 53 - 54: 8(S) FunctionCall 12(@main(struct-S-f1-f1-f1-f1-f1-f1-i11;) 52(param) - Store 51(flattenTemp) 54 - 60: 23(ptr) AccessChain 51(flattenTemp) 19 + 40: 7(int) Load 39(ii) + 42: 41(ptr) AccessChain 18(ins) 37 + Store 42 40 + 45: 8(S) Load 18(ins) + Store 44(param) 45 + 46: 8(S) FunctionCall 12(@main(struct-S-f1-f1-f1-f1-i11;) 44(param) + Store 43(flattenTemp) 46 + 52: 23(ptr) AccessChain 43(flattenTemp) 19 + 53: 6(float) Load 52 + 55: 54(ptr) AccessChain 51(@entryPointOutput_clip1) 19 + Store 55 53 + 56: 23(ptr) AccessChain 43(flattenTemp) 25 + 57: 6(float) Load 56 + 58: 54(ptr) AccessChain 51(@entryPointOutput_clip1) 25 + Store 58 57 + 60: 23(ptr) AccessChain 43(flattenTemp) 29 61: 6(float) Load 60 - 63: 62(ptr) AccessChain 59(@entryPointOutput_clip7) 19 - Store 63 61 - 64: 23(ptr) AccessChain 51(flattenTemp) 25 - 65: 6(float) Load 64 - 66: 62(ptr) AccessChain 59(@entryPointOutput_clip7) 19 - Store 66 65 - 67: 23(ptr) AccessChain 51(flattenTemp) 29 - 68: 6(float) Load 67 - 69: 62(ptr) AccessChain 59(@entryPointOutput_clip7) 19 - Store 69 68 - 71: 23(ptr) AccessChain 51(flattenTemp) 33 - 72: 6(float) Load 71 - 73: 62(ptr) AccessChain 70(@entryPointOutput_cull5) 19 - Store 73 72 - 74: 23(ptr) AccessChain 51(flattenTemp) 37 - 75: 6(float) Load 74 - 76: 62(ptr) AccessChain 70(@entryPointOutput_cull5) 19 - Store 76 75 - 77: 23(ptr) AccessChain 51(flattenTemp) 41 - 78: 6(float) Load 77 - 79: 62(ptr) AccessChain 70(@entryPointOutput_cull5) 19 - Store 79 78 - 83: 49(ptr) AccessChain 51(flattenTemp) 45 - 84: 7(int) Load 83 - 86: 85(ptr) AccessChain 82(@entryPointOutput) 19 - Store 86 84 + 62: 54(ptr) AccessChain 59(@entryPointOutput_cull1) 19 + Store 62 61 + 63: 23(ptr) AccessChain 43(flattenTemp) 33 + 64: 6(float) Load 63 + 65: 54(ptr) AccessChain 59(@entryPointOutput_cull1) 25 + Store 65 64 + 69: 41(ptr) AccessChain 43(flattenTemp) 37 + 70: 7(int) Load 69 + 72: 71(ptr) AccessChain 68(@entryPointOutput) 19 + Store 72 70 Return FunctionEnd -12(@main(struct-S-f1-f1-f1-f1-f1-f1-i11;): 8(S) Function None 10 +12(@main(struct-S-f1-f1-f1-f1-i11;): 8(S) Function None 10 11(ins): 9(ptr) FunctionParameter 13: Label 14(s): 9(ptr) Variable Function diff --git a/Test/hlsl.clipdistance-6.vert b/Test/hlsl.clipdistance-6.vert new file mode 100644 index 000000000..d68c2254c --- /dev/null +++ b/Test/hlsl.clipdistance-6.vert @@ -0,0 +1,23 @@ +struct VS_OUTPUT { + float4 Position : SV_Position; + float4 clip0 : SV_ClipDistance0; // multiple semantic IDs, two vec4s (no extra packing) + float4 clip1 : SV_ClipDistance1; // ... +}; + +VS_OUTPUT main() +{ + VS_OUTPUT Output; + Output.Position = 0; + + Output.clip0.x = 0; + Output.clip0.y = 1; + Output.clip0.z = 2; + Output.clip0.w = 3; + + Output.clip1.x = 4; + Output.clip1.y = 5; + Output.clip1.z = 6; + Output.clip1.w = 7; + + return Output; +} diff --git a/Test/hlsl.clipdistance-7.vert b/Test/hlsl.clipdistance-7.vert new file mode 100644 index 000000000..c615d1f8c --- /dev/null +++ b/Test/hlsl.clipdistance-7.vert @@ -0,0 +1,23 @@ +struct VS_OUTPUT { + float4 Position : SV_Position; + float3 clip0 : SV_ClipDistance0; // multiple semantic IDs, vec3+vec4 (skip) + float4 clip1 : SV_ClipDistance1; // ... +}; + +VS_OUTPUT main() +{ + VS_OUTPUT Output; + Output.Position = 0; + + Output.clip0.x = 0; + Output.clip0.y = 1; + Output.clip0.z = 2; + // Position 3 is skipped + + Output.clip1.x = 4; + Output.clip1.y = 5; + Output.clip1.z = 6; + Output.clip1.w = 7; + + return Output; +} diff --git a/Test/hlsl.clipdistance-8.vert b/Test/hlsl.clipdistance-8.vert new file mode 100644 index 000000000..c6377d2dd --- /dev/null +++ b/Test/hlsl.clipdistance-8.vert @@ -0,0 +1,20 @@ +struct VS_OUTPUT { + float4 Position : SV_Position; + float3 clip0 : SV_ClipDistance0; // multiple semantic IDs, vec3+float (pack) + float clip1 : SV_ClipDistance1; // ... +}; + +VS_OUTPUT main() +{ + VS_OUTPUT Output; + Output.Position = 0; + + Output.clip0.x = 0; + Output.clip0.y = 1; + Output.clip0.z = 2; + + // Position 3 is packed from clip1's float + Output.clip1 = 3; + + return Output; +} diff --git a/Test/hlsl.clipdistance-9.vert b/Test/hlsl.clipdistance-9.vert new file mode 100644 index 000000000..d48830703 --- /dev/null +++ b/Test/hlsl.clipdistance-9.vert @@ -0,0 +1,19 @@ +struct VS_OUTPUT { + float4 Position : SV_Position; +}; + +// Test packing 0 and 1 semantics into single array[4] output, from out fn params. +VS_OUTPUT main(out float3 clip0 : SV_ClipDistance0, out float clip1 : SV_ClipDistance1) +{ + VS_OUTPUT Output; + Output.Position = 0; + + clip0.x = 0; + clip0.y = 1; + clip0.z = 2; + + // Position 3 is packed from clip1's float + clip1 = 3; + + return Output; +} diff --git a/Test/hlsl.semantic.vert b/Test/hlsl.semantic.vert index 16bba37f9..1845dc3c7 100644 --- a/Test/hlsl.semantic.vert +++ b/Test/hlsl.semantic.vert @@ -1,10 +1,8 @@ struct S { - float clip : SV_ClipDistance; float clip0 : SV_ClipDistance0; - float clip7 : SV_ClipDistance7; - float cull : SV_CullDistance; - float cull2 : SV_CullDistance2; - float cull5 : SV_CullDistance5; + float clip1 : SV_ClipDistance1; + float cull0 : SV_CullDistance0; + float cull1 : SV_CullDistance1; int ii : SV_InstanceID; }; diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp index 21f606e64..46d8cdd4b 100644 --- a/gtests/Hlsl.FromFile.cpp +++ b/gtests/Hlsl.FromFile.cpp @@ -102,6 +102,10 @@ INSTANTIATE_TEST_CASE_P( {"hlsl.clipdistance-3.vert", "main"}, {"hlsl.clipdistance-4.vert", "main"}, {"hlsl.clipdistance-5.vert", "main"}, + {"hlsl.clipdistance-6.vert", "main"}, + {"hlsl.clipdistance-7.vert", "main"}, + {"hlsl.clipdistance-8.vert", "main"}, + {"hlsl.clipdistance-9.vert", "main"}, {"hlsl.comparison.vec.frag", "main"}, {"hlsl.conditional.frag", "PixelShaderFunction"}, {"hlsl.constantbuffer.frag", "main"}, diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index dc44c3697..561a529ab 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -65,7 +65,9 @@ HlslParseContext::HlslParseContext(TSymbolTable& symbolTable, TIntermediate& int sourceEntryPointName(sourceEntryPointName), entryPointFunction(nullptr), entryPointFunctionBody(nullptr), - gsStreamOutput(nullptr) + gsStreamOutput(nullptr), + clipDistanceOutput(nullptr), + cullDistanceOutput(nullptr) { globalUniformDefaults.clear(); globalUniformDefaults.layoutMatrix = ElmRowMajor; @@ -78,6 +80,9 @@ HlslParseContext::HlslParseContext(TSymbolTable& symbolTable, TIntermediate& int globalInputDefaults.clear(); globalOutputDefaults.clear(); + clipSemanticNSize.fill(0); + cullSemanticNSize.fill(0); + // "Shaders in the transform // feedback capturing mode have an initial global default of // layout(xfb_buffer = 0) out;" @@ -1513,6 +1518,12 @@ void HlslParseContext::trackLinkage(TSymbol& symbol) } +// Returns true if the builtin is a clip or cull distance variable. +bool HlslParseContext::isClipOrCullDistance(TBuiltInVariable builtIn) +{ + return builtIn == EbvClipDistance || builtIn == EbvCullDistance; +} + // Some types require fixed array sizes in SPIR-V, but can be scalars or // arrays of sizes SPIR-V doesn't allow. For example, tessellation factors. // This creates the right size. A conversion is performed when the internal @@ -1526,24 +1537,6 @@ void HlslParseContext::fixBuiltInIoType(TType& type) case EbvTessLevelOuter: requiredArraySize = 4; break; case EbvTessLevelInner: requiredArraySize = 2; break; - case EbvClipDistance: - case EbvCullDistance: - { - // ClipDistance and CullDistance are handled specially in the entry point output - // copy algorithm, because they may need to be unpacked from components of vectors - // (or a scalar) into a float array. Here, we make the array the right size and type, - // which is the number of components per vector times the array size (or 1 if not - // an array). The copy itself is handled in assignClipCullDistance(). - requiredArraySize = type.getVectorSize() * (type.isArray() ? type.getOuterArraySize() : 1); - - TType clipCullType(EbtFloat, type.getQualifier().storage, 1); - - clipCullType.getQualifier() = type.getQualifier(); - type.shallowCopy(clipCullType); - - break; - } - case EbvTessCoord: { // tesscoord is always a vec3 for the IO variable, no matter the shader's @@ -1556,6 +1549,14 @@ void HlslParseContext::fixBuiltInIoType(TType& type) break; } default: + if (isClipOrCullDistance(type)) { + if (type.getQualifier().builtIn == EbvClipDistance) { + clipSemanticNSize[type.getQualifier().layoutLocation] = type.getVectorSize(); + } else { + cullSemanticNSize[type.getQualifier().layoutLocation] = type.getVectorSize(); + } + } + return; } @@ -2020,7 +2021,11 @@ TIntermNode* HlslParseContext::transformEntryPoint(const TSourceLoc& loc, TFunct split(variable); } - assignToInterface(variable); + // For clip and cull distance, multiple output variables potentially get merged + // into one in assignClipCullDistance. That code in assignClipCullDistance + // handles the interface logic, so we avoid it here in that case. + if (!isClipOrCullDistance(variable.getType())) + assignToInterface(variable); }; if (entryPointOutput != nullptr) makeVariableInOut(*entryPointOutput); @@ -2350,12 +2355,98 @@ void HlslParseContext::handleFunctionArgument(TFunction* function, // // The values are assigned to sequential members of the output array. The inner dimension // is vector components. The outer dimension is array elements. -TIntermAggregate* HlslParseContext::assignClipCullDistance(const TSourceLoc& loc, TOperator op, +TIntermAggregate* HlslParseContext::assignClipCullDistance(const TSourceLoc& loc, TOperator op, int semanticId, TIntermTyped* left, TIntermTyped* right) { - // *** - // TODO: this does not yet handle the index coming from the semantic's ID, as in SV_ClipDistance[012345...] - // *** + TVariable** clipCullVar = nullptr; + + const TBuiltInVariable builtInType = left->getQualifier().builtIn; + + // array sizes, or 1 if it's not an array: + const int rhsArraySize = (right->getType().isArray() ? right->getType().getOuterArraySize() : 1); + // vector sizes: + const int rhsVectorSize = right->getType().getVectorSize(); + + decltype(clipSemanticNSize)* semanticNSize = nullptr; + + // Refer to either the clip or the cull distance, depending on semantic. + switch (builtInType) { + case EbvClipDistance: + clipCullVar = &clipDistanceOutput; + semanticNSize = &clipSemanticNSize; + break; + case EbvCullDistance: + clipCullVar = &cullDistanceOutput; + semanticNSize = &cullSemanticNSize; + break; + + // called invalidly: we expected a clip or a cull distance. + // static compile time problem: should not happen. + default: assert(0); return nullptr; + } + + // This is the offset in the destination array of a given semantic's data + std::array semanticOffset; + + // Calculate offset of variable of semantic N in destination array + int arrayLoc = 0; + int vecItems = 0; + + for (int x = 0; x < maxClipCullRegs; ++x) { + // See if we overflowed the vec4 packing + if ((vecItems + (*semanticNSize)[x]) > 4) { + arrayLoc = (arrayLoc + 3) & (~0x3); // round up to next multiple of 4 + vecItems = 0; + } + + semanticOffset[x] = arrayLoc; + vecItems += (*semanticNSize)[x]; + arrayLoc += (*semanticNSize)[x]; + } + + + // If we haven't created the output arleady, create it now. + if (*clipCullVar == nullptr) { + // ClipDistance and CullDistance are handled specially in the entry point output + // copy algorithm, because they may need to be unpacked from components of vectors + // (or a scalar) into a float array. Here, we make the array the right size and type, + // which depends on the incoming data, which has several potential dimensions: + // Semantic ID + // vector size + // array size + // Of those, semantic ID and array size cannot appear simultaneously. + + const int requiredArraySize = arrayLoc * rhsArraySize; + + TType clipCullType(EbtFloat, left->getType().getQualifier().storage, 1); + clipCullType.getQualifier() = left->getType().getQualifier(); + + // Create required array dimension + TArraySizes arraySizes; + arraySizes.addInnerSize(requiredArraySize); + clipCullType.newArraySizes(arraySizes); + + // Obtain symbol name: we'll use that for the symbol we introduce. + TIntermSymbol* sym = left->getAsSymbolNode(); + assert(sym != nullptr); + + // We are moving the semantic ID from the layout location, so it is no longer needed or + // desired there. + clipCullType.getQualifier().layoutLocation = TQualifier::layoutLocationEnd; + + // Create variable and track its linkage + *clipCullVar = makeInternalVariable(sym->getName().c_str(), clipCullType); + + trackLinkage(**clipCullVar); + } + + // Create symbol for the clip or cull variable. + left = intermediate.addSymbol(**clipCullVar); + + // array sizes, or 1 if it's not an array: + const int lhsArraySize = (left->getType().isArray() ? left->getType().getOuterArraySize() : 1); + // vector sizes: + const int lhsVectorSize = left->getType().getVectorSize(); // left has got to be an array of scalar floats, per SPIR-V semantics. // fixBuiltInIoType() should have handled that upstream. @@ -2363,13 +2454,6 @@ TIntermAggregate* HlslParseContext::assignClipCullDistance(const TSourceLoc& loc assert(left->getType().getVectorSize() == 1); assert(left->getType().getBasicType() == EbtFloat); - // array sizes, or 1 if it's not an array: - const int lhsArraySize = (left->getType().isArray() ? left->getType().getOuterArraySize() : 1); - const int rhsArraySize = (right->getType().isArray() ? right->getType().getOuterArraySize() : 1); - // vector sizes: - const int lhsVectorSize = left->getType().getVectorSize(); - const int rhsVectorSize = right->getType().getVectorSize(); - // We may be creating multiple sub-assignments. This is an aggregate to hold them. // TODO: it would be possible to be clever sometimes and avoid the sequence node if not needed. TIntermAggregate* assignList = nullptr; @@ -2386,7 +2470,8 @@ TIntermAggregate* HlslParseContext::assignClipCullDistance(const TSourceLoc& loc // We are going to copy each component of the right (per array element if indicated) to sequential // array elements of the left. This tracks the lhs element we're writing to as we go along. - int lhsArrayPos = 0; + // We may be starting in the middle - e.g, for a non-zero semantic ID calculated above. + int lhsArrayPos = semanticOffset[semanticId]; // Loop through every component of every element of the RHS, and copy to LHS elements in turn. for (int rhsArrayPos = 0; rhsArrayPos < rhsArraySize; ++rhsArrayPos) { @@ -2477,9 +2562,10 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op // isn't, we fall back to a member-wise copy. if (! isFlattenLeft && ! isFlattenRight && !isSplitLeft && !isSplitRight) { // Clip and cull distance requires more processing. See comment above assignClipCullDistance. - const TBuiltInVariable leftBuiltIn = left->getType().getQualifier().builtIn; - if (leftBuiltIn == EbvClipDistance || leftBuiltIn == EbvCullDistance) - return assignClipCullDistance(loc, op, left, right); + if (isClipOrCullDistance(left->getType())) { + const int semanticId = left->getType().getQualifier().layoutLocation; + return assignClipCullDistance(loc, op, semanticId, left, right); + } return intermediate.addAssign(op, left, right, loc); } @@ -2652,14 +2738,20 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right, member, splitRight, memberR) : subRight; - const TBuiltInVariable leftBuiltIn = subSplitLeft->getType().getQualifier().builtIn; - - if (leftBuiltIn == EbvClipDistance || leftBuiltIn == EbvCullDistance) { - + if (isClipOrCullDistance(subSplitLeft->getType())) { // Clip and cull distance builtin assignment is complex in its own right, and is handled in // a separate function dedicated to that task. See comment above assignClipCullDistance; - assignList = intermediate.growAggregate(assignList, assignClipCullDistance(loc, op, subSplitLeft, - subSplitRight), loc); + + // Since all clip/cull semantics boil down to the same builtin type, we need to get the + // semantic ID from the dereferenced type's layout location, to avoid an N-1 mapping. + const TType derefType(left->getType(), member); + const int semanticId = derefType.getQualifier().layoutLocation; + + TIntermAggregate* clipCullAssign = assignClipCullDistance(loc, op, semanticId, + subSplitLeft, subSplitRight); + + assignList = intermediate.growAggregate(assignList, clipCullAssign, loc); + } else if (!isFlattenLeft && !isFlattenRight && !typeL.containsBuiltInInterstageIO(language) && !typeR.containsBuiltInInterstageIO(language)) { @@ -5307,11 +5399,23 @@ TFunction* HlslParseContext::makeConstructorCall(const TSourceLoc& loc, const TT void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, TBuiltInVariable builtIn, const TString& upperCase) { - const auto getSemanticNumber = [](const TString& semantic) -> unsigned int { + // Parse and return semantic number. If limit is 0, it will be ignored. Otherwise, if the parsed + // semantic number is >= limit, errorMsg is issued and 0 is returned. + // TODO: it would be nicer if limit and errorMsg had default parameters, but some compilers don't yet + // accept those in lambda functions. + const auto getSemanticNumber = [this, loc](const TString& semantic, unsigned int limit, const char* errorMsg) -> unsigned int { size_t pos = semantic.find_last_not_of("0123456789"); if (pos == std::string::npos) return 0u; - return (unsigned int)atoi(semantic.c_str() + pos + 1); + + unsigned int semanticNum = (unsigned int)atoi(semantic.c_str() + pos + 1); + + if (limit != 0 && semanticNum >= limit) { + error(loc, errorMsg, semantic.c_str(), ""); + return 0u; + } + + return semanticNum; }; switch(builtIn) { @@ -5319,8 +5423,14 @@ void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, TBu // Get location numbers from fragment outputs, instead of // auto-assigning them. if (language == EShLangFragment && upperCase.compare(0, 9, "SV_TARGET") == 0) { - qualifier.layoutLocation = getSemanticNumber(upperCase); + qualifier.layoutLocation = getSemanticNumber(upperCase, 0, nullptr); nextOutLocation = std::max(nextOutLocation, qualifier.layoutLocation + 1u); + } else if (upperCase.compare(0, 15, "SV_CLIPDISTANCE") == 0) { + builtIn = EbvClipDistance; + qualifier.layoutLocation = getSemanticNumber(upperCase, maxClipCullRegs, "invalid clip semantic"); + } else if (upperCase.compare(0, 15, "SV_CULLDISTANCE") == 0) { + builtIn = EbvCullDistance; + qualifier.layoutLocation = getSemanticNumber(upperCase, maxClipCullRegs, "invalid cull semantic"); } break; case EbvPosition: @@ -8748,6 +8858,9 @@ void HlslParseContext::correctInput(TQualifier& qualifier) qualifier.sample = false; } + if (isClipOrCullDistance(qualifier)) + qualifier.layoutLocation = TQualifier::layoutLocationEnd; + qualifier.clearStreamLayout(); qualifier.clearXfbLayout(); diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h index 2d507c38a..78a656bbc 100755 --- a/hlsl/hlslParseHelper.h +++ b/hlsl/hlslParseHelper.h @@ -39,6 +39,8 @@ #include "../glslang/MachineIndependent/parseVersions.h" #include "../glslang/MachineIndependent/ParseHelper.h" +#include + namespace glslang { class TAttributeMap; // forward declare @@ -91,7 +93,7 @@ public: TIntermTyped* handleAssign(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right); TIntermTyped* handleAssignToMatrixSwizzle(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right); TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*); - TIntermAggregate* assignClipCullDistance(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right); + TIntermAggregate* assignClipCullDistance(const TSourceLoc&, TOperator, int semanticId, TIntermTyped* left, TIntermTyped* right); void decomposeIntrinsic(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); void decomposeSampleMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); void decomposeStructBufferMethods(const TSourceLoc&, TIntermTyped*& node, TIntermNode* arguments); @@ -308,6 +310,10 @@ protected: // Finalization step: remove unused buffer blocks from linkage (we don't know until the // shader is entirely compiled) void removeUnusedStructBufferCounters(); + + static bool isClipOrCullDistance(TBuiltInVariable); + static bool isClipOrCullDistance(const TQualifier& qual) { return isClipOrCullDistance(qual.builtIn); } + static bool isClipOrCullDistance(const TType& type) { return isClipOrCullDistance(type.getQualifier()); } // Pass through to base class after remembering builtin mappings. using TParseContextBase::trackLinkage; @@ -432,6 +438,13 @@ protected: TVariable* gsStreamOutput; // geometry shader stream outputs, for emit (Append method) + TVariable* clipDistanceOutput; // synthesized clip distance output variable (shader might have >1) + TVariable* cullDistanceOutput; // synthesized cull distance output variable (shader might have >1) + + static const int maxClipCullRegs = 2; + std::array clipSemanticNSize; // vector, indexed by clip semantic ID + std::array cullSemanticNSize; // vector, indexed by cull semantic ID + // This tracks the first (mip level) argument to the .mips[][] operator. Since this can be nested as // in tx.mips[tx.mips[0][1].x][2], we need a stack. We also track the TSourceLoc for error reporting // purposes. diff --git a/hlsl/hlslScanContext.cpp b/hlsl/hlslScanContext.cpp index 351aace91..392efeb5d 100755 --- a/hlsl/hlslScanContext.cpp +++ b/hlsl/hlslScanContext.cpp @@ -420,32 +420,6 @@ void HlslScanContext::fillInKeywordMap() } (*SemanticMap)["SV_POSITION"] = EbvPosition; - (*SemanticMap)["SV_CLIPDISTANCE"] = EbvClipDistance; - (*SemanticMap)["SV_CLIPDISTANCE0"] = EbvClipDistance; - (*SemanticMap)["SV_CLIPDISTANCE1"] = EbvClipDistance; - (*SemanticMap)["SV_CLIPDISTANCE2"] = EbvClipDistance; - (*SemanticMap)["SV_CLIPDISTANCE3"] = EbvClipDistance; - (*SemanticMap)["SV_CLIPDISTANCE4"] = EbvClipDistance; - (*SemanticMap)["SV_CLIPDISTANCE5"] = EbvClipDistance; - (*SemanticMap)["SV_CLIPDISTANCE6"] = EbvClipDistance; - (*SemanticMap)["SV_CLIPDISTANCE7"] = EbvClipDistance; - (*SemanticMap)["SV_CLIPDISTANCE8"] = EbvClipDistance; - (*SemanticMap)["SV_CLIPDISTANCE9"] = EbvClipDistance; - (*SemanticMap)["SV_CLIPDISTANCE10"] = EbvClipDistance; - (*SemanticMap)["SV_CLIPDISTANCE11"] = EbvClipDistance; - (*SemanticMap)["SV_CULLDISTANCE"] = EbvCullDistance; - (*SemanticMap)["SV_CULLDISTANCE0"] = EbvCullDistance; - (*SemanticMap)["SV_CULLDISTANCE1"] = EbvCullDistance; - (*SemanticMap)["SV_CULLDISTANCE2"] = EbvCullDistance; - (*SemanticMap)["SV_CULLDISTANCE3"] = EbvCullDistance; - (*SemanticMap)["SV_CULLDISTANCE4"] = EbvCullDistance; - (*SemanticMap)["SV_CULLDISTANCE5"] = EbvCullDistance; - (*SemanticMap)["SV_CULLDISTANCE6"] = EbvCullDistance; - (*SemanticMap)["SV_CULLDISTANCE7"] = EbvCullDistance; - (*SemanticMap)["SV_CULLDISTANCE8"] = EbvCullDistance; - (*SemanticMap)["SV_CULLDISTANCE9"] = EbvCullDistance; - (*SemanticMap)["SV_CULLDISTANCE10"] = EbvCullDistance; - (*SemanticMap)["SV_CULLDISTANCE11"] = EbvCullDistance; (*SemanticMap)["SV_VERTEXID"] = EbvVertexIndex; (*SemanticMap)["SV_VIEWPORTARRAYINDEX"] = EbvViewportIndex; (*SemanticMap)["SV_TESSFACTOR"] = EbvTessLevelOuter;