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
630dd7da
Commit
630dd7da
authored
Jun 12, 2016
by
John Kessenich
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
HLSL: Flesh out misc. declaration grammar: semantics/registers/annotations/precise/etc.
Details within these bear even more fleshing out, but would like to have that driven by actual need.
parent
e6e7494e
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
274 additions
and
80 deletions
+274
-80
hlsl.float4.frag.out
Test/baseResults/hlsl.float4.frag.out
+35
-15
hlsl.struct.frag.out
Test/baseResults/hlsl.struct.frag.out
+55
-29
hlsl.float4.frag
Test/hlsl.float4.frag
+5
-0
hlsl.struct.frag
Test/hlsl.struct.frag
+14
-0
hlslGrammar.cpp
hlsl/hlslGrammar.cpp
+129
-34
hlslGrammar.h
hlsl/hlslGrammar.h
+1
-2
hlslParseHelper.cpp
hlsl/hlslParseHelper.cpp
+32
-0
hlslParseHelper.h
hlsl/hlslParseHelper.h
+1
-0
hlslScanContext.cpp
hlsl/hlslScanContext.cpp
+1
-0
hlslTokens.h
hlsl/hlslTokens.h
+1
-0
No files found.
Test/baseResults/hlsl.float4.frag.out
View file @
630dd7da
...
@@ -9,16 +9,20 @@ gl_FragCoord origin is upper left
...
@@ -9,16 +9,20 @@ gl_FragCoord origin is upper left
0:? 0.500000
0:? 0.500000
0:? 0.000000
0:? 0.000000
0:? 1.000000
0:? 1.000000
0:
7
Function Definition: ShaderFunction(vf4; (temp 4-component vector of float)
0:
12
Function Definition: ShaderFunction(vf4; (temp 4-component vector of float)
0:
4
Function Parameters:
0:
9
Function Parameters:
0:
4
'input' (temp 4-component vector of float)
0:
9
'input' (temp 4-component vector of float)
0:? Sequence
0:? Sequence
0:
5
Branch: Return with expression
0:
10
Branch: Return with expression
0:
5
component-wise multiply (temp 4-component vector of float)
0:
10
component-wise multiply (temp 4-component vector of float)
0:
5
'input' (temp 4-component vector of float)
0:
10
'input' (temp 4-component vector of float)
0:
5
'AmbientColor' (temp 4-component vector of float)
0:
10
'AmbientColor' (temp 4-component vector of float)
0:? Linker Objects
0:? Linker Objects
0:? 'AmbientColor' (temp 4-component vector of float)
0:? 'AmbientColor' (temp 4-component vector of float)
0:? 'ff1' (temp bool Face)
0:? 'ff2' (temp 4-component vector of float)
0:? 'ff3' (temp 4-component vector of float)
0:? 'ff4' (temp 4-component vector of float FragCoord)
Linked fragment stage:
Linked fragment stage:
...
@@ -34,20 +38,24 @@ gl_FragCoord origin is upper left
...
@@ -34,20 +38,24 @@ gl_FragCoord origin is upper left
0:? 0.500000
0:? 0.500000
0:? 0.000000
0:? 0.000000
0:? 1.000000
0:? 1.000000
0:
7
Function Definition: ShaderFunction(vf4; (temp 4-component vector of float)
0:
12
Function Definition: ShaderFunction(vf4; (temp 4-component vector of float)
0:
4
Function Parameters:
0:
9
Function Parameters:
0:
4
'input' (temp 4-component vector of float)
0:
9
'input' (temp 4-component vector of float)
0:? Sequence
0:? Sequence
0:
5
Branch: Return with expression
0:
10
Branch: Return with expression
0:
5
component-wise multiply (temp 4-component vector of float)
0:
10
component-wise multiply (temp 4-component vector of float)
0:
5
'input' (temp 4-component vector of float)
0:
10
'input' (temp 4-component vector of float)
0:
5
'AmbientColor' (temp 4-component vector of float)
0:
10
'AmbientColor' (temp 4-component vector of float)
0:? Linker Objects
0:? Linker Objects
0:? 'AmbientColor' (temp 4-component vector of float)
0:? 'AmbientColor' (temp 4-component vector of float)
0:? 'ff1' (temp bool Face)
0:? 'ff2' (temp 4-component vector of float)
0:? 'ff3' (temp 4-component vector of float)
0:? 'ff4' (temp 4-component vector of float FragCoord)
// Module Version 10000
// Module Version 10000
// Generated by (magic number): 80001
// Generated by (magic number): 80001
// Id's are bound by
19
// Id's are bound by
25
Capability Shader
Capability Shader
1: ExtInstImport "GLSL.std.450"
1: ExtInstImport "GLSL.std.450"
...
@@ -59,12 +67,20 @@ gl_FragCoord origin is upper left
...
@@ -59,12 +67,20 @@ gl_FragCoord origin is upper left
Name 11 "ShaderFunction(vf4;"
Name 11 "ShaderFunction(vf4;"
Name 10 "input"
Name 10 "input"
Name 14 "AmbientColor"
Name 14 "AmbientColor"
Name 21 "ff1"
Name 22 "ff2"
Name 23 "ff3"
Name 24 "ff4"
Decorate 21(ff1) BuiltIn FrontFacing
Decorate 24(ff4) BuiltIn FragCoord
2: TypeVoid
2: TypeVoid
3: TypeFunction 2
3: TypeFunction 2
6: TypeFloat 32
6: TypeFloat 32
7: TypeVector 6(float) 4
7: TypeVector 6(float) 4
8: TypePointer Function 7(fvec4)
8: TypePointer Function 7(fvec4)
9: TypeFunction 7(fvec4) 8(ptr)
9: TypeFunction 7(fvec4) 8(ptr)
19: TypeBool
20: TypePointer Function 19(bool)
4(PixelShaderFunction): 2 Function None 3
4(PixelShaderFunction): 2 Function None 3
5: Label
5: Label
FunctionEnd
FunctionEnd
...
@@ -72,6 +88,10 @@ gl_FragCoord origin is upper left
...
@@ -72,6 +88,10 @@ gl_FragCoord origin is upper left
10(input): 8(ptr) FunctionParameter
10(input): 8(ptr) FunctionParameter
12: Label
12: Label
14(AmbientColor): 8(ptr) Variable Function
14(AmbientColor): 8(ptr) Variable Function
21(ff1): 20(ptr) Variable Function
22(ff2): 8(ptr) Variable Function
23(ff3): 8(ptr) Variable Function
24(ff4): 8(ptr) Variable Function
13: 7(fvec4) Load 10(input)
13: 7(fvec4) Load 10(input)
15: 7(fvec4) Load 14(AmbientColor)
15: 7(fvec4) Load 14(AmbientColor)
16: 7(fvec4) FMul 13 15
16: 7(fvec4) FMul 13 15
...
...
Test/baseResults/hlsl.struct.frag.out
View file @
630dd7da
...
@@ -2,16 +2,19 @@ hlsl.struct.frag
...
@@ -2,16 +2,19 @@ hlsl.struct.frag
Shader version: 450
Shader version: 450
gl_FragCoord origin is upper left
gl_FragCoord origin is upper left
0:? Sequence
0:? Sequence
0:
26
Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
0:
39
Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
0:
20
Function Parameters:
0:
31
Function Parameters:
0:
20
'input' (temp 4-component vector of float)
0:
31
'input' (temp 4-component vector of float)
0:? Sequence
0:? Sequence
0:25 Compare Equal (temp bool)
0:36 Compare Equal (temp bool)
0:25 's3' (temp structure{temp 3-component vector of bool b3})
0:36 's3' (temp structure{temp 3-component vector of bool b3})
0:25 's3' (temp structure{temp 3-component vector of bool b3})
0:36 's3' (temp structure{temp 3-component vector of bool b3})
0:38 Branch: Return with expression
0:38 'input' (temp 4-component vector of float)
0:? Linker Objects
0:? Linker Objects
0:? 's1' (temp structure{temp bool b, temp bool c, temp 4-component vector of float a, temp 4-component vector of float d})
0:? 's1' (temp structure{temp bool b, temp bool c, temp 4-component vector of float a, temp 4-component vector of float d})
0:? 's2' (temp structure{temp 4-component vector of float i})
0:? 's2' (temp structure{temp 4-component vector of float i})
0:? 's4' (temp structure{smooth in 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool Face ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float FragCoord ff4})
Linked fragment stage:
Linked fragment stage:
...
@@ -20,20 +23,23 @@ Linked fragment stage:
...
@@ -20,20 +23,23 @@ Linked fragment stage:
Shader version: 450
Shader version: 450
gl_FragCoord origin is upper left
gl_FragCoord origin is upper left
0:? Sequence
0:? Sequence
0:
26
Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
0:
39
Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of float)
0:
20
Function Parameters:
0:
31
Function Parameters:
0:
20
'input' (temp 4-component vector of float)
0:
31
'input' (temp 4-component vector of float)
0:? Sequence
0:? Sequence
0:25 Compare Equal (temp bool)
0:36 Compare Equal (temp bool)
0:25 's3' (temp structure{temp 3-component vector of bool b3})
0:36 's3' (temp structure{temp 3-component vector of bool b3})
0:25 's3' (temp structure{temp 3-component vector of bool b3})
0:36 's3' (temp structure{temp 3-component vector of bool b3})
0:38 Branch: Return with expression
0:38 'input' (temp 4-component vector of float)
0:? Linker Objects
0:? Linker Objects
0:? 's1' (temp structure{temp bool b, temp bool c, temp 4-component vector of float a, temp 4-component vector of float d})
0:? 's1' (temp structure{temp bool b, temp bool c, temp 4-component vector of float a, temp 4-component vector of float d})
0:? 's2' (temp structure{temp 4-component vector of float i})
0:? 's2' (temp structure{temp 4-component vector of float i})
0:? 's4' (temp structure{smooth in 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool Face ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float FragCoord ff4})
// Module Version 10000
// Module Version 10000
// Generated by (magic number): 80001
// Generated by (magic number): 80001
// Id's are bound by
25
// Id's are bound by
33
Capability Shader
Capability Shader
1: ExtInstImport "GLSL.std.450"
1: ExtInstImport "GLSL.std.450"
...
@@ -45,15 +51,28 @@ gl_FragCoord origin is upper left
...
@@ -45,15 +51,28 @@ gl_FragCoord origin is upper left
Name 8 "FS"
Name 8 "FS"
MemberName 8(FS) 0 "b3"
MemberName 8(FS) 0 "b3"
Name 10 "s3"
Name 10 "s3"
Name 19 "myS"
Name 20 "input"
MemberName 19(myS) 0 "b"
Name 23 "myS"
MemberName 19(myS) 1 "c"
MemberName 23(myS) 0 "b"
MemberName 19(myS) 2 "a"
MemberName 23(myS) 1 "c"
MemberName 19(myS) 3 "d"
MemberName 23(myS) 2 "a"
Name 21 "s1"
MemberName 23(myS) 3 "d"
Name 22 ""
Name 25 "s1"
MemberName 22 0 "i"
Name 26 ""
Name 24 "s2"
MemberName 26 0 "i"
Name 28 "s2"
Name 30 ""
MemberName 30 0 "a"
MemberName 30 1 "b"
MemberName 30 2 "c"
MemberName 30 3 "d"
MemberName 30 4 "ff1"
MemberName 30 5 "ff2"
MemberName 30 6 "ff3"
MemberName 30 7 "ff4"
Name 32 "s4"
MemberDecorate 30 4 BuiltIn FrontFacing
MemberDecorate 30 7 BuiltIn FragCoord
2: TypeVoid
2: TypeVoid
3: TypeFunction 2
3: TypeFunction 2
6: TypeBool
6: TypeBool
...
@@ -62,20 +81,27 @@ gl_FragCoord origin is upper left
...
@@ -62,20 +81,27 @@ gl_FragCoord origin is upper left
9: TypePointer Function 8(FS)
9: TypePointer Function 8(FS)
17: TypeFloat 32
17: TypeFloat 32
18: TypeVector 17(float) 4
18: TypeVector 17(float) 4
19(myS): TypeStruct 6(bool) 6(bool) 18(fvec4) 18(fvec4)
19: TypePointer Function 18(fvec4)
20: TypePointer Function 19(myS)
23(myS): TypeStruct 6(bool) 6(bool) 18(fvec4) 18(fvec4)
22: TypeStruct 18(fvec4)
24: TypePointer Function 23(myS)
23: TypePointer Function 22(struct)
26: TypeStruct 18(fvec4)
27: TypePointer Function 26(struct)
29: TypeVector 17(float) 2
30: TypeStruct 18(fvec4) 6(bool) 17(float) 29(fvec2) 6(bool) 6(bool) 6(bool) 18(fvec4)
31: TypePointer Function 30(struct)
4(PixelShaderFunction): 2 Function None 3
4(PixelShaderFunction): 2 Function None 3
5: Label
5: Label
10(s3): 9(ptr) Variable Function
10(s3): 9(ptr) Variable Function
21(s1): 20(ptr) Variable Function
20(input): 19(ptr) Variable Function
24(s2): 23(ptr) Variable Function
25(s1): 24(ptr) Variable Function
28(s2): 27(ptr) Variable Function
32(s4): 31(ptr) Variable Function
11: 8(FS) Load 10(s3)
11: 8(FS) Load 10(s3)
12: 8(FS) Load 10(s3)
12: 8(FS) Load 10(s3)
13: 7(bvec3) CompositeExtract 11 0
13: 7(bvec3) CompositeExtract 11 0
14: 7(bvec3) CompositeExtract 12 0
14: 7(bvec3) CompositeExtract 12 0
15: 7(bvec3) LogicalEqual 13 14
15: 7(bvec3) LogicalEqual 13 14
16: 6(bool) All 15
16: 6(bool) All 15
Return
21: 18(fvec4) Load 20(input)
ReturnValue 21
FunctionEnd
FunctionEnd
Test/hlsl.float4.frag
View file @
630dd7da
float4
AmbientColor
=
float4
(
1
,
0
.
5
,
0
,
1
);
float4
AmbientColor
=
float4
(
1
,
0
.
5
,
0
,
1
);
bool
ff1
:
SV_IsFrontFace
;
float4
ff2
:
packoffset
(
c0
.
y
);
float4
ff3
:
packoffset
(
c0
.
y
)
:
register
(
ps_5_0
,
s
[
0
])
;
float4
ff4
:
VPOS
:
packoffset
(
c0
.
y
)
:
register
(
ps_5_0
,
s
[
0
])
<
int
bambam
=
30
;
>
;
float4
ShaderFunction
(
float4
input
)
:
COLOR0
float4
ShaderFunction
(
float4
input
)
:
COLOR0
{
{
return
input
*
AmbientColor
;
return
input
*
AmbientColor
;
...
...
Test/hlsl.struct.frag
View file @
630dd7da
...
@@ -16,6 +16,17 @@ struct {
...
@@ -16,6 +16,17 @@ struct {
float4
i
;
float4
i
;
}
s2
;
}
s2
;
struct
{
linear
float4
a
;
nointerpolation
bool
b
;
noperspective
centroid
float1
c
;
sample
centroid
float2
d
;
bool
ff1
:
SV_IsFrontFace
;
bool
ff2
:
packoffset
(
c0
.
y
);
bool
ff3
:
packoffset
(
c0
.
y
)
:
register
(
ps_5_0
,
s
[
0
])
;
float4
ff4
:
VPOS
:
packoffset
(
c0
.
y
)
:
register
(
ps_5_0
,
s
[
0
])
<
int
bambam
=
30
;
>
;
}
s4
;
float4
PixelShaderFunction
(
float4
input
)
:
COLOR0
float4
PixelShaderFunction
(
float4
input
)
:
COLOR0
{
{
struct
FS
{
struct
FS
{
...
@@ -23,4 +34,6 @@ float4 PixelShaderFunction(float4 input) : COLOR0
...
@@ -23,4 +34,6 @@ float4 PixelShaderFunction(float4 input) : COLOR0
}
s3
;
}
s3
;
s3
==
s3
;
s3
==
s3
;
return
input
;
}
}
\ No newline at end of file
hlsl/hlslGrammar.cpp
View file @
630dd7da
...
@@ -107,10 +107,10 @@ bool HlslGrammar::acceptCompilationUnit()
...
@@ -107,10 +107,10 @@ bool HlslGrammar::acceptCompilationUnit()
// declaration
// declaration
// : SEMICOLON
// : SEMICOLON
// : fully_specified_type SEMICOLON
// : fully_specified_type SEMICOLON
// | fully_specified_type identifier SEMICOLON
// | fully_specified_type identifier
post_decls
SEMICOLON
// | fully_specified_type identifier = expression SEMICOLON
// | fully_specified_type identifier
post_decls
= expression SEMICOLON
// | fully_specified_type identifier function_parameters
SEMICOLON
// function prototype
// | fully_specified_type identifier function_parameters
post_decls SEMICOLON
// function prototype
// | fully_specified_type identifier function_parameters
COLON semantic
compound_statement // function definition
// | fully_specified_type identifier function_parameters
post_decls
compound_statement // function definition
//
//
// 'node' could get created if the declaration creates code, like an initializer
// 'node' could get created if the declaration creates code, like an initializer
// or a function body.
// or a function body.
...
@@ -127,6 +127,7 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node)
...
@@ -127,6 +127,7 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node)
// identifier
// identifier
HlslToken
idToken
;
HlslToken
idToken
;
if
(
acceptIdentifier
(
idToken
))
{
if
(
acceptIdentifier
(
idToken
))
{
acceptPostDecls
(
type
);
// = expression
// = expression
TIntermTyped
*
expressionNode
=
nullptr
;
TIntermTyped
*
expressionNode
=
nullptr
;
if
(
acceptTokenClass
(
EHTokAssign
))
{
if
(
acceptTokenClass
(
EHTokAssign
))
{
...
@@ -145,8 +146,8 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node)
...
@@ -145,8 +146,8 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node)
// function_parameters
// function_parameters
TFunction
*
function
=
new
TFunction
(
idToken
.
string
,
type
);
TFunction
*
function
=
new
TFunction
(
idToken
.
string
,
type
);
if
(
acceptFunctionParameters
(
*
function
))
{
if
(
acceptFunctionParameters
(
*
function
))
{
//
COLON semantic
//
post_decls
accept
Semantic
(
);
accept
PostDecls
(
type
);
// compound_statement
// compound_statement
if
(
peekTokenClass
(
EHTokLeftBrace
))
if
(
peekTokenClass
(
EHTokLeftBrace
))
...
@@ -186,22 +187,66 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type)
...
@@ -186,22 +187,66 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type)
return
true
;
return
true
;
}
}
// If token is a qualifier, return its token class and advance to the next
// type_qualifier
// qualifier. Otherwise, return false, and don't advance.
// : qualifier qualifier ...
//
// Zero or more of these, so this can't return false.
//
void
HlslGrammar
::
acceptQualifier
(
TQualifier
&
qualifier
)
void
HlslGrammar
::
acceptQualifier
(
TQualifier
&
qualifier
)
{
{
switch
(
peek
())
{
do
{
case
EHTokUniform
:
switch
(
peek
())
{
qualifier
.
storage
=
EvqUniform
;
case
EHTokStatic
:
break
;
// normal glslang default
case
EHTokConst
:
break
;
qualifier
.
storage
=
EvqConst
;
case
EHTokExtern
:
break
;
// TODO: no meaning in glslang?
default
:
break
;
return
;
case
EHTokShared
:
}
// TODO: hint
break
;
advanceToken
();
case
EHTokGroupShared
:
qualifier
.
storage
=
EvqShared
;
break
;
case
EHTokUniform
:
qualifier
.
storage
=
EvqUniform
;
break
;
case
EHTokConst
:
qualifier
.
storage
=
EvqConst
;
break
;
case
EHTokVolatile
:
qualifier
.
volatil
=
true
;
break
;
case
EHTokLinear
:
qualifier
.
storage
=
EvqVaryingIn
;
qualifier
.
smooth
=
true
;
break
;
case
EHTokCentroid
:
qualifier
.
centroid
=
true
;
break
;
case
EHTokNointerpolation
:
qualifier
.
flat
=
true
;
break
;
case
EHTokNoperspective
:
qualifier
.
nopersp
=
true
;
break
;
case
EHTokSample
:
qualifier
.
sample
=
true
;
break
;
case
EHTokRowMajor
:
qualifier
.
layoutMatrix
=
ElmRowMajor
;
break
;
case
EHTokColumnMajor
:
qualifier
.
layoutMatrix
=
ElmColumnMajor
;
break
;
case
EHTokPrecise
:
qualifier
.
noContraction
=
true
;
break
;
default
:
return
;
}
advanceToken
();
}
while
(
true
);
}
}
// If token is for a type, update 'type' with the type information,
// If token is for a type, update 'type' with the type information,
...
@@ -627,8 +672,8 @@ bool HlslGrammar::acceptStruct(TType& type)
...
@@ -627,8 +672,8 @@ bool HlslGrammar::acceptStruct(TType& type)
// : fully_specified_type struct_declarator COMMA struct_declarator ...
// : fully_specified_type struct_declarator COMMA struct_declarator ...
//
//
// struct_declarator
// struct_declarator
// : IDENTIFIER
// : IDENTIFIER
post_decls
// | IDENTIFIER array_specifier
// | IDENTIFIER array_specifier
post_decls
//
//
bool
HlslGrammar
::
acceptStructDeclarationList
(
TTypeList
*&
typeList
)
bool
HlslGrammar
::
acceptStructDeclarationList
(
TTypeList
*&
typeList
)
{
{
...
@@ -668,6 +713,8 @@ bool HlslGrammar::acceptStructDeclarationList(TTypeList*& typeList)
...
@@ -668,6 +713,8 @@ bool HlslGrammar::acceptStructDeclarationList(TTypeList*& typeList)
// array_specifier
// array_specifier
// TODO
// TODO
acceptPostDecls
(
*
member
.
type
);
// success on seeing the SEMICOLON coming up
// success on seeing the SEMICOLON coming up
if
(
peekTokenClass
(
EHTokSemicolon
))
if
(
peekTokenClass
(
EHTokSemicolon
))
break
;
break
;
...
@@ -1570,20 +1617,68 @@ bool HlslGrammar::acceptCaseLabel(TIntermNode*& statement)
...
@@ -1570,20 +1617,68 @@ bool HlslGrammar::acceptCaseLabel(TIntermNode*& statement)
return
false
;
return
false
;
}
}
// COLON semantic
// post_decls
bool
HlslGrammar
::
acceptSemantic
()
// : COLON semantic // optional
// COLON PACKOFFSET LEFT_PAREN ... RIGHT_PAREN // optional
// COLON REGISTER // optional
// annotations // optional
//
void
HlslGrammar
::
acceptPostDecls
(
TType
&
type
)
{
{
// COLON
do
{
if
(
acceptTokenClass
(
EHTokColon
))
{
// COLON
// semantic
if
(
acceptTokenClass
(
EHTokColon
))
{
HlslToken
idToken
;
HlslToken
idToken
;
if
(
!
acceptIdentifier
(
idToken
))
{
if
(
acceptTokenClass
(
EHTokPackOffset
))
{
expected
(
"semantic"
);
if
(
!
acceptTokenClass
(
EHTokLeftParen
))
{
return
false
;
expected
(
"("
);
}
return
;
}
}
acceptTokenClass
(
EHTokIdentifier
);
acceptTokenClass
(
EHTokDot
);
acceptTokenClass
(
EHTokIdentifier
);
if
(
!
acceptTokenClass
(
EHTokRightParen
))
{
expected
(
")"
);
break
;
}
// TODO: process the packoffset information
}
else
if
(
!
acceptIdentifier
(
idToken
))
{
expected
(
"semantic or packoffset or register"
);
return
;
}
else
if
(
*
idToken
.
string
==
"register"
)
{
if
(
!
acceptTokenClass
(
EHTokLeftParen
))
{
expected
(
"("
);
return
;
}
acceptTokenClass
(
EHTokIdentifier
);
acceptTokenClass
(
EHTokComma
);
acceptTokenClass
(
EHTokIdentifier
);
acceptTokenClass
(
EHTokLeftBracket
);
if
(
peekTokenClass
(
EHTokIntConstant
))
advanceToken
();
acceptTokenClass
(
EHTokRightBracket
);
if
(
!
acceptTokenClass
(
EHTokRightParen
))
{
expected
(
")"
);
break
;
}
// TODO: process the register information
}
else
{
// semantic, in idToken.string
parseContext
.
handleSemantic
(
type
,
*
idToken
.
string
);
}
}
else
if
(
acceptTokenClass
(
EHTokLeftAngle
))
{
// TODO: process annotations, just accepting them for now
do
{
if
(
peekTokenClass
(
EHTokNone
))
return
;
if
(
acceptTokenClass
(
EHTokRightAngle
))
break
;
advanceToken
();
}
while
(
true
);
}
else
break
;
return
true
;
}
while
(
true
)
;
}
}
}
// end namespace glslang
}
// end namespace glslang
hlsl/hlslGrammar.h
View file @
630dd7da
...
@@ -87,8 +87,7 @@ namespace glslang {
...
@@ -87,8 +87,7 @@ namespace glslang {
bool
acceptIterationStatement
(
TIntermNode
*&
);
bool
acceptIterationStatement
(
TIntermNode
*&
);
bool
acceptJumpStatement
(
TIntermNode
*&
);
bool
acceptJumpStatement
(
TIntermNode
*&
);
bool
acceptCaseLabel
(
TIntermNode
*&
);
bool
acceptCaseLabel
(
TIntermNode
*&
);
void
acceptPostDecls
(
TType
&
);
bool
acceptSemantic
();
HlslParseContext
&
parseContext
;
// state of parsing and helper functions for building the intermediate
HlslParseContext
&
parseContext
;
// state of parsing and helper functions for building the intermediate
TIntermediate
&
intermediate
;
// the final product, the intermediate representation, includes the AST
TIntermediate
&
intermediate
;
// the final product, the intermediate representation, includes the AST
...
...
hlsl/hlslParseHelper.cpp
View file @
630dd7da
...
@@ -1213,6 +1213,38 @@ TFunction* HlslParseContext::handleConstructorCall(const TSourceLoc& loc, const
...
@@ -1213,6 +1213,38 @@ TFunction* HlslParseContext::handleConstructorCall(const TSourceLoc& loc, const
}
}
//
//
// Handle seeing a "COLON semantic" at the end of a type declaration,
// by updating the type according to the semantic.
//
void
HlslParseContext
::
handleSemantic
(
TType
&
type
,
const
TString
&
semantic
)
{
// TODO: need to know if it's an input or an output
// The following sketches what needs to be done, but can't be right
// without taking into account stage and input/output.
if
(
semantic
==
"PSIZE"
)
type
.
getQualifier
().
builtIn
=
EbvPointSize
;
else
if
(
semantic
==
"POSITION"
)
type
.
getQualifier
().
builtIn
=
EbvPosition
;
else
if
(
semantic
==
"FOG"
)
type
.
getQualifier
().
builtIn
=
EbvFogFragCoord
;
else
if
(
semantic
==
"DEPTH"
||
semantic
==
"SV_Depth"
)
type
.
getQualifier
().
builtIn
=
EbvFragDepth
;
else
if
(
semantic
==
"VFACE"
||
semantic
==
"SV_IsFrontFace"
)
type
.
getQualifier
().
builtIn
=
EbvFace
;
else
if
(
semantic
==
"VPOS"
||
semantic
==
"SV_Position"
)
type
.
getQualifier
().
builtIn
=
EbvFragCoord
;
else
if
(
semantic
==
"SV_ClipDistance"
)
type
.
getQualifier
().
builtIn
=
EbvClipDistance
;
else
if
(
semantic
==
"SV_CullDistance"
)
type
.
getQualifier
().
builtIn
=
EbvCullDistance
;
else
if
(
semantic
==
"SV_VertexID"
)
type
.
getQualifier
().
builtIn
=
EbvVertexId
;
else
if
(
semantic
==
"SV_ViewportArrayIndex"
)
type
.
getQualifier
().
builtIn
=
EbvViewportIndex
;
}
//
// Given a type, find what operation would fully construct it.
// Given a type, find what operation would fully construct it.
//
//
TOperator
HlslParseContext
::
mapTypeToConstructorOp
(
const
TType
&
type
)
const
TOperator
HlslParseContext
::
mapTypeToConstructorOp
(
const
TType
&
type
)
const
...
...
hlsl/hlslParseHelper.h
View file @
630dd7da
...
@@ -90,6 +90,7 @@ public:
...
@@ -90,6 +90,7 @@ public:
TIntermTyped
*
addOutputArgumentConversions
(
const
TFunction
&
,
TIntermAggregate
&
)
const
;
TIntermTyped
*
addOutputArgumentConversions
(
const
TFunction
&
,
TIntermAggregate
&
)
const
;
void
builtInOpCheck
(
const
TSourceLoc
&
,
const
TFunction
&
,
TIntermOperator
&
);
void
builtInOpCheck
(
const
TSourceLoc
&
,
const
TFunction
&
,
TIntermOperator
&
);
TFunction
*
handleConstructorCall
(
const
TSourceLoc
&
,
const
TType
&
);
TFunction
*
handleConstructorCall
(
const
TSourceLoc
&
,
const
TType
&
);
void
handleSemantic
(
TType
&
type
,
const
TString
&
semantic
);
bool
parseVectorFields
(
const
TSourceLoc
&
,
const
TString
&
,
int
vecSize
,
TVectorFields
&
);
bool
parseVectorFields
(
const
TSourceLoc
&
,
const
TString
&
,
int
vecSize
,
TVectorFields
&
);
void
assignError
(
const
TSourceLoc
&
,
const
char
*
op
,
TString
left
,
TString
right
);
void
assignError
(
const
TSourceLoc
&
,
const
char
*
op
,
TString
left
,
TString
right
);
...
...
hlsl/hlslScanContext.cpp
View file @
630dd7da
...
@@ -102,6 +102,7 @@ void HlslScanContext::fillInKeywordMap()
...
@@ -102,6 +102,7 @@ void HlslScanContext::fillInKeywordMap()
(
*
KeywordMap
)[
"extern"
]
=
EHTokExtern
;
(
*
KeywordMap
)[
"extern"
]
=
EHTokExtern
;
(
*
KeywordMap
)[
"uniform"
]
=
EHTokUniform
;
(
*
KeywordMap
)[
"uniform"
]
=
EHTokUniform
;
(
*
KeywordMap
)[
"volatile"
]
=
EHTokVolatile
;
(
*
KeywordMap
)[
"volatile"
]
=
EHTokVolatile
;
(
*
KeywordMap
)[
"precise"
]
=
EHTokPrecise
;
(
*
KeywordMap
)[
"shared"
]
=
EHTokShared
;
(
*
KeywordMap
)[
"shared"
]
=
EHTokShared
;
(
*
KeywordMap
)[
"groupshared"
]
=
EHTokGroupShared
;
(
*
KeywordMap
)[
"groupshared"
]
=
EHTokGroupShared
;
(
*
KeywordMap
)[
"linear"
]
=
EHTokLinear
;
(
*
KeywordMap
)[
"linear"
]
=
EHTokLinear
;
...
...
hlsl/hlslTokens.h
View file @
630dd7da
...
@@ -49,6 +49,7 @@ enum EHlslTokenClass {
...
@@ -49,6 +49,7 @@ enum EHlslTokenClass {
EHTokExtern
,
EHTokExtern
,
EHTokUniform
,
EHTokUniform
,
EHTokVolatile
,
EHTokVolatile
,
EHTokPrecise
,
EHTokShared
,
EHTokShared
,
EHTokGroupShared
,
EHTokGroupShared
,
EHTokLinear
,
EHTokLinear
,
...
...
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