Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
glslang
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Chen Yisong
glslang
Commits
98ad4853
Commit
98ad4853
authored
Nov 27, 2016
by
John Kessenich
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
HLSL: Support {...} initializer lists that are too short.
parent
1c989040
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
394 additions
and
5 deletions
+394
-5
hlsl.partialInit.frag.out
Test/baseResults/hlsl.partialInit.frag.out
+310
-0
hlsl.partialInit.frag
Test/hlsl.partialInit.frag
+23
-0
revision.h
glslang/Include/revision.h
+1
-1
Intermediate.cpp
glslang/MachineIndependent/Intermediate.cpp
+12
-0
localintermediate.h
glslang/MachineIndependent/localintermediate.h
+1
-0
Hlsl.FromFile.cpp
gtests/Hlsl.FromFile.cpp
+1
-0
hlslGrammar.cpp
hlsl/hlslGrammar.cpp
+10
-2
hlslParseHelper.cpp
hlsl/hlslParseHelper.cpp
+35
-2
hlslParseHelper.h
hlsl/hlslParseHelper.h
+1
-0
No files found.
Test/baseResults/hlsl.partialInit.frag.out
0 → 100755
View file @
98ad4853
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
Test/hlsl.partialInit.frag
0 → 100755
View file @
98ad4853
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
;
}
\ No newline at end of file
glslang/Include/revision.h
View file @
98ad4853
...
@@ -2,5 +2,5 @@
...
@@ -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.166
4
"
#define GLSLANG_REVISION "Overload400-PrecQual.166
5
"
#define GLSLANG_DATE "27-Nov-2016"
#define GLSLANG_DATE "27-Nov-2016"
glslang/MachineIndependent/Intermediate.cpp
View file @
98ad4853
...
@@ -858,6 +858,7 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat
...
@@ -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
;
...
@@ -1185,6 +1186,17 @@ TIntermAggregate* TIntermediate::makeAggregate(TIntermNode* node, const TSourceL
...
@@ -1185,6 +1186,17 @@ TIntermAggregate* TIntermediate::makeAggregate(TIntermNode* node, const TSourceL
}
}
//
//
// 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
// nodePair.
// nodePair.
...
...
glslang/MachineIndependent/localintermediate.h
View file @
98ad4853
...
@@ -221,6 +221,7 @@ public:
...
@@ -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
&
);
...
...
gtests/Hlsl.FromFile.cpp
View file @
98ad4853
...
@@ -157,6 +157,7 @@ INSTANTIATE_TEST_CASE_P(
...
@@ -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"
},
...
...
hlsl/hlslGrammar.cpp
View file @
98ad4853
...
@@ -1896,7 +1896,8 @@ bool HlslGrammar::acceptExpression(TIntermTyped*& node)
...
@@ -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)
...
@@ -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
...
...
hlsl/hlslParseHelper.cpp
View file @
98ad4853
...
@@ -4594,6 +4594,7 @@ TIntermNode* HlslParseContext::executeInitializer(const TSourceLoc& loc, TInterm
...
@@ -4594,6 +4594,7 @@ 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.
//
//
if
(
initializer
->
getAsAggregate
()
&&
initializer
->
getAsAggregate
()
->
getOp
()
==
EOpNull
)
initializer
=
convertInitializerList
(
loc
,
variable
->
getType
(),
initializer
);
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
...
@@ -4679,8 +4680,15 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
...
@@ -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
)
{
// 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
;
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,6 +4702,7 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
...
@@ -4694,6 +4702,7 @@ 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
if
(
type
.
isImplicitlySizedArray
())
arrayType
.
changeOuterArraySize
((
int
)
initList
->
getSequence
().
size
());
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
()
&&
...
@@ -4704,8 +4713,12 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
...
@@ -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
().
s
ize
();
++
i
)
{
for
(
int
i
=
0
;
i
<
arrayType
.
getOuterArrayS
ize
();
++
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
...
@@ -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
...
@@ -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
...
@@ -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
;
...
@@ -4761,9 +4784,19 @@ TIntermTyped* HlslParseContext::convertInitializerList(const TSourceLoc& loc, co
...
@@ -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.
...
...
hlsl/hlslParseHelper.h
View file @
98ad4853
...
@@ -128,6 +128,7 @@ public:
...
@@ -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
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment