HLSL: Basic array grammar.
This commit is contained in:
parent
93a162a857
commit
19b92fff7e
181
Test/baseResults/hlsl.array.frag.out
Executable file
181
Test/baseResults/hlsl.array.frag.out
Executable file
@ -0,0 +1,181 @@
|
|||||||
|
hlsl.array.frag
|
||||||
|
Shader version: 450
|
||||||
|
gl_FragCoord origin is upper left
|
||||||
|
0:? Sequence
|
||||||
|
0:11 Function Definition: PixelShaderFunction(i1;vf4[3]; (temp 4-component vector of float)
|
||||||
|
0:8 Function Parameters:
|
||||||
|
0:8 'i' (in int)
|
||||||
|
0:8 'input' (in 3-element array of 4-component vector of float)
|
||||||
|
0:? Sequence
|
||||||
|
0:10 Branch: Return with expression
|
||||||
|
0:10 add (temp 4-component vector of float)
|
||||||
|
0:10 add (temp 4-component vector of float)
|
||||||
|
0:10 add (temp 4-component vector of float)
|
||||||
|
0:10 direct index (temp 4-component vector of float)
|
||||||
|
0:10 'a' (temp 4-element array of 4-component vector of float)
|
||||||
|
0:10 Constant:
|
||||||
|
0:10 1 (const int)
|
||||||
|
0:10 indirect index (temp 4-component vector of float)
|
||||||
|
0:10 'a' (temp 4-element array of 4-component vector of float)
|
||||||
|
0:10 'i' (in int)
|
||||||
|
0:10 add (temp 4-component vector of float)
|
||||||
|
0:10 direct index (temp 4-component vector of float)
|
||||||
|
0:10 'input' (in 3-element array of 4-component vector of float)
|
||||||
|
0:10 Constant:
|
||||||
|
0:10 2 (const int)
|
||||||
|
0:10 indirect index (temp 4-component vector of float)
|
||||||
|
0:10 'input' (in 3-element array of 4-component vector of float)
|
||||||
|
0:10 'i' (in int)
|
||||||
|
0:10 add (temp 4-component vector of float)
|
||||||
|
0:10 add (temp 4-component vector of float)
|
||||||
|
0:10 direct index (temp 4-component vector of float)
|
||||||
|
0:10 'b' (temp 10-element array of 4-component vector of float)
|
||||||
|
0:10 Constant:
|
||||||
|
0:10 5 (const int)
|
||||||
|
0:10 indirect index (temp 4-component vector of float)
|
||||||
|
0:10 'b' (temp 10-element array of 4-component vector of float)
|
||||||
|
0:10 'i' (in int)
|
||||||
|
0:10 indirect index (temp 4-component vector of float)
|
||||||
|
0:10 m: direct index for structure (temp 7-element array of 4-component vector of float)
|
||||||
|
0:10 indirect index (temp structure{temp 7-element array of 4-component vector of float m})
|
||||||
|
0:10 's' (temp 11-element array of structure{temp 7-element array of 4-component vector of float m})
|
||||||
|
0:10 'i' (in int)
|
||||||
|
0:10 Constant:
|
||||||
|
0:10 0 (const int)
|
||||||
|
0:10 'i' (in int)
|
||||||
|
0:? Linker Objects
|
||||||
|
0:? 'a' (temp 4-element array of 4-component vector of float)
|
||||||
|
0:? 's' (temp 11-element array of structure{temp 7-element array of 4-component vector of float m})
|
||||||
|
|
||||||
|
|
||||||
|
Linked fragment stage:
|
||||||
|
|
||||||
|
|
||||||
|
Shader version: 450
|
||||||
|
gl_FragCoord origin is upper left
|
||||||
|
0:? Sequence
|
||||||
|
0:11 Function Definition: PixelShaderFunction(i1;vf4[3]; (temp 4-component vector of float)
|
||||||
|
0:8 Function Parameters:
|
||||||
|
0:8 'i' (in int)
|
||||||
|
0:8 'input' (in 3-element array of 4-component vector of float)
|
||||||
|
0:? Sequence
|
||||||
|
0:10 Branch: Return with expression
|
||||||
|
0:10 add (temp 4-component vector of float)
|
||||||
|
0:10 add (temp 4-component vector of float)
|
||||||
|
0:10 add (temp 4-component vector of float)
|
||||||
|
0:10 direct index (temp 4-component vector of float)
|
||||||
|
0:10 'a' (temp 4-element array of 4-component vector of float)
|
||||||
|
0:10 Constant:
|
||||||
|
0:10 1 (const int)
|
||||||
|
0:10 indirect index (temp 4-component vector of float)
|
||||||
|
0:10 'a' (temp 4-element array of 4-component vector of float)
|
||||||
|
0:10 'i' (in int)
|
||||||
|
0:10 add (temp 4-component vector of float)
|
||||||
|
0:10 direct index (temp 4-component vector of float)
|
||||||
|
0:10 'input' (in 3-element array of 4-component vector of float)
|
||||||
|
0:10 Constant:
|
||||||
|
0:10 2 (const int)
|
||||||
|
0:10 indirect index (temp 4-component vector of float)
|
||||||
|
0:10 'input' (in 3-element array of 4-component vector of float)
|
||||||
|
0:10 'i' (in int)
|
||||||
|
0:10 add (temp 4-component vector of float)
|
||||||
|
0:10 add (temp 4-component vector of float)
|
||||||
|
0:10 direct index (temp 4-component vector of float)
|
||||||
|
0:10 'b' (temp 10-element array of 4-component vector of float)
|
||||||
|
0:10 Constant:
|
||||||
|
0:10 5 (const int)
|
||||||
|
0:10 indirect index (temp 4-component vector of float)
|
||||||
|
0:10 'b' (temp 10-element array of 4-component vector of float)
|
||||||
|
0:10 'i' (in int)
|
||||||
|
0:10 indirect index (temp 4-component vector of float)
|
||||||
|
0:10 m: direct index for structure (temp 7-element array of 4-component vector of float)
|
||||||
|
0:10 indirect index (temp structure{temp 7-element array of 4-component vector of float m})
|
||||||
|
0:10 's' (temp 11-element array of structure{temp 7-element array of 4-component vector of float m})
|
||||||
|
0:10 'i' (in int)
|
||||||
|
0:10 Constant:
|
||||||
|
0:10 0 (const int)
|
||||||
|
0:10 'i' (in int)
|
||||||
|
0:? Linker Objects
|
||||||
|
0:? 'a' (temp 4-element array of 4-component vector of float)
|
||||||
|
0:? 's' (temp 11-element array of structure{temp 7-element array of 4-component vector of float m})
|
||||||
|
|
||||||
|
// Module Version 10000
|
||||||
|
// Generated by (magic number): 80001
|
||||||
|
// Id's are bound by 63
|
||||||
|
|
||||||
|
Capability Shader
|
||||||
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
MemoryModel Logical GLSL450
|
||||||
|
EntryPoint Fragment 4 "PixelShaderFunction" 19 27
|
||||||
|
ExecutionMode 4 OriginUpperLeft
|
||||||
|
Source HLSL 450
|
||||||
|
Name 4 "PixelShaderFunction"
|
||||||
|
Name 12 "a"
|
||||||
|
Name 19 "i"
|
||||||
|
Name 27 "input"
|
||||||
|
Name 40 "b"
|
||||||
|
Name 50 ""
|
||||||
|
MemberName 50 0 "m"
|
||||||
|
Name 54 "s"
|
||||||
|
2: TypeVoid
|
||||||
|
3: TypeFunction 2
|
||||||
|
6: TypeFloat 32
|
||||||
|
7: TypeVector 6(float) 4
|
||||||
|
8: TypeInt 32 0
|
||||||
|
9: 8(int) Constant 4
|
||||||
|
10: TypeArray 7(fvec4) 9
|
||||||
|
11: TypePointer Function 10
|
||||||
|
13: TypeInt 32 1
|
||||||
|
14: 13(int) Constant 1
|
||||||
|
15: TypePointer Function 7(fvec4)
|
||||||
|
18: TypePointer Input 13(int)
|
||||||
|
19(i): 18(ptr) Variable Input
|
||||||
|
24: 8(int) Constant 3
|
||||||
|
25: TypeArray 7(fvec4) 24
|
||||||
|
26: TypePointer Input 25
|
||||||
|
27(input): 26(ptr) Variable Input
|
||||||
|
28: 13(int) Constant 2
|
||||||
|
29: TypePointer Input 7(fvec4)
|
||||||
|
37: 8(int) Constant 10
|
||||||
|
38: TypeArray 7(fvec4) 37
|
||||||
|
39: TypePointer Function 38
|
||||||
|
41: 13(int) Constant 5
|
||||||
|
48: 8(int) Constant 7
|
||||||
|
49: TypeArray 7(fvec4) 48
|
||||||
|
50: TypeStruct 49
|
||||||
|
51: 8(int) Constant 11
|
||||||
|
52: TypeArray 50(struct) 51
|
||||||
|
53: TypePointer Function 52
|
||||||
|
56: 13(int) Constant 0
|
||||||
|
4(PixelShaderFunction): 2 Function None 3
|
||||||
|
5: Label
|
||||||
|
12(a): 11(ptr) Variable Function
|
||||||
|
40(b): 39(ptr) Variable Function
|
||||||
|
54(s): 53(ptr) Variable Function
|
||||||
|
16: 15(ptr) AccessChain 12(a) 14
|
||||||
|
17: 7(fvec4) Load 16
|
||||||
|
20: 13(int) Load 19(i)
|
||||||
|
21: 15(ptr) AccessChain 12(a) 20
|
||||||
|
22: 7(fvec4) Load 21
|
||||||
|
23: 7(fvec4) FAdd 17 22
|
||||||
|
30: 29(ptr) AccessChain 27(input) 28
|
||||||
|
31: 7(fvec4) Load 30
|
||||||
|
32: 13(int) Load 19(i)
|
||||||
|
33: 29(ptr) AccessChain 27(input) 32
|
||||||
|
34: 7(fvec4) Load 33
|
||||||
|
35: 7(fvec4) FAdd 31 34
|
||||||
|
36: 7(fvec4) FAdd 23 35
|
||||||
|
42: 15(ptr) AccessChain 40(b) 41
|
||||||
|
43: 7(fvec4) Load 42
|
||||||
|
44: 13(int) Load 19(i)
|
||||||
|
45: 15(ptr) AccessChain 40(b) 44
|
||||||
|
46: 7(fvec4) Load 45
|
||||||
|
47: 7(fvec4) FAdd 43 46
|
||||||
|
55: 13(int) Load 19(i)
|
||||||
|
57: 13(int) Load 19(i)
|
||||||
|
58: 15(ptr) AccessChain 54(s) 55 56 57
|
||||||
|
59: 7(fvec4) Load 58
|
||||||
|
60: 7(fvec4) FAdd 47 59
|
||||||
|
61: 7(fvec4) FAdd 36 60
|
||||||
|
ReturnValue 61
|
||||||
|
FunctionEnd
|
11
Test/hlsl.array.frag
Normal file
11
Test/hlsl.array.frag
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
float4 a[4];
|
||||||
|
|
||||||
|
struct {
|
||||||
|
float4 m[7];
|
||||||
|
} s[11];
|
||||||
|
|
||||||
|
float4 PixelShaderFunction(int i, float4 input[3]) : COLOR0
|
||||||
|
{
|
||||||
|
float4 b[10];
|
||||||
|
return a[1] + a[i] + input[2] + input[i] + b[5] + b[i] + s[i].m[i];
|
||||||
|
}
|
@ -72,6 +72,7 @@ TEST_P(HlslCompileTest, FromFile)
|
|||||||
INSTANTIATE_TEST_CASE_P(
|
INSTANTIATE_TEST_CASE_P(
|
||||||
ToSpirv, HlslCompileTest,
|
ToSpirv, HlslCompileTest,
|
||||||
::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
|
::testing::ValuesIn(std::vector<FileNameEntryPointPair>{
|
||||||
|
{"hlsl.array.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.assoc.frag", "PixelShaderFunction"},
|
{"hlsl.assoc.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.attribute.frag", "PixelShaderFunction"},
|
{"hlsl.attribute.frag", "PixelShaderFunction"},
|
||||||
{"hlsl.cast.frag", "PixelShaderFunction"},
|
{"hlsl.cast.frag", "PixelShaderFunction"},
|
||||||
|
@ -107,8 +107,7 @@ bool HlslGrammar::acceptCompilationUnit()
|
|||||||
// declaration
|
// declaration
|
||||||
// : SEMICOLON
|
// : SEMICOLON
|
||||||
// : fully_specified_type SEMICOLON
|
// : fully_specified_type SEMICOLON
|
||||||
// | fully_specified_type identifier post_decls SEMICOLON
|
// | fully_specified_type identifier array_specifier post_decls (EQUAL expression)opt SEMICOLON
|
||||||
// | fully_specified_type identifier post_decls = expression SEMICOLON
|
|
||||||
// | fully_specified_type identifier function_parameters post_decls SEMICOLON // function prototype
|
// | fully_specified_type identifier function_parameters post_decls SEMICOLON // function prototype
|
||||||
// | fully_specified_type identifier function_parameters post_decls compound_statement // function definition
|
// | fully_specified_type identifier function_parameters post_decls compound_statement // function definition
|
||||||
//
|
//
|
||||||
@ -127,8 +126,14 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node)
|
|||||||
// identifier
|
// identifier
|
||||||
HlslToken idToken;
|
HlslToken idToken;
|
||||||
if (acceptIdentifier(idToken)) {
|
if (acceptIdentifier(idToken)) {
|
||||||
|
// array_specifier
|
||||||
|
TArraySizes* arraySizes = nullptr;
|
||||||
|
acceptArraySpecifier(arraySizes);
|
||||||
|
|
||||||
|
// post_decls
|
||||||
acceptPostDecls(type);
|
acceptPostDecls(type);
|
||||||
// = expression
|
|
||||||
|
// EQUAL expression
|
||||||
TIntermTyped* expressionNode = nullptr;
|
TIntermTyped* expressionNode = nullptr;
|
||||||
if (acceptTokenClass(EHTokAssign)) {
|
if (acceptTokenClass(EHTokAssign)) {
|
||||||
if (! acceptExpression(expressionNode)) {
|
if (! acceptExpression(expressionNode)) {
|
||||||
@ -139,7 +144,7 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node)
|
|||||||
|
|
||||||
// SEMICOLON
|
// SEMICOLON
|
||||||
if (acceptTokenClass(EHTokSemicolon)) {
|
if (acceptTokenClass(EHTokSemicolon)) {
|
||||||
node = parseContext.declareVariable(idToken.loc, *idToken.string, type, 0, expressionNode);
|
node = parseContext.declareVariable(idToken.loc, *idToken.string, type, arraySizes, expressionNode);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -711,7 +716,10 @@ bool HlslGrammar::acceptStructDeclarationList(TTypeList*& typeList)
|
|||||||
advanceToken();
|
advanceToken();
|
||||||
|
|
||||||
// array_specifier
|
// array_specifier
|
||||||
// TODO
|
TArraySizes* arraySizes = nullptr;
|
||||||
|
acceptArraySpecifier(arraySizes);
|
||||||
|
if (arraySizes)
|
||||||
|
typeList->back().type->newArraySizes(*arraySizes);
|
||||||
|
|
||||||
acceptPostDecls(*member.type);
|
acceptPostDecls(*member.type);
|
||||||
|
|
||||||
@ -770,7 +778,7 @@ bool HlslGrammar::acceptFunctionParameters(TFunction& function)
|
|||||||
|
|
||||||
// parameter_declaration
|
// parameter_declaration
|
||||||
// : fully_specified_type post_decls
|
// : fully_specified_type post_decls
|
||||||
// | fully_specified_type identifier post_decls
|
// | fully_specified_type identifier array_specifier post_decls
|
||||||
//
|
//
|
||||||
bool HlslGrammar::acceptParameterDeclaration(TFunction& function)
|
bool HlslGrammar::acceptParameterDeclaration(TFunction& function)
|
||||||
{
|
{
|
||||||
@ -783,6 +791,13 @@ bool HlslGrammar::acceptParameterDeclaration(TFunction& function)
|
|||||||
HlslToken idToken;
|
HlslToken idToken;
|
||||||
acceptIdentifier(idToken);
|
acceptIdentifier(idToken);
|
||||||
|
|
||||||
|
// array_specifier
|
||||||
|
TArraySizes* arraySizes = nullptr;
|
||||||
|
acceptArraySpecifier(arraySizes);
|
||||||
|
if (arraySizes)
|
||||||
|
type->newArraySizes(*arraySizes);
|
||||||
|
|
||||||
|
// post_decls
|
||||||
acceptPostDecls(*type);
|
acceptPostDecls(*type);
|
||||||
|
|
||||||
parseContext.paramFix(*type);
|
parseContext.paramFix(*type);
|
||||||
@ -1098,7 +1113,9 @@ bool HlslGrammar::acceptPostfixExpression(TIntermTyped*& node)
|
|||||||
switch (postOp) {
|
switch (postOp) {
|
||||||
case EOpIndexDirectStruct:
|
case EOpIndexDirectStruct:
|
||||||
{
|
{
|
||||||
// includes swizzles
|
// DOT IDENTIFIER
|
||||||
|
// includes swizzles and struct members
|
||||||
|
// TODO: possibly includes "method" syntax
|
||||||
HlslToken field;
|
HlslToken field;
|
||||||
if (! acceptIdentifier(field)) {
|
if (! acceptIdentifier(field)) {
|
||||||
expected("swizzle or member");
|
expected("swizzle or member");
|
||||||
@ -1109,16 +1126,22 @@ bool HlslGrammar::acceptPostfixExpression(TIntermTyped*& node)
|
|||||||
}
|
}
|
||||||
case EOpIndexIndirect:
|
case EOpIndexIndirect:
|
||||||
{
|
{
|
||||||
|
// LEFT_BRACKET integer_expression RIGHT_BRACKET
|
||||||
TIntermTyped* indexNode = nullptr;
|
TIntermTyped* indexNode = nullptr;
|
||||||
if (! acceptExpression(indexNode) ||
|
if (! acceptExpression(indexNode) ||
|
||||||
! peekTokenClass(EHTokRightBracket)) {
|
! peekTokenClass(EHTokRightBracket)) {
|
||||||
expected("expression followed by ']'");
|
expected("expression followed by ']'");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// todo: node = intermediate.addBinaryMath(
|
advanceToken();
|
||||||
|
node = parseContext.handleBracketDereference(indexNode->getLoc(), node, indexNode);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case EOpPostIncrement:
|
case EOpPostIncrement:
|
||||||
|
// INC_OP
|
||||||
|
// fall through
|
||||||
case EOpPostDecrement:
|
case EOpPostDecrement:
|
||||||
|
// DEC_OP
|
||||||
node = intermediate.addUnaryMath(postOp, node, loc);
|
node = intermediate.addUnaryMath(postOp, node, loc);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -1629,6 +1652,34 @@ bool HlslGrammar::acceptCaseLabel(TIntermNode*& statement)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// array_specifier
|
||||||
|
// : LEFT_BRACKET integer_expression RGHT_BRACKET post_decls // optional
|
||||||
|
//
|
||||||
|
void HlslGrammar::acceptArraySpecifier(TArraySizes*& arraySizes)
|
||||||
|
{
|
||||||
|
arraySizes = nullptr;
|
||||||
|
|
||||||
|
if (! acceptTokenClass(EHTokLeftBracket))
|
||||||
|
return;
|
||||||
|
|
||||||
|
TSourceLoc loc = token.loc;
|
||||||
|
TIntermTyped* sizeExpr;
|
||||||
|
if (! acceptAssignmentExpression(sizeExpr)) {
|
||||||
|
expected("array-sizing expression");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! acceptTokenClass(EHTokRightBracket)) {
|
||||||
|
expected("]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
TArraySize arraySize;
|
||||||
|
parseContext.arraySizeCheck(loc, sizeExpr, arraySize);
|
||||||
|
arraySizes = new TArraySizes;
|
||||||
|
arraySizes->addInnerSize(arraySize);
|
||||||
|
}
|
||||||
|
|
||||||
// post_decls
|
// post_decls
|
||||||
// : COLON semantic // optional
|
// : COLON semantic // optional
|
||||||
// COLON PACKOFFSET LEFT_PAREN ... RIGHT_PAREN // optional
|
// COLON PACKOFFSET LEFT_PAREN ... RIGHT_PAREN // optional
|
||||||
|
@ -87,6 +87,7 @@ namespace glslang {
|
|||||||
bool acceptIterationStatement(TIntermNode*&);
|
bool acceptIterationStatement(TIntermNode*&);
|
||||||
bool acceptJumpStatement(TIntermNode*&);
|
bool acceptJumpStatement(TIntermNode*&);
|
||||||
bool acceptCaseLabel(TIntermNode*&);
|
bool acceptCaseLabel(TIntermNode*&);
|
||||||
|
void acceptArraySpecifier(TArraySizes*&);
|
||||||
void acceptPostDecls(TType&);
|
void acceptPostDecls(TType&);
|
||||||
|
|
||||||
HlslParseContext& parseContext; // state of parsing and helper functions for building the intermediate
|
HlslParseContext& parseContext; // state of parsing and helper functions for building the intermediate
|
||||||
|
@ -113,7 +113,7 @@ TOperator HlslOpMap::postUnary(EHlslTokenClass op)
|
|||||||
{
|
{
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case EHTokDot: return EOpIndexDirectStruct;
|
case EHTokDot: return EOpIndexDirectStruct;
|
||||||
case EHTokLeftBracket: return EOpIndexIndirect; // may need to change later to EOpIndexDirect
|
case EHTokLeftBracket: return EOpIndexIndirect;
|
||||||
|
|
||||||
case EHTokIncOp: return EOpPostIncrement;
|
case EHTokIncOp: return EOpPostIncrement;
|
||||||
case EHTokDecOp: return EOpPostDecrement;
|
case EHTokDecOp: return EOpPostDecrement;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user