HLSL: Fix #1257: layout float1, int1, etc., as scalars.
authorJohn Kessenich <cepheus@frii.com>
Tue, 27 Feb 2018 07:48:17 +0000 (00:48 -0700)
committerJohn Kessenich <cepheus@frii.com>
Tue, 27 Feb 2018 07:48:17 +0000 (00:48 -0700)
Test/baseResults/hlsl.implicitBool.frag.out
glslang/MachineIndependent/linkValidate.cpp
hlsl/hlslParseHelper.cpp

index 3e90fdb..a55a781 100755 (executable)
@@ -358,8 +358,8 @@ gl_FragCoord origin is upper left
                               Name 138  "@entryPointOutput"
                               MemberDecorate 16($Global) 0 Offset 0
                               MemberDecorate 16($Global) 1 Offset 4
-                              MemberDecorate 16($Global) 2 Offset 16
-                              MemberDecorate 16($Global) 3 Offset 32
+                              MemberDecorate 16($Global) 2 Offset 8
+                              MemberDecorate 16($Global) 3 Offset 12
                               Decorate 16($Global) Block
                               Decorate 18 DescriptorSet 0
                               Decorate 138(@entryPointOutput) Location 0
index 9ca1557..59284bc 100644 (file)
@@ -1197,6 +1197,8 @@ int TIntermediate::getBaseAlignment(const TType& type, int& size, int& stride, b
     if (type.isVector()) {
         int scalarAlign = getBaseAlignmentScalar(type, size);
         switch (type.getVectorSize()) {
+        case 1: // HLSL has this, GLSL does not
+            return scalarAlign;
         case 2:
             size *= 2;
             return 2 * scalarAlign;
index cba772d..e56480f 100755 (executable)
@@ -829,7 +829,9 @@ TIntermTyped* HlslParseContext::handleBracketDereference(const TSourceLoc& loc,
     } else {
         // at least one of base and index is variable...
 
-        if (base->getAsSymbolNode() && wasFlattened(base)) {
+        if (base->getType().isScalarOrVec1())
+            result = base;
+        else if (base->getAsSymbolNode() && wasFlattened(base)) {
             if (index->getQualifier().storage != EvqConst)
                 error(loc, "Invalid variable index to flattened array", base->getAsSymbolNode()->getName().c_str(), "");