mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-08 11:30:06 +00:00
WIP: HLSL: Treat HLSL rows as GLSL columns.
WIP: HLSL: EOpGenMul arg reversal
This commit is contained in:
parent
a21187a7f9
commit
297ae211f1
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
369
Test/baseResults/hlsl.matrixindex.frag.out
Normal file
369
Test/baseResults/hlsl.matrixindex.frag.out
Normal 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
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
};
|
||||
|
49
Test/hlsl.matrixindex.frag
Normal file
49
Test/hlsl.matrixindex.frag
Normal 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;
|
||||
}
|
@ -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"},
|
||||
|
@ -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);
|
||||
|
@ -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()) {
|
||||
|
@ -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 },
|
||||
|
Loading…
Reference in New Issue
Block a user