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
19b92fff
Commit
19b92fff
authored
Jun 19, 2016
by
John Kessenich
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
HLSL: Basic array grammar.
parent
93a162a8
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
255 additions
and
9 deletions
+255
-9
hlsl.array.frag.out
Test/baseResults/hlsl.array.frag.out
+181
-0
hlsl.array.frag
Test/hlsl.array.frag
+12
-0
Hlsl.FromFile.cpp
gtests/Hlsl.FromFile.cpp
+1
-0
hlslGrammar.cpp
hlsl/hlslGrammar.cpp
+59
-8
hlslGrammar.h
hlsl/hlslGrammar.h
+1
-0
hlslOpMap.cpp
hlsl/hlslOpMap.cpp
+1
-1
No files found.
Test/baseResults/hlsl.array.frag.out
0 → 100755
View file @
19b92fff
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
Test/hlsl.array.frag
0 → 100644
View file @
19b92fff
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
gtests/Hlsl.FromFile.cpp
View file @
19b92fff
...
...
@@ -72,6 +72,7 @@ TEST_P(HlslCompileTest, FromFile)
INSTANTIATE_TEST_CASE_P
(
ToSpirv
,
HlslCompileTest
,
::
testing
::
ValuesIn
(
std
::
vector
<
FileNameEntryPointPair
>
{
{
"hlsl.array.frag"
,
"PixelShaderFunction"
},
{
"hlsl.assoc.frag"
,
"PixelShaderFunction"
},
{
"hlsl.attribute.frag"
,
"PixelShaderFunction"
},
{
"hlsl.cast.frag"
,
"PixelShaderFunction"
},
...
...
hlsl/hlslGrammar.cpp
View file @
19b92fff
...
...
@@ -107,8 +107,7 @@ bool HlslGrammar::acceptCompilationUnit()
// declaration
// : SEMICOLON
// : fully_specified_type SEMICOLON
// | fully_specified_type identifier post_decls SEMICOLON
// | fully_specified_type identifier post_decls = expression SEMICOLON
// | fully_specified_type identifier array_specifier post_decls (EQUAL expression)opt SEMICOLON
// | fully_specified_type identifier function_parameters post_decls SEMICOLON // function prototype
// | fully_specified_type identifier function_parameters post_decls compound_statement // function definition
//
...
...
@@ -127,8 +126,14 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node)
// identifier
HlslToken
idToken
;
if
(
acceptIdentifier
(
idToken
))
{
// array_specifier
TArraySizes
*
arraySizes
=
nullptr
;
acceptArraySpecifier
(
arraySizes
);
// post_decls
acceptPostDecls
(
type
);
// = expression
// EQUAL expression
TIntermTyped
*
expressionNode
=
nullptr
;
if
(
acceptTokenClass
(
EHTokAssign
))
{
if
(
!
acceptExpression
(
expressionNode
))
{
...
...
@@ -139,7 +144,7 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node)
// SEMICOLON
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
;
}
...
...
@@ -711,7 +716,10 @@ bool HlslGrammar::acceptStructDeclarationList(TTypeList*& typeList)
advanceToken
();
// array_specifier
// TODO
TArraySizes
*
arraySizes
=
nullptr
;
acceptArraySpecifier
(
arraySizes
);
if
(
arraySizes
)
typeList
->
back
().
type
->
newArraySizes
(
*
arraySizes
);
acceptPostDecls
(
*
member
.
type
);
...
...
@@ -770,7 +778,7 @@ bool HlslGrammar::acceptFunctionParameters(TFunction& function)
// parameter_declaration
// : fully_specified_type post_decls
// | fully_specified_type identifier post_decls
// | fully_specified_type identifier
array_specifier
post_decls
//
bool
HlslGrammar
::
acceptParameterDeclaration
(
TFunction
&
function
)
{
...
...
@@ -783,6 +791,13 @@ bool HlslGrammar::acceptParameterDeclaration(TFunction& function)
HlslToken
idToken
;
acceptIdentifier
(
idToken
);
// array_specifier
TArraySizes
*
arraySizes
=
nullptr
;
acceptArraySpecifier
(
arraySizes
);
if
(
arraySizes
)
type
->
newArraySizes
(
*
arraySizes
);
// post_decls
acceptPostDecls
(
*
type
);
parseContext
.
paramFix
(
*
type
);
...
...
@@ -1098,7 +1113,9 @@ bool HlslGrammar::acceptPostfixExpression(TIntermTyped*& node)
switch
(
postOp
)
{
case
EOpIndexDirectStruct
:
{
// includes swizzles
// DOT IDENTIFIER
// includes swizzles and struct members
// TODO: possibly includes "method" syntax
HlslToken
field
;
if
(
!
acceptIdentifier
(
field
))
{
expected
(
"swizzle or member"
);
...
...
@@ -1109,16 +1126,22 @@ bool HlslGrammar::acceptPostfixExpression(TIntermTyped*& node)
}
case
EOpIndexIndirect
:
{
// LEFT_BRACKET integer_expression RIGHT_BRACKET
TIntermTyped
*
indexNode
=
nullptr
;
if
(
!
acceptExpression
(
indexNode
)
||
!
peekTokenClass
(
EHTokRightBracket
))
{
expected
(
"expression followed by ']'"
);
return
false
;
}
// todo: node = intermediate.addBinaryMath(
advanceToken
();
node
=
parseContext
.
handleBracketDereference
(
indexNode
->
getLoc
(),
node
,
indexNode
);
break
;
}
case
EOpPostIncrement
:
// INC_OP
// fall through
case
EOpPostDecrement
:
// DEC_OP
node
=
intermediate
.
addUnaryMath
(
postOp
,
node
,
loc
);
break
;
default
:
...
...
@@ -1629,6 +1652,34 @@ bool HlslGrammar::acceptCaseLabel(TIntermNode*& statement)
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
// : COLON semantic // optional
// COLON PACKOFFSET LEFT_PAREN ... RIGHT_PAREN // optional
...
...
hlsl/hlslGrammar.h
View file @
19b92fff
...
...
@@ -87,6 +87,7 @@ namespace glslang {
bool
acceptIterationStatement
(
TIntermNode
*&
);
bool
acceptJumpStatement
(
TIntermNode
*&
);
bool
acceptCaseLabel
(
TIntermNode
*&
);
void
acceptArraySpecifier
(
TArraySizes
*&
);
void
acceptPostDecls
(
TType
&
);
HlslParseContext
&
parseContext
;
// state of parsing and helper functions for building the intermediate
...
...
hlsl/hlslOpMap.cpp
View file @
19b92fff
...
...
@@ -113,7 +113,7 @@ TOperator HlslOpMap::postUnary(EHlslTokenClass op)
{
switch
(
op
)
{
case
EHTokDot
:
return
EOpIndexDirectStruct
;
case
EHTokLeftBracket
:
return
EOpIndexIndirect
;
// may need to change later to EOpIndexDirect
case
EHTokLeftBracket
:
return
EOpIndexIndirect
;
case
EHTokIncOp
:
return
EOpPostIncrement
;
case
EHTokDecOp
:
return
EOpPostDecrement
;
...
...
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