WIP: HLSL: Treat HLSL rows as GLSL columns.

WIP: HLSL: EOpGenMul arg reversal
This commit is contained in:
steve-lunarg 2016-08-24 14:36:13 -06:00
parent a21187a7f9
commit 297ae211f1
12 changed files with 3525 additions and 3027 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -17,9 +17,9 @@ gl_FragCoord origin is upper left
0:? Linker Objects
0:? 'f1' (global 1-component vector of float)
0:? 'fmat11' (global 1X1 matrix of float)
0:? 'fmat41' (global 1X4 matrix of float)
0:? 'fmat12' (global 2X1 matrix of float)
0:? 'dmat23' (global 3X2 matrix of double)
0:? 'fmat41' (global 4X1 matrix of float)
0:? 'fmat12' (global 1X2 matrix of float)
0:? 'dmat23' (global 2X3 matrix of double)
0:? 'int44' (global 4X4 matrix of int)
@ -44,9 +44,9 @@ gl_FragCoord origin is upper left
0:? Linker Objects
0:? 'f1' (global 1-component vector of float)
0:? 'fmat11' (global 1X1 matrix of float)
0:? 'fmat41' (global 1X4 matrix of float)
0:? 'fmat12' (global 2X1 matrix of float)
0:? 'dmat23' (global 3X2 matrix of double)
0:? 'fmat41' (global 4X1 matrix of float)
0:? 'fmat12' (global 1X2 matrix of float)
0:? 'dmat23' (global 2X3 matrix of double)
0:? 'int44' (global 4X4 matrix of int)
// Module Version 10000
@ -65,7 +65,7 @@ gl_FragCoord origin is upper left
Name 10 "inScalar"
Name 14 "f1"
Name 22 "fmat11"
Name 26 "fmat41"
Name 25 "fmat41"
Name 29 "fmat12"
Name 34 "dmat23"
Name 39 "int44"
@ -81,16 +81,16 @@ gl_FragCoord origin is upper left
20: TypeMatrix 19(fvec) 1
21: TypePointer Private 20
22(fmat11): 21(ptr) Variable Private
23: TypeVector 6(float) 4
24: TypeMatrix 23(fvec4) 1
25: TypePointer Private 24
26(fmat41): 25(ptr) Variable Private
27: TypeMatrix 19(fvec) 2
23: TypeMatrix 19(fvec) 4
24: TypePointer Private 23
25(fmat41): 24(ptr) Variable Private
26: TypeVector 6(float) 2
27: TypeMatrix 26(fvec2) 1
28: TypePointer Private 27
29(fmat12): 28(ptr) Variable Private
30: TypeFloat 64
31: TypeVector 30(float) 2
32: TypeMatrix 31(fvec2) 3
31: TypeVector 30(float) 3
32: TypeMatrix 31(fvec3) 2
33: TypePointer Private 32
34(dmat23): 33(ptr) Variable Private
35: TypeInt 32 1

View File

