HLSL: Add back in the [subcomponent] part of a 'register' decl.
This commit is contained in:
parent
dd50d025d6
commit
b38f071605
6 changed files with 96 additions and 55 deletions
|
|
@ -1,32 +1,35 @@
|
||||||
hlsl.struct.frag
|
hlsl.struct.frag
|
||||||
WARNING: 0:26: 'register' : ignoring shader_profile
|
WARNING: 0:26: 'register' : ignoring shader_profile
|
||||||
WARNING: 0:27: 'register' : ignoring shader_profile
|
WARNING: 0:27: 'register' : ignoring shader_profile
|
||||||
|
WARNING: 0:30: 'register' : ignoring shader_profile
|
||||||
|
|
||||||
Shader version: 450
|
Shader version: 450
|
||||||
gl_FragCoord origin is upper left
|
gl_FragCoord origin is upper left
|
||||||
0:? Sequence
|
0:? Sequence
|
||||||
0:40 Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
|
0:43 Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
|
||||||
0:31 Function Parameters:
|
0:34 Function Parameters:
|
||||||
0:31 'input' (in 4-component vector of float)
|
0:34 'input' (in 4-component vector of float)
|
||||||
0:? Sequence
|
0:? Sequence
|
||||||
0:36 Compare Equal (temp bool)
|
0:39 Compare Equal (temp bool)
|
||||||
0:36 's3' (temp structure{temp 3-component vector of bool b3})
|
0:39 's3' (temp structure{temp 3-component vector of bool b3})
|
||||||
0:36 's3' (temp structure{temp 3-component vector of bool b3})
|
0:39 '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:40 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:40 i: direct index for structure (temp 4-component vector of float)
|
||||||
0:37 's2' (global structure{temp 4-component vector of float i})
|
0:40 's2' (global structure{temp 4-component vector of float i})
|
||||||
0:37 Constant:
|
0:40 Constant:
|
||||||
0:37 0 (const int)
|
0:40 0 (const int)
|
||||||
0:37 ff4: direct index for structure (layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord)
|
0:40 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: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:37 Constant:
|
0:40 Constant:
|
||||||
0:37 7 (const int)
|
0:40 7 (const int)
|
||||||
0:39 Branch: Return with expression
|
0:42 Branch: Return with expression
|
||||||
0:39 'input' (in 4-component vector of float)
|
0:42 'input' (in 4-component vector of float)
|
||||||
0:? Linker Objects
|
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:? '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:? '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:? '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:
|
Linked fragment stage:
|
||||||
|
|
@ -35,32 +38,34 @@ 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:40 Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
|
0:43 Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float)
|
||||||
0:31 Function Parameters:
|
0:34 Function Parameters:
|
||||||
0:31 'input' (in 4-component vector of float)
|
0:34 'input' (in 4-component vector of float)
|
||||||
0:? Sequence
|
0:? Sequence
|
||||||
0:36 Compare Equal (temp bool)
|
0:39 Compare Equal (temp bool)
|
||||||
0:36 's3' (temp structure{temp 3-component vector of bool b3})
|
0:39 's3' (temp structure{temp 3-component vector of bool b3})
|
||||||
0:36 's3' (temp structure{temp 3-component vector of bool b3})
|
0:39 '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:40 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:40 i: direct index for structure (temp 4-component vector of float)
|
||||||
0:37 's2' (global structure{temp 4-component vector of float i})
|
0:40 's2' (global structure{temp 4-component vector of float i})
|
||||||
0:37 Constant:
|
0:40 Constant:
|
||||||
0:37 0 (const int)
|
0:40 0 (const int)
|
||||||
0:37 ff4: direct index for structure (layout(binding=0 offset=4 ) temp 4-component vector of float FragCoord)
|
0:40 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: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:37 Constant:
|
0:40 Constant:
|
||||||
0:37 7 (const int)
|
0:40 7 (const int)
|
||||||
0:39 Branch: Return with expression
|
0:42 Branch: Return with expression
|
||||||
0:39 'input' (in 4-component vector of float)
|
0:42 'input' (in 4-component vector of float)
|
||||||
0:? Linker Objects
|
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:? '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:? '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:? '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
|
// Module Version 10000
|
||||||
// Generated by (magic number): 80001
|
// Generated by (magic number): 80001
|
||||||
// Id's are bound by 40
|
// Id's are bound by 44
|
||||||
|
|
||||||
Capability Shader
|
Capability Shader
|
||||||
1: ExtInstImport "GLSL.std.450"
|
1: ExtInstImport "GLSL.std.450"
|
||||||
|
|
@ -92,8 +97,14 @@ gl_FragCoord origin is upper left
|
||||||
MemberName 37(myS) 2 "a"
|
MemberName 37(myS) 2 "a"
|
||||||
MemberName 37(myS) 3 "d"
|
MemberName 37(myS) 3 "d"
|
||||||
Name 39 "s1"
|
Name 39 "s1"
|
||||||
|
Name 42 "ff5"
|
||||||
|
Name 43 "ff6"
|
||||||
MemberDecorate 25 4 BuiltIn FrontFacing
|
MemberDecorate 25 4 BuiltIn FrontFacing
|
||||||
MemberDecorate 25 7 BuiltIn FragCoord
|
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
|
2: TypeVoid
|
||||||
3: TypeFunction 2
|
3: TypeFunction 2
|
||||||
6: TypeBool
|
6: TypeBool
|
||||||
|
|
@ -118,6 +129,10 @@ gl_FragCoord origin is upper left
|
||||||
37(myS): TypeStruct 6(bool) 6(bool) 18(fvec4) 18(fvec4)
|
37(myS): TypeStruct 6(bool) 6(bool) 18(fvec4) 18(fvec4)
|
||||||
38: TypePointer Private 37(myS)
|
38: TypePointer Private 37(myS)
|
||||||
39(s1): 38(ptr) Variable Private
|
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
|
4(PixelShaderFunction): 2 Function None 3
|
||||||
5: Label
|
5: Label
|
||||||
10(s3): 9(ptr) Variable Function
|
10(s3): 9(ptr) Variable Function
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,9 @@ struct {
|
||||||
float4 ff4 : VPOS : packoffset(c0.y) : register(ps_5_0, s0) <int bambam=30;> ;
|
float4 ff4 : VPOS : packoffset(c0.y) : register(ps_5_0, s0) <int bambam=30;> ;
|
||||||
} s4;
|
} 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
|
float4 PixelShaderFunction(float4 input) : COLOR0
|
||||||
{
|
{
|
||||||
struct FS {
|
struct FS {
|
||||||
|
|
|
||||||
|
|
@ -3,4 +3,4 @@
|
||||||
// For the date, it uses the current date (when then script is run).
|
// For the date, it uses the current date (when then script is run).
|
||||||
|
|
||||||
#define GLSLANG_REVISION "SPIRV99.1367"
|
#define GLSLANG_REVISION "SPIRV99.1367"
|
||||||
#define GLSLANG_DATE "29-Jul-2016"
|
#define GLSLANG_DATE "30-Jul-2016"
|
||||||
|
|
|
||||||
|
|
@ -2523,10 +2523,10 @@ void HlslGrammar::acceptArraySpecifier(TArraySizes*& arraySizes)
|
||||||
}
|
}
|
||||||
|
|
||||||
// post_decls
|
// post_decls
|
||||||
// : COLON semantic // optional
|
// : COLON semantic // optional
|
||||||
// COLON PACKOFFSET LEFT_PAREN c[Subcomponent][.component] RIGHT_PAREN // optional
|
// COLON PACKOFFSET LEFT_PAREN c[Subcomponent][.component] RIGHT_PAREN // optional
|
||||||
// COLON REGISTER LEFT_PAREN [shader_profile,] Type# RIGHT_PAREN // optional
|
// COLON REGISTER LEFT_PAREN [shader_profile,] Type#[subcomp]opt RIGHT_PAREN // optional
|
||||||
// annotations // optional
|
// annotations // optional
|
||||||
//
|
//
|
||||||
void HlslGrammar::acceptPostDecls(TType& type)
|
void HlslGrammar::acceptPostDecls(TType& type)
|
||||||
{
|
{
|
||||||
|
|
@ -2561,31 +2561,45 @@ void HlslGrammar::acceptPostDecls(TType& type)
|
||||||
expected("semantic or packoffset or register");
|
expected("semantic or packoffset or register");
|
||||||
return;
|
return;
|
||||||
} else if (*idToken.string == "register") {
|
} 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)) {
|
if (! acceptTokenClass(EHTokLeftParen)) {
|
||||||
expected("(");
|
expected("(");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
HlslToken registerDesc;
|
HlslToken registerDesc; // for Type#
|
||||||
|
HlslToken profile;
|
||||||
if (! acceptIdentifier(registerDesc)) {
|
if (! acceptIdentifier(registerDesc)) {
|
||||||
expected("register number description");
|
expected("register number description");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
HlslToken profile;
|
|
||||||
if (acceptTokenClass(EHTokComma)) {
|
if (acceptTokenClass(EHTokComma)) {
|
||||||
// then we didn't really see the registerDesc yet, it was
|
// Then we didn't really see the registerDesc yet, it was
|
||||||
// actually the profile
|
// actually the profile. Adjust...
|
||||||
profile = registerDesc;
|
profile = registerDesc;
|
||||||
if (! acceptIdentifier(registerDesc)) {
|
if (! acceptIdentifier(registerDesc)) {
|
||||||
expected("register number description");
|
expected("register number description");
|
||||||
return;
|
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)) {
|
if (! acceptTokenClass(EHTokRightParen)) {
|
||||||
expected(")");
|
expected(")");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
parseContext.handleRegister(registerDesc.loc, type, profile.string, *registerDesc.string);
|
parseContext.handleRegister(registerDesc.loc, type, profile.string, *registerDesc.string, subComponent);
|
||||||
} else {
|
} else {
|
||||||
// semantic, in idToken.string
|
// semantic, in idToken.string
|
||||||
parseContext.handleSemantic(type, *idToken.string);
|
parseContext.handleSemantic(type, *idToken.string);
|
||||||
|
|
|
||||||
|
|
@ -2181,27 +2181,34 @@ void HlslParseContext::handlePackOffset(const TSourceLoc& loc, TType& type, cons
|
||||||
// 'desc' is the type# part.
|
// 'desc' is the type# part.
|
||||||
//
|
//
|
||||||
void HlslParseContext::handleRegister(const TSourceLoc& loc, TType& type, const glslang::TString* profile,
|
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)
|
if (profile != nullptr)
|
||||||
warn(loc, "ignoring shader_profile", "register", "");
|
warn(loc, "ignoring shader_profile", "register", "");
|
||||||
|
|
||||||
if (desc.size() < 2) {
|
if (desc.size() < 1) {
|
||||||
error(loc, "expected register type and number", "register", "");
|
error(loc, "expected register type", "register", "");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! isdigit(desc[1])) {
|
int regNumber = 0;
|
||||||
error(loc, "expected register number after register type", "register", "");
|
if (desc.size() > 1) {
|
||||||
return;
|
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]) {
|
switch (desc[0]) {
|
||||||
case 'b':
|
case 'b':
|
||||||
case 't':
|
case 't':
|
||||||
case 'c':
|
case 'c':
|
||||||
case 's':
|
case 's':
|
||||||
type.getQualifier().layoutBinding = atoi(desc.substr(1, desc.size()).c_str());
|
type.getQualifier().layoutBinding = regNumber + subComponent;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
warn(loc, "ignoring unrecognized register type", "register", "%c", desc[0]);
|
warn(loc, "ignoring unrecognized register type", "register", "%c", desc[0]);
|
||||||
|
|
|
||||||
|
|
@ -95,8 +95,10 @@ public:
|
||||||
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);
|
void handleSemantic(TType& type, const TString& semantic);
|
||||||
void handlePackOffset(const TSourceLoc&, TType& type, const glslang::TString& location, const glslang::TString* component);
|
void handlePackOffset(const TSourceLoc&, TType& type, const glslang::TString& location,
|
||||||
void handleRegister(const TSourceLoc&, TType& type, const glslang::TString* profile, const glslang::TString& desc);
|
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);
|
TIntermAggregate* handleSamplerTextureCombine(const TSourceLoc& loc, TIntermTyped* argTex, TIntermTyped* argSampler);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue