WIP: HLSL: Treat HLSL rows as GLSL columns.
WIP: HLSL: EOpGenMul arg reversal
This commit is contained in:
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
|
|
@ -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…
Add table
Add a link
Reference in a new issue