diff --git a/Test/baseResults/hlsl.struct.frag.out b/Test/baseResults/hlsl.struct.frag.out index 08b41930..02eed4ee 100755 --- a/Test/baseResults/hlsl.struct.frag.out +++ b/Test/baseResults/hlsl.struct.frag.out @@ -1,32 +1,35 @@ hlsl.struct.frag WARNING: 0:26: 'register' : ignoring shader_profile WARNING: 0:27: 'register' : ignoring shader_profile +WARNING: 0:30: 'register' : ignoring shader_profile Shader version: 450 gl_FragCoord origin is upper left 0:? Sequence -0:40 Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float) -0:31 Function Parameters: -0:31 'input' (in 4-component vector of float) +0:43 Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float) +0:34 Function Parameters: +0:34 'input' (in 4-component vector of float) 0:? Sequence -0:36 Compare Equal (temp bool) -0:36 's3' (temp structure{temp 3-component vector of bool b3}) -0:36 's3' (temp structure{temp 3-component vector of bool b3}) -0:37 move second child to first child (temp 4-component vector of float) -0:37 i: direct index for structure (temp 4-component vector of float) -0:37 's2' (global structure{temp 4-component vector of float i}) -0:37 Constant: -0:37 0 (const int) -0:37 ff4: direct index for structure (layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord) -0:37 's4' (global 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, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord ff4}) -0:37 Constant: -0:37 7 (const int) -0:39 Branch: Return with expression -0:39 'input' (in 4-component vector of float) +0:39 Compare Equal (temp bool) +0:39 's3' (temp structure{temp 3-component vector of bool b3}) +0:39 's3' (temp structure{temp 3-component vector of bool b3}) +0:40 move second child to first child (temp 4-component vector of float) +0:40 i: direct index for structure (temp 4-component vector of float) +0:40 's2' (global structure{temp 4-component vector of float i}) +0:40 Constant: +0:40 0 (const int) +0:40 ff4: direct index for structure (layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord) +0:40 's4' (global 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, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord ff4}) +0:40 Constant: +0:40 7 (const int) +0:42 Branch: Return with expression +0:42 'input' (in 4-component vector of float) 0:? Linker Objects 0:? 's1' (global structure{temp bool b, temp bool c, temp 4-component vector of float a, temp 4-component vector of float d}) 0:? 's2' (global structure{temp 4-component vector of float i}) 0:? 's4' (global 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, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord ff4}) +0:? 'ff5' (layout(binding=5 offset=20 ) global 3-component vector of float) +0:? 'ff6' (layout(binding=8 offset=36 ) global 3-component vector of float) Linked fragment stage: @@ -35,32 +38,34 @@ Linked fragment stage: Shader version: 450 gl_FragCoord origin is upper left 0:? Sequence -0:40 Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float) -0:31 Function Parameters: -0:31 'input' (in 4-component vector of float) +0:43 Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float) +0:34 Function Parameters: +0:34 'input' (in 4-component vector of float) 0:? Sequence -0:36 Compare Equal (temp bool) -0:36 's3' (temp structure{temp 3-component vector of bool b3}) -0:36 's3' (temp structure{temp 3-component vector of bool b3}) -0:37 move second child to first child (temp 4-component vector of float) -0:37 i: direct index for structure (temp 4-component vector of float) -0:37 's2' (global structure{temp 4-component vector of float i}) -0:37 Constant: -0:37 0 (const int) -0:37 ff4: direct index for structure (layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord) -0:37 's4' (global 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, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord ff4}) -0:37 Constant: -0:37 7 (const int) -0:39 Branch: Return with expression -0:39 'input' (in 4-component vector of float) +0:39 Compare Equal (temp bool) +0:39 's3' (temp structure{temp 3-component vector of bool b3}) +0:39 's3' (temp structure{temp 3-component vector of bool b3}) +0:40 move second child to first child (temp 4-component vector of float) +0:40 i: direct index for structure (temp 4-component vector of float) +0:40 's2' (global structure{temp 4-component vector of float i}) +0:40 Constant: +0:40 0 (const int) +0:40 ff4: direct index for structure (layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord) +0:40 's4' (global 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, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord ff4}) +0:40 Constant: +0:40 7 (const int) +0:42 Branch: Return with expression +0:42 'input' (in 4-component vector of float) 0:? Linker Objects 0:? 's1' (global structure{temp bool b, temp bool c, temp 4-component vector of float a, temp 4-component vector of float d}) 0:? 's2' (global structure{temp 4-component vector of float i}) 0:? 's4' (global 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, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord ff4}) +0:? 'ff5' (layout(binding=5 offset=20 ) global 3-component vector of float) +0:? 'ff6' (layout(binding=8 offset=36 ) global 3-component vector of float) // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 40 +// Id's are bound by 44 Capability Shader 1: ExtInstImport "GLSL.std.450" @@ -92,8 +97,14 @@ gl_FragCoord origin is upper left MemberName 37(myS) 2 "a" MemberName 37(myS) 3 "d" Name 39 "s1" + Name 42 "ff5" + Name 43 "ff6" MemberDecorate 25 4 BuiltIn FrontFacing MemberDecorate 25 7 BuiltIn FragCoord + Decorate 42(ff5) Offset 20 + Decorate 42(ff5) Binding 5 + Decorate 43(ff6) Offset 36 + Decorate 43(ff6) Binding 8 2: TypeVoid 3: TypeFunction 2 6: TypeBool @@ -118,6 +129,10 @@ gl_FragCoord origin is upper left 37(myS): TypeStruct 6(bool) 6(bool) 18(fvec4) 18(fvec4) 38: TypePointer Private 37(myS) 39(s1): 38(ptr) Variable Private + 40: TypeVector 17(float) 3 + 41: TypePointer Private 40(fvec3) + 42(ff5): 41(ptr) Variable Private + 43(ff6): 41(ptr) Variable Private 4(PixelShaderFunction): 2 Function None 3 5: Label 10(s3): 9(ptr) Variable Function diff --git a/Test/hlsl.struct.frag b/Test/hlsl.struct.frag index 7989d253..c76f3349 100644 --- a/Test/hlsl.struct.frag +++ b/Test/hlsl.struct.frag @@ -27,6 +27,9 @@ struct { float4 ff4 : VPOS : packoffset(c0.y) : register(ps_5_0, s0) ; } s4; +float3 ff5 : packoffset(c1.y) : register(ps_5_0, s[5]); +float3 ff6 : packoffset(c2.y) : register(s3[5]); + float4 PixelShaderFunction(float4 input) : COLOR0 { struct FS { diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index 5e83db78..a400ee8b 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -3,4 +3,4 @@ // For the date, it uses the current date (when then script is run). #define GLSLANG_REVISION "SPIRV99.1367" -#define GLSLANG_DATE "29-Jul-2016" +#define GLSLANG_DATE "30-Jul-2016" diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp index 11b6dc15..e6ce9906 100755 --- a/hlsl/hlslGrammar.cpp +++ b/hlsl/hlslGrammar.cpp @@ -2523,10 +2523,10 @@ void HlslGrammar::acceptArraySpecifier(TArraySizes*& arraySizes) } // post_decls -// : COLON semantic // optional -// COLON PACKOFFSET LEFT_PAREN c[Subcomponent][.component] RIGHT_PAREN // optional -// COLON REGISTER LEFT_PAREN [shader_profile,] Type# RIGHT_PAREN // optional -// annotations // optional +// : COLON semantic // optional +// COLON PACKOFFSET LEFT_PAREN c[Subcomponent][.component] RIGHT_PAREN // optional +// COLON REGISTER LEFT_PAREN [shader_profile,] Type#[subcomp]opt RIGHT_PAREN // optional +// annotations // optional // void HlslGrammar::acceptPostDecls(TType& type) { @@ -2561,31 +2561,45 @@ void HlslGrammar::acceptPostDecls(TType& type) expected("semantic or packoffset or register"); return; } else if (*idToken.string == "register") { - // REGISTER LEFT_PAREN [shader_profile,] Type# RIGHT_PAREN + // REGISTER LEFT_PAREN [shader_profile,] Type#[subcomp]opt RIGHT_PAREN if (! acceptTokenClass(EHTokLeftParen)) { expected("("); return; } - HlslToken registerDesc; + HlslToken registerDesc; // for Type# + HlslToken profile; if (! acceptIdentifier(registerDesc)) { expected("register number description"); return; } - HlslToken profile; if (acceptTokenClass(EHTokComma)) { - // then we didn't really see the registerDesc yet, it was - // actually the profile + // Then we didn't really see the registerDesc yet, it was + // actually the profile. Adjust... profile = registerDesc; if (! acceptIdentifier(registerDesc)) { expected("register number description"); return; } } + int subComponent = 0; + if (acceptTokenClass(EHTokLeftBracket)) { + // LEFT_BRACKET subcomponent RIGHT_BRACKET + if (! peekTokenClass(EHTokIntConstant)) { + expected("literal integer"); + return; + } + subComponent = token.i; + advanceToken(); + if (! acceptTokenClass(EHTokRightBracket)) { + expected("]"); + break; + } + } if (! acceptTokenClass(EHTokRightParen)) { expected(")"); break; } - parseContext.handleRegister(registerDesc.loc, type, profile.string, *registerDesc.string); + parseContext.handleRegister(registerDesc.loc, type, profile.string, *registerDesc.string, subComponent); } else { // semantic, in idToken.string parseContext.handleSemantic(type, *idToken.string); diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index f9188524..5c7768bb 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -2181,27 +2181,34 @@ void HlslParseContext::handlePackOffset(const TSourceLoc& loc, TType& type, cons // 'desc' is the type# part. // void HlslParseContext::handleRegister(const TSourceLoc& loc, TType& type, const glslang::TString* profile, - const glslang::TString& desc) + const glslang::TString& desc, + int subComponent) { if (profile != nullptr) warn(loc, "ignoring shader_profile", "register", ""); - if (desc.size() < 2) { - error(loc, "expected register type and number", "register", ""); + if (desc.size() < 1) { + error(loc, "expected register type", "register", ""); return; } - if (! isdigit(desc[1])) { - error(loc, "expected register number after register type", "register", ""); - return; + int regNumber = 0; + if (desc.size() > 1) { + if (isdigit(desc[1])) + regNumber = atoi(desc.substr(1, desc.size()).c_str()); + else { + error(loc, "expected register number after register type", "register", ""); + return; + } } + // TODO: learn what all these really mean and how they interact with regNumber and subComponent switch (desc[0]) { case 'b': case 't': case 'c': case 's': - type.getQualifier().layoutBinding = atoi(desc.substr(1, desc.size()).c_str()); + type.getQualifier().layoutBinding = regNumber + subComponent; break; default: warn(loc, "ignoring unrecognized register type", "register", "%c", desc[0]); diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h index 40bf851b..92641a84 100755 --- a/hlsl/hlslParseHelper.h +++ b/hlsl/hlslParseHelper.h @@ -95,8 +95,10 @@ public: void builtInOpCheck(const TSourceLoc&, const TFunction&, TIntermOperator&); TFunction* handleConstructorCall(const TSourceLoc&, const TType&); void handleSemantic(TType& type, const TString& semantic); - void handlePackOffset(const TSourceLoc&, TType& type, const glslang::TString& location, const glslang::TString* component); - void handleRegister(const TSourceLoc&, TType& type, const glslang::TString* profile, const glslang::TString& desc); + void handlePackOffset(const TSourceLoc&, TType& type, const glslang::TString& location, + const glslang::TString* component); + void handleRegister(const TSourceLoc&, TType& type, const glslang::TString* profile, const glslang::TString& desc, + int subComponent); TIntermAggregate* handleSamplerTextureCombine(const TSourceLoc& loc, TIntermTyped* argTex, TIntermTyped* argSampler);