diff --git a/Test/baseResults/hlsl.basic.geom.out b/Test/baseResults/hlsl.basic.geom.out index 24250b3e..12616d93 100644 --- a/Test/baseResults/hlsl.basic.geom.out +++ b/Test/baseResults/hlsl.basic.geom.out @@ -60,14 +60,14 @@ output primitive = line_strip 0:? 'VertexID' (layout( location=0) in 3-element array of uint) 0:16 move second child to first child ( temp 3-element array of uint) 0:? 'test' ( temp 3-element array of uint) -0:? 'test' (layout( location=3) in 3-element array of uint) +0:? 'test' (layout( location=1) in 3-element array of uint) 0:16 Function Call: @main(u1[3];u1[3];struct-PSInput-f1-i11; ( temp void) 0:? 'VertexID' ( temp 3-element array of uint) 0:? 'test' ( temp 3-element array of uint) 0:? 'OutputStream' ( temp structure{ temp float myfloat, temp int something}) 0:? Linker Objects 0:? 'VertexID' (layout( location=0) in 3-element array of uint) -0:? 'test' (layout( location=3) in 3-element array of uint) +0:? 'test' (layout( location=1) in 3-element array of uint) Linked geometry stage: @@ -134,14 +134,14 @@ output primitive = line_strip 0:? 'VertexID' (layout( location=0) in 3-element array of uint) 0:16 move second child to first child ( temp 3-element array of uint) 0:? 'test' ( temp 3-element array of uint) -0:? 'test' (layout( location=3) in 3-element array of uint) +0:? 'test' (layout( location=1) in 3-element array of uint) 0:16 Function Call: @main(u1[3];u1[3];struct-PSInput-f1-i11; ( temp void) 0:? 'VertexID' ( temp 3-element array of uint) 0:? 'test' ( temp 3-element array of uint) 0:? 'OutputStream' ( temp structure{ temp float myfloat, temp int something}) 0:? Linker Objects 0:? 'VertexID' (layout( location=0) in 3-element array of uint) -0:? 'test' (layout( location=3) in 3-element array of uint) +0:? 'test' (layout( location=1) in 3-element array of uint) // Module Version 10000 // Generated by (magic number): 80001 @@ -173,7 +173,7 @@ output primitive = line_strip Name 53 "param" Name 55 "param" Decorate 45(VertexID) Location 0 - Decorate 48(test) Location 3 + Decorate 48(test) Location 1 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 0 diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index d643463c..cb06bd31 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -1419,15 +1419,24 @@ void HlslParseContext::fixBuiltInArrayType(TType& type) void HlslParseContext::assignLocations(TVariable& variable) { const auto assignLocation = [&](TVariable& variable) { - const TQualifier& qualifier = variable.getType().getQualifier(); + const TType& type = variable.getType(); + const TQualifier& qualifier = type.getQualifier(); if (qualifier.storage == EvqVaryingIn || qualifier.storage == EvqVaryingOut) { if (qualifier.builtIn == EbvNone) { + // Strip off the outer array dimension for those having an extra one. + int size; + if (type.isArray() && qualifier.isArrayedIo(language)) { + TType elementType(type, 0); + size = intermediate.computeTypeLocationSize(elementType); + } else + size = intermediate.computeTypeLocationSize(type); + if (qualifier.storage == EvqVaryingIn) { variable.getWritableType().getQualifier().layoutLocation = nextInLocation; - nextInLocation += intermediate.computeTypeLocationSize(variable.getType()); + nextInLocation += size; } else { variable.getWritableType().getQualifier().layoutLocation = nextOutLocation; - nextOutLocation += intermediate.computeTypeLocationSize(variable.getType()); + nextOutLocation += size; } } @@ -1892,10 +1901,14 @@ void HlslParseContext::remapEntryPointIO(TFunction& function, TVariable*& return ioVariable->getWritableType().setStruct(newLists->second.output); } } - if (storage == EvqVaryingIn) + if (storage == EvqVaryingIn) { correctInput(ioVariable->getWritableType().getQualifier()); - else + if (language == EShLangTessEvaluation) + if (!ioVariable->getType().isArray()) + ioVariable->getWritableType().getQualifier().patch = true; + } else { correctOutput(ioVariable->getWritableType().getQualifier()); + } ioVariable->getWritableType().getQualifier().storage = storage; return ioVariable; }; @@ -4212,6 +4225,10 @@ void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, TBu case EbvStencilRef: error(loc, "unimplemented; need ARB_shader_stencil_export", "SV_STENCILREF", ""); break; + case EbvTessLevelInner: + case EbvTessLevelOuter: + qualifier.patch = true; + break; default: break; } @@ -7254,6 +7271,8 @@ bool HlslParseContext::isInputBuiltIn(const TQualifier& qualifier) const case EbvTessLevelInner: case EbvTessLevelOuter: return language == EShLangTessEvaluation; + case EbvTessCoord: + return language == EShLangTessEvaluation; default: return false; }