Merge pull request #1567 from Igalia/apinheiro/xfb-1535

ParseHelper: assign global XfbBuffer to a block missing it
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 886f694..7dc35b0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -50,7 +50,7 @@
     if (CMAKE_GENERATOR MATCHES "^Visual Studio")
       set(PCH_NAME "$(IntDir)\\pch.pch")
     else()
-      set(PCH_NAME "pch.pch")
+      set(PCH_NAME "${CMAKE_CURRENT_BINARY_DIR}/pch.pch")
     endif()
     # make source files use/depend on PCH_NAME
     set_source_files_properties(${${SRCS}} PROPERTIES COMPILE_FLAGS "/Yupch.h /FIpch.h /Fp${PCH_NAME} /Zm300" OBJECT_DEPENDS "${PCH_NAME}")
diff --git a/SPIRV/GLSL.ext.EXT.h b/SPIRV/GLSL.ext.EXT.h
index c4a2430..e29c055 100644
--- a/SPIRV/GLSL.ext.EXT.h
+++ b/SPIRV/GLSL.ext.EXT.h
@@ -28,10 +28,11 @@
 #define GLSLextEXT_H
 
 static const int GLSLextEXTVersion = 100;
-static const int GLSLextEXTRevision = 1;
+static const int GLSLextEXTRevision = 2;
 
 static const char* const E_SPV_EXT_shader_stencil_export        = "SPV_EXT_shader_stencil_export";
 static const char* const E_SPV_EXT_shader_viewport_index_layer  = "SPV_EXT_shader_viewport_index_layer";
 static const char* const E_SPV_EXT_fragment_fully_covered = "SPV_EXT_fragment_fully_covered";
+static const char* const E_SPV_EXT_fragment_invocation_density = "SPV_EXT_fragment_invocation_density";
 
 #endif  // #ifndef GLSLextEXT_H
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 632a217..5c00024 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -833,6 +833,16 @@
         builder.addCapability(spv::CapabilityMultiView);
         return spv::BuiltInViewIndex;
 
+    case glslang::EbvFragSizeEXT:
+        builder.addExtension(spv::E_SPV_EXT_fragment_invocation_density);
+        builder.addCapability(spv::CapabilityFragmentDensityEXT);
+        return spv::BuiltInFragSizeEXT;
+
+    case glslang::EbvFragInvocationCountEXT:
+        builder.addExtension(spv::E_SPV_EXT_fragment_invocation_density);
+        builder.addCapability(spv::CapabilityFragmentDensityEXT);
+        return spv::BuiltInFragInvocationCountEXT;
+
 #ifdef NV_EXTENSIONS
     case glslang::EbvViewportMaskNV:
         if (!memberDeclaration) {
@@ -2775,7 +2785,9 @@
     // can still have a mapping to a SPIR-V Id.
     // This includes specialization constants.
     if (node->getQualifier().isConstant()) {
-        return createSpvConstant(*node);
+        spv::Id result = createSpvConstant(*node);
+        if (result != spv::NoResult)
+            return result;
     }
 
     // Now, handle actual variables
@@ -3457,6 +3469,7 @@
     switch (type.getQualifier().layoutPacking) {
     case glslang::ElpStd140:
     case glslang::ElpStd430:
+    case glslang::ElpScalar:
         return type.getQualifier().layoutPacking;
     default:
         return glslang::ElpNone;
@@ -3468,7 +3481,7 @@
 {
     int size;
     int stride;
-    glslangIntermediate->getBaseAlignment(arrayType, size, stride, explicitLayout == glslang::ElpStd140, matrixLayout == glslang::ElmRowMajor);
+    glslangIntermediate->getMemberAlignment(arrayType, size, stride, explicitLayout, matrixLayout == glslang::ElmRowMajor);
 
     return stride;
 }
@@ -3483,7 +3496,7 @@
 
     int size;
     int stride;
-    glslangIntermediate->getBaseAlignment(elementType, size, stride, explicitLayout == glslang::ElpStd140, matrixLayout == glslang::ElmRowMajor);
+    glslangIntermediate->getMemberAlignment(elementType, size, stride, explicitLayout, matrixLayout == glslang::ElmRowMajor);
 
     return stride;
 }
@@ -3525,7 +3538,7 @@
 
     int memberSize;
     int dummyStride;
-    int memberAlignment = glslangIntermediate->getBaseAlignment(memberType, memberSize, dummyStride, explicitLayout == glslang::ElpStd140, matrixLayout == glslang::ElmRowMajor);
+    int memberAlignment = glslangIntermediate->getMemberAlignment(memberType, memberSize, dummyStride, explicitLayout, matrixLayout == glslang::ElmRowMajor);
 
     // Adjust alignment for HLSL rules
     // TODO: make this consistent in early phases of code:
@@ -3544,7 +3557,7 @@
     glslang::RoundToPow2(currentOffset, memberAlignment);
 
     // Bump up to vec4 if there is a bad straddle
-    if (glslangIntermediate->improperStraddle(memberType, memberSize, currentOffset))
+    if (explicitLayout != glslang::ElpScalar && glslangIntermediate->improperStraddle(memberType, memberSize, currentOffset))
         glslang::RoundToPow2(currentOffset, 16);
 
     nextOffset = currentOffset + memberSize;
@@ -4631,7 +4644,9 @@
             assert(builder.isScalar(right));
             needMatchingVectors = false;
             binOp = spv::OpVectorTimesScalar;
-        } else
+        } else if (isFloat)
+            binOp = spv::OpFMul;
+          else
             binOp = spv::OpIMul;
         break;
     case glslang::EOpVectorTimesMatrix:
@@ -6910,6 +6925,17 @@
         // We might need the remaining arguments, e.g. in the EOpFrexp case.
         std::vector<spv::Id> callArguments(operands.begin(), operands.begin() + consumedOperands);
         id = builder.createBuiltinCall(typeId, extBuiltins >= 0 ? extBuiltins : stdBuiltins, libCall, callArguments);
+    } else if (opCode == spv::OpDot && !isFloat) {
+        // int dot(int, int)
+        // NOTE: never called for scalar/vector1, this is turned into simple mul before this can be reached
+        const int componentCount = builder.getNumComponents(operands[0]);
+        spv::Id mulOp = builder.createBinOp(spv::OpIMul, builder.getTypeId(operands[0]), operands[0], operands[1]);
+        builder.setPrecision(mulOp, precision);
+        id = builder.createCompositeExtract(mulOp, typeId, 0);
+        for (int i = 1; i < componentCount; ++i) {
+            builder.setPrecision(id, precision);
+            id = builder.createBinOp(spv::OpIAdd, typeId, id, builder.createCompositeExtract(operands[0], typeId, i));
+        }
     } else {
         switch (consumedOperands) {
         case 0:
@@ -7302,6 +7328,9 @@
         } else if (auto* const_union_array = &sn->getConstArray()) {
             int nextConst = 0;
             result = createSpvConstantFromConstUnionArray(sn->getType(), *const_union_array, nextConst, true);
+        } else {
+            logger->missingFunctionality("Invalid initializer for spec onstant.");
+            return spv::NoResult;
         }
         builder.addName(result, sn->getName().c_str());
         return result;
@@ -7310,7 +7339,6 @@
     // Neither a front-end constant node, nor a specialization constant node with constant union array or
     // constant sub tree as initializer.
     logger->missingFunctionality("Neither a front-end constant nor a spec constant.");
-    exit(1);
     return spv::NoResult;
 }
 
diff --git a/SPIRV/SpvTools.cpp b/SPIRV/SpvTools.cpp
index 05f234c..a886b16 100755
--- a/SPIRV/SpvTools.cpp
+++ b/SPIRV/SpvTools.cpp
@@ -181,7 +181,7 @@
     optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
     optimizer.RegisterPass(spvtools::CreateCFGCleanupPass());
 
-    optimizer.Run(spirv.data(), spirv.size(), &spirv, spvtools::ValidatorOptions(), true);
+    optimizer.Run(spirv.data(), spirv.size(), &spirv);
 }
 
 }; // end namespace glslang
diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp
index 4f7c198..b0b01fb 100644
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -388,12 +388,15 @@
     case BuiltInSecondaryViewportMaskNV:    return "SecondaryViewportMaskNV";
     case BuiltInPositionPerViewNV:          return "PositionPerViewNV";
     case BuiltInViewportMaskPerViewNV:      return "ViewportMaskPerViewNV";
-    case BuiltInFragmentSizeNV:             return "FragmentSizeNV";
-    case BuiltInInvocationsPerPixelNV:      return "InvocationsPerPixelNV";
+//    case BuiltInFragmentSizeNV:             return "FragmentSizeNV";        // superseded by BuiltInFragSizeEXT
+//    case BuiltInInvocationsPerPixelNV:      return "InvocationsPerPixelNV"; // superseded by BuiltInFragInvocationCountEXT
     case BuiltInBaryCoordNV:                return "BaryCoordNV";
     case BuiltInBaryCoordNoPerspNV:         return "BaryCoordNoPerspNV";
 #endif
 
+    case BuiltInFragSizeEXT:                return "FragSizeEXT";
+    case BuiltInFragInvocationCountEXT:     return "FragInvocationCountEXT";
+
     case 5264: return "FullyCoveredEXT";
 
 
@@ -897,8 +900,9 @@
     case CapabilityComputeDerivativeGroupLinearNV:  return "ComputeDerivativeGroupLinearNV";
     case CapabilityFragmentBarycentricNV:           return "FragmentBarycentricNV";
     case CapabilityMeshShadingNV:                   return "MeshShadingNV";
-    case CapabilityShadingRateNV:                   return "ShadingRateNV";
+//    case CapabilityShadingRateNV:                   return "ShadingRateNV";  // superseded by CapabilityFragmentDensityEXT
 #endif
+    case CapabilityFragmentDensityEXT:              return "FragmentDensityEXT";
 
     case CapabilityFragmentFullyCoveredEXT: return "FragmentFullyCoveredEXT";
 
diff --git a/SPIRV/spirv.hpp b/SPIRV/spirv.hpp
index 25b5ce9..72e577a 100644
--- a/SPIRV/spirv.hpp
+++ b/SPIRV/spirv.hpp
@@ -26,13 +26,14 @@
 // the Binary Section of the SPIR-V specification.
 
 // Enumeration tokens for SPIR-V, in various styles:
-//   C, C++, C++11, JSON, Lua, Python
+//   C, C++, C++11, JSON, Lua, Python, C#
 // 
 // - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL
 // - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL
 // - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL
 // - Lua will use tables, e.g.: spv.SourceLanguage.GLSL
 // - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL']
+// - C# will use enum classes in the Specification class located in the "Spv" namespace, e.g.: Spv.Specification.SourceLanguage.GLSL
 // 
 // Some tokens act like mask values, which can be OR'd together,
 // while others are mutually exclusive.  The mask-like ones have
@@ -512,7 +513,9 @@
     BuiltInMeshViewIndicesNV = 5281,
     BuiltInBaryCoordNV = 5286,
     BuiltInBaryCoordNoPerspNV = 5287,
+    BuiltInFragSizeEXT = 5292,
     BuiltInFragmentSizeNV = 5292,
+    BuiltInFragInvocationCountEXT = 5293,
     BuiltInInvocationsPerPixelNV = 5293,
     BuiltInLaunchIdNV = 5319,
     BuiltInLaunchSizeNV = 5320,
@@ -770,6 +773,7 @@
     CapabilityImageFootprintNV = 5282,
     CapabilityFragmentBarycentricNV = 5284,
     CapabilityComputeDerivativeGroupQuadsNV = 5288,
+    CapabilityFragmentDensityEXT = 5291,
     CapabilityShadingRateNV = 5291,
     CapabilityGroupNonUniformPartitionedNV = 5297,
     CapabilityShaderNonUniformEXT = 5301,
diff --git a/Test/baseResults/300.vert.out b/Test/baseResults/300.vert.out
index 95ebb92..d8c9e16 100644
--- a/Test/baseResults/300.vert.out
+++ b/Test/baseResults/300.vert.out
@@ -39,7 +39,7 @@
 ERROR: 0:169: 'Bblock' : cannot add storage, auxiliary, memory, interpolation, layout, or precision qualifier to an existing variable 
 ERROR: 0:170: 'Bfoo' : cannot add storage, auxiliary, memory, interpolation, layout, or precision qualifier to an existing variable 
 ERROR: 0:172: 'std430' : not supported for this version or the enabled extensions 
-ERROR: 0:172: 'std430' : requires the 'buffer' storage qualifier 
+ERROR: 0:172: 'std430 requires the buffer storage qualifier' : required extension not requested: GL_EXT_scalar_block_layout
 ERROR: 0:175: '' : array size required 
 ERROR: 0:185: 'assign' :  cannot convert from ' temp 4-element array of highp float' to ' temp 3-element array of highp float'
 ERROR: 0:186: 'assign' :  cannot convert from ' temp 3-element array of highp float' to ' temp 4-element array of highp float'
diff --git a/Test/baseResults/310.vert.out b/Test/baseResults/310.vert.out
index 21fa27b..baf0987 100644
--- a/Test/baseResults/310.vert.out
+++ b/Test/baseResults/310.vert.out
@@ -15,7 +15,7 @@
 ERROR: 0:79: 'vertex-shader array-of-struct output' : not supported with this profile: es
 ERROR: 0:81: 'vertex-shader struct output containing an array' : not supported with this profile: es
 ERROR: 0:83: 'vertex-shader struct output containing structure' : not supported with this profile: es
-ERROR: 0:85: 'std430' : requires the 'buffer' storage qualifier 
+ERROR: 0:85: 'std430 requires the buffer storage qualifier' : required extension not requested: GL_EXT_scalar_block_layout
 ERROR: 0:97: 's' : member of block cannot be or contain a sampler, image, or atomic_uint type 
 ERROR: 0:105: 'location' : overlapping use of location 12
 ERROR: 0:107: 'input block' : not supported in this stage: vertex
diff --git a/Test/baseResults/420.vert.out b/Test/baseResults/420.vert.out
index 25bce16..22577ab 100644
--- a/Test/baseResults/420.vert.out
+++ b/Test/baseResults/420.vert.out
@@ -46,7 +46,7 @@
 ERROR: 0:143: 'rgba32ui' : does not apply to signed integer images 
 ERROR: 0:144: 'r8ui' : does not apply to signed integer images 
 ERROR: 0:147: 'offset on block member' : not supported for this version or the enabled extensions 
-ERROR: 0:147: 'offset/align' : can only be used with std140 or std430 layout packing 
+ERROR: 0:147: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:157: 'textureQueryLevels' : no matching overloaded function found 
 ERROR: 0:157: 'assign' :  cannot convert from ' const float' to ' temp int'
 ERROR: 0:158: 'textureQueryLevels' : no matching overloaded function found 
diff --git a/Test/baseResults/430.vert.out b/Test/baseResults/430.vert.out
index 29ffb01..f57a39c 100644
--- a/Test/baseResults/430.vert.out
+++ b/Test/baseResults/430.vert.out
@@ -27,9 +27,9 @@
 ERROR: 0:65: 'uniform buffer-member align' : not supported for this version or the enabled extensions 
 ERROR: 0:65: 'offset on block member' : not supported for this version or the enabled extensions 
 ERROR: 0:66: 'offset on block member' : not supported for this version or the enabled extensions 
-ERROR: 0:64: 'align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:65: 'offset/align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:66: 'offset/align' : can only be used with std140 or std430 layout packing 
+ERROR: 0:64: 'align' : can only be used with std140, std430, or scalar layout packing 
+ERROR: 0:65: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
+ERROR: 0:66: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:71: 'offset on block member' : not supported for this version or the enabled extensions 
 ERROR: 0:74: 'gl_MaxTransformFeedbackBuffers' : required extension not requested: GL_ARB_enhanced_layouts
 ERROR: 0:75: 'gl_MaxTransformFeedbackInterleavedComponents' : required extension not requested: GL_ARB_enhanced_layouts
diff --git a/Test/baseResults/440.frag.out b/Test/baseResults/440.frag.out
index 18e014f..1ac6e7c 100644
--- a/Test/baseResults/440.frag.out
+++ b/Test/baseResults/440.frag.out
@@ -21,11 +21,11 @@
 ERROR: 0:39: 'output block' : not supported in this stage: fragment
 ERROR: 0:39: 'layout' : offset/align can only be used on a uniform or buffer 
 ERROR: 0:39: 'offset' : only applies to block members, not blocks 
-ERROR: 0:42: 'align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:43: 'align' : can only be used with std140 or std430 layout packing 
+ERROR: 0:42: 'align' : can only be used with std140, std430, or scalar layout packing 
+ERROR: 0:43: 'align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:43: 'layout' : offset/align can only be used on a uniform or buffer 
 ERROR: 0:44: 'output block' : not supported in this stage: fragment
-ERROR: 0:44: 'align' : can only be used with std140 or std430 layout packing 
+ERROR: 0:44: 'align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:44: 'layout' : offset/align can only be used on a uniform or buffer 
 ERROR: 0:46: 'offset' : cannot specify on a variable declaration 
 ERROR: 0:47: 'layout' : offset/align can only be used on a uniform or buffer 
@@ -36,9 +36,9 @@
 ERROR: 0:54: 'layout' : matrix or packing qualifiers can only be used on a uniform or buffer 
 ERROR: 0:55: 'layout' : cannot specify packing on a variable declaration 
 ERROR: 0:57: 'align' : must be a power of 2 
-ERROR: 0:58: 'offset/align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:62: 'offset/align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:63: 'offset/align' : can only be used with std140 or std430 layout packing 
+ERROR: 0:58: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
+ERROR: 0:62: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
+ERROR: 0:63: 'offset/align' : can only be used with std140, std430, or scalar layout packing 
 ERROR: 0:62: 'layout' : offset/align can only be used on a uniform or buffer 
 ERROR: 0:63: 'layout' : offset/align can only be used on a uniform or buffer 
 ERROR: 0:84: 'align' : must be a power of 2 
diff --git a/Test/baseResults/440.vert.out b/Test/baseResults/440.vert.out
index 41796cb..5a10e26 100644
--- a/Test/baseResults/440.vert.out
+++ b/Test/baseResults/440.vert.out
@@ -171,6 +171,8 @@
 ERROR: Linking vertex stage: xfb_stride must be multiple of 4:
 ERROR:     xfb_buffer 5, xfb_stride 6
 ERROR: Linking vertex stage: xfb_stride is too large:
+ERROR:     xfb_buffer 6, components (1/4 stride) needed are 500, gl_MaxTransformFeedbackInterleavedComponents is 64
+ERROR: Linking vertex stage: xfb_stride is too large:
 ERROR:     xfb_buffer 7, components (1/4 stride) needed are 66, gl_MaxTransformFeedbackInterleavedComponents is 64
 
 Shader version: 440
diff --git a/Test/baseResults/constantUnaryConversion.comp.out b/Test/baseResults/constantUnaryConversion.comp.out
new file mode 100644
index 0000000..de705e4
--- /dev/null
+++ b/Test/baseResults/constantUnaryConversion.comp.out
@@ -0,0 +1,645 @@
+constantUnaryConversion.comp
+Shader version: 450
+Requested GL_KHX_shader_explicit_arithmetic_types
+local_size = (1, 1, 1)
+0:? Sequence
+0:48  Function Definition: main( ( global void)
+0:48    Function Parameters: 
+0:?   Linker Objects
+0:?     'bool_init' ( const bool)
+0:?       true (const bool)
+0:?     'int8_t_init' ( const int8_t)
+0:?       -1 (const int)
+0:?     'int16_t_init' ( const int16_t)
+0:?       -2 (const int)
+0:?     'int32_t_init' ( const int)
+0:?       -3 (const int)
+0:?     'int64_t_init' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_init' ( const uint8_t)
+0:?       1 (const int)
+0:?     'uint16_t_init' ( const uint16_t)
+0:?       2 (const int)
+0:?     'uint32_t_init' ( const uint)
+0:?       3 (const uint)
+0:?     'uint64_t_init' ( const uint64_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_init' ( const float16_t)
+0:?       42.000000
+0:?     'float32_t_init' ( const float)
+0:?       13.000000
+0:?     'float64_t_init' ( const double)
+0:?       -4.000000
+0:?     'bool_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'int8_t_to_bool' ( const bool)
+0:?       -1 (const int)
+0:?     'int16_t_to_bool' ( const bool)
+0:?       -2 (const int)
+0:?     'int32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'int64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'uint8_t_to_bool' ( const bool)
+0:?       1 (const int)
+0:?     'uint16_t_to_bool' ( const bool)
+0:?       2 (const int)
+0:?     'uint32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'uint64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float16_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'bool_to_int8_t' ( const int8_t)
+0:?       true (const bool)
+0:?     'int8_t_to_int8_t' ( const int8_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int8_t' ( const int8_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int8_t' ( const int8_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_int8_t' ( const int8_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int8_t' ( const int8_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int8_t' ( const int8_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int8_t' ( const int8_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_int8_t' ( const int8_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_int8_t' ( const int8_t)
+0:?       42.000000
+0:?     'float32_t_to_int8_t' ( const int8_t)
+0:?       13.000000
+0:?     'float64_t_to_int8_t' ( const int8_t)
+0:?       -4.000000
+0:?     'bool_to_int16_t' ( const int16_t)
+0:?       true (const bool)
+0:?     'int8_t_to_int16_t' ( const int16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int16_t' ( const int16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int16_t' ( const int16_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_int16_t' ( const int16_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int16_t' ( const int16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int16_t' ( const int16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int16_t' ( const int16_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_int16_t' ( const int16_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_int16_t' ( const int16_t)
+0:?       42.000000
+0:?     'float32_t_to_int16_t' ( const int16_t)
+0:?       13.000000
+0:?     'float64_t_to_int16_t' ( const int16_t)
+0:?       -4.000000
+0:?     'bool_to_int32_t' ( const int)
+0:?       1 (const int)
+0:?     'int8_t_to_int32_t' ( const int)
+0:?       -1 (const int)
+0:?     'int16_t_to_int32_t' ( const int)
+0:?       -2 (const int)
+0:?     'int32_t_to_int32_t' ( const int)
+0:?       -3 (const int)
+0:?     'int64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'uint8_t_to_int32_t' ( const int)
+0:?       1 (const int)
+0:?     'uint16_t_to_int32_t' ( const int)
+0:?       2 (const int)
+0:?     'uint32_t_to_int32_t' ( const int)
+0:?       3 (const int)
+0:?     'uint64_t_to_int32_t' ( const int)
+0:?       4 (const int)
+0:?     'float16_t_to_int32_t' ( const int)
+0:?       42 (const int)
+0:?     'float32_t_to_int32_t' ( const int)
+0:?       13 (const int)
+0:?     'float64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'bool_to_int64_t' ( const int64_t)
+0:?       1 (const int64_t)
+0:?     'int8_t_to_int64_t' ( const int64_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int64_t' ( const int64_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int64_t' ( const int64_t)
+0:?       -3 (const int64_t)
+0:?     'int64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int64_t' ( const int64_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int64_t' ( const int64_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int64_t' ( const int64_t)
+0:?       3 (const int64_t)
+0:?     'uint64_t_to_int64_t' ( const int64_t)
+0:?       4 (const int64_t)
+0:?     'float16_t_to_int64_t' ( const int64_t)
+0:?       42 (const int64_t)
+0:?     'float32_t_to_int64_t' ( const int64_t)
+0:?       13 (const int64_t)
+0:?     'float64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'bool_to_uint8_t' ( const uint8_t)
+0:?       true (const bool)
+0:?     'int8_t_to_uint8_t' ( const uint8_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint8_t' ( const uint8_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint8_t' ( const uint8_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_uint8_t' ( const uint8_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_uint8_t' ( const uint8_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint8_t' ( const uint8_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint8_t' ( const uint8_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint8_t' ( const uint8_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint8_t' ( const uint8_t)
+0:?       42.000000
+0:?     'float32_t_to_uint8_t' ( const uint8_t)
+0:?       13.000000
+0:?     'float64_t_to_uint8_t' ( const uint8_t)
+0:?       -4.000000
+0:?     'bool_to_uint16_t' ( const uint16_t)
+0:?       true (const bool)
+0:?     'int8_t_to_uint16_t' ( const uint16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint16_t' ( const uint16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint16_t' ( const uint16_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_uint16_t' ( const uint16_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_uint16_t' ( const uint16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint16_t' ( const uint16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint16_t' ( const uint16_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint16_t' ( const uint16_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint16_t' ( const uint16_t)
+0:?       42.000000
+0:?     'float32_t_to_uint16_t' ( const uint16_t)
+0:?       13.000000
+0:?     'float64_t_to_uint16_t' ( const uint16_t)
+0:?       -4.000000
+0:?     'bool_to_uint32_t' ( const uint)
+0:?       1 (const uint)
+0:?     'int8_t_to_uint32_t' ( const uint)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint32_t' ( const uint)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint32_t' ( const uint)
+0:?       4294967293 (const uint)
+0:?     'int64_t_to_uint32_t' ( const uint)
+0:?       4294967292 (const uint)
+0:?     'uint8_t_to_uint32_t' ( const uint)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint32_t' ( const uint)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint32_t' ( const uint)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint32_t' ( const uint)
+0:?       4 (const uint)
+0:?     'float16_t_to_uint32_t' ( const uint)
+0:?       42 (const uint)
+0:?     'float32_t_to_uint32_t' ( const uint)
+0:?       13 (const uint)
+0:?     'float64_t_to_uint32_t' ( const uint)
+0:?       4294967292 (const uint)
+0:?     'bool_to_uint64_t' ( const uint64_t)
+0:?       1 (const uint64_t)
+0:?     'int8_t_to_uint64_t' ( const uint64_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint64_t' ( const uint64_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551613 (const uint64_t)
+0:?     'int64_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551612 (const uint64_t)
+0:?     'uint8_t_to_uint64_t' ( const uint64_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint64_t' ( const uint64_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint64_t' ( const uint64_t)
+0:?       3 (const uint64_t)
+0:?     'uint64_t_to_uint64_t' ( const uint64_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint64_t' ( const uint64_t)
+0:?       42 (const uint64_t)
+0:?     'float32_t_to_uint64_t' ( const uint64_t)
+0:?       13 (const uint64_t)
+0:?     'float64_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551612 (const uint64_t)
+0:?     'bool_to_float16_t' ( const float16_t)
+0:?       1.000000
+0:?     'int8_t_to_float16_t' ( const float16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_float16_t' ( const float16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_float16_t' ( const float16_t)
+0:?       -3.000000
+0:?     'int64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'uint8_t_to_float16_t' ( const float16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_float16_t' ( const float16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_float16_t' ( const float16_t)
+0:?       3.000000
+0:?     'uint64_t_to_float16_t' ( const float16_t)
+0:?       4.000000
+0:?     'float16_t_to_float16_t' ( const float16_t)
+0:?       42.000000
+0:?     'float32_t_to_float16_t' ( const float16_t)
+0:?       13.000000
+0:?     'float64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'bool_to_float32_t' ( const float)
+0:?       1.000000
+0:?     'int8_t_to_float32_t' ( const float)
+0:?       -1 (const int)
+0:?     'int16_t_to_float32_t' ( const float)
+0:?       -2 (const int)
+0:?     'int32_t_to_float32_t' ( const float)
+0:?       -3.000000
+0:?     'int64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'uint8_t_to_float32_t' ( const float)
+0:?       1 (const int)
+0:?     'uint16_t_to_float32_t' ( const float)
+0:?       2 (const int)
+0:?     'uint32_t_to_float32_t' ( const float)
+0:?       3.000000
+0:?     'uint64_t_to_float32_t' ( const float)
+0:?       4.000000
+0:?     'float16_t_to_float32_t' ( const float)
+0:?       42.000000
+0:?     'float32_t_to_float32_t' ( const float)
+0:?       13.000000
+0:?     'float64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'bool_to_float64_t' ( const double)
+0:?       1.000000
+0:?     'int8_t_to_float64_t' ( const double)
+0:?       -1 (const int)
+0:?     'int16_t_to_float64_t' ( const double)
+0:?       -2 (const int)
+0:?     'int32_t_to_float64_t' ( const double)
+0:?       -3.000000
+0:?     'int64_t_to_float64_t' ( const double)
+0:?       -4.000000
+0:?     'uint8_t_to_float64_t' ( const double)
+0:?       1 (const int)
+0:?     'uint16_t_to_float64_t' ( const double)
+0:?       2 (const int)
+0:?     'uint32_t_to_float64_t' ( const double)
+0:?       3.000000
+0:?     'uint64_t_to_float64_t' ( const double)
+0:?       4.000000
+0:?     'float16_t_to_float64_t' ( const double)
+0:?       42.000000
+0:?     'float32_t_to_float64_t' ( const double)
+0:?       13.000000
+0:?     'float64_t_to_float64_t' ( const double)
+0:?       -4.000000
+
+
+Linked compute stage:
+
+
+Shader version: 450
+Requested GL_KHX_shader_explicit_arithmetic_types
+local_size = (1, 1, 1)
+0:? Sequence
+0:48  Function Definition: main( ( global void)
+0:48    Function Parameters: 
+0:?   Linker Objects
+0:?     'bool_init' ( const bool)
+0:?       true (const bool)
+0:?     'int8_t_init' ( const int8_t)
+0:?       -1 (const int)
+0:?     'int16_t_init' ( const int16_t)
+0:?       -2 (const int)
+0:?     'int32_t_init' ( const int)
+0:?       -3 (const int)
+0:?     'int64_t_init' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_init' ( const uint8_t)
+0:?       1 (const int)
+0:?     'uint16_t_init' ( const uint16_t)
+0:?       2 (const int)
+0:?     'uint32_t_init' ( const uint)
+0:?       3 (const uint)
+0:?     'uint64_t_init' ( const uint64_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_init' ( const float16_t)
+0:?       42.000000
+0:?     'float32_t_init' ( const float)
+0:?       13.000000
+0:?     'float64_t_init' ( const double)
+0:?       -4.000000
+0:?     'bool_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'int8_t_to_bool' ( const bool)
+0:?       -1 (const int)
+0:?     'int16_t_to_bool' ( const bool)
+0:?       -2 (const int)
+0:?     'int32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'int64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'uint8_t_to_bool' ( const bool)
+0:?       1 (const int)
+0:?     'uint16_t_to_bool' ( const bool)
+0:?       2 (const int)
+0:?     'uint32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'uint64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float16_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float32_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'float64_t_to_bool' ( const bool)
+0:?       true (const bool)
+0:?     'bool_to_int8_t' ( const int8_t)
+0:?       true (const bool)
+0:?     'int8_t_to_int8_t' ( const int8_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int8_t' ( const int8_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int8_t' ( const int8_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_int8_t' ( const int8_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int8_t' ( const int8_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int8_t' ( const int8_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int8_t' ( const int8_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_int8_t' ( const int8_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_int8_t' ( const int8_t)
+0:?       42.000000
+0:?     'float32_t_to_int8_t' ( const int8_t)
+0:?       13.000000
+0:?     'float64_t_to_int8_t' ( const int8_t)
+0:?       -4.000000
+0:?     'bool_to_int16_t' ( const int16_t)
+0:?       true (const bool)
+0:?     'int8_t_to_int16_t' ( const int16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int16_t' ( const int16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int16_t' ( const int16_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_int16_t' ( const int16_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int16_t' ( const int16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int16_t' ( const int16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int16_t' ( const int16_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_int16_t' ( const int16_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_int16_t' ( const int16_t)
+0:?       42.000000
+0:?     'float32_t_to_int16_t' ( const int16_t)
+0:?       13.000000
+0:?     'float64_t_to_int16_t' ( const int16_t)
+0:?       -4.000000
+0:?     'bool_to_int32_t' ( const int)
+0:?       1 (const int)
+0:?     'int8_t_to_int32_t' ( const int)
+0:?       -1 (const int)
+0:?     'int16_t_to_int32_t' ( const int)
+0:?       -2 (const int)
+0:?     'int32_t_to_int32_t' ( const int)
+0:?       -3 (const int)
+0:?     'int64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'uint8_t_to_int32_t' ( const int)
+0:?       1 (const int)
+0:?     'uint16_t_to_int32_t' ( const int)
+0:?       2 (const int)
+0:?     'uint32_t_to_int32_t' ( const int)
+0:?       3 (const int)
+0:?     'uint64_t_to_int32_t' ( const int)
+0:?       4 (const int)
+0:?     'float16_t_to_int32_t' ( const int)
+0:?       42 (const int)
+0:?     'float32_t_to_int32_t' ( const int)
+0:?       13 (const int)
+0:?     'float64_t_to_int32_t' ( const int)
+0:?       -4 (const int)
+0:?     'bool_to_int64_t' ( const int64_t)
+0:?       1 (const int64_t)
+0:?     'int8_t_to_int64_t' ( const int64_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_int64_t' ( const int64_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_int64_t' ( const int64_t)
+0:?       -3 (const int64_t)
+0:?     'int64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_int64_t' ( const int64_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_int64_t' ( const int64_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_int64_t' ( const int64_t)
+0:?       3 (const int64_t)
+0:?     'uint64_t_to_int64_t' ( const int64_t)
+0:?       4 (const int64_t)
+0:?     'float16_t_to_int64_t' ( const int64_t)
+0:?       42 (const int64_t)
+0:?     'float32_t_to_int64_t' ( const int64_t)
+0:?       13 (const int64_t)
+0:?     'float64_t_to_int64_t' ( const int64_t)
+0:?       -4 (const int64_t)
+0:?     'bool_to_uint8_t' ( const uint8_t)
+0:?       true (const bool)
+0:?     'int8_t_to_uint8_t' ( const uint8_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint8_t' ( const uint8_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint8_t' ( const uint8_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_uint8_t' ( const uint8_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_uint8_t' ( const uint8_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint8_t' ( const uint8_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint8_t' ( const uint8_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint8_t' ( const uint8_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint8_t' ( const uint8_t)
+0:?       42.000000
+0:?     'float32_t_to_uint8_t' ( const uint8_t)
+0:?       13.000000
+0:?     'float64_t_to_uint8_t' ( const uint8_t)
+0:?       -4.000000
+0:?     'bool_to_uint16_t' ( const uint16_t)
+0:?       true (const bool)
+0:?     'int8_t_to_uint16_t' ( const uint16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint16_t' ( const uint16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint16_t' ( const uint16_t)
+0:?       -3 (const int)
+0:?     'int64_t_to_uint16_t' ( const uint16_t)
+0:?       -4 (const int64_t)
+0:?     'uint8_t_to_uint16_t' ( const uint16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint16_t' ( const uint16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint16_t' ( const uint16_t)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint16_t' ( const uint16_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint16_t' ( const uint16_t)
+0:?       42.000000
+0:?     'float32_t_to_uint16_t' ( const uint16_t)
+0:?       13.000000
+0:?     'float64_t_to_uint16_t' ( const uint16_t)
+0:?       -4.000000
+0:?     'bool_to_uint32_t' ( const uint)
+0:?       1 (const uint)
+0:?     'int8_t_to_uint32_t' ( const uint)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint32_t' ( const uint)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint32_t' ( const uint)
+0:?       4294967293 (const uint)
+0:?     'int64_t_to_uint32_t' ( const uint)
+0:?       4294967292 (const uint)
+0:?     'uint8_t_to_uint32_t' ( const uint)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint32_t' ( const uint)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint32_t' ( const uint)
+0:?       3 (const uint)
+0:?     'uint64_t_to_uint32_t' ( const uint)
+0:?       4 (const uint)
+0:?     'float16_t_to_uint32_t' ( const uint)
+0:?       42 (const uint)
+0:?     'float32_t_to_uint32_t' ( const uint)
+0:?       13 (const uint)
+0:?     'float64_t_to_uint32_t' ( const uint)
+0:?       4294967292 (const uint)
+0:?     'bool_to_uint64_t' ( const uint64_t)
+0:?       1 (const uint64_t)
+0:?     'int8_t_to_uint64_t' ( const uint64_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_uint64_t' ( const uint64_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551613 (const uint64_t)
+0:?     'int64_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551612 (const uint64_t)
+0:?     'uint8_t_to_uint64_t' ( const uint64_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_uint64_t' ( const uint64_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_uint64_t' ( const uint64_t)
+0:?       3 (const uint64_t)
+0:?     'uint64_t_to_uint64_t' ( const uint64_t)
+0:?       4 (const uint64_t)
+0:?     'float16_t_to_uint64_t' ( const uint64_t)
+0:?       42 (const uint64_t)
+0:?     'float32_t_to_uint64_t' ( const uint64_t)
+0:?       13 (const uint64_t)
+0:?     'float64_t_to_uint64_t' ( const uint64_t)
+0:?       18446744073709551612 (const uint64_t)
+0:?     'bool_to_float16_t' ( const float16_t)
+0:?       1.000000
+0:?     'int8_t_to_float16_t' ( const float16_t)
+0:?       -1 (const int)
+0:?     'int16_t_to_float16_t' ( const float16_t)
+0:?       -2 (const int)
+0:?     'int32_t_to_float16_t' ( const float16_t)
+0:?       -3.000000
+0:?     'int64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'uint8_t_to_float16_t' ( const float16_t)
+0:?       1 (const int)
+0:?     'uint16_t_to_float16_t' ( const float16_t)
+0:?       2 (const int)
+0:?     'uint32_t_to_float16_t' ( const float16_t)
+0:?       3.000000
+0:?     'uint64_t_to_float16_t' ( const float16_t)
+0:?       4.000000
+0:?     'float16_t_to_float16_t' ( const float16_t)
+0:?       42.000000
+0:?     'float32_t_to_float16_t' ( const float16_t)
+0:?       13.000000
+0:?     'float64_t_to_float16_t' ( const float16_t)
+0:?       -4.000000
+0:?     'bool_to_float32_t' ( const float)
+0:?       1.000000
+0:?     'int8_t_to_float32_t' ( const float)
+0:?       -1 (const int)
+0:?     'int16_t_to_float32_t' ( const float)
+0:?       -2 (const int)
+0:?     'int32_t_to_float32_t' ( const float)
+0:?       -3.000000
+0:?     'int64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'uint8_t_to_float32_t' ( const float)
+0:?       1 (const int)
+0:?     'uint16_t_to_float32_t' ( const float)
+0:?       2 (const int)
+0:?     'uint32_t_to_float32_t' ( const float)
+0:?       3.000000
+0:?     'uint64_t_to_float32_t' ( const float)
+0:?       4.000000
+0:?     'float16_t_to_float32_t' ( const float)
+0:?       42.000000
+0:?     'float32_t_to_float32_t' ( const float)
+0:?       13.000000
+0:?     'float64_t_to_float32_t' ( const float)
+0:?       -4.000000
+0:?     'bool_to_float64_t' ( const double)
+0:?       1.000000
+0:?     'int8_t_to_float64_t' ( const double)
+0:?       -1 (const int)
+0:?     'int16_t_to_float64_t' ( const double)
+0:?       -2 (const int)
+0:?     'int32_t_to_float64_t' ( const double)
+0:?       -3.000000
+0:?     'int64_t_to_float64_t' ( const double)
+0:?       -4.000000
+0:?     'uint8_t_to_float64_t' ( const double)
+0:?       1 (const int)
+0:?     'uint16_t_to_float64_t' ( const double)
+0:?       2 (const int)
+0:?     'uint32_t_to_float64_t' ( const double)
+0:?       3.000000
+0:?     'uint64_t_to_float64_t' ( const double)
+0:?       4.000000
+0:?     'float16_t_to_float64_t' ( const double)
+0:?       42.000000
+0:?     'float32_t_to_float64_t' ( const double)
+0:?       13.000000
+0:?     'float64_t_to_float64_t' ( const double)
+0:?       -4.000000
+
diff --git a/Test/baseResults/hlsl.buffer.frag.out b/Test/baseResults/hlsl.buffer.frag.out
index 4528d98..71393f0 100644
--- a/Test/baseResults/hlsl.buffer.frag.out
+++ b/Test/baseResults/hlsl.buffer.frag.out
@@ -146,7 +146,7 @@
 0:?     'input' ( in 4-component vector of float FragCoord)
 
 error: SPIRV-Tools Validation Errors
-error: Structure id 50 decorated as BufferBlock for variable in Uniform storage class must follow standard storage buffer layout rules: member 7 at offset 128 overlaps previous member ending at offset 171
+error: Structure id 50 decorated as BufferBlock for variable in Uniform storage class must follow relaxed storage buffer layout rules: member 7 at offset 128 overlaps previous member ending at offset 171
   %tbufName = OpTypeStruct %v4float %int %float %float %float %float %float %float %mat3v4float %mat3v4float %mat3v4float %mat3v4float
 
 // Module Version 10000
diff --git a/Test/baseResults/hlsl.constantbuffer.frag.out b/Test/baseResults/hlsl.constantbuffer.frag.out
index 4185ea9..052d84e 100644
--- a/Test/baseResults/hlsl.constantbuffer.frag.out
+++ b/Test/baseResults/hlsl.constantbuffer.frag.out
@@ -132,7 +132,9 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 
 error: SPIRV-Tools Validation Errors
-error: Only a single level of array is allowed for descriptor set variables
+error: Uniform OpVariable <id> '18[cb3] 'has illegal type.
+From Vulkan spec, section 14.5.2:
+Variables identified with the Uniform storage class are used to access transparent buffer backed resources. Such variables must be typed as OpTypeStruct, or an array of this type
   %cb3_0 = OpVariable %_ptr_Uniform__arr__arr_cb3_uint_4_uint_2 Uniform
 
 // Module Version 10000
diff --git a/Test/baseResults/hlsl.float1.frag.out b/Test/baseResults/hlsl.float1.frag.out
index 31febfd..49827dc 100644
--- a/Test/baseResults/hlsl.float1.frag.out
+++ b/Test/baseResults/hlsl.float1.frag.out
@@ -64,10 +64,6 @@
 0:?     'f1' ( global 1-component vector of float)
 0:?     'scalar' ( global float)
 
-error: SPIRV-Tools Validation Errors
-error: Expected int scalar or vector type as Result Type: IMul
-  %20 = OpIMul %float %18 %19
-
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 27
@@ -106,10 +102,10 @@
               12:             Label
               18:    6(float) Load 14(f1)
               19:    6(float) Load 16(scalar)
-              20:    6(float) IMul 18 19
+              20:    6(float) FMul 18 19
               21:    6(float) Load 9(inFloat1)
               22:    6(float) Load 10(inScalar)
-              23:    6(float) IMul 21 22
+              23:    6(float) FMul 21 22
               24:    6(float) FAdd 20 23
                               ReturnValue 24
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.int.dot.frag.out b/Test/baseResults/hlsl.int.dot.frag.out
new file mode 100644
index 0000000..afe44c8
--- /dev/null
+++ b/Test/baseResults/hlsl.int.dot.frag.out
@@ -0,0 +1,339 @@
+hlsl.int.dot.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:1  Function Definition: @main( ( temp 4-component vector of float)
+0:1    Function Parameters: 
+0:?     Sequence
+0:2      Sequence
+0:2        move second child to first child ( temp int)
+0:2          'i' ( temp int)
+0:2          Constant:
+0:2            1 (const int)
+0:3      Sequence
+0:3        move second child to first child ( temp 1-component vector of int)
+0:3          'i2' ( temp 1-component vector of int)
+0:3          Constant:
+0:3            2 (const int)
+0:4      Sequence
+0:4        move second child to first child ( temp 2-component vector of int)
+0:4          'i3' ( temp 2-component vector of int)
+0:4          Constant:
+0:4            3 (const int)
+0:4            3 (const int)
+0:5      Sequence
+0:5        move second child to first child ( temp 3-component vector of int)
+0:5          'i4' ( temp 3-component vector of int)
+0:5          Constant:
+0:5            4 (const int)
+0:5            4 (const int)
+0:5            4 (const int)
+0:6      Sequence
+0:6        move second child to first child ( temp 4-component vector of int)
+0:6          'i5' ( temp 4-component vector of int)
+0:6          Constant:
+0:6            5 (const int)
+0:6            5 (const int)
+0:6            5 (const int)
+0:6            5 (const int)
+0:8      move second child to first child ( temp int)
+0:8        'i' ( temp int)
+0:8        dot-product ( temp int)
+0:8          'i' ( temp int)
+0:8          'i' ( temp int)
+0:9      move second child to first child ( temp 1-component vector of int)
+0:9        'i2' ( temp 1-component vector of int)
+0:9        Construct int ( temp 1-component vector of int)
+0:9          dot-product ( temp int)
+0:9            Construct int ( in int)
+0:9              'i2' ( temp 1-component vector of int)
+0:9            Construct int ( in int)
+0:9              'i2' ( temp 1-component vector of int)
+0:10      move second child to first child ( temp 2-component vector of int)
+0:10        'i3' ( temp 2-component vector of int)
+0:10        Construct ivec2 ( temp 2-component vector of int)
+0:10          dot-product ( temp int)
+0:10            'i3' ( temp 2-component vector of int)
+0:10            'i3' ( temp 2-component vector of int)
+0:11      move second child to first child ( temp 3-component vector of int)
+0:11        'i4' ( temp 3-component vector of int)
+0:11        Construct ivec3 ( temp 3-component vector of int)
+0:11          dot-product ( temp int)
+0:11            'i4' ( temp 3-component vector of int)
+0:11            'i4' ( temp 3-component vector of int)
+0:12      move second child to first child ( temp 4-component vector of int)
+0:12        'i5' ( temp 4-component vector of int)
+0:12        Construct ivec4 ( temp 4-component vector of int)
+0:12          dot-product ( temp int)
+0:12            'i5' ( temp 4-component vector of int)
+0:12            'i5' ( temp 4-component vector of int)
+0:13      Branch: Return with expression
+0:13        Convert int to float ( temp 4-component vector of float)
+0:13          add ( temp 4-component vector of int)
+0:13            add ( temp 4-component vector of int)
+0:13              add ( temp 4-component vector of int)
+0:13                add ( temp 4-component vector of int)
+0:13                  'i' ( temp int)
+0:13                  Construct ivec4 ( temp 4-component vector of int)
+0:13                    Construct int ( temp int)
+0:13                      'i2' ( temp 1-component vector of int)
+0:13                vector swizzle ( temp 4-component vector of int)
+0:13                  'i3' ( temp 2-component vector of int)
+0:13                  Sequence
+0:13                    Constant:
+0:13                      0 (const int)
+0:13                    Constant:
+0:13                      1 (const int)
+0:13                    Constant:
+0:13                      0 (const int)
+0:13                    Constant:
+0:13                      1 (const int)
+0:13              vector swizzle ( temp 4-component vector of int)
+0:13                'i4' ( temp 3-component vector of int)
+0:13                Sequence
+0:13                  Constant:
+0:13                    0 (const int)
+0:13                  Constant:
+0:13                    1 (const int)
+0:13                  Constant:
+0:13                    2 (const int)
+0:13                  Constant:
+0:13                    0 (const int)
+0:13            'i5' ( temp 4-component vector of int)
+0:1  Function Definition: main( ( temp void)
+0:1    Function Parameters: 
+0:?     Sequence
+0:1      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:1        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:1  Function Definition: @main( ( temp 4-component vector of float)
+0:1    Function Parameters: 
+0:?     Sequence
+0:2      Sequence
+0:2        move second child to first child ( temp int)
+0:2          'i' ( temp int)
+0:2          Constant:
+0:2            1 (const int)
+0:3      Sequence
+0:3        move second child to first child ( temp 1-component vector of int)
+0:3          'i2' ( temp 1-component vector of int)
+0:3          Constant:
+0:3            2 (const int)
+0:4      Sequence
+0:4        move second child to first child ( temp 2-component vector of int)
+0:4          'i3' ( temp 2-component vector of int)
+0:4          Constant:
+0:4            3 (const int)
+0:4            3 (const int)
+0:5      Sequence
+0:5        move second child to first child ( temp 3-component vector of int)
+0:5          'i4' ( temp 3-component vector of int)
+0:5          Constant:
+0:5            4 (const int)
+0:5            4 (const int)
+0:5            4 (const int)
+0:6      Sequence
+0:6        move second child to first child ( temp 4-component vector of int)
+0:6          'i5' ( temp 4-component vector of int)
+0:6          Constant:
+0:6            5 (const int)
+0:6            5 (const int)
+0:6            5 (const int)
+0:6            5 (const int)
+0:8      move second child to first child ( temp int)
+0:8        'i' ( temp int)
+0:8        dot-product ( temp int)
+0:8          'i' ( temp int)
+0:8          'i' ( temp int)
+0:9      move second child to first child ( temp 1-component vector of int)
+0:9        'i2' ( temp 1-component vector of int)
+0:9        Construct int ( temp 1-component vector of int)
+0:9          dot-product ( temp int)
+0:9            Construct int ( in int)
+0:9              'i2' ( temp 1-component vector of int)
+0:9            Construct int ( in int)
+0:9              'i2' ( temp 1-component vector of int)
+0:10      move second child to first child ( temp 2-component vector of int)
+0:10        'i3' ( temp 2-component vector of int)
+0:10        Construct ivec2 ( temp 2-component vector of int)
+0:10          dot-product ( temp int)
+0:10            'i3' ( temp 2-component vector of int)
+0:10            'i3' ( temp 2-component vector of int)
+0:11      move second child to first child ( temp 3-component vector of int)
+0:11        'i4' ( temp 3-component vector of int)
+0:11        Construct ivec3 ( temp 3-component vector of int)
+0:11          dot-product ( temp int)
+0:11            'i4' ( temp 3-component vector of int)
+0:11            'i4' ( temp 3-component vector of int)
+0:12      move second child to first child ( temp 4-component vector of int)
+0:12        'i5' ( temp 4-component vector of int)
+0:12        Construct ivec4 ( temp 4-component vector of int)
+0:12          dot-product ( temp int)
+0:12            'i5' ( temp 4-component vector of int)
+0:12            'i5' ( temp 4-component vector of int)
+0:13      Branch: Return with expression
+0:13        Convert int to float ( temp 4-component vector of float)
+0:13          add ( temp 4-component vector of int)
+0:13            add ( temp 4-component vector of int)
+0:13              add ( temp 4-component vector of int)
+0:13                add ( temp 4-component vector of int)
+0:13                  'i' ( temp int)
+0:13                  Construct ivec4 ( temp 4-component vector of int)
+0:13                    Construct int ( temp int)
+0:13                      'i2' ( temp 1-component vector of int)
+0:13                vector swizzle ( temp 4-component vector of int)
+0:13                  'i3' ( temp 2-component vector of int)
+0:13                  Sequence
+0:13                    Constant:
+0:13                      0 (const int)
+0:13                    Constant:
+0:13                      1 (const int)
+0:13                    Constant:
+0:13                      0 (const int)
+0:13                    Constant:
+0:13                      1 (const int)
+0:13              vector swizzle ( temp 4-component vector of int)
+0:13                'i4' ( temp 3-component vector of int)
+0:13                Sequence
+0:13                  Constant:
+0:13                    0 (const int)
+0:13                  Constant:
+0:13                    1 (const int)
+0:13                  Constant:
+0:13                    2 (const int)
+0:13                  Constant:
+0:13                    0 (const int)
+0:13            'i5' ( temp 4-component vector of int)
+0:1  Function Definition: main( ( temp void)
+0:1    Function Parameters: 
+0:?     Sequence
+0:1      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:1        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 84
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 82
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 13  "i"
+                              Name 15  "i2"
+                              Name 19  "i3"
+                              Name 24  "i4"
+                              Name 29  "i5"
+                              Name 82  "@entryPointOutput"
+                              Decorate 82(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypeInt 32 1
+              12:             TypePointer Function 11(int)
+              14:     11(int) Constant 1
+              16:     11(int) Constant 2
+              17:             TypeVector 11(int) 2
+              18:             TypePointer Function 17(ivec2)
+              20:     11(int) Constant 3
+              21:   17(ivec2) ConstantComposite 20 20
+              22:             TypeVector 11(int) 3
+              23:             TypePointer Function 22(ivec3)
+              25:     11(int) Constant 4
+              26:   22(ivec3) ConstantComposite 25 25 25
+              27:             TypeVector 11(int) 4
+              28:             TypePointer Function 27(ivec4)
+              30:     11(int) Constant 5
+              31:   27(ivec4) ConstantComposite 30 30 30 30
+              81:             TypePointer Output 7(fvec4)
+82(@entryPointOutput):     81(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              83:    7(fvec4) FunctionCall 9(@main()
+                              Store 82(@entryPointOutput) 83
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+           13(i):     12(ptr) Variable Function
+          15(i2):     12(ptr) Variable Function
+          19(i3):     18(ptr) Variable Function
+          24(i4):     23(ptr) Variable Function
+          29(i5):     28(ptr) Variable Function
+                              Store 13(i) 14
+                              Store 15(i2) 16
+                              Store 19(i3) 21
+                              Store 24(i4) 26
+                              Store 29(i5) 31
+              32:     11(int) Load 13(i)
+              33:     11(int) Load 13(i)
+              34:     11(int) IMul 32 33
+                              Store 13(i) 34
+              35:     11(int) Load 15(i2)
+              36:     11(int) Load 15(i2)
+              37:     11(int) IMul 35 36
+                              Store 15(i2) 37
+              38:   17(ivec2) Load 19(i3)
+              39:   17(ivec2) Load 19(i3)
+              40:   17(ivec2) IMul 38 39
+              41:     11(int) CompositeExtract 40 0
+              42:     11(int) CompositeExtract 38 1
+              43:     11(int) IAdd 41 42
+              44:   17(ivec2) CompositeConstruct 43 43
+                              Store 19(i3) 44
+              45:   22(ivec3) Load 24(i4)
+              46:   22(ivec3) Load 24(i4)
+              47:   22(ivec3) IMul 45 46
+              48:     11(int) CompositeExtract 47 0
+              49:     11(int) CompositeExtract 45 1
+              50:     11(int) IAdd 48 49
+              51:     11(int) CompositeExtract 45 2
+              52:     11(int) IAdd 50 51
+              53:   22(ivec3) CompositeConstruct 52 52 52
+                              Store 24(i4) 53
+              54:   27(ivec4) Load 29(i5)
+              55:   27(ivec4) Load 29(i5)
+              56:   27(ivec4) IMul 54 55
+              57:     11(int) CompositeExtract 56 0
+              58:     11(int) CompositeExtract 54 1
+              59:     11(int) IAdd 57 58
+              60:     11(int) CompositeExtract 54 2
+              61:     11(int) IAdd 59 60
+              62:     11(int) CompositeExtract 54 3
+              63:     11(int) IAdd 61 62
+              64:   27(ivec4) CompositeConstruct 63 63 63 63
+                              Store 29(i5) 64
+              65:     11(int) Load 13(i)
+              66:     11(int) Load 15(i2)
+              67:   27(ivec4) CompositeConstruct 66 66 66 66
+              68:   27(ivec4) CompositeConstruct 65 65 65 65
+              69:   27(ivec4) IAdd 68 67
+              70:   17(ivec2) Load 19(i3)
+              71:   27(ivec4) VectorShuffle 70 70 0 1 0 1
+              72:   27(ivec4) IAdd 69 71
+              73:   22(ivec3) Load 24(i4)
+              74:   27(ivec4) VectorShuffle 73 73 0 1 2 0
+              75:   27(ivec4) IAdd 72 74
+              76:   27(ivec4) Load 29(i5)
+              77:   27(ivec4) IAdd 75 76
+              78:    7(fvec4) ConvertSToF 77
+                              ReturnValue 78
+                              FunctionEnd
diff --git a/Test/baseResults/hlsl.structarray.flatten.frag.out b/Test/baseResults/hlsl.structarray.flatten.frag.out
index 411f155..fc66a7c 100644
--- a/Test/baseResults/hlsl.structarray.flatten.frag.out
+++ b/Test/baseResults/hlsl.structarray.flatten.frag.out
@@ -155,6 +155,12 @@
 0:?     'g_texdata_array2[2].nonopaque_thing' ( uniform int)
 0:?     'ps_output.color' (layout( location=0) out 4-component vector of float)
 
+error: SPIRV-Tools Validation Errors
+error: UniformConstant OpVariable <id> '65[g_texdata.nonopaque_thing] 'has illegal type.
+From Vulkan spec, section 14.5.2:
+Variables identified with the UniformConstant storage class are used only as handles to refer to opaque resources. Such variables must be typed as OpTypeImage, OpTypeSampler, OpTypeSampledImage, OpTypeAccelerationStructureNV, or an array of one of these types.
+  %g_texdata_nonopaque_thing = OpVariable %_ptr_UniformConstant_int UniformConstant
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 80
diff --git a/Test/baseResults/hlsl.type.type.conversion.all.frag.out b/Test/baseResults/hlsl.type.type.conversion.all.frag.out
new file mode 100644
index 0000000..083c929
--- /dev/null
+++ b/Test/baseResults/hlsl.type.type.conversion.all.frag.out
@@ -0,0 +1,1469 @@
+hlsl.type.type.conversion.all.frag
+ERROR: 0:88: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:89: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:90: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:91: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:92: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:93: '=' :  cannot convert from ' const 3X4 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:94: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:95: '=' :  cannot convert from ' const 4X3 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:96: '=' :  cannot convert from ' const 4X4 matrix of float' to ' temp 2-component vector of float'
+ERROR: 0:97: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 3-component vector of float'
+ERROR: 0:98: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:99: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:100: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:101: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:102: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:103: '=' :  cannot convert from ' const 3X4 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:104: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:105: '=' :  cannot convert from ' const 4X3 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:106: '=' :  cannot convert from ' const 4X4 matrix of float' to ' temp 3-component vector of float'
+ERROR: 0:107: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 4-component vector of float'
+ERROR: 0:108: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 4-component vector of float'
+ERROR: 0:109: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:110: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:111: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:112: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:113: '=' :  cannot convert from ' const 3X4 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:114: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:115: '=' :  cannot convert from ' const 4X3 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:116: '=' :  cannot convert from ' const 4X4 matrix of float' to ' temp 4-component vector of float'
+ERROR: 0:117: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 2X2 matrix of float'
+ERROR: 0:118: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 2X2 matrix of float'
+ERROR: 0:119: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 2X3 matrix of float'
+ERROR: 0:120: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 2X3 matrix of float'
+ERROR: 0:121: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 2X3 matrix of float'
+ERROR: 0:122: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 2X3 matrix of float'
+ERROR: 0:123: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 2X3 matrix of float'
+ERROR: 0:124: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 2X3 matrix of float'
+ERROR: 0:125: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 2X4 matrix of float'
+ERROR: 0:126: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 2X4 matrix of float'
+ERROR: 0:127: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 2X4 matrix of float'
+ERROR: 0:128: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 2X4 matrix of float'
+ERROR: 0:129: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 2X4 matrix of float'
+ERROR: 0:130: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 2X4 matrix of float'
+ERROR: 0:131: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 2X4 matrix of float'
+ERROR: 0:132: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 2X4 matrix of float'
+ERROR: 0:133: '=' :  cannot convert from ' const 4X3 matrix of float' to ' temp 2X4 matrix of float'
+ERROR: 0:134: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 3X2 matrix of float'
+ERROR: 0:135: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 3X2 matrix of float'
+ERROR: 0:136: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 3X2 matrix of float'
+ERROR: 0:137: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 3X2 matrix of float'
+ERROR: 0:138: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 3X2 matrix of float'
+ERROR: 0:139: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 3X2 matrix of float'
+ERROR: 0:140: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 3X3 matrix of float'
+ERROR: 0:141: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 3X3 matrix of float'
+ERROR: 0:142: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 3X3 matrix of float'
+ERROR: 0:143: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 3X3 matrix of float'
+ERROR: 0:144: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 3X3 matrix of float'
+ERROR: 0:145: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 3X3 matrix of float'
+ERROR: 0:146: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 3X3 matrix of float'
+ERROR: 0:147: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 3X3 matrix of float'
+ERROR: 0:148: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 3X4 matrix of float'
+ERROR: 0:149: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 3X4 matrix of float'
+ERROR: 0:150: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 3X4 matrix of float'
+ERROR: 0:151: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:152: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:153: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:154: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:155: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:156: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:157: '=' :  cannot convert from ' const 4X3 matrix of float' to ' temp 3X4 matrix of float'
+ERROR: 0:158: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 4X2 matrix of float'
+ERROR: 0:159: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 4X2 matrix of float'
+ERROR: 0:160: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 4X2 matrix of float'
+ERROR: 0:161: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 4X2 matrix of float'
+ERROR: 0:162: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 4X2 matrix of float'
+ERROR: 0:163: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 4X2 matrix of float'
+ERROR: 0:164: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 4X2 matrix of float'
+ERROR: 0:165: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 4X2 matrix of float'
+ERROR: 0:166: '=' :  cannot convert from ' const 3X4 matrix of float' to ' temp 4X2 matrix of float'
+ERROR: 0:167: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 4X3 matrix of float'
+ERROR: 0:168: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 4X3 matrix of float'
+ERROR: 0:169: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 4X3 matrix of float'
+ERROR: 0:170: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:171: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:172: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:173: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:174: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:175: '=' :  cannot convert from ' const 3X4 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:176: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 4X3 matrix of float'
+ERROR: 0:177: '=' :  cannot convert from ' const 2-component vector of float' to ' temp 4X4 matrix of float'
+ERROR: 0:178: '=' :  cannot convert from ' const 3-component vector of float' to ' temp 4X4 matrix of float'
+ERROR: 0:179: '=' :  cannot convert from ' const 4-component vector of float' to ' temp 4X4 matrix of float'
+ERROR: 0:180: '=' :  cannot convert from ' const 2X2 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:181: '=' :  cannot convert from ' const 2X3 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:182: '=' :  cannot convert from ' const 2X4 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:183: '=' :  cannot convert from ' const 3X2 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:184: '=' :  cannot convert from ' const 3X3 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:185: '=' :  cannot convert from ' const 3X4 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:186: '=' :  cannot convert from ' const 4X2 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 0:187: '=' :  cannot convert from ' const 4X3 matrix of float' to ' temp 4X4 matrix of float'
+ERROR: 100 compilation errors.  No code generated.
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+ERROR: node is still EOpNull!
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:19      Sequence
+0:19        move second child to first child ( temp float)
+0:19          'var0' ( temp float)
+0:19          Constant:
+0:19            0.000000
+0:20      Sequence
+0:20        move second child to first child ( temp 2-component vector of float)
+0:20          'var13' ( temp 2-component vector of float)
+0:20          Constant:
+0:20            0.000000
+0:20            0.000000
+0:21      Sequence
+0:21        move second child to first child ( temp 2-component vector of float)
+0:21          'var14' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:22      Sequence
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          'var26' ( temp 3-component vector of float)
+0:22          Constant:
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:23      Sequence
+0:23        move second child to first child ( temp 3-component vector of float)
+0:23          'var28' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:24      Sequence
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          'var39' ( temp 4-component vector of float)
+0:24          Constant:
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:25      Sequence
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          'var42' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:26      Sequence
+0:26        move second child to first child ( temp 4-component vector of float)
+0:26          'var43' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:27      Sequence
+0:27        move second child to first child ( temp 2X2 matrix of float)
+0:27          'var52' ( temp 2X2 matrix of float)
+0:27          Constant:
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:28      Sequence
+0:28        move second child to first child ( temp 2X2 matrix of float)
+0:28          'var55' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:29      Sequence
+0:29        move second child to first child ( temp 2X2 matrix of float)
+0:29          'var56' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:30      Sequence
+0:30        move second child to first child ( temp 2X3 matrix of float)
+0:30          'var65' ( temp 2X3 matrix of float)
+0:30          Constant:
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:31      Sequence
+0:31        move second child to first child ( temp 2X3 matrix of float)
+0:31          'var70' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:32      Sequence
+0:32        move second child to first child ( temp 2X4 matrix of float)
+0:32          'var78' ( temp 2X4 matrix of float)
+0:32          Constant:
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:33      Sequence
+0:33        move second child to first child ( temp 2X4 matrix of float)
+0:33          'var84' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:34      Sequence
+0:34        move second child to first child ( temp 3X2 matrix of float)
+0:34          'var91' ( temp 3X2 matrix of float)
+0:34          Constant:
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:35      Sequence
+0:35        move second child to first child ( temp 3X2 matrix of float)
+0:35          'var98' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:36      Sequence
+0:36        move second child to first child ( temp 3X3 matrix of float)
+0:36          'var104' ( temp 3X3 matrix of float)
+0:36          Constant:
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:37      Sequence
+0:37        move second child to first child ( temp 3X3 matrix of float)
+0:37          'var112' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:38      Sequence
+0:38        move second child to first child ( temp 3X4 matrix of float)
+0:38          'var117' ( temp 3X4 matrix of float)
+0:38          Constant:
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:39      Sequence
+0:39        move second child to first child ( temp 3X4 matrix of float)
+0:39          'var126' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:40      Sequence
+0:40        move second child to first child ( temp 4X2 matrix of float)
+0:40          'var130' ( temp 4X2 matrix of float)
+0:40          Constant:
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:41      Sequence
+0:41        move second child to first child ( temp 4X2 matrix of float)
+0:41          'var140' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:42      Sequence
+0:42        move second child to first child ( temp 4X3 matrix of float)
+0:42          'var143' ( temp 4X3 matrix of float)
+0:42          Constant:
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:43      Sequence
+0:43        move second child to first child ( temp 4X3 matrix of float)
+0:43          'var154' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:44      Sequence
+0:44        move second child to first child ( temp 4X4 matrix of float)
+0:44          'var156' ( temp 4X4 matrix of float)
+0:44          Constant:
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:45      Sequence
+0:45        move second child to first child ( temp 4X4 matrix of float)
+0:45          'var168' ( temp 4X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:46      Sequence
+0:46        move second child to first child ( temp float)
+0:46          'var1' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:47      Sequence
+0:47        move second child to first child ( temp float)
+0:47          'var2' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:48      Sequence
+0:48        move second child to first child ( temp float)
+0:48          'var3' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:49      Sequence
+0:49        move second child to first child ( temp float)
+0:49          'var4' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:50      Sequence
+0:50        move second child to first child ( temp float)
+0:50          'var5' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:51      Sequence
+0:51        move second child to first child ( temp float)
+0:51          'var6' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:52      Sequence
+0:52        move second child to first child ( temp float)
+0:52          'var7' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:53      Sequence
+0:53        move second child to first child ( temp float)
+0:53          'var8' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:54      Sequence
+0:54        move second child to first child ( temp float)
+0:54          'var9' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:55      Sequence
+0:55        move second child to first child ( temp float)
+0:55          'var10' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:56      Sequence
+0:56        move second child to first child ( temp float)
+0:56          'var11' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:57      Sequence
+0:57        move second child to first child ( temp float)
+0:57          'var12' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:58      Sequence
+0:58        move second child to first child ( temp 2-component vector of float)
+0:58          'var15' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:59      Sequence
+0:59        move second child to first child ( temp 2-component vector of float)
+0:59          'var16' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:60      Sequence
+0:60        move second child to first child ( temp 3-component vector of float)
+0:60          'var29' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:61      Sequence
+0:61        move second child to first child ( temp 2X2 matrix of float)
+0:61          'var57' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:62      Sequence
+0:62        move second child to first child ( temp 2X2 matrix of float)
+0:62          'var58' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:63      Sequence
+0:63        move second child to first child ( temp 2X2 matrix of float)
+0:63          'var59' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:64      Sequence
+0:64        move second child to first child ( temp 2X2 matrix of float)
+0:64          'var60' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:65      Sequence
+0:65        move second child to first child ( temp 2X2 matrix of float)
+0:65          'var61' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:66      Sequence
+0:66        move second child to first child ( temp 2X2 matrix of float)
+0:66          'var62' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:67      Sequence
+0:67        move second child to first child ( temp 2X2 matrix of float)
+0:67          'var63' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:68      Sequence
+0:68        move second child to first child ( temp 2X2 matrix of float)
+0:68          'var64' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:69      Sequence
+0:69        move second child to first child ( temp 2X3 matrix of float)
+0:69          'var71' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:70      Sequence
+0:70        move second child to first child ( temp 2X3 matrix of float)
+0:70          'var73' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:71      Sequence
+0:71        move second child to first child ( temp 2X3 matrix of float)
+0:71          'var74' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:72      Sequence
+0:72        move second child to first child ( temp 2X3 matrix of float)
+0:72          'var76' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:73      Sequence
+0:73        move second child to first child ( temp 2X3 matrix of float)
+0:73          'var77' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:74      Sequence
+0:74        move second child to first child ( temp 2X4 matrix of float)
+0:74          'var87' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:75      Sequence
+0:75        move second child to first child ( temp 2X4 matrix of float)
+0:75          'var90' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:76      Sequence
+0:76        move second child to first child ( temp 3X2 matrix of float)
+0:76          'var99' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:77      Sequence
+0:77        move second child to first child ( temp 3X2 matrix of float)
+0:77          'var100' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:78      Sequence
+0:78        move second child to first child ( temp 3X2 matrix of float)
+0:78          'var101' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:79      Sequence
+0:79        move second child to first child ( temp 3X2 matrix of float)
+0:79          'var102' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:80      Sequence
+0:80        move second child to first child ( temp 3X2 matrix of float)
+0:80          'var103' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:81      Sequence
+0:81        move second child to first child ( temp 3X3 matrix of float)
+0:81          'var113' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:82      Sequence
+0:82        move second child to first child ( temp 3X3 matrix of float)
+0:82          'var115' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:83      Sequence
+0:83        move second child to first child ( temp 3X3 matrix of float)
+0:83          'var116' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:84      Sequence
+0:84        move second child to first child ( temp 3X4 matrix of float)
+0:84          'var129' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:85      Sequence
+0:85        move second child to first child ( temp 4X2 matrix of float)
+0:85          'var141' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:86      Sequence
+0:86        move second child to first child ( temp 4X2 matrix of float)
+0:86          'var142' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:87      Sequence
+0:87        move second child to first child ( temp 4X3 matrix of float)
+0:87          'var155' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:188      Branch: Return with expression
+0:188        Constant:
+0:188          0.000000
+0:188          0.000000
+0:188          0.000000
+0:188          0.000000
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+ERROR: node is still EOpNull!
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:19      Sequence
+0:19        move second child to first child ( temp float)
+0:19          'var0' ( temp float)
+0:19          Constant:
+0:19            0.000000
+0:20      Sequence
+0:20        move second child to first child ( temp 2-component vector of float)
+0:20          'var13' ( temp 2-component vector of float)
+0:20          Constant:
+0:20            0.000000
+0:20            0.000000
+0:21      Sequence
+0:21        move second child to first child ( temp 2-component vector of float)
+0:21          'var14' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:22      Sequence
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          'var26' ( temp 3-component vector of float)
+0:22          Constant:
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:23      Sequence
+0:23        move second child to first child ( temp 3-component vector of float)
+0:23          'var28' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:24      Sequence
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          'var39' ( temp 4-component vector of float)
+0:24          Constant:
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:25      Sequence
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          'var42' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:26      Sequence
+0:26        move second child to first child ( temp 4-component vector of float)
+0:26          'var43' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:27      Sequence
+0:27        move second child to first child ( temp 2X2 matrix of float)
+0:27          'var52' ( temp 2X2 matrix of float)
+0:27          Constant:
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:28      Sequence
+0:28        move second child to first child ( temp 2X2 matrix of float)
+0:28          'var55' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:29      Sequence
+0:29        move second child to first child ( temp 2X2 matrix of float)
+0:29          'var56' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:30      Sequence
+0:30        move second child to first child ( temp 2X3 matrix of float)
+0:30          'var65' ( temp 2X3 matrix of float)
+0:30          Constant:
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:31      Sequence
+0:31        move second child to first child ( temp 2X3 matrix of float)
+0:31          'var70' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:32      Sequence
+0:32        move second child to first child ( temp 2X4 matrix of float)
+0:32          'var78' ( temp 2X4 matrix of float)
+0:32          Constant:
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:33      Sequence
+0:33        move second child to first child ( temp 2X4 matrix of float)
+0:33          'var84' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:34      Sequence
+0:34        move second child to first child ( temp 3X2 matrix of float)
+0:34          'var91' ( temp 3X2 matrix of float)
+0:34          Constant:
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:35      Sequence
+0:35        move second child to first child ( temp 3X2 matrix of float)
+0:35          'var98' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:36      Sequence
+0:36        move second child to first child ( temp 3X3 matrix of float)
+0:36          'var104' ( temp 3X3 matrix of float)
+0:36          Constant:
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:37      Sequence
+0:37        move second child to first child ( temp 3X3 matrix of float)
+0:37          'var112' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:38      Sequence
+0:38        move second child to first child ( temp 3X4 matrix of float)
+0:38          'var117' ( temp 3X4 matrix of float)
+0:38          Constant:
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:39      Sequence
+0:39        move second child to first child ( temp 3X4 matrix of float)
+0:39          'var126' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:40      Sequence
+0:40        move second child to first child ( temp 4X2 matrix of float)
+0:40          'var130' ( temp 4X2 matrix of float)
+0:40          Constant:
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:41      Sequence
+0:41        move second child to first child ( temp 4X2 matrix of float)
+0:41          'var140' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:42      Sequence
+0:42        move second child to first child ( temp 4X3 matrix of float)
+0:42          'var143' ( temp 4X3 matrix of float)
+0:42          Constant:
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:43      Sequence
+0:43        move second child to first child ( temp 4X3 matrix of float)
+0:43          'var154' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:44      Sequence
+0:44        move second child to first child ( temp 4X4 matrix of float)
+0:44          'var156' ( temp 4X4 matrix of float)
+0:44          Constant:
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:45      Sequence
+0:45        move second child to first child ( temp 4X4 matrix of float)
+0:45          'var168' ( temp 4X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:46      Sequence
+0:46        move second child to first child ( temp float)
+0:46          'var1' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:47      Sequence
+0:47        move second child to first child ( temp float)
+0:47          'var2' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:48      Sequence
+0:48        move second child to first child ( temp float)
+0:48          'var3' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:49      Sequence
+0:49        move second child to first child ( temp float)
+0:49          'var4' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:50      Sequence
+0:50        move second child to first child ( temp float)
+0:50          'var5' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:51      Sequence
+0:51        move second child to first child ( temp float)
+0:51          'var6' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:52      Sequence
+0:52        move second child to first child ( temp float)
+0:52          'var7' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:53      Sequence
+0:53        move second child to first child ( temp float)
+0:53          'var8' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:54      Sequence
+0:54        move second child to first child ( temp float)
+0:54          'var9' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:55      Sequence
+0:55        move second child to first child ( temp float)
+0:55          'var10' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:56      Sequence
+0:56        move second child to first child ( temp float)
+0:56          'var11' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:57      Sequence
+0:57        move second child to first child ( temp float)
+0:57          'var12' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:58      Sequence
+0:58        move second child to first child ( temp 2-component vector of float)
+0:58          'var15' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:59      Sequence
+0:59        move second child to first child ( temp 2-component vector of float)
+0:59          'var16' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:60      Sequence
+0:60        move second child to first child ( temp 3-component vector of float)
+0:60          'var29' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:61      Sequence
+0:61        move second child to first child ( temp 2X2 matrix of float)
+0:61          'var57' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:62      Sequence
+0:62        move second child to first child ( temp 2X2 matrix of float)
+0:62          'var58' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:63      Sequence
+0:63        move second child to first child ( temp 2X2 matrix of float)
+0:63          'var59' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:64      Sequence
+0:64        move second child to first child ( temp 2X2 matrix of float)
+0:64          'var60' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:65      Sequence
+0:65        move second child to first child ( temp 2X2 matrix of float)
+0:65          'var61' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:66      Sequence
+0:66        move second child to first child ( temp 2X2 matrix of float)
+0:66          'var62' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:67      Sequence
+0:67        move second child to first child ( temp 2X2 matrix of float)
+0:67          'var63' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:68      Sequence
+0:68        move second child to first child ( temp 2X2 matrix of float)
+0:68          'var64' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:69      Sequence
+0:69        move second child to first child ( temp 2X3 matrix of float)
+0:69          'var71' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:70      Sequence
+0:70        move second child to first child ( temp 2X3 matrix of float)
+0:70          'var73' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:71      Sequence
+0:71        move second child to first child ( temp 2X3 matrix of float)
+0:71          'var74' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:72      Sequence
+0:72        move second child to first child ( temp 2X3 matrix of float)
+0:72          'var76' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:73      Sequence
+0:73        move second child to first child ( temp 2X3 matrix of float)
+0:73          'var77' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:74      Sequence
+0:74        move second child to first child ( temp 2X4 matrix of float)
+0:74          'var87' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:75      Sequence
+0:75        move second child to first child ( temp 2X4 matrix of float)
+0:75          'var90' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:76      Sequence
+0:76        move second child to first child ( temp 3X2 matrix of float)
+0:76          'var99' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:77      Sequence
+0:77        move second child to first child ( temp 3X2 matrix of float)
+0:77          'var100' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:78      Sequence
+0:78        move second child to first child ( temp 3X2 matrix of float)
+0:78          'var101' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:79      Sequence
+0:79        move second child to first child ( temp 3X2 matrix of float)
+0:79          'var102' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:80      Sequence
+0:80        move second child to first child ( temp 3X2 matrix of float)
+0:80          'var103' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:81      Sequence
+0:81        move second child to first child ( temp 3X3 matrix of float)
+0:81          'var113' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:82      Sequence
+0:82        move second child to first child ( temp 3X3 matrix of float)
+0:82          'var115' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:83      Sequence
+0:83        move second child to first child ( temp 3X3 matrix of float)
+0:83          'var116' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:84      Sequence
+0:84        move second child to first child ( temp 3X4 matrix of float)
+0:84          'var129' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:85      Sequence
+0:85        move second child to first child ( temp 4X2 matrix of float)
+0:85          'var141' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:86      Sequence
+0:86        move second child to first child ( temp 4X2 matrix of float)
+0:86          'var142' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:87      Sequence
+0:87        move second child to first child ( temp 4X3 matrix of float)
+0:87          'var155' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:188      Branch: Return with expression
+0:188        Constant:
+0:188          0.000000
+0:188          0.000000
+0:188          0.000000
+0:188          0.000000
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/hlsl.type.type.conversion.valid.frag.out b/Test/baseResults/hlsl.type.type.conversion.valid.frag.out
new file mode 100644
index 0000000..fc67200
--- /dev/null
+++ b/Test/baseResults/hlsl.type.type.conversion.valid.frag.out
@@ -0,0 +1,1640 @@
+hlsl.type.type.conversion.valid.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:19      Sequence
+0:19        move second child to first child ( temp float)
+0:19          'var0' ( temp float)
+0:19          Constant:
+0:19            0.000000
+0:20      Sequence
+0:20        move second child to first child ( temp 2-component vector of float)
+0:20          'var13' ( temp 2-component vector of float)
+0:20          Constant:
+0:20            0.000000
+0:20            0.000000
+0:21      Sequence
+0:21        move second child to first child ( temp 2-component vector of float)
+0:21          'var14' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:22      Sequence
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          'var26' ( temp 3-component vector of float)
+0:22          Constant:
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:23      Sequence
+0:23        move second child to first child ( temp 3-component vector of float)
+0:23          'var28' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:24      Sequence
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          'var39' ( temp 4-component vector of float)
+0:24          Constant:
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:25      Sequence
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          'var42' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:26      Sequence
+0:26        move second child to first child ( temp 4-component vector of float)
+0:26          'var43' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:27      Sequence
+0:27        move second child to first child ( temp 2X2 matrix of float)
+0:27          'var52' ( temp 2X2 matrix of float)
+0:27          Constant:
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:28      Sequence
+0:28        move second child to first child ( temp 2X2 matrix of float)
+0:28          'var55' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:29      Sequence
+0:29        move second child to first child ( temp 2X2 matrix of float)
+0:29          'var56' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:30      Sequence
+0:30        move second child to first child ( temp 2X3 matrix of float)
+0:30          'var65' ( temp 2X3 matrix of float)
+0:30          Constant:
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:31      Sequence
+0:31        move second child to first child ( temp 2X3 matrix of float)
+0:31          'var70' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:32      Sequence
+0:32        move second child to first child ( temp 2X4 matrix of float)
+0:32          'var78' ( temp 2X4 matrix of float)
+0:32          Constant:
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:33      Sequence
+0:33        move second child to first child ( temp 2X4 matrix of float)
+0:33          'var84' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:34      Sequence
+0:34        move second child to first child ( temp 3X2 matrix of float)
+0:34          'var91' ( temp 3X2 matrix of float)
+0:34          Constant:
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:35      Sequence
+0:35        move second child to first child ( temp 3X2 matrix of float)
+0:35          'var98' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:36      Sequence
+0:36        move second child to first child ( temp 3X3 matrix of float)
+0:36          'var104' ( temp 3X3 matrix of float)
+0:36          Constant:
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:37      Sequence
+0:37        move second child to first child ( temp 3X3 matrix of float)
+0:37          'var112' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:38      Sequence
+0:38        move second child to first child ( temp 3X4 matrix of float)
+0:38          'var117' ( temp 3X4 matrix of float)
+0:38          Constant:
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:39      Sequence
+0:39        move second child to first child ( temp 3X4 matrix of float)
+0:39          'var126' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:40      Sequence
+0:40        move second child to first child ( temp 4X2 matrix of float)
+0:40          'var130' ( temp 4X2 matrix of float)
+0:40          Constant:
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:41      Sequence
+0:41        move second child to first child ( temp 4X2 matrix of float)
+0:41          'var140' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:42      Sequence
+0:42        move second child to first child ( temp 4X3 matrix of float)
+0:42          'var143' ( temp 4X3 matrix of float)
+0:42          Constant:
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:43      Sequence
+0:43        move second child to first child ( temp 4X3 matrix of float)
+0:43          'var154' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:44      Sequence
+0:44        move second child to first child ( temp 4X4 matrix of float)
+0:44          'var156' ( temp 4X4 matrix of float)
+0:44          Constant:
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:45      Sequence
+0:45        move second child to first child ( temp 4X4 matrix of float)
+0:45          'var168' ( temp 4X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:46      Sequence
+0:46        move second child to first child ( temp float)
+0:46          'var1' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:47      Sequence
+0:47        move second child to first child ( temp float)
+0:47          'var2' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:48      Sequence
+0:48        move second child to first child ( temp float)
+0:48          'var3' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:49      Sequence
+0:49        move second child to first child ( temp float)
+0:49          'var4' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:50      Sequence
+0:50        move second child to first child ( temp float)
+0:50          'var5' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:51      Sequence
+0:51        move second child to first child ( temp float)
+0:51          'var6' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:52      Sequence
+0:52        move second child to first child ( temp float)
+0:52          'var7' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:53      Sequence
+0:53        move second child to first child ( temp float)
+0:53          'var8' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:54      Sequence
+0:54        move second child to first child ( temp float)
+0:54          'var9' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:55      Sequence
+0:55        move second child to first child ( temp float)
+0:55          'var10' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:56      Sequence
+0:56        move second child to first child ( temp float)
+0:56          'var11' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:57      Sequence
+0:57        move second child to first child ( temp float)
+0:57          'var12' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:58      Sequence
+0:58        move second child to first child ( temp 2-component vector of float)
+0:58          'var15' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:59      Sequence
+0:59        move second child to first child ( temp 2-component vector of float)
+0:59          'var16' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:60      Sequence
+0:60        move second child to first child ( temp 3-component vector of float)
+0:60          'var29' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:61      Sequence
+0:61        move second child to first child ( temp 2X2 matrix of float)
+0:61          'var57' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:62      Sequence
+0:62        move second child to first child ( temp 2X2 matrix of float)
+0:62          'var58' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:63      Sequence
+0:63        move second child to first child ( temp 2X2 matrix of float)
+0:63          'var59' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:64      Sequence
+0:64        move second child to first child ( temp 2X2 matrix of float)
+0:64          'var60' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:65      Sequence
+0:65        move second child to first child ( temp 2X2 matrix of float)
+0:65          'var61' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:66      Sequence
+0:66        move second child to first child ( temp 2X2 matrix of float)
+0:66          'var62' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:67      Sequence
+0:67        move second child to first child ( temp 2X2 matrix of float)
+0:67          'var63' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:68      Sequence
+0:68        move second child to first child ( temp 2X2 matrix of float)
+0:68          'var64' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:69      Sequence
+0:69        move second child to first child ( temp 2X3 matrix of float)
+0:69          'var71' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:70      Sequence
+0:70        move second child to first child ( temp 2X3 matrix of float)
+0:70          'var73' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:71      Sequence
+0:71        move second child to first child ( temp 2X3 matrix of float)
+0:71          'var74' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:72      Sequence
+0:72        move second child to first child ( temp 2X3 matrix of float)
+0:72          'var76' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:73      Sequence
+0:73        move second child to first child ( temp 2X3 matrix of float)
+0:73          'var77' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:74      Sequence
+0:74        move second child to first child ( temp 2X4 matrix of float)
+0:74          'var87' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:75      Sequence
+0:75        move second child to first child ( temp 2X4 matrix of float)
+0:75          'var90' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:76      Sequence
+0:76        move second child to first child ( temp 3X2 matrix of float)
+0:76          'var99' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:77      Sequence
+0:77        move second child to first child ( temp 3X2 matrix of float)
+0:77          'var100' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:78      Sequence
+0:78        move second child to first child ( temp 3X2 matrix of float)
+0:78          'var101' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:79      Sequence
+0:79        move second child to first child ( temp 3X2 matrix of float)
+0:79          'var102' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:80      Sequence
+0:80        move second child to first child ( temp 3X2 matrix of float)
+0:80          'var103' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:81      Sequence
+0:81        move second child to first child ( temp 3X3 matrix of float)
+0:81          'var113' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:82      Sequence
+0:82        move second child to first child ( temp 3X3 matrix of float)
+0:82          'var115' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:83      Sequence
+0:83        move second child to first child ( temp 3X3 matrix of float)
+0:83          'var116' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:84      Sequence
+0:84        move second child to first child ( temp 3X4 matrix of float)
+0:84          'var129' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:85      Sequence
+0:85        move second child to first child ( temp 4X2 matrix of float)
+0:85          'var141' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:86      Sequence
+0:86        move second child to first child ( temp 4X2 matrix of float)
+0:86          'var142' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:87      Sequence
+0:87        move second child to first child ( temp 4X3 matrix of float)
+0:87          'var155' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:88      Branch: Return with expression
+0:88        Constant:
+0:88          0.000000
+0:88          0.000000
+0:88          0.000000
+0:88          0.000000
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:18  Function Definition: @main( ( temp 4-component vector of float)
+0:18    Function Parameters: 
+0:?     Sequence
+0:19      Sequence
+0:19        move second child to first child ( temp float)
+0:19          'var0' ( temp float)
+0:19          Constant:
+0:19            0.000000
+0:20      Sequence
+0:20        move second child to first child ( temp 2-component vector of float)
+0:20          'var13' ( temp 2-component vector of float)
+0:20          Constant:
+0:20            0.000000
+0:20            0.000000
+0:21      Sequence
+0:21        move second child to first child ( temp 2-component vector of float)
+0:21          'var14' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:22      Sequence
+0:22        move second child to first child ( temp 3-component vector of float)
+0:22          'var26' ( temp 3-component vector of float)
+0:22          Constant:
+0:22            0.000000
+0:22            0.000000
+0:22            0.000000
+0:23      Sequence
+0:23        move second child to first child ( temp 3-component vector of float)
+0:23          'var28' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:24      Sequence
+0:24        move second child to first child ( temp 4-component vector of float)
+0:24          'var39' ( temp 4-component vector of float)
+0:24          Constant:
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:24            0.000000
+0:25      Sequence
+0:25        move second child to first child ( temp 4-component vector of float)
+0:25          'var42' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:26      Sequence
+0:26        move second child to first child ( temp 4-component vector of float)
+0:26          'var43' ( temp 4-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:27      Sequence
+0:27        move second child to first child ( temp 2X2 matrix of float)
+0:27          'var52' ( temp 2X2 matrix of float)
+0:27          Constant:
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:27            0.000000
+0:28      Sequence
+0:28        move second child to first child ( temp 2X2 matrix of float)
+0:28          'var55' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:29      Sequence
+0:29        move second child to first child ( temp 2X2 matrix of float)
+0:29          'var56' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:30      Sequence
+0:30        move second child to first child ( temp 2X3 matrix of float)
+0:30          'var65' ( temp 2X3 matrix of float)
+0:30          Constant:
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:30            0.000000
+0:31      Sequence
+0:31        move second child to first child ( temp 2X3 matrix of float)
+0:31          'var70' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:32      Sequence
+0:32        move second child to first child ( temp 2X4 matrix of float)
+0:32          'var78' ( temp 2X4 matrix of float)
+0:32          Constant:
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:32            0.000000
+0:33      Sequence
+0:33        move second child to first child ( temp 2X4 matrix of float)
+0:33          'var84' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:34      Sequence
+0:34        move second child to first child ( temp 3X2 matrix of float)
+0:34          'var91' ( temp 3X2 matrix of float)
+0:34          Constant:
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:34            0.000000
+0:35      Sequence
+0:35        move second child to first child ( temp 3X2 matrix of float)
+0:35          'var98' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:36      Sequence
+0:36        move second child to first child ( temp 3X3 matrix of float)
+0:36          'var104' ( temp 3X3 matrix of float)
+0:36          Constant:
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:36            0.000000
+0:37      Sequence
+0:37        move second child to first child ( temp 3X3 matrix of float)
+0:37          'var112' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:38      Sequence
+0:38        move second child to first child ( temp 3X4 matrix of float)
+0:38          'var117' ( temp 3X4 matrix of float)
+0:38          Constant:
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:38            0.000000
+0:39      Sequence
+0:39        move second child to first child ( temp 3X4 matrix of float)
+0:39          'var126' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:40      Sequence
+0:40        move second child to first child ( temp 4X2 matrix of float)
+0:40          'var130' ( temp 4X2 matrix of float)
+0:40          Constant:
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:40            0.000000
+0:41      Sequence
+0:41        move second child to first child ( temp 4X2 matrix of float)
+0:41          'var140' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:42      Sequence
+0:42        move second child to first child ( temp 4X3 matrix of float)
+0:42          'var143' ( temp 4X3 matrix of float)
+0:42          Constant:
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:42            0.000000
+0:43      Sequence
+0:43        move second child to first child ( temp 4X3 matrix of float)
+0:43          'var154' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:44      Sequence
+0:44        move second child to first child ( temp 4X4 matrix of float)
+0:44          'var156' ( temp 4X4 matrix of float)
+0:44          Constant:
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:44            0.000000
+0:45      Sequence
+0:45        move second child to first child ( temp 4X4 matrix of float)
+0:45          'var168' ( temp 4X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:46      Sequence
+0:46        move second child to first child ( temp float)
+0:46          'var1' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:47      Sequence
+0:47        move second child to first child ( temp float)
+0:47          'var2' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:48      Sequence
+0:48        move second child to first child ( temp float)
+0:48          'var3' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:49      Sequence
+0:49        move second child to first child ( temp float)
+0:49          'var4' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:50      Sequence
+0:50        move second child to first child ( temp float)
+0:50          'var5' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:51      Sequence
+0:51        move second child to first child ( temp float)
+0:51          'var6' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:52      Sequence
+0:52        move second child to first child ( temp float)
+0:52          'var7' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:53      Sequence
+0:53        move second child to first child ( temp float)
+0:53          'var8' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:54      Sequence
+0:54        move second child to first child ( temp float)
+0:54          'var9' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:55      Sequence
+0:55        move second child to first child ( temp float)
+0:55          'var10' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:56      Sequence
+0:56        move second child to first child ( temp float)
+0:56          'var11' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:57      Sequence
+0:57        move second child to first child ( temp float)
+0:57          'var12' ( temp float)
+0:?           Constant:
+0:?             0.000000
+0:58      Sequence
+0:58        move second child to first child ( temp 2-component vector of float)
+0:58          'var15' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:59      Sequence
+0:59        move second child to first child ( temp 2-component vector of float)
+0:59          'var16' ( temp 2-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:60      Sequence
+0:60        move second child to first child ( temp 3-component vector of float)
+0:60          'var29' ( temp 3-component vector of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:61      Sequence
+0:61        move second child to first child ( temp 2X2 matrix of float)
+0:61          'var57' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:62      Sequence
+0:62        move second child to first child ( temp 2X2 matrix of float)
+0:62          'var58' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:63      Sequence
+0:63        move second child to first child ( temp 2X2 matrix of float)
+0:63          'var59' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:64      Sequence
+0:64        move second child to first child ( temp 2X2 matrix of float)
+0:64          'var60' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:65      Sequence
+0:65        move second child to first child ( temp 2X2 matrix of float)
+0:65          'var61' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:66      Sequence
+0:66        move second child to first child ( temp 2X2 matrix of float)
+0:66          'var62' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:67      Sequence
+0:67        move second child to first child ( temp 2X2 matrix of float)
+0:67          'var63' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:68      Sequence
+0:68        move second child to first child ( temp 2X2 matrix of float)
+0:68          'var64' ( temp 2X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:69      Sequence
+0:69        move second child to first child ( temp 2X3 matrix of float)
+0:69          'var71' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:70      Sequence
+0:70        move second child to first child ( temp 2X3 matrix of float)
+0:70          'var73' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:71      Sequence
+0:71        move second child to first child ( temp 2X3 matrix of float)
+0:71          'var74' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:72      Sequence
+0:72        move second child to first child ( temp 2X3 matrix of float)
+0:72          'var76' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:73      Sequence
+0:73        move second child to first child ( temp 2X3 matrix of float)
+0:73          'var77' ( temp 2X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:74      Sequence
+0:74        move second child to first child ( temp 2X4 matrix of float)
+0:74          'var87' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:75      Sequence
+0:75        move second child to first child ( temp 2X4 matrix of float)
+0:75          'var90' ( temp 2X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:76      Sequence
+0:76        move second child to first child ( temp 3X2 matrix of float)
+0:76          'var99' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:77      Sequence
+0:77        move second child to first child ( temp 3X2 matrix of float)
+0:77          'var100' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:78      Sequence
+0:78        move second child to first child ( temp 3X2 matrix of float)
+0:78          'var101' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:79      Sequence
+0:79        move second child to first child ( temp 3X2 matrix of float)
+0:79          'var102' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:80      Sequence
+0:80        move second child to first child ( temp 3X2 matrix of float)
+0:80          'var103' ( temp 3X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:81      Sequence
+0:81        move second child to first child ( temp 3X3 matrix of float)
+0:81          'var113' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:82      Sequence
+0:82        move second child to first child ( temp 3X3 matrix of float)
+0:82          'var115' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:83      Sequence
+0:83        move second child to first child ( temp 3X3 matrix of float)
+0:83          'var116' ( temp 3X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:84      Sequence
+0:84        move second child to first child ( temp 3X4 matrix of float)
+0:84          'var129' ( temp 3X4 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:85      Sequence
+0:85        move second child to first child ( temp 4X2 matrix of float)
+0:85          'var141' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:86      Sequence
+0:86        move second child to first child ( temp 4X2 matrix of float)
+0:86          'var142' ( temp 4X2 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:87      Sequence
+0:87        move second child to first child ( temp 4X3 matrix of float)
+0:87          'var155' ( temp 4X3 matrix of float)
+0:?           Constant:
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:?             0.000000
+0:88      Branch: Return with expression
+0:88        Constant:
+0:88          0.000000
+0:88          0.000000
+0:88          0.000000
+0:88          0.000000
+0:18  Function Definition: main( ( temp void)
+0:18    Function Parameters: 
+0:?     Sequence
+0:18      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:18        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10300
+// Generated by (magic number): 80007
+// Id's are bound by 122
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 120
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 12  "var0"
+                              Name 16  "var13"
+                              Name 18  "var14"
+                              Name 21  "var26"
+                              Name 23  "var28"
+                              Name 25  "var39"
+                              Name 27  "var42"
+                              Name 28  "var43"
+                              Name 31  "var52"
+                              Name 33  "var55"
+                              Name 34  "var56"
+                              Name 37  "var65"
+                              Name 39  "var70"
+                              Name 42  "var78"
+                              Name 44  "var84"
+                              Name 47  "var91"
+                              Name 49  "var98"
+                              Name 52  "var104"
+                              Name 54  "var112"
+                              Name 57  "var117"
+                              Name 59  "var126"
+                              Name 62  "var130"
+                              Name 64  "var140"
+                              Name 67  "var143"
+                              Name 69  "var154"
+                              Name 72  "var156"
+                              Name 74  "var168"
+                              Name 75  "var1"
+                              Name 76  "var2"
+                              Name 77  "var3"
+                              Name 78  "var4"
+                              Name 79  "var5"
+                              Name 80  "var6"
+                              Name 81  "var7"
+                              Name 82  "var8"
+                              Name 83  "var9"
+                              Name 84  "var10"
+                              Name 85  "var11"
+                              Name 86  "var12"
+                              Name 87  "var15"
+                              Name 88  "var16"
+                              Name 89  "var29"
+                              Name 90  "var57"
+                              Name 91  "var58"
+                              Name 92  "var59"
+                              Name 93  "var60"
+                              Name 94  "var61"
+                              Name 95  "var62"
+                              Name 96  "var63"
+                              Name 97  "var64"
+                              Name 98  "var71"
+                              Name 99  "var73"
+                              Name 100  "var74"
+                              Name 101  "var76"
+                              Name 102  "var77"
+                              Name 103  "var87"
+                              Name 104  "var90"
+                              Name 105  "var99"
+                              Name 106  "var100"
+                              Name 107  "var101"
+                              Name 108  "var102"
+                              Name 109  "var103"
+                              Name 110  "var113"
+                              Name 111  "var115"
+                              Name 112  "var116"
+                              Name 113  "var129"
+                              Name 114  "var141"
+                              Name 115  "var142"
+                              Name 116  "var155"
+                              Name 120  "@entryPointOutput"
+                              Decorate 120(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+              11:             TypePointer Function 6(float)
+              13:    6(float) Constant 0
+              14:             TypeVector 6(float) 2
+              15:             TypePointer Function 14(fvec2)
+              17:   14(fvec2) ConstantComposite 13 13
+              19:             TypeVector 6(float) 3
+              20:             TypePointer Function 19(fvec3)
+              22:   19(fvec3) ConstantComposite 13 13 13
+              24:             TypePointer Function 7(fvec4)
+              26:    7(fvec4) ConstantComposite 13 13 13 13
+              29:             TypeMatrix 14(fvec2) 2
+              30:             TypePointer Function 29
+              32:          29 ConstantComposite 17 17
+              35:             TypeMatrix 19(fvec3) 2
+              36:             TypePointer Function 35
+              38:          35 ConstantComposite 22 22
+              40:             TypeMatrix 7(fvec4) 2
+              41:             TypePointer Function 40
+              43:          40 ConstantComposite 26 26
+              45:             TypeMatrix 14(fvec2) 3
+              46:             TypePointer Function 45
+              48:          45 ConstantComposite 17 17 17
+              50:             TypeMatrix 19(fvec3) 3
+              51:             TypePointer Function 50
+              53:          50 ConstantComposite 22 22 22
+              55:             TypeMatrix 7(fvec4) 3
+              56:             TypePointer Function 55
+              58:          55 ConstantComposite 26 26 26
+              60:             TypeMatrix 14(fvec2) 4
+              61:             TypePointer Function 60
+              63:          60 ConstantComposite 17 17 17 17
+              65:             TypeMatrix 19(fvec3) 4
+              66:             TypePointer Function 65
+              68:          65 ConstantComposite 22 22 22 22
+              70:             TypeMatrix 7(fvec4) 4
+              71:             TypePointer Function 70
+              73:          70 ConstantComposite 26 26 26 26
+             119:             TypePointer Output 7(fvec4)
+120(@entryPointOutput):    119(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+             121:    7(fvec4) FunctionCall 9(@main()
+                              Store 120(@entryPointOutput) 121
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+        12(var0):     11(ptr) Variable Function
+       16(var13):     15(ptr) Variable Function
+       18(var14):     15(ptr) Variable Function
+       21(var26):     20(ptr) Variable Function
+       23(var28):     20(ptr) Variable Function
+       25(var39):     24(ptr) Variable Function
+       27(var42):     24(ptr) Variable Function
+       28(var43):     24(ptr) Variable Function
+       31(var52):     30(ptr) Variable Function
+       33(var55):     30(ptr) Variable Function
+       34(var56):     30(ptr) Variable Function
+       37(var65):     36(ptr) Variable Function
+       39(var70):     36(ptr) Variable Function
+       42(var78):     41(ptr) Variable Function
+       44(var84):     41(ptr) Variable Function
+       47(var91):     46(ptr) Variable Function
+       49(var98):     46(ptr) Variable Function
+      52(var104):     51(ptr) Variable Function
+      54(var112):     51(ptr) Variable Function
+      57(var117):     56(ptr) Variable Function
+      59(var126):     56(ptr) Variable Function
+      62(var130):     61(ptr) Variable Function
+      64(var140):     61(ptr) Variable Function
+      67(var143):     66(ptr) Variable Function
+      69(var154):     66(ptr) Variable Function
+      72(var156):     71(ptr) Variable Function
+      74(var168):     71(ptr) Variable Function
+        75(var1):     11(ptr) Variable Function
+        76(var2):     11(ptr) Variable Function
+        77(var3):     11(ptr) Variable Function
+        78(var4):     11(ptr) Variable Function
+        79(var5):     11(ptr) Variable Function
+        80(var6):     11(ptr) Variable Function
+        81(var7):     11(ptr) Variable Function
+        82(var8):     11(ptr) Variable Function
+        83(var9):     11(ptr) Variable Function
+       84(var10):     11(ptr) Variable Function
+       85(var11):     11(ptr) Variable Function
+       86(var12):     11(ptr) Variable Function
+       87(var15):     15(ptr) Variable Function
+       88(var16):     15(ptr) Variable Function
+       89(var29):     20(ptr) Variable Function
+       90(var57):     30(ptr) Variable Function
+       91(var58):     30(ptr) Variable Function
+       92(var59):     30(ptr) Variable Function
+       93(var60):     30(ptr) Variable Function
+       94(var61):     30(ptr) Variable Function
+       95(var62):     30(ptr) Variable Function
+       96(var63):     30(ptr) Variable Function
+       97(var64):     30(ptr) Variable Function
+       98(var71):     36(ptr) Variable Function
+       99(var73):     36(ptr) Variable Function
+      100(var74):     36(ptr) Variable Function
+      101(var76):     36(ptr) Variable Function
+      102(var77):     36(ptr) Variable Function
+      103(var87):     41(ptr) Variable Function
+      104(var90):     41(ptr) Variable Function
+      105(var99):     46(ptr) Variable Function
+     106(var100):     46(ptr) Variable Function
+     107(var101):     46(ptr) Variable Function
+     108(var102):     46(ptr) Variable Function
+     109(var103):     46(ptr) Variable Function
+     110(var113):     51(ptr) Variable Function
+     111(var115):     51(ptr) Variable Function
+     112(var116):     51(ptr) Variable Function
+     113(var129):     56(ptr) Variable Function
+     114(var141):     61(ptr) Variable Function
+     115(var142):     61(ptr) Variable Function
+     116(var155):     66(ptr) Variable Function
+                              Store 12(var0) 13
+                              Store 16(var13) 17
+                              Store 18(var14) 17
+                              Store 21(var26) 22
+                              Store 23(var28) 22
+                              Store 25(var39) 26
+                              Store 27(var42) 26
+                              Store 28(var43) 26
+                              Store 31(var52) 32
+                              Store 33(var55) 32
+                              Store 34(var56) 32
+                              Store 37(var65) 38
+                              Store 39(var70) 38
+                              Store 42(var78) 43
+                              Store 44(var84) 43
+                              Store 47(var91) 48
+                              Store 49(var98) 48
+                              Store 52(var104) 53
+                              Store 54(var112) 53
+                              Store 57(var117) 58
+                              Store 59(var126) 58
+                              Store 62(var130) 63
+                              Store 64(var140) 63
+                              Store 67(var143) 68
+                              Store 69(var154) 68
+                              Store 72(var156) 73
+                              Store 74(var168) 73
+                              Store 75(var1) 13
+                              Store 76(var2) 13
+                              Store 77(var3) 13
+                              Store 78(var4) 13
+                              Store 79(var5) 13
+                              Store 80(var6) 13
+                              Store 81(var7) 13
+                              Store 82(var8) 13
+                              Store 83(var9) 13
+                              Store 84(var10) 13
+                              Store 85(var11) 13
+                              Store 86(var12) 13
+                              Store 87(var15) 17
+                              Store 88(var16) 17
+                              Store 89(var29) 22
+                              Store 90(var57) 32
+                              Store 91(var58) 32
+                              Store 92(var59) 32
+                              Store 93(var60) 32
+                              Store 94(var61) 32
+                              Store 95(var62) 32
+                              Store 96(var63) 32
+                              Store 97(var64) 32
+                              Store 98(var71) 38
+                              Store 99(var73) 38
+                              Store 100(var74) 38
+                              Store 101(var76) 38
+                              Store 102(var77) 38
+                              Store 103(var87) 43
+                              Store 104(var90) 43
+                              Store 105(var99) 48
+                              Store 106(var100) 48
+                              Store 107(var101) 48
+                              Store 108(var102) 48
+                              Store 109(var103) 48
+                              Store 110(var113) 53
+                              Store 111(var115) 53
+                              Store 112(var116) 53
+                              Store 113(var129) 58
+                              Store 114(var141) 63
+                              Store 115(var142) 63
+                              Store 116(var155) 68
+                              ReturnValue 26
+                              FunctionEnd
diff --git a/Test/baseResults/spv.150.geom.out b/Test/baseResults/spv.150.geom.out
index 70dadf5..f759793 100644
--- a/Test/baseResults/spv.150.geom.out
+++ b/Test/baseResults/spv.150.geom.out
@@ -1,8 +1,4 @@
 spv.150.geom
-error: SPIRV-Tools Validation Errors
-error: Capability GeometryStreams is not allowed by Vulkan 1.0 specification (or requires extension)
-  OpCapability GeometryStreams
-
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 71
diff --git a/Test/baseResults/spv.16bitstorage-int.frag.out b/Test/baseResults/spv.16bitstorage-int.frag.out
index 1b2a16b..3f0fffd 100644
--- a/Test/baseResults/spv.16bitstorage-int.frag.out
+++ b/Test/baseResults/spv.16bitstorage-int.frag.out
@@ -1,7 +1,7 @@
 spv.16bitstorage-int.frag
 // Module Version 10000
 // Generated by (magic number): 80007
-// Id's are bound by 171
+// Id's are bound by 172
 
                               Capability Shader
                               Capability StorageUniformBufferBlock16
@@ -204,7 +204,10 @@
              114:     20(int) Constant 7
              115:     20(int) Constant 6
              116:             TypePointer Uniform 20(int)
-             166:   39(ivec2) ConstantComposite 32 33
+             166:  6(int16_t) Constant 1
+             167:  6(int16_t) Constant 2
+             168:  7(i16vec2) ConstantComposite 166 167
+             170:  6(int16_t) Constant 3
          4(main):           2 Function None 3
                5:             Label
           69(x0):     68(ptr) Variable Function
@@ -324,11 +327,9 @@
              164:  6(int16_t) Load 163
              165:     28(ptr) AccessChain 19(b2) 21
                               Store 165 164
-             167:  7(i16vec2) SConvert 166
-             168:     42(ptr) AccessChain 19(b2) 32
-                              Store 168 167
-             169:  6(int16_t) SConvert 58
-             170:     28(ptr) AccessChain 19(b2) 21
-                              Store 170 169
+             169:     42(ptr) AccessChain 19(b2) 32
+                              Store 169 168
+             171:     28(ptr) AccessChain 19(b2) 21
+                              Store 171 170
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.16bitstorage-uint.frag.out b/Test/baseResults/spv.16bitstorage-uint.frag.out
index f935f26..c07edaa 100644
--- a/Test/baseResults/spv.16bitstorage-uint.frag.out
+++ b/Test/baseResults/spv.16bitstorage-uint.frag.out
@@ -205,8 +205,10 @@
              115:     20(int) Constant 7
              116:     20(int) Constant 6
              117:             TypePointer Uniform 9(int)
-             167:   39(ivec2) ConstantComposite 82 10
-             170:      9(int) Constant 3
+             167:  6(int16_t) Constant 1
+             168:  6(int16_t) Constant 2
+             169:  7(i16vec2) ConstantComposite 167 168
+             171:  6(int16_t) Constant 3
          4(main):           2 Function None 3
                5:             Label
           69(x0):     68(ptr) Variable Function
@@ -326,10 +328,8 @@
              165:  6(int16_t) Load 164
              166:     28(ptr) AccessChain 19(b2) 21
                               Store 166 165
-             168:  7(i16vec2) UConvert 167
-             169:     42(ptr) AccessChain 19(b2) 32
-                              Store 169 168
-             171:  6(int16_t) UConvert 170
+             170:     42(ptr) AccessChain 19(b2) 32
+                              Store 170 169
              172:     28(ptr) AccessChain 19(b2) 21
                               Store 172 171
                               Return
diff --git a/Test/baseResults/spv.16bitstorage.frag.out b/Test/baseResults/spv.16bitstorage.frag.out
index d2a83ba..2d5487f 100644
--- a/Test/baseResults/spv.16bitstorage.frag.out
+++ b/Test/baseResults/spv.16bitstorage.frag.out
@@ -1,7 +1,7 @@
 spv.16bitstorage.frag
 // Module Version 10000
 // Generated by (magic number): 80007
-// Id's are bound by 173
+// Id's are bound by 172
 
                               Capability Shader
                               Capability StorageUniformBufferBlock16
@@ -204,9 +204,10 @@
              114:     20(int) Constant 7
              115:     20(int) Constant 6
              116:             TypePointer Uniform 20(int)
-             166:   37(float) Constant 1073741824
-             167:   40(fvec2) ConstantComposite 83 166
-             170:   37(float) Constant 1077936128
+             166:6(float16_t) Constant 15360
+             167:6(float16_t) Constant 16384
+             168:  7(f16vec2) ConstantComposite 166 167
+             170:6(float16_t) Constant 16896
          4(main):           2 Function None 3
                5:             Label
           70(x0):     69(ptr) Variable Function
@@ -326,11 +327,9 @@
              164:6(float16_t) Load 163
              165:     28(ptr) AccessChain 19(b2) 21
                               Store 165 164
-             168:  7(f16vec2) FConvert 167
              169:     43(ptr) AccessChain 19(b2) 32
                               Store 169 168
-             171:6(float16_t) FConvert 170
-             172:     28(ptr) AccessChain 19(b2) 21
-                              Store 172 171
+             171:     28(ptr) AccessChain 19(b2) 21
+                              Store 171 170
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.420.geom.out b/Test/baseResults/spv.420.geom.out
index 45f235f..74a4f0b 100644
--- a/Test/baseResults/spv.420.geom.out
+++ b/Test/baseResults/spv.420.geom.out
@@ -1,8 +1,4 @@
 spv.420.geom
-error: SPIRV-Tools Validation Errors
-error: Capability GeometryStreams is not allowed by Vulkan 1.0 specification (or requires extension)
-  OpCapability GeometryStreams
-
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 72
diff --git a/Test/baseResults/spv.8bitstorage-int.frag.out b/Test/baseResults/spv.8bitstorage-int.frag.out
index 96cb2ae..a0af75a 100644
--- a/Test/baseResults/spv.8bitstorage-int.frag.out
+++ b/Test/baseResults/spv.8bitstorage-int.frag.out
@@ -1,7 +1,7 @@
 spv.8bitstorage-int.frag
 // Module Version 10000
 // Generated by (magic number): 80007
-// Id's are bound by 171
+// Id's are bound by 172
 
                               Capability Shader
                               Capability CapabilityUniformAndStorageBuffer8BitAccess
@@ -203,7 +203,10 @@
              114:     20(int) Constant 7
              115:     20(int) Constant 6
              116:             TypePointer Uniform 20(int)
-             166:   39(ivec2) ConstantComposite 32 33
+             166:   6(int8_t) Constant 1
+             167:   6(int8_t) Constant 2
+             168:   7(i8vec2) ConstantComposite 166 167
+             170:   6(int8_t) Constant 3
          4(main):           2 Function None 3
                5:             Label
           69(x0):     68(ptr) Variable Function
@@ -323,11 +326,9 @@
              164:   6(int8_t) Load 163
              165:     28(ptr) AccessChain 19(b2) 21
                               Store 165 164
-             167:   7(i8vec2) SConvert 166
-             168:     42(ptr) AccessChain 19(b2) 32
-                              Store 168 167
-             169:   6(int8_t) SConvert 58
-             170:     28(ptr) AccessChain 19(b2) 21
-                              Store 170 169
+             169:     42(ptr) AccessChain 19(b2) 32
+                              Store 169 168
+             171:     28(ptr) AccessChain 19(b2) 21
+                              Store 171 170
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.8bitstorage-uint.frag.out b/Test/baseResults/spv.8bitstorage-uint.frag.out
index 415bada..12c390a 100644
--- a/Test/baseResults/spv.8bitstorage-uint.frag.out
+++ b/Test/baseResults/spv.8bitstorage-uint.frag.out
@@ -204,8 +204,10 @@
              115:     20(int) Constant 7
              116:     20(int) Constant 6
              117:             TypePointer Uniform 9(int)
-             167:   39(ivec2) ConstantComposite 82 10
-             170:      9(int) Constant 3
+             167:   6(int8_t) Constant 1
+             168:   6(int8_t) Constant 2
+             169:   7(i8vec2) ConstantComposite 167 168
+             171:   6(int8_t) Constant 3
          4(main):           2 Function None 3
                5:             Label
           69(x0):     68(ptr) Variable Function
@@ -325,10 +327,8 @@
              165:   6(int8_t) Load 164
              166:     28(ptr) AccessChain 19(b2) 21
                               Store 166 165
-             168:   7(i8vec2) UConvert 167
-             169:     42(ptr) AccessChain 19(b2) 32
-                              Store 169 168
-             171:   6(int8_t) UConvert 170
+             170:     42(ptr) AccessChain 19(b2) 32
+                              Store 170 169
              172:     28(ptr) AccessChain 19(b2) 21
                               Store 172 171
                               Return
diff --git a/Test/baseResults/spv.AofA.frag.out b/Test/baseResults/spv.AofA.frag.out
index 798f083..e8572ba 100644
--- a/Test/baseResults/spv.AofA.frag.out
+++ b/Test/baseResults/spv.AofA.frag.out
@@ -2,7 +2,9 @@
 WARNING: 0:6: '[][]' : Generating SPIR-V array-of-arrays, but Vulkan only supports single array level for this resource 
 
 error: SPIRV-Tools Validation Errors
-error: Only a single level of array is allowed for descriptor set variables
+error: Uniform OpVariable <id> '98[nameAofA] 'has illegal type.
+From Vulkan spec, section 14.5.2:
+Variables identified with the Uniform storage class are used to access transparent buffer backed resources. Such variables must be typed as OpTypeStruct, or an array of this type
   %nameAofA = OpVariable %_ptr_Uniform__arr__arr_uAofA_uint_5_uint_3 Uniform
 
 // Module Version 10000
diff --git a/Test/baseResults/spv.builtInXFB.vert.out b/Test/baseResults/spv.builtInXFB.vert.out
index f175a19..556a698 100644
--- a/Test/baseResults/spv.builtInXFB.vert.out
+++ b/Test/baseResults/spv.builtInXFB.vert.out
@@ -1,8 +1,4 @@
 spv.builtInXFB.vert
-error: SPIRV-Tools Validation Errors
-error: Capability TransformFeedback is not allowed by Vulkan 1.0 specification (or requires extension)
-  OpCapability TransformFeedback
-
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 21
diff --git a/Test/baseResults/spv.fragmentDensity-es.frag.out b/Test/baseResults/spv.fragmentDensity-es.frag.out
new file mode 100644
index 0000000..01ac383
--- /dev/null
+++ b/Test/baseResults/spv.fragmentDensity-es.frag.out
@@ -0,0 +1,45 @@
+spv.fragmentDensity-es.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 18
+
+                              Capability Shader
+                              Capability FragmentDensityEXT
+                              Extension  "SPV_EXT_fragment_invocation_density"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 11 14 16
+                              ExecutionMode 4 OriginUpperLeft
+                              Source ESSL 310
+                              SourceExtension  "GL_EXT_fragment_invocation_density"
+                              Name 4  "main"
+                              Name 9  "FragSize"
+                              Name 11  "gl_FragSizeEXT"
+                              Name 14  "FragInvocationCount"
+                              Name 16  "gl_FragInvocationCountEXT"
+                              Decorate 9(FragSize) Location 0
+                              Decorate 11(gl_FragSizeEXT) Flat
+                              Decorate 11(gl_FragSizeEXT) BuiltIn FragSizeEXT
+                              Decorate 14(FragInvocationCount) Location 2
+                              Decorate 16(gl_FragInvocationCountEXT) Flat
+                              Decorate 16(gl_FragInvocationCountEXT) BuiltIn FragInvocationCountEXT
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypeVector 6(int) 2
+               8:             TypePointer Output 7(ivec2)
+     9(FragSize):      8(ptr) Variable Output
+              10:             TypePointer Input 7(ivec2)
+11(gl_FragSizeEXT):     10(ptr) Variable Input
+              13:             TypePointer Output 6(int)
+14(FragInvocationCount):     13(ptr) Variable Output
+              15:             TypePointer Input 6(int)
+16(gl_FragInvocationCountEXT):     15(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              12:    7(ivec2) Load 11(gl_FragSizeEXT)
+                              Store 9(FragSize) 12
+              17:      6(int) Load 16(gl_FragInvocationCountEXT)
+                              Store 14(FragInvocationCount) 17
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.fragmentDensity-neg.frag.out b/Test/baseResults/spv.fragmentDensity-neg.frag.out
new file mode 100644
index 0000000..6b5078b
--- /dev/null
+++ b/Test/baseResults/spv.fragmentDensity-neg.frag.out
@@ -0,0 +1,7 @@
+spv.fragmentDensity-neg.frag
+ERROR: 0:10: 'gl_FragSizeEXT' : required extension not requested: GL_EXT_fragment_invocation_density
+ERROR: 0:11: 'gl_FragInvocationCountEXT' : required extension not requested: GL_EXT_fragment_invocation_density
+ERROR: 2 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.fragmentDensity.frag.out b/Test/baseResults/spv.fragmentDensity.frag.out
new file mode 100644
index 0000000..8bbc37c
--- /dev/null
+++ b/Test/baseResults/spv.fragmentDensity.frag.out
@@ -0,0 +1,48 @@
+spv.fragmentDensity.frag
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 21
+
+                              Capability Shader
+                              Capability FragmentDensityEXT
+                              Extension  "SPV_EXT_fragment_invocation_density"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9 13 17 19
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_fragment_invocation_density"
+                              Name 4  "main"
+                              Name 9  "FragSize"
+                              Name 13  "gl_FragSizeEXT"
+                              Name 17  "FragInvocationCount"
+                              Name 19  "gl_FragInvocationCountEXT"
+                              Decorate 9(FragSize) Location 0
+                              Decorate 13(gl_FragSizeEXT) Flat
+                              Decorate 13(gl_FragSizeEXT) BuiltIn FragSizeEXT
+                              Decorate 17(FragInvocationCount) Location 2
+                              Decorate 19(gl_FragInvocationCountEXT) Flat
+                              Decorate 19(gl_FragInvocationCountEXT) BuiltIn FragInvocationCountEXT
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypePointer Output 7(fvec2)
+     9(FragSize):      8(ptr) Variable Output
+              10:             TypeInt 32 1
+              11:             TypeVector 10(int) 2
+              12:             TypePointer Input 11(ivec2)
+13(gl_FragSizeEXT):     12(ptr) Variable Input
+              16:             TypePointer Output 10(int)
+17(FragInvocationCount):     16(ptr) Variable Output
+              18:             TypePointer Input 10(int)
+19(gl_FragInvocationCountEXT):     18(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+              14:   11(ivec2) Load 13(gl_FragSizeEXT)
+              15:    7(fvec2) ConvertSToF 14
+                              Store 9(FragSize) 15
+              20:     10(int) Load 19(gl_FragInvocationCountEXT)
+                              Store 17(FragInvocationCount) 20
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.fragmentDensity.vert.out b/Test/baseResults/spv.fragmentDensity.vert.out
new file mode 100644
index 0000000..ff77a3e
--- /dev/null
+++ b/Test/baseResults/spv.fragmentDensity.vert.out
@@ -0,0 +1,9 @@
+spv.fragmentDensity.vert
+ERROR: 0:10: 'gl_FragSizeEXT' : undeclared identifier 
+ERROR: 0:10: 'assign' :  cannot convert from ' temp float' to 'layout( location=0) smooth out highp 2-component vector of uint'
+ERROR: 0:11: 'gl_FragInvocationCountEXT' : undeclared identifier 
+ERROR: 0:11: 'assign' :  cannot convert from ' temp float' to 'layout( location=2) smooth out highp int'
+ERROR: 4 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.functionNestedOpaque.vert.out b/Test/baseResults/spv.functionNestedOpaque.vert.out
index 34ae7c3..ff94077 100644
--- a/Test/baseResults/spv.functionNestedOpaque.vert.out
+++ b/Test/baseResults/spv.functionNestedOpaque.vert.out
@@ -1,4 +1,10 @@
 spv.functionNestedOpaque.vert
+error: SPIRV-Tools Validation Errors
+error: UniformConstant OpVariable <id> '36[si] 'has illegal type.
+From Vulkan spec, section 14.5.2:
+Variables identified with the UniformConstant storage class are used only as handles to refer to opaque resources. Such variables must be typed as OpTypeImage, OpTypeSampler, OpTypeSampledImage, OpTypeAccelerationStructureNV, or an array of one of these types.
+  %si = OpVariable %_ptr_UniformConstant_S UniformConstant
+
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 39
diff --git a/Test/baseResults/spv.scalarlayout.frag.out b/Test/baseResults/spv.scalarlayout.frag.out
new file mode 100644
index 0000000..2935e1a
--- /dev/null
+++ b/Test/baseResults/spv.scalarlayout.frag.out
@@ -0,0 +1,80 @@
+spv.scalarlayout.frag
+error: SPIRV-Tools Validation Errors
+error: Structure id 17 decorated as Block for variable in Uniform storage class must follow standard uniform buffer layout rules: member 1 at offset 4 is not aligned to 8
+  %B1 = OpTypeStruct %float %v2float %v3float %_arr_float_uint_2 %mat2v3float %_arr_mat2v3float_uint_2 %float %S %_arr_S_uint_2
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 20
+
+                              Capability Shader
+                              Capability Float64
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_scalar_block_layout"
+                              Name 4  "main"
+                              Name 15  "S"
+                              MemberName 15(S) 0  "a"
+                              MemberName 15(S) 1  "b"
+                              MemberName 15(S) 2  "c"
+                              MemberName 15(S) 3  "d"
+                              MemberName 15(S) 4  "e"
+                              MemberName 15(S) 5  "f"
+                              Name 17  "B1"
+                              MemberName 17(B1) 0  "a"
+                              MemberName 17(B1) 1  "b"
+                              MemberName 17(B1) 2  "c"
+                              MemberName 17(B1) 3  "d"
+                              MemberName 17(B1) 4  "e"
+                              MemberName 17(B1) 5  "f"
+                              MemberName 17(B1) 6  "g"
+                              MemberName 17(B1) 7  "h"
+                              MemberName 17(B1) 8  "i"
+                              Name 19  ""
+                              Decorate 11 ArrayStride 4
+                              Decorate 13 ArrayStride 24
+                              MemberDecorate 15(S) 0 Offset 0
+                              MemberDecorate 15(S) 1 Offset 4
+                              MemberDecorate 15(S) 2 Offset 16
+                              MemberDecorate 15(S) 3 Offset 24
+                              MemberDecorate 15(S) 4 Offset 28
+                              MemberDecorate 15(S) 5 Offset 40
+                              Decorate 16 ArrayStride 48
+                              MemberDecorate 17(B1) 0 Offset 0
+                              MemberDecorate 17(B1) 1 Offset 4
+                              MemberDecorate 17(B1) 2 Offset 12
+                              MemberDecorate 17(B1) 3 Offset 24
+                              MemberDecorate 17(B1) 4 ColMajor
+                              MemberDecorate 17(B1) 4 Offset 32
+                              MemberDecorate 17(B1) 4 MatrixStride 12
+                              MemberDecorate 17(B1) 5 ColMajor
+                              MemberDecorate 17(B1) 5 Offset 56
+                              MemberDecorate 17(B1) 5 MatrixStride 12
+                              MemberDecorate 17(B1) 6 Offset 104
+                              MemberDecorate 17(B1) 7 Offset 112
+                              MemberDecorate 17(B1) 8 Offset 160
+                              Decorate 17(B1) Block
+                              Decorate 19 DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 2
+               8:             TypeVector 6(float) 3
+               9:             TypeInt 32 0
+              10:      9(int) Constant 2
+              11:             TypeArray 6(float) 10
+              12:             TypeMatrix 8(fvec3) 2
+              13:             TypeArray 12 10
+              14:             TypeFloat 64
+           15(S):             TypeStruct 6(float) 7(fvec2) 14(float64_t) 6(float) 8(fvec3) 6(float)
+              16:             TypeArray 15(S) 10
+          17(B1):             TypeStruct 6(float) 7(fvec2) 8(fvec3) 11 12 13 6(float) 15(S) 16
+              18:             TypePointer Uniform 17(B1)
+              19:     18(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.scalarlayoutfloat16.frag.out b/Test/baseResults/spv.scalarlayoutfloat16.frag.out
new file mode 100644
index 0000000..9118636
--- /dev/null
+++ b/Test/baseResults/spv.scalarlayoutfloat16.frag.out
@@ -0,0 +1,72 @@
+spv.scalarlayoutfloat16.frag
+error: SPIRV-Tools Validation Errors
+error: Structure id 15 decorated as Block for variable in Uniform storage class must follow standard uniform buffer layout rules: member 1 at offset 2 is not aligned to 4
+  %B1 = OpTypeStruct %half %v2half %v3half %_arr_half_uint_2 %half %S %_arr_S_uint_2
+
+// Module Version 10000
+// Generated by (magic number): 80007
+// Id's are bound by 18
+
+                              Capability Shader
+                              Capability Float64
+                              Capability StorageUniform16
+                              Extension  "SPV_KHR_16bit_storage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_scalar_block_layout"
+                              SourceExtension  "GL_EXT_shader_16bit_storage"
+                              Name 4  "main"
+                              Name 13  "S"
+                              MemberName 13(S) 0  "a"
+                              MemberName 13(S) 1  "b"
+                              MemberName 13(S) 2  "c"
+                              MemberName 13(S) 3  "d"
+                              MemberName 13(S) 4  "e"
+                              MemberName 13(S) 5  "f"
+                              Name 15  "B1"
+                              MemberName 15(B1) 0  "a"
+                              MemberName 15(B1) 1  "b"
+                              MemberName 15(B1) 2  "c"
+                              MemberName 15(B1) 3  "d"
+                              MemberName 15(B1) 4  "g"
+                              MemberName 15(B1) 5  "h"
+                              MemberName 15(B1) 6  "i"
+                              Name 17  ""
+                              Decorate 11 ArrayStride 2
+                              MemberDecorate 13(S) 0 Offset 0
+                              MemberDecorate 13(S) 1 Offset 2
+                              MemberDecorate 13(S) 2 Offset 8
+                              MemberDecorate 13(S) 3 Offset 16
+                              MemberDecorate 13(S) 4 Offset 18
+                              MemberDecorate 13(S) 5 Offset 24
+                              Decorate 14 ArrayStride 32
+                              MemberDecorate 15(B1) 0 Offset 0
+                              MemberDecorate 15(B1) 1 Offset 2
+                              MemberDecorate 15(B1) 2 Offset 6
+                              MemberDecorate 15(B1) 3 Offset 12
+                              MemberDecorate 15(B1) 4 Offset 16
+                              MemberDecorate 15(B1) 5 Offset 24
+                              MemberDecorate 15(B1) 6 Offset 56
+                              Decorate 15(B1) Block
+                              Decorate 17 DescriptorSet 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 16
+               7:             TypeVector 6(float16_t) 2
+               8:             TypeVector 6(float16_t) 3
+               9:             TypeInt 32 0
+              10:      9(int) Constant 2
+              11:             TypeArray 6(float16_t) 10
+              12:             TypeFloat 64
+           13(S):             TypeStruct 6(float16_t) 7(f16vec2) 12(float64_t) 6(float16_t) 8(f16vec3) 6(float16_t)
+              14:             TypeArray 13(S) 10
+          15(B1):             TypeStruct 6(float16_t) 7(f16vec2) 8(f16vec3) 11 6(float16_t) 13(S) 14
+              16:             TypePointer Uniform 15(B1)
+              17:     16(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd
diff --git a/Test/baseResults/spv.shadingRate.frag.out b/Test/baseResults/spv.shadingRate.frag.out
index 2b6bd31..1147776 100644
--- a/Test/baseResults/spv.shadingRate.frag.out
+++ b/Test/baseResults/spv.shadingRate.frag.out
@@ -4,7 +4,7 @@
 // Id's are bound by 21
 
                               Capability Shader
-                              Capability ShadingRateNV
+                              Capability FragmentDensityEXT
                               Extension  "SPV_NV_shading_rate"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
@@ -19,10 +19,10 @@
                               Name 19  "gl_InvocationsPerPixelNV"
                               Decorate 9(FragmentSize) Location 0
                               Decorate 13(gl_FragmentSizeNV) Flat
-                              Decorate 13(gl_FragmentSizeNV) BuiltIn FragmentSizeNV
+                              Decorate 13(gl_FragmentSizeNV) BuiltIn FragSizeEXT
                               Decorate 17(InvocationsPerPixel) Location 2
                               Decorate 19(gl_InvocationsPerPixelNV) Flat
-                              Decorate 19(gl_InvocationsPerPixelNV) BuiltIn InvocationsPerPixelNV
+                              Decorate 19(gl_InvocationsPerPixelNV) BuiltIn FragInvocationCountEXT
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
diff --git a/Test/baseResults/spv.subgroupBallot.comp.out b/Test/baseResults/spv.subgroupBallot.comp.out
index 23a5913..ea152d9 100644
--- a/Test/baseResults/spv.subgroupBallot.comp.out
+++ b/Test/baseResults/spv.subgroupBallot.comp.out
@@ -1,7 +1,7 @@
 spv.subgroupBallot.comp
 // Module Version 10300
 // Generated by (magic number): 80007
-// Id's are bound by 417
+// Id's are bound by 397
 
                               Capability Shader
                               Capability Float64
@@ -51,7 +51,7 @@
                               Decorate 46(Buffers) Block
                               Decorate 49(data) DescriptorSet 0
                               Decorate 49(data) Binding 0
-                              Decorate 416 BuiltIn WorkgroupSize
+                              Decorate 396 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -91,30 +91,30 @@
               83:             TypeVector 36(bool) 4
               88:             TypePointer StorageBuffer 17(ivec4)
               96:             TypePointer StorageBuffer 40(float)
-             103:             TypeVector 40(float) 2
-             104:             TypePointer StorageBuffer 41(fvec4)
-             114:             TypeVector 40(float) 3
-             124:     42(int) Constant 3
-             131:             TypePointer StorageBuffer 42(int)
-             138:             TypeVector 42(int) 2
-             139:             TypePointer StorageBuffer 43(ivec4)
-             149:             TypeVector 42(int) 3
-             171:             TypeVector 6(int) 2
-             181:             TypeVector 6(int) 3
-             197:             TypePointer StorageBuffer 44(float64_t)
-             204:             TypeVector 44(float64_t) 2
-             205:             TypePointer StorageBuffer 45(f64vec4)
-             215:             TypeVector 44(float64_t) 3
-             242:  138(ivec2) ConstantComposite 61 61
-             243:             TypeVector 36(bool) 2
-             247:  138(ivec2) ConstantComposite 60 60
-             256:  149(ivec3) ConstantComposite 61 61 61
-             257:             TypeVector 36(bool) 3
-             261:  149(ivec3) ConstantComposite 60 60 60
-             269:   43(ivec4) ConstantComposite 61 61 61 61
-             273:   43(ivec4) ConstantComposite 60 60 60 60
-             415:      6(int) Constant 8
-             416:  181(ivec3) ConstantComposite 415 415 64
+             102:             TypeVector 40(float) 2
+             103:             TypePointer StorageBuffer 41(fvec4)
+             112:             TypeVector 40(float) 3
+             121:     42(int) Constant 3
+             127:             TypePointer StorageBuffer 42(int)
+             133:             TypeVector 42(int) 2
+             134:             TypePointer StorageBuffer 43(ivec4)
+             143:             TypeVector 42(int) 3
+             162:             TypeVector 6(int) 2
+             171:             TypeVector 6(int) 3
+             185:             TypePointer StorageBuffer 44(float64_t)
+             191:             TypeVector 44(float64_t) 2
+             192:             TypePointer StorageBuffer 45(f64vec4)
+             201:             TypeVector 44(float64_t) 3
+             225:  133(ivec2) ConstantComposite 61 61
+             226:             TypeVector 36(bool) 2
+             229:  133(ivec2) ConstantComposite 60 60
+             238:  143(ivec3) ConstantComposite 61 61 61
+             239:             TypeVector 36(bool) 3
+             242:  143(ivec3) ConstantComposite 60 60 60
+             250:   43(ivec4) ConstantComposite 61 61 61 61
+             253:   43(ivec4) ConstantComposite 60 60 60 60
+             395:      6(int) Constant 8
+             396:  171(ivec3) ConstantComposite 395 395 64
          4(main):           2 Function None 3
                5:             Label
    8(invocation):      7(ptr) Variable Function
@@ -179,346 +179,326 @@
               87:             Label
               92:    36(bool) Phi 85 5 91 86
                               SelectionMerge 94 None
-                              BranchConditional 92 93 276
+                              BranchConditional 92 93 256
               93:               Label
               95:      6(int)   Load 8(invocation)
               97:     96(ptr)   AccessChain 49(data) 61 61 54
               98:   40(float)   Load 97
-              99:      6(int)   Load 8(invocation)
-             100:   40(float)   GroupNonUniformBroadcast 38 98 99
-             101:     96(ptr)   AccessChain 49(data) 95 61 54
-                                Store 101 100
-             102:      6(int)   Load 8(invocation)
-             105:    104(ptr)   AccessChain 49(data) 60 61
-             106:   41(fvec4)   Load 105
-             107:  103(fvec2)   VectorShuffle 106 106 0 1
-             108:      6(int)   Load 8(invocation)
-             109:  103(fvec2)   GroupNonUniformBroadcast 38 107 108
-             110:    104(ptr)   AccessChain 49(data) 102 61
-             111:   41(fvec4)   Load 110
-             112:   41(fvec4)   VectorShuffle 111 109 4 5 2 3
-                                Store 110 112
-             113:      6(int)   Load 8(invocation)
-             115:    104(ptr)   AccessChain 49(data) 51 61
-             116:   41(fvec4)   Load 115
-             117:  114(fvec3)   VectorShuffle 116 116 0 1 2
-             118:      6(int)   Load 8(invocation)
-             119:  114(fvec3)   GroupNonUniformBroadcast 38 117 118
-             120:    104(ptr)   AccessChain 49(data) 113 61
-             121:   41(fvec4)   Load 120
-             122:   41(fvec4)   VectorShuffle 121 119 4 5 6 3
-                                Store 120 122
-             123:      6(int)   Load 8(invocation)
-             125:    104(ptr)   AccessChain 49(data) 124 61
-             126:   41(fvec4)   Load 125
-             127:      6(int)   Load 8(invocation)
-             128:   41(fvec4)   GroupNonUniformBroadcast 38 126 127
-             129:    104(ptr)   AccessChain 49(data) 123 61
-                                Store 129 128
-             130:      6(int)   Load 8(invocation)
-             132:    131(ptr)   AccessChain 49(data) 61 60 54
-             133:     42(int)   Load 132
-             134:      6(int)   Load 8(invocation)
-             135:     42(int)   GroupNonUniformBroadcast 38 133 134
-             136:    131(ptr)   AccessChain 49(data) 130 60 54
-                                Store 136 135
-             137:      6(int)   Load 8(invocation)
-             140:    139(ptr)   AccessChain 49(data) 60 60
-             141:   43(ivec4)   Load 140
-             142:  138(ivec2)   VectorShuffle 141 141 0 1
-             143:      6(int)   Load 8(invocation)
-             144:  138(ivec2)   GroupNonUniformBroadcast 38 142 143
-             145:    139(ptr)   AccessChain 49(data) 137 60
-             146:   43(ivec4)   Load 145
-             147:   43(ivec4)   VectorShuffle 146 144 4 5 2 3
-                                Store 145 147
-             148:      6(int)   Load 8(invocation)
-             150:    139(ptr)   AccessChain 49(data) 51 60
-             151:   43(ivec4)   Load 150
-             152:  149(ivec3)   VectorShuffle 151 151 0 1 2
-             153:      6(int)   Load 8(invocation)
-             154:  149(ivec3)   GroupNonUniformBroadcast 38 152 153
-             155:    139(ptr)   AccessChain 49(data) 148 60
-             156:   43(ivec4)   Load 155
-             157:   43(ivec4)   VectorShuffle 156 154 4 5 6 3
-                                Store 155 157
-             158:      6(int)   Load 8(invocation)
-             159:    139(ptr)   AccessChain 49(data) 124 60
-             160:   43(ivec4)   Load 159
+              99:   40(float)   GroupNonUniformBroadcast 38 98 38
+             100:     96(ptr)   AccessChain 49(data) 95 61 54
+                                Store 100 99
+             101:      6(int)   Load 8(invocation)
+             104:    103(ptr)   AccessChain 49(data) 60 61
+             105:   41(fvec4)   Load 104
+             106:  102(fvec2)   VectorShuffle 105 105 0 1
+             107:  102(fvec2)   GroupNonUniformBroadcast 38 106 38
+             108:    103(ptr)   AccessChain 49(data) 101 61
+             109:   41(fvec4)   Load 108
+             110:   41(fvec4)   VectorShuffle 109 107 4 5 2 3
+                                Store 108 110
+             111:      6(int)   Load 8(invocation)
+             113:    103(ptr)   AccessChain 49(data) 51 61
+             114:   41(fvec4)   Load 113
+             115:  112(fvec3)   VectorShuffle 114 114 0 1 2
+             116:  112(fvec3)   GroupNonUniformBroadcast 38 115 38
+             117:    103(ptr)   AccessChain 49(data) 111 61
+             118:   41(fvec4)   Load 117
+             119:   41(fvec4)   VectorShuffle 118 116 4 5 6 3
+                                Store 117 119
+             120:      6(int)   Load 8(invocation)
+             122:    103(ptr)   AccessChain 49(data) 121 61
+             123:   41(fvec4)   Load 122
+             124:   41(fvec4)   GroupNonUniformBroadcast 38 123 38
+             125:    103(ptr)   AccessChain 49(data) 120 61
+                                Store 125 124
+             126:      6(int)   Load 8(invocation)
+             128:    127(ptr)   AccessChain 49(data) 61 60 54
+             129:     42(int)   Load 128
+             130:     42(int)   GroupNonUniformBroadcast 38 129 72
+             131:    127(ptr)   AccessChain 49(data) 126 60 54
+                                Store 131 130
+             132:      6(int)   Load 8(invocation)
+             135:    134(ptr)   AccessChain 49(data) 60 60
+             136:   43(ivec4)   Load 135
+             137:  133(ivec2)   VectorShuffle 136 136 0 1
+             138:  133(ivec2)   GroupNonUniformBroadcast 38 137 72
+             139:    134(ptr)   AccessChain 49(data) 132 60
+             140:   43(ivec4)   Load 139
+             141:   43(ivec4)   VectorShuffle 140 138 4 5 2 3
+                                Store 139 141
+             142:      6(int)   Load 8(invocation)
+             144:    134(ptr)   AccessChain 49(data) 51 60
+             145:   43(ivec4)   Load 144
+             146:  143(ivec3)   VectorShuffle 145 145 0 1 2
+             147:  143(ivec3)   GroupNonUniformBroadcast 38 146 72
+             148:    134(ptr)   AccessChain 49(data) 142 60
+             149:   43(ivec4)   Load 148
+             150:   43(ivec4)   VectorShuffle 149 147 4 5 6 3
+                                Store 148 150
+             151:      6(int)   Load 8(invocation)
+             152:    134(ptr)   AccessChain 49(data) 121 60
+             153:   43(ivec4)   Load 152
+             154:   43(ivec4)   GroupNonUniformBroadcast 38 153 72
+             155:    134(ptr)   AccessChain 49(data) 151 60
+                                Store 155 154
+             156:      6(int)   Load 8(invocation)
+             157:     55(ptr)   AccessChain 49(data) 61 51 54
+             158:      6(int)   Load 157
+             159:      6(int)   GroupNonUniformBroadcast 38 158 64
+             160:     55(ptr)   AccessChain 49(data) 156 51 54
+                                Store 160 159
              161:      6(int)   Load 8(invocation)
-             162:   43(ivec4)   GroupNonUniformBroadcast 38 160 161
-             163:    139(ptr)   AccessChain 49(data) 158 60
-                                Store 163 162
-             164:      6(int)   Load 8(invocation)
-             165:     55(ptr)   AccessChain 49(data) 61 51 54
-             166:      6(int)   Load 165
-             167:      6(int)   Load 8(invocation)
-             168:      6(int)   GroupNonUniformBroadcast 38 166 167
-             169:     55(ptr)   AccessChain 49(data) 164 51 54
-                                Store 169 168
+             163:     88(ptr)   AccessChain 49(data) 60 51
+             164:   17(ivec4)   Load 163
+             165:  162(ivec2)   VectorShuffle 164 164 0 1
+             166:  162(ivec2)   GroupNonUniformBroadcast 38 165 64
+             167:     88(ptr)   AccessChain 49(data) 161 51
+             168:   17(ivec4)   Load 167
+             169:   17(ivec4)   VectorShuffle 168 166 4 5 2 3
+                                Store 167 169
              170:      6(int)   Load 8(invocation)
-             172:     88(ptr)   AccessChain 49(data) 60 51
+             172:     88(ptr)   AccessChain 49(data) 51 51
              173:   17(ivec4)   Load 172
-             174:  171(ivec2)   VectorShuffle 173 173 0 1
-             175:      6(int)   Load 8(invocation)
-             176:  171(ivec2)   GroupNonUniformBroadcast 38 174 175
-             177:     88(ptr)   AccessChain 49(data) 170 51
-             178:   17(ivec4)   Load 177
-             179:   17(ivec4)   VectorShuffle 178 176 4 5 2 3
-                                Store 177 179
-             180:      6(int)   Load 8(invocation)
-             182:     88(ptr)   AccessChain 49(data) 51 51
-             183:   17(ivec4)   Load 182
-             184:  181(ivec3)   VectorShuffle 183 183 0 1 2
-             185:      6(int)   Load 8(invocation)
-             186:  181(ivec3)   GroupNonUniformBroadcast 38 184 185
-             187:     88(ptr)   AccessChain 49(data) 180 51
-             188:   17(ivec4)   Load 187
-             189:   17(ivec4)   VectorShuffle 188 186 4 5 6 3
-                                Store 187 189
+             174:  171(ivec3)   VectorShuffle 173 173 0 1 2
+             175:  171(ivec3)   GroupNonUniformBroadcast 38 174 64
+             176:     88(ptr)   AccessChain 49(data) 170 51
+             177:   17(ivec4)   Load 176
+             178:   17(ivec4)   VectorShuffle 177 175 4 5 6 3
+                                Store 176 178
+             179:      6(int)   Load 8(invocation)
+             180:     88(ptr)   AccessChain 49(data) 121 51
+             181:   17(ivec4)   Load 180
+             182:   17(ivec4)   GroupNonUniformBroadcast 38 181 64
+             183:     88(ptr)   AccessChain 49(data) 179 51
+                                Store 183 182
+             184:      6(int)   Load 8(invocation)
+             186:    185(ptr)   AccessChain 49(data) 61 121 54
+             187:44(float64_t)   Load 186
+             188:44(float64_t)   GroupNonUniformBroadcast 38 187 54
+             189:    185(ptr)   AccessChain 49(data) 184 121 54
+                                Store 189 188
              190:      6(int)   Load 8(invocation)
-             191:     88(ptr)   AccessChain 49(data) 124 51
-             192:   17(ivec4)   Load 191
-             193:      6(int)   Load 8(invocation)
-             194:   17(ivec4)   GroupNonUniformBroadcast 38 192 193
-             195:     88(ptr)   AccessChain 49(data) 190 51
-                                Store 195 194
-             196:      6(int)   Load 8(invocation)
-             198:    197(ptr)   AccessChain 49(data) 61 124 54
-             199:44(float64_t)   Load 198
+             193:    192(ptr)   AccessChain 49(data) 60 121
+             194: 45(f64vec4)   Load 193
+             195:191(f64vec2)   VectorShuffle 194 194 0 1
+             196:191(f64vec2)   GroupNonUniformBroadcast 38 195 54
+             197:    192(ptr)   AccessChain 49(data) 190 121
+             198: 45(f64vec4)   Load 197
+             199: 45(f64vec4)   VectorShuffle 198 196 4 5 2 3
+                                Store 197 199
              200:      6(int)   Load 8(invocation)
-             201:44(float64_t)   GroupNonUniformBroadcast 38 199 200
-             202:    197(ptr)   AccessChain 49(data) 196 124 54
-                                Store 202 201
-             203:      6(int)   Load 8(invocation)
-             206:    205(ptr)   AccessChain 49(data) 60 124
+             202:    192(ptr)   AccessChain 49(data) 51 121
+             203: 45(f64vec4)   Load 202
+             204:201(f64vec3)   VectorShuffle 203 203 0 1 2
+             205:201(f64vec3)   GroupNonUniformBroadcast 38 204 54
+             206:    192(ptr)   AccessChain 49(data) 200 121
              207: 45(f64vec4)   Load 206
-             208:204(f64vec2)   VectorShuffle 207 207 0 1
+             208: 45(f64vec4)   VectorShuffle 207 205 4 5 6 3
+                                Store 206 208
              209:      6(int)   Load 8(invocation)
-             210:204(f64vec2)   GroupNonUniformBroadcast 38 208 209
-             211:    205(ptr)   AccessChain 49(data) 203 124
-             212: 45(f64vec4)   Load 211
-             213: 45(f64vec4)   VectorShuffle 212 210 4 5 2 3
-                                Store 211 213
+             210:    192(ptr)   AccessChain 49(data) 121 121
+             211: 45(f64vec4)   Load 210
+             212: 45(f64vec4)   GroupNonUniformBroadcast 38 211 54
+             213:    192(ptr)   AccessChain 49(data) 209 121
+                                Store 213 212
              214:      6(int)   Load 8(invocation)
-             216:    205(ptr)   AccessChain 49(data) 51 124
-             217: 45(f64vec4)   Load 216
-             218:215(f64vec3)   VectorShuffle 217 217 0 1 2
-             219:      6(int)   Load 8(invocation)
-             220:215(f64vec3)   GroupNonUniformBroadcast 38 218 219
-             221:    205(ptr)   AccessChain 49(data) 214 124
-             222: 45(f64vec4)   Load 221
-             223: 45(f64vec4)   VectorShuffle 222 220 4 5 6 3
-                                Store 221 223
-             224:      6(int)   Load 8(invocation)
-             225:    205(ptr)   AccessChain 49(data) 124 124
-             226: 45(f64vec4)   Load 225
-             227:      6(int)   Load 8(invocation)
-             228: 45(f64vec4)   GroupNonUniformBroadcast 38 226 227
-             229:    205(ptr)   AccessChain 49(data) 224 124
-                                Store 229 228
-             230:      6(int)   Load 8(invocation)
-             231:    131(ptr)   AccessChain 49(data) 61 60 54
-             232:     42(int)   Load 231
-             233:    36(bool)   SLessThan 232 61
+             215:    127(ptr)   AccessChain 49(data) 61 60 54
+             216:     42(int)   Load 215
+             217:    36(bool)   SLessThan 216 61
+             218:    36(bool)   GroupNonUniformBroadcast 38 217 64
+             219:     42(int)   Select 218 60 61
+             220:    127(ptr)   AccessChain 49(data) 214 60 54
+                                Store 220 219
+             221:      6(int)   Load 8(invocation)
+             222:    134(ptr)   AccessChain 49(data) 60 60
+             223:   43(ivec4)   Load 222
+             224:  133(ivec2)   VectorShuffle 223 223 0 1
+             227:  226(bvec2)   SLessThan 224 225
+             228:  226(bvec2)   GroupNonUniformBroadcast 38 227 64
+             230:  133(ivec2)   Select 228 229 225
+             231:    134(ptr)   AccessChain 49(data) 221 60
+             232:   43(ivec4)   Load 231
+             233:   43(ivec4)   VectorShuffle 232 230 4 5 2 3
+                                Store 231 233
              234:      6(int)   Load 8(invocation)
-             235:    36(bool)   GroupNonUniformBroadcast 38 233 234
-             236:     42(int)   Select 235 60 61
-             237:    131(ptr)   AccessChain 49(data) 230 60 54
-                                Store 237 236
-             238:      6(int)   Load 8(invocation)
-             239:    139(ptr)   AccessChain 49(data) 60 60
-             240:   43(ivec4)   Load 239
-             241:  138(ivec2)   VectorShuffle 240 240 0 1
-             244:  243(bvec2)   SLessThan 241 242
-             245:      6(int)   Load 8(invocation)
-             246:  243(bvec2)   GroupNonUniformBroadcast 38 244 245
-             248:  138(ivec2)   Select 246 247 242
-             249:    139(ptr)   AccessChain 49(data) 238 60
-             250:   43(ivec4)   Load 249
-             251:   43(ivec4)   VectorShuffle 250 248 4 5 2 3
-                                Store 249 251
-             252:      6(int)   Load 8(invocation)
-             253:    139(ptr)   AccessChain 49(data) 60 60
-             254:   43(ivec4)   Load 253
-             255:  149(ivec3)   VectorShuffle 254 254 0 1 2
-             258:  257(bvec3)   SLessThan 255 256
-             259:      6(int)   Load 8(invocation)
-             260:  257(bvec3)   GroupNonUniformBroadcast 38 258 259
-             262:  149(ivec3)   Select 260 261 256
-             263:    139(ptr)   AccessChain 49(data) 252 60
-             264:   43(ivec4)   Load 263
-             265:   43(ivec4)   VectorShuffle 264 262 4 5 6 3
-                                Store 263 265
-             266:      6(int)   Load 8(invocation)
-             267:    139(ptr)   AccessChain 49(data) 60 60
-             268:   43(ivec4)   Load 267
-             270:   83(bvec4)   SLessThan 268 269
-             271:      6(int)   Load 8(invocation)
-             272:   83(bvec4)   GroupNonUniformBroadcast 38 270 271
-             274:   43(ivec4)   Select 272 273 269
-             275:    139(ptr)   AccessChain 49(data) 266 60
-                                Store 275 274
+             235:    134(ptr)   AccessChain 49(data) 60 60
+             236:   43(ivec4)   Load 235
+             237:  143(ivec3)   VectorShuffle 236 236 0 1 2
+             240:  239(bvec3)   SLessThan 237 238
+             241:  239(bvec3)   GroupNonUniformBroadcast 38 240 64
+             243:  143(ivec3)   Select 241 242 238
+             244:    134(ptr)   AccessChain 49(data) 234 60
+             245:   43(ivec4)   Load 244
+             246:   43(ivec4)   VectorShuffle 245 243 4 5 6 3
+                                Store 244 246
+             247:      6(int)   Load 8(invocation)
+             248:    134(ptr)   AccessChain 49(data) 60 60
+             249:   43(ivec4)   Load 248
+             251:   83(bvec4)   SLessThan 249 250
+             252:   83(bvec4)   GroupNonUniformBroadcast 38 251 64
+             254:   43(ivec4)   Select 252 253 250
+             255:    134(ptr)   AccessChain 49(data) 247 60
+                                Store 255 254
                                 Branch 94
-             276:               Label
-             277:      6(int)   Load 8(invocation)
-             278:     96(ptr)   AccessChain 49(data) 61 61 54
-             279:   40(float)   Load 278
-             280:   40(float)   GroupNonUniformBroadcastFirst 38 279
-             281:     96(ptr)   AccessChain 49(data) 277 61 54
-                                Store 281 280
-             282:      6(int)   Load 8(invocation)
-             283:    104(ptr)   AccessChain 49(data) 60 61
-             284:   41(fvec4)   Load 283
-             285:  103(fvec2)   VectorShuffle 284 284 0 1
-             286:  103(fvec2)   GroupNonUniformBroadcastFirst 38 285
-             287:    104(ptr)   AccessChain 49(data) 282 61
-             288:   41(fvec4)   Load 287
-             289:   41(fvec4)   VectorShuffle 288 286 4 5 2 3
-                                Store 287 289
-             290:      6(int)   Load 8(invocation)
-             291:    104(ptr)   AccessChain 49(data) 51 61
-             292:   41(fvec4)   Load 291
-             293:  114(fvec3)   VectorShuffle 292 292 0 1 2
-             294:  114(fvec3)   GroupNonUniformBroadcastFirst 38 293
-             295:    104(ptr)   AccessChain 49(data) 290 61
-             296:   41(fvec4)   Load 295
-             297:   41(fvec4)   VectorShuffle 296 294 4 5 6 3
-                                Store 295 297
-             298:      6(int)   Load 8(invocation)
-             299:    104(ptr)   AccessChain 49(data) 124 61
-             300:   41(fvec4)   Load 299
-             301:   41(fvec4)   GroupNonUniformBroadcastFirst 38 300
-             302:    104(ptr)   AccessChain 49(data) 298 61
-                                Store 302 301
-             303:      6(int)   Load 8(invocation)
-             304:    131(ptr)   AccessChain 49(data) 61 60 54
-             305:     42(int)   Load 304
-             306:     42(int)   GroupNonUniformBroadcastFirst 38 305
-             307:    131(ptr)   AccessChain 49(data) 303 60 54
-                                Store 307 306
-             308:      6(int)   Load 8(invocation)
-             309:    139(ptr)   AccessChain 49(data) 60 60
-             310:   43(ivec4)   Load 309
-             311:  138(ivec2)   VectorShuffle 310 310 0 1
-             312:  138(ivec2)   GroupNonUniformBroadcastFirst 38 311
-             313:    139(ptr)   AccessChain 49(data) 308 60
-             314:   43(ivec4)   Load 313
-             315:   43(ivec4)   VectorShuffle 314 312 4 5 2 3
-                                Store 313 315
-             316:      6(int)   Load 8(invocation)
-             317:    139(ptr)   AccessChain 49(data) 51 60
-             318:   43(ivec4)   Load 317
-             319:  149(ivec3)   VectorShuffle 318 318 0 1 2
-             320:  149(ivec3)   GroupNonUniformBroadcastFirst 38 319
-             321:    139(ptr)   AccessChain 49(data) 316 60
-             322:   43(ivec4)   Load 321
-             323:   43(ivec4)   VectorShuffle 322 320 4 5 6 3
-                                Store 321 323
-             324:      6(int)   Load 8(invocation)
-             325:    139(ptr)   AccessChain 49(data) 124 60
-             326:   43(ivec4)   Load 325
-             327:   43(ivec4)   GroupNonUniformBroadcastFirst 38 326
-             328:    139(ptr)   AccessChain 49(data) 324 60
-                                Store 328 327
-             329:      6(int)   Load 8(invocation)
-             330:     55(ptr)   AccessChain 49(data) 61 51 54
-             331:      6(int)   Load 330
-             332:      6(int)   GroupNonUniformBroadcastFirst 38 331
-             333:     55(ptr)   AccessChain 49(data) 329 51 54
-                                Store 333 332
-             334:      6(int)   Load 8(invocation)
-             335:     88(ptr)   AccessChain 49(data) 60 51
-             336:   17(ivec4)   Load 335
-             337:  171(ivec2)   VectorShuffle 336 336 0 1
-             338:  171(ivec2)   GroupNonUniformBroadcastFirst 38 337
-             339:     88(ptr)   AccessChain 49(data) 334 51
-             340:   17(ivec4)   Load 339
-             341:   17(ivec4)   VectorShuffle 340 338 4 5 2 3
-                                Store 339 341
-             342:      6(int)   Load 8(invocation)
-             343:     88(ptr)   AccessChain 49(data) 51 51
-             344:   17(ivec4)   Load 343
-             345:  181(ivec3)   VectorShuffle 344 344 0 1 2
-             346:  181(ivec3)   GroupNonUniformBroadcastFirst 38 345
-             347:     88(ptr)   AccessChain 49(data) 342 51
-             348:   17(ivec4)   Load 347
-             349:   17(ivec4)   VectorShuffle 348 346 4 5 6 3
-                                Store 347 349
-             350:      6(int)   Load 8(invocation)
-             351:     88(ptr)   AccessChain 49(data) 124 51
-             352:   17(ivec4)   Load 351
-             353:   17(ivec4)   GroupNonUniformBroadcastFirst 38 352
-             354:     88(ptr)   AccessChain 49(data) 350 51
-                                Store 354 353
-             355:      6(int)   Load 8(invocation)
-             356:    197(ptr)   AccessChain 49(data) 61 124 54
-             357:44(float64_t)   Load 356
-             358:44(float64_t)   GroupNonUniformBroadcastFirst 38 357
-             359:    197(ptr)   AccessChain 49(data) 355 124 54
-                                Store 359 358
-             360:      6(int)   Load 8(invocation)
-             361:    205(ptr)   AccessChain 49(data) 60 124
-             362: 45(f64vec4)   Load 361
-             363:204(f64vec2)   VectorShuffle 362 362 0 1
-             364:204(f64vec2)   GroupNonUniformBroadcastFirst 38 363
-             365:    205(ptr)   AccessChain 49(data) 360 124
-             366: 45(f64vec4)   Load 365
-             367: 45(f64vec4)   VectorShuffle 366 364 4 5 2 3
-                                Store 365 367
+             256:               Label
+             257:      6(int)   Load 8(invocation)
+             258:     96(ptr)   AccessChain 49(data) 61 61 54
+             259:   40(float)   Load 258
+             260:   40(float)   GroupNonUniformBroadcastFirst 38 259
+             261:     96(ptr)   AccessChain 49(data) 257 61 54
+                                Store 261 260
+             262:      6(int)   Load 8(invocation)
+             263:    103(ptr)   AccessChain 49(data) 60 61
+             264:   41(fvec4)   Load 263
+             265:  102(fvec2)   VectorShuffle 264 264 0 1
+             266:  102(fvec2)   GroupNonUniformBroadcastFirst 38 265
+             267:    103(ptr)   AccessChain 49(data) 262 61
+             268:   41(fvec4)   Load 267
+             269:   41(fvec4)   VectorShuffle 268 266 4 5 2 3
+                                Store 267 269
+             270:      6(int)   Load 8(invocation)
+             271:    103(ptr)   AccessChain 49(data) 51 61
+             272:   41(fvec4)   Load 271
+             273:  112(fvec3)   VectorShuffle 272 272 0 1 2
+             274:  112(fvec3)   GroupNonUniformBroadcastFirst 38 273
+             275:    103(ptr)   AccessChain 49(data) 270 61
+             276:   41(fvec4)   Load 275
+             277:   41(fvec4)   VectorShuffle 276 274 4 5 6 3
+                                Store 275 277
+             278:      6(int)   Load 8(invocation)
+             279:    103(ptr)   AccessChain 49(data) 121 61
+             280:   41(fvec4)   Load 279
+             281:   41(fvec4)   GroupNonUniformBroadcastFirst 38 280
+             282:    103(ptr)   AccessChain 49(data) 278 61
+                                Store 282 281
+             283:      6(int)   Load 8(invocation)
+             284:    127(ptr)   AccessChain 49(data) 61 60 54
+             285:     42(int)   Load 284
+             286:     42(int)   GroupNonUniformBroadcastFirst 38 285
+             287:    127(ptr)   AccessChain 49(data) 283 60 54
+                                Store 287 286
+             288:      6(int)   Load 8(invocation)
+             289:    134(ptr)   AccessChain 49(data) 60 60
+             290:   43(ivec4)   Load 289
+             291:  133(ivec2)   VectorShuffle 290 290 0 1
+             292:  133(ivec2)   GroupNonUniformBroadcastFirst 38 291
+             293:    134(ptr)   AccessChain 49(data) 288 60
+             294:   43(ivec4)   Load 293
+             295:   43(ivec4)   VectorShuffle 294 292 4 5 2 3
+                                Store 293 295
+             296:      6(int)   Load 8(invocation)
+             297:    134(ptr)   AccessChain 49(data) 51 60
+             298:   43(ivec4)   Load 297
+             299:  143(ivec3)   VectorShuffle 298 298 0 1 2
+             300:  143(ivec3)   GroupNonUniformBroadcastFirst 38 299
+             301:    134(ptr)   AccessChain 49(data) 296 60
+             302:   43(ivec4)   Load 301
+             303:   43(ivec4)   VectorShuffle 302 300 4 5 6 3
+                                Store 301 303
+             304:      6(int)   Load 8(invocation)
+             305:    134(ptr)   AccessChain 49(data) 121 60
+             306:   43(ivec4)   Load 305
+             307:   43(ivec4)   GroupNonUniformBroadcastFirst 38 306
+             308:    134(ptr)   AccessChain 49(data) 304 60
+                                Store 308 307
+             309:      6(int)   Load 8(invocation)
+             310:     55(ptr)   AccessChain 49(data) 61 51 54
+             311:      6(int)   Load 310
+             312:      6(int)   GroupNonUniformBroadcastFirst 38 311
+             313:     55(ptr)   AccessChain 49(data) 309 51 54
+                                Store 313 312
+             314:      6(int)   Load 8(invocation)
+             315:     88(ptr)   AccessChain 49(data) 60 51
+             316:   17(ivec4)   Load 315
+             317:  162(ivec2)   VectorShuffle 316 316 0 1
+             318:  162(ivec2)   GroupNonUniformBroadcastFirst 38 317
+             319:     88(ptr)   AccessChain 49(data) 314 51
+             320:   17(ivec4)   Load 319
+             321:   17(ivec4)   VectorShuffle 320 318 4 5 2 3
+                                Store 319 321
+             322:      6(int)   Load 8(invocation)
+             323:     88(ptr)   AccessChain 49(data) 51 51
+             324:   17(ivec4)   Load 323
+             325:  171(ivec3)   VectorShuffle 324 324 0 1 2
+             326:  171(ivec3)   GroupNonUniformBroadcastFirst 38 325
+             327:     88(ptr)   AccessChain 49(data) 322 51
+             328:   17(ivec4)   Load 327
+             329:   17(ivec4)   VectorShuffle 328 326 4 5 6 3
+                                Store 327 329
+             330:      6(int)   Load 8(invocation)
+             331:     88(ptr)   AccessChain 49(data) 121 51
+             332:   17(ivec4)   Load 331
+             333:   17(ivec4)   GroupNonUniformBroadcastFirst 38 332
+             334:     88(ptr)   AccessChain 49(data) 330 51
+                                Store 334 333
+             335:      6(int)   Load 8(invocation)
+             336:    185(ptr)   AccessChain 49(data) 61 121 54
+             337:44(float64_t)   Load 336
+             338:44(float64_t)   GroupNonUniformBroadcastFirst 38 337
+             339:    185(ptr)   AccessChain 49(data) 335 121 54
+                                Store 339 338
+             340:      6(int)   Load 8(invocation)
+             341:    192(ptr)   AccessChain 49(data) 60 121
+             342: 45(f64vec4)   Load 341
+             343:191(f64vec2)   VectorShuffle 342 342 0 1
+             344:191(f64vec2)   GroupNonUniformBroadcastFirst 38 343
+             345:    192(ptr)   AccessChain 49(data) 340 121
+             346: 45(f64vec4)   Load 345
+             347: 45(f64vec4)   VectorShuffle 346 344 4 5 2 3
+                                Store 345 347
+             348:      6(int)   Load 8(invocation)
+             349:    192(ptr)   AccessChain 49(data) 51 121
+             350: 45(f64vec4)   Load 349
+             351:201(f64vec3)   VectorShuffle 350 350 0 1 2
+             352:201(f64vec3)   GroupNonUniformBroadcastFirst 38 351
+             353:    192(ptr)   AccessChain 49(data) 348 121
+             354: 45(f64vec4)   Load 353
+             355: 45(f64vec4)   VectorShuffle 354 352 4 5 6 3
+                                Store 353 355
+             356:      6(int)   Load 8(invocation)
+             357:    192(ptr)   AccessChain 49(data) 121 121
+             358: 45(f64vec4)   Load 357
+             359: 45(f64vec4)   GroupNonUniformBroadcastFirst 38 358
+             360:    192(ptr)   AccessChain 49(data) 356 121
+                                Store 360 359
+             361:      6(int)   Load 8(invocation)
+             362:    127(ptr)   AccessChain 49(data) 61 60 54
+             363:     42(int)   Load 362
+             364:    36(bool)   SLessThan 363 61
+             365:    36(bool)   GroupNonUniformBroadcastFirst 38 364
+             366:     42(int)   Select 365 60 61
+             367:    127(ptr)   AccessChain 49(data) 361 60 54
+                                Store 367 366
              368:      6(int)   Load 8(invocation)
-             369:    205(ptr)   AccessChain 49(data) 51 124
-             370: 45(f64vec4)   Load 369
-             371:215(f64vec3)   VectorShuffle 370 370 0 1 2
-             372:215(f64vec3)   GroupNonUniformBroadcastFirst 38 371
-             373:    205(ptr)   AccessChain 49(data) 368 124
-             374: 45(f64vec4)   Load 373
-             375: 45(f64vec4)   VectorShuffle 374 372 4 5 6 3
-                                Store 373 375
-             376:      6(int)   Load 8(invocation)
-             377:    205(ptr)   AccessChain 49(data) 124 124
-             378: 45(f64vec4)   Load 377
-             379: 45(f64vec4)   GroupNonUniformBroadcastFirst 38 378
-             380:    205(ptr)   AccessChain 49(data) 376 124
-                                Store 380 379
-             381:      6(int)   Load 8(invocation)
-             382:    131(ptr)   AccessChain 49(data) 61 60 54
-             383:     42(int)   Load 382
-             384:    36(bool)   SLessThan 383 61
-             385:    36(bool)   GroupNonUniformBroadcastFirst 38 384
-             386:     42(int)   Select 385 60 61
-             387:    131(ptr)   AccessChain 49(data) 381 60 54
-                                Store 387 386
+             369:    134(ptr)   AccessChain 49(data) 60 60
+             370:   43(ivec4)   Load 369
+             371:  133(ivec2)   VectorShuffle 370 370 0 1
+             372:  226(bvec2)   SLessThan 371 225
+             373:  226(bvec2)   GroupNonUniformBroadcastFirst 38 372
+             374:  133(ivec2)   Select 373 229 225
+             375:    134(ptr)   AccessChain 49(data) 368 60
+             376:   43(ivec4)   Load 375
+             377:   43(ivec4)   VectorShuffle 376 374 4 5 2 3
+                                Store 375 377
+             378:      6(int)   Load 8(invocation)
+             379:    134(ptr)   AccessChain 49(data) 60 60
+             380:   43(ivec4)   Load 379
+             381:  143(ivec3)   VectorShuffle 380 380 0 1 2
+             382:  239(bvec3)   SLessThan 381 238
+             383:  239(bvec3)   GroupNonUniformBroadcastFirst 38 382
+             384:  143(ivec3)   Select 383 242 238
+             385:    134(ptr)   AccessChain 49(data) 378 60
+             386:   43(ivec4)   Load 385
+             387:   43(ivec4)   VectorShuffle 386 384 4 5 6 3
+                                Store 385 387
              388:      6(int)   Load 8(invocation)
-             389:    139(ptr)   AccessChain 49(data) 60 60
+             389:    134(ptr)   AccessChain 49(data) 60 60
              390:   43(ivec4)   Load 389
-             391:  138(ivec2)   VectorShuffle 390 390 0 1
-             392:  243(bvec2)   SLessThan 391 242
-             393:  243(bvec2)   GroupNonUniformBroadcastFirst 38 392
-             394:  138(ivec2)   Select 393 247 242
-             395:    139(ptr)   AccessChain 49(data) 388 60
-             396:   43(ivec4)   Load 395
-             397:   43(ivec4)   VectorShuffle 396 394 4 5 2 3
-                                Store 395 397
-             398:      6(int)   Load 8(invocation)
-             399:    139(ptr)   AccessChain 49(data) 60 60
-             400:   43(ivec4)   Load 399
-             401:  149(ivec3)   VectorShuffle 400 400 0 1 2
-             402:  257(bvec3)   SLessThan 401 256
-             403:  257(bvec3)   GroupNonUniformBroadcastFirst 38 402
-             404:  149(ivec3)   Select 403 261 256
-             405:    139(ptr)   AccessChain 49(data) 398 60
-             406:   43(ivec4)   Load 405
-             407:   43(ivec4)   VectorShuffle 406 404 4 5 6 3
-                                Store 405 407
-             408:      6(int)   Load 8(invocation)
-             409:    139(ptr)   AccessChain 49(data) 60 60
-             410:   43(ivec4)   Load 409
-             411:   83(bvec4)   SLessThan 410 269
-             412:   83(bvec4)   GroupNonUniformBroadcastFirst 38 411
-             413:   43(ivec4)   Select 412 273 269
-             414:    139(ptr)   AccessChain 49(data) 408 60
-                                Store 414 413
+             391:   83(bvec4)   SLessThan 390 250
+             392:   83(bvec4)   GroupNonUniformBroadcastFirst 38 391
+             393:   43(ivec4)   Select 392 253 250
+             394:    134(ptr)   AccessChain 49(data) 388 60
+                                Store 394 393
                                 Branch 94
               94:             Label
                               Return
diff --git a/Test/baseResults/spv.subgroupBallotNeg.comp.out b/Test/baseResults/spv.subgroupBallotNeg.comp.out
new file mode 100755
index 0000000..49b6b54
--- /dev/null
+++ b/Test/baseResults/spv.subgroupBallotNeg.comp.out
@@ -0,0 +1,6 @@
+spv.subgroupBallotNeg.comp
+ERROR: 0:32: 'id' : argument must be compile-time constant 
+ERROR: 1 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
diff --git a/Test/baseResults/spv.xfb.vert.out b/Test/baseResults/spv.xfb.vert.out
index 68633e1..3cd93d5 100644
--- a/Test/baseResults/spv.xfb.vert.out
+++ b/Test/baseResults/spv.xfb.vert.out
@@ -1,8 +1,4 @@
 spv.xfb.vert
-error: SPIRV-Tools Validation Errors
-error: Capability TransformFeedback is not allowed by Vulkan 1.0 specification (or requires extension)
-  OpCapability TransformFeedback
-
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 16
diff --git a/Test/baseResults/spv.xfb2.vert.out b/Test/baseResults/spv.xfb2.vert.out
index 6dc3987..a8551a1 100644
--- a/Test/baseResults/spv.xfb2.vert.out
+++ b/Test/baseResults/spv.xfb2.vert.out
@@ -1,8 +1,4 @@
 spv.xfb2.vert
-error: SPIRV-Tools Validation Errors
-error: Capability TransformFeedback is not allowed by Vulkan 1.0 specification (or requires extension)
-  OpCapability TransformFeedback
-
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 35
diff --git a/Test/baseResults/spv.xfb3.vert.out b/Test/baseResults/spv.xfb3.vert.out
index 1d526aa..0218847 100644
--- a/Test/baseResults/spv.xfb3.vert.out
+++ b/Test/baseResults/spv.xfb3.vert.out
@@ -1,8 +1,4 @@
 spv.xfb3.vert
-error: SPIRV-Tools Validation Errors
-error: Capability TransformFeedback is not allowed by Vulkan 1.0 specification (or requires extension)
-  OpCapability TransformFeedback
-
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 35
diff --git a/Test/constantUnaryConversion.comp b/Test/constantUnaryConversion.comp
new file mode 100644
index 0000000..467b6f6
--- /dev/null
+++ b/Test/constantUnaryConversion.comp
@@ -0,0 +1,48 @@
+#version 450

+

+#extension GL_KHX_shader_explicit_arithmetic_types : require

+

+const bool bool_init = true;

+const int8_t int8_t_init = int8_t(-1);

+const int16_t int16_t_init = int16_t(-2);

+const int32_t int32_t_init = int32_t(-3);

+const int64_t int64_t_init = int64_t(-4);

+const uint8_t uint8_t_init = uint8_t(1);

+const uint16_t uint16_t_init = uint16_t(2);

+const uint32_t uint32_t_init = uint32_t(3);

+const uint64_t uint64_t_init = uint64_t(4);

+const float16_t float16_t_init = float16_t(42.0);

+const float32_t float32_t_init = float32_t(13.0);

+const float64_t float64_t_init = float64_t(-4.0);

+

+#define TYPE_TO_TYPE(x, y) \

+    const x y##_to_##x = x(y##_init)

+

+#define TYPE_TO(x)              \

+    TYPE_TO_TYPE(x, bool);      \

+    TYPE_TO_TYPE(x, int8_t);    \

+    TYPE_TO_TYPE(x, int16_t);   \

+    TYPE_TO_TYPE(x, int32_t);   \

+    TYPE_TO_TYPE(x, int64_t);   \

+    TYPE_TO_TYPE(x, uint8_t);   \

+    TYPE_TO_TYPE(x, uint16_t);  \

+    TYPE_TO_TYPE(x, uint32_t);  \

+    TYPE_TO_TYPE(x, uint64_t);  \

+    TYPE_TO_TYPE(x, float16_t); \

+    TYPE_TO_TYPE(x, float32_t); \

+    TYPE_TO_TYPE(x, float64_t)

+

+TYPE_TO(bool);

+TYPE_TO(int8_t);

+TYPE_TO(int16_t);

+TYPE_TO(int32_t);

+TYPE_TO(int64_t);

+TYPE_TO(uint8_t);

+TYPE_TO(uint16_t);

+TYPE_TO(uint32_t);

+TYPE_TO(uint64_t);

+TYPE_TO(float16_t);

+TYPE_TO(float32_t);

+TYPE_TO(float64_t);

+

+void main() {}

diff --git a/Test/hlsl.int.dot.frag b/Test/hlsl.int.dot.frag
new file mode 100644
index 0000000..c293dc1
--- /dev/null
+++ b/Test/hlsl.int.dot.frag
@@ -0,0 +1,14 @@
+float4 main() : SV_Target {

+  int i = 1;

+  int1 i2 = 2;

+  int2 i3 = 3;

+  int3 i4 = 4;

+  int4 i5 = 5;

+

+  i = dot(i, i);

+  i2 = dot(i2, i2);

+  i3 = dot(i3, i3);

+  i4 = dot(i4, i4);

+  i5 = dot(i5, i5);

+  return i + i2.xxxx + i3.xyxy + i4.xyzx + i5;

+}
\ No newline at end of file
diff --git a/Test/hlsl.structbuffer.frag b/Test/hlsl.structbuffer.frag
index 4eb6912..dd522a6 100644
--- a/Test/hlsl.structbuffer.frag
+++ b/Test/hlsl.structbuffer.frag
@@ -5,7 +5,7 @@
     bool   test2;
 }; // stride = 20
 
-StructuredBuffer<sb_t>  sbuf : register(c10);
+StructuredBuffer<sb_t>  sbuf : register(t10);
 StructuredBuffer<float> sbuf2;
 
 float4 main(uint pos : FOO) : SV_Target0
diff --git a/Test/hlsl.type.type.conversion.all.frag b/Test/hlsl.type.type.conversion.all.frag
new file mode 100644
index 0000000..1883b01
--- /dev/null
+++ b/Test/hlsl.type.type.conversion.all.frag
@@ -0,0 +1,190 @@
+#define zeros 0

+#define zeros1 0

+#define zeros2 0, 0

+#define zeros3 0, 0, 0

+#define zeros4 0, 0, 0, 0

+#define zeros5 0, 0, 0, 0, 0

+#define zeros6 0, 0, 0, 0, 0, 0

+#define zeros7 0, 0, 0, 0, 0, 0, 0

+#define zeros8 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros9 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros11 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros12 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros13 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros14 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros15 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros16 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+float4 main() : SV_Target {

+  float var0 = float(zeros1);

+  float2 var13 = float(zeros1);

+  float2 var14 = float2(zeros2);

+  float3 var26 = float(zeros1);

+  float3 var28 = float3(zeros3);

+  float4 var39 = float(zeros1);

+  float4 var42 = float4(zeros4);

+  float4 var43 = float2x2(zeros4);

+  float2x2 var52 = float(zeros1);

+  float2x2 var55 = float4(zeros4);

+  float2x2 var56 = float2x2(zeros4);

+  float2x3 var65 = float(zeros1);

+  float2x3 var70 = float2x3(zeros6);

+  float2x4 var78 = float(zeros1);

+  float2x4 var84 = float2x4(zeros8);

+  float3x2 var91 = float(zeros1);

+  float3x2 var98 = float3x2(zeros6);

+  float3x3 var104 = float(zeros1);

+  float3x3 var112 = float3x3(zeros9);

+  float3x4 var117 = float(zeros1);

+  float3x4 var126 = float3x4(zeros12);

+  float4x2 var130 = float(zeros1);

+  float4x2 var140 = float4x2(zeros8);

+  float4x3 var143 = float(zeros1);

+  float4x3 var154 = float4x3(zeros12);

+  float4x4 var156 = float(zeros1);

+  float4x4 var168 = float4x4(zeros16);

+  float var1 = float2(zeros2);// warning X3206: implicit truncation of vector type

+  float var2 = float3(zeros3);// warning X3206: implicit truncation of vector type

+  float var3 = float4(zeros4);// warning X3206: implicit truncation of vector type

+  float var4 = float2x2(zeros4);// warning X3206: implicit truncation of vector type

+  float var5 = float2x3(zeros6);// warning X3206: implicit truncation of vector type

+  float var6 = float2x4(zeros8);// warning X3206: implicit truncation of vector type

+  float var7 = float3x2(zeros6);// warning X3206: implicit truncation of vector type

+  float var8 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float var9 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float var10 = float4x2(zeros8);// warning X3206: implicit truncation of vector type

+  float var11 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float var12 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2 var15 = float3(zeros3);// warning X3206: implicit truncation of vector type

+  float2 var16 = float4(zeros4);// warning X3206: implicit truncation of vector type

+  float3 var29 = float4(zeros4);// warning X3206: implicit truncation of vector type

+  float2x2 var57 = float2x3(zeros6);// warning X3206: implicit truncation of vector type

+  float2x2 var58 = float2x4(zeros8);// warning X3206: implicit truncation of vector type

+  float2x2 var59 = float3x2(zeros6);// warning X3206: implicit truncation of vector type

+  float2x2 var60 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float2x2 var61 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float2x2 var62 = float4x2(zeros8);// warning X3206: implicit truncation of vector type

+  float2x2 var63 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float2x2 var64 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2x3 var71 = float2x4(zeros8);// warning X3206: implicit truncation of vector type

+  float2x3 var73 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float2x3 var74 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float2x3 var76 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float2x3 var77 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2x4 var87 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float2x4 var90 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float3x2 var99 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float3x2 var100 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float3x2 var101 = float4x2(zeros8);// warning X3206: implicit truncation of vector type

+  float3x2 var102 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float3x2 var103 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float3x3 var113 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float3x3 var115 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float3x3 var116 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float3x4 var129 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float4x2 var141 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float4x2 var142 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float4x3 var155 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2 var17 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float2'

+  float2 var18 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float2'

+  float2 var19 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float2'

+  float2 var20 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float2'

+  float2 var21 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float2'

+  float2 var22 = float3x4(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x4' to 'float2'

+  float2 var23 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float2'

+  float2 var24 = float4x3(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x3' to 'float2'

+  float2 var25 = float4x4(zeros16);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x4' to 'float2'

+  float3 var27 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float3'

+  float3 var30 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float3'

+  float3 var31 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float3'

+  float3 var32 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float3'

+  float3 var33 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float3'

+  float3 var34 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float3'

+  float3 var35 = float3x4(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x4' to 'float3'

+  float3 var36 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float3'

+  float3 var37 = float4x3(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x3' to 'float3'

+  float3 var38 = float4x4(zeros16);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x4' to 'float3'

+  float4 var40 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float4'

+  float4 var41 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float4'

+  float4 var44 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float4'

+  float4 var45 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float4'

+  float4 var46 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float4'

+  float4 var47 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float4'

+  float4 var48 = float3x4(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x4' to 'float4'

+  float4 var49 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float4'

+  float4 var50 = float4x3(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x3' to 'float4'

+  float4 var51 = float4x4(zeros16);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x4' to 'float4'

+  float2x2 var53 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float2x2'

+  float2x2 var54 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float2x2'

+  float2x3 var66 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float2x3'

+  float2x3 var67 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float2x3'

+  float2x3 var68 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float2x3'

+  float2x3 var69 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float2x3'

+  float2x3 var72 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float2x3'

+  float2x3 var75 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float2x3'

+  float2x4 var79 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float2x4'

+  float2x4 var80 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float2x4'

+  float2x4 var81 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float2x4'

+  float2x4 var82 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float2x4'

+  float2x4 var83 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float2x4'

+  float2x4 var85 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float2x4'

+  float2x4 var86 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float2x4'

+  float2x4 var88 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float2x4'

+  float2x4 var89 = float4x3(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x3' to 'float2x4'

+  float3x2 var92 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float3x2'

+  float3x2 var93 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float3x2'

+  float3x2 var94 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float3x2'

+  float3x2 var95 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float3x2'

+  float3x2 var96 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float3x2'

+  float3x2 var97 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float3x2'

+  float3x3 var105 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float3x3'

+  float3x3 var106 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float3x3'

+  float3x3 var107 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float3x3'

+  float3x3 var108 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float3x3'

+  float3x3 var109 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float3x3'

+  float3x3 var110 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float3x3'

+  float3x3 var111 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float3x3'

+  float3x3 var114 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float3x3'

+  float3x4 var118 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float3x4'

+  float3x4 var119 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float3x4'

+  float3x4 var120 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float3x4'

+  float3x4 var121 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float3x4'

+  float3x4 var122 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float3x4'

+  float3x4 var123 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float3x4'

+  float3x4 var124 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float3x4'

+  float3x4 var125 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float3x4'

+  float3x4 var127 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float3x4'

+  float3x4 var128 = float4x3(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x3' to 'float3x4'

+  float4x2 var131 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float4x2'

+  float4x2 var132 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float4x2'

+  float4x2 var133 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float4x2'

+  float4x2 var134 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float4x2'

+  float4x2 var135 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float4x2'

+  float4x2 var136 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float4x2'

+  float4x2 var137 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float4x2'

+  float4x2 var138 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float4x2'

+  float4x2 var139 = float3x4(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x4' to 'float4x2'

+  float4x3 var144 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float4x3'

+  float4x3 var145 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float4x3'

+  float4x3 var146 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float4x3'

+  float4x3 var147 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float4x3'

+  float4x3 var148 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float4x3'

+  float4x3 var149 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float4x3'

+  float4x3 var150 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float4x3'

+  float4x3 var151 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float4x3'

+  float4x3 var152 = float3x4(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x4' to 'float4x3'

+  float4x3 var153 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float4x3'

+  float4x4 var157 = float2(zeros2);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2' to 'float4x4'

+  float4x4 var158 = float3(zeros3);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3' to 'float4x4'

+  float4x4 var159 = float4(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4' to 'float4x4'

+  float4x4 var160 = float2x2(zeros4);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x2' to 'float4x4'

+  float4x4 var161 = float2x3(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x3' to 'float4x4'

+  float4x4 var162 = float2x4(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float2x4' to 'float4x4'

+  float4x4 var163 = float3x2(zeros6);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x2' to 'float4x4'

+  float4x4 var164 = float3x3(zeros9);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x3' to 'float4x4'

+  float4x4 var165 = float3x4(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float3x4' to 'float4x4'

+  float4x4 var166 = float4x2(zeros8);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x2' to 'float4x4'

+  float4x4 var167 = float4x3(zeros12);// Compilation failed because: error X3017: cannot implicitly convert from 'const float4x3' to 'float4x4'

+  return 0;

+}

+

diff --git a/Test/hlsl.type.type.conversion.valid.frag b/Test/hlsl.type.type.conversion.valid.frag
new file mode 100644
index 0000000..114edbc
--- /dev/null
+++ b/Test/hlsl.type.type.conversion.valid.frag
@@ -0,0 +1,90 @@
+#define zeros 0

+#define zeros1 0

+#define zeros2 0, 0

+#define zeros3 0, 0, 0

+#define zeros4 0, 0, 0, 0

+#define zeros5 0, 0, 0, 0, 0

+#define zeros6 0, 0, 0, 0, 0, 0

+#define zeros7 0, 0, 0, 0, 0, 0, 0

+#define zeros8 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros9 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros11 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros12 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros13 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros14 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros15 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+#define zeros16 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

+float4 main() : SV_Target {

+  float var0 = float(zeros1);

+  float2 var13 = float(zeros1);

+  float2 var14 = float2(zeros2);

+  float3 var26 = float(zeros1);

+  float3 var28 = float3(zeros3);

+  float4 var39 = float(zeros1);

+  float4 var42 = float4(zeros4);

+  float4 var43 = float2x2(zeros4);

+  float2x2 var52 = float(zeros1);

+  float2x2 var55 = float4(zeros4);

+  float2x2 var56 = float2x2(zeros4);

+  float2x3 var65 = float(zeros1);

+  float2x3 var70 = float2x3(zeros6);

+  float2x4 var78 = float(zeros1);

+  float2x4 var84 = float2x4(zeros8);

+  float3x2 var91 = float(zeros1);

+  float3x2 var98 = float3x2(zeros6);

+  float3x3 var104 = float(zeros1);

+  float3x3 var112 = float3x3(zeros9);

+  float3x4 var117 = float(zeros1);

+  float3x4 var126 = float3x4(zeros12);

+  float4x2 var130 = float(zeros1);

+  float4x2 var140 = float4x2(zeros8);

+  float4x3 var143 = float(zeros1);

+  float4x3 var154 = float4x3(zeros12);

+  float4x4 var156 = float(zeros1);

+  float4x4 var168 = float4x4(zeros16);

+  float var1 = float2(zeros2);// warning X3206: implicit truncation of vector type

+  float var2 = float3(zeros3);// warning X3206: implicit truncation of vector type

+  float var3 = float4(zeros4);// warning X3206: implicit truncation of vector type

+  float var4 = float2x2(zeros4);// warning X3206: implicit truncation of vector type

+  float var5 = float2x3(zeros6);// warning X3206: implicit truncation of vector type

+  float var6 = float2x4(zeros8);// warning X3206: implicit truncation of vector type

+  float var7 = float3x2(zeros6);// warning X3206: implicit truncation of vector type

+  float var8 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float var9 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float var10 = float4x2(zeros8);// warning X3206: implicit truncation of vector type

+  float var11 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float var12 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2 var15 = float3(zeros3);// warning X3206: implicit truncation of vector type

+  float2 var16 = float4(zeros4);// warning X3206: implicit truncation of vector type

+  float3 var29 = float4(zeros4);// warning X3206: implicit truncation of vector type

+  float2x2 var57 = float2x3(zeros6);// warning X3206: implicit truncation of vector type

+  float2x2 var58 = float2x4(zeros8);// warning X3206: implicit truncation of vector type

+  float2x2 var59 = float3x2(zeros6);// warning X3206: implicit truncation of vector type

+  float2x2 var60 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float2x2 var61 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float2x2 var62 = float4x2(zeros8);// warning X3206: implicit truncation of vector type

+  float2x2 var63 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float2x2 var64 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2x3 var71 = float2x4(zeros8);// warning X3206: implicit truncation of vector type

+  float2x3 var73 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float2x3 var74 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float2x3 var76 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float2x3 var77 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float2x4 var87 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float2x4 var90 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float3x2 var99 = float3x3(zeros9);// warning X3206: implicit truncation of vector type

+  float3x2 var100 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float3x2 var101 = float4x2(zeros8);// warning X3206: implicit truncation of vector type

+  float3x2 var102 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float3x2 var103 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float3x3 var113 = float3x4(zeros12);// warning X3206: implicit truncation of vector type

+  float3x3 var115 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float3x3 var116 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float3x4 var129 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float4x2 var141 = float4x3(zeros12);// warning X3206: implicit truncation of vector type

+  float4x2 var142 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  float4x3 var155 = float4x4(zeros16);// warning X3206: implicit truncation of vector type

+  return 0;

+}

+

diff --git a/Test/spv.fragmentDensity-es.frag b/Test/spv.fragmentDensity-es.frag
new file mode 100644
index 0000000..35fb96e
--- /dev/null
+++ b/Test/spv.fragmentDensity-es.frag
@@ -0,0 +1,11 @@
+#version 310 es
+
+#extension GL_EXT_fragment_invocation_density : require
+
+layout (location = 0) out highp ivec2 FragSize;
+layout (location = 2) out highp int FragInvocationCount;
+
+void main () {
+    FragSize = gl_FragSizeEXT;
+    FragInvocationCount = gl_FragInvocationCountEXT;
+}
diff --git a/Test/spv.fragmentDensity-neg.frag b/Test/spv.fragmentDensity-neg.frag
new file mode 100644
index 0000000..68e736c
--- /dev/null
+++ b/Test/spv.fragmentDensity-neg.frag
@@ -0,0 +1,12 @@
+#version 450
+
+//make sure the builtins don't exist if the extension isn't enabled.
+//#extension GL_EXT_fragment_invocation_density : require
+
+layout (location = 0) out vec2 FragSize;
+layout (location = 2) out int FragInvocationCount;
+
+void main () {
+    FragSize = gl_FragSizeEXT;
+    FragInvocationCount = gl_FragInvocationCountEXT;
+}
diff --git a/Test/spv.fragmentDensity.frag b/Test/spv.fragmentDensity.frag
new file mode 100644
index 0000000..9b37ba4
--- /dev/null
+++ b/Test/spv.fragmentDensity.frag
@@ -0,0 +1,11 @@
+#version 450
+
+#extension GL_EXT_fragment_invocation_density : require
+
+layout (location = 0) out vec2 FragSize;
+layout (location = 2) out int FragInvocationCount;
+
+void main () {
+    FragSize = gl_FragSizeEXT;
+    FragInvocationCount = gl_FragInvocationCountEXT;
+}
diff --git a/Test/spv.fragmentDensity.vert b/Test/spv.fragmentDensity.vert
new file mode 100644
index 0000000..eaef72d
--- /dev/null
+++ b/Test/spv.fragmentDensity.vert
@@ -0,0 +1,12 @@
+#version 450
+
+// try using a fragment-only extension in a vertex shader
+#extension GL_EXT_fragment_invocation_density : require
+
+layout (location = 0) out uvec2 FragSize;
+layout (location = 2) out int FragInvocationCount;
+
+void main () {
+    FragSize = gl_FragSizeEXT;
+    FragInvocationCount = gl_FragInvocationCountEXT;
+}
diff --git a/Test/spv.scalarlayout.frag b/Test/spv.scalarlayout.frag
new file mode 100644
index 0000000..c7ecf50
--- /dev/null
+++ b/Test/spv.scalarlayout.frag
@@ -0,0 +1,32 @@
+#version 450 core

+

+#extension GL_EXT_scalar_block_layout : enable

+

+// Block memory layout

+struct S

+{

+    float      a;   // offset 0

+    vec2       b;   // offset 4

+    double     c;   // offset 16

+    float      d;   // offset 24

+    vec3       e;   // offset 28

+    float      f;   // offset 40

+    // size = 44, align = 8

+};

+

+layout(column_major, scalar) uniform B1

+{

+    float      a;     // offset = 0

+    vec2       b;     // offset = 4

+    vec3       c;     // offset = 12

+    float      d[2];  // offset = 24

+    mat2x3     e;     // offset = 32, takes 24 bytes, matrixstride = 12

+    mat2x3     f[2];  // offset = 56, takes 48 bytes, matrixstride = 12, arraystride = 24

+    float      g;     // offset = 104

+    S          h;     // offset = 112 (aligned to multiple of 8)

+    S          i[2];  // offset = 160 (aligned to multiple of 8) stride = 48

+};

+

+void main()

+{

+}

diff --git a/Test/spv.scalarlayoutfloat16.frag b/Test/spv.scalarlayoutfloat16.frag
new file mode 100644
index 0000000..ff87097
--- /dev/null
+++ b/Test/spv.scalarlayoutfloat16.frag
@@ -0,0 +1,31 @@
+#version 450 core

+

+#extension GL_EXT_shader_16bit_storage: enable

+#extension GL_EXT_scalar_block_layout : enable

+

+// Block memory layout

+struct S

+{

+    float16_t      a;   // offset 0

+    f16vec2        b;   // offset 2

+    double         c;   // offset 8

+    float16_t      d;   // offset 16

+    f16vec3        e;   // offset 18

+    float16_t      f;   // offset 24

+    // size = 26, align = 8

+};

+

+layout(column_major, scalar) uniform B1

+{

+    float16_t      a;     // offset = 0

+    f16vec2        b;     // offset = 2

+    f16vec3        c;     // offset = 6

+    float16_t      d[2];  // offset = 12 stride = 2

+    float16_t      g;     // offset = 16

+    S              h;     // offset = 24 (aligned to multiple of 8)

+    S              i[2];  // offset = 56 (aligned to multiple of 8) stride = 32

+};

+

+void main()

+{

+}

diff --git a/Test/spv.shaderStencilExport.frag b/Test/spv.shaderStencilExport.frag
index 62e0f57..e3ad4d6 100644
--- a/Test/spv.shaderStencilExport.frag
+++ b/Test/spv.shaderStencilExport.frag
@@ -2,6 +2,8 @@
 

 #extension GL_ARB_shader_stencil_export: enable

 

+out int gl_FragStencilRefARB;

+

 void main()

 {

     gl_FragStencilRefARB = 100;

diff --git a/Test/spv.subgroupBallot.comp b/Test/spv.subgroupBallot.comp
old mode 100644
new mode 100755
index 2875468..bb9dc3e
--- a/Test/spv.subgroupBallot.comp
+++ b/Test/spv.subgroupBallot.comp
@@ -31,30 +31,30 @@
 

     if ((relMask == result) && subgroupInverseBallot(data[0].u4))

     {

-        data[invocation].f4.x   = subgroupBroadcast(data[0].f4.x,    invocation);

-        data[invocation].f4.xy  = subgroupBroadcast(data[1].f4.xy,   invocation);

-        data[invocation].f4.xyz = subgroupBroadcast(data[2].f4.xyz,  invocation);

-        data[invocation].f4     = subgroupBroadcast(data[3].f4,      invocation);

+        data[invocation].f4.x   = subgroupBroadcast(data[0].f4.x,    3);

+        data[invocation].f4.xy  = subgroupBroadcast(data[1].f4.xy,   3);

+        data[invocation].f4.xyz = subgroupBroadcast(data[2].f4.xyz,  3);

+        data[invocation].f4     = subgroupBroadcast(data[3].f4,      3);

 

-        data[invocation].i4.x   = subgroupBroadcast(data[0].i4.x,    invocation);

-        data[invocation].i4.xy  = subgroupBroadcast(data[1].i4.xy,   invocation);

-        data[invocation].i4.xyz = subgroupBroadcast(data[2].i4.xyz,  invocation);

-        data[invocation].i4     = subgroupBroadcast(data[3].i4,      invocation);

+        data[invocation].i4.x   = subgroupBroadcast(data[0].i4.x,    2);

+        data[invocation].i4.xy  = subgroupBroadcast(data[1].i4.xy,   2);

+        data[invocation].i4.xyz = subgroupBroadcast(data[2].i4.xyz,  2);

+        data[invocation].i4     = subgroupBroadcast(data[3].i4,      2);

 

-        data[invocation].u4.x   = subgroupBroadcast(data[0].u4.x,    invocation);

-        data[invocation].u4.xy  = subgroupBroadcast(data[1].u4.xy,   invocation);

-        data[invocation].u4.xyz = subgroupBroadcast(data[2].u4.xyz,  invocation);

-        data[invocation].u4     = subgroupBroadcast(data[3].u4,      invocation);

+        data[invocation].u4.x   = subgroupBroadcast(data[0].u4.x,    1);

+        data[invocation].u4.xy  = subgroupBroadcast(data[1].u4.xy,   1);

+        data[invocation].u4.xyz = subgroupBroadcast(data[2].u4.xyz,  1);

+        data[invocation].u4     = subgroupBroadcast(data[3].u4,      1);

 

-        data[invocation].d4.x   = subgroupBroadcast(data[0].d4.x,    invocation);

-        data[invocation].d4.xy  = subgroupBroadcast(data[1].d4.xy,   invocation);

-        data[invocation].d4.xyz = subgroupBroadcast(data[2].d4.xyz,  invocation);

-        data[invocation].d4     = subgroupBroadcast(data[3].d4,      invocation);

+        data[invocation].d4.x   = subgroupBroadcast(data[0].d4.x,    0);

+        data[invocation].d4.xy  = subgroupBroadcast(data[1].d4.xy,   0);

+        data[invocation].d4.xyz = subgroupBroadcast(data[2].d4.xyz,  0);

+        data[invocation].d4     = subgroupBroadcast(data[3].d4,      0);

 

-        data[invocation].i4.x   = int(subgroupBroadcast(data[0].i4.x < 0,            invocation));

-        data[invocation].i4.xy  = ivec2(subgroupBroadcast(lessThan(data[1].i4.xy, ivec2(0)), invocation));

-        data[invocation].i4.xyz = ivec3(subgroupBroadcast(lessThan(data[1].i4.xyz, ivec3(0)), invocation));

-        data[invocation].i4     = ivec4(subgroupBroadcast(lessThan(data[1].i4, ivec4(0)), invocation));

+        data[invocation].i4.x   = int(subgroupBroadcast(data[0].i4.x < 0,            1));

+        data[invocation].i4.xy  = ivec2(subgroupBroadcast(lessThan(data[1].i4.xy, ivec2(0)), 1));

+        data[invocation].i4.xyz = ivec3(subgroupBroadcast(lessThan(data[1].i4.xyz, ivec3(0)), 1));

+        data[invocation].i4     = ivec4(subgroupBroadcast(lessThan(data[1].i4, ivec4(0)), 1));

     }

     else

     {

diff --git a/Test/spv.subgroupBallotNeg.comp b/Test/spv.subgroupBallotNeg.comp
new file mode 100755
index 0000000..4020adf
--- /dev/null
+++ b/Test/spv.subgroupBallotNeg.comp
@@ -0,0 +1,33 @@
+#version 450

+

+#extension GL_KHR_shader_subgroup_ballot: enable

+

+layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;

+

+layout(binding = 0) buffer Buffers

+{

+    vec4  f4;

+    ivec4 i4;

+    uvec4 u4;

+    dvec4 d4;

+} data[4];

+

+void main()

+{

+    uint invocation = (gl_SubgroupInvocationID + gl_SubgroupSize) % 4;

+

+    uvec4 relMask = gl_SubgroupEqMask +

+                       gl_SubgroupGeMask +

+                       gl_SubgroupGtMask +

+                       gl_SubgroupLeMask +

+                       gl_SubgroupLtMask;

+

+    uvec4 result = subgroupBallot(true);

+

+    data[invocation].u4.x = subgroupBallotBitCount(result);

+    data[invocation].u4.y = subgroupBallotBitExtract(result, 0) ? 1 : 0;

+    data[invocation].u4.z = subgroupBallotInclusiveBitCount(result) + subgroupBallotExclusiveBitCount(result);

+    data[invocation].u4.w = subgroupBallotFindLSB(result) + subgroupBallotFindMSB(result);

+

+    data[invocation].f4.x   = subgroupBroadcast(data[0].f4.x,    invocation);  // ERROR: not constant

+}

diff --git a/glslang/Include/BaseTypes.h b/glslang/Include/BaseTypes.h
index 4a7c056..fabd613 100644
--- a/glslang/Include/BaseTypes.h
+++ b/glslang/Include/BaseTypes.h
@@ -232,6 +232,9 @@
     EbvViewIndex,
     EbvDeviceIndex,
 
+    EbvFragSizeEXT,
+    EbvFragInvocationCountEXT,
+
 #ifdef NV_EXTENSIONS
     EbvViewportMaskNV,
     EbvSecondaryPositionNV,
@@ -404,6 +407,9 @@
     case EbvViewIndex:                  return "ViewIndex";
     case EbvDeviceIndex:                return "DeviceIndex";
 
+    case EbvFragSizeEXT:                return "FragSizeEXT";
+    case EbvFragInvocationCountEXT:     return "FragInvocationCountEXT";
+
 #ifdef NV_EXTENSIONS
     case EbvViewportMaskNV:             return "ViewportMaskNV";
     case EbvSecondaryPositionNV:        return "SecondaryPositionNV";
diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h
old mode 100644
new mode 100755
index ae9cf40..30fc8ce
--- a/glslang/Include/Types.h
+++ b/glslang/Include/Types.h
@@ -277,6 +277,7 @@
     ElpStd140,
     ElpStd430,
     ElpPacked,
+    ElpScalar,
     ElpCount        // If expanding, see bitfield width below
 };
 
@@ -774,40 +775,40 @@
     int layoutOffset;
     int layoutAlign;
 
-                 unsigned int layoutLocation            :12;
-    static const unsigned int layoutLocationEnd    =  0xFFF;
+                 unsigned int layoutLocation             : 12;
+    static const unsigned int layoutLocationEnd      =  0xFFF;
 
-                 unsigned int layoutComponent           : 3;
-    static const unsigned int layoutComponentEnd    =     4;
+                 unsigned int layoutComponent            :  3;
+    static const unsigned int layoutComponentEnd      =     4;
 
-                 unsigned int layoutSet                 : 7;
-    static const unsigned int layoutSetEnd         =   0x3F;
+                 unsigned int layoutSet                  :  7;
+    static const unsigned int layoutSetEnd           =   0x3F;
 
-                 unsigned int layoutBinding            : 16;
-    static const unsigned int layoutBindingEnd    =  0xFFFF;
+                 unsigned int layoutBinding              : 16;
+    static const unsigned int layoutBindingEnd      =  0xFFFF;
 
-                 unsigned int layoutIndex              :  8;
-    static const unsigned int layoutIndexEnd    =      0xFF;
+                 unsigned int layoutIndex                :  8;
+    static const unsigned int layoutIndexEnd      =      0xFF;
 
-                 unsigned int layoutStream              : 8;
-    static const unsigned int layoutStreamEnd    =     0xFF;
+                 unsigned int layoutStream               :  8;
+    static const unsigned int layoutStreamEnd      =     0xFF;
 
-                 unsigned int layoutXfbBuffer           : 4;
-    static const unsigned int layoutXfbBufferEnd    =   0xF;
+                 unsigned int layoutXfbBuffer            :  4;
+    static const unsigned int layoutXfbBufferEnd      =   0xF;
 
-                 unsigned int layoutXfbStride          : 10;
-    static const unsigned int layoutXfbStrideEnd    = 0x3FF;
+                 unsigned int layoutXfbStride            : 14;
+    static const unsigned int layoutXfbStrideEnd     = 0x3FFF;
 
-                 unsigned int layoutXfbOffset          : 10;
-    static const unsigned int layoutXfbOffsetEnd    = 0x3FF;
+                 unsigned int layoutXfbOffset            : 13;
+    static const unsigned int layoutXfbOffsetEnd     = 0x1FFF;
 
-                 unsigned int layoutAttachment          : 8;  // for input_attachment_index
-    static const unsigned int layoutAttachmentEnd    = 0XFF;
+                 unsigned int layoutAttachment           :  8;  // for input_attachment_index
+    static const unsigned int layoutAttachmentEnd      = 0XFF;
 
                  unsigned int layoutSpecConstantId       : 11;
     static const unsigned int layoutSpecConstantIdEnd = 0x7FF;
 
-    TLayoutFormat layoutFormat                         :  8;
+    TLayoutFormat layoutFormat                           :  8;
 
     bool layoutPushConstant;
 
@@ -951,6 +952,7 @@
         case ElpShared:   return "shared";
         case ElpStd140:   return "std140";
         case ElpStd430:   return "std430";
+        case ElpScalar:   return "scalar";
         default:          return "none";
         }
     }
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index 900a0b4..dcd5260 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -1,3 +1,3 @@
 // This header is generated by the make-revision script.
 
-#define GLSLANG_PATCH_LEVEL 2933
+#define GLSLANG_PATCH_LEVEL 2997
diff --git a/glslang/MachineIndependent/Constant.cpp b/glslang/MachineIndependent/Constant.cpp
index b33af84..2c5aea8 100644
--- a/glslang/MachineIndependent/Constant.cpp
+++ b/glslang/MachineIndependent/Constant.cpp
@@ -670,6 +670,279 @@
             break;
         }
 
+        case EOpConvInt8ToBool:
+            newConstArray[i].setBConst(unionArray[i].getI8Const()); break;
+        case EOpConvUint8ToBool:
+            newConstArray[i].setBConst(unionArray[i].getU8Const()); break;
+        case EOpConvInt16ToBool:
+            newConstArray[i].setBConst(unionArray[i].getI16Const()); break;
+        case EOpConvUint16ToBool:
+            newConstArray[i].setBConst(unionArray[i].getU16Const()); break;
+        case EOpConvIntToBool:
+            newConstArray[i].setBConst(unionArray[i].getIConst()); break;
+        case EOpConvUintToBool:
+            newConstArray[i].setBConst(unionArray[i].getUConst()); break;
+        case EOpConvInt64ToBool:
+            newConstArray[i].setBConst(unionArray[i].getI64Const()); break;
+        case EOpConvUint64ToBool:
+            newConstArray[i].setBConst(unionArray[i].getI64Const()); break;
+        case EOpConvFloat16ToBool:
+            newConstArray[i].setBConst(unionArray[i].getDConst()); break;
+        case EOpConvFloatToBool:
+            newConstArray[i].setBConst(unionArray[i].getDConst()); break;
+        case EOpConvDoubleToBool:
+            newConstArray[i].setBConst(unionArray[i].getDConst()); break;
+
+        case EOpConvBoolToInt8:
+            newConstArray[i].setI8Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToUint8:
+            newConstArray[i].setU8Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToInt:
+            newConstArray[i].setIConst(unionArray[i].getBConst()); break;
+        case EOpConvBoolToUint:
+            newConstArray[i].setUConst(unionArray[i].getBConst()); break;
+        case EOpConvBoolToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getBConst()); break;
+        case EOpConvBoolToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getBConst()); break;
+        case EOpConvBoolToFloat:
+            newConstArray[i].setDConst(unionArray[i].getBConst()); break;
+        case EOpConvBoolToDouble:
+            newConstArray[i].setDConst(unionArray[i].getBConst()); break;
+
+        case EOpConvInt8ToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToInt:
+            newConstArray[i].setIConst(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToUint8:
+            newConstArray[i].setU8Const(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToUint:
+            newConstArray[i].setUConst(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getI8Const()); break;
+        case EOpConvUint8ToInt8:
+            newConstArray[i].setI8Const(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToInt:
+            newConstArray[i].setIConst(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToUint:
+            newConstArray[i].setUConst(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getU8Const()); break;
+        case EOpConvInt8ToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getI8Const()); break;
+        case EOpConvInt8ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getI8Const()); break;
+        case EOpConvUint8ToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getU8Const()); break;
+        case EOpConvUint8ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getU8Const()); break;
+
+        case EOpConvInt16ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getI16Const())); break;
+        case EOpConvInt16ToInt:
+            newConstArray[i].setIConst(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getI16Const())); break;
+        case EOpConvInt16ToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToUint:
+            newConstArray[i].setUConst(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getI16Const()); break;
+        case EOpConvUint16ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getU16Const())); break;
+        case EOpConvUint16ToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToInt:
+            newConstArray[i].setIConst(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getU16Const())); break;
+
+        case EOpConvUint16ToUint:
+            newConstArray[i].setUConst(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getU16Const()); break;
+        case EOpConvInt16ToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getI16Const()); break;
+        case EOpConvInt16ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getI16Const()); break;
+        case EOpConvUint16ToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getU16Const()); break;
+        case EOpConvUint16ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getU16Const()); break;
+
+        case EOpConvIntToInt8:
+            newConstArray[i].setI8Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToUint8:
+            newConstArray[i].setU8Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getIConst()); break;
+        case EOpConvIntToUint:
+            newConstArray[i].setUConst(unionArray[i].getIConst()); break;
+        case EOpConvIntToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getIConst()); break;
+
+        case EOpConvUintToInt8:
+            newConstArray[i].setI8Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToInt16:
+            newConstArray[i].setI16Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToInt:
+            newConstArray[i].setIConst(unionArray[i].getUConst()); break;
+        case EOpConvUintToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToUint8:
+            newConstArray[i].setU8Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToUint16:
+            newConstArray[i].setU16Const(unionArray[i].getUConst()); break;
+        case EOpConvUintToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getUConst()); break;
+        case EOpConvIntToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getIConst()); break;
+        case EOpConvIntToFloat:
+            newConstArray[i].setDConst(unionArray[i].getIConst()); break;
+        case EOpConvIntToDouble:
+            newConstArray[i].setDConst(unionArray[i].getIConst()); break;
+        case EOpConvUintToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getUConst()); break;
+        case EOpConvUintToFloat:
+            newConstArray[i].setDConst(unionArray[i].getUConst()); break;
+        case EOpConvUintToDouble:
+            newConstArray[i].setDConst(unionArray[i].getUConst()); break;
+        case EOpConvInt64ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToUint64:
+            newConstArray[i].setU64Const(unionArray[i].getI64Const()); break;
+        case EOpConvUint64ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToInt64:
+            newConstArray[i].setI64Const(unionArray[i].getU64Const()); break;
+        case EOpConvUint64ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getU64Const())); break;
+        case EOpConvInt64ToFloat16:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToFloat:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getI64Const())); break;
+        case EOpConvInt64ToDouble:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getI64Const())); break;
+        case EOpConvUint64ToFloat16:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToFloat:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getU64Const())); break;
+        case EOpConvUint64ToDouble:
+            newConstArray[i].setDConst(static_cast<double>(unionArray[i].getU64Const())); break;
+        case EOpConvFloat16ToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToInt64:
+            newConstArray[i].setI64Const(static_cast<int64_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToUint64:
+            newConstArray[i].setU64Const(static_cast<uint64_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloat16ToFloat:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvFloat16ToDouble:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvFloatToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToInt64:
+            newConstArray[i].setI64Const(static_cast<int64_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToUint64:
+            newConstArray[i].setU64Const(static_cast<uint64_t>(unionArray[i].getDConst())); break;
+        case EOpConvFloatToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvFloatToDouble:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvDoubleToInt8:
+            newConstArray[i].setI8Const(static_cast<int8_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToInt16:
+            newConstArray[i].setI16Const(static_cast<int16_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToInt:
+            newConstArray[i].setIConst(static_cast<int32_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToInt64:
+            newConstArray[i].setI64Const(static_cast<int64_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToUint8:
+            newConstArray[i].setU8Const(static_cast<uint8_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToUint16:
+            newConstArray[i].setU16Const(static_cast<uint16_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToUint:
+            newConstArray[i].setUConst(static_cast<uint32_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToUint64:
+            newConstArray[i].setU64Const(static_cast<uint64_t>(unionArray[i].getDConst())); break;
+        case EOpConvDoubleToFloat16:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+        case EOpConvDoubleToFloat:
+            newConstArray[i].setDConst(unionArray[i].getDConst()); break;
+
+
+
         // TODO: 3.0 Functionality: unary constant folding: the rest of the ops have to be fleshed out
 
         case EOpSinh:
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index a17ea1a..7118d06 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -5939,6 +5939,12 @@
                 "bool gl_HelperInvocation;"     // needs qualifier fixed later
                 );
 
+        if (version >= 450)
+            stageBuiltins[EShLangFragment].append( // GL_EXT_fragment_invocation_density
+                "flat in ivec2 gl_FragSizeEXT;"
+                "flat in int   gl_FragInvocationCountEXT;"
+                );
+
 #ifdef AMD_EXTENSIONS
         if (version >= 450)
             stageBuiltins[EShLangFragment].append(
@@ -5959,9 +5965,9 @@
                 );
         if (version >= 450)
             stageBuiltins[EShLangFragment].append(
-                "flat in ivec2 gl_FragmentSizeNV;"
+                "flat in ivec2 gl_FragmentSizeNV;"          // GL_NV_shading_rate_image
                 "flat in int   gl_InvocationsPerPixelNV;"
-                "in vec3 gl_BaryCoordNV;"
+                "in vec3 gl_BaryCoordNV;"                   // GL_NV_fragment_shader_barycentric
                 "in vec3 gl_BaryCoordNoPerspNV;"
                 );
 
@@ -6006,13 +6012,19 @@
         stageBuiltins[EShLangFragment].append(
             "highp float gl_FragDepthEXT;"       // GL_EXT_frag_depth
             );
+
+        if (version >= 310)
+            stageBuiltins[EShLangFragment].append( // GL_EXT_fragment_invocation_density
+                "flat in ivec2 gl_FragSizeEXT;"
+                "flat in int   gl_FragInvocationCountEXT;"
+            );
 #ifdef NV_EXTENSIONS
         if (version >= 320)
-            stageBuiltins[EShLangFragment].append(
+            stageBuiltins[EShLangFragment].append( // GL_NV_shading_rate_image
                 "flat in ivec2 gl_FragmentSizeNV;"
                 "flat in int   gl_InvocationsPerPixelNV;"
             );
-       if (version >= 320)
+        if (version >= 320)
             stageBuiltins[EShLangFragment].append(
                 "in vec3 gl_BaryCoordNV;"
                 "in vec3 gl_BaryCoordNoPerspNV;"
@@ -8342,6 +8354,14 @@
         }
 #endif
 
+        if ((profile != EEsProfile && version >= 450) ||
+            (profile == EEsProfile && version >= 310)) {
+            symbolTable.setVariableExtensions("gl_FragSizeEXT",            1, &E_GL_EXT_fragment_invocation_density);
+            symbolTable.setVariableExtensions("gl_FragInvocationCountEXT", 1, &E_GL_EXT_fragment_invocation_density);
+            BuiltInVariable("gl_FragSizeEXT",            EbvFragSizeEXT, symbolTable);
+            BuiltInVariable("gl_FragInvocationCountEXT", EbvFragInvocationCountEXT, symbolTable);
+        }
+
         symbolTable.setVariableExtensions("gl_FragDepthEXT", 1, &E_GL_EXT_frag_depth);
 
         if (profile == EEsProfile && version < 320) {
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
index 769dad0..46d4812 100644
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -489,7 +489,7 @@
 // This is 'mechanism' here, it does any conversion told.
 // It is about basic type, not about shape.
 // The policy comes from the shader or the calling code.
-TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped* node) const
+TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped* node) const
 {
     //
     // Add a new newNode for the conversion.
@@ -712,7 +712,11 @@
     TType newType(convertTo, EvqTemporary, node->getVectorSize(), node->getMatrixCols(), node->getMatrixRows());
     newNode = addUnaryNode(newOp, node, node->getLoc(), newType);
 
-    // TODO: it seems that some unary folding operations should occur here, but are not
+    if (node->getAsConstantUnion()) {
+        TIntermTyped* folded = node->getAsConstantUnion()->fold(newOp, newType);
+        if (folded)
+            return folded;
+    }
 
     // Propagate specialization-constant-ness, if allowed
     if (node->getType().getQualifier().isSpecConstant() && isSpecializationOperation(*newNode))
@@ -1021,7 +1025,7 @@
     //
     // Add a new newNode for the conversion.
     //
-    TIntermUnary* newNode = createConversion(promoteTo, node);
+    TIntermTyped* newNode = createConversion(promoteTo, node);
 
     return newNode;
 }
@@ -1119,9 +1123,12 @@
         rhsNode = addUniShapeConversion(op, lhsNode->getType(), rhsNode);
         return;
 
+    case EOpMul:
+        // matrix multiply does not change shapes
+        if (lhsNode->isMatrix() && rhsNode->isMatrix())
+            return;
     case EOpAdd:
     case EOpSub:
-    case EOpMul:
     case EOpDiv:
         // want to support vector * scalar native ops in AST and lower, not smear, similarly for
         // matrix * vector, etc.
@@ -1194,9 +1201,19 @@
     // The new node that handles the conversion
     TOperator constructorOp = mapTypeToConstructorOp(type);
 
-    // HLSL has custom semantics for scalar->mat shape conversions.
     if (source == EShSourceHlsl) {
-        if (node->getType().isScalarOrVec1() && type.isMatrix()) {
+        // HLSL rules for scalar, vector and matrix conversions:
+        // 1) scalar can become anything, initializing every component with its value
+        // 2) vector and matrix can become scalar, first element is used (warning: truncation)
+        // 3) matrix can become matrix with less rows and/or columns (warning: truncation)
+        // 4) vector can become vector with less rows size (warning: truncation)
+        // 5a) vector 4 can become 2x2 matrix (special case) (same packing layout, its a reinterpret)
+        // 5b) 2x2 matrix can become vector 4 (special case) (same packing layout, its a reinterpret)
+
+        const TType &sourceType = node->getType();
+
+        // rule 1 for scalar to matrix is special
+        if (sourceType.isScalarOrVec1() && type.isMatrix()) {
 
             // HLSL semantics: the scalar (or vec1) is replicated to every component of the matrix.  Left to its
             // own devices, the constructor from a scalar would populate the diagonal.  This forces replication
@@ -1204,7 +1221,7 @@
 
             // Note that if the node is complex (e.g, a function call), we don't want to duplicate it here
             // repeatedly, so we copy it to a temp, then use the temp.
-            const int matSize = type.getMatrixRows() * type.getMatrixCols();
+            const int matSize = type.computeNumComponents();
             TIntermAggregate* rhsAggregate = new TIntermAggregate();
 
             const bool isSimple = (node->getAsSymbolNode() != nullptr) || (node->getAsConstantUnion() != nullptr);
@@ -1212,12 +1229,44 @@
             if (!isSimple) {
                 assert(0); // TODO: use node replicator service when available.
             }
-            
-            for (int x=0; x<matSize; ++x)
+
+            for (int x = 0; x < matSize; ++x)
                 rhsAggregate->getSequence().push_back(node);
 
             return setAggregateOperator(rhsAggregate, constructorOp, type, node->getLoc());
         }
+
+        // rule 1 and 2
+        if ((sourceType.isScalar() && !type.isScalar()) || (!sourceType.isScalar() && type.isScalar()))
+            return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());
+
+        // rule 3 and 5b
+        if (sourceType.isMatrix()) {
+            // rule 3
+            if (type.isMatrix()) {
+                if ((sourceType.getMatrixCols() != type.getMatrixCols() || sourceType.getMatrixRows() != type.getMatrixRows()) &&
+                    sourceType.getMatrixCols() >= type.getMatrixCols() && sourceType.getMatrixRows() >= type.getMatrixRows())
+                    return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());
+            // rule 5b
+            } else if (type.isVector()) {
+                if (type.getVectorSize() == 4 && sourceType.getMatrixCols() == 2 && sourceType.getMatrixRows() == 2)
+                    return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());
+            }
+        }
+
+        // rule 4 and 5a
+        if (sourceType.isVector()) {
+            // rule 4
+            if (type.isVector())
+            {
+                if (sourceType.getVectorSize() > type.getVectorSize())
+                    return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());
+            // rule 5a
+            } else if (type.isMatrix()) {
+                if (sourceType.getVectorSize() == 4 && type.getMatrixCols() == 2 && type.getMatrixRows() == 2)
+                    return setAggregateOperator(makeAggregate(node), constructorOp, type, node->getLoc());
+            }
+        }
     }
 
     // scalar -> vector or vec1 -> vector or
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index ad1645d..67a861f 100755
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -1998,6 +1998,10 @@
     case EOpSubgroupClusteredAnd:
     case EOpSubgroupClusteredOr:
     case EOpSubgroupClusteredXor:
+        // The <clusterSize> as used in the subgroupClustered<op>() operations must be:
+        // - An integral constant expression.
+        // - At least 1.
+        // - A power of 2.
         if ((*argp)[1]->getAsConstantUnion() == nullptr)
             error(loc, "argument must be compile-time constant", "cluster size", "");
         else {
@@ -2009,6 +2013,12 @@
         }
         break;
 
+    case EOpSubgroupBroadcast:
+        // <id> must be an integral constant expression.
+        if ((*argp)[1]->getAsConstantUnion() == nullptr)
+            error(loc, "argument must be compile-time constant", "id", "");
+        break;
+
     case EOpBarrier:
     case EOpMemoryBarrier:
         if (argp->size() > 0) {
@@ -3872,6 +3882,8 @@
          identifier == "gl_BackSecondaryColor"                                                      ||
          identifier == "gl_SecondaryColor"                                                          ||
         (identifier == "gl_Color"               && language == EShLangFragment)                     ||
+        (identifier == "gl_FragStencilRefARB"   && (nonEsRedecls && version >= 140)
+                                                && language == EShLangFragment)                     ||
 #ifdef NV_EXTENSIONS
          identifier == "gl_SampleMask"                                                              ||
          identifier == "gl_Layer"                                                                   ||
@@ -3954,6 +3966,12 @@
                     error(loc, "all redeclarations must use the same depth layout on", "redeclaration", symbol->getName().c_str());
             }
         }
+        else if (identifier == "gl_FragStencilRefARB") {
+            if (qualifier.hasLayout())
+                error(loc, "cannot apply layout qualifier to", "redeclaration", symbol->getName().c_str());
+            if (qualifier.storage != EvqVaryingOut)
+                error(loc, "cannot change output storage qualification of", "redeclaration", symbol->getName().c_str());
+        }
 #ifdef NV_EXTENSIONS
         else if (identifier == "gl_SampleMask") {
             if (!publicType.layoutOverrideCoverage) {
@@ -4603,6 +4621,12 @@
         publicType.qualifier.layoutPacking = ElpStd430;
         return;
     }
+    if (id == TQualifier::getLayoutPackingString(ElpScalar)) {
+        requireVulkan(loc, "scalar");
+        requireExtensions(loc, 1, &E_GL_EXT_scalar_block_layout, "scalar block layout");
+        publicType.qualifier.layoutPacking = ElpScalar;
+        return;
+    }
     // TODO: compile-time performance: may need to stop doing linear searches
     for (TLayoutFormat format = (TLayoutFormat)(ElfNone + 1); format < ElfCount; format = (TLayoutFormat)(format + 1)) {
         if (id == TQualifier::getLayoutFormatString(format)) {
@@ -4928,11 +4952,13 @@
         } else if (id == "xfb_stride") {
             // "The resulting stride (implicit or explicit), when divided by 4, must be less than or equal to the
             // implementation-dependent constant gl_MaxTransformFeedbackInterleavedComponents."
-            if (value > 4 * resources.maxTransformFeedbackInterleavedComponents)
-                error(loc, "1/4 stride is too large:", id.c_str(), "gl_MaxTransformFeedbackInterleavedComponents is %d", resources.maxTransformFeedbackInterleavedComponents);
-            else if (value >= (int)TQualifier::layoutXfbStrideEnd)
+            if (value > 4 * resources.maxTransformFeedbackInterleavedComponents) {
+                error(loc, "1/4 stride is too large:", id.c_str(), "gl_MaxTransformFeedbackInterleavedComponents is %d",
+                    resources.maxTransformFeedbackInterleavedComponents);
+            }
+            if (value >= (int)TQualifier::layoutXfbStrideEnd)
                 error(loc, "stride is too large:", id.c_str(), "internal max is %d", TQualifier::layoutXfbStrideEnd-1);
-            if (value < (int)TQualifier::layoutXfbStrideEnd)
+            else
                 publicType.qualifier.layoutXfbStride = value;
             return;
         }
@@ -6776,8 +6802,10 @@
 
     // "The align qualifier can only be used on blocks or block members, and only for blocks declared with std140 or std430 layouts."
     if (currentBlockQualifier.hasAlign()) {
-        if (defaultQualification.layoutPacking != ElpStd140 && defaultQualification.layoutPacking != ElpStd430) {
-            error(loc, "can only be used with std140 or std430 layout packing", "align", "");
+        if (defaultQualification.layoutPacking != ElpStd140 &&
+            defaultQualification.layoutPacking != ElpStd430 &&
+            defaultQualification.layoutPacking != ElpScalar) {
+            error(loc, "can only be used with std140, std430, or scalar layout packing", "align", "");
             defaultQualification.layoutAlign = -1;
         }
     }
@@ -6826,8 +6854,10 @@
         // "The offset qualifier can only be used on block members of blocks declared with std140 or std430 layouts."
         // "The align qualifier can only be used on blocks or block members, and only for blocks declared with std140 or std430 layouts."
         if (memberQualifier.hasAlign() || memberQualifier.hasOffset()) {
-            if (defaultQualification.layoutPacking != ElpStd140 && defaultQualification.layoutPacking != ElpStd430)
-                error(memberLoc, "can only be used with std140 or std430 layout packing", "offset/align", "");
+            if (defaultQualification.layoutPacking != ElpStd140 &&
+                defaultQualification.layoutPacking != ElpStd430 &&
+                defaultQualification.layoutPacking != ElpScalar)
+                error(memberLoc, "can only be used with std140, std430, or scalar layout packing", "offset/align", "");
         }
 
 #ifdef NV_EXTENSIONS
@@ -6948,7 +6978,7 @@
         profileRequires(loc, EEsProfile, 300, nullptr, "uniform block");
         profileRequires(loc, ENoProfile, 140, nullptr, "uniform block");
         if (currentBlockQualifier.layoutPacking == ElpStd430 && ! currentBlockQualifier.layoutPushConstant)
-            error(loc, "requires the 'buffer' storage qualifier", "std430", "");
+            requireExtensions(loc, 1, &E_GL_EXT_scalar_block_layout, "std430 requires the buffer storage qualifier");
         break;
     case EvqBuffer:
         requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, "buffer block");
@@ -7147,7 +7177,7 @@
 {
     if (!qualifier.isUniformOrBuffer() && !qualifier.isTaskMemory())
         return;
-    if (qualifier.layoutPacking != ElpStd140 && qualifier.layoutPacking != ElpStd430)
+    if (qualifier.layoutPacking != ElpStd140 && qualifier.layoutPacking != ElpStd430 && qualifier.layoutPacking != ElpScalar)
         return;
 
     int offset = 0;
@@ -7161,8 +7191,8 @@
         // modify just the children's view of matrix layout, if there is one for this member
         TLayoutMatrix subMatrixLayout = typeList[member].type->getQualifier().layoutMatrix;
         int dummyStride;
-        int memberAlignment = intermediate.getBaseAlignment(*typeList[member].type, memberSize, dummyStride, qualifier.layoutPacking == ElpStd140,
-                                                            subMatrixLayout != ElmNone ? subMatrixLayout == ElmRowMajor : qualifier.layoutMatrix == ElmRowMajor);
+        int memberAlignment = intermediate.getMemberAlignment(*typeList[member].type, memberSize, dummyStride, qualifier.layoutPacking,
+                                                              subMatrixLayout != ElmNone ? subMatrixLayout == ElmRowMajor : qualifier.layoutMatrix == ElmRowMajor);
         if (memberQualifier.hasOffset()) {
             // "The specified offset must be a multiple
             // of the base alignment of the type of the block member it qualifies, or a compile-time error results."
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index 66fa3e2..16265a3 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -204,6 +204,8 @@
     extensionBehavior[E_GL_EXT_control_flow_attributes]                 = EBhDisable;
     extensionBehavior[E_GL_EXT_nonuniform_qualifier]                    = EBhDisable;
     extensionBehavior[E_GL_EXT_samplerless_texture_functions]           = EBhDisable;
+    extensionBehavior[E_GL_EXT_scalar_block_layout]                     = EBhDisable;
+    extensionBehavior[E_GL_EXT_fragment_invocation_density]             = EBhDisable;
 
     extensionBehavior[E_GL_EXT_shader_16bit_storage]                    = EBhDisable;
     extensionBehavior[E_GL_EXT_shader_8bit_storage]                     = EBhDisable;
@@ -378,6 +380,8 @@
             "#define GL_EXT_shader_16bit_storage 1\n"
             "#define GL_EXT_shader_8bit_storage 1\n"
             "#define GL_EXT_samplerless_texture_functions 1\n"
+            "#define GL_EXT_scalar_block_layout 1\n"
+            "#define GL_EXT_fragment_invocation_density 1\n"
 
             // GL_KHR_shader_subgroup
             "#define GL_KHR_shader_subgroup_basic 1\n"
diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h
index 85c93c0..6b513b4 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -166,6 +166,8 @@
 const char* const E_GL_EXT_control_flow_attributes          = "GL_EXT_control_flow_attributes";
 const char* const E_GL_EXT_nonuniform_qualifier             = "GL_EXT_nonuniform_qualifier";
 const char* const E_GL_EXT_samplerless_texture_functions    = "GL_EXT_samplerless_texture_functions";
+const char* const E_GL_EXT_scalar_block_layout              = "GL_EXT_scalar_block_layout";
+const char* const E_GL_EXT_fragment_invocation_density      = "GL_EXT_fragment_invocation_density";
 
 // Arrays of extensions for the above viewportEXTs duplications
 
diff --git a/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
index 8630128..82e7c6e 100644
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -1372,10 +1372,11 @@
 // stride comes from the flattening down to vectors.
 //
 // Return value is the alignment of the type.
-int TIntermediate::getBaseAlignment(const TType& type, int& size, int& stride, bool std140, bool rowMajor)
+int TIntermediate::getBaseAlignment(const TType& type, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor)
 {
     int alignment;
 
+    bool std140 = layoutPacking == glslang::ElpStd140;
     // When using the std140 storage layout, structures will be laid out in buffer
     // storage with its members stored in monotonically increasing order based on their
     // location in the declaration. A structure and each structure member have a base
@@ -1439,7 +1440,7 @@
     if (type.isArray()) {
         // TODO: perf: this might be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
         TType derefType(type, 0);
-        alignment = getBaseAlignment(derefType, size, dummyStride, std140, rowMajor);
+        alignment = getBaseAlignment(derefType, size, dummyStride, layoutPacking, rowMajor);
         if (std140)
             alignment = std::max(baseAlignmentVec4Std140, alignment);
         RoundToPow2(size, alignment);
@@ -1459,7 +1460,7 @@
             int memberSize;
             // modify just the children's view of matrix layout, if there is one for this member
             TLayoutMatrix subMatrixLayout = memberList[m].type->getQualifier().layoutMatrix;
-            int memberAlignment = getBaseAlignment(*memberList[m].type, memberSize, dummyStride, std140,
+            int memberAlignment = getBaseAlignment(*memberList[m].type, memberSize, dummyStride, layoutPacking,
                                                    (subMatrixLayout != ElmNone) ? (subMatrixLayout == ElmRowMajor) : rowMajor);
             maxAlignment = std::max(maxAlignment, memberAlignment);
             RoundToPow2(size, memberAlignment);
@@ -1498,7 +1499,7 @@
         // rule 5: deref to row, not to column, meaning the size of vector is num columns instead of num rows
         TType derefType(type, 0, rowMajor);
 
-        alignment = getBaseAlignment(derefType, size, dummyStride, std140, rowMajor);
+        alignment = getBaseAlignment(derefType, size, dummyStride, layoutPacking, rowMajor);
         if (std140)
             alignment = std::max(baseAlignmentVec4Std140, alignment);
         RoundToPow2(size, alignment);
@@ -1526,4 +1527,79 @@
                       : offset % 16 != 0;
 }
 
+int TIntermediate::getScalarAlignment(const TType& type, int& size, int& stride, bool rowMajor)
+{
+    int alignment;
+
+    stride = 0;
+    int dummyStride;
+
+    if (type.isArray()) {
+        TType derefType(type, 0);
+        alignment = getScalarAlignment(derefType, size, dummyStride, rowMajor);
+
+        stride = size;
+        RoundToPow2(stride, alignment);
+
+        size = stride * (type.getOuterArraySize() - 1) + size;
+        return alignment;
+    }
+
+    if (type.getBasicType() == EbtStruct) {
+        const TTypeList& memberList = *type.getStruct();
+
+        size = 0;
+        int maxAlignment = 0;
+        for (size_t m = 0; m < memberList.size(); ++m) {
+            int memberSize;
+            // modify just the children's view of matrix layout, if there is one for this member
+            TLayoutMatrix subMatrixLayout = memberList[m].type->getQualifier().layoutMatrix;
+            int memberAlignment = getScalarAlignment(*memberList[m].type, memberSize, dummyStride,
+                                                     (subMatrixLayout != ElmNone) ? (subMatrixLayout == ElmRowMajor) : rowMajor);
+            maxAlignment = std::max(maxAlignment, memberAlignment);
+            RoundToPow2(size, memberAlignment);
+            size += memberSize;
+        }
+
+        return maxAlignment;
+    }
+
+    if (type.isScalar())
+        return getBaseAlignmentScalar(type, size);
+
+    if (type.isVector()) {
+        int scalarAlign = getBaseAlignmentScalar(type, size);
+        
+        size *= type.getVectorSize();
+        return scalarAlign;
+    }
+
+    if (type.isMatrix()) {
+        TType derefType(type, 0, rowMajor);
+
+        alignment = getScalarAlignment(derefType, size, dummyStride, rowMajor);
+
+        stride = size;  // use intra-matrix stride for stride of a just a matrix
+        if (rowMajor)
+            size = stride * type.getMatrixRows();
+        else
+            size = stride * type.getMatrixCols();
+
+        return alignment;
+    }
+
+    assert(0);  // all cases should be covered above
+    size = 1;
+    return 1;    
+}
+
+int TIntermediate::getMemberAlignment(const TType& type, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor)
+{
+    if (layoutPacking == glslang::ElpScalar) {
+        return getScalarAlignment(type, size, stride, rowMajor);
+    } else {
+        return getBaseAlignment(type, size, stride, layoutPacking, rowMajor);
+    }
+}
+
 } // end namespace glslang
diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h
index 99f777f..ff28c0e 100755
--- a/glslang/MachineIndependent/localintermediate.h
+++ b/glslang/MachineIndependent/localintermediate.h
@@ -634,7 +634,9 @@
     int addXfbBufferOffset(const TType&);
     unsigned int computeTypeXfbSize(const TType&, bool& containsDouble) const;
     static int getBaseAlignmentScalar(const TType&, int& size);
-    static int getBaseAlignment(const TType&, int& size, int& stride, bool std140, bool rowMajor);
+    static int getBaseAlignment(const TType&, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor);
+    static int getScalarAlignment(const TType&, int& size, int& stride, bool rowMajor);
+    static int getMemberAlignment(const TType&, int& size, int& stride, TLayoutPacking layoutPacking, bool rowMajor);
     static bool improperStraddle(const TType& type, int size, int offset);
     bool promote(TIntermOperator*);
 
@@ -730,7 +732,7 @@
     bool specConstantPropagates(const TIntermTyped&, const TIntermTyped&);
     void performTextureUpgradeAndSamplerRemovalTransformation(TIntermNode* root);
     bool isConversionAllowed(TOperator op, TIntermTyped* node) const;
-    TIntermUnary* createConversion(TBasicType convertTo, TIntermTyped* node) const;
+    TIntermTyped* createConversion(TBasicType convertTo, TIntermTyped* node) const;
     std::tuple<TBasicType, TBasicType> getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const;
     bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();}
     static const char* getResourceName(TResourceType);
diff --git a/glslang/MachineIndependent/reflection.cpp b/glslang/MachineIndependent/reflection.cpp
index 5d59f28..8cfc2ac 100644
--- a/glslang/MachineIndependent/reflection.cpp
+++ b/glslang/MachineIndependent/reflection.cpp
@@ -131,11 +131,11 @@
         for (int m = 0; m <= index; ++m) {
             // modify just the children's view of matrix layout, if there is one for this member
             TLayoutMatrix subMatrixLayout = memberList[m].type->getQualifier().layoutMatrix;
-            int memberAlignment = intermediate.getBaseAlignment(*memberList[m].type, memberSize, dummyStride,
-                                                                type.getQualifier().layoutPacking == ElpStd140,
-                                                                subMatrixLayout != ElmNone
-                                                                    ? subMatrixLayout == ElmRowMajor
-                                                                    : type.getQualifier().layoutMatrix == ElmRowMajor);
+            int memberAlignment = intermediate.getMemberAlignment(*memberList[m].type, memberSize, dummyStride,
+                                                                  type.getQualifier().layoutPacking,
+                                                                  subMatrixLayout != ElmNone
+                                                                      ? subMatrixLayout == ElmRowMajor
+                                                                      : type.getQualifier().layoutMatrix == ElmRowMajor);
             RoundToPow2(offset, memberAlignment);
             if (m < index)
                 offset += memberSize;
@@ -154,9 +154,9 @@
 
         int lastMemberSize;
         int dummyStride;
-        intermediate.getBaseAlignment(*memberList[lastIndex].type, lastMemberSize, dummyStride,
-                                      blockType.getQualifier().layoutPacking == ElpStd140,
-                                      blockType.getQualifier().layoutMatrix == ElmRowMajor);
+        intermediate.getMemberAlignment(*memberList[lastIndex].type, lastMemberSize, dummyStride,
+                                        blockType.getQualifier().layoutPacking,
+                                        blockType.getQualifier().layoutMatrix == ElmRowMajor);
 
         return lastOffset + lastMemberSize;
     }
diff --git a/glslang/Public/ShaderLang.h b/glslang/Public/ShaderLang.h
index 0708829..c5eca4e 100755
--- a/glslang/Public/ShaderLang.h
+++ b/glslang/Public/ShaderLang.h
@@ -70,7 +70,7 @@
 // This should always increase, as some paths to do not consume
 // a more major number.
 // It should increment by one when new functionality is added.
-#define GLSLANG_MINOR_VERSION 10
+#define GLSLANG_MINOR_VERSION 11
 
 //
 // Call before doing any other compiler/linker operations.
diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp
index b89fc51..00bb433 100644
--- a/gtests/AST.FromFile.cpp
+++ b/gtests/AST.FromFile.cpp
@@ -231,6 +231,7 @@
         "precise_struct_block.vert",
         "maxClipDistances.vert",
         "findFunction.frag",
+        "constantUnaryConversion.comp"
     })),
     FileNameAsCustomTestSuffix
 );
diff --git a/gtests/Hlsl.FromFile.cpp b/gtests/Hlsl.FromFile.cpp
index 635c7a8..809e525 100644
--- a/gtests/Hlsl.FromFile.cpp
+++ b/gtests/Hlsl.FromFile.cpp
@@ -382,7 +382,8 @@
         {"hlsl.typeGraphCopy.vert", "main"},
         {"hlsl.typedef.frag", "PixelShaderFunction"},
         {"hlsl.whileLoop.frag", "PixelShaderFunction"},
-        {"hlsl.void.frag", "PixelShaderFunction"}
+        {"hlsl.void.frag", "PixelShaderFunction"},
+        {"hlsl.type.type.conversion.all.frag", "main"}
     }),
     FileNameAsCustomTestSuffix
 );
@@ -399,6 +400,8 @@
         {"hlsl.wavequery.frag", "PixelShaderFunction"},
         {"hlsl.wavereduction.comp", "CSMain"},
         {"hlsl.wavevote.comp", "CSMain"},
+        { "hlsl.type.type.conversion.valid.frag", "main" },
+        {"hlsl.int.dot.frag", "main"}
     }),
     FileNameAsCustomTestSuffix
 );
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
old mode 100644
new mode 100755
index ee8cf00..66780f7
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -271,6 +271,10 @@
         "spv.flowControl.frag",
         "spv.forLoop.frag",
         "spv.forwardFun.frag",
+        "spv.fragmentDensity.frag",
+        "spv.fragmentDensity.vert",
+        "spv.fragmentDensity-es.frag",
+        "spv.fragmentDensity-neg.frag",
         "spv.fullyCovered.frag",
         "spv.functionCall.frag",
         "spv.functionNestedOpaque.vert",
@@ -309,6 +313,8 @@
         "spv.sampleId.frag",
         "spv.samplePosition.frag",
         "spv.sampleMaskOverrideCoverage.frag",
+        "spv.scalarlayout.frag",
+        "spv.scalarlayoutfloat16.frag",
         "spv.shaderBallot.comp",
         "spv.shaderDrawParams.vert",
         "spv.shaderGroupVote.comp",
@@ -386,6 +392,7 @@
         "spv.subgroupArithmetic.comp",
         "spv.subgroupBasic.comp",
         "spv.subgroupBallot.comp",
+        "spv.subgroupBallotNeg.comp",
         "spv.subgroupClustered.comp",
         "spv.subgroupClusteredNeg.comp",
         "spv.subgroupPartitioned.comp",
diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp
index ac29432..b536cc9 100755
--- a/hlsl/hlslParseHelper.cpp
+++ b/hlsl/hlslParseHelper.cpp
@@ -3477,8 +3477,8 @@
             if (argStride != nullptr) {
                 int size;
                 int stride;
-                intermediate.getBaseAlignment(argArray->getType(), size, stride, false,
-                                              argArray->getType().getQualifier().layoutMatrix == ElmRowMajor);
+                intermediate.getMemberAlignment(argArray->getType(), size, stride, argArray->getType().getQualifier().layoutPacking,
+                                                argArray->getType().getQualifier().layoutMatrix == ElmRowMajor);
 
                 TIntermTyped* assign = intermediate.addAssign(EOpAssign, argStride,
                                                               intermediate.addConstantUnion(stride, loc, true), loc);
@@ -6066,13 +6066,22 @@
         }
     }
 
-    // TODO: learn what all these really mean and how they interact with regNumber and subComponent
+    // more information about register types see
+    // https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-variable-register
     const std::vector<std::string>& resourceInfo = intermediate.getResourceSetBinding();
     switch (std::tolower(desc[0])) {
-    case 'b':
-    case 't':
     case 'c':
+        // c register is the register slot in the global const buffer
+        // each slot is a vector of 4 32 bit components
+        qualifier.layoutOffset = regNumber * 4 * 4;
+        break;
+        // const buffer register slot
+    case 'b':
+        // textrues and structured buffers
+    case 't':
+        // samplers
     case 's':
+        // uav resources
     case 'u':
         // if nothing else has set the binding, do so now
         // (other mechanisms override this one)
@@ -8679,7 +8688,7 @@
 {
     if (! qualifier.isUniformOrBuffer())
         return;
-    if (qualifier.layoutPacking != ElpStd140 && qualifier.layoutPacking != ElpStd430)
+    if (qualifier.layoutPacking != ElpStd140 && qualifier.layoutPacking != ElpStd430 && qualifier.layoutPacking != ElpScalar)
         return;
 
     int offset = 0;
@@ -8693,11 +8702,11 @@
         // modify just the children's view of matrix layout, if there is one for this member
         TLayoutMatrix subMatrixLayout = typeList[member].type->getQualifier().layoutMatrix;
         int dummyStride;
-        int memberAlignment = intermediate.getBaseAlignment(*typeList[member].type, memberSize, dummyStride,
-                                                            qualifier.layoutPacking == ElpStd140,
-                                                            subMatrixLayout != ElmNone
-                                                                ? subMatrixLayout == ElmRowMajor
-                                                                : qualifier.layoutMatrix == ElmRowMajor);
+        int memberAlignment = intermediate.getMemberAlignment(*typeList[member].type, memberSize, dummyStride,
+                                                              qualifier.layoutPacking,
+                                                              subMatrixLayout != ElmNone
+                                                                  ? subMatrixLayout == ElmRowMajor
+                                                                  : qualifier.layoutMatrix == ElmRowMajor);
         if (memberQualifier.hasOffset()) {
             // "The specified offset must be a multiple
             // of the base alignment of the type of the block member it qualifies, or a compile-time error results."
diff --git a/known_good.json b/known_good.json
index 28aafdc..837255d 100755
--- a/known_good.json
+++ b/known_good.json
@@ -5,14 +5,14 @@
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Tools",
       "subdir" : "External/spirv-tools",
-      "commit" : "9d699f6d4038f432c55310d5d0b4a6d507c1b686"
+      "commit" : "d543f7dfed9ba02910996121375e57fff92c3c93"
     },
     {
       "name" : "spirv-tools/external/spirv-headers",
       "site" : "github",
       "subrepo" : "KhronosGroup/SPIRV-Headers",
       "subdir" : "External/spirv-tools/external/spirv-headers",
-      "commit" : "a2c529b5dda18838ab4b52f816acfebd774eaab3"
+      "commit" : "282879ca34563020dbe73fd8f7d45bed6755626a"
     }
   ]
 }