mirror of
https://github.com/RPCS3/glslang.git
synced 2024-11-23 19:29:44 +00:00
307b6507b3
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).
284 lines
15 KiB
Plaintext
Executable File
284 lines
15 KiB
Plaintext
Executable File
hlsl.semantic.geom
|
|
Shader version: 500
|
|
invocations = -1
|
|
max_vertices = 4
|
|
input primitive = triangles
|
|
output primitive = line_strip
|
|
0:? Sequence
|
|
0:12 Function Definition: @main(u1[3];struct-S-f1-f1-u1-u1-i11; ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Function Parameters:
|
|
0:12 'VertexID' ( in 3-element array of uint)
|
|
0:12 'OutputStream' ( out structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:? Sequence
|
|
0:14 Branch: Return with expression
|
|
0:14 's' ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Function Definition: main( ( temp void)
|
|
0:12 Function Parameters:
|
|
0:? Sequence
|
|
0:12 move second child to first child ( temp 3-element array of uint)
|
|
0:? 'VertexID' ( temp 3-element array of uint)
|
|
0:? 'VertexID' (layout( location=0) in 3-element array of uint)
|
|
0:12 Sequence
|
|
0:12 move second child to first child ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 'flattenTemp' ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Function Call: @main(u1[3];struct-S-f1-f1-u1-u1-i11; ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:? 'VertexID' ( temp 3-element array of uint)
|
|
0:? 'OutputStream' ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:? Sequence
|
|
0:12 move second child to first child ( temp float)
|
|
0:12 direct index ( temp float)
|
|
0:? 'OutputStream_clip0' ( 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 clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Constant:
|
|
0:12 0 (const int)
|
|
0:? Sequence
|
|
0:12 move second child to first child ( temp float)
|
|
0:12 direct index ( temp float)
|
|
0:? 'OutputStream_cull0' ( out 1-element array of float CullDistance)
|
|
0:12 Constant:
|
|
0:12 0 (const int)
|
|
0:12 cull0: direct index for structure ( temp float)
|
|
0:12 'flattenTemp' ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Constant:
|
|
0:12 1 (const int)
|
|
0:12 move second child to first child ( temp uint)
|
|
0:? 'OutputStream_vpai' ( out uint ViewportIndex)
|
|
0:12 vpai: direct index for structure ( temp uint)
|
|
0:12 'flattenTemp' ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Constant:
|
|
0:12 2 (const int)
|
|
0:12 move second child to first child ( temp uint)
|
|
0:? 'OutputStream_rtai' ( out uint Layer)
|
|
0:12 rtai: direct index for structure ( temp uint)
|
|
0:12 'flattenTemp' ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Constant:
|
|
0:12 3 (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 clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Constant:
|
|
0:12 4 (const int)
|
|
0:? Linker Objects
|
|
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)
|
|
|
|
|
|
Linked geometry stage:
|
|
|
|
|
|
Shader version: 500
|
|
invocations = 1
|
|
max_vertices = 4
|
|
input primitive = triangles
|
|
output primitive = line_strip
|
|
0:? Sequence
|
|
0:12 Function Definition: @main(u1[3];struct-S-f1-f1-u1-u1-i11; ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Function Parameters:
|
|
0:12 'VertexID' ( in 3-element array of uint)
|
|
0:12 'OutputStream' ( out structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:? Sequence
|
|
0:14 Branch: Return with expression
|
|
0:14 's' ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Function Definition: main( ( temp void)
|
|
0:12 Function Parameters:
|
|
0:? Sequence
|
|
0:12 move second child to first child ( temp 3-element array of uint)
|
|
0:? 'VertexID' ( temp 3-element array of uint)
|
|
0:? 'VertexID' (layout( location=0) in 3-element array of uint)
|
|
0:12 Sequence
|
|
0:12 move second child to first child ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 'flattenTemp' ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Function Call: @main(u1[3];struct-S-f1-f1-u1-u1-i11; ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:? 'VertexID' ( temp 3-element array of uint)
|
|
0:? 'OutputStream' ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:? Sequence
|
|
0:12 move second child to first child ( temp float)
|
|
0:12 direct index ( temp float)
|
|
0:? 'OutputStream_clip0' ( 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 clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Constant:
|
|
0:12 0 (const int)
|
|
0:? Sequence
|
|
0:12 move second child to first child ( temp float)
|
|
0:12 direct index ( temp float)
|
|
0:? 'OutputStream_cull0' ( out 1-element array of float CullDistance)
|
|
0:12 Constant:
|
|
0:12 0 (const int)
|
|
0:12 cull0: direct index for structure ( temp float)
|
|
0:12 'flattenTemp' ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Constant:
|
|
0:12 1 (const int)
|
|
0:12 move second child to first child ( temp uint)
|
|
0:? 'OutputStream_vpai' ( out uint ViewportIndex)
|
|
0:12 vpai: direct index for structure ( temp uint)
|
|
0:12 'flattenTemp' ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Constant:
|
|
0:12 2 (const int)
|
|
0:12 move second child to first child ( temp uint)
|
|
0:? 'OutputStream_rtai' ( out uint Layer)
|
|
0:12 rtai: direct index for structure ( temp uint)
|
|
0:12 'flattenTemp' ( temp structure{ temp float clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Constant:
|
|
0:12 3 (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 clip0, temp float cull0, temp uint vpai, temp uint rtai, temp int ii})
|
|
0:12 Constant:
|
|
0:12 4 (const int)
|
|
0:? Linker Objects
|
|
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
|
|
// Generated by (magic number): 80001
|
|
// Id's are bound by 71
|
|
|
|
Capability Geometry
|
|
Capability ClipDistance
|
|
Capability CullDistance
|
|
Capability MultiViewport
|
|
1: ExtInstImport "GLSL.std.450"
|
|
MemoryModel Logical GLSL450
|
|
EntryPoint Geometry 4 "main" 25 37 44 50 55 61 70
|
|
ExecutionMode 4 Triangles
|
|
ExecutionMode 4 Invocations 1
|
|
ExecutionMode 4 OutputLineStrip
|
|
ExecutionMode 4 OutputVertices 4
|
|
Source HLSL 500
|
|
Name 4 "main"
|
|
Name 12 "S"
|
|
MemberName 12(S) 0 "clip0"
|
|
MemberName 12(S) 1 "cull0"
|
|
MemberName 12(S) 2 "vpai"
|
|
MemberName 12(S) 3 "rtai"
|
|
MemberName 12(S) 4 "ii"
|
|
Name 17 "@main(u1[3];struct-S-f1-f1-u1-u1-i11;"
|
|
Name 15 "VertexID"
|
|
Name 16 "OutputStream"
|
|
Name 19 "s"
|
|
Name 23 "VertexID"
|
|
Name 25 "VertexID"
|
|
Name 27 "flattenTemp"
|
|
Name 28 "OutputStream"
|
|
Name 29 "param"
|
|
Name 31 "param"
|
|
Name 37 "OutputStream_clip0"
|
|
Name 44 "OutputStream_cull0"
|
|
Name 50 "OutputStream_vpai"
|
|
Name 55 "OutputStream_rtai"
|
|
Name 59 "S"
|
|
MemberName 59(S) 0 "ii"
|
|
Name 61 "@entryPointOutput"
|
|
Name 68 "S"
|
|
MemberName 68(S) 0 "ii"
|
|
Name 70 "OutputStream"
|
|
Decorate 25(VertexID) Location 0
|
|
Decorate 37(OutputStream_clip0) BuiltIn ClipDistance
|
|
Decorate 44(OutputStream_cull0) BuiltIn CullDistance
|
|
Decorate 50(OutputStream_vpai) BuiltIn ViewportIndex
|
|
Decorate 55(OutputStream_rtai) BuiltIn Layer
|
|
Decorate 61(@entryPointOutput) Location 0
|
|
Decorate 70(OutputStream) Location 1
|
|
2: TypeVoid
|
|
3: TypeFunction 2
|
|
6: TypeInt 32 0
|
|
7: 6(int) Constant 3
|
|
8: TypeArray 6(int) 7
|
|
9: TypePointer Function 8
|
|
10: TypeFloat 32
|
|
11: TypeInt 32 1
|
|
12(S): TypeStruct 10(float) 10(float) 6(int) 6(int) 11(int)
|
|
13: TypePointer Function 12(S)
|
|
14: TypeFunction 12(S) 9(ptr) 13(ptr)
|
|
24: TypePointer Input 8
|
|
25(VertexID): 24(ptr) Variable Input
|
|
34: 6(int) Constant 1
|
|
35: TypeArray 10(float) 34
|
|
36: TypePointer Output 35
|
|
37(OutputStream_clip0): 36(ptr) Variable Output
|
|
38: 11(int) Constant 0
|
|
39: TypePointer Function 10(float)
|
|
42: TypePointer Output 10(float)
|
|
44(OutputStream_cull0): 36(ptr) Variable Output
|
|
45: 11(int) Constant 1
|
|
49: TypePointer Output 6(int)
|
|
50(OutputStream_vpai): 49(ptr) Variable Output
|
|
51: 11(int) Constant 2
|
|
52: TypePointer Function 6(int)
|
|
55(OutputStream_rtai): 49(ptr) Variable Output
|
|
56: 11(int) Constant 3
|
|
59(S): TypeStruct 11(int)
|
|
60: TypePointer Output 59(S)
|
|
61(@entryPointOutput): 60(ptr) Variable Output
|
|
62: 11(int) Constant 4
|
|
63: TypePointer Function 11(int)
|
|
66: TypePointer Output 11(int)
|
|
68(S): TypeStruct 11(int)
|
|
69: TypePointer Output 68(S)
|
|
70(OutputStream): 69(ptr) Variable Output
|
|
4(main): 2 Function None 3
|
|
5: Label
|
|
23(VertexID): 9(ptr) Variable Function
|
|
27(flattenTemp): 13(ptr) Variable Function
|
|
28(OutputStream): 13(ptr) Variable Function
|
|
29(param): 9(ptr) Variable Function
|
|
31(param): 13(ptr) Variable Function
|
|
26: 8 Load 25(VertexID)
|
|
Store 23(VertexID) 26
|
|
30: 8 Load 23(VertexID)
|
|
Store 29(param) 30
|
|
32: 12(S) FunctionCall 17(@main(u1[3];struct-S-f1-f1-u1-u1-i11;) 29(param) 31(param)
|
|
33: 12(S) Load 31(param)
|
|
Store 28(OutputStream) 33
|
|
Store 27(flattenTemp) 32
|
|
40: 39(ptr) AccessChain 27(flattenTemp) 38
|
|
41: 10(float) Load 40
|
|
43: 42(ptr) AccessChain 37(OutputStream_clip0) 38
|
|
Store 43 41
|
|
46: 39(ptr) AccessChain 27(flattenTemp) 45
|
|
47: 10(float) Load 46
|
|
48: 42(ptr) AccessChain 44(OutputStream_cull0) 38
|
|
Store 48 47
|
|
53: 52(ptr) AccessChain 27(flattenTemp) 51
|
|
54: 6(int) Load 53
|
|
Store 50(OutputStream_vpai) 54
|
|
57: 52(ptr) AccessChain 27(flattenTemp) 56
|
|
58: 6(int) Load 57
|
|
Store 55(OutputStream_rtai) 58
|
|
64: 63(ptr) AccessChain 27(flattenTemp) 62
|
|
65: 11(int) Load 64
|
|
67: 66(ptr) AccessChain 61(@entryPointOutput) 38
|
|
Store 67 65
|
|
Return
|
|
FunctionEnd
|
|
17(@main(u1[3];struct-S-f1-f1-u1-u1-i11;): 12(S) Function None 14
|
|
15(VertexID): 9(ptr) FunctionParameter
|
|
16(OutputStream): 13(ptr) FunctionParameter
|
|
18: Label
|
|
19(s): 13(ptr) Variable Function
|
|
20: 12(S) Load 19(s)
|
|
ReturnValue 20
|
|
FunctionEnd
|