diff --git a/Test/baseResults/hlsl.clipdistance-4.vert.out b/Test/baseResults/hlsl.clipdistance-4.vert.out index 6cfa4b66..acb1100f 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 6ad45a5e..643a6784 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 00000000..efce7962 --- /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 00000000..324320be --- /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 00000000..94750b13 --- /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 00000000..a3502b77 --- /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 9e00e514..fef418fd 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 ee794c98..1ff53fa4 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 00000000..d68c2254 --- /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 00000000..c615d1f8 --- /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 00000000..c6377d2d --- /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 00000000..d4883070 --- /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 16bba37f..1845dc3c 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 21f606e6..46d8cdd4 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 dc44c369..561a529a 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 2d507c38..78a656bb 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 351aace9..392efeb5 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;