HLSL: handle multiple clip/cull semantic IDs

HLSL allows several variables to be declared.  There are packing rules involved:
e.g, a float3 and a float1 can be packed into a single array[4], while for a
float3 and another float3, the second one will skip the third array entry to
avoid straddling

This is implements that ability.  Because there can be multiple variables involved,
and the final output array will often be a different type altogether (to fuse
the values into a single destination), a new variable is synthesized, unlike the prior
clip/cull support which used the declared variable.  The new variable name is
taken from one of the declared ones, so the old tests are unchanged.

Several new tests are added to test various packing scenarios.

Only two semantic IDs are supported: 0, and 1, per HLSL rules.  This is
encapsulated in

     static const int maxClipCullRegs = 2;

and the algorithm (probably :) ) generalizes to larger values, although there
are a few issues around how HLSL would pack (e.g, would 4 scalars be packed into
a single HLSL float4 out reg?  Probably, and this algorithm assumes so).
This commit is contained in:
LoopDawg 2017-07-05 11:33:06 -06:00
parent cd52fd5a42
commit 307b6507b3
17 changed files with 2257 additions and 430 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
};

View File

@ -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"},

View File

@ -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<int, maxClipCullRegs> 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();

View File

@ -39,6 +39,8 @@
#include "../glslang/MachineIndependent/parseVersions.h"
#include "../glslang/MachineIndependent/ParseHelper.h"
#include <array>
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<int, maxClipCullRegs> clipSemanticNSize; // vector, indexed by clip semantic ID
std::array<int, maxClipCullRegs> 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.

View File

@ -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;