diff --git a/Test/baseResults/hlsl.templatetypes.frag.out b/Test/baseResults/hlsl.templatetypes.frag.out new file mode 100644 index 0000000000000000000000000000000000000000..d26c4d83bfb842aae54ac682bc7db3dcc3aae582 --- /dev/null +++ b/Test/baseResults/hlsl.templatetypes.frag.out @@ -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 index 0000000000000000000000000000000000000000..379120d9bd0d2c8b8b2b1f7cea93c9f34d9db8df --- /dev/null +++ b/Test/hlsl.templatetypes.frag @@ -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 index 0000000000000000000000000000000000000000..aa54f3c6833130f3b7ea2c9194cd883bace63157 --- /dev/null +++ b/Test/hlsl.templatetypes.negative.frag @@ -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; +} + diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp index fe68a980ae8022e14006aea7fea58ee57f2ff867..ac2388e64ccf93b44f4c797f714a91434d46dc27 100644 --- a/gtests/Hlsl.FromFile.cpp +++ b/gtests/Hlsl.FromFile.cpp @@ -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"}, }), diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp index 417e4cb47f065ed6df54c223240c11a1074dd006..d269f0b1198ac98b864fe90678458a4d7befabb5 100755 --- a/hlsl/hlslGrammar.cpp +++ b/hlsl/hlslGrammar.cpp @@ -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; diff --git a/hlsl/hlslGrammar.h b/hlsl/hlslGrammar.h index f00ed4e07bd792f49e3f7abfea848d0c637c31a7..478aae16b95c36d912d5c6ca2f150d403137444b 100755 --- a/hlsl/hlslGrammar.h +++ b/hlsl/hlslGrammar.h @@ -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&);