HLSL: Support {...} initializer lists that are too short.
This commit is contained in:
parent
1c98904014
commit
98ad485321
310
Test/baseResults/hlsl.partialInit.frag.out
Executable file
310
Test/baseResults/hlsl.partialInit.frag.out
Executable file
@ -0,0 +1,310 @@
|
|||||||
|
hlsl.partialInit.frag
|
||||||
|
Shader version: 450
|
||||||
|
gl_FragCoord origin is upper left
|
||||||
|
0:? Sequence
|
||||||
|
0:8 Sequence
|
||||||
|
0:8 move second child to first child (temp 4-component vector of float)
|
||||||
|
0:8 'gv' (global 4-component vector of float)
|
||||||
|
0:8 Constant:
|
||||||
|
0:8 0.000000
|
||||||
|
0:8 0.000000
|
||||||
|
0:8 1.000000
|
||||||
|
0:8 0.000000
|
||||||
|
0:9 Sequence
|
||||||
|
0:9 move second child to first child (temp 3-element array of float)
|
||||||
|
0:9 'gfa' (global 3-element array of float)
|
||||||
|
0:9 Constant:
|
||||||
|
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:? 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 Constant:
|
||||||
|
0:19 2 (const int)
|
||||||
|
0:21 Sequence
|
||||||
|
0:21 Sequence
|
||||||
|
0:21 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:? '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:? '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:? '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:? Linker Objects
|
||||||
|
0:? 'a' (layout(location=0 ) out int)
|
||||||
|
0:? 'b' (layout(location=1 ) out float)
|
||||||
|
0:? 'c' (layout(location=2 ) out bool)
|
||||||
|
0:? 'v' (layout(location=3 ) out 4-component vector of float)
|
||||||
|
0:? 'input' (layout(location=0 ) in 4-component vector of float)
|
||||||
|
0:? 'gv' (global 4-component vector of float)
|
||||||
|
0:? 'gfa' (global 3-element array of float)
|
||||||
|
|
||||||
|
|
||||||
|
Linked fragment stage:
|
||||||
|
|
||||||
|
|
||||||
|
Shader version: 450
|
||||||
|
gl_FragCoord origin is upper left
|
||||||
|
0:? Sequence
|
||||||
|
0:8 Sequence
|
||||||
|
0:8 move second child to first child (temp 4-component vector of float)
|
||||||
|
0:8 'gv' (global 4-component vector of float)
|
||||||
|
0:8 Constant:
|
||||||
|
0:8 0.000000
|
||||||
|
0:8 0.000000
|
||||||
|
0:8 1.000000
|
||||||
|
0:8 0.000000
|
||||||
|
0:9 Sequence
|
||||||
|
0:9 move second child to first child (temp 3-element array of float)
|
||||||
|
0:9 'gfa' (global 3-element array of float)
|
||||||
|
0:9 Constant:
|
||||||
|
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:? 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 Constant:
|
||||||
|
0:19 2 (const int)
|
||||||
|
0:21 Sequence
|
||||||
|
0:21 Sequence
|
||||||
|
0:21 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:? '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:? '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:? '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:? Linker Objects
|
||||||
|
0:? 'a' (layout(location=0 ) out int)
|
||||||
|
0:? 'b' (layout(location=1 ) out float)
|
||||||
|
0:? 'c' (layout(location=2 ) out bool)
|
||||||
|
0:? 'v' (layout(location=3 ) out 4-component vector of float)
|
||||||
|
0:? 'input' (layout(location=0 ) in 4-component vector of float)
|
||||||
|
0:? 'gv' (global 4-component vector of float)
|
||||||
|
0:? 'gfa' (global 3-element array of float)
|
||||||
|
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 66
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "PixelShaderFunction" 45 50 56 60 65
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Name 4 "PixelShaderFunction"
|
||||||
|
Name 9 "gv"
|
||||||
|
Name 17 "gfa"
|
||||||
|
Name 21 "outs"
|
||||||
|
MemberName 21(outs) 0 "a"
|
||||||
|
MemberName 21(outs) 1 "b"
|
||||||
|
MemberName 21(outs) 2 "c"
|
||||||
|
MemberName 21(outs) 3 "v"
|
||||||
|
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
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 4
|
||||||
|
8: TypePointer Private 7(fvec4)
|
||||||
|
9(gv): 8(ptr) Variable Private
|
||||||
|
10: 6(float) Constant 0
|
||||||
|
11: 6(float) Constant 1065353216
|
||||||
|
12: 7(fvec4) ConstantComposite 10 10 11 10
|
||||||
|
13: TypeInt 32 0
|
||||||
|
14: 13(int) Constant 3
|
||||||
|
15: TypeArray 6(float) 14
|
||||||
|
16: TypePointer Private 15
|
||||||
|
17(gfa): 16(ptr) Variable Private
|
||||||
|
18: 15 ConstantComposite 10 10 10
|
||||||
|
19: TypeInt 32 1
|
||||||
|
20: TypeBool
|
||||||
|
21(outs): TypeStruct 19(int) 6(float) 20(bool) 7(fvec4)
|
||||||
|
22: TypePointer Function 21(outs)
|
||||||
|
24: 19(int) Constant 3
|
||||||
|
25: 20(bool) ConstantFalse
|
||||||
|
26: 7(fvec4) ConstantComposite 10 10 10 10
|
||||||
|
27: 21(outs) ConstantComposite 24 10 25 26
|
||||||
|
30: 19(int) Constant 2
|
||||||
|
31: TypePointer Private 6(float)
|
||||||
|
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
|
||||||
|
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
|
||||||
|
Store 9(gv) 12
|
||||||
|
Store 17(gfa) 18
|
||||||
|
Store 23(o2) 27
|
||||||
|
29: 7(fvec4) Load 9(gv)
|
||||||
|
32: 31(ptr) AccessChain 17(gfa) 30
|
||||||
|
33: 6(float) Load 32
|
||||||
|
34: 7(fvec4) VectorTimesScalar 29 33
|
||||||
|
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
|
||||||
|
Return
|
||||||
|
FunctionEnd
|
||||||
22
Test/hlsl.partialInit.frag
Executable file
22
Test/hlsl.partialInit.frag
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
struct outs {
|
||||||
|
int a;
|
||||||
|
float b;
|
||||||
|
bool c;
|
||||||
|
float4 v;
|
||||||
|
};
|
||||||
|
|
||||||
|
static float4 gv = {0,0,1};
|
||||||
|
static float gfa[3] = {0,0};
|
||||||
|
|
||||||
|
outs PixelShaderFunction(float4 input) : COLOR0
|
||||||
|
{
|
||||||
|
outs o2 = { 3 };
|
||||||
|
outs o4;
|
||||||
|
o4.v = gv * gfa[2];
|
||||||
|
outs o1 = { };
|
||||||
|
// outs o3 = (outs)0;
|
||||||
|
// o4 = (outs)0;
|
||||||
|
o4.c = o1.c;
|
||||||
|
|
||||||
|
return o4;
|
||||||
|
}
|
||||||
@ -2,5 +2,5 @@
|
|||||||
// For the version, it uses the latest git tag followed by the number of commits.
|
// 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).
|
// For the date, it uses the current date (when then script is run).
|
||||||
|
|
||||||
#define GLSLANG_REVISION "Overload400-PrecQual.1664"
|
#define GLSLANG_REVISION "Overload400-PrecQual.1665"
|
||||||
#define GLSLANG_DATE "27-Nov-2016"
|
#define GLSLANG_DATE "27-Nov-2016"
|
||||||
|
|||||||
@ -858,6 +858,7 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat
|
|||||||
case EOpLogicalAnd:
|
case EOpLogicalAnd:
|
||||||
case EOpLogicalOr:
|
case EOpLogicalOr:
|
||||||
case EOpLogicalXor:
|
case EOpLogicalXor:
|
||||||
|
case EOpConstructStruct:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -1184,6 +1185,17 @@ TIntermAggregate* TIntermediate::makeAggregate(TIntermNode* node, const TSourceL
|
|||||||
return aggNode;
|
return aggNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Make an aggregate with an empty sequence.
|
||||||
|
//
|
||||||
|
TIntermAggregate* TIntermediate::makeAggregate(const TSourceLoc& loc)
|
||||||
|
{
|
||||||
|
TIntermAggregate* aggNode = new TIntermAggregate;
|
||||||
|
aggNode->setLoc(loc);
|
||||||
|
|
||||||
|
return aggNode;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// For "if" test nodes. There are three children; a condition,
|
// For "if" test nodes. There are three children; a condition,
|
||||||
// a true path, and a false path. The two paths are in the
|
// a true path, and a false path. The two paths are in the
|
||||||
|
|||||||
@ -221,6 +221,7 @@ public:
|
|||||||
TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc&);
|
TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc&);
|
||||||
TIntermAggregate* makeAggregate(TIntermNode* node);
|
TIntermAggregate* makeAggregate(TIntermNode* node);
|
||||||
TIntermAggregate* makeAggregate(TIntermNode* node, const TSourceLoc&);
|
TIntermAggregate* makeAggregate(TIntermNode* node, const TSourceLoc&);
|
||||||
|
TIntermAggregate* makeAggregate(const TSourceLoc&);
|
||||||
TIntermTyped* setAggregateOperator(TIntermNode*, TOperator, const TType& type, TSourceLoc);
|
TIntermTyped* setAggregateOperator(TIntermNode*, TOperator, const TType& type, TSourceLoc);
|
||||||
bool areAllChildConst(TIntermAggregate* aggrNode);
|
bool areAllChildConst(TIntermAggregate* aggrNode);
|
||||||
TIntermNode* addSelection(TIntermTyped* cond, TIntermNodePair code, const TSourceLoc&);
|
TIntermNode* addSelection(TIntermTyped* cond, TIntermNodePair code, const TSourceLoc&);
|
||||||
|
|||||||
@ -157,6 +157,7 @@ INSTANTIATE_TEST_CASE_P(
|
|||||||
{"hlsl.numericsuffixes.frag", "main"},
|
{"hlsl.numericsuffixes.frag", "main"},
|
||||||
{"hlsl.numthreads.comp", "main_aux1"},
|
{"hlsl.numthreads.comp", "main_aux1"},
|
||||||
{"hlsl.overload.frag", "PixelShaderFunction"},
|
{"hlsl.overload.frag", "PixelShaderFunction"},
|
||||||
|
{"hlsl.partialInit.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.pp.line.frag", "main"},
|
{"hlsl.pp.line.frag", "main"},
|
||||||
{"hlsl.precise.frag", "main"},
|
{"hlsl.precise.frag", "main"},
|
||||||
{"hlsl.promote.binary.frag", "main"},
|
{"hlsl.promote.binary.frag", "main"},
|
||||||
|
|||||||
@ -1896,7 +1896,8 @@ bool HlslGrammar::acceptExpression(TIntermTyped*& node)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// initializer
|
// initializer
|
||||||
// : LEFT_BRACE initializer_list RIGHT_BRACE
|
// : LEFT_BRACE RIGHT_BRACE
|
||||||
|
// | LEFT_BRACE initializer_list RIGHT_BRACE
|
||||||
//
|
//
|
||||||
// initializer_list
|
// initializer_list
|
||||||
// : assignment_expression COMMA assignment_expression COMMA ...
|
// : assignment_expression COMMA assignment_expression COMMA ...
|
||||||
@ -1907,8 +1908,15 @@ bool HlslGrammar::acceptInitializer(TIntermTyped*& node)
|
|||||||
if (! acceptTokenClass(EHTokLeftBrace))
|
if (! acceptTokenClass(EHTokLeftBrace))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// initializer_list
|
// RIGHT_BRACE
|
||||||
TSourceLoc loc = token.loc;
|
TSourceLoc loc = token.loc;
|
||||||
|
if (acceptTokenClass(EHTokRightBrace)) {
|
||||||
|
// a zero-length initializer list
|
||||||
|
node = intermediate.makeAggregate(loc);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// initializer_list
|
||||||
node = nullptr;
|
node = nullptr;
|
||||||
do {
|
do {
|
||||||
// assignment_expression
|
// assignment_expression
|
||||||
|
|||||||
@ -4594,7 +4594,8 @@ TIntermNode* HlslParseContext::executeInitializer(const TSourceLoc& loc, TInterm
|
|||||||
// constructor-style subtree, allowing the rest of the code to operate
|
// constructor-style subtree, allowing the rest of the code to operate
|
||||||
// identically for both kinds of initializers.
|
// identically for both kinds of initializers.
|
||||||
//
|
//
|
||||||
initializer = convertInitializerList(loc, variable->getType(), initializer);
|
if (initializer->getAsAggregate() && initializer->getAsAggregate()->getOp() == EOpNull)
|
||||||
|
initializer = convertInitializerList(loc, variable->getType(), initializer);
|
||||||
if (! initializer) {
|
if (! initializer) {
|
||||||
// error recovery; don't leave const without constant values
|
// error recovery; don't leave const without constant values
|
||||||
if (qualifier == EvqConst)
|
if (qualifier == EvqConst)
|
||||||
@ -4679,8 +4680,15 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
|
|||||||
|
|
||||||
// see if we have bottomed out in the tree within the initializer-list part
|
// see if we have bottomed out in the tree within the initializer-list part
|
||||||
TIntermAggregate* initList = initializer->getAsAggregate();
|
TIntermAggregate* initList = initializer->getAsAggregate();
|
||||||
if (! initList || initList->getOp() != EOpNull)
|
if (! initList || initList->getOp() != EOpNull) {
|
||||||
return initializer;
|
// We don't have a list, but if it's a scalar and the 'type' is a
|
||||||
|
// composite, we need to lengthen below to make it useful.
|
||||||
|
// Otherwise, this is an already formed object to initialize with.
|
||||||
|
if (type.isScalar() || !initializer->getType().isScalar())
|
||||||
|
return initializer;
|
||||||
|
else
|
||||||
|
initList = intermediate.makeAggregate(initializer);
|
||||||
|
}
|
||||||
|
|
||||||
// Of the initializer-list set of nodes, need to process bottom up,
|
// Of the initializer-list set of nodes, need to process bottom up,
|
||||||
// so recurse deep, then process on the way up.
|
// so recurse deep, then process on the way up.
|
||||||
@ -4694,7 +4702,8 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
|
|||||||
arrayType.newArraySizes(*type.getArraySizes()); // but get a fresh copy of the array information, to edit below
|
arrayType.newArraySizes(*type.getArraySizes()); // but get a fresh copy of the array information, to edit below
|
||||||
|
|
||||||
// edit array sizes to fill in unsized dimensions
|
// edit array sizes to fill in unsized dimensions
|
||||||
arrayType.changeOuterArraySize((int)initList->getSequence().size());
|
if (type.isImplicitlySizedArray())
|
||||||
|
arrayType.changeOuterArraySize((int)initList->getSequence().size());
|
||||||
TIntermTyped* firstInit = initList->getSequence()[0]->getAsTyped();
|
TIntermTyped* firstInit = initList->getSequence()[0]->getAsTyped();
|
||||||
if (arrayType.isArrayOfArrays() && firstInit->getType().isArray() &&
|
if (arrayType.isArrayOfArrays() && firstInit->getType().isArray() &&
|
||||||
arrayType.getArraySizes().getNumDims() == firstInit->getType().getArraySizes()->getNumDims() + 1) {
|
arrayType.getArraySizes().getNumDims() == firstInit->getType().getArraySizes()->getNumDims() + 1) {
|
||||||
@ -4704,8 +4713,12 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// lengthen list to be long enough
|
||||||
|
lengthenList(loc, initList->getSequence(), arrayType.getOuterArraySize());
|
||||||
|
|
||||||
|
// recursively process each element
|
||||||
TType elementType(arrayType, 0); // dereferenced type
|
TType elementType(arrayType, 0); // dereferenced type
|
||||||
for (size_t i = 0; i < initList->getSequence().size(); ++i) {
|
for (int i = 0; i < arrayType.getOuterArraySize(); ++i) {
|
||||||
initList->getSequence()[i] = convertInitializerList(loc, elementType, initList->getSequence()[i]->getAsTyped());
|
initList->getSequence()[i] = convertInitializerList(loc, elementType, initList->getSequence()[i]->getAsTyped());
|
||||||
if (initList->getSequence()[i] == nullptr)
|
if (initList->getSequence()[i] == nullptr)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -4713,6 +4726,9 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
|
|||||||
|
|
||||||
return addConstructor(loc, initList, arrayType);
|
return addConstructor(loc, initList, arrayType);
|
||||||
} else if (type.isStruct()) {
|
} else if (type.isStruct()) {
|
||||||
|
// lengthen list to be long enough
|
||||||
|
lengthenList(loc, initList->getSequence(), type.getStruct()->size());
|
||||||
|
|
||||||
if (type.getStruct()->size() != initList->getSequence().size()) {
|
if (type.getStruct()->size() != initList->getSequence().size()) {
|
||||||
error(loc, "wrong number of structure members", "initializer list", "");
|
error(loc, "wrong number of structure members", "initializer list", "");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -4728,6 +4744,9 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
|
|||||||
// a series of rows and columns. We can just use the list directly as
|
// a series of rows and columns. We can just use the list directly as
|
||||||
// a constructor; no further processing needed.
|
// a constructor; no further processing needed.
|
||||||
} else {
|
} else {
|
||||||
|
// lengthen list to be long enough
|
||||||
|
lengthenList(loc, initList->getSequence(), type.getMatrixCols());
|
||||||
|
|
||||||
if (type.getMatrixCols() != (int)initList->getSequence().size()) {
|
if (type.getMatrixCols() != (int)initList->getSequence().size()) {
|
||||||
error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString().c_str());
|
error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString().c_str());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -4740,6 +4759,10 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (type.isVector()) {
|
} else if (type.isVector()) {
|
||||||
|
// lengthen list to be long enough
|
||||||
|
lengthenList(loc, initList->getSequence(), type.getVectorSize());
|
||||||
|
|
||||||
|
// error check; we're at bottom, so work is finished below
|
||||||
if (type.getVectorSize() != (int)initList->getSequence().size()) {
|
if (type.getVectorSize() != (int)initList->getSequence().size()) {
|
||||||
error(loc, "wrong vector size (or rows in a matrix column):", "initializer list", type.getCompleteString().c_str());
|
error(loc, "wrong vector size (or rows in a matrix column):", "initializer list", type.getCompleteString().c_str());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -4749,7 +4772,7 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
|
|||||||
error(loc, "scalar expected one element:", "initializer list", type.getCompleteString().c_str());
|
error(loc, "scalar expected one element:", "initializer list", type.getCompleteString().c_str());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
error(loc, "unexpected initializer-list type:", "initializer list", type.getCompleteString().c_str());
|
error(loc, "unexpected initializer-list type:", "initializer list", type.getCompleteString().c_str());
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -4761,9 +4784,19 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
|
|||||||
emulatedConstructorArguments = initList->getSequence()[0];
|
emulatedConstructorArguments = initList->getSequence()[0];
|
||||||
else
|
else
|
||||||
emulatedConstructorArguments = initList;
|
emulatedConstructorArguments = initList;
|
||||||
|
|
||||||
return addConstructor(loc, emulatedConstructorArguments, type);
|
return addConstructor(loc, emulatedConstructorArguments, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lengthen list to be long enough to cover any gap from the current list size
|
||||||
|
// to 'size'. If the list is longer, do nothing.
|
||||||
|
// The value to lengthen with is the default for short lists.
|
||||||
|
void HlslParseContext::lengthenList(const TSourceLoc& loc, TIntermSequence& list, int size)
|
||||||
|
{
|
||||||
|
for (int c = (int)list.size(); c < size; ++c)
|
||||||
|
list.push_back(intermediate.addConstantUnion(0, loc));
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Test for the correctness of the parameters passed to various constructor functions
|
// Test for the correctness of the parameters passed to various constructor functions
|
||||||
// and also convert them to the right data type, if allowed and required.
|
// and also convert them to the right data type, if allowed and required.
|
||||||
|
|||||||
@ -128,6 +128,7 @@ public:
|
|||||||
const TFunction* findFunction(const TSourceLoc& loc, const TFunction& call, bool& builtIn);
|
const TFunction* findFunction(const TSourceLoc& loc, const TFunction& call, bool& builtIn);
|
||||||
void declareTypedef(const TSourceLoc&, TString& identifier, const TType&, TArraySizes* typeArray = 0);
|
void declareTypedef(const TSourceLoc&, TString& identifier, const TType&, TArraySizes* typeArray = 0);
|
||||||
TIntermNode* declareVariable(const TSourceLoc&, TString& identifier, TType&, TIntermTyped* initializer = 0);
|
TIntermNode* declareVariable(const TSourceLoc&, TString& identifier, TType&, TIntermTyped* initializer = 0);
|
||||||
|
void lengthenList(const TSourceLoc&, TIntermSequence& list, int size);
|
||||||
TIntermTyped* addConstructor(const TSourceLoc&, TIntermNode*, const TType&);
|
TIntermTyped* addConstructor(const TSourceLoc&, TIntermNode*, const TType&);
|
||||||
TIntermTyped* constructAggregate(TIntermNode*, const TType&, int, const TSourceLoc&);
|
TIntermTyped* constructAggregate(TIntermNode*, const TType&, int, const TSourceLoc&);
|
||||||
TIntermTyped* constructBuiltIn(const TType&, TOperator, TIntermTyped*, const TSourceLoc&, bool subset);
|
TIntermTyped* constructBuiltIn(const TType&, TOperator, TIntermTyped*, const TSourceLoc&, bool subset);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user