HLSL: Add back in the [subcomponent] part of a 'register' decl.
This commit is contained in:
		
							parent
							
								
									dd50d025d6
								
							
						
					
					
						commit
						b38f071605
					
				@ -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
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,9 @@ struct {
 | 
			
		||||
    float4 ff4 : VPOS : packoffset(c0.y) : register(ps_5_0, s0) <int bambam=30;> ;
 | 
			
		||||
} 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 {
 | 
			
		||||
 | 
			
		||||
@ -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"
 | 
			
		||||
 | 
			
		||||
@ -2525,7 +2525,7 @@ 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
 | 
			
		||||
//        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);
 | 
			
		||||
 | 
			
		||||
@ -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])) {
 | 
			
		||||
    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]);
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user