aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Kessenich <cepheus@frii.com>2016-11-27 22:51:36 -0700
committerJohn Kessenich <cepheus@frii.com>2016-11-27 22:51:36 -0700
commitf97f2ce603ae190aafd2d1335e5a417e7bd2d2fe (patch)
treeb371b7e95d785914390b54d46e78d82f153ce38f
parent98ad48532157bbaa1cffc0625cbf0b514aa3ad74 (diff)
downloadglslang-f97f2ce603ae190aafd2d1335e5a417e7bd2d2fe.tar.gz
HLSL: Support the constructor idiom "(struct type)0".
This highly leverages the previous commit to handle partial initializers.
-rwxr-xr-xTest/baseResults/hlsl.partialInit.frag.out460
-rwxr-xr-xTest/hlsl.partialInit.frag11
-rw-r--r--glslang/Include/revision.h2
-rwxr-xr-xhlsl/hlslParseHelper.cpp22
-rwxr-xr-xhlsl/hlslParseHelper.h1
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).