HLSL: strip off array dimension when assign locations of arrayed IO.
authorsteve-lunarg <steve_gh@khasekhemwy.net>
Sun, 19 Mar 2017 04:24:14 +0000 (22:24 -0600)
committersteve-lunarg <steve_gh@khasekhemwy.net>
Thu, 30 Mar 2017 20:37:05 +0000 (14:37 -0600)
Test/baseResults/hlsl.basic.geom.out
hlsl/hlslParseHelper.cpp

index 24250b3..12616d9 100644 (file)
@@ -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
index d643463..cb06bd3 100755 (executable)
@@ -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;
     }