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.
This commit is contained in:
John Kessenich
2016-06-12 23:52:12 -06:00
parent e6e7494e2a
commit 630dd7da43
10 changed files with 273 additions and 80 deletions

View File

@@ -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
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
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
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

View File

@@ -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:
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
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
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

View File

@@ -1,5 +1,10 @@
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;

View File

@@ -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
} s3; } s3;
s3 == s3; s3 == s3;
return input;
} }

View File

@@ -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)
// 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)
// 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
acceptSemantic(); acceptPostDecls(type);
// compound_statement // compound_statement
if (peekTokenClass(EHTokLeftBrace)) if (peekTokenClass(EHTokLeftBrace))
@@ -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)
// : 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)
// 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)
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

View File

@@ -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

View File

@@ -1212,6 +1212,38 @@ TFunction* HlslParseContext::handleConstructorCall(const TSourceLoc& loc, const
return new TFunction(&empty, type, op); return new TFunction(&empty, type, op);
} }
//
// 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.
// //

View File

@@ -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);

View File

@@ -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;

View File

@@ -49,6 +49,7 @@ enum EHlslTokenClass {
EHTokExtern, EHTokExtern,
EHTokUniform, EHTokUniform,
EHTokVolatile, EHTokVolatile,
EHTokPrecise,
EHTokShared, EHTokShared,
EHTokGroupShared, EHTokGroupShared,
EHTokLinear, EHTokLinear,