HLSL: Add template style constructors for vector & matrix types
authorLoopDawg <nospam@nowhere.net>
Fri, 24 Jun 2016 01:13:48 +0000 (19:13 -0600)
committerLoopDawg <nospam@nowhere.net>
Fri, 1 Jul 2016 19:59:36 +0000 (13:59 -0600)
Test/baseResults/hlsl.templatetypes.frag.out [new file with mode: 0644]
Test/hlsl.templatetypes.frag [new file with mode: 0644]
Test/hlsl.templatetypes.negative.frag [new file with mode: 0644]
gtests/Hlsl.FromFile.cpp
hlsl/hlslGrammar.cpp
hlsl/hlslGrammar.h

diff --git a/Test/baseResults/hlsl.templatetypes.frag.out b/Test/baseResults/hlsl.templatetypes.frag.out
new file mode 100644 (file)
index 0000000..d26c4d8
--- /dev/null
@@ -0,0 +1,651 @@
+hlsl.templatetypes.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:48  Function Definition: PixelShaderFunction( (temp float)
+0:3    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child (temp 4-component vector of float)
+0:4        'r00' (temp 4-component vector of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:5      move second child to first child (temp 4-component vector of float)
+0:5        'r01' (temp 4-component vector of float)
+0:?         Constant:
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:7      move second child to first child (temp 1-component vector of bool)
+0:7        'r12' (temp 1-component vector of bool)
+0:7        Constant:
+0:7          false (const bool)
+0:8      move second child to first child (temp 1-component vector of int)
+0:8        'r13' (temp 1-component vector of int)
+0:8        Constant:
+0:8          1 (const int)
+0:9      move second child to first child (temp 1-component vector of float)
+0:9        'r14' (temp 1-component vector of float)
+0:9        Constant:
+0:9          1.000000
+0:10      move second child to first child (temp 1-component vector of double)
+0:10        'r15' (temp 1-component vector of double)
+0:10        Constant:
+0:10          1.000000
+0:11      move second child to first child (temp 1-component vector of uint)
+0:11        'r16' (temp 1-component vector of uint)
+0:11        Constant:
+0:11          1 (const uint)
+0:13      move second child to first child (temp 2-component vector of bool)
+0:13        'r20' (temp 2-component vector of bool)
+0:?         Constant:
+0:?           false (const bool)
+0:?           true (const bool)
+0:14      move second child to first child (temp 2-component vector of int)
+0:14        'r21' (temp 2-component vector of int)
+0:?         Constant:
+0:?           1 (const int)
+0:?           2 (const int)
+0:15      move second child to first child (temp 2-component vector of float)
+0:15        'r22' (temp 2-component vector of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:16      move second child to first child (temp 2-component vector of double)
+0:16        'r23' (temp 2-component vector of double)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:17      move second child to first child (temp 2-component vector of uint)
+0:17        'r24' (temp 2-component vector of uint)
+0:?         Constant:
+0:?           1 (const uint)
+0:?           2 (const uint)
+0:19      move second child to first child (temp 3-component vector of bool)
+0:19        'r30' (temp 3-component vector of bool)
+0:?         Constant:
+0:?           false (const bool)
+0:?           true (const bool)
+0:?           true (const bool)
+0:20      move second child to first child (temp 3-component vector of int)
+0:20        'r31' (temp 3-component vector of int)
+0:?         Constant:
+0:?           1 (const int)
+0:?           2 (const int)
+0:?           3 (const int)
+0:21      move second child to first child (temp 3-component vector of float)
+0:21        'r32' (temp 3-component vector of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:22      move second child to first child (temp 3-component vector of double)
+0:22        'r33' (temp 3-component vector of double)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:23      move second child to first child (temp 3-component vector of uint)
+0:23        'r34' (temp 3-component vector of uint)
+0:?         Constant:
+0:?           1 (const uint)
+0:?           2 (const uint)
+0:?           3 (const uint)
+0:25      move second child to first child (temp 4-component vector of bool)
+0:25        'r40' (temp 4-component vector of bool)
+0:?         Constant:
+0:?           false (const bool)
+0:?           true (const bool)
+0:?           true (const bool)
+0:?           false (const bool)
+0:26      move second child to first child (temp 4-component vector of int)
+0:26        'r41' (temp 4-component vector of int)
+0:?         Constant:
+0:?           1 (const int)
+0:?           2 (const int)
+0:?           3 (const int)
+0:?           4 (const int)
+0:27      move second child to first child (temp 4-component vector of float)
+0:27        'r42' (temp 4-component vector of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:28      move second child to first child (temp 4-component vector of double)
+0:28        'r43' (temp 4-component vector of double)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:29      move second child to first child (temp 4-component vector of uint)
+0:29        'r44' (temp 4-component vector of uint)
+0:?         Constant:
+0:?           1 (const uint)
+0:?           2 (const uint)
+0:?           3 (const uint)
+0:?           4 (const uint)
+0:31      move second child to first child (temp 4X4 matrix of float)
+0:31        'r50' (temp 4X4 matrix of float)
+0:?         Constant:
+0:?           0.000000
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:?           6.000000
+0:?           7.000000
+0:?           8.000000
+0:?           9.000000
+0:?           10.000000
+0:?           11.000000
+0:?           12.000000
+0:?           13.000000
+0:?           14.000000
+0:?           15.000000
+0:32      move second child to first child (temp 4X4 matrix of float)
+0:32        'r51' (temp 4X4 matrix of float)
+0:?         Constant:
+0:?           0.000000
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:?           6.000000
+0:?           7.000000
+0:?           8.000000
+0:?           9.000000
+0:?           10.000000
+0:?           11.000000
+0:?           12.000000
+0:?           13.000000
+0:?           14.000000
+0:?           15.000000
+0:35      move second child to first child (temp 3X2 matrix of float)
+0:35        'r61' (temp 3X2 matrix of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:?           6.000000
+0:36      move second child to first child (temp 2X3 matrix of float)
+0:36        'r62' (temp 2X3 matrix of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:?           6.000000
+0:39      move second child to first child (temp 2X4 matrix of float)
+0:39        'r65' (temp 2X4 matrix of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:?           6.000000
+0:?           7.000000
+0:?           8.000000
+0:40      move second child to first child (temp 3X4 matrix of float)
+0:40        'r66' (temp 3X4 matrix of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:?           6.000000
+0:?           7.000000
+0:?           8.000000
+0:?           9.000000
+0:?           10.000000
+0:?           11.000000
+0:?           12.000000
+0:45      Branch: Return with expression
+0:45        Constant:
+0:45          0.000000
+0:?   Linker Objects
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:48  Function Definition: PixelShaderFunction( (temp float)
+0:3    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child (temp 4-component vector of float)
+0:4        'r00' (temp 4-component vector of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:5      move second child to first child (temp 4-component vector of float)
+0:5        'r01' (temp 4-component vector of float)
+0:?         Constant:
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:7      move second child to first child (temp 1-component vector of bool)
+0:7        'r12' (temp 1-component vector of bool)
+0:7        Constant:
+0:7          false (const bool)
+0:8      move second child to first child (temp 1-component vector of int)
+0:8        'r13' (temp 1-component vector of int)
+0:8        Constant:
+0:8          1 (const int)
+0:9      move second child to first child (temp 1-component vector of float)
+0:9        'r14' (temp 1-component vector of float)
+0:9        Constant:
+0:9          1.000000
+0:10      move second child to first child (temp 1-component vector of double)
+0:10        'r15' (temp 1-component vector of double)
+0:10        Constant:
+0:10          1.000000
+0:11      move second child to first child (temp 1-component vector of uint)
+0:11        'r16' (temp 1-component vector of uint)
+0:11        Constant:
+0:11          1 (const uint)
+0:13      move second child to first child (temp 2-component vector of bool)
+0:13        'r20' (temp 2-component vector of bool)
+0:?         Constant:
+0:?           false (const bool)
+0:?           true (const bool)
+0:14      move second child to first child (temp 2-component vector of int)
+0:14        'r21' (temp 2-component vector of int)
+0:?         Constant:
+0:?           1 (const int)
+0:?           2 (const int)
+0:15      move second child to first child (temp 2-component vector of float)
+0:15        'r22' (temp 2-component vector of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:16      move second child to first child (temp 2-component vector of double)
+0:16        'r23' (temp 2-component vector of double)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:17      move second child to first child (temp 2-component vector of uint)
+0:17        'r24' (temp 2-component vector of uint)
+0:?         Constant:
+0:?           1 (const uint)
+0:?           2 (const uint)
+0:19      move second child to first child (temp 3-component vector of bool)
+0:19        'r30' (temp 3-component vector of bool)
+0:?         Constant:
+0:?           false (const bool)
+0:?           true (const bool)
+0:?           true (const bool)
+0:20      move second child to first child (temp 3-component vector of int)
+0:20        'r31' (temp 3-component vector of int)
+0:?         Constant:
+0:?           1 (const int)
+0:?           2 (const int)
+0:?           3 (const int)
+0:21      move second child to first child (temp 3-component vector of float)
+0:21        'r32' (temp 3-component vector of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:22      move second child to first child (temp 3-component vector of double)
+0:22        'r33' (temp 3-component vector of double)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:23      move second child to first child (temp 3-component vector of uint)
+0:23        'r34' (temp 3-component vector of uint)
+0:?         Constant:
+0:?           1 (const uint)
+0:?           2 (const uint)
+0:?           3 (const uint)
+0:25      move second child to first child (temp 4-component vector of bool)
+0:25        'r40' (temp 4-component vector of bool)
+0:?         Constant:
+0:?           false (const bool)
+0:?           true (const bool)
+0:?           true (const bool)
+0:?           false (const bool)
+0:26      move second child to first child (temp 4-component vector of int)
+0:26        'r41' (temp 4-component vector of int)
+0:?         Constant:
+0:?           1 (const int)
+0:?           2 (const int)
+0:?           3 (const int)
+0:?           4 (const int)
+0:27      move second child to first child (temp 4-component vector of float)
+0:27        'r42' (temp 4-component vector of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:28      move second child to first child (temp 4-component vector of double)
+0:28        'r43' (temp 4-component vector of double)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:29      move second child to first child (temp 4-component vector of uint)
+0:29        'r44' (temp 4-component vector of uint)
+0:?         Constant:
+0:?           1 (const uint)
+0:?           2 (const uint)
+0:?           3 (const uint)
+0:?           4 (const uint)
+0:31      move second child to first child (temp 4X4 matrix of float)
+0:31        'r50' (temp 4X4 matrix of float)
+0:?         Constant:
+0:?           0.000000
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:?           6.000000
+0:?           7.000000
+0:?           8.000000
+0:?           9.000000
+0:?           10.000000
+0:?           11.000000
+0:?           12.000000
+0:?           13.000000
+0:?           14.000000
+0:?           15.000000
+0:32      move second child to first child (temp 4X4 matrix of float)
+0:32        'r51' (temp 4X4 matrix of float)
+0:?         Constant:
+0:?           0.000000
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:?           6.000000
+0:?           7.000000
+0:?           8.000000
+0:?           9.000000
+0:?           10.000000
+0:?           11.000000
+0:?           12.000000
+0:?           13.000000
+0:?           14.000000
+0:?           15.000000
+0:35      move second child to first child (temp 3X2 matrix of float)
+0:35        'r61' (temp 3X2 matrix of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:?           6.000000
+0:36      move second child to first child (temp 2X3 matrix of float)
+0:36        'r62' (temp 2X3 matrix of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:?           6.000000
+0:39      move second child to first child (temp 2X4 matrix of float)
+0:39        'r65' (temp 2X4 matrix of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:?           6.000000
+0:?           7.000000
+0:?           8.000000
+0:40      move second child to first child (temp 3X4 matrix of float)
+0:40        'r66' (temp 3X4 matrix of float)
+0:?         Constant:
+0:?           1.000000
+0:?           2.000000
+0:?           3.000000
+0:?           4.000000
+0:?           5.000000
+0:?           6.000000
+0:?           7.000000
+0:?           8.000000
+0:?           9.000000
+0:?           10.000000
+0:?           11.000000
+0:?           12.000000
+0:45      Branch: Return with expression
+0:45        Constant:
+0:45          0.000000
+0:?   Linker Objects
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 145
+
+                              Capability Shader
+                              Capability Float64
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "PixelShaderFunction"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 450
+                              Name 4  "PixelShaderFunction"
+                              Name 9  "r00"
+                              Name 15  "r01"
+                              Name 20  "r12"
+                              Name 24  "r13"
+                              Name 27  "r14"
+                              Name 30  "r15"
+                              Name 34  "r16"
+                              Name 38  "r20"
+                              Name 43  "r21"
+                              Name 48  "r22"
+                              Name 52  "r23"
+                              Name 57  "r24"
+                              Name 62  "r30"
+                              Name 66  "r31"
+                              Name 71  "r32"
+                              Name 75  "r33"
+                              Name 80  "r34"
+                              Name 85  "r40"
+                              Name 89  "r41"
+                              Name 92  "r42"
+                              Name 95  "r43"
+                              Name 100  "r44"
+                              Name 105  "r50"
+                              Name 122  "r51"
+                              Name 125  "r61"
+                              Name 131  "r62"
+                              Name 136  "r65"
+                              Name 141  "r66"
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Function 7(fvec4)
+              10:    6(float) Constant 1065353216
+              11:    6(float) Constant 1073741824
+              12:    6(float) Constant 1077936128
+              13:    6(float) Constant 1082130432
+              14:    7(fvec4) ConstantComposite 10 11 12 13
+              16:    6(float) Constant 1084227584
+              17:    7(fvec4) ConstantComposite 11 12 13 16
+              18:             TypeBool
+              19:             TypePointer Function 18(bool)
+              21:    18(bool) ConstantFalse
+              22:             TypeInt 32 1
+              23:             TypePointer Function 22(int)
+              25:     22(int) Constant 1
+              26:             TypePointer Function 6(float)
+              28:             TypeFloat 64
+              29:             TypePointer Function 28(float)
+              31:   28(float) Constant 0 1072693248
+              32:             TypeInt 32 0
+              33:             TypePointer Function 32(int)
+              35:     32(int) Constant 1
+              36:             TypeVector 18(bool) 2
+              37:             TypePointer Function 36(bvec2)
+              39:    18(bool) ConstantTrue
+              40:   36(bvec2) ConstantComposite 21 39
+              41:             TypeVector 22(int) 2
+              42:             TypePointer Function 41(ivec2)
+              44:     22(int) Constant 2
+              45:   41(ivec2) ConstantComposite 25 44
+              46:             TypeVector 6(float) 2
+              47:             TypePointer Function 46(fvec2)
+              49:   46(fvec2) ConstantComposite 10 11
+              50:             TypeVector 28(float) 2
+              51:             TypePointer Function 50(fvec2)
+              53:   28(float) Constant 0 1073741824
+              54:   50(fvec2) ConstantComposite 31 53
+              55:             TypeVector 32(int) 2
+              56:             TypePointer Function 55(ivec2)
+              58:     32(int) Constant 2
+              59:   55(ivec2) ConstantComposite 35 58
+              60:             TypeVector 18(bool) 3
+              61:             TypePointer Function 60(bvec3)
+              63:   60(bvec3) ConstantComposite 21 39 39
+              64:             TypeVector 22(int) 3
+              65:             TypePointer Function 64(ivec3)
+              67:     22(int) Constant 3
+              68:   64(ivec3) ConstantComposite 25 44 67
+              69:             TypeVector 6(float) 3
+              70:             TypePointer Function 69(fvec3)
+              72:   69(fvec3) ConstantComposite 10 11 12
+              73:             TypeVector 28(float) 3
+              74:             TypePointer Function 73(fvec3)
+              76:   28(float) Constant 0 1074266112
+              77:   73(fvec3) ConstantComposite 31 53 76
+              78:             TypeVector 32(int) 3
+              79:             TypePointer Function 78(ivec3)
+              81:     32(int) Constant 3
+              82:   78(ivec3) ConstantComposite 35 58 81
+              83:             TypeVector 18(bool) 4
+              84:             TypePointer Function 83(bvec4)
+              86:   83(bvec4) ConstantComposite 21 39 39 21
+              87:             TypeVector 22(int) 4
+              88:             TypePointer Function 87(ivec4)
+              90:     22(int) Constant 4
+              91:   87(ivec4) ConstantComposite 25 44 67 90
+              93:             TypeVector 28(float) 4
+              94:             TypePointer Function 93(fvec4)
+              96:   28(float) Constant 0 1074790400
+              97:   93(fvec4) ConstantComposite 31 53 76 96
+              98:             TypeVector 32(int) 4
+              99:             TypePointer Function 98(ivec4)
+             101:     32(int) Constant 4
+             102:   98(ivec4) ConstantComposite 35 58 81 101
+             103:             TypeMatrix 7(fvec4) 4
+             104:             TypePointer Function 103
+             106:    6(float) Constant 0
+             107:    7(fvec4) ConstantComposite 106 10 11 12
+             108:    6(float) Constant 1086324736
+             109:    6(float) Constant 1088421888
+             110:    7(fvec4) ConstantComposite 13 16 108 109
+             111:    6(float) Constant 1090519040
+             112:    6(float) Constant 1091567616
+             113:    6(float) Constant 1092616192
+             114:    6(float) Constant 1093664768
+             115:    7(fvec4) ConstantComposite 111 112 113 114
+             116:    6(float) Constant 1094713344
+             117:    6(float) Constant 1095761920
+             118:    6(float) Constant 1096810496
+             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
+             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
+             135:             TypePointer Function 134
+             137:    7(fvec4) ConstantComposite 16 108 109 111
+             138:         134 ConstantComposite 14 137
+             139:             TypeMatrix 7(fvec4) 3
+             140:             TypePointer Function 139
+             142:    7(fvec4) ConstantComposite 112 113 114 116
+             143:         139 ConstantComposite 14 137 142
+4(PixelShaderFunction):           2 Function None 3
+               5:             Label
+          9(r00):      8(ptr) Variable Function
+         15(r01):      8(ptr) Variable Function
+         20(r12):     19(ptr) Variable Function
+         24(r13):     23(ptr) Variable Function
+         27(r14):     26(ptr) Variable Function
+         30(r15):     29(ptr) Variable Function
+         34(r16):     33(ptr) Variable Function
+         38(r20):     37(ptr) Variable Function
+         43(r21):     42(ptr) Variable Function
+         48(r22):     47(ptr) Variable Function
+         52(r23):     51(ptr) Variable Function
+         57(r24):     56(ptr) Variable Function
+         62(r30):     61(ptr) Variable Function
+         66(r31):     65(ptr) Variable Function
+         71(r32):     70(ptr) Variable Function
+         75(r33):     74(ptr) Variable Function
+         80(r34):     79(ptr) Variable Function
+         85(r40):     84(ptr) Variable Function
+         89(r41):     88(ptr) Variable Function
+         92(r42):      8(ptr) Variable Function
+         95(r43):     94(ptr) Variable Function
+        100(r44):     99(ptr) Variable Function
+        105(r50):    104(ptr) Variable Function
+        122(r51):    104(ptr) Variable Function
+        125(r61):    124(ptr) Variable Function
+        131(r62):    130(ptr) Variable Function
+        136(r65):    135(ptr) Variable Function
+        141(r66):    140(ptr) Variable Function
+                              Store 9(r00) 14
+                              Store 15(r01) 17
+                              Store 20(r12) 21
+                              Store 24(r13) 25
+                              Store 27(r14) 10
+                              Store 30(r15) 31
+                              Store 34(r16) 35
+                              Store 38(r20) 40
+                              Store 43(r21) 45
+                              Store 48(r22) 49
+                              Store 52(r23) 54
+                              Store 57(r24) 59
+                              Store 62(r30) 63
+                              Store 66(r31) 68
+                              Store 71(r32) 72
+                              Store 75(r33) 77
+                              Store 80(r34) 82
+                              Store 85(r40) 86
+                              Store 89(r41) 91
+                              Store 92(r42) 14
+                              Store 95(r43) 97
+                              Store 100(r44) 102
+                              Store 105(r50) 121
+                              Store 122(r51) 121
+                              Store 125(r61) 128
+                              Store 131(r62) 133
+                              Store 136(r65) 138
+                              Store 141(r66) 143
+                              ReturnValue 106
+                              FunctionEnd
diff --git a/Test/hlsl.templatetypes.frag b/Test/hlsl.templatetypes.frag
new file mode 100644 (file)
index 0000000..379120d
--- /dev/null
@@ -0,0 +1,47 @@
+
+float PixelShaderFunction()
+{
+    vector r00 = float4(1,2,3,4);  // vector means float4
+    float4 r01 = vector(2,3,4,5);  // vector means float4
+
+    vector<bool, 1>   r12 = bool1(false);
+    vector<int, 1>    r13 = int1(1);
+    vector<float, 1>  r14 = float1(1);
+    vector<double, 1> r15 = double1(1);
+    vector<uint, 1>   r16 = uint1(1);
+
+    vector<bool, 2>   r20 = bool2(false, true);
+    vector<int, 2>    r21 = int2(1,2);
+    vector<float, 2>  r22 = float2(1,2);
+    vector<double, 2> r23 = double2(1,2);
+    vector<uint, 2>   r24 = uint2(1,2);
+    
+    vector<bool, 3>   r30 = bool3(false, true, true);
+    vector<int, 3>    r31 = int3(1,2,3);
+    vector<float, 3>  r32 = float3(1,2,3);
+    vector<double, 3> r33 = double3(1,2,3);
+    vector<uint, 3>   r34 = uint3(1,2,3);
+
+    vector<bool, 4>   r40 = bool4(false, true, true, false);
+    vector<int, 4>    r41 = int4(1,2,3,4);
+    vector<float, 4>  r42 = float4(1,2,3,4);
+    vector<double, 4> r43 = double4(1,2,3,4);
+    vector<uint, 4>   r44 = uint4(1,2,3,4);
+
+    matrix   r50 = float4x4(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15); // matrix means float4x4
+    float4x4 r51 = matrix(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);   // matrix means float4x4
+
+    // matrix<bool, 2, 3>  r60 = bool2x3(false, true, false, true, false, true);   // TODO: 
+    matrix<float, 2, 3> r61 = float2x3(1,2,3,4,5,6);
+    matrix<float, 3, 2> r62 = float3x2(1,2,3,4,5,6);
+    // matrix<float, 4, 1> r63 = float4x1(1,2,3,4);  // TODO: 
+    // matrix<float, 1, 4> r64 = float1x4(1,2,3,4);  // TODO: 
+    matrix<float, 4, 2> r65 = float4x2(1,2,3,4,5,6,7,8);
+    matrix<float, 4, 3> r66 = float4x3(1,2,3,4,5,6,7,8,9,10,11,12);
+
+    // TODO: bool mats
+    // TODO: int mats
+    
+    return 0.0;
+}
+
diff --git a/Test/hlsl.templatetypes.negative.frag b/Test/hlsl.templatetypes.negative.frag
new file mode 100644 (file)
index 0000000..aa54f3c
--- /dev/null
@@ -0,0 +1,23 @@
+
+float PixelShaderFunction()
+{
+    // TODO: All of the below should fail, although presently the first failure
+    // aborts compilation and the rest are skipped.  Having a separate test for
+    // each would be cumbersome.
+
+    vector<void, 2>    r00;  // cannot declare vectors of voids
+    matrix<void, 2, 3> r01;  // cannot declare matrices of voids
+
+    vector<float, 2, 3> r02;  // too many parameters to vector
+    matrix<float, 2>    r03;  // not enough parameters to matrix
+
+    int three = 3;
+    vector<void, three> r04; // size must be a literal constant integer
+    matrix<void, three, three> r05; // size must be a literal constant integer
+
+    vector<vector<int, 3>, 3> r06;  // type must be a simple scalar
+    vector<float3, 3> r07;          // type must be a simple scalar
+
+    return 0.0;
+}
+
index fe68a98..ac2388e 100644 (file)
@@ -102,6 +102,7 @@ INSTANTIATE_TEST_CASE_P(
         {"hlsl.struct.frag", "PixelShaderFunction"},
         {"hlsl.switch.frag", "PixelShaderFunction"},
         {"hlsl.swizzle.frag", "PixelShaderFunction"},
+        {"hlsl.templatetypes.frag", "PixelShaderFunction"},
         {"hlsl.whileLoop.frag", "PixelShaderFunction"},
         {"hlsl.void.frag", "PixelShaderFunction"},
     }),
index 417e4cb..d269f0b 100755 (executable)
@@ -1,5 +1,6 @@
 //
 //Copyright (C) 2016 Google, Inc.
+//Copyright (C) 2016 LunarG, Inc.
 //
 //All rights reserved.
 //
@@ -291,12 +292,176 @@ void HlslGrammar::acceptQualifier(TQualifier& qualifier)
     } while (true);
 }
 
+// template_type
+//      : FLOAT
+//      | DOUBLE
+//      | INT
+//      | DWORD
+//      | UINT
+//      | BOOL
+//
+bool HlslGrammar::acceptTemplateType(TBasicType& basicType)
+{
+    switch (peek()) {
+    case EHTokFloat:
+        basicType = EbtFloat;
+        break;
+    case EHTokDouble:
+        basicType = EbtDouble;
+        break;
+    case EHTokInt:
+    case EHTokDword:
+        basicType = EbtInt;
+        break;
+    case EHTokUint:
+        basicType = EbtUint;
+        break;
+    case EHTokBool:
+        basicType = EbtBool;
+        break;
+    default:
+        return false;
+    }
+
+    advanceToken();
+
+    return true;
+}
+
+// vector_template_type
+//      : VECTOR
+//      | VECTOR LEFT_ANGLE template_type COMMA integer_literal RIGHT_ANGLE
+//
+bool HlslGrammar::acceptVectorTemplateType(TType& type)
+{
+    if (! acceptTokenClass(EHTokVector))
+        return false;
+
+    if (! acceptTokenClass(EHTokLeftAngle)) {
+        // in HLSL, 'vector' alone means float4.
+        new(&type) TType(EbtFloat, EvqTemporary, 4);
+        return true;
+    }
+
+    TBasicType basicType;
+    if (! acceptTemplateType(basicType)) {
+        expected("scalar type");
+        return false;
+    }
+
+    // COMMA
+    if (! acceptTokenClass(EHTokComma)) {
+        expected(",");
+        return false;
+    }
+
+    // integer
+    if (! peekTokenClass(EHTokIntConstant)) {
+        expected("literal integer");
+        return false;
+    }
+
+    TIntermTyped* vecSize;
+    if (! acceptLiteral(vecSize))
+        return false;
+
+    const int vecSizeI = vecSize->getAsConstantUnion()->getConstArray()[0].getIConst();
+
+    new(&type) TType(basicType, EvqTemporary, vecSizeI);
+
+    if (vecSizeI == 1)
+        type.makeVector();
+
+    if (!acceptTokenClass(EHTokRightAngle)) {
+        expected("right angle bracket");
+        return false;
+    }
+
+    return true;
+}
+
+// matrix_template_type
+//      : MATRIX
+//      | MATRIX LEFT_ANGLE template_type COMMA integer_literal COMMA integer_literal RIGHT_ANGLE
+//
+bool HlslGrammar::acceptMatrixTemplateType(TType& type)
+{
+    if (! acceptTokenClass(EHTokMatrix))
+        return false;
+
+    if (! acceptTokenClass(EHTokLeftAngle)) {
+        // in HLSL, 'matrix' alone means float4x4.
+        new(&type) TType(EbtFloat, EvqTemporary, 0, 4, 4);
+        return true;
+    }
+
+    TBasicType basicType;
+    if (! acceptTemplateType(basicType)) {
+        expected("scalar type");
+        return false;
+    }
+
+    // COMMA
+    if (! acceptTokenClass(EHTokComma)) {
+        expected(",");
+        return false;
+    }
+
+    // integer rows
+    if (! peekTokenClass(EHTokIntConstant)) {
+        expected("literal integer");
+        return false;
+    }
+
+    TIntermTyped* rows;
+    if (! acceptLiteral(rows))
+        return false;
+
+    // COMMA
+    if (! acceptTokenClass(EHTokComma)) {
+        expected(",");
+        return false;
+    }
+    
+    // integer cols
+    if (! peekTokenClass(EHTokIntConstant)) {
+        expected("literal integer");
+        return false;
+    }
+
+    TIntermTyped* cols;
+    if (! acceptLiteral(cols))
+        return false;
+
+    new(&type) TType(basicType, EvqTemporary, 0,
+                     cols->getAsConstantUnion()->getConstArray()[0].getIConst(),
+                     rows->getAsConstantUnion()->getConstArray()[0].getIConst());
+
+    if (!acceptTokenClass(EHTokRightAngle)) {
+        expected("right angle bracket");
+        return false;
+    }
+
+    return true;
+}
+
+
 // If token is for a type, update 'type' with the type information,
 // and return true and advance.
 // Otherwise, return false, and don't advance
 bool HlslGrammar::acceptType(TType& type)
 {
+    TBasicType basicType;
+
     switch (peek()) {
+    case EHTokVector:
+        return acceptVectorTemplateType(type);
+        break;
+
+    case EHTokMatrix:
+        return acceptMatrixTemplateType(type);
+        break;
+
     case EHTokStruct:
         return acceptStruct(type);
         break;
@@ -386,6 +551,7 @@ bool HlslGrammar::acceptType(TType& type)
         new(&type) TType(EbtUint, EvqTemporary, 4);
         break;
 
+
     case EHTokBool:
         new(&type) TType(EbtBool);
         break;
index f00ed4e..478aae1 100755 (executable)
@@ -1,5 +1,6 @@
 //
 //Copyright (C) 2016 Google, Inc.
+//Copyright (C) 2016 LunarG, Inc.
 //
 //All rights reserved.
 //
@@ -62,6 +63,9 @@ namespace glslang {
         bool acceptFullySpecifiedType(TType&);
         void acceptQualifier(TQualifier&);
         bool acceptType(TType&);
+        bool acceptTemplateType(TBasicType&);
+        bool acceptVectorTemplateType(TType&);
+        bool acceptMatrixTemplateType(TType&);
         bool acceptStruct(TType&);
         bool acceptStructDeclarationList(TTypeList*&);
         bool acceptFunctionParameters(TFunction&);