@ -0,0 +1,369 @@
hlsl.matrixindex.frag
Shader version: 450
gl_FragCoord origin is upper left
0:? Sequence
0:10 Function Definition: main( (global structure{temp 4-component vector of float Color})
0:10 Function Parameters:
0:? Sequence
0:22 Sequence
0:22 move second child to first child (temp float)
0:22 'e1_00' (temp float)
0:22 Constant:
0:22 10.000000
0:23 Sequence
0:23 move second child to first child (temp float)
0:23 'e1_01' (temp float)
0:23 Constant:
0:23 11.000000
0:24 Sequence
0:24 move second child to first child (temp float)
0:24 'e1_10' (temp float)
0:24 Constant:
0:24 12.000000
0:25 Sequence
0:25 move second child to first child (temp float)
0:25 'e1_11' (temp float)
0:25 Constant:
0:25 13.000000
0:26 Sequence
0:26 move second child to first child (temp float)
0:26 'e1_20' (temp float)
0:26 Constant:
0:26 14.000000
0:27 Sequence
0:27 move second child to first child (temp float)
0:27 'e1_21' (temp float)
0:27 Constant:
0:27 15.000000
0:29 Sequence
0:29 move second child to first child (temp float)
0:29 'e2_00' (temp float)
0:29 Constant:
0:29 20.000000
0:30 Sequence
0:30 move second child to first child (temp float)
0:30 'e2_01' (temp float)
0:30 Constant:
0:30 21.000000
0:31 Sequence
0:31 move second child to first child (temp float)
0:31 'e2_10' (temp float)
0:31 Constant:
0:31 22.000000
0:32 Sequence
0:32 move second child to first child (temp float)
0:32 'e2_11' (temp float)
0:32 Constant:
0:32 23.000000
0:33 Sequence
0:33 move second child to first child (temp float)
0:33 'e2_20' (temp float)
0:33 Constant:
0:33 24.000000
0:34 Sequence
0:34 move second child to first child (temp float)
0:34 'e2_21' (temp float)
0:34 Constant:
0:34 25.000000
0:39 Sequence
0:39 move second child to first child (temp 2-component vector of float)
0:39 'r0a' (temp 2-component vector of float)
0:39 Constant:
0:39 10.000000
0:39 11.000000
0:40 Sequence
0:40 move second child to first child (temp 2-component vector of float)
0:40 'r1a' (temp 2-component vector of float)
0:40 Constant:
0:40 12.000000
0:40 13.000000
0:41 Sequence
0:41 move second child to first child (temp 2-component vector of float)
0:41 'r2a' (temp 2-component vector of float)
0:41 Constant:
0:41 14.000000
0:41 15.000000
0:43 Sequence
0:43 move second child to first child (temp 2-component vector of float)
0:43 'r0b' (temp 2-component vector of float)
0:43 indirect index (temp 2-component vector of float)
0:43 Constant:
0:43 20.000000
0:43 21.000000
0:43 22.000000
0:43 23.000000
0:43 24.000000
0:43 25.000000
0:43 'idx' (uniform int)
0:44 Sequence
0:44 move second child to first child (temp 2-component vector of float)
0:44 'r0c' (temp 2-component vector of float)
0:44 indirect index (temp 2-component vector of float)
0:44 'um' (uniform 3X2 matrix of float)
0:44 'idx' (uniform int)
0:47 move second child to first child (temp 4-component vector of float)
0:47 Color: direct index for structure (temp 4-component vector of float)
0:47 'psout' (temp structure{temp 4-component vector of float Color})
0:47 Constant:
0:47 0 (const int)
0:47 Construct vec4 (temp 4-component vector of float)
0:47 'e2_11' (temp float)
0:48 Sequence
0:48 move second child to first child (temp structure{temp 4-component vector of float Color})
0:? '@entryPointOutput' (layout(location=0 ) out structure{temp 4-component vector of float Color})
0:48 'psout' (temp structure{temp 4-component vector of float Color})
0:48 Branch: Return
0:? Linker Objects
0:? 'idx' (uniform int)
0:? 'um' (uniform 3X2 matrix of float)
Linked fragment stage:
Shader version: 450
gl_FragCoord origin is upper left
0:? Sequence
0:10 Function Definition: main( (global structure{temp 4-component vector of float Color})
0:10 Function Parameters:
0:? Sequence
0:22 Sequence
0:22 move second child to first child (temp float)
0:22 'e1_00' (temp float)
0:22 Constant:
0:22 10.000000
0:23 Sequence
0:23 move second child to first child (temp float)
0:23 'e1_01' (temp float)
0:23 Constant:
0:23 11.000000
0:24 Sequence
0:24 move second child to first child (temp float)
0:24 'e1_10' (temp float)
0:24 Constant:
0:24 12.000000
0:25 Sequence
0:25 move second child to first child (temp float)
0:25 'e1_11' (temp float)
0:25 Constant:
0:25 13.000000
0:26 Sequence
0:26 move second child to first child (temp float)
0:26 'e1_20' (temp float)
0:26 Constant:
0:26 14.000000
0:27 Sequence
0:27 move second child to first child (temp float)
0:27 'e1_21' (temp float)
0:27 Constant:
0:27 15.000000
0:29 Sequence
0:29 move second child to first child (temp float)
0:29 'e2_00' (temp float)
0:29 Constant:
0:29 20.000000
0:30 Sequence
0:30 move second child to first child (temp float)
0:30 'e2_01' (temp float)
0:30 Constant:
0:30 21.000000
0:31 Sequence
0:31 move second child to first child (temp float)
0:31 'e2_10' (temp float)
0:31 Constant:
0:31 22.000000
0:32 Sequence
0:32 move second child to first child (temp float)
0:32 'e2_11' (temp float)
0:32 Constant:
0:32 23.000000
0:33 Sequence
0:33 move second child to first child (temp float)
0:33 'e2_20' (temp float)
0:33 Constant:
0:33 24.000000
0:34 Sequence
0:34 move second child to first child (temp float)
0:34 'e2_21' (temp float)
0:34 Constant:
0:34 25.000000
0:39 Sequence
0:39 move second child to first child (temp 2-component vector of float)
0:39 'r0a' (temp 2-component vector of float)
0:39 Constant:
0:39 10.000000
0:39 11.000000
0:40 Sequence
0:40 move second child to first child (temp 2-component vector of float)
0:40 'r1a' (temp 2-component vector of float)
0:40 Constant:
0:40 12.000000
0:40 13.000000
0:41 Sequence
0:41 move second child to first child (temp 2-component vector of float)
0:41 'r2a' (temp 2-component vector of float)
0:41 Constant:
0:41 14.000000
0:41 15.000000
0:43 Sequence
0:43 move second child to first child (temp 2-component vector of float)
0:43 'r0b' (temp 2-component vector of float)
0:43 indirect index (temp 2-component vector of float)
0:43 Constant:
0:43 20.000000
0:43 21.000000
0:43 22.000000
0:43 23.000000
0:43 24.000000
0:43 25.000000
0:43 'idx' (uniform int)
0:44 Sequence
0:44 move second child to first child (temp 2-component vector of float)
0:44 'r0c' (temp 2-component vector of float)
0:44 indirect index (temp 2-component vector of float)
0:44 'um' (uniform 3X2 matrix of float)
0:44 'idx' (uniform int)
0:47 move second child to first child (temp 4-component vector of float)
0:47 Color: direct index for structure (temp 4-component vector of float)
0:47 'psout' (temp structure{temp 4-component vector of float Color})
0:47 Constant:
0:47 0 (const int)
0:47 Construct vec4 (temp 4-component vector of float)
0:47 'e2_11' (temp float)
0:48 Sequence
0:48 move second child to first child (temp structure{temp 4-component vector of float Color})
0:? '@entryPointOutput' (layout(location=0 ) out structure{temp 4-component vector of float Color})
0:48 'psout' (temp structure{temp 4-component vector of float Color})
0:48 Branch: Return
0:? Linker Objects
0:? 'idx' (uniform int)
0:? 'um' (uniform 3X2 matrix of float)
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 74
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 71
ExecutionMode 4 OriginUpperLeft
Name 4 "main"
Name 8 "e1_00"
Name 10 "e1_01"
Name 12 "e1_10"
Name 14 "e1_11"
Name 16 "e1_20"
Name 18 "e1_21"
Name 20 "e2_00"
Name 22 "e2_01"
Name 24 "e2_10"
Name 26 "e2_11"
Name 28 "e2_20"
Name 30 "e2_21"
Name 34 "r0a"
Name 36 "r1a"
Name 38 "r2a"
Name 40 "r0b"
Name 48 "idx"
Name 51 "indexable"
Name 54 "r0c"
Name 56 "um"
Name 62 "PS_OUTPUT"
MemberName 62(PS_OUTPUT) 0 "Color"
Name 64 "psout"
Name 71 "@entryPointOutput"
Decorate 71(@entryPointOutput) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
7: TypePointer Function 6(float)
9: 6(float) Constant 1092616192
11: 6(float) Constant 1093664768
13: 6(float) Constant 1094713344
15: 6(float) Constant 1095761920
17: 6(float) Constant 1096810496
19: 6(float) Constant 1097859072
21: 6(float) Constant 1101004800
23: 6(float) Constant 1101529088
25: 6(float) Constant 1102053376
27: 6(float) Constant 1102577664
29: 6(float) Constant 1103101952
31: 6(float) Constant 1103626240
32: TypeVector 6(float) 2
33: TypePointer Function 32(fvec2)
35: 32(fvec2) ConstantComposite 9 11
37: 32(fvec2) ConstantComposite 13 15
39: 32(fvec2) ConstantComposite 17 19
41: TypeMatrix 32(fvec2) 3
42: 32(fvec2) ConstantComposite 21 23
43: 32(fvec2) ConstantComposite 25 27
44: 32(fvec2) ConstantComposite 29 31
45: 41 ConstantComposite 42 43 44
46: TypeInt 32 1
47: TypePointer UniformConstant 46(int)
48(idx): 47(ptr) Variable UniformConstant
50: TypePointer Function 41
55: TypePointer UniformConstant 41
56(um): 55(ptr) Variable UniformConstant
58: TypePointer UniformConstant 32(fvec2)
61: TypeVector 6(float) 4
62(PS_OUTPUT): TypeStruct 61(fvec4)
63: TypePointer Function 62(PS_OUTPUT)
65: 46(int) Constant 0
68: TypePointer Function 61(fvec4)
70: TypePointer Output 62(PS_OUTPUT)
71(@entryPointOutput): 70(ptr) Variable Output
4(main): 2 Function None 3
5: Label
8(e1_00): 7(ptr) Variable Function
10(e1_01): 7(ptr) Variable Function
12(e1_10): 7(ptr) Variable Function
14(e1_11): 7(ptr) Variable Function
16(e1_20): 7(ptr) Variable Function
18(e1_21): 7(ptr) Variable Function
20(e2_00): 7(ptr) Variable Function
22(e2_01): 7(ptr) Variable Function
24(e2_10): 7(ptr) Variable Function
26(e2_11): 7(ptr) Variable Function
28(e2_20): 7(ptr) Variable Function
30(e2_21): 7(ptr) Variable Function
34(r0a): 33(ptr) Variable Function
36(r1a): 33(ptr) Variable Function
38(r2a): 33(ptr) Variable Function
40(r0b): 33(ptr) Variable Function
51(indexable): 50(ptr) Variable Function
54(r0c): 33(ptr) Variable Function
64(psout): 63(ptr) Variable Function
Store 8(e1_00) 9
Store 10(e1_01) 11
Store 12(e1_10) 13
Store 14(e1_11) 15
Store 16(e1_20) 17
Store 18(e1_21) 19
Store 20(e2_00) 21
Store 22(e2_01) 23
Store 24(e2_10) 25
Store 26(e2_11) 27
Store 28(e2_20) 29
Store 30(e2_21) 31
Store 34(r0a) 35
Store 36(r1a) 37
Store 38(r2a) 39
49: 46(int) Load 48(idx)
Store 51(indexable) 45
52: 33(ptr) AccessChain 51(indexable) 49
53: 32(fvec2) Load 52
Store 40(r0b) 53
57: 46(int) Load 48(idx)
59: 58(ptr) AccessChain 56(um) 57
60: 32(fvec2) Load 59
Store 54(r0c) 60
66: 6(float) Load 26(e2_11)
67: 61(fvec4) CompositeConstruct 66 66 66 66
69: 68(ptr) AccessChain 64(psout) 65
Store 69 67
72:62(PS_OUTPUT) Load 64(psout)
Store 71(@entryPointOutput) 72
Return
FunctionEnd

View File

@ -192,8 +192,8 @@ gl_FragCoord origin is upper left
0:? 14.000000
0:? 15.000000
0:35 Sequence
0:35 move second child to first child (temp 3X2 matrix of float)
0:35 'r61' (temp 3X2 matrix of float)
0:35 move second child to first child (temp 2X3 matrix of float)
0:35 'r61' (temp 2X3 matrix of float)
0:? Constant:
0:? 1.000000
0:? 2.000000
@ -202,8 +202,8 @@ gl_FragCoord origin is upper left
0:? 5.000000
0:? 6.000000
0:36 Sequence
0:36 move second child to first child (temp 2X3 matrix of float)
0:36 'r62' (temp 2X3 matrix of float)
0:36 move second child to first child (temp 3X2 matrix of float)
0:36 'r62' (temp 3X2 matrix of float)
0:? Constant:
0:? 1.000000
0:? 2.000000
@ -212,8 +212,8 @@ gl_FragCoord origin is upper left
0:? 5.000000
0:? 6.000000
0:39 Sequence
0:39 move second child to first child (temp 2X4 matrix of float)
0:39 'r65' (temp 2X4 matrix of float)
0:39 move second child to first child (temp 4X2 matrix of float)
0:39 'r65' (temp 4X2 matrix of float)
0:? Constant:
0:? 1.000000
0:? 2.000000
@ -224,8 +224,8 @@ gl_FragCoord origin is upper left
0:? 7.000000
0:? 8.000000
0:40 Sequence
0:40 move second child to first child (temp 3X4 matrix of float)
0:40 'r66' (temp 3X4 matrix of float)
0:40 move second child to first child (temp 4X3 matrix of float)
0:40 'r66' (temp 4X3 matrix of float)
0:? Constant:
0:? 1.000000
0:? 2.000000
@ -444,8 +444,8 @@ gl_FragCoord origin is upper left
0:? 14.000000
0:? 15.000000
0:35 Sequence
0:35 move second child to first child (temp 3X2 matrix of float)
0:35 'r61' (temp 3X2 matrix of float)
0:35 move second child to first child (temp 2X3 matrix of float)
0:35 'r61' (temp 2X3 matrix of float)
0:? Constant:
0:? 1.000000
0:? 2.000000
@ -454,8 +454,8 @@ gl_FragCoord origin is upper left
0:? 5.000000
0:? 6.000000
0:36 Sequence
0:36 move second child to first child (temp 2X3 matrix of float)
0:36 'r62' (temp 2X3 matrix of float)
0:36 move second child to first child (temp 3X2 matrix of float)
0:36 'r62' (temp 3X2 matrix of float)
0:? Constant:
0:? 1.000000
0:? 2.000000
@ -464,8 +464,8 @@ gl_FragCoord origin is upper left
0:? 5.000000
0:? 6.000000
0:39 Sequence
0:39 move second child to first child (temp 2X4 matrix of float)
0:39 'r65' (temp 2X4 matrix of float)
0:39 move second child to first child (temp 4X2 matrix of float)
0:39 'r65' (temp 4X2 matrix of float)
0:? Constant:
0:? 1.000000
0:? 2.000000
@ -476,8 +476,8 @@ gl_FragCoord origin is upper left
0:? 7.000000
0:? 8.000000
0:40 Sequence
0:40 move second child to first child (temp 3X4 matrix of float)
0:40 'r66' (temp 3X4 matrix of float)
0:40 move second child to first child (temp 4X3 matrix of float)
0:40 'r66' (temp 4X3 matrix of float)
0:? Constant:
0:? 1.000000
0:? 2.000000
@ -501,13 +501,13 @@ gl_FragCoord origin is upper left
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 147
// Id's are bound by 148
Capability Shader
Capability Float64
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "PixelShaderFunction" 145
EntryPoint Fragment 4 "PixelShaderFunction" 146
ExecutionMode 4 OriginUpperLeft
Name 4 "PixelShaderFunction"
Name 9 "r00"
@ -535,11 +535,11 @@ gl_FragCoord origin is upper left
Name 105 "r50"
Name 122 "r51"
Name 125 "r61"
Name 131 "r62"
Name 130 "r62"
Name 136 "r65"
Name 141 "r66"
Name 145 "@entryPointOutput"
Decorate 145(@entryPointOutput) Location 0
Name 146 "@entryPointOutput"
Decorate 146(@entryPointOutput) Location 0
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
@ -635,25 +635,26 @@ gl_FragCoord origin is upper left
119: 6(float) Constant 1097859072
120: 7(fvec4) ConstantComposite 116 117 118 119
121: 103 ConstantComposite 107 110 115 120
123: TypeMatrix 46(fvec2) 3
123: TypeMatrix 69(fvec3) 2
124: TypePointer Function 123
126: 46(fvec2) ConstantComposite 12 13
127: 46(fvec2) ConstantComposite 16 108
128: 123 ConstantComposite 49 126 127
129: TypeMatrix 69(fvec3) 2
130: TypePointer Function 129
132: 69(fvec3) ConstantComposite 13 16 108
133: 129 ConstantComposite 72 132
134: TypeMatrix 7(fvec4) 2
126: 69(fvec3) ConstantComposite 13 16 108
127: 123 ConstantComposite 72 126
128: TypeMatrix 46(fvec2) 3
129: TypePointer Function 128
131: 46(fvec2) ConstantComposite 12 13
132: 46(fvec2) ConstantComposite 16 108
133: 128 ConstantComposite 49 131 132
134: TypeMatrix 46(fvec2) 4
135: TypePointer Function 134
137: 7(fvec4) ConstantComposite 16 108 109 111
138: 134 ConstantComposite 14 137
139: TypeMatrix 7(fvec4) 3
137: 46(fvec2) ConstantComposite 109 111
138: 134 ConstantComposite 49 131 132 137
139: TypeMatrix 69(fvec3) 4
140: TypePointer Function 139
142: 7(fvec4) ConstantComposite 112 113 114 116
143: 139 ConstantComposite 14 137 142
144: TypePointer Output 6(float)
145(@entryPointOutput): 144(ptr) Variable Output
142: 69(fvec3) ConstantComposite 109 111 112
143: 69(fvec3) ConstantComposite 113 114 116
144: 139 ConstantComposite 72 126 142 143
145: TypePointer Output 6(float)
146(@entryPointOutput): 145(ptr) Variable Output
4(PixelShaderFunction): 2 Function None 3
5: Label
9(r00): 8(ptr) Variable Function
@ -681,7 +682,7 @@ gl_FragCoord origin is upper left
105(r50): 104(ptr) Variable Function
122(r51): 104(ptr) Variable Function
125(r61): 124(ptr) Variable Function
131(r62): 130(ptr) Variable Function
130(r62): 129(ptr) Variable Function
136(r65): 135(ptr) Variable Function
141(r66): 140(ptr) Variable Function
Store 9(r00) 14
@ -708,10 +709,10 @@ gl_FragCoord origin is upper left
Store 100(r44) 102
Store 105(r50) 121
Store 122(r51) 121
Store 125(r61) 128
Store 131(r62) 133
Store 125(r61) 127
Store 130(r62) 133
Store 136(r65) 138
Store 141(r66) 143
Store 145(@entryPointOutput) 106
Store 141(r66) 144
Store 146(@entryPointOutput) 106
Return
FunctionEnd

View File

@ -5,7 +5,7 @@ Linked fragment stage:
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 144
// Id's are bound by 145
Capability Shader
Capability Float64
@ -39,7 +39,7 @@ Linked fragment stage:
Name 105 "r50"
Name 122 "r51"
Name 125 "r61"
Name 131 "r62"
Name 130 "r62"
Name 136 "r65"
Name 141 "r66"
2: TypeVoid
@ -137,23 +137,24 @@ Linked fragment stage:
119: 6(float) Constant 1097859072
120: 7(fvec4) ConstantComposite 116 117 118 119
121: 103 ConstantComposite 107 110 115 120
123: TypeMatrix 46(fvec2) 3
123: TypeMatrix 69(fvec3) 2
124: TypePointer Function 123
126: 46(fvec2) ConstantComposite 12 13
127: 46(fvec2) ConstantComposite 16 108
128: 123 ConstantComposite 49 126 127
129: TypeMatrix 69(fvec3) 2
130: TypePointer Function 129
132: 69(fvec3) ConstantComposite 13 16 108
133: 129 ConstantComposite 72 132
134: TypeMatrix 7(fvec4) 2
126: 69(fvec3) ConstantComposite 13 16 108
127: 123 ConstantComposite 72 126
128: TypeMatrix 46(fvec2) 3
129: TypePointer Function 128
131: 46(fvec2) ConstantComposite 12 13
132: 46(fvec2) ConstantComposite 16 108
133: 128 ConstantComposite 49 131 132
134: TypeMatrix 46(fvec2) 4
135: TypePointer Function 134
137: 7(fvec4) ConstantComposite 16 108 109 111
138: 134 ConstantComposite 14 137
139: TypeMatrix 7(fvec4) 3
137: 46(fvec2) ConstantComposite 109 111
138: 134 ConstantComposite 49 131 132 137
139: TypeMatrix 69(fvec3) 4
140: TypePointer Function 139
142: 7(fvec4) ConstantComposite 112 113 114 116
143: 139 ConstantComposite 14 137 142
142: 69(fvec3) ConstantComposite 109 111 112
143: 69(fvec3) ConstantComposite 113 114 116
144: 139 ConstantComposite 72 126 142 143
4(main): 2 Function None 3
5: Label
9(r00): 8(ptr) Variable Function
@ -181,7 +182,7 @@ Linked fragment stage:
105(r50): 104(ptr) Variable Function
122(r51): 104(ptr) Variable Function
125(r61): 124(ptr) Variable Function
131(r62): 130(ptr) Variable Function
130(r62): 129(ptr) Variable Function
136(r65): 135(ptr) Variable Function
141(r66): 140(ptr) Variable Function
Store 9(r00) 14
@ -208,9 +209,9 @@ Linked fragment stage:
Store 100(r44) 102
Store 105(r50) 121
Store 122(r51) 121
Store 125(r61) 128
Store 131(r62) 133
Store 125(r61) 127
Store 130(r62) 133
Store 136(r65) 138
Store 141(r66) 143
Store 141(r66) 144
ReturnValue 106
FunctionEnd

View File

@ -482,3 +482,12 @@ void TestGenMulNxM(float inF0, float inF1,
float2x4 r15 = mul(inFM2x3, inFM3x4);
float3x4 r16 = mul(inFM3x2, inFM2x4);
}
struct PS_OUTPUT { float4 color : SV_Target0; };
PS_OUTPUT main()
{
PS_OUTPUT ps_output;
ps_output.color = 1.0;
return ps_output;
};

View File

@ -0,0 +1,49 @@
uniform int idx;
uniform float3x2 um;
struct PS_OUTPUT
{
float4 Color : SV_Target0;
};
PS_OUTPUT main()
{
// matrices of 3 rows, 2 columns (regardless of row vs col major storage)
const float3x2 m1 = { { 10, 11 }, // row-wise initialization
{ 12, 13 },
{ 14, 15 } };
const float3x2 m2 = { 20, 21, 22, 23, 24, 25 }; // component-wise matrix initialization is allowed
const float3x2 m3 = { 30, 31, 33, 33, 34, 35 }; // component-wise matrix initialization is allowed
// These can be observed in the AST post-const folding to ensure we obtain the right value,
// as given in comments to the right of each line. Note that the first indirection into a
// matrix returns a row vector.
float e1_00 = m1[0][0]; // 10
float e1_01 = m1[0][1]; // 11
float e1_10 = m1[1][0]; // 12
float e1_11 = m1[1][1]; // 13
float e1_20 = m1[2][0]; // 14
float e1_21 = m1[2][1]; // 15
float e2_00 = m2[0][0]; // 20
float e2_01 = m2[0][1]; // 21
float e2_10 = m2[1][0]; // 22
float e2_11 = m2[1][1]; // 23
float e2_20 = m2[2][0]; // 24
float e2_21 = m2[2][1]; // 25
// float e3a_00 = m3._m00; // TODO... also as an lvalue for a non-const matrix
// float e3b_00 = m3._11; // TODO... also as an lvalue for a non-const matrix
float2 r0a = m1[0]; // row0: 10,11: types must match: constant index into constant
float2 r1a = m1[1]; // row1: 12,13: ...
float2 r2a = m1[2]; // row2: 14,15: ...
float2 r0b = m2[idx]; // types should match: variable index into constant
float2 r0c = um[idx]; // types should match: variable index into variable
PS_OUTPUT psout;
psout.Color = e2_11; // 23
return psout;
}

View File

@ -110,7 +110,7 @@ INSTANTIATE_TEST_CASE_P(
{"hlsl.intrinsics.evalfns.frag", "main"},
{"hlsl.intrinsics.double.frag", "PixelShaderFunction"},
{"hlsl.intrinsics.f1632.frag", "PixelShaderFunction"},
{"hlsl.intrinsics.frag", "PixelShaderFunction"},
{"hlsl.intrinsics.frag", "main"},
{"hlsl.intrinsics.lit.frag", "PixelShaderFunction"},
{"hlsl.intrinsics.negative.comp", "ComputeShaderFunction"},
{"hlsl.intrinsics.negative.frag", "PixelShaderFunction"},
@ -124,6 +124,7 @@ INSTANTIATE_TEST_CASE_P(
{"hlsl.load.offset.dx10.frag", "main"},
{"hlsl.load.offsetarray.dx10.frag", "main"},
{"hlsl.multiEntry.vert", "RealEntrypoint"},
{"hlsl.matrixindex.frag", "main"},
{"hlsl.numericsuffixes.frag", "main"},
{"hlsl.overload.frag", "PixelShaderFunction"},
{"hlsl.pp.line.frag", "main"},

View File

@ -711,8 +711,8 @@ bool HlslGrammar::acceptMatrixTemplateType(TType& type)
return false;
new(&type) TType(basicType, EvqTemporary, 0,
cols->getAsConstantUnion()->getConstArray()[0].getIConst(),
rows->getAsConstantUnion()->getConstArray()[0].getIConst());
rows->getAsConstantUnion()->getConstArray()[0].getIConst(),
cols->getAsConstantUnion()->getConstArray()[0].getIConst());
if (!acceptTokenClass(EHTokRightAngle)) {
expected("right angle bracket");
@ -1031,46 +1031,46 @@ bool HlslGrammar::acceptType(TType& type)
new(&type) TType(EbtInt, EvqTemporary, 0, 1, 1);
break;
case EHTokInt1x2:
new(&type) TType(EbtInt, EvqTemporary, 0, 2, 1);
new(&type) TType(EbtInt, EvqTemporary, 0, 1, 2);
break;
case EHTokInt1x3:
new(&type) TType(EbtInt, EvqTemporary, 0, 3, 1);
new(&type) TType(EbtInt, EvqTemporary, 0, 1, 3);
break;
case EHTokInt1x4:
new(&type) TType(EbtInt, EvqTemporary, 0, 4, 1);
new(&type) TType(EbtInt, EvqTemporary, 0, 1, 4);
break;
case EHTokInt2x1:
new(&type) TType(EbtInt, EvqTemporary, 0, 1, 2);
new(&type) TType(EbtInt, EvqTemporary, 0, 2, 1);
break;
case EHTokInt2x2:
new(&type) TType(EbtInt, EvqTemporary, 0, 2, 2);
break;
case EHTokInt2x3:
new(&type) TType(EbtInt, EvqTemporary, 0, 3, 2);
new(&type) TType(EbtInt, EvqTemporary, 0, 2, 3);
break;
case EHTokInt2x4:
new(&type) TType(EbtInt, EvqTemporary, 0, 4, 2);
new(&type) TType(EbtInt, EvqTemporary, 0, 2, 4);
break;
case EHTokInt3x1:
new(&type) TType(EbtInt, EvqTemporary, 0, 1, 3);
new(&type) TType(EbtInt, EvqTemporary, 0, 3, 1);
break;
case EHTokInt3x2:
new(&type) TType(EbtInt, EvqTemporary, 0, 2, 3);
new(&type) TType(EbtInt, EvqTemporary, 0, 3, 2);
break;
case EHTokInt3x3:
new(&type) TType(EbtInt, EvqTemporary, 0, 3, 3);
break;
case EHTokInt3x4:
new(&type) TType(EbtInt, EvqTemporary, 0, 4, 3);
new(&type) TType(EbtInt, EvqTemporary, 0, 3, 4);
break;
case EHTokInt4x1:
new(&type) TType(EbtInt, EvqTemporary, 0, 1, 4);
new(&type) TType(EbtInt, EvqTemporary, 0, 4, 1);
break;
case EHTokInt4x2:
new(&type) TType(EbtInt, EvqTemporary, 0, 2, 4);
new(&type) TType(EbtInt, EvqTemporary, 0, 4, 2);
break;
case EHTokInt4x3:
new(&type) TType(EbtInt, EvqTemporary, 0, 3, 4);
new(&type) TType(EbtInt, EvqTemporary, 0, 4, 3);
break;
case EHTokInt4x4:
new(&type) TType(EbtInt, EvqTemporary, 0, 4, 4);
@ -1080,46 +1080,46 @@ bool HlslGrammar::acceptType(TType& type)
new(&type) TType(EbtUint, EvqTemporary, 0, 1, 1);
break;
case EHTokUint1x2:
new(&type) TType(EbtUint, EvqTemporary, 0, 2, 1);
new(&type) TType(EbtUint, EvqTemporary, 0, 1, 2);
break;
case EHTokUint1x3:
new(&type) TType(EbtUint, EvqTemporary, 0, 3, 1);
new(&type) TType(EbtUint, EvqTemporary, 0, 1, 3);
break;
case EHTokUint1x4:
new(&type) TType(EbtUint, EvqTemporary, 0, 4, 1);
new(&type) TType(EbtUint, EvqTemporary, 0, 1, 4);
break;
case EHTokUint2x1:
new(&type) TType(EbtUint, EvqTemporary, 0, 1, 2);
new(&type) TType(EbtUint, EvqTemporary, 0, 2, 1);
break;
case EHTokUint2x2:
new(&type) TType(EbtUint, EvqTemporary, 0, 2, 2);
break;
case EHTokUint2x3:
new(&type) TType(EbtUint, EvqTemporary, 0, 3, 2);
new(&type) TType(EbtUint, EvqTemporary, 0, 2, 3);
break;
case EHTokUint2x4:
new(&type) TType(EbtUint, EvqTemporary, 0, 4, 2);
new(&type) TType(EbtUint, EvqTemporary, 0, 2, 4);
break;
case EHTokUint3x1:
new(&type) TType(EbtUint, EvqTemporary, 0, 1, 3);
new(&type) TType(EbtUint, EvqTemporary, 0, 3, 1);
break;
case EHTokUint3x2:
new(&type) TType(EbtUint, EvqTemporary, 0, 2, 3);
new(&type) TType(EbtUint, EvqTemporary, 0, 3, 2);
break;
case EHTokUint3x3:
new(&type) TType(EbtUint, EvqTemporary, 0, 3, 3);
break;
case EHTokUint3x4:
new(&type) TType(EbtUint, EvqTemporary, 0, 4, 3);
new(&type) TType(EbtUint, EvqTemporary, 0, 3, 4);
break;
case EHTokUint4x1:
new(&type) TType(EbtUint, EvqTemporary, 0, 1, 4);
new(&type) TType(EbtUint, EvqTemporary, 0, 4, 1);
break;
case EHTokUint4x2:
new(&type) TType(EbtUint, EvqTemporary, 0, 2, 4);
new(&type) TType(EbtUint, EvqTemporary, 0, 4, 2);
break;
case EHTokUint4x3:
new(&type) TType(EbtUint, EvqTemporary, 0, 3, 4);
new(&type) TType(EbtUint, EvqTemporary, 0, 4, 3);
break;
case EHTokUint4x4:
new(&type) TType(EbtUint, EvqTemporary, 0, 4, 4);
@ -1129,46 +1129,46 @@ bool HlslGrammar::acceptType(TType& type)
new(&type) TType(EbtBool, EvqTemporary, 0, 1, 1);
break;
case EHTokBool1x2:
new(&type) TType(EbtBool, EvqTemporary, 0, 2, 1);
new(&type) TType(EbtBool, EvqTemporary, 0, 1, 2);
break;
case EHTokBool1x3:
new(&type) TType(EbtBool, EvqTemporary, 0, 3, 1);
new(&type) TType(EbtBool, EvqTemporary, 0, 1, 3);
break;
case EHTokBool1x4:
new(&type) TType(EbtBool, EvqTemporary, 0, 4, 1);
new(&type) TType(EbtBool, EvqTemporary, 0, 1, 4);
break;
case EHTokBool2x1:
new(&type) TType(EbtBool, EvqTemporary, 0, 1, 2);
new(&type) TType(EbtBool, EvqTemporary, 0, 2, 1);
break;
case EHTokBool2x2:
new(&type) TType(EbtBool, EvqTemporary, 0, 2, 2);
break;
case EHTokBool2x3:
new(&type) TType(EbtBool, EvqTemporary, 0, 3, 2);
new(&type) TType(EbtBool, EvqTemporary, 0, 2, 3);
break;
case EHTokBool2x4:
new(&type) TType(EbtBool, EvqTemporary, 0, 4, 2);
new(&type) TType(EbtBool, EvqTemporary, 0, 2, 4);
break;
case EHTokBool3x1:
new(&type) TType(EbtBool, EvqTemporary, 0, 1, 3);
new(&type) TType(EbtBool, EvqTemporary, 0, 3, 1);
break;
case EHTokBool3x2:
new(&type) TType(EbtBool, EvqTemporary, 0, 2, 3);
new(&type) TType(EbtBool, EvqTemporary, 0, 3, 2);
break;
case EHTokBool3x3:
new(&type) TType(EbtBool, EvqTemporary, 0, 3, 3);
break;
case EHTokBool3x4:
new(&type) TType(EbtBool, EvqTemporary, 0, 4, 3);
new(&type) TType(EbtBool, EvqTemporary, 0, 3, 4);
break;
case EHTokBool4x1:
new(&type) TType(EbtBool, EvqTemporary, 0, 1, 4);
new(&type) TType(EbtBool, EvqTemporary, 0, 4, 1);
break;
case EHTokBool4x2:
new(&type) TType(EbtBool, EvqTemporary, 0, 2, 4);
new(&type) TType(EbtBool, EvqTemporary, 0, 4, 2);
break;
case EHTokBool4x3:
new(&type) TType(EbtBool, EvqTemporary, 0, 3, 4);
new(&type) TType(EbtBool, EvqTemporary, 0, 4, 3);
break;
case EHTokBool4x4:
new(&type) TType(EbtBool, EvqTemporary, 0, 4, 4);
@ -1178,46 +1178,46 @@ bool HlslGrammar::acceptType(TType& type)
new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 1);
break;
case EHTokFloat1x2:
new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 1);
new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 2);
break;
case EHTokFloat1x3:
new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 1);
new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 3);
break;
case EHTokFloat1x4:
new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 1);
new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 4);
break;
case EHTokFloat2x1:
new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 2);
new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 1);
break;
case EHTokFloat2x2:
new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 2);
break;
case EHTokFloat2x3:
new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 2);
new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 3);
break;
case EHTokFloat2x4:
new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 2);
new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 4);
break;
case EHTokFloat3x1:
new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 3);
new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 1);
break;
case EHTokFloat3x2:
new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 3);
new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 2);
break;
case EHTokFloat3x3:
new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 3);
break;
case EHTokFloat3x4:
new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 3);
new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 4);
break;
case EHTokFloat4x1:
new(&type) TType(EbtFloat, EvqTemporary, 0, 1, 4);
new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 1);
break;
case EHTokFloat4x2:
new(&type) TType(EbtFloat, EvqTemporary, 0, 2, 4);
new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 2);
break;
case EHTokFloat4x3:
new(&type) TType(EbtFloat, EvqTemporary, 0, 3, 4);
new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 3);
break;
case EHTokFloat4x4:
new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 4);
@ -1227,46 +1227,46 @@ bool HlslGrammar::acceptType(TType& type)
new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 1);
break;
case EHTokDouble1x2:
new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 1);
new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 2);
break;
case EHTokDouble1x3:
new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 1);
new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 3);
break;
case EHTokDouble1x4:
new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 1);
new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 4);
break;
case EHTokDouble2x1:
new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 2);
new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 1);
break;
case EHTokDouble2x2:
new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 2);
break;
case EHTokDouble2x3:
new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 2);
new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 3);
break;
case EHTokDouble2x4:
new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 2);
new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 4);
break;
case EHTokDouble3x1:
new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 3);
new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 1);
break;
case EHTokDouble3x2:
new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 3);
new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 2);
break;
case EHTokDouble3x3:
new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 3);
break;
case EHTokDouble3x4:
new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 3);
new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 4);
break;
case EHTokDouble4x1:
new(&type) TType(EbtDouble, EvqTemporary, 0, 1, 4);
new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 1);
break;
case EHTokDouble4x2:
new(&type) TType(EbtDouble, EvqTemporary, 0, 2, 4);
new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 2);
break;
case EHTokDouble4x3:
new(&type) TType(EbtDouble, EvqTemporary, 0, 3, 4);
new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 3);
break;
case EHTokDouble4x4:
new(&type) TType(EbtDouble, EvqTemporary, 0, 4, 4);

View File

@ -1597,8 +1597,10 @@ void HlslParseContext::decomposeIntrinsic(const TSourceLoc& loc, TIntermTyped*&
case EOpGenMul:
{
// mul(a,b) -> MatrixTimesMatrix, MatrixTimesVector, MatrixTimesScalar, VectorTimesScalar, Dot, Mul
TIntermTyped* arg0 = argAggregate->getSequence()[0]->getAsTyped();
TIntermTyped* arg1 = argAggregate->getSequence()[1]->getAsTyped();
// Since we are treating HLSL rows like GLSL columns (the first matrix indirection),
// we must reverse the operand order here. Hence, arg0 gets sequence[1], etc.
TIntermTyped* arg0 = argAggregate->getSequence()[1]->getAsTyped();
TIntermTyped* arg1 = argAggregate->getSequence()[0]->getAsTyped();
if (arg0->isVector() && arg1->isVector()) { // vec * vec
node->getAsAggregate()->setOperator(EOpDot);
@ -4144,15 +4146,21 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
return nullptr;
}
} else if (type.isMatrix()) {
if (type.getMatrixCols() != (int)initList->getSequence().size()) {
error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString().c_str());
return nullptr;
}
TType vectorType(type, 0); // dereferenced type
for (int i = 0; i < type.getMatrixCols(); ++i) {
initList->getSequence()[i] = convertInitializerList(loc, vectorType, initList->getSequence()[i]->getAsTyped());
if (initList->getSequence()[i] == nullptr)
if (type.computeNumComponents() == (int)initList->getSequence().size()) {
// This means the matrix is initialized component-wise, rather than as
// a series of rows and columns. We can just use the list directly as
// a constructor; no further processing needed.
} else {
if (type.getMatrixCols() != (int)initList->getSequence().size()) {
error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString().c_str());
return nullptr;
}
TType vectorType(type, 0); // dereferenced type
for (int i = 0; i < type.getMatrixCols(); ++i) {
initList->getSequence()[i] = convertInitializerList(loc, vectorType, initList->getSequence()[i]->getAsTyped());
if (initList->getSequence()[i] == nullptr)
return nullptr;
}
}
} else if (type.isVector()) {
if (type.getVectorSize() != (int)initList->getSequence().size()) {

View File

@ -218,7 +218,6 @@ int FixedVecSize(const char* arg)
glslang::TString& AppendTypeName(glslang::TString& s, const char* argOrder, const char* argType, int dim0, int dim1)
{
const bool isTranspose = (argOrder[0] == '^');
const bool isMatMul = (argOrder[0] == '#');
const bool isTexture = IsTextureType(argOrder[0]);
const bool isArrayed = IsTextureArrayed(argOrder[0]);
const bool isSampler = IsSamplerType(argType[0]);
@ -229,8 +228,6 @@ glslang::TString& AppendTypeName(glslang::TString& s, const char* argOrder, cons
if (isTranspose) { // Take transpose of matrix dimensions
std::swap(dim0, dim1);
} else if (isMatMul) {
dim0 = dim1; // set vector dimension to mat col
} else if (isTexture) {
if (type == 'F') // map base type to texture of that type.
type = 'T'; // e.g, int -> itexture, uint -> utexture, etc.
@ -240,7 +237,7 @@ glslang::TString& AppendTypeName(glslang::TString& s, const char* argOrder, cons
type = 'u';
}
if (isTranspose || isMatMul)
if (isTranspose)
++argOrder;
char order = *argOrder;
@ -312,16 +309,14 @@ glslang::TString& AppendTypeName(glslang::TString& s, const char* argOrder, cons
switch (order) {
case '-': break; // no dimensions for voids
case 'S': break; // no dimensions on scalars
case 'V': s += ('0' + char(dim0)); break;
case 'V':
s += ('0' + char(dim0));
break;
case 'M':
{
if (!UseHlslTypes) // GLSL has column first for mat types
std::swap(dim0, dim1);
s += ('0' + char(dim0));
s += 'x';
s += ('0' + char(dim1));
break;
}
s += ('0' + char(dim0));
s += 'x';
s += ('0' + char(dim1));
break;
default:
break;
}
@ -427,6 +422,7 @@ void TBuiltInParseablesHlsl::createMatTimesMat()
const int retRows = xRows;
const int retCols = yCols;
// Create a mat * mat of the appropriate dimensions
AppendTypeName(s, "M", "F", retRows, retCols); // add return type
s.append(" "); // space between type and name
s.append("mul"); // intrinsic name
@ -438,6 +434,31 @@ void TBuiltInParseablesHlsl::createMatTimesMat()
s.append(");\n"); // close paren
}
// Create M*V
AppendTypeName(s, "V", "F", xRows, 1); // add return type
s.append(" "); // space between type and name
s.append("mul"); // intrinsic name
s.append("("); // open paren
AppendTypeName(s, "M", "F", xRows, xCols); // add X input
s.append(", ");
AppendTypeName(s, "V", "F", xCols, 1); // add Y input
s.append(");\n"); // close paren
// Create V*M
AppendTypeName(s, "V", "F", xCols, 1); // add return type
s.append(" "); // space between type and name
s.append("mul"); // intrinsic name
s.append("("); // open paren
AppendTypeName(s, "V", "F", xRows, 1); // add Y input
s.append(", ");
AppendTypeName(s, "M", "F", xRows, xCols); // add X input
s.append(");\n"); // close paren
}
}
}
@ -482,7 +503,6 @@ void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, c
// '>' as first letter of order creates an output parameter
// '<' as first letter of order creates an input parameter
// '^' as first letter of order takes transpose dimensions
// '#' as first letter of order sets rows=cols for mats
// '%' as first letter of order creates texture of given F/I/U type (texture, itexture, etc)
// '@' as first letter of order creates arrayed texture of given type
// '$' / '&' as first letter of order creates 2DMS / 2DMSArray textures
@ -592,9 +612,7 @@ void TBuiltInParseablesHlsl::initialize(int /*version*/, EProfile /*profile*/, c
{ "mul", "M", nullptr, "S,M", "FI,", EShLangAll },
{ "mul", "V", nullptr, "V,S", "FI,", EShLangAll },
{ "mul", "S", nullptr, "V,V", "FI,", EShLangAll },
{ "mul", "#V", nullptr, "V,M", "FI,", EShLangAll },
{ "mul", "M", nullptr, "M,S", "FI,", EShLangAll },
{ "mul", "V", nullptr, "M,#V", "FI,", EShLangAll },
// mat*mat form of mul is handled in createMatTimesMat()
{ "noise", "S", "F", "V", "F", EShLangPS },
{ "normalize", nullptr, nullptr, "V", "F", EShLangAll },