Commit b9e39120 by John Kessenich

HLSL: Partially address issue #463: accept GLSL layout(...).

This includes all "per variable" layout qualifiers, but the key ones mattering and tested for now are: set= binding= constant_id= push_constant
parent 78a8b073
hlsl.layout.frag
Shader version: 450
gl_FragCoord origin is upper left
0:? Sequence
0:15 Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
0:12 Function Parameters:
0:12 'input' (in 4-component vector of float)
0:? Sequence
0:13 Branch: Return with expression
0:13 add (temp 4-component vector of float)
0:13 add (temp 4-component vector of float)
0:13 'input' (in 4-component vector of float)
0:13 v1: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float)
0:13 'anon@0' (layout(set=3 binding=5 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v1})
0:13 Constant:
0:13 0 (const uint)
0:13 v5: direct index for structure (layout(column_major std430 offset=0 ) buffer 4-component vector of float)
0:13 'anon@1' (layout(column_major std430 push_constant ) buffer block{layout(column_major std430 offset=0 ) buffer 4-component vector of float v5})
0:13 Constant:
0:13 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout(set=3 binding=5 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v1})
0:? 'anon@1' (layout(column_major std430 push_constant ) buffer block{layout(column_major std430 offset=0 ) buffer 4-component vector of float v5})
0:? 'specConst' (specialization-constant const int)
0:? 10 (const int)
Linked fragment stage:
Shader version: 450
gl_FragCoord origin is upper left
0:? Sequence
0:15 Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
0:12 Function Parameters:
0:12 'input' (in 4-component vector of float)
0:? Sequence
0:13 Branch: Return with expression
0:13 add (temp 4-component vector of float)
0:13 add (temp 4-component vector of float)
0:13 'input' (in 4-component vector of float)
0:13 v1: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float)
0:13 'anon@0' (layout(set=3 binding=5 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v1})
0:13 Constant:
0:13 0 (const uint)
0:13 v5: direct index for structure (layout(column_major std430 offset=0 ) buffer 4-component vector of float)
0:13 'anon@1' (layout(column_major std430 push_constant ) buffer block{layout(column_major std430 offset=0 ) buffer 4-component vector of float v5})
0:13 Constant:
0:13 0 (const uint)
0:? Linker Objects
0:? 'anon@0' (layout(set=3 binding=5 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v1})
0:? 'anon@1' (layout(column_major std430 push_constant ) buffer block{layout(column_major std430 offset=0 ) buffer 4-component vector of float v5})
0:? 'specConst' (specialization-constant const int)
0:? 10 (const int)
// Module Version 10000
// Generated by (magic number): 80001
// Id's are bound by 33
Capability Shader
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main"
ExecutionMode 4 OriginUpperLeft
Name 4 "main"
Name 11 "PixelShaderFunction(vf4;"
Name 10 "input"
Name 14 ""
MemberName 14 0 "v1"
Name 16 ""
Name 23 ""
MemberName 23 0 "v5"
Name 25 ""
MemberDecorate 14 0 Offset 16
Decorate 14 BufferBlock
Decorate 16 DescriptorSet 3
Decorate 16 Binding 5
MemberDecorate 23 0 Offset 0
Decorate 23 BufferBlock
Decorate 32 SpecId 17
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
7: TypeVector 6(float) 4
8: TypePointer Function 7(fvec4)
9: TypeFunction 7(fvec4) 8(ptr)
14: TypeStruct 7(fvec4)
15: TypePointer Uniform 14(struct)
16: 15(ptr) Variable Uniform
17: TypeInt 32 1
18: 17(int) Constant 0
19: TypePointer Uniform 7(fvec4)
23: TypeStruct 7(fvec4)
24: TypePointer PushConstant 23(struct)
25: 24(ptr) Variable PushConstant
26: TypePointer PushConstant 7(fvec4)
32: 17(int) SpecConstant 10
4(main): 2 Function None 3
5: Label
FunctionEnd
11(PixelShaderFunction(vf4;): 7(fvec4) Function None 9
10(input): 8(ptr) FunctionParameter
12: Label
13: 7(fvec4) Load 10(input)
20: 19(ptr) AccessChain 16 18
21: 7(fvec4) Load 20
22: 7(fvec4) FAdd 13 21
27: 26(ptr) AccessChain 25 18
28: 7(fvec4) Load 27
29: 7(fvec4) FAdd 22 28
ReturnValue 29
FunctionEnd
layout(set=3,binding=5) tbuffer tbufName {
layout(offset = 16) float4 v1;
};
layout(push_constant) tbuffer tbufName2 {
float4 v5;
};
layout(constant_id=17) const int specConst = 10;
float4 PixelShaderFunction(float4 input) : COLOR0
{
return input + v1 + v5;
}
...@@ -112,6 +112,7 @@ INSTANTIATE_TEST_CASE_P( ...@@ -112,6 +112,7 @@ INSTANTIATE_TEST_CASE_P(
{"hlsl.intrinsics.negative.comp", "ComputeShaderFunction"}, {"hlsl.intrinsics.negative.comp", "ComputeShaderFunction"},
{"hlsl.intrinsics.negative.frag", "PixelShaderFunction"}, {"hlsl.intrinsics.negative.frag", "PixelShaderFunction"},
{"hlsl.intrinsics.negative.vert", "VertexShaderFunction"}, {"hlsl.intrinsics.negative.vert", "VertexShaderFunction"},
{"hlsl.layout.frag", "main"},
{"hlsl.load.2dms.dx10.frag", "main"}, {"hlsl.load.2dms.dx10.frag", "main"},
{"hlsl.load.array.dx10.frag", "main"}, {"hlsl.load.array.dx10.frag", "main"},
{"hlsl.load.basic.dx10.frag", "main"}, {"hlsl.load.basic.dx10.frag", "main"},
......
...@@ -426,7 +426,8 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type) ...@@ -426,7 +426,8 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type)
// type_qualifier // type_qualifier
TQualifier qualifier; TQualifier qualifier;
qualifier.clear(); qualifier.clear();
acceptQualifier(qualifier); if (! acceptQualifier(qualifier))
return false;
TSourceLoc loc = token.loc; TSourceLoc loc = token.loc;
// type_specifier // type_specifier
...@@ -449,7 +450,7 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type) ...@@ -449,7 +450,7 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type)
// //
// Zero or more of these, so this can't return false. // Zero or more of these, so this can't return false.
// //
void HlslGrammar::acceptQualifier(TQualifier& qualifier) bool HlslGrammar::acceptQualifier(TQualifier& qualifier)
{ {
do { do {
switch (peek()) { switch (peek()) {
...@@ -508,13 +509,66 @@ void HlslGrammar::acceptQualifier(TQualifier& qualifier) ...@@ -508,13 +509,66 @@ void HlslGrammar::acceptQualifier(TQualifier& qualifier)
case EHTokInOut: case EHTokInOut:
qualifier.storage = EvqInOut; qualifier.storage = EvqInOut;
break; break;
case EHTokLayout:
if (! acceptLayoutQualifierList(qualifier))
return false;
continue;
default: default:
return; return true;
} }
advanceToken(); advanceToken();
} while (true); } while (true);
} }
// layout_qualifier_list
// : LEFT_PAREN layout_qualifier COMMA layout_qualifier ... RIGHT_PAREN
//
// layout_qualifier
// : identifier
// | identifier EQUAL expresion
//
// Zero or more of these, so this can't return false.
//
bool HlslGrammar::acceptLayoutQualifierList(TQualifier& qualifier)
{
if (! acceptTokenClass(EHTokLayout))
return false;
// LEFT_PAREN
if (! acceptTokenClass(EHTokLeftParen))
return false;
do {
// identifier
HlslToken idToken;
if (! acceptIdentifier(idToken))
break;
// EQUAL expression
if (acceptTokenClass(EHTokAssign)) {
TIntermTyped* expr;
if (! acceptConditionalExpression(expr)) {
expected("expression");
return false;
}
parseContext.setLayoutQualifier(idToken.loc, qualifier, *idToken.string, expr);
} else
parseContext.setLayoutQualifier(idToken.loc, qualifier, *idToken.string);
// COMMA
if (! acceptTokenClass(EHTokComma))
break;
} while (true);
// RIGHT_PAREN
if (! acceptTokenClass(EHTokRightParen)) {
expected(")");
return false;
}
return true;
}
// template_type // template_type
// : FLOAT // : FLOAT
// | DOUBLE // | DOUBLE
......
...@@ -67,7 +67,8 @@ namespace glslang { ...@@ -67,7 +67,8 @@ namespace glslang {
bool acceptSamplerDeclarationDX9(TType&); bool acceptSamplerDeclarationDX9(TType&);
bool acceptSamplerState(); bool acceptSamplerState();
bool acceptFullySpecifiedType(TType&); bool acceptFullySpecifiedType(TType&);
void acceptQualifier(TQualifier&); bool acceptQualifier(TQualifier&);
bool acceptLayoutQualifierList(TQualifier&);
bool acceptType(TType&); bool acceptType(TType&);
bool acceptTemplateType(TBasicType&); bool acceptTemplateType(TBasicType&);
bool acceptVectorTemplateType(TType&); bool acceptVectorTemplateType(TType&);
......
...@@ -128,8 +128,8 @@ public: ...@@ -128,8 +128,8 @@ public:
void paramFix(TType& type); void paramFix(TType& type);
void specializationCheck(const TSourceLoc&, const TType&, const char* op); void specializationCheck(const TSourceLoc&, const TType&, const char* op);
void setLayoutQualifier(const TSourceLoc&, TPublicType&, TString&); void setLayoutQualifier(const TSourceLoc&, TQualifier&, TString&);
void setLayoutQualifier(const TSourceLoc&, TPublicType&, TString&, const TIntermTyped*); void setLayoutQualifier(const TSourceLoc&, TQualifier&, TString&, const TIntermTyped*);
void mergeObjectLayoutQualifiers(TQualifier& dest, const TQualifier& src, bool inheritOnly); void mergeObjectLayoutQualifiers(TQualifier& dest, const TQualifier& src, bool inheritOnly);
void checkNoShaderLayouts(const TSourceLoc&, const TShaderQualifiers&); void checkNoShaderLayouts(const TSourceLoc&, const TShaderQualifiers&);
......
...@@ -117,6 +117,7 @@ void HlslScanContext::fillInKeywordMap() ...@@ -117,6 +117,7 @@ void HlslScanContext::fillInKeywordMap()
(*KeywordMap)["in"] = EHTokIn; (*KeywordMap)["in"] = EHTokIn;
(*KeywordMap)["out"] = EHTokOut; (*KeywordMap)["out"] = EHTokOut;
(*KeywordMap)["inout"] = EHTokInOut; (*KeywordMap)["inout"] = EHTokInOut;
(*KeywordMap)["layout"] = EHTokLayout;
(*KeywordMap)["Buffer"] = EHTokBuffer; (*KeywordMap)["Buffer"] = EHTokBuffer;
(*KeywordMap)["vector"] = EHTokVector; (*KeywordMap)["vector"] = EHTokVector;
...@@ -457,6 +458,7 @@ EHlslTokenClass HlslScanContext::tokenizeIdentifier() ...@@ -457,6 +458,7 @@ EHlslTokenClass HlslScanContext::tokenizeIdentifier()
case EHTokIn: case EHTokIn:
case EHTokOut: case EHTokOut:
case EHTokInOut: case EHTokInOut:
case EHTokLayout:
return keyword; return keyword;
// template types // template types
......
...@@ -64,6 +64,7 @@ enum EHlslTokenClass { ...@@ -64,6 +64,7 @@ enum EHlslTokenClass {
EHTokIn, EHTokIn,
EHTokOut, EHTokOut,
EHTokInOut, EHTokInOut,
EHTokLayout,
// template types // template types
EHTokBuffer, EHTokBuffer,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment