Skip to content
Snippets Groups Projects
Commit 19b92fff authored by John Kessenich's avatar John Kessenich
Browse files

HLSL: Basic array grammar.

parent 93a162a8
No related branches found
No related tags found
No related merge requests found
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
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];
}
\ No newline at end of file
...@@ -72,6 +72,7 @@ TEST_P(HlslCompileTest, FromFile) ...@@ -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() ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 { ...@@ -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) ...@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment