diff options
author | John Kessenich <cepheus@frii.com> | 2016-11-27 22:51:36 -0700 |
---|---|---|
committer | John Kessenich <cepheus@frii.com> | 2016-11-27 22:51:36 -0700 |
commit | f97f2ce603ae190aafd2d1335e5a417e7bd2d2fe (patch) | |
tree | b371b7e95d785914390b54d46e78d82f153ce38f | |
parent | 98ad48532157bbaa1cffc0625cbf0b514aa3ad74 (diff) | |
download | glslang-f97f2ce603ae190aafd2d1335e5a417e7bd2d2fe.tar.gz |
HLSL: Support the constructor idiom "(struct type)0".
This highly leverages the previous commit to handle partial initializers.
-rwxr-xr-x | Test/baseResults/hlsl.partialInit.frag.out | 460 | ||||
-rwxr-xr-x | Test/hlsl.partialInit.frag | 11 | ||||
-rw-r--r-- | glslang/Include/revision.h | 2 | ||||
-rwxr-xr-x | hlsl/hlslParseHelper.cpp | 22 | ||||
-rwxr-xr-x | hlsl/hlslParseHelper.h | 1 |
5 files changed, 314 insertions, 182 deletions
diff --git a/Test/baseResults/hlsl.partialInit.frag.out b/Test/baseResults/hlsl.partialInit.frag.out index bac92378..5bf838a4 100755 --- a/Test/baseResults/hlsl.partialInit.frag.out +++ b/Test/baseResults/hlsl.partialInit.frag.out @@ -17,79 +17,124 @@ gl_FragCoord origin is upper left 0:9 0.000000 0:9 0.000000 0:9 0.000000 -0:12 Function Definition: PixelShaderFunction(vf4; (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:12 Function Parameters: -0:12 'input' (layout(location=0 ) in 4-component vector of float) +0:18 Function Definition: PixelShaderFunction(vf4; (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:18 Function Parameters: +0:18 'input' (layout(location=0 ) in 4-component vector of float) 0:? Sequence -0:13 Sequence -0:13 move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:13 'o2' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:13 Constant: -0:13 3 (const int) -0:13 0.000000 -0:13 false (const bool) -0:13 0.000000 -0:13 0.000000 -0:13 0.000000 -0:13 0.000000 -0:15 move second child to first child (temp 4-component vector of float) -0:15 v: direct index for structure (temp 4-component vector of float) -0:15 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:15 Constant: -0:15 3 (const int) -0:15 vector-scale (temp 4-component vector of float) -0:15 'gv' (global 4-component vector of float) -0:15 direct index (temp float) -0:15 'gfa' (global 3-element array of float) -0:15 Constant: -0:15 2 (const int) -0:16 Sequence -0:16 move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:16 'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:16 Constant: -0:16 0 (const int) -0:16 0.000000 -0:16 false (const bool) -0:16 0.000000 -0:16 0.000000 -0:16 0.000000 -0:16 0.000000 -0:19 move second child to first child (temp bool) -0:19 c: direct index for structure (temp bool) -0:19 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:19 Sequence +0:19 move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:19 'o2' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) 0:19 Constant: -0:19 2 (const int) -0:19 c: direct index for structure (temp bool) -0:19 'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:19 Constant: -0:19 2 (const int) -0:21 Sequence -0:21 Sequence -0:21 move second child to first child (temp int) +0:19 3 (const int) +0:19 0.000000 +0:19 false (const bool) +0:19 0.000000 +0:19 0.000000 +0:19 0.000000 +0:19 0.000000 +0:21 move second child to first child (temp 4-component vector of float) +0:21 v: direct index for structure (temp 4-component vector of float) +0:21 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:21 Constant: +0:21 3 (const int) +0:21 vector-scale (temp 4-component vector of float) +0:21 'gv' (global 4-component vector of float) +0:21 direct index (temp float) +0:21 'gfa' (global 3-element array of float) +0:21 Constant: +0:21 2 (const int) +0:22 Sequence +0:22 move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:22 'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:22 Constant: +0:22 0 (const int) +0:22 0.000000 +0:22 false (const bool) +0:22 0.000000 +0:22 0.000000 +0:22 0.000000 +0:22 0.000000 +0:23 Sequence +0:23 move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:23 'o3' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:23 Constant: +0:23 0 (const int) +0:23 0.000000 +0:23 false (const bool) +0:23 0.000000 +0:23 0.000000 +0:23 0.000000 +0:23 0.000000 +0:24 move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:24 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:24 Constant: +0:24 0 (const int) +0:24 0.000000 +0:24 false (const bool) +0:24 0.000000 +0:24 0.000000 +0:24 0.000000 +0:24 0.000000 +0:25 move second child to first child (temp bool) +0:25 c: direct index for structure (temp bool) +0:25 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:25 Constant: +0:25 2 (const int) +0:25 c: direct index for structure (temp bool) +0:25 'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:25 Constant: +0:25 2 (const int) +0:26 Sequence +0:26 move second child to first child (temp structure{temp 4X3 matrix of float m, temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v} os, temp bool b}) +0:26 'nest' (temp structure{temp 4X3 matrix of float m, temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v} os, temp bool b}) +0:26 Constant: +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0 (const int) +0:26 0.000000 +0:26 false (const bool) +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 false (const bool) +0:28 Sequence +0:28 Sequence +0:28 move second child to first child (temp int) 0:? 'a' (layout(location=0 ) out int) -0:21 a: direct index for structure (temp int) -0:21 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:21 Constant: -0:21 0 (const int) -0:21 move second child to first child (temp float) +0:28 a: direct index for structure (temp int) +0:28 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:28 Constant: +0:28 0 (const int) +0:28 move second child to first child (temp float) 0:? 'b' (layout(location=1 ) out float) -0:21 b: direct index for structure (temp float) -0:21 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:21 Constant: -0:21 1 (const int) -0:21 move second child to first child (temp bool) +0:28 b: direct index for structure (temp float) +0:28 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:28 Constant: +0:28 1 (const int) +0:28 move second child to first child (temp bool) 0:? 'c' (layout(location=2 ) out bool) -0:21 c: direct index for structure (temp bool) -0:21 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:21 Constant: -0:21 2 (const int) -0:21 move second child to first child (temp 4-component vector of float) +0:28 c: direct index for structure (temp bool) +0:28 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:28 Constant: +0:28 2 (const int) +0:28 move second child to first child (temp 4-component vector of float) 0:? 'v' (layout(location=3 ) out 4-component vector of float) -0:21 v: direct index for structure (temp 4-component vector of float) -0:21 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:21 Constant: -0:21 3 (const int) -0:21 Branch: Return +0:28 v: direct index for structure (temp 4-component vector of float) +0:28 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:28 Constant: +0:28 3 (const int) +0:28 Branch: Return 0:? Linker Objects 0:? 'a' (layout(location=0 ) out int) 0:? 'b' (layout(location=1 ) out float) @@ -121,79 +166,124 @@ gl_FragCoord origin is upper left 0:9 0.000000 0:9 0.000000 0:9 0.000000 -0:12 Function Definition: PixelShaderFunction(vf4; (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:12 Function Parameters: -0:12 'input' (layout(location=0 ) in 4-component vector of float) +0:18 Function Definition: PixelShaderFunction(vf4; (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:18 Function Parameters: +0:18 'input' (layout(location=0 ) in 4-component vector of float) 0:? Sequence -0:13 Sequence -0:13 move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:13 'o2' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:13 Constant: -0:13 3 (const int) -0:13 0.000000 -0:13 false (const bool) -0:13 0.000000 -0:13 0.000000 -0:13 0.000000 -0:13 0.000000 -0:15 move second child to first child (temp 4-component vector of float) -0:15 v: direct index for structure (temp 4-component vector of float) -0:15 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:15 Constant: -0:15 3 (const int) -0:15 vector-scale (temp 4-component vector of float) -0:15 'gv' (global 4-component vector of float) -0:15 direct index (temp float) -0:15 'gfa' (global 3-element array of float) -0:15 Constant: -0:15 2 (const int) -0:16 Sequence -0:16 move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:16 'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:16 Constant: -0:16 0 (const int) -0:16 0.000000 -0:16 false (const bool) -0:16 0.000000 -0:16 0.000000 -0:16 0.000000 -0:16 0.000000 -0:19 move second child to first child (temp bool) -0:19 c: direct index for structure (temp bool) -0:19 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:19 Constant: -0:19 2 (const int) -0:19 c: direct index for structure (temp bool) -0:19 'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:19 Sequence +0:19 move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:19 'o2' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) 0:19 Constant: -0:19 2 (const int) -0:21 Sequence -0:21 Sequence -0:21 move second child to first child (temp int) +0:19 3 (const int) +0:19 0.000000 +0:19 false (const bool) +0:19 0.000000 +0:19 0.000000 +0:19 0.000000 +0:19 0.000000 +0:21 move second child to first child (temp 4-component vector of float) +0:21 v: direct index for structure (temp 4-component vector of float) +0:21 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:21 Constant: +0:21 3 (const int) +0:21 vector-scale (temp 4-component vector of float) +0:21 'gv' (global 4-component vector of float) +0:21 direct index (temp float) +0:21 'gfa' (global 3-element array of float) +0:21 Constant: +0:21 2 (const int) +0:22 Sequence +0:22 move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:22 'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:22 Constant: +0:22 0 (const int) +0:22 0.000000 +0:22 false (const bool) +0:22 0.000000 +0:22 0.000000 +0:22 0.000000 +0:22 0.000000 +0:23 Sequence +0:23 move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:23 'o3' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:23 Constant: +0:23 0 (const int) +0:23 0.000000 +0:23 false (const bool) +0:23 0.000000 +0:23 0.000000 +0:23 0.000000 +0:23 0.000000 +0:24 move second child to first child (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:24 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:24 Constant: +0:24 0 (const int) +0:24 0.000000 +0:24 false (const bool) +0:24 0.000000 +0:24 0.000000 +0:24 0.000000 +0:24 0.000000 +0:25 move second child to first child (temp bool) +0:25 c: direct index for structure (temp bool) +0:25 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:25 Constant: +0:25 2 (const int) +0:25 c: direct index for structure (temp bool) +0:25 'o1' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:25 Constant: +0:25 2 (const int) +0:26 Sequence +0:26 move second child to first child (temp structure{temp 4X3 matrix of float m, temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v} os, temp bool b}) +0:26 'nest' (temp structure{temp 4X3 matrix of float m, temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v} os, temp bool b}) +0:26 Constant: +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0 (const int) +0:26 0.000000 +0:26 false (const bool) +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 0.000000 +0:26 false (const bool) +0:28 Sequence +0:28 Sequence +0:28 move second child to first child (temp int) 0:? 'a' (layout(location=0 ) out int) -0:21 a: direct index for structure (temp int) -0:21 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:21 Constant: -0:21 0 (const int) -0:21 move second child to first child (temp float) +0:28 a: direct index for structure (temp int) +0:28 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:28 Constant: +0:28 0 (const int) +0:28 move second child to first child (temp float) 0:? 'b' (layout(location=1 ) out float) -0:21 b: direct index for structure (temp float) -0:21 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:21 Constant: -0:21 1 (const int) -0:21 move second child to first child (temp bool) +0:28 b: direct index for structure (temp float) +0:28 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:28 Constant: +0:28 1 (const int) +0:28 move second child to first child (temp bool) 0:? 'c' (layout(location=2 ) out bool) -0:21 c: direct index for structure (temp bool) -0:21 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:21 Constant: -0:21 2 (const int) -0:21 move second child to first child (temp 4-component vector of float) +0:28 c: direct index for structure (temp bool) +0:28 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:28 Constant: +0:28 2 (const int) +0:28 move second child to first child (temp 4-component vector of float) 0:? 'v' (layout(location=3 ) out 4-component vector of float) -0:21 v: direct index for structure (temp 4-component vector of float) -0:21 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) -0:21 Constant: -0:21 3 (const int) -0:21 Branch: Return +0:28 v: direct index for structure (temp 4-component vector of float) +0:28 'o4' (temp structure{temp int a, temp float b, temp bool c, temp 4-component vector of float v}) +0:28 Constant: +0:28 3 (const int) +0:28 Branch: Return 0:? Linker Objects 0:? 'a' (layout(location=0 ) out int) 0:? 'b' (layout(location=1 ) out float) @@ -205,12 +295,12 @@ gl_FragCoord origin is upper left // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 66 +// Id's are bound by 75 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "PixelShaderFunction" 45 50 56 60 65 + EntryPoint Fragment 4 "PixelShaderFunction" 54 59 65 69 74 ExecutionMode 4 OriginUpperLeft Name 4 "PixelShaderFunction" Name 9 "gv" @@ -223,16 +313,22 @@ gl_FragCoord origin is upper left Name 23 "o2" Name 28 "o4" Name 37 "o1" - Name 45 "a" - Name 50 "b" - Name 56 "c" - Name 60 "v" - Name 65 "input" - Decorate 45(a) Location 0 - Decorate 50(b) Location 1 - Decorate 56(c) Location 2 - Decorate 60(v) Location 3 - Decorate 65(input) Location 0 + Name 40 "o3" + Name 47 "Nest" + MemberName 47(Nest) 0 "m" + MemberName 47(Nest) 1 "os" + MemberName 47(Nest) 2 "b" + Name 49 "nest" + Name 54 "a" + Name 59 "b" + Name 65 "c" + Name 69 "v" + Name 74 "input" + Decorate 54(a) Location 0 + Decorate 59(b) Location 1 + Decorate 65(c) Location 2 + Decorate 69(v) Location 3 + Decorate 74(input) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -261,25 +357,34 @@ gl_FragCoord origin is upper left 35: TypePointer Function 7(fvec4) 38: 19(int) Constant 0 39: 21(outs) ConstantComposite 38 10 25 26 - 40: TypePointer Function 20(bool) - 44: TypePointer Output 19(int) - 45(a): 44(ptr) Variable Output - 46: TypePointer Function 19(int) - 49: TypePointer Output 6(float) - 50(b): 49(ptr) Variable Output - 51: 19(int) Constant 1 - 52: TypePointer Function 6(float) - 55: TypePointer Output 20(bool) - 56(c): 55(ptr) Variable Output - 59: TypePointer Output 7(fvec4) - 60(v): 59(ptr) Variable Output - 64: TypePointer Input 7(fvec4) - 65(input): 64(ptr) Variable Input + 41: TypePointer Function 20(bool) + 45: TypeVector 6(float) 3 + 46: TypeMatrix 45(fvec3) 4 + 47(Nest): TypeStruct 46 21(outs) 20(bool) + 48: TypePointer Function 47(Nest) + 50: 45(fvec3) ConstantComposite 10 10 10 + 51: 46 ConstantComposite 50 50 50 50 + 52: 47(Nest) ConstantComposite 51 39 25 + 53: TypePointer Output 19(int) + 54(a): 53(ptr) Variable Output + 55: TypePointer Function 19(int) + 58: TypePointer Output 6(float) + 59(b): 58(ptr) Variable Output + 60: 19(int) Constant 1 + 61: TypePointer Function 6(float) + 64: TypePointer Output 20(bool) + 65(c): 64(ptr) Variable Output + 68: TypePointer Output 7(fvec4) + 69(v): 68(ptr) Variable Output + 73: TypePointer Input 7(fvec4) + 74(input): 73(ptr) Variable Input 4(PixelShaderFunction): 2 Function None 3 5: Label 23(o2): 22(ptr) Variable Function 28(o4): 22(ptr) Variable Function 37(o1): 22(ptr) Variable Function + 40(o3): 22(ptr) Variable Function + 49(nest): 48(ptr) Variable Function Store 9(gv) 12 Store 17(gfa) 18 Store 23(o2) 27 @@ -290,21 +395,24 @@ gl_FragCoord origin is upper left 36: 35(ptr) AccessChain 28(o4) 24 Store 36 34 Store 37(o1) 39 - 41: 40(ptr) AccessChain 37(o1) 30 - 42: 20(bool) Load 41 - 43: 40(ptr) AccessChain 28(o4) 30 - Store 43 42 - 47: 46(ptr) AccessChain 28(o4) 38 - 48: 19(int) Load 47 - Store 45(a) 48 - 53: 52(ptr) AccessChain 28(o4) 51 - 54: 6(float) Load 53 - Store 50(b) 54 - 57: 40(ptr) AccessChain 28(o4) 30 - 58: 20(bool) Load 57 - Store 56(c) 58 - 61: 35(ptr) AccessChain 28(o4) 24 - 62: 7(fvec4) Load 61 - Store 60(v) 62 + Store 40(o3) 39 + Store 28(o4) 39 + 42: 41(ptr) AccessChain 37(o1) 30 + 43: 20(bool) Load 42 + 44: 41(ptr) AccessChain 28(o4) 30 + Store 44 43 + Store 49(nest) 52 + 56: 55(ptr) AccessChain 28(o4) 38 + 57: 19(int) Load 56 + Store 54(a) 57 + 62: 61(ptr) AccessChain 28(o4) 60 + 63: 6(float) Load 62 + Store 59(b) 63 + 66: 41(ptr) AccessChain 28(o4) 30 + 67: 20(bool) Load 66 + Store 65(c) 67 + 70: 35(ptr) AccessChain 28(o4) 24 + 71: 7(fvec4) Load 70 + Store 69(v) 71 Return FunctionEnd diff --git a/Test/hlsl.partialInit.frag b/Test/hlsl.partialInit.frag index b5b0a580..59e8a529 100755 --- a/Test/hlsl.partialInit.frag +++ b/Test/hlsl.partialInit.frag @@ -8,15 +8,22 @@ struct outs { static float4 gv = {0,0,1};
static float gfa[3] = {0,0};
+struct Nest {
+ float4x3 m;
+ outs os;
+ bool b;
+};
+
outs PixelShaderFunction(float4 input) : COLOR0
{
outs o2 = { 3 };
outs o4;
o4.v = gv * gfa[2];
outs o1 = { };
-// outs o3 = (outs)0;
-// o4 = (outs)0;
+ outs o3 = (outs)0;
+ o4 = (outs)0;
o4.c = o1.c;
+ Nest nest = (Nest)0;
return o4;
}
\ No newline at end of file diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index 4d1ea9df..480953e0 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -2,5 +2,5 @@ // For the version, it uses the latest git tag followed by the number of commits. // For the date, it uses the current date (when then script is run). -#define GLSLANG_REVISION "Overload400-PrecQual.1665" +#define GLSLANG_REVISION "Overload400-PrecQual.1666" #define GLSLANG_DATE "27-Nov-2016" diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index 0ed259a1..8685dcd8 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -3285,7 +3285,7 @@ bool HlslParseContext::builtInName(const TString& /*identifier*/) // // Returns true if there was an error in construction. // -bool HlslParseContext::constructorError(const TSourceLoc& loc, TIntermNode* /*node*/, TFunction& function, +bool HlslParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, TFunction& function, TOperator op, TType& type) { type.shallowCopy(function.getType()); @@ -3411,6 +3411,9 @@ bool HlslParseContext::constructorError(const TSourceLoc& loc, TIntermNode* /*no return true; } + if (op == EOpConstructStruct && ! type.isArray() && isZeroConstructor(node)) + return false; + if (op == EOpConstructStruct && ! type.isArray() && (int)type.getStruct()->size() != function.getParamCount()) { error(loc, "Number of constructor parameters does not match the number of structure fields", "constructor", ""); return true; @@ -3422,11 +3425,15 @@ bool HlslParseContext::constructorError(const TSourceLoc& loc, TIntermNode* /*no return true; } - // TIntermTyped* typed = node->getAsTyped(); - return false; } +bool HlslParseContext::isZeroConstructor(const TIntermNode* node) +{ + return node->getAsTyped()->isScalar() && node->getAsConstantUnion() && + node->getAsConstantUnion()->getConstArray()[0].getIConst() == 0; +} + // Verify all the correct semantics for constructing a combined texture/sampler. // Return true if the semantics are incorrect. bool HlslParseContext::constructorTextureSamplerError(const TSourceLoc& loc, const TFunction& function) @@ -4672,6 +4679,11 @@ TIntermNode* HlslParseContext::executeInitializer(const TSourceLoc& loc, TInterm // creating a constructor-style initializer, ensuring we get the // same form. // +// Returns a node representing an expression for the initializer list expressed +// as the correct type. +// +// Returns nullptr if there is an error. +// TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, const TType& type, TIntermTyped* initializer) { // Will operate recursively. Once a subtree is found that is constructor style, @@ -4808,6 +4820,10 @@ TIntermTyped* HlslParseContext::addConstructor(const TSourceLoc& loc, TIntermNod if (node == nullptr || node->getAsTyped() == nullptr) return nullptr; + // Handle the idiom "(struct type)0" + if (type.isStruct() && isZeroConstructor(node)) + return convertInitializerList(loc, type, intermediate.makeAggregate(loc)); + TIntermAggregate* aggrNode = node->getAsAggregate(); TOperator op = intermediate.mapTypeToConstructorOp(type); diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h index ca937678..02e69814 100755 --- a/hlsl/hlslParseHelper.h +++ b/hlsl/hlslParseHelper.h @@ -172,6 +172,7 @@ protected: void declareArray(const TSourceLoc&, TString& identifier, const TType&, TSymbol*&, bool track); TIntermNode* executeInitializer(const TSourceLoc&, TIntermTyped* initializer, TVariable* variable); TIntermTyped* convertInitializerList(const TSourceLoc&, const TType&, TIntermTyped* initializer); + bool HlslParseContext::isZeroConstructor(const TIntermNode*); TOperator mapAtomicOp(const TSourceLoc& loc, TOperator op, bool isImage); // Return true if this node requires L-value conversion (e.g, to an imageStore). |