Browse Source

Updated glslang.

Branimir Karadžić 8 years ago
parent
commit
ed4c70631b
65 changed files with 3008 additions and 1186 deletions
  1. 12 5
      3rdparty/glslang/SPIRV/GLSL.ext.KHR.h
  2. 0 29
      3rdparty/glslang/SPIRV/GLSL.ext.NV.h
  3. 16 3
      3rdparty/glslang/SPIRV/GlslangToSpv.cpp
  4. 19 14
      3rdparty/glslang/SPIRV/doc.cpp
  5. 29 7
      3rdparty/glslang/SPIRV/spirv.hpp
  6. 3 1
      3rdparty/glslang/Test/120.frag
  7. 1 0
      3rdparty/glslang/Test/badChars.frag
  8. 4 1
      3rdparty/glslang/Test/baseResults/120.frag.out
  9. 2 1
      3rdparty/glslang/Test/baseResults/420.vert.out
  10. 4 3
      3rdparty/glslang/Test/baseResults/430.vert.out
  11. 7 6
      3rdparty/glslang/Test/baseResults/440.frag.out
  12. 2 1
      3rdparty/glslang/Test/baseResults/badChars.frag.out
  13. 353 118
      3rdparty/glslang/Test/baseResults/hlsl.intrinsics.f1632.frag.out
  14. 401 0
      3rdparty/glslang/Test/baseResults/hlsl.intrinsics.f3216.frag.out
  15. 181 37
      3rdparty/glslang/Test/baseResults/hlsl.intrinsics.negative.frag.out
  16. 92 39
      3rdparty/glslang/Test/baseResults/hlsl.numericsuffixes.frag.out
  17. 308 282
      3rdparty/glslang/Test/baseResults/hlsl.struct.frag.out
  18. 84 0
      3rdparty/glslang/Test/baseResults/hlsl.structStructName.frag.out
  19. 81 81
      3rdparty/glslang/Test/baseResults/hlsl.structbuffer.atomics.frag.out
  20. 63 63
      3rdparty/glslang/Test/baseResults/hlsl.structbuffer.byte.frag.out
  21. 45 45
      3rdparty/glslang/Test/baseResults/hlsl.structbuffer.coherent.frag.out
  22. 266 0
      3rdparty/glslang/Test/baseResults/hlsl.structbuffer.fn.frag.out
  23. 46 46
      3rdparty/glslang/Test/baseResults/hlsl.structbuffer.frag.out
  24. 45 45
      3rdparty/glslang/Test/baseResults/hlsl.structbuffer.rw.frag.out
  25. 191 191
      3rdparty/glslang/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out
  26. 49 15
      3rdparty/glslang/Test/baseResults/spv.Operations.frag.out
  27. 38 0
      3rdparty/glslang/Test/baseResults/spv.deviceGroup.frag.out
  28. 59 0
      3rdparty/glslang/Test/baseResults/spv.drawParams.vert.out
  29. 38 0
      3rdparty/glslang/Test/baseResults/spv.multiView.frag.out
  30. 3 3
      3rdparty/glslang/Test/baseResults/spv.specConstant.vert.out
  31. 14 14
      3rdparty/glslang/Test/baseResults/spv.ssbo.autoassign.frag.out
  32. 4 1
      3rdparty/glslang/Test/baseResults/tokenPaste.vert.out
  33. 14 19
      3rdparty/glslang/Test/hlsl.intrinsics.f1632.frag
  34. 29 0
      3rdparty/glslang/Test/hlsl.intrinsics.f3216.frag
  35. 4 0
      3rdparty/glslang/Test/hlsl.numericsuffixes.frag
  36. 12 2
      3rdparty/glslang/Test/hlsl.struct.frag
  37. 7 0
      3rdparty/glslang/Test/hlsl.structStructName.frag
  38. 23 0
      3rdparty/glslang/Test/hlsl.structbuffer.fn.frag
  39. 3 0
      3rdparty/glslang/Test/spv.Operations.frag
  40. 9 0
      3rdparty/glslang/Test/spv.deviceGroup.frag
  41. 13 0
      3rdparty/glslang/Test/spv.drawParams.vert
  42. 9 0
      3rdparty/glslang/Test/spv.multiView.frag
  43. 3 0
      3rdparty/glslang/Test/tokenPaste.vert
  44. 4 0
      3rdparty/glslang/glslang/Include/BaseTypes.h
  45. 2 0
      3rdparty/glslang/glslang/Include/Types.h
  46. 2 2
      3rdparty/glslang/glslang/Include/revision.h
  47. 15 0
      3rdparty/glslang/glslang/MachineIndependent/Initialize.cpp
  48. 7 5
      3rdparty/glslang/glslang/MachineIndependent/ParseHelper.cpp
  49. 5 1
      3rdparty/glslang/glslang/MachineIndependent/SymbolTable.cpp
  50. 5 1
      3rdparty/glslang/glslang/MachineIndependent/Versions.cpp
  51. 4 0
      3rdparty/glslang/glslang/MachineIndependent/Versions.h
  52. 3 1
      3rdparty/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp
  53. 1 1
      3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpContext.h
  54. 36 16
      3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp
  55. 3 3
      3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp
  56. 0 2
      3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h
  57. 0 8
      3rdparty/glslang/glslang/Public/ShaderLang.h
  58. 4 1
      3rdparty/glslang/gtests/Hlsl.FromFile.cpp
  59. 7 2
      3rdparty/glslang/gtests/Spv.FromFile.cpp
  60. 53 49
      3rdparty/glslang/hlsl/hlslGrammar.cpp
  61. 1 1
      3rdparty/glslang/hlsl/hlslGrammar.h
  62. 252 20
      3rdparty/glslang/hlsl/hlslParseHelper.cpp
  63. 15 0
      3rdparty/glslang/hlsl/hlslParseHelper.h
  64. 2 1
      3rdparty/glslang/hlsl/hlslScanContext.cpp
  65. 1 0
      3rdparty/glslang/hlsl/hlslTokens.h

+ 12 - 5
3rdparty/glslang/SPIRV/GLSL.ext.KHR.h

@@ -27,10 +27,17 @@
 #ifndef GLSLextKHR_H
 #ifndef GLSLextKHR_H
 #define GLSLextKHR_H
 #define GLSLextKHR_H
 
 
-// SPV_KHR_shader_ballot
-static const char* const E_SPV_KHR_shader_ballot                = "SPV_KHR_shader_ballot";
+enum BuiltIn;
+enum Op;
+enum Capability;
+
+static const int GLSLextKHRVersion = 100;
+static const int GLSLextKHRRevision = 1;
+
+static const char* const E_SPV_KHR_shader_ballot          = "SPV_KHR_shader_ballot";
+static const char* const E_SPV_KHR_subgroup_vote          = "SPV_KHR_subgroup_vote";
+static const char* const E_SPV_KHR_device_group           = "SPV_KHR_device_group";
+static const char* const E_SPV_KHR_multiview              = "SPV_KHR_multiview";
+static const char* const E_SPV_KHR_shader_draw_parameters = "SPV_KHR_shader_draw_parameters";
 
 
-// SPV_KHR_shader_draw_parameters
-static const char* const E_SPV_KHR_shader_draw_parameters       = "SPV_KHR_shader_draw_parameters";
-static const char* const E_SPV_KHR_subgroup_vote                = "SPV_KHR_subgroup_vote";
 #endif  // #ifndef GLSLextKHR_H
 #endif  // #ifndef GLSLextKHR_H

+ 0 - 29
3rdparty/glslang/SPIRV/GLSL.ext.NV.h

@@ -38,46 +38,17 @@ static const int GLSLextNVRevision = 5;
 //SPV_NV_sample_mask_override_coverage
 //SPV_NV_sample_mask_override_coverage
 const char* const E_SPV_NV_sample_mask_override_coverage = "SPV_NV_sample_mask_override_coverage";
 const char* const E_SPV_NV_sample_mask_override_coverage = "SPV_NV_sample_mask_override_coverage";
 
 
-static const Decoration DecorationOverrideCoverageNV = static_cast<Decoration>(5248);
-
-
 //SPV_NV_geometry_shader_passthrough
 //SPV_NV_geometry_shader_passthrough
 const char* const E_SPV_NV_geometry_shader_passthrough = "SPV_NV_geometry_shader_passthrough";
 const char* const E_SPV_NV_geometry_shader_passthrough = "SPV_NV_geometry_shader_passthrough";
 
 
-static const Decoration DecorationPassthroughNV = static_cast<Decoration>(5250);
-
-static const Capability CapabilityGeometryShaderPassthroughNV = static_cast<Capability>(5251);
-
-
 //SPV_NV_viewport_array2
 //SPV_NV_viewport_array2
 const char* const E_SPV_NV_viewport_array2 = "SPV_NV_viewport_array2";
 const char* const E_SPV_NV_viewport_array2 = "SPV_NV_viewport_array2";
 const char* const E_ARB_shader_viewport_layer_array = "SPV_ARB_shader_viewport_layer_array";
 const char* const E_ARB_shader_viewport_layer_array = "SPV_ARB_shader_viewport_layer_array";
 
 
-static const Decoration DecorationViewportRelativeNV = static_cast<Decoration>(5252);
-
-static const BuiltIn BuiltInViewportMaskNV = static_cast<BuiltIn>(5253);
-
-static const Capability CapabilityShaderViewportIndexLayerNV = static_cast<Capability>(5254);
-static const Capability CapabilityShaderViewportMaskNV       = static_cast<Capability>(5255);
-
-
 //SPV_NV_stereo_view_rendering
 //SPV_NV_stereo_view_rendering
 const char* const E_SPV_NV_stereo_view_rendering = "SPV_NV_stereo_view_rendering";
 const char* const E_SPV_NV_stereo_view_rendering = "SPV_NV_stereo_view_rendering";
 
 
-static const Decoration DecorationSecondaryViewportRelativeNV = static_cast<Decoration>(5256);
-
-static const BuiltIn BuiltInSecondaryPositionNV = static_cast<BuiltIn>(5257);
-static const BuiltIn BuiltInSecondaryViewportMaskNV = static_cast<BuiltIn>(5258);
-
-static const Capability CapabilityShaderStereoViewNV = static_cast<Capability>(5259);
-
-
 //SPV_NVX_multiview_per_view_attributes
 //SPV_NVX_multiview_per_view_attributes
 const char* const E_SPV_NVX_multiview_per_view_attributes = "SPV_NVX_multiview_per_view_attributes";
 const char* const E_SPV_NVX_multiview_per_view_attributes = "SPV_NVX_multiview_per_view_attributes";
 
 
-static const BuiltIn BuiltInPositionPerViewNV = static_cast<BuiltIn>(5260);
-static const BuiltIn BuiltInViewportMaskPerViewNV = static_cast<BuiltIn>(5261);
-
-static const Capability CapabilityPerViewAttributesNV = static_cast<Capability>(5262);
-
 #endif  // #ifndef GLSLextNV_H
 #endif  // #ifndef GLSLextNV_H

+ 16 - 3
3rdparty/glslang/SPIRV/GlslangToSpv.cpp

@@ -628,6 +628,16 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI
         return spv::BuiltInBaryCoordPullModelAMD;
         return spv::BuiltInBaryCoordPullModelAMD;
 #endif
 #endif
 
 
+    case glslang::EbvDeviceIndex:
+        builder.addExtension(spv::E_SPV_KHR_device_group);
+        builder.addCapability(spv::CapabilityDeviceGroup);
+        return spv::BuiltInDeviceIndex;
+
+    case glslang::EbvViewIndex:
+        builder.addExtension(spv::E_SPV_KHR_multiview);
+        builder.addCapability(spv::CapabilityMultiView);
+        return spv::BuiltInViewIndex;
+
 #ifdef NV_EXTENSIONS
 #ifdef NV_EXTENSIONS
     case glslang::EbvViewportMaskNV:
     case glslang::EbvViewportMaskNV:
         builder.addExtension(spv::E_SPV_NV_viewport_array2);
         builder.addExtension(spv::E_SPV_NV_viewport_array2);
@@ -1779,7 +1789,8 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang
     // Crucially, side effects must be avoided, and there are performance trade-offs.
     // Crucially, side effects must be avoided, and there are performance trade-offs.
     // Return true if good idea (and safe) for OpSelect, false otherwise.
     // Return true if good idea (and safe) for OpSelect, false otherwise.
     const auto selectPolicy = [&]() -> bool {
     const auto selectPolicy = [&]() -> bool {
-        if (node->getBasicType() == glslang::EbtVoid)
+        if ((!node->getType().isScalar() && !node->getType().isVector()) ||
+            node->getBasicType() == glslang::EbtVoid)
             return false;
             return false;
 
 
         if (node->getTrueBlock()  == nullptr ||
         if (node->getTrueBlock()  == nullptr ||
@@ -2730,7 +2741,8 @@ void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslF
         for (int p = 0; p < (int)parameters.size(); ++p) {
         for (int p = 0; p < (int)parameters.size(); ++p) {
             const glslang::TType& paramType = parameters[p]->getAsTyped()->getType();
             const glslang::TType& paramType = parameters[p]->getAsTyped()->getType();
             spv::Id typeId = convertGlslangToSpvType(paramType);
             spv::Id typeId = convertGlslangToSpvType(paramType);
-            if (paramType.containsOpaque())
+            if (paramType.containsOpaque() ||
+                (paramType.getBasicType() == glslang::EbtBlock && paramType.getQualifier().storage == glslang::EvqBuffer))
                 typeId = builder.makePointer(TranslateStorageClass(paramType), typeId);
                 typeId = builder.makePointer(TranslateStorageClass(paramType), typeId);
             else if (paramType.getQualifier().storage != glslang::EvqConstReadOnly)
             else if (paramType.getQualifier().storage != glslang::EvqConstReadOnly)
                 typeId = builder.makePointer(spv::StorageClassFunction, typeId);
                 typeId = builder.makePointer(spv::StorageClassFunction, typeId);
@@ -3210,7 +3222,8 @@ spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAgg
     for (int a = 0; a < (int)glslangArgs.size(); ++a) {
     for (int a = 0; a < (int)glslangArgs.size(); ++a) {
         const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType();
         const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType();
         spv::Id arg;
         spv::Id arg;
-        if (paramType.containsOpaque()) {
+        if (paramType.containsOpaque() ||
+            (paramType.getBasicType() == glslang::EbtBlock && qualifiers[a] == glslang::EvqBuffer)) {
             builder.setAccessChain(lValues[lValueCount]);
             builder.setAccessChain(lValues[lValueCount]);
             arg = builder.accessChainGetLValue();
             arg = builder.accessChainGetLValue();
             ++lValueCount;
             ++lValueCount;

+ 19 - 14
3rdparty/glslang/SPIRV/doc.cpp

@@ -48,6 +48,7 @@
 namespace spv {
 namespace spv {
     extern "C" {
     extern "C" {
         // Include C-based headers that don't have a namespace
         // Include C-based headers that don't have a namespace
+        #include "GLSL.ext.KHR.h"
 #ifdef AMD_EXTENSIONS
 #ifdef AMD_EXTENSIONS
         #include "GLSL.ext.AMD.h"
         #include "GLSL.ext.AMD.h"
 #endif
 #endif
@@ -318,15 +319,13 @@ const char* BuiltInString(int builtIn)
     case 42: return "VertexIndex";                 // TBD: put next to VertexId?
     case 42: return "VertexIndex";                 // TBD: put next to VertexId?
     case 43: return "InstanceIndex";               // TBD: put next to InstanceId?
     case 43: return "InstanceIndex";               // TBD: put next to InstanceId?
 
 
-    case BuiltInCeiling:
-    default: return "Bad";
-
     case 4416: return "SubgroupEqMaskKHR";
     case 4416: return "SubgroupEqMaskKHR";
     case 4417: return "SubgroupGeMaskKHR";
     case 4417: return "SubgroupGeMaskKHR";
     case 4418: return "SubgroupGtMaskKHR";
     case 4418: return "SubgroupGtMaskKHR";
     case 4419: return "SubgroupLeMaskKHR";
     case 4419: return "SubgroupLeMaskKHR";
     case 4420: return "SubgroupLtMaskKHR";
     case 4420: return "SubgroupLtMaskKHR";
-
+    case 4438: return "DeviceIndex";
+    case 4440: return "ViewIndex";
     case 4424: return "BaseVertex";
     case 4424: return "BaseVertex";
     case 4425: return "BaseInstance";
     case 4425: return "BaseInstance";
     case 4426: return "DrawIndex";
     case 4426: return "DrawIndex";
@@ -340,13 +339,17 @@ const char* BuiltInString(int builtIn)
     case 4997: return "BaryCoordSmoothSampleAMD";
     case 4997: return "BaryCoordSmoothSampleAMD";
     case 4998: return "BaryCoordPullModelAMD";
     case 4998: return "BaryCoordPullModelAMD";
 #endif
 #endif
+
 #ifdef NV_EXTENSIONS
 #ifdef NV_EXTENSIONS
     case 5253: return "ViewportMaskNV";
     case 5253: return "ViewportMaskNV";
     case 5257: return "SecondaryPositionNV";
     case 5257: return "SecondaryPositionNV";
     case 5258: return "SecondaryViewportMaskNV";
     case 5258: return "SecondaryViewportMaskNV";
-    case 5260: return "PositionPerViewNV";
-    case 5261: return "ViewportMaskPerViewNV";
+    case 5261: return "PositionPerViewNV";
+    case 5262: return "ViewportMaskPerViewNV";
 #endif
 #endif
+
+    case BuiltInCeiling:
+    default: return "Bad";
     }
     }
 }
 }
 
 
@@ -823,21 +826,23 @@ const char* CapabilityString(int info)
     case 56: return "StorageImageWriteWithoutFormat";
     case 56: return "StorageImageWriteWithoutFormat";
     case 57: return "MultiViewport";
     case 57: return "MultiViewport";
 
 
-    case CapabilityCeiling:
-    default: return "Bad";
-
     case 4423: return "SubgroupBallotKHR";
     case 4423: return "SubgroupBallotKHR";
     case 4427: return "DrawParameters";
     case 4427: return "DrawParameters";
     case 4431: return "SubgroupVoteKHR";
     case 4431: return "SubgroupVoteKHR";
 
 
+    case 4437: return "DeviceGroup";
+    case 4439: return "MultiView";
+
 #ifdef NV_EXTENSIONS
 #ifdef NV_EXTENSIONS
     case 5251: return "GeometryShaderPassthroughNV";
     case 5251: return "GeometryShaderPassthroughNV";
     case 5254: return "ShaderViewportIndexLayerNV";
     case 5254: return "ShaderViewportIndexLayerNV";
     case 5255: return "ShaderViewportMaskNV";
     case 5255: return "ShaderViewportMaskNV";
     case 5259: return "ShaderStereoViewNV";
     case 5259: return "ShaderStereoViewNV";
-    case 5262: return "PerViewAttributesNV";
+    case 5260: return "PerViewAttributesNV";
 #endif
 #endif
 
 
+    case CapabilityCeiling:
+    default: return "Bad";
     }
     }
 }
 }
 
 
@@ -1166,10 +1171,6 @@ const char* OpcodeString(int op)
     case 319: return "OpAtomicFlagClear";
     case 319: return "OpAtomicFlagClear";
     case 320: return "OpImageSparseRead";
     case 320: return "OpImageSparseRead";
 
 
-    case OpcodeCeiling:
-    default:
-        return "Bad";
-
     case 4421: return "OpSubgroupBallotKHR";
     case 4421: return "OpSubgroupBallotKHR";
     case 4422: return "OpSubgroupFirstInvocationKHR";
     case 4422: return "OpSubgroupFirstInvocationKHR";
     case 4428: return "OpSubgroupAllKHR";
     case 4428: return "OpSubgroupAllKHR";
@@ -1187,6 +1188,10 @@ const char* OpcodeString(int op)
     case 5006: return "OpGroupUMaxNonUniformAMD";
     case 5006: return "OpGroupUMaxNonUniformAMD";
     case 5007: return "OpGroupSMaxNonUniformAMD";
     case 5007: return "OpGroupSMaxNonUniformAMD";
 #endif
 #endif
+
+    case OpcodeCeiling:
+    default:
+        return "Bad";
     }
     }
 }
 }
 
 

+ 29 - 7
3rdparty/glslang/SPIRV/spirv.hpp

@@ -1,4 +1,4 @@
-// Copyright (c) 2014-2016 The Khronos Group Inc.
+// Copyright (c) 2014-2017 The Khronos Group Inc.
 // 
 // 
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and/or associated documentation files (the "Materials"),
 // of this software and/or associated documentation files (the "Materials"),
@@ -47,11 +47,11 @@ namespace spv {
 typedef unsigned int Id;
 typedef unsigned int Id;
 
 
 #define SPV_VERSION 0x10000
 #define SPV_VERSION 0x10000
-#define SPV_REVISION 8
+#define SPV_REVISION 10
 
 
 static const unsigned int MagicNumber = 0x07230203;
 static const unsigned int MagicNumber = 0x07230203;
 static const unsigned int Version = 0x00010000;
 static const unsigned int Version = 0x00010000;
-static const unsigned int Revision = 8;
+static const unsigned int Revision = 10;
 static const unsigned int OpCodeMask = 0xffff;
 static const unsigned int OpCodeMask = 0xffff;
 static const unsigned int WordCountShift = 16;
 static const unsigned int WordCountShift = 16;
 
 
@@ -61,7 +61,6 @@ enum SourceLanguage {
     SourceLanguageGLSL = 2,
     SourceLanguageGLSL = 2,
     SourceLanguageOpenCL_C = 3,
     SourceLanguageOpenCL_C = 3,
     SourceLanguageOpenCL_CPP = 4,
     SourceLanguageOpenCL_CPP = 4,
-    SourceLanguageHLSL = 5,
     SourceLanguageMax = 0x7fffffff,
     SourceLanguageMax = 0x7fffffff,
 };
 };
 
 
@@ -375,6 +374,10 @@ enum Decoration {
     DecorationNoContraction = 42,
     DecorationNoContraction = 42,
     DecorationInputAttachmentIndex = 43,
     DecorationInputAttachmentIndex = 43,
     DecorationAlignment = 44,
     DecorationAlignment = 44,
+    DecorationOverrideCoverageNV = 5248,
+    DecorationPassthroughNV = 5250,
+    DecorationViewportRelativeNV = 5252,
+    DecorationSecondaryViewportRelativeNV = 5256,
     DecorationMax = 0x7fffffff,
     DecorationMax = 0x7fffffff,
 };
 };
 
 
@@ -428,6 +431,13 @@ enum BuiltIn {
     BuiltInBaseVertex = 4424,
     BuiltInBaseVertex = 4424,
     BuiltInBaseInstance = 4425,
     BuiltInBaseInstance = 4425,
     BuiltInDrawIndex = 4426,
     BuiltInDrawIndex = 4426,
+    BuiltInDeviceIndex = 4438,
+    BuiltInViewIndex = 4440,
+    BuiltInViewportMaskNV = 5253,
+    BuiltInSecondaryPositionNV = 5257,
+    BuiltInSecondaryViewportMaskNV = 5258,
+    BuiltInPositionPerViewNV = 5261,
+    BuiltInViewportMaskPerViewNV = 5262,
     BuiltInMax = 0x7fffffff,
     BuiltInMax = 0x7fffffff,
 };
 };
 
 
@@ -606,6 +616,18 @@ enum Capability {
     CapabilitySubgroupBallotKHR = 4423,
     CapabilitySubgroupBallotKHR = 4423,
     CapabilityDrawParameters = 4427,
     CapabilityDrawParameters = 4427,
     CapabilitySubgroupVoteKHR = 4431,
     CapabilitySubgroupVoteKHR = 4431,
+    CapabilityStorageUniformBufferBlock16 = 4433,
+    CapabilityStorageUniform16 = 4434,
+    CapabilityStoragePushConstant16 = 4435,
+    CapabilityStorageInputOutput16 = 4436,
+    CapabilityDeviceGroup = 4437,
+    CapabilityMultiView = 4439,
+    CapabilitySampleMaskOverrideCoverageNV = 5249,
+    CapabilityGeometryShaderPassthroughNV = 5251,
+    CapabilityShaderViewportIndexLayerNV = 5254,
+    CapabilityShaderViewportMaskNV = 5255,
+    CapabilityShaderStereoViewNV = 5259,
+    CapabilityPerViewAttributesNV = 5260,
     CapabilityMax = 0x7fffffff,
     CapabilityMax = 0x7fffffff,
 };
 };
 
 
@@ -906,10 +928,10 @@ enum Op {
     OpImageSparseRead = 320,
     OpImageSparseRead = 320,
     OpSubgroupBallotKHR = 4421,
     OpSubgroupBallotKHR = 4421,
     OpSubgroupFirstInvocationKHR = 4422,
     OpSubgroupFirstInvocationKHR = 4422,
-    OpSubgroupReadInvocationKHR = 4432,
-    OpSubgroupAllKHR = 4428,
-    OpSubgroupAnyKHR = 4429,
+    OpSubgroupAllKHR = 4428,
+    OpSubgroupAnyKHR = 4429,
     OpSubgroupAllEqualKHR = 4430,
     OpSubgroupAllEqualKHR = 4430,
+    OpSubgroupReadInvocationKHR = 4432,
     OpMax = 0x7fffffff,
     OpMax = 0x7fffffff,
 };
 };
 
 

+ 3 - 1
3rdparty/glslang/Test/120.frag

@@ -243,4 +243,6 @@ void voidTernary()
 	b ? foo121111() : foo12111();
 	b ? foo121111() : foo12111();
 	b ? foo121111() : 4;  // ERROR
 	b ? foo121111() : 4;  // ERROR
 	b ? 3 : foo12111();   // ERROR
 	b ? 3 : foo12111();   // ERROR
-}
+}
+
+float halfFloat1 = 1.0h;   // syntax ERROR

+ 1 - 0
3rdparty/glslang/Test/badChars.frag

@@ -4,3 +4,4 @@
 #if
 #if
 #endif
 #endif
 int a˙
 int a˙
+#define A "˙

+ 4 - 1
3rdparty/glslang/Test/baseResults/120.frag.out

@@ -52,7 +52,8 @@ ERROR: 0:209: 'assign' :  cannot convert from 'const float' to 'temp 4-component
 ERROR: 0:212: 'sampler2DRect' : Reserved word. 
 ERROR: 0:212: 'sampler2DRect' : Reserved word. 
 ERROR: 0:244: ':' :  wrong operand types: no operation ':' exists that takes a left-hand operand of type 'global void' and a right operand of type 'const int' (or there is no acceptable conversion)
 ERROR: 0:244: ':' :  wrong operand types: no operation ':' exists that takes a left-hand operand of type 'global void' and a right operand of type 'const int' (or there is no acceptable conversion)
 ERROR: 0:245: ':' :  wrong operand types: no operation ':' exists that takes a left-hand operand of type 'const int' and a right operand of type 'global void' (or there is no acceptable conversion)
 ERROR: 0:245: ':' :  wrong operand types: no operation ':' exists that takes a left-hand operand of type 'const int' and a right operand of type 'global void' (or there is no acceptable conversion)
-ERROR: 53 compilation errors.  No code generated.
+ERROR: 0:248: '' :  syntax error
+ERROR: 54 compilation errors.  No code generated.
 
 
 
 
 Shader version: 120
 Shader version: 120
@@ -645,6 +646,7 @@ ERROR: node is still EOpNull!
 0:?     's2DRbad' (uniform sampler2DRect)
 0:?     's2DRbad' (uniform sampler2DRect)
 0:?     's2DR' (uniform sampler2DRect)
 0:?     's2DR' (uniform sampler2DRect)
 0:?     's2DRS' (uniform sampler2DRectShadow)
 0:?     's2DRS' (uniform sampler2DRectShadow)
+0:?     'halfFloat1' (global float)
 
 
 
 
 Linked fragment stage:
 Linked fragment stage:
@@ -688,4 +690,5 @@ ERROR: node is still EOpNull!
 0:?     's2DRbad' (uniform sampler2DRect)
 0:?     's2DRbad' (uniform sampler2DRect)
 0:?     's2DR' (uniform sampler2DRect)
 0:?     's2DR' (uniform sampler2DRect)
 0:?     's2DRS' (uniform sampler2DRectShadow)
 0:?     's2DRS' (uniform sampler2DRectShadow)
+0:?     'halfFloat1' (global float)
 
 

+ 2 - 1
3rdparty/glslang/Test/baseResults/420.vert.out

@@ -47,12 +47,13 @@ ERROR: 0:142: 'r8_snorm' : does not apply to signed integer images
 ERROR: 0:143: 'rgba32ui' : does not apply to signed integer images 
 ERROR: 0:143: 'rgba32ui' : does not apply to signed integer images 
 ERROR: 0:144: 'r8ui' : 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 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:157: 'textureQueryLevels' : no matching overloaded function found 
 ERROR: 0:157: 'textureQueryLevels' : no matching overloaded function found 
 ERROR: 0:157: 'assign' :  cannot convert from 'const float' to 'temp int'
 ERROR: 0:157: 'assign' :  cannot convert from 'const float' to 'temp int'
 ERROR: 0:158: 'textureQueryLevels' : no matching overloaded function found 
 ERROR: 0:158: 'textureQueryLevels' : no matching overloaded function found 
 ERROR: 0:158: 'assign' :  cannot convert from 'const float' to 'temp int'
 ERROR: 0:158: 'assign' :  cannot convert from 'const float' to 'temp int'
 WARNING: 0:161: '[]' : assuming array size of one for compile-time checking of binding numbers for implicitly-sized array 
 WARNING: 0:161: '[]' : assuming array size of one for compile-time checking of binding numbers for implicitly-sized array 
-ERROR: 50 compilation errors.  No code generated.
+ERROR: 51 compilation errors.  No code generated.
 
 
 
 
 Shader version: 420
 Shader version: 420

+ 4 - 3
3rdparty/glslang/Test/baseResults/430.vert.out

@@ -28,8 +28,9 @@ ERROR: 0:64: 'uniform buffer-member align' : not supported for this version or t
 ERROR: 0:65: 'uniform buffer-member align' : not supported for this version or the enabled extensions 
 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: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:66: 'offset on block member' : not supported for this version or the enabled extensions 
-ERROR: 0:64: 'offset/align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:65: 'align' : can only be used with std140 or std430 layout packing 
+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:71: 'offset on block member' : not supported for this version or the enabled extensions 
 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:74: 'gl_MaxTransformFeedbackBuffers' : required extension not requested: GL_ARB_enhanced_layouts
 ERROR: 0:75: 'gl_MaxTransformFeedbackInterleavedComponents' : required extension not requested: GL_ARB_enhanced_layouts
 ERROR: 0:75: 'gl_MaxTransformFeedbackInterleavedComponents' : required extension not requested: GL_ARB_enhanced_layouts
@@ -63,7 +64,7 @@ ERROR: 0:221: 'textureQueryLevels' : no matching overloaded function found
 ERROR: 0:221: 'assign' :  cannot convert from 'const float' to 'temp int'
 ERROR: 0:221: 'assign' :  cannot convert from 'const float' to 'temp int'
 ERROR: 0:222: 'textureQueryLevels' : no matching overloaded function found 
 ERROR: 0:222: 'textureQueryLevels' : no matching overloaded function found 
 ERROR: 0:222: 'assign' :  cannot convert from 'const float' to 'temp int'
 ERROR: 0:222: 'assign' :  cannot convert from 'const float' to 'temp int'
-ERROR: 63 compilation errors.  No code generated.
+ERROR: 64 compilation errors.  No code generated.
 
 
 
 
 Shader version: 430
 Shader version: 430

+ 7 - 6
3rdparty/glslang/Test/baseResults/440.frag.out

@@ -22,11 +22,11 @@ ERROR: 0:38: 'offset' : only applies to block members, not blocks
 ERROR: 0:39: 'output block' : not supported in this stage: fragment
 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: '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:39: 'offset' : only applies to block members, not blocks 
-ERROR: 0:42: 'offset/align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:43: 'offset/align' : can only be used with std140 or std430 layout packing 
+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:43: 'layout' : offset/align can only be used on a uniform or buffer 
 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: 'output block' : not supported in this stage: fragment
-ERROR: 0:44: 'offset/align' : can only be used with std140 or std430 layout packing 
+ERROR: 0:44: 'align' : can only be used with std140 or std430 layout packing 
 ERROR: 0:44: 'layout' : offset/align can only be used on a uniform or buffer 
 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:46: 'offset' : cannot specify on a variable declaration 
 ERROR: 0:47: 'layout' : offset/align can only be used on a uniform or buffer 
 ERROR: 0:47: 'layout' : offset/align can only be used on a uniform or buffer 
@@ -37,8 +37,9 @@ ERROR: 0:52: 'layout' : offset/align can only be used on a uniform or buffer
 ERROR: 0:54: 'layout' : matrix or packing qualifiers can only be used on a uniform or buffer 
 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:55: 'layout' : cannot specify packing on a variable declaration 
 ERROR: 0:57: 'align' : must be a power of 2 
 ERROR: 0:57: 'align' : must be a power of 2 
-ERROR: 0:58: 'align' : can only be used with std140 or std430 layout packing 
-ERROR: 0:63: 'align' : can only be used with std140 or std430 layout packing 
+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:62: 'layout' : offset/align can only be used on a uniform or buffer 
 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:63: 'layout' : offset/align can only be used on a uniform or buffer 
 ERROR: 0:84: 'align' : must be a power of 2 
 ERROR: 0:84: 'align' : must be a power of 2 
@@ -48,7 +49,7 @@ ERROR: 0:103: 'align' : must be a power of 2
 ERROR: 0:105: 'align' : must be a power of 2 
 ERROR: 0:105: 'align' : must be a power of 2 
 ERROR: 0:102: 'offset' : cannot lie in previous members 
 ERROR: 0:102: 'offset' : cannot lie in previous members 
 ERROR: 0:104: 'offset' : must be a multiple of the member's alignment 
 ERROR: 0:104: 'offset' : must be a multiple of the member's alignment 
-ERROR: 48 compilation errors.  No code generated.
+ERROR: 49 compilation errors.  No code generated.
 
 
 
 
 Shader version: 440
 Shader version: 440

+ 2 - 1
3rdparty/glslang/Test/baseResults/badChars.frag.out

@@ -5,8 +5,9 @@ ERROR: 0:3: '#error' : A <bad token> B
 ERROR: 0:4: 'preprocessor evaluation' : bad expression 
 ERROR: 0:4: 'preprocessor evaluation' : bad expression 
 ERROR: 0:4: '#if' : unexpected tokens following directive 
 ERROR: 0:4: '#if' : unexpected tokens following directive 
 ERROR: 0:6: '€' : unexpected token 
 ERROR: 0:6: '€' : unexpected token 
+ERROR: 0:7: 'string' : End of line in string 
 ERROR: 0:7: '' :  syntax error
 ERROR: 0:7: '' :  syntax error
-ERROR: 7 compilation errors.  No code generated.
+ERROR: 8 compilation errors.  No code generated.
 
 
 
 
 Shader version: 100
 Shader version: 100

+ 353 - 118
3rdparty/glslang/Test/baseResults/hlsl.intrinsics.f1632.frag.out

@@ -1,80 +1,131 @@
 hlsl.intrinsics.f1632.frag
 hlsl.intrinsics.f1632.frag
-ERROR: 0:3: 'f32tof16' : unimplemented intrinsic: handle natively 
-ERROR: 0:16: 'f32tof16' : unimplemented intrinsic: handle natively 
-ERROR: 0:23: 'f32tof16' : unimplemented intrinsic: handle natively 
-ERROR: 0:30: 'f32tof16' : unimplemented intrinsic: handle natively 
-ERROR: 4 compilation errors.  No code generated.
-
-
 Shader version: 450
 Shader version: 450
 gl_FragCoord origin is upper left
 gl_FragCoord origin is upper left
-ERROR: node is still EOpNull!
-0:2  Function Definition: PixelShaderFunctionS(f1; (temp float)
+0:? Sequence
+0:2  Function Definition: PixelShaderFunctionS(u1; (temp float)
 0:2    Function Parameters: 
 0:2    Function Parameters: 
-0:2      'inF0' (in float)
+0:2      'inF0' (in uint)
+0:?     Sequence
+0:3      Branch: Return with expression
+0:3        direct index (temp float)
+0:3          unpackHalf2x16 (temp 2-component vector of float)
+0:3            'inF0' (in uint)
+0:3          Constant:
+0:3            0 (const int)
+0:7  Function Definition: PixelShaderFunction1(vu1; (temp 1-component vector of float)
+0:7    Function Parameters: 
+0:7      'inF0' (in 1-component vector of uint)
 0:?     Sequence
 0:?     Sequence
-0:3      ERROR: Bad unary op
- (temp uint)
-0:3        'inF0' (in float)
-0:5      Branch: Return with expression
-0:5        Constant:
-0:5          0.000000
-0:9  Function Definition: PixelShaderFunction1(vf1; (temp 1-component vector of float)
-0:9    Function Parameters: 
-0:9      'inF0' (in 1-component vector of float)
+0:8      Branch: Return with expression
+0:8        Constant:
+0:8          0.000000
+0:12  Function Definition: PixelShaderFunction2(vu2; (temp 2-component vector of float)
+0:12    Function Parameters: 
+0:12      'inF0' (in 2-component vector of uint)
 0:?     Sequence
 0:?     Sequence
-0:11      Branch: Return with expression
-0:11        Constant:
-0:11          0.000000
-0:15  Function Definition: PixelShaderFunction2(vf2; (temp 2-component vector of float)
-0:15    Function Parameters: 
-0:15      'inF0' (in 2-component vector of float)
+0:13      Branch: Return with expression
+0:13        Construct vec2 (temp 2-component vector of float)
+0:13          direct index (temp float)
+0:13            unpackHalf2x16 (temp 2-component vector of float)
+0:13              direct index (temp uint)
+0:13                'inF0' (in 2-component vector of uint)
+0:13                Constant:
+0:13                  0 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index (temp float)
+0:13            unpackHalf2x16 (temp 2-component vector of float)
+0:13              direct index (temp uint)
+0:13                'inF0' (in 2-component vector of uint)
+0:13                Constant:
+0:13                  1 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:17  Function Definition: PixelShaderFunction3(vu3; (temp 3-component vector of float)
+0:17    Function Parameters: 
+0:17      'inF0' (in 3-component vector of uint)
 0:?     Sequence
 0:?     Sequence
-0:16      ERROR: Bad unary op
- (temp 2-component vector of uint)
-0:16        'inF0' (in 2-component vector of float)
 0:18      Branch: Return with expression
 0:18      Branch: Return with expression
-0:?         Constant:
-0:?           1.000000
-0:?           2.000000
-0:22  Function Definition: PixelShaderFunction3(vf3; (temp 3-component vector of float)
+0:18        Construct vec3 (temp 3-component vector of float)
+0:18          direct index (temp float)
+0:18            unpackHalf2x16 (temp 2-component vector of float)
+0:18              direct index (temp uint)
+0:18                'inF0' (in 3-component vector of uint)
+0:18                Constant:
+0:18                  0 (const int)
+0:18            Constant:
+0:18              0 (const int)
+0:18          direct index (temp float)
+0:18            unpackHalf2x16 (temp 2-component vector of float)
+0:18              direct index (temp uint)
+0:18                'inF0' (in 3-component vector of uint)
+0:18                Constant:
+0:18                  1 (const int)
+0:18            Constant:
+0:18              0 (const int)
+0:18          direct index (temp float)
+0:18            unpackHalf2x16 (temp 2-component vector of float)
+0:18              direct index (temp uint)
+0:18                'inF0' (in 3-component vector of uint)
+0:18                Constant:
+0:18                  2 (const int)
+0:18            Constant:
+0:18              0 (const int)
+0:22  Function Definition: PixelShaderFunction(vu4; (temp 4-component vector of float)
 0:22    Function Parameters: 
 0:22    Function Parameters: 
-0:22      'inF0' (in 3-component vector of float)
+0:22      'inF0' (in 4-component vector of uint)
 0:?     Sequence
 0:?     Sequence
-0:23      ERROR: Bad unary op
- (temp 3-component vector of uint)
-0:23        'inF0' (in 3-component vector of float)
-0:25      Branch: Return with expression
-0:?         Constant:
-0:?           1.000000
-0:?           2.000000
-0:?           3.000000
-0:29  Function Definition: @PixelShaderFunction(vf4; (temp 4-component vector of float)
-0:29    Function Parameters: 
-0:29      'inF0' (in 4-component vector of float)
+0:23      Branch: Return with expression
+0:23        Construct vec4 (temp 4-component vector of float)
+0:23          direct index (temp float)
+0:23            unpackHalf2x16 (temp 2-component vector of float)
+0:23              direct index (temp uint)
+0:23                'inF0' (in 4-component vector of uint)
+0:23                Constant:
+0:23                  0 (const int)
+0:23            Constant:
+0:23              0 (const int)
+0:23          direct index (temp float)
+0:23            unpackHalf2x16 (temp 2-component vector of float)
+0:23              direct index (temp uint)
+0:23                'inF0' (in 4-component vector of uint)
+0:23                Constant:
+0:23                  1 (const int)
+0:23            Constant:
+0:23              0 (const int)
+0:23          direct index (temp float)
+0:23            unpackHalf2x16 (temp 2-component vector of float)
+0:23              direct index (temp uint)
+0:23                'inF0' (in 4-component vector of uint)
+0:23                Constant:
+0:23                  2 (const int)
+0:23            Constant:
+0:23              0 (const int)
+0:23          direct index (temp float)
+0:23            unpackHalf2x16 (temp 2-component vector of float)
+0:23              direct index (temp uint)
+0:23                'inF0' (in 4-component vector of uint)
+0:23                Constant:
+0:23                  3 (const int)
+0:23            Constant:
+0:23              0 (const int)
+0:27  Function Definition: @main( (temp 4-component vector of float)
+0:27    Function Parameters: 
 0:?     Sequence
 0:?     Sequence
-0:30      ERROR: Bad unary op
- (temp 4-component vector of uint)
-0:30        'inF0' (in 4-component vector of float)
-0:32      Branch: Return with expression
-0:?         Constant:
-0:?           1.000000
-0:?           2.000000
-0:?           3.000000
-0:?           4.000000
-0:29  Function Definition: PixelShaderFunction( (temp void)
-0:29    Function Parameters: 
+0:28      Branch: Return with expression
+0:28        Constant:
+0:28          0.000000
+0:28          0.000000
+0:28          0.000000
+0:28          0.000000
+0:27  Function Definition: main( (temp void)
+0:27    Function Parameters: 
 0:?     Sequence
 0:?     Sequence
-0:29      move second child to first child (temp 4-component vector of float)
-0:?         'inF0' (temp 4-component vector of float)
-0:?         'inF0' (layout(location=0 ) in 4-component vector of float)
-0:29      move second child to first child (temp 4-component vector of float)
+0:27      move second child to first child (temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
-0:29        Function Call: @PixelShaderFunction(vf4; (temp 4-component vector of float)
-0:?           'inF0' (temp 4-component vector of float)
+0:27        Function Call: @main( (temp 4-component vector of float)
 0:?   Linker Objects
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
-0:?     'inF0' (layout(location=0 ) in 4-component vector of float)
 
 
 
 
 Linked fragment stage:
 Linked fragment stage:
@@ -82,72 +133,256 @@ Linked fragment stage:
 
 
 Shader version: 450
 Shader version: 450
 gl_FragCoord origin is upper left
 gl_FragCoord origin is upper left
-ERROR: node is still EOpNull!
-0:2  Function Definition: PixelShaderFunctionS(f1; (temp float)
+0:? Sequence
+0:2  Function Definition: PixelShaderFunctionS(u1; (temp float)
 0:2    Function Parameters: 
 0:2    Function Parameters: 
-0:2      'inF0' (in float)
+0:2      'inF0' (in uint)
 0:?     Sequence
 0:?     Sequence
-0:3      ERROR: Bad unary op
- (temp uint)
-0:3        'inF0' (in float)
-0:5      Branch: Return with expression
-0:5        Constant:
-0:5          0.000000
-0:9  Function Definition: PixelShaderFunction1(vf1; (temp 1-component vector of float)
-0:9    Function Parameters: 
-0:9      'inF0' (in 1-component vector of float)
+0:3      Branch: Return with expression
+0:3        direct index (temp float)
+0:3          unpackHalf2x16 (temp 2-component vector of float)
+0:3            'inF0' (in uint)
+0:3          Constant:
+0:3            0 (const int)
+0:7  Function Definition: PixelShaderFunction1(vu1; (temp 1-component vector of float)
+0:7    Function Parameters: 
+0:7      'inF0' (in 1-component vector of uint)
 0:?     Sequence
 0:?     Sequence
-0:11      Branch: Return with expression
-0:11        Constant:
-0:11          0.000000
-0:15  Function Definition: PixelShaderFunction2(vf2; (temp 2-component vector of float)
-0:15    Function Parameters: 
-0:15      'inF0' (in 2-component vector of float)
+0:8      Branch: Return with expression
+0:8        Constant:
+0:8          0.000000
+0:12  Function Definition: PixelShaderFunction2(vu2; (temp 2-component vector of float)
+0:12    Function Parameters: 
+0:12      'inF0' (in 2-component vector of uint)
+0:?     Sequence
+0:13      Branch: Return with expression
+0:13        Construct vec2 (temp 2-component vector of float)
+0:13          direct index (temp float)
+0:13            unpackHalf2x16 (temp 2-component vector of float)
+0:13              direct index (temp uint)
+0:13                'inF0' (in 2-component vector of uint)
+0:13                Constant:
+0:13                  0 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:13          direct index (temp float)
+0:13            unpackHalf2x16 (temp 2-component vector of float)
+0:13              direct index (temp uint)
+0:13                'inF0' (in 2-component vector of uint)
+0:13                Constant:
+0:13                  1 (const int)
+0:13            Constant:
+0:13              0 (const int)
+0:17  Function Definition: PixelShaderFunction3(vu3; (temp 3-component vector of float)
+0:17    Function Parameters: 
+0:17      'inF0' (in 3-component vector of uint)
 0:?     Sequence
 0:?     Sequence
-0:16      ERROR: Bad unary op
- (temp 2-component vector of uint)
-0:16        'inF0' (in 2-component vector of float)
 0:18      Branch: Return with expression
 0:18      Branch: Return with expression
-0:?         Constant:
-0:?           1.000000
-0:?           2.000000
-0:22  Function Definition: PixelShaderFunction3(vf3; (temp 3-component vector of float)
+0:18        Construct vec3 (temp 3-component vector of float)
+0:18          direct index (temp float)
+0:18            unpackHalf2x16 (temp 2-component vector of float)
+0:18              direct index (temp uint)
+0:18                'inF0' (in 3-component vector of uint)
+0:18                Constant:
+0:18                  0 (const int)
+0:18            Constant:
+0:18              0 (const int)
+0:18          direct index (temp float)
+0:18            unpackHalf2x16 (temp 2-component vector of float)
+0:18              direct index (temp uint)
+0:18                'inF0' (in 3-component vector of uint)
+0:18                Constant:
+0:18                  1 (const int)
+0:18            Constant:
+0:18              0 (const int)
+0:18          direct index (temp float)
+0:18            unpackHalf2x16 (temp 2-component vector of float)
+0:18              direct index (temp uint)
+0:18                'inF0' (in 3-component vector of uint)
+0:18                Constant:
+0:18                  2 (const int)
+0:18            Constant:
+0:18              0 (const int)
+0:22  Function Definition: PixelShaderFunction(vu4; (temp 4-component vector of float)
 0:22    Function Parameters: 
 0:22    Function Parameters: 
-0:22      'inF0' (in 3-component vector of float)
+0:22      'inF0' (in 4-component vector of uint)
 0:?     Sequence
 0:?     Sequence
-0:23      ERROR: Bad unary op
- (temp 3-component vector of uint)
-0:23        'inF0' (in 3-component vector of float)
-0:25      Branch: Return with expression
-0:?         Constant:
-0:?           1.000000
-0:?           2.000000
-0:?           3.000000
-0:29  Function Definition: @PixelShaderFunction(vf4; (temp 4-component vector of float)
-0:29    Function Parameters: 
-0:29      'inF0' (in 4-component vector of float)
+0:23      Branch: Return with expression
+0:23        Construct vec4 (temp 4-component vector of float)
+0:23          direct index (temp float)
+0:23            unpackHalf2x16 (temp 2-component vector of float)
+0:23              direct index (temp uint)
+0:23                'inF0' (in 4-component vector of uint)
+0:23                Constant:
+0:23                  0 (const int)
+0:23            Constant:
+0:23              0 (const int)
+0:23          direct index (temp float)
+0:23            unpackHalf2x16 (temp 2-component vector of float)
+0:23              direct index (temp uint)
+0:23                'inF0' (in 4-component vector of uint)
+0:23                Constant:
+0:23                  1 (const int)
+0:23            Constant:
+0:23              0 (const int)
+0:23          direct index (temp float)
+0:23            unpackHalf2x16 (temp 2-component vector of float)
+0:23              direct index (temp uint)
+0:23                'inF0' (in 4-component vector of uint)
+0:23                Constant:
+0:23                  2 (const int)
+0:23            Constant:
+0:23              0 (const int)
+0:23          direct index (temp float)
+0:23            unpackHalf2x16 (temp 2-component vector of float)
+0:23              direct index (temp uint)
+0:23                'inF0' (in 4-component vector of uint)
+0:23                Constant:
+0:23                  3 (const int)
+0:23            Constant:
+0:23              0 (const int)
+0:27  Function Definition: @main( (temp 4-component vector of float)
+0:27    Function Parameters: 
 0:?     Sequence
 0:?     Sequence
-0:30      ERROR: Bad unary op
- (temp 4-component vector of uint)
-0:30        'inF0' (in 4-component vector of float)
-0:32      Branch: Return with expression
-0:?         Constant:
-0:?           1.000000
-0:?           2.000000
-0:?           3.000000
-0:?           4.000000
-0:29  Function Definition: PixelShaderFunction( (temp void)
-0:29    Function Parameters: 
+0:28      Branch: Return with expression
+0:28        Constant:
+0:28          0.000000
+0:28          0.000000
+0:28          0.000000
+0:28          0.000000
+0:27  Function Definition: main( (temp void)
+0:27    Function Parameters: 
 0:?     Sequence
 0:?     Sequence
-0:29      move second child to first child (temp 4-component vector of float)
-0:?         'inF0' (temp 4-component vector of float)
-0:?         'inF0' (layout(location=0 ) in 4-component vector of float)
-0:29      move second child to first child (temp 4-component vector of float)
+0:27      move second child to first child (temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
-0:29        Function Call: @PixelShaderFunction(vf4; (temp 4-component vector of float)
-0:?           'inF0' (temp 4-component vector of float)
+0:27        Function Call: @main( (temp 4-component vector of float)
 0:?   Linker Objects
 0:?   Linker Objects
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
-0:?     'inF0' (layout(location=0 ) in 4-component vector of float)
 
 
-SPIR-V is not generated for failed compile or link
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 103
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 101
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 11  "PixelShaderFunctionS(u1;"
+                              Name 10  "inF0"
+                              Name 14  "PixelShaderFunction1(vu1;"
+                              Name 13  "inF0"
+                              Name 21  "PixelShaderFunction2(vu2;"
+                              Name 20  "inF0"
+                              Name 28  "PixelShaderFunction3(vu3;"
+                              Name 27  "inF0"
+                              Name 35  "PixelShaderFunction(vu4;"
+                              Name 34  "inF0"
+                              Name 38  "@main("
+                              Name 101  "@entryPointOutput"
+                              Decorate 101(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               8:             TypeFloat 32
+               9:             TypeFunction 8(float) 7(ptr)
+              16:             TypeVector 6(int) 2
+              17:             TypePointer Function 16(ivec2)
+              18:             TypeVector 8(float) 2
+              19:             TypeFunction 18(fvec2) 17(ptr)
+              23:             TypeVector 6(int) 3
+              24:             TypePointer Function 23(ivec3)
+              25:             TypeVector 8(float) 3
+              26:             TypeFunction 25(fvec3) 24(ptr)
+              30:             TypeVector 6(int) 4
+              31:             TypePointer Function 30(ivec4)
+              32:             TypeVector 8(float) 4
+              33:             TypeFunction 32(fvec4) 31(ptr)
+              37:             TypeFunction 32(fvec4)
+              42:      6(int) Constant 0
+              46:    8(float) Constant 0
+              53:      6(int) Constant 1
+              69:      6(int) Constant 2
+              89:      6(int) Constant 3
+              97:   32(fvec4) ConstantComposite 46 46 46 46
+             100:             TypePointer Output 32(fvec4)
+101(@entryPointOutput):    100(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+             102:   32(fvec4) FunctionCall 38(@main()
+                              Store 101(@entryPointOutput) 102
+                              Return
+                              FunctionEnd
+11(PixelShaderFunctionS(u1;):    8(float) Function None 9
+        10(inF0):      7(ptr) FunctionParameter
+              12:             Label
+              40:      6(int) Load 10(inF0)
+              41:   18(fvec2) ExtInst 1(GLSL.std.450) 62(UnpackHalf2x16) 40
+              43:    8(float) CompositeExtract 41 0
+                              ReturnValue 43
+                              FunctionEnd
+14(PixelShaderFunction1(vu1;):    8(float) Function None 9
+        13(inF0):      7(ptr) FunctionParameter
+              15:             Label
+                              ReturnValue 46
+                              FunctionEnd
+21(PixelShaderFunction2(vu2;):   18(fvec2) Function None 19
+        20(inF0):     17(ptr) FunctionParameter
+              22:             Label
+              49:      7(ptr) AccessChain 20(inF0) 42
+              50:      6(int) Load 49
+              51:   18(fvec2) ExtInst 1(GLSL.std.450) 62(UnpackHalf2x16) 50
+              52:    8(float) CompositeExtract 51 0
+              54:      7(ptr) AccessChain 20(inF0) 53
+              55:      6(int) Load 54
+              56:   18(fvec2) ExtInst 1(GLSL.std.450) 62(UnpackHalf2x16) 55
+              57:    8(float) CompositeExtract 56 0
+              58:   18(fvec2) CompositeConstruct 52 57
+                              ReturnValue 58
+                              FunctionEnd
+28(PixelShaderFunction3(vu3;):   25(fvec3) Function None 26
+        27(inF0):     24(ptr) FunctionParameter
+              29:             Label
+              61:      7(ptr) AccessChain 27(inF0) 42
+              62:      6(int) Load 61
+              63:   18(fvec2) ExtInst 1(GLSL.std.450) 62(UnpackHalf2x16) 62
+              64:    8(float) CompositeExtract 63 0
+              65:      7(ptr) AccessChain 27(inF0) 53
+              66:      6(int) Load 65
+              67:   18(fvec2) ExtInst 1(GLSL.std.450) 62(UnpackHalf2x16) 66
+              68:    8(float) CompositeExtract 67 0
+              70:      7(ptr) AccessChain 27(inF0) 69
+              71:      6(int) Load 70
+              72:   18(fvec2) ExtInst 1(GLSL.std.450) 62(UnpackHalf2x16) 71
+              73:    8(float) CompositeExtract 72 0
+              74:   25(fvec3) CompositeConstruct 64 68 73
+                              ReturnValue 74
+                              FunctionEnd
+35(PixelShaderFunction(vu4;):   32(fvec4) Function None 33
+        34(inF0):     31(ptr) FunctionParameter
+              36:             Label
+              77:      7(ptr) AccessChain 34(inF0) 42
+              78:      6(int) Load 77
+              79:   18(fvec2) ExtInst 1(GLSL.std.450) 62(UnpackHalf2x16) 78
+              80:    8(float) CompositeExtract 79 0
+              81:      7(ptr) AccessChain 34(inF0) 53
+              82:      6(int) Load 81
+              83:   18(fvec2) ExtInst 1(GLSL.std.450) 62(UnpackHalf2x16) 82
+              84:    8(float) CompositeExtract 83 0
+              85:      7(ptr) AccessChain 34(inF0) 69
+              86:      6(int) Load 85
+              87:   18(fvec2) ExtInst 1(GLSL.std.450) 62(UnpackHalf2x16) 86
+              88:    8(float) CompositeExtract 87 0
+              90:      7(ptr) AccessChain 34(inF0) 89
+              91:      6(int) Load 90
+              92:   18(fvec2) ExtInst 1(GLSL.std.450) 62(UnpackHalf2x16) 91
+              93:    8(float) CompositeExtract 92 0
+              94:   32(fvec4) CompositeConstruct 80 84 88 93
+                              ReturnValue 94
+                              FunctionEnd
+      38(@main():   32(fvec4) Function None 37
+              39:             Label
+                              ReturnValue 97
+                              FunctionEnd

+ 401 - 0
3rdparty/glslang/Test/baseResults/hlsl.intrinsics.f3216.frag.out

@@ -0,0 +1,401 @@
+hlsl.intrinsics.f3216.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: PixelShaderFunctionS(f1; (temp uint)
+0:2    Function Parameters: 
+0:2      'inF0' (in float)
+0:?     Sequence
+0:3      Branch: Return with expression
+0:3        packHalf2x16 (temp uint)
+0:3          Construct vec2 (temp 2-component vector of float)
+0:3            'inF0' (in float)
+0:3            Constant:
+0:3              0.000000
+0:7  Function Definition: PixelShaderFunction1(vf1; (temp 1-component vector of uint)
+0:7    Function Parameters: 
+0:7      'inF0' (in 1-component vector of float)
+0:?     Sequence
+0:8      Branch: Return with expression
+0:8        Construct uint (temp 1-component vector of uint)
+0:8          packHalf2x16 (temp uint)
+0:8            Construct vec2 (temp 2-component vector of float)
+0:8              Construct float (in float)
+0:8                'inF0' (in 1-component vector of float)
+0:8              Constant:
+0:8                0.000000
+0:12  Function Definition: PixelShaderFunction2(vf2; (temp 2-component vector of uint)
+0:12    Function Parameters: 
+0:12      'inF0' (in 2-component vector of float)
+0:?     Sequence
+0:13      Branch: Return with expression
+0:13        Construct uvec2 (temp 2-component vector of uint)
+0:13          packHalf2x16 (temp uint)
+0:13            Construct vec2 (temp 2-component vector of float)
+0:13              direct index (temp float)
+0:13                'inF0' (in 2-component vector of float)
+0:13                Constant:
+0:13                  0 (const int)
+0:13              Constant:
+0:13                0.000000
+0:13          packHalf2x16 (temp uint)
+0:13            Construct vec2 (temp 2-component vector of float)
+0:13              direct index (temp float)
+0:13                'inF0' (in 2-component vector of float)
+0:13                Constant:
+0:13                  1 (const int)
+0:13              Constant:
+0:13                0.000000
+0:17  Function Definition: PixelShaderFunction3(vf3; (temp 3-component vector of uint)
+0:17    Function Parameters: 
+0:17      'inF0' (in 3-component vector of float)
+0:?     Sequence
+0:18      Branch: Return with expression
+0:18        Construct uvec3 (temp 3-component vector of uint)
+0:18          packHalf2x16 (temp uint)
+0:18            Construct vec2 (temp 2-component vector of float)
+0:18              direct index (temp float)
+0:18                'inF0' (in 3-component vector of float)
+0:18                Constant:
+0:18                  0 (const int)
+0:18              Constant:
+0:18                0.000000
+0:18          packHalf2x16 (temp uint)
+0:18            Construct vec2 (temp 2-component vector of float)
+0:18              direct index (temp float)
+0:18                'inF0' (in 3-component vector of float)
+0:18                Constant:
+0:18                  1 (const int)
+0:18              Constant:
+0:18                0.000000
+0:18          packHalf2x16 (temp uint)
+0:18            Construct vec2 (temp 2-component vector of float)
+0:18              direct index (temp float)
+0:18                'inF0' (in 3-component vector of float)
+0:18                Constant:
+0:18                  2 (const int)
+0:18              Constant:
+0:18                0.000000
+0:22  Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of uint)
+0:22    Function Parameters: 
+0:22      'inF0' (in 4-component vector of float)
+0:?     Sequence
+0:23      Branch: Return with expression
+0:23        Construct uvec4 (temp 4-component vector of uint)
+0:23          packHalf2x16 (temp uint)
+0:23            Construct vec2 (temp 2-component vector of float)
+0:23              direct index (temp float)
+0:23                'inF0' (in 4-component vector of float)
+0:23                Constant:
+0:23                  0 (const int)
+0:23              Constant:
+0:23                0.000000
+0:23          packHalf2x16 (temp uint)
+0:23            Construct vec2 (temp 2-component vector of float)
+0:23              direct index (temp float)
+0:23                'inF0' (in 4-component vector of float)
+0:23                Constant:
+0:23                  1 (const int)
+0:23              Constant:
+0:23                0.000000
+0:23          packHalf2x16 (temp uint)
+0:23            Construct vec2 (temp 2-component vector of float)
+0:23              direct index (temp float)
+0:23                'inF0' (in 4-component vector of float)
+0:23                Constant:
+0:23                  2 (const int)
+0:23              Constant:
+0:23                0.000000
+0:23          packHalf2x16 (temp uint)
+0:23            Construct vec2 (temp 2-component vector of float)
+0:23              direct index (temp float)
+0:23                'inF0' (in 4-component vector of float)
+0:23                Constant:
+0:23                  3 (const int)
+0:23              Constant:
+0:23                0.000000
+0:27  Function Definition: @main( (temp 4-component vector of float)
+0:27    Function Parameters: 
+0:?     Sequence
+0:28      Branch: Return with expression
+0:28        Constant:
+0:28          0.000000
+0:28          0.000000
+0:28          0.000000
+0:28          0.000000
+0:27  Function Definition: main( (temp void)
+0:27    Function Parameters: 
+0:?     Sequence
+0:27      move second child to first child (temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:27        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: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:2  Function Definition: PixelShaderFunctionS(f1; (temp uint)
+0:2    Function Parameters: 
+0:2      'inF0' (in float)
+0:?     Sequence
+0:3      Branch: Return with expression
+0:3        packHalf2x16 (temp uint)
+0:3          Construct vec2 (temp 2-component vector of float)
+0:3            'inF0' (in float)
+0:3            Constant:
+0:3              0.000000
+0:7  Function Definition: PixelShaderFunction1(vf1; (temp 1-component vector of uint)
+0:7    Function Parameters: 
+0:7      'inF0' (in 1-component vector of float)
+0:?     Sequence
+0:8      Branch: Return with expression
+0:8        Construct uint (temp 1-component vector of uint)
+0:8          packHalf2x16 (temp uint)
+0:8            Construct vec2 (temp 2-component vector of float)
+0:8              Construct float (in float)
+0:8                'inF0' (in 1-component vector of float)
+0:8              Constant:
+0:8                0.000000
+0:12  Function Definition: PixelShaderFunction2(vf2; (temp 2-component vector of uint)
+0:12    Function Parameters: 
+0:12      'inF0' (in 2-component vector of float)
+0:?     Sequence
+0:13      Branch: Return with expression
+0:13        Construct uvec2 (temp 2-component vector of uint)
+0:13          packHalf2x16 (temp uint)
+0:13            Construct vec2 (temp 2-component vector of float)
+0:13              direct index (temp float)
+0:13                'inF0' (in 2-component vector of float)
+0:13                Constant:
+0:13                  0 (const int)
+0:13              Constant:
+0:13                0.000000
+0:13          packHalf2x16 (temp uint)
+0:13            Construct vec2 (temp 2-component vector of float)
+0:13              direct index (temp float)
+0:13                'inF0' (in 2-component vector of float)
+0:13                Constant:
+0:13                  1 (const int)
+0:13              Constant:
+0:13                0.000000
+0:17  Function Definition: PixelShaderFunction3(vf3; (temp 3-component vector of uint)
+0:17    Function Parameters: 
+0:17      'inF0' (in 3-component vector of float)
+0:?     Sequence
+0:18      Branch: Return with expression
+0:18        Construct uvec3 (temp 3-component vector of uint)
+0:18          packHalf2x16 (temp uint)
+0:18            Construct vec2 (temp 2-component vector of float)
+0:18              direct index (temp float)
+0:18                'inF0' (in 3-component vector of float)
+0:18                Constant:
+0:18                  0 (const int)
+0:18              Constant:
+0:18                0.000000
+0:18          packHalf2x16 (temp uint)
+0:18            Construct vec2 (temp 2-component vector of float)
+0:18              direct index (temp float)
+0:18                'inF0' (in 3-component vector of float)
+0:18                Constant:
+0:18                  1 (const int)
+0:18              Constant:
+0:18                0.000000
+0:18          packHalf2x16 (temp uint)
+0:18            Construct vec2 (temp 2-component vector of float)
+0:18              direct index (temp float)
+0:18                'inF0' (in 3-component vector of float)
+0:18                Constant:
+0:18                  2 (const int)
+0:18              Constant:
+0:18                0.000000
+0:22  Function Definition: PixelShaderFunction(vf4; (temp 4-component vector of uint)
+0:22    Function Parameters: 
+0:22      'inF0' (in 4-component vector of float)
+0:?     Sequence
+0:23      Branch: Return with expression
+0:23        Construct uvec4 (temp 4-component vector of uint)
+0:23          packHalf2x16 (temp uint)
+0:23            Construct vec2 (temp 2-component vector of float)
+0:23              direct index (temp float)
+0:23                'inF0' (in 4-component vector of float)
+0:23                Constant:
+0:23                  0 (const int)
+0:23              Constant:
+0:23                0.000000
+0:23          packHalf2x16 (temp uint)
+0:23            Construct vec2 (temp 2-component vector of float)
+0:23              direct index (temp float)
+0:23                'inF0' (in 4-component vector of float)
+0:23                Constant:
+0:23                  1 (const int)
+0:23              Constant:
+0:23                0.000000
+0:23          packHalf2x16 (temp uint)
+0:23            Construct vec2 (temp 2-component vector of float)
+0:23              direct index (temp float)
+0:23                'inF0' (in 4-component vector of float)
+0:23                Constant:
+0:23                  2 (const int)
+0:23              Constant:
+0:23                0.000000
+0:23          packHalf2x16 (temp uint)
+0:23            Construct vec2 (temp 2-component vector of float)
+0:23              direct index (temp float)
+0:23                'inF0' (in 4-component vector of float)
+0:23                Constant:
+0:23                  3 (const int)
+0:23              Constant:
+0:23                0.000000
+0:27  Function Definition: @main( (temp 4-component vector of float)
+0:27    Function Parameters: 
+0:?     Sequence
+0:28      Branch: Return with expression
+0:28        Constant:
+0:28          0.000000
+0:28          0.000000
+0:28          0.000000
+0:28          0.000000
+0:27  Function Definition: main( (temp void)
+0:27    Function Parameters: 
+0:?     Sequence
+0:27      move second child to first child (temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:27        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 10000
+// Generated by (magic number): 80001
+// Id's are bound by 106
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 104
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 11  "PixelShaderFunctionS(f1;"
+                              Name 10  "inF0"
+                              Name 14  "PixelShaderFunction1(vf1;"
+                              Name 13  "inF0"
+                              Name 21  "PixelShaderFunction2(vf2;"
+                              Name 20  "inF0"
+                              Name 28  "PixelShaderFunction3(vf3;"
+                              Name 27  "inF0"
+                              Name 35  "PixelShaderFunction(vf4;"
+                              Name 34  "inF0"
+                              Name 38  "@main("
+                              Name 104  "@entryPointOutput"
+                              Decorate 104(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypePointer Function 6(float)
+               8:             TypeInt 32 0
+               9:             TypeFunction 8(int) 7(ptr)
+              16:             TypeVector 6(float) 2
+              17:             TypePointer Function 16(fvec2)
+              18:             TypeVector 8(int) 2
+              19:             TypeFunction 18(ivec2) 17(ptr)
+              23:             TypeVector 6(float) 3
+              24:             TypePointer Function 23(fvec3)
+              25:             TypeVector 8(int) 3
+              26:             TypeFunction 25(ivec3) 24(ptr)
+              30:             TypeVector 6(float) 4
+              31:             TypePointer Function 30(fvec4)
+              32:             TypeVector 8(int) 4
+              33:             TypeFunction 32(ivec4) 31(ptr)
+              37:             TypeFunction 30(fvec4)
+              41:    6(float) Constant 0
+              51:      8(int) Constant 0
+              56:      8(int) Constant 1
+              72:      8(int) Constant 2
+              92:      8(int) Constant 3
+             100:   30(fvec4) ConstantComposite 41 41 41 41
+             103:             TypePointer Output 30(fvec4)
+104(@entryPointOutput):    103(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+             105:   30(fvec4) FunctionCall 38(@main()
+                              Store 104(@entryPointOutput) 105
+                              Return
+                              FunctionEnd
+11(PixelShaderFunctionS(f1;):      8(int) Function None 9
+        10(inF0):      7(ptr) FunctionParameter
+              12:             Label
+              40:    6(float) Load 10(inF0)
+              42:   16(fvec2) CompositeConstruct 40 41
+              43:      8(int) ExtInst 1(GLSL.std.450) 58(PackHalf2x16) 42
+                              ReturnValue 43
+                              FunctionEnd
+14(PixelShaderFunction1(vf1;):      8(int) Function None 9
+        13(inF0):      7(ptr) FunctionParameter
+              15:             Label
+              46:    6(float) Load 13(inF0)
+              47:   16(fvec2) CompositeConstruct 46 41
+              48:      8(int) ExtInst 1(GLSL.std.450) 58(PackHalf2x16) 47
+                              ReturnValue 48
+                              FunctionEnd
+21(PixelShaderFunction2(vf2;):   18(ivec2) Function None 19
+        20(inF0):     17(ptr) FunctionParameter
+              22:             Label
+              52:      7(ptr) AccessChain 20(inF0) 51
+              53:    6(float) Load 52
+              54:   16(fvec2) CompositeConstruct 53 41
+              55:      8(int) ExtInst 1(GLSL.std.450) 58(PackHalf2x16) 54
+              57:      7(ptr) AccessChain 20(inF0) 56
+              58:    6(float) Load 57
+              59:   16(fvec2) CompositeConstruct 58 41
+              60:      8(int) ExtInst 1(GLSL.std.450) 58(PackHalf2x16) 59
+              61:   18(ivec2) CompositeConstruct 55 60
+                              ReturnValue 61
+                              FunctionEnd
+28(PixelShaderFunction3(vf3;):   25(ivec3) Function None 26
+        27(inF0):     24(ptr) FunctionParameter
+              29:             Label
+              64:      7(ptr) AccessChain 27(inF0) 51
+              65:    6(float) Load 64
+              66:   16(fvec2) CompositeConstruct 65 41
+              67:      8(int) ExtInst 1(GLSL.std.450) 58(PackHalf2x16) 66
+              68:      7(ptr) AccessChain 27(inF0) 56
+              69:    6(float) Load 68
+              70:   16(fvec2) CompositeConstruct 69 41
+              71:      8(int) ExtInst 1(GLSL.std.450) 58(PackHalf2x16) 70
+              73:      7(ptr) AccessChain 27(inF0) 72
+              74:    6(float) Load 73
+              75:   16(fvec2) CompositeConstruct 74 41
+              76:      8(int) ExtInst 1(GLSL.std.450) 58(PackHalf2x16) 75
+              77:   25(ivec3) CompositeConstruct 67 71 76
+                              ReturnValue 77
+                              FunctionEnd
+35(PixelShaderFunction(vf4;):   32(ivec4) Function None 33
+        34(inF0):     31(ptr) FunctionParameter
+              36:             Label
+              80:      7(ptr) AccessChain 34(inF0) 51
+              81:    6(float) Load 80
+              82:   16(fvec2) CompositeConstruct 81 41
+              83:      8(int) ExtInst 1(GLSL.std.450) 58(PackHalf2x16) 82
+              84:      7(ptr) AccessChain 34(inF0) 56
+              85:    6(float) Load 84
+              86:   16(fvec2) CompositeConstruct 85 41
+              87:      8(int) ExtInst 1(GLSL.std.450) 58(PackHalf2x16) 86
+              88:      7(ptr) AccessChain 34(inF0) 72
+              89:    6(float) Load 88
+              90:   16(fvec2) CompositeConstruct 89 41
+              91:      8(int) ExtInst 1(GLSL.std.450) 58(PackHalf2x16) 90
+              93:      7(ptr) AccessChain 34(inF0) 92
+              94:    6(float) Load 93
+              95:   16(fvec2) CompositeConstruct 94 41
+              96:      8(int) ExtInst 1(GLSL.std.450) 58(PackHalf2x16) 95
+              97:   32(ivec4) CompositeConstruct 83 87 91 96
+                              ReturnValue 97
+                              FunctionEnd
+      38(@main():   30(fvec4) Function None 37
+              39:             Label
+                              ReturnValue 100
+                              FunctionEnd

+ 181 - 37
3rdparty/glslang/Test/baseResults/hlsl.intrinsics.negative.frag.out

@@ -1,6 +1,5 @@
 hlsl.intrinsics.negative.frag
 hlsl.intrinsics.negative.frag
 ERROR: 0:10: 'determinant' : no matching overloaded function found 
 ERROR: 0:10: 'determinant' : no matching overloaded function found 
-ERROR: 0:12: 'f32tof16' : unimplemented intrinsic: handle natively 
 ERROR: 0:23: 'length' : ambiguous best function under implicit type conversion 
 ERROR: 0:23: 'length' : ambiguous best function under implicit type conversion 
 ERROR: 0:25: 'normalize' : ambiguous best function under implicit type conversion 
 ERROR: 0:25: 'normalize' : ambiguous best function under implicit type conversion 
 ERROR: 0:26: 'reflect' : ambiguous best function under implicit type conversion 
 ERROR: 0:26: 'reflect' : ambiguous best function under implicit type conversion 
@@ -13,16 +12,13 @@ ERROR: 0:47: 'CheckAccessFullyMapped' : no matching overloaded function found
 ERROR: 0:49: 'cross' : no matching overloaded function found 
 ERROR: 0:49: 'cross' : no matching overloaded function found 
 ERROR: 0:50: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
 ERROR: 0:50: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
 ERROR: 0:51: 'determinant' : no matching overloaded function found 
 ERROR: 0:51: 'determinant' : no matching overloaded function found 
-ERROR: 0:52: 'f32tof16' : unimplemented intrinsic: handle natively 
 ERROR: 0:57: 'transpose' : no matching overloaded function found 
 ERROR: 0:57: 'transpose' : no matching overloaded function found 
 ERROR: 0:64: 'CheckAccessFullyMapped' : no matching overloaded function found 
 ERROR: 0:64: 'CheckAccessFullyMapped' : no matching overloaded function found 
 ERROR: 0:66: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
 ERROR: 0:66: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
 ERROR: 0:67: 'determinant' : no matching overloaded function found 
 ERROR: 0:67: 'determinant' : no matching overloaded function found 
-ERROR: 0:68: 'f32tof16' : unimplemented intrinsic: handle natively 
 ERROR: 0:73: 'transpose' : no matching overloaded function found 
 ERROR: 0:73: 'transpose' : no matching overloaded function found 
 ERROR: 0:81: 'CheckAccessFullyMapped' : no matching overloaded function found 
 ERROR: 0:81: 'CheckAccessFullyMapped' : no matching overloaded function found 
 ERROR: 0:84: 'determinant' : no matching overloaded function found 
 ERROR: 0:84: 'determinant' : no matching overloaded function found 
-ERROR: 0:85: 'f32tof16' : unimplemented intrinsic: handle natively 
 ERROR: 0:90: 'transpose' : no matching overloaded function found 
 ERROR: 0:90: 'transpose' : no matching overloaded function found 
 ERROR: 0:117: 'countbits' : no matching overloaded function found 
 ERROR: 0:117: 'countbits' : no matching overloaded function found 
 ERROR: 0:117: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
 ERROR: 0:117: 'D3DCOLORtoUBYTE4' : no matching overloaded function found 
@@ -63,7 +59,7 @@ ERROR: 0:133: 'normalize' : no matching overloaded function found
 ERROR: 0:133: 'reflect' : no matching overloaded function found 
 ERROR: 0:133: 'reflect' : no matching overloaded function found 
 ERROR: 0:133: 'refract' : no matching overloaded function found 
 ERROR: 0:133: 'refract' : no matching overloaded function found 
 ERROR: 0:133: 'reversebits' : no matching overloaded function found 
 ERROR: 0:133: 'reversebits' : no matching overloaded function found 
-ERROR: 64 compilation errors.  No code generated.
+ERROR: 60 compilation errors.  No code generated.
 
 
 
 
 Shader version: 450
 Shader version: 450
@@ -111,10 +107,12 @@ ERROR: node is still EOpNull!
 0:9                3 (const int)
 0:9                3 (const int)
 0:10      Constant:
 0:10      Constant:
 0:10        0.000000
 0:10        0.000000
-0:12      ERROR: Bad unary op
- (temp float)
-0:12        Convert float to uint (temp uint)
-0:12          'inF0' (in float)
+0:12      direct index (temp float)
+0:12        unpackHalf2x16 (temp 2-component vector of float)
+0:12          Convert float to uint (temp uint)
+0:12            'inF0' (in float)
+0:12        Constant:
+0:12          0 (const int)
 0:13      findMSB (temp uint)
 0:13      findMSB (temp uint)
 0:13        Convert float to uint (temp uint)
 0:13        Convert float to uint (temp uint)
 0:13          'inF0' (in float)
 0:13          'inF0' (in float)
@@ -195,10 +193,25 @@ ERROR: node is still EOpNull!
 0:50        0.000000
 0:50        0.000000
 0:51      Constant:
 0:51      Constant:
 0:51        0.000000
 0:51        0.000000
-0:52      ERROR: Bad unary op
- (temp 2-component vector of float)
-0:52        Convert float to uint (temp 2-component vector of uint)
-0:52          'inF0' (in 2-component vector of float)
+0:52      Construct vec2 (temp 2-component vector of float)
+0:52        direct index (temp float)
+0:52          unpackHalf2x16 (temp 2-component vector of float)
+0:52            direct index (temp uint)
+0:52              Convert float to uint (temp 2-component vector of uint)
+0:52                'inF0' (in 2-component vector of float)
+0:52              Constant:
+0:52                0 (const int)
+0:52          Constant:
+0:52            0 (const int)
+0:52        direct index (temp float)
+0:52          unpackHalf2x16 (temp 2-component vector of float)
+0:52            direct index (temp uint)
+0:52              Convert float to uint (temp 2-component vector of uint)
+0:52                'inF0' (in 2-component vector of float)
+0:52              Constant:
+0:52                1 (const int)
+0:52          Constant:
+0:52            0 (const int)
 0:53      findMSB (temp 2-component vector of uint)
 0:53      findMSB (temp 2-component vector of uint)
 0:53        Convert float to uint (temp 2-component vector of uint)
 0:53        Convert float to uint (temp 2-component vector of uint)
 0:53          'inF0' (in 2-component vector of float)
 0:53          'inF0' (in 2-component vector of float)
@@ -230,10 +243,34 @@ ERROR: node is still EOpNull!
 0:66        0.000000
 0:66        0.000000
 0:67      Constant:
 0:67      Constant:
 0:67        0.000000
 0:67        0.000000
-0:68      ERROR: Bad unary op
- (temp 3-component vector of float)
-0:68        Convert float to uint (temp 3-component vector of uint)
-0:68          'inF0' (in 3-component vector of float)
+0:68      Construct vec3 (temp 3-component vector of float)
+0:68        direct index (temp float)
+0:68          unpackHalf2x16 (temp 2-component vector of float)
+0:68            direct index (temp uint)
+0:68              Convert float to uint (temp 3-component vector of uint)
+0:68                'inF0' (in 3-component vector of float)
+0:68              Constant:
+0:68                0 (const int)
+0:68          Constant:
+0:68            0 (const int)
+0:68        direct index (temp float)
+0:68          unpackHalf2x16 (temp 2-component vector of float)
+0:68            direct index (temp uint)
+0:68              Convert float to uint (temp 3-component vector of uint)
+0:68                'inF0' (in 3-component vector of float)
+0:68              Constant:
+0:68                1 (const int)
+0:68          Constant:
+0:68            0 (const int)
+0:68        direct index (temp float)
+0:68          unpackHalf2x16 (temp 2-component vector of float)
+0:68            direct index (temp uint)
+0:68              Convert float to uint (temp 3-component vector of uint)
+0:68                'inF0' (in 3-component vector of float)
+0:68              Constant:
+0:68                2 (const int)
+0:68          Constant:
+0:68            0 (const int)
 0:69      findMSB (temp 3-component vector of uint)
 0:69      findMSB (temp 3-component vector of uint)
 0:69        Convert float to uint (temp 3-component vector of uint)
 0:69        Convert float to uint (temp 3-component vector of uint)
 0:69          'inF0' (in 3-component vector of float)
 0:69          'inF0' (in 3-component vector of float)
@@ -269,10 +306,43 @@ ERROR: node is still EOpNull!
 0:83          'inF1' (in 4-component vector of float)
 0:83          'inF1' (in 4-component vector of float)
 0:84      Constant:
 0:84      Constant:
 0:84        0.000000
 0:84        0.000000
-0:85      ERROR: Bad unary op
- (temp 4-component vector of float)
-0:85        Convert float to uint (temp 4-component vector of uint)
-0:85          'inF0' (in 4-component vector of float)
+0:85      Construct vec4 (temp 4-component vector of float)
+0:85        direct index (temp float)
+0:85          unpackHalf2x16 (temp 2-component vector of float)
+0:85            direct index (temp uint)
+0:85              Convert float to uint (temp 4-component vector of uint)
+0:85                'inF0' (in 4-component vector of float)
+0:85              Constant:
+0:85                0 (const int)
+0:85          Constant:
+0:85            0 (const int)
+0:85        direct index (temp float)
+0:85          unpackHalf2x16 (temp 2-component vector of float)
+0:85            direct index (temp uint)
+0:85              Convert float to uint (temp 4-component vector of uint)
+0:85                'inF0' (in 4-component vector of float)
+0:85              Constant:
+0:85                1 (const int)
+0:85          Constant:
+0:85            0 (const int)
+0:85        direct index (temp float)
+0:85          unpackHalf2x16 (temp 2-component vector of float)
+0:85            direct index (temp uint)
+0:85              Convert float to uint (temp 4-component vector of uint)
+0:85                'inF0' (in 4-component vector of float)
+0:85              Constant:
+0:85                2 (const int)
+0:85          Constant:
+0:85            0 (const int)
+0:85        direct index (temp float)
+0:85          unpackHalf2x16 (temp 2-component vector of float)
+0:85            direct index (temp uint)
+0:85              Convert float to uint (temp 4-component vector of uint)
+0:85                'inF0' (in 4-component vector of float)
+0:85              Constant:
+0:85                3 (const int)
+0:85          Constant:
+0:85            0 (const int)
 0:86      findMSB (temp 4-component vector of uint)
 0:86      findMSB (temp 4-component vector of uint)
 0:86        Convert float to uint (temp 4-component vector of uint)
 0:86        Convert float to uint (temp 4-component vector of uint)
 0:86          'inF0' (in 4-component vector of float)
 0:86          'inF0' (in 4-component vector of float)
@@ -499,10 +569,12 @@ ERROR: node is still EOpNull!
 0:9                3 (const int)
 0:9                3 (const int)
 0:10      Constant:
 0:10      Constant:
 0:10        0.000000
 0:10        0.000000
-0:12      ERROR: Bad unary op
- (temp float)
-0:12        Convert float to uint (temp uint)
-0:12          'inF0' (in float)
+0:12      direct index (temp float)
+0:12        unpackHalf2x16 (temp 2-component vector of float)
+0:12          Convert float to uint (temp uint)
+0:12            'inF0' (in float)
+0:12        Constant:
+0:12          0 (const int)
 0:13      findMSB (temp uint)
 0:13      findMSB (temp uint)
 0:13        Convert float to uint (temp uint)
 0:13        Convert float to uint (temp uint)
 0:13          'inF0' (in float)
 0:13          'inF0' (in float)
@@ -583,10 +655,25 @@ ERROR: node is still EOpNull!
 0:50        0.000000
 0:50        0.000000
 0:51      Constant:
 0:51      Constant:
 0:51        0.000000
 0:51        0.000000
-0:52      ERROR: Bad unary op
- (temp 2-component vector of float)
-0:52        Convert float to uint (temp 2-component vector of uint)
-0:52          'inF0' (in 2-component vector of float)
+0:52      Construct vec2 (temp 2-component vector of float)
+0:52        direct index (temp float)
+0:52          unpackHalf2x16 (temp 2-component vector of float)
+0:52            direct index (temp uint)
+0:52              Convert float to uint (temp 2-component vector of uint)
+0:52                'inF0' (in 2-component vector of float)
+0:52              Constant:
+0:52                0 (const int)
+0:52          Constant:
+0:52            0 (const int)
+0:52        direct index (temp float)
+0:52          unpackHalf2x16 (temp 2-component vector of float)
+0:52            direct index (temp uint)
+0:52              Convert float to uint (temp 2-component vector of uint)
+0:52                'inF0' (in 2-component vector of float)
+0:52              Constant:
+0:52                1 (const int)
+0:52          Constant:
+0:52            0 (const int)
 0:53      findMSB (temp 2-component vector of uint)
 0:53      findMSB (temp 2-component vector of uint)
 0:53        Convert float to uint (temp 2-component vector of uint)
 0:53        Convert float to uint (temp 2-component vector of uint)
 0:53          'inF0' (in 2-component vector of float)
 0:53          'inF0' (in 2-component vector of float)
@@ -618,10 +705,34 @@ ERROR: node is still EOpNull!
 0:66        0.000000
 0:66        0.000000
 0:67      Constant:
 0:67      Constant:
 0:67        0.000000
 0:67        0.000000
-0:68      ERROR: Bad unary op
- (temp 3-component vector of float)
-0:68        Convert float to uint (temp 3-component vector of uint)
-0:68          'inF0' (in 3-component vector of float)
+0:68      Construct vec3 (temp 3-component vector of float)
+0:68        direct index (temp float)
+0:68          unpackHalf2x16 (temp 2-component vector of float)
+0:68            direct index (temp uint)
+0:68              Convert float to uint (temp 3-component vector of uint)
+0:68                'inF0' (in 3-component vector of float)
+0:68              Constant:
+0:68                0 (const int)
+0:68          Constant:
+0:68            0 (const int)
+0:68        direct index (temp float)
+0:68          unpackHalf2x16 (temp 2-component vector of float)
+0:68            direct index (temp uint)
+0:68              Convert float to uint (temp 3-component vector of uint)
+0:68                'inF0' (in 3-component vector of float)
+0:68              Constant:
+0:68                1 (const int)
+0:68          Constant:
+0:68            0 (const int)
+0:68        direct index (temp float)
+0:68          unpackHalf2x16 (temp 2-component vector of float)
+0:68            direct index (temp uint)
+0:68              Convert float to uint (temp 3-component vector of uint)
+0:68                'inF0' (in 3-component vector of float)
+0:68              Constant:
+0:68                2 (const int)
+0:68          Constant:
+0:68            0 (const int)
 0:69      findMSB (temp 3-component vector of uint)
 0:69      findMSB (temp 3-component vector of uint)
 0:69        Convert float to uint (temp 3-component vector of uint)
 0:69        Convert float to uint (temp 3-component vector of uint)
 0:69          'inF0' (in 3-component vector of float)
 0:69          'inF0' (in 3-component vector of float)
@@ -657,10 +768,43 @@ ERROR: node is still EOpNull!
 0:83          'inF1' (in 4-component vector of float)
 0:83          'inF1' (in 4-component vector of float)
 0:84      Constant:
 0:84      Constant:
 0:84        0.000000
 0:84        0.000000
-0:85      ERROR: Bad unary op
- (temp 4-component vector of float)
-0:85        Convert float to uint (temp 4-component vector of uint)
-0:85          'inF0' (in 4-component vector of float)
+0:85      Construct vec4 (temp 4-component vector of float)
+0:85        direct index (temp float)
+0:85          unpackHalf2x16 (temp 2-component vector of float)
+0:85            direct index (temp uint)
+0:85              Convert float to uint (temp 4-component vector of uint)
+0:85                'inF0' (in 4-component vector of float)
+0:85              Constant:
+0:85                0 (const int)
+0:85          Constant:
+0:85            0 (const int)
+0:85        direct index (temp float)
+0:85          unpackHalf2x16 (temp 2-component vector of float)
+0:85            direct index (temp uint)
+0:85              Convert float to uint (temp 4-component vector of uint)
+0:85                'inF0' (in 4-component vector of float)
+0:85              Constant:
+0:85                1 (const int)
+0:85          Constant:
+0:85            0 (const int)
+0:85        direct index (temp float)
+0:85          unpackHalf2x16 (temp 2-component vector of float)
+0:85            direct index (temp uint)
+0:85              Convert float to uint (temp 4-component vector of uint)
+0:85                'inF0' (in 4-component vector of float)
+0:85              Constant:
+0:85                2 (const int)
+0:85          Constant:
+0:85            0 (const int)
+0:85        direct index (temp float)
+0:85          unpackHalf2x16 (temp 2-component vector of float)
+0:85            direct index (temp uint)
+0:85              Convert float to uint (temp 4-component vector of uint)
+0:85                'inF0' (in 4-component vector of float)
+0:85              Constant:
+0:85                3 (const int)
+0:85          Constant:
+0:85            0 (const int)
 0:86      findMSB (temp 4-component vector of uint)
 0:86      findMSB (temp 4-component vector of uint)
 0:86        Convert float to uint (temp 4-component vector of uint)
 0:86        Convert float to uint (temp 4-component vector of uint)
 0:86          'inF0' (in 4-component vector of float)
 0:86          'inF0' (in 4-component vector of float)

+ 92 - 39
3rdparty/glslang/Test/baseResults/hlsl.numericsuffixes.frag.out

@@ -50,16 +50,36 @@ gl_FragCoord origin is upper left
 0:15          'r08' (temp uint)
 0:15          'r08' (temp uint)
 0:15          Constant:
 0:15          Constant:
 0:15            58 (const uint)
 0:15            58 (const uint)
-0:18      move second child to first child (temp 4-component vector of float)
-0:18        color: direct index for structure (temp 4-component vector of float)
-0:18          'ps_output' (temp structure{temp 4-component vector of float color})
+0:16      Sequence
+0:16        move second child to first child (temp float)
+0:16          'r09' (temp float)
+0:16          Constant:
+0:16            1.000000
+0:17      Sequence
+0:17        move second child to first child (temp float)
+0:17          'r10' (temp float)
+0:17          Constant:
+0:17            1.000000
+0:18      Sequence
+0:18        move second child to first child (temp float)
+0:18          'r11' (temp float)
 0:18          Constant:
 0:18          Constant:
-0:18            0 (const int)
-0:18        Construct vec4 (temp 4-component vector of float)
-0:18          Convert int to float (temp float)
-0:18            'r07' (temp int)
-0:19      Branch: Return with expression
-0:19        'ps_output' (temp structure{temp 4-component vector of float color})
+0:18            1.100000
+0:19      Sequence
+0:19        move second child to first child (temp float)
+0:19          'r12' (temp float)
+0:19          Constant:
+0:19            1.100000
+0:22      move second child to first child (temp 4-component vector of float)
+0:22        color: direct index for structure (temp 4-component vector of float)
+0:22          'ps_output' (temp structure{temp 4-component vector of float color})
+0:22          Constant:
+0:22            0 (const int)
+0:22        Construct vec4 (temp 4-component vector of float)
+0:22          Convert int to float (temp float)
+0:22            'r07' (temp int)
+0:23      Branch: Return with expression
+0:23        'ps_output' (temp structure{temp 4-component vector of float color})
 0:5  Function Definition: main( (temp void)
 0:5  Function Definition: main( (temp void)
 0:5    Function Parameters: 
 0:5    Function Parameters: 
 0:?     Sequence
 0:?     Sequence
@@ -128,16 +148,36 @@ gl_FragCoord origin is upper left
 0:15          'r08' (temp uint)
 0:15          'r08' (temp uint)
 0:15          Constant:
 0:15          Constant:
 0:15            58 (const uint)
 0:15            58 (const uint)
-0:18      move second child to first child (temp 4-component vector of float)
-0:18        color: direct index for structure (temp 4-component vector of float)
-0:18          'ps_output' (temp structure{temp 4-component vector of float color})
+0:16      Sequence
+0:16        move second child to first child (temp float)
+0:16          'r09' (temp float)
+0:16          Constant:
+0:16            1.000000
+0:17      Sequence
+0:17        move second child to first child (temp float)
+0:17          'r10' (temp float)
+0:17          Constant:
+0:17            1.000000
+0:18      Sequence
+0:18        move second child to first child (temp float)
+0:18          'r11' (temp float)
 0:18          Constant:
 0:18          Constant:
-0:18            0 (const int)
-0:18        Construct vec4 (temp 4-component vector of float)
-0:18          Convert int to float (temp float)
-0:18            'r07' (temp int)
-0:19      Branch: Return with expression
-0:19        'ps_output' (temp structure{temp 4-component vector of float color})
+0:18            1.100000
+0:19      Sequence
+0:19        move second child to first child (temp float)
+0:19          'r12' (temp float)
+0:19          Constant:
+0:19            1.100000
+0:22      move second child to first child (temp 4-component vector of float)
+0:22        color: direct index for structure (temp 4-component vector of float)
+0:22          'ps_output' (temp structure{temp 4-component vector of float color})
+0:22          Constant:
+0:22            0 (const int)
+0:22        Construct vec4 (temp 4-component vector of float)
+0:22          Convert int to float (temp float)
+0:22            'r07' (temp int)
+0:23      Branch: Return with expression
+0:23        'ps_output' (temp structure{temp 4-component vector of float color})
 0:5  Function Definition: main( (temp void)
 0:5  Function Definition: main( (temp void)
 0:5    Function Parameters: 
 0:5    Function Parameters: 
 0:?     Sequence
 0:?     Sequence
@@ -153,12 +193,12 @@ gl_FragCoord origin is upper left
 
 
 // Module Version 10000
 // Module Version 10000
 // Generated by (magic number): 80001
 // Generated by (magic number): 80001
-// Id's are bound by 49
+// Id's are bound by 54
 
 
                               Capability Shader
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 46
+                              EntryPoint Fragment 4  "main" 51
                               ExecutionMode 4 OriginUpperLeft
                               ExecutionMode 4 OriginUpperLeft
                               Name 4  "main"
                               Name 4  "main"
                               Name 8  "PS_OUTPUT"
                               Name 8  "PS_OUTPUT"
@@ -173,9 +213,13 @@ gl_FragCoord origin is upper left
                               Name 28  "r06"
                               Name 28  "r06"
                               Name 30  "r07"
                               Name 30  "r07"
                               Name 32  "r08"
                               Name 32  "r08"
-                              Name 35  "ps_output"
-                              Name 46  "color"
-                              Decorate 46(color) Location 0
+                              Name 34  "r09"
+                              Name 35  "r10"
+                              Name 36  "r11"
+                              Name 38  "r12"
+                              Name 40  "ps_output"
+                              Name 51  "color"
+                              Decorate 51(color) Location 0
                2:             TypeVoid
                2:             TypeVoid
                3:             TypeFunction 2
                3:             TypeFunction 2
                6:             TypeFloat 32
                6:             TypeFloat 32
@@ -195,16 +239,17 @@ gl_FragCoord origin is upper left
               29:     24(int) Constant 6
               29:     24(int) Constant 6
               31:     24(int) Constant 57
               31:     24(int) Constant 57
               33:     15(int) Constant 58
               33:     15(int) Constant 58
-              34:             TypePointer Function 8(PS_OUTPUT)
-              36:     24(int) Constant 0
-              40:             TypePointer Function 7(fvec4)
-              45:             TypePointer Output 7(fvec4)
-       46(color):     45(ptr) Variable Output
+              37:    6(float) Constant 1066192077
+              39:             TypePointer Function 8(PS_OUTPUT)
+              41:     24(int) Constant 0
+              45:             TypePointer Function 7(fvec4)
+              50:             TypePointer Output 7(fvec4)
+       51(color):     50(ptr) Variable Output
          4(main):           2 Function None 3
          4(main):           2 Function None 3
                5:             Label
                5:             Label
-              47:8(PS_OUTPUT) FunctionCall 10(@main()
-              48:    7(fvec4) CompositeExtract 47 0
-                              Store 46(color) 48
+              52:8(PS_OUTPUT) FunctionCall 10(@main()
+              53:    7(fvec4) CompositeExtract 52 0
+                              Store 51(color) 53
                               Return
                               Return
                               FunctionEnd
                               FunctionEnd
       10(@main():8(PS_OUTPUT) Function None 9
       10(@main():8(PS_OUTPUT) Function None 9
@@ -218,7 +263,11 @@ gl_FragCoord origin is upper left
          28(r06):     25(ptr) Variable Function
          28(r06):     25(ptr) Variable Function
          30(r07):     25(ptr) Variable Function
          30(r07):     25(ptr) Variable Function
          32(r08):     16(ptr) Variable Function
          32(r08):     16(ptr) Variable Function
-   35(ps_output):     34(ptr) Variable Function
+         34(r09):     12(ptr) Variable Function
+         35(r10):     12(ptr) Variable Function
+         36(r11):     12(ptr) Variable Function
+         38(r12):     12(ptr) Variable Function
+   40(ps_output):     39(ptr) Variable Function
                               Store 13(r00) 14
                               Store 13(r00) 14
                               Store 17(r01) 18
                               Store 17(r01) 18
                               Store 19(r02) 20
                               Store 19(r02) 20
@@ -228,11 +277,15 @@ gl_FragCoord origin is upper left
                               Store 28(r06) 29
                               Store 28(r06) 29
                               Store 30(r07) 31
                               Store 30(r07) 31
                               Store 32(r08) 33
                               Store 32(r08) 33
-              37:     24(int) Load 30(r07)
-              38:    6(float) ConvertSToF 37
-              39:    7(fvec4) CompositeConstruct 38 38 38 38
-              41:     40(ptr) AccessChain 35(ps_output) 36
-                              Store 41 39
-              42:8(PS_OUTPUT) Load 35(ps_output)
-                              ReturnValue 42
+                              Store 34(r09) 14
+                              Store 35(r10) 14
+                              Store 36(r11) 37
+                              Store 38(r12) 37
+              42:     24(int) Load 30(r07)
+              43:    6(float) ConvertSToF 42
+              44:    7(fvec4) CompositeConstruct 43 43 43 43
+              46:     45(ptr) AccessChain 40(ps_output) 41
+                              Store 46 44
+              47:8(PS_OUTPUT) Load 40(ps_output)
+                              ReturnValue 47
                               FunctionEnd
                               FunctionEnd

+ 308 - 282
3rdparty/glslang/Test/baseResults/hlsl.struct.frag.out

@@ -6,104 +6,110 @@ WARNING: 0:30: 'register' : ignoring shader_profile
 Shader version: 450
 Shader version: 450
 gl_FragCoord origin is upper left
 gl_FragCoord origin is upper left
 0:? Sequence
 0:? Sequence
-0:34  Function Definition: @PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; (temp 4-component vector of float)
-0:34    Function Parameters: 
-0:34      'input' (in 4-component vector of float)
-0:34      's' (in structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40  Function Definition: @PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; (temp 4-component vector of float)
+0:40    Function Parameters: 
+0:40      'input' (in 4-component vector of float)
+0:40      's' (in structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?     Sequence
 0:?     Sequence
-0:39      Compare Equal (temp bool)
-0:39        's3' (temp structure{temp 3-component vector of bool b3})
-0:39        's3' (temp structure{temp 3-component vector of bool b3})
-0:40      move second child to first child (temp 4-component vector of float)
-0:40        i: direct index for structure (temp 4-component vector of float)
-0:40          's2' (global structure{temp 4-component vector of float i})
-0:40          Constant:
-0:40            0 (const int)
-0:40        ff4: direct index for structure (temp 4-component vector of float)
-0:40          's' (in structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:40          Constant:
-0:40            7 (const int)
-0:42      Branch: Return with expression
-0:42        'input' (in 4-component vector of float)
-0:34  Function Definition: PixelShaderFunction( (temp void)
-0:34    Function Parameters: 
+0:45      Compare Equal (temp bool)
+0:45        's3' (temp structure{temp 3-component vector of bool b3})
+0:45        's3' (temp structure{temp 3-component vector of bool b3})
+0:46      move second child to first child (temp 4-component vector of float)
+0:46        i: direct index for structure (temp 4-component vector of float)
+0:46          's2' (global structure{temp 4-component vector of float i})
+0:46          Constant:
+0:46            0 (const int)
+0:46        ff4: direct index for structure (temp 4-component vector of float)
+0:46          's' (in structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:46          Constant:
+0:46            7 (const int)
+0:50      move second child to first child (temp structure{})
+0:50        'e' (temp structure{})
+0:50        e: direct index for structure (temp structure{})
+0:50          'ce' (temp structure{temp structure{} e})
+0:50          Constant:
+0:50            0 (const int)
+0:52      Branch: Return with expression
+0:52        'input' (in 4-component vector of float)
+0:40  Function Definition: PixelShaderFunction( (temp void)
+0:40    Function Parameters: 
 0:?     Sequence
 0:?     Sequence
-0:34      move second child to first child (temp 4-component vector of float)
+0:40      move second child to first child (temp 4-component vector of float)
 0:?         'input' (temp 4-component vector of float)
 0:?         'input' (temp 4-component vector of float)
 0:?         'input' (layout(location=0 ) in 4-component vector of float)
 0:?         'input' (layout(location=0 ) in 4-component vector of float)
-0:34      Sequence
-0:34        move second child to first child (temp 4-component vector of float)
-0:34          a: direct index for structure (temp 4-component vector of float)
+0:40      Sequence
+0:40        move second child to first child (temp 4-component vector of float)
+0:40          a: direct index for structure (temp 4-component vector of float)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              0 (const int)
-0:34          a: direct index for structure (smooth temp 4-component vector of float)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              0 (const int)
-0:34        move second child to first child (temp bool)
-0:34          b: direct index for structure (temp bool)
+0:40            Constant:
+0:40              0 (const int)
+0:40          a: direct index for structure (smooth temp 4-component vector of float)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              0 (const int)
+0:40        move second child to first child (temp bool)
+0:40          b: direct index for structure (temp bool)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              1 (const int)
-0:34          b: direct index for structure (flat temp bool)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              1 (const int)
-0:34        move second child to first child (temp 1-component vector of float)
-0:34          c: direct index for structure (temp 1-component vector of float)
+0:40            Constant:
+0:40              1 (const int)
+0:40          b: direct index for structure (flat temp bool)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              1 (const int)
+0:40        move second child to first child (temp 1-component vector of float)
+0:40          c: direct index for structure (temp 1-component vector of float)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              2 (const int)
-0:34          c: direct index for structure (centroid noperspective temp 1-component vector of float)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              2 (const int)
-0:34        move second child to first child (temp 2-component vector of float)
-0:34          d: direct index for structure (temp 2-component vector of float)
+0:40            Constant:
+0:40              2 (const int)
+0:40          c: direct index for structure (centroid noperspective temp 1-component vector of float)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              2 (const int)
+0:40        move second child to first child (temp 2-component vector of float)
+0:40          d: direct index for structure (temp 2-component vector of float)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              3 (const int)
-0:34          d: direct index for structure (centroid sample temp 2-component vector of float)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              3 (const int)
-0:34        move second child to first child (temp bool)
-0:34          ff1: direct index for structure (temp bool)
+0:40            Constant:
+0:40              3 (const int)
+0:40          d: direct index for structure (centroid sample temp 2-component vector of float)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              3 (const int)
+0:40        move second child to first child (temp bool)
+0:40          ff1: direct index for structure (temp bool)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              4 (const int)
+0:40            Constant:
+0:40              4 (const int)
 0:?           's_ff1' (in bool Face)
 0:?           's_ff1' (in bool Face)
-0:34        move second child to first child (temp bool)
-0:34          ff2: direct index for structure (temp bool)
+0:40        move second child to first child (temp bool)
+0:40          ff2: direct index for structure (temp bool)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              5 (const int)
-0:34          ff2: direct index for structure (temp bool)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              4 (const int)
-0:34        move second child to first child (temp bool)
-0:34          ff3: direct index for structure (temp bool)
+0:40            Constant:
+0:40              5 (const int)
+0:40          ff2: direct index for structure (temp bool)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              4 (const int)
+0:40        move second child to first child (temp bool)
+0:40          ff3: direct index for structure (temp bool)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              6 (const int)
-0:34          ff3: direct index for structure (temp bool)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              5 (const int)
-0:34        move second child to first child (temp 4-component vector of float)
-0:34          ff4: direct index for structure (temp 4-component vector of float)
+0:40            Constant:
+0:40              6 (const int)
+0:40          ff3: direct index for structure (temp bool)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              5 (const int)
+0:40        move second child to first child (temp 4-component vector of float)
+0:40          ff4: direct index for structure (temp 4-component vector of float)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              7 (const int)
-0:34          ff4: direct index for structure (temp 4-component vector of float)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              6 (const int)
-0:34      move second child to first child (temp 4-component vector of float)
+0:40            Constant:
+0:40              7 (const int)
+0:40          ff4: direct index for structure (temp 4-component vector of float)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              6 (const int)
+0:40      move second child to first child (temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
-0:34        Function Call: @PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; (temp 4-component vector of float)
+0:40        Function Call: @PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; (temp 4-component vector of float)
 0:?           'input' (temp 4-component vector of float)
 0:?           'input' (temp 4-component vector of float)
 0:?           's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?           's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?   Linker Objects
 0:?   Linker Objects
@@ -121,104 +127,110 @@ Linked fragment stage:
 Shader version: 450
 Shader version: 450
 gl_FragCoord origin is upper left
 gl_FragCoord origin is upper left
 0:? Sequence
 0:? Sequence
-0:34  Function Definition: @PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; (temp 4-component vector of float)
-0:34    Function Parameters: 
-0:34      'input' (in 4-component vector of float)
-0:34      's' (in structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40  Function Definition: @PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; (temp 4-component vector of float)
+0:40    Function Parameters: 
+0:40      'input' (in 4-component vector of float)
+0:40      's' (in structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?     Sequence
 0:?     Sequence
-0:39      Compare Equal (temp bool)
-0:39        's3' (temp structure{temp 3-component vector of bool b3})
-0:39        's3' (temp structure{temp 3-component vector of bool b3})
-0:40      move second child to first child (temp 4-component vector of float)
-0:40        i: direct index for structure (temp 4-component vector of float)
-0:40          's2' (global structure{temp 4-component vector of float i})
-0:40          Constant:
-0:40            0 (const int)
-0:40        ff4: direct index for structure (temp 4-component vector of float)
-0:40          's' (in structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:40          Constant:
-0:40            7 (const int)
-0:42      Branch: Return with expression
-0:42        'input' (in 4-component vector of float)
-0:34  Function Definition: PixelShaderFunction( (temp void)
-0:34    Function Parameters: 
+0:45      Compare Equal (temp bool)
+0:45        's3' (temp structure{temp 3-component vector of bool b3})
+0:45        's3' (temp structure{temp 3-component vector of bool b3})
+0:46      move second child to first child (temp 4-component vector of float)
+0:46        i: direct index for structure (temp 4-component vector of float)
+0:46          's2' (global structure{temp 4-component vector of float i})
+0:46          Constant:
+0:46            0 (const int)
+0:46        ff4: direct index for structure (temp 4-component vector of float)
+0:46          's' (in structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:46          Constant:
+0:46            7 (const int)
+0:50      move second child to first child (temp structure{})
+0:50        'e' (temp structure{})
+0:50        e: direct index for structure (temp structure{})
+0:50          'ce' (temp structure{temp structure{} e})
+0:50          Constant:
+0:50            0 (const int)
+0:52      Branch: Return with expression
+0:52        'input' (in 4-component vector of float)
+0:40  Function Definition: PixelShaderFunction( (temp void)
+0:40    Function Parameters: 
 0:?     Sequence
 0:?     Sequence
-0:34      move second child to first child (temp 4-component vector of float)
+0:40      move second child to first child (temp 4-component vector of float)
 0:?         'input' (temp 4-component vector of float)
 0:?         'input' (temp 4-component vector of float)
 0:?         'input' (layout(location=0 ) in 4-component vector of float)
 0:?         'input' (layout(location=0 ) in 4-component vector of float)
-0:34      Sequence
-0:34        move second child to first child (temp 4-component vector of float)
-0:34          a: direct index for structure (temp 4-component vector of float)
+0:40      Sequence
+0:40        move second child to first child (temp 4-component vector of float)
+0:40          a: direct index for structure (temp 4-component vector of float)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              0 (const int)
-0:34          a: direct index for structure (smooth temp 4-component vector of float)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              0 (const int)
-0:34        move second child to first child (temp bool)
-0:34          b: direct index for structure (temp bool)
+0:40            Constant:
+0:40              0 (const int)
+0:40          a: direct index for structure (smooth temp 4-component vector of float)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              0 (const int)
+0:40        move second child to first child (temp bool)
+0:40          b: direct index for structure (temp bool)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              1 (const int)
-0:34          b: direct index for structure (flat temp bool)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              1 (const int)
-0:34        move second child to first child (temp 1-component vector of float)
-0:34          c: direct index for structure (temp 1-component vector of float)
+0:40            Constant:
+0:40              1 (const int)
+0:40          b: direct index for structure (flat temp bool)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              1 (const int)
+0:40        move second child to first child (temp 1-component vector of float)
+0:40          c: direct index for structure (temp 1-component vector of float)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              2 (const int)
-0:34          c: direct index for structure (centroid noperspective temp 1-component vector of float)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              2 (const int)
-0:34        move second child to first child (temp 2-component vector of float)
-0:34          d: direct index for structure (temp 2-component vector of float)
+0:40            Constant:
+0:40              2 (const int)
+0:40          c: direct index for structure (centroid noperspective temp 1-component vector of float)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              2 (const int)
+0:40        move second child to first child (temp 2-component vector of float)
+0:40          d: direct index for structure (temp 2-component vector of float)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              3 (const int)
-0:34          d: direct index for structure (centroid sample temp 2-component vector of float)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              3 (const int)
-0:34        move second child to first child (temp bool)
-0:34          ff1: direct index for structure (temp bool)
+0:40            Constant:
+0:40              3 (const int)
+0:40          d: direct index for structure (centroid sample temp 2-component vector of float)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              3 (const int)
+0:40        move second child to first child (temp bool)
+0:40          ff1: direct index for structure (temp bool)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              4 (const int)
+0:40            Constant:
+0:40              4 (const int)
 0:?           's_ff1' (in bool Face)
 0:?           's_ff1' (in bool Face)
-0:34        move second child to first child (temp bool)
-0:34          ff2: direct index for structure (temp bool)
+0:40        move second child to first child (temp bool)
+0:40          ff2: direct index for structure (temp bool)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              5 (const int)
-0:34          ff2: direct index for structure (temp bool)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              4 (const int)
-0:34        move second child to first child (temp bool)
-0:34          ff3: direct index for structure (temp bool)
+0:40            Constant:
+0:40              5 (const int)
+0:40          ff2: direct index for structure (temp bool)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              4 (const int)
+0:40        move second child to first child (temp bool)
+0:40          ff3: direct index for structure (temp bool)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              6 (const int)
-0:34          ff3: direct index for structure (temp bool)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              5 (const int)
-0:34        move second child to first child (temp 4-component vector of float)
-0:34          ff4: direct index for structure (temp 4-component vector of float)
+0:40            Constant:
+0:40              6 (const int)
+0:40          ff3: direct index for structure (temp bool)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              5 (const int)
+0:40        move second child to first child (temp 4-component vector of float)
+0:40          ff4: direct index for structure (temp 4-component vector of float)
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?             's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              7 (const int)
-0:34          ff4: direct index for structure (temp 4-component vector of float)
-0:34            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
-0:34            Constant:
-0:34              6 (const int)
-0:34      move second child to first child (temp 4-component vector of float)
+0:40            Constant:
+0:40              7 (const int)
+0:40          ff4: direct index for structure (temp 4-component vector of float)
+0:40            's' (layout(location=1 ) in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
+0:40            Constant:
+0:40              6 (const int)
+0:40      move second child to first child (temp 4-component vector of float)
 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
-0:34        Function Call: @PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; (temp 4-component vector of float)
+0:40        Function Call: @PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; (temp 4-component vector of float)
 0:?           'input' (temp 4-component vector of float)
 0:?           'input' (temp 4-component vector of float)
 0:?           's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?           's' (temp structure{temp 4-component vector of float a, temp bool b, temp 1-component vector of float c, temp 2-component vector of float d, temp bool ff1, temp bool ff2, temp bool ff3, temp 4-component vector of float ff4})
 0:?   Linker Objects
 0:?   Linker Objects
@@ -231,12 +243,12 @@ gl_FragCoord origin is upper left
 
 
 // Module Version 10000
 // Module Version 10000
 // Generated by (magic number): 80001
 // Generated by (magic number): 80001
-// Id's are bound by 97
+// Id's are bound by 105
 
 
                               Capability Shader
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "PixelShaderFunction" 43 48 71 86
+                              EntryPoint Fragment 4  "PixelShaderFunction" 51 56 79 94
                               ExecutionMode 4 OriginUpperLeft
                               ExecutionMode 4 OriginUpperLeft
                               Name 4  "PixelShaderFunction"
                               Name 4  "PixelShaderFunction"
                               Name 11  "IN_S"
                               Name 11  "IN_S"
@@ -257,49 +269,54 @@ gl_FragCoord origin is upper left
                               Name 28  ""
                               Name 28  ""
                               MemberName 28 0  "i"
                               MemberName 28 0  "i"
                               Name 30  "s2"
                               Name 30  "s2"
-                              Name 41  "input"
-                              Name 43  "input"
-                              Name 45  "s"
-                              Name 46  "IN_S"
-                              MemberName 46(IN_S) 0  "a"
-                              MemberName 46(IN_S) 1  "b"
-                              MemberName 46(IN_S) 2  "c"
-                              MemberName 46(IN_S) 3  "d"
-                              MemberName 46(IN_S) 4  "ff2"
-                              MemberName 46(IN_S) 5  "ff3"
-                              MemberName 46(IN_S) 6  "ff4"
-                              Name 48  "s"
-                              Name 71  "s_ff1"
-                              Name 86  "@entryPointOutput"
-                              Name 87  "param"
-                              Name 89  "param"
-                              Name 93  "myS"
-                              MemberName 93(myS) 0  "b"
-                              MemberName 93(myS) 1  "c"
-                              MemberName 93(myS) 2  "a"
-                              MemberName 93(myS) 3  "d"
-                              Name 94  "$Global"
-                              MemberName 94($Global) 0  "s1"
-                              MemberName 94($Global) 1  "ff5"
-                              MemberName 94($Global) 2  "ff6"
-                              Name 96  ""
-                              Decorate 43(input) Location 0
-                              MemberDecorate 46(IN_S) 1 Flat
-                              MemberDecorate 46(IN_S) 2 NoPerspective
-                              MemberDecorate 46(IN_S) 2 Centroid
-                              MemberDecorate 46(IN_S) 3 Centroid
-                              Decorate 48(s) Location 1
-                              Decorate 71(s_ff1) BuiltIn FrontFacing
-                              Decorate 86(@entryPointOutput) Location 0
-                              MemberDecorate 93(myS) 0 Offset 0
-                              MemberDecorate 93(myS) 1 Offset 4
-                              MemberDecorate 93(myS) 2 Offset 16
-                              MemberDecorate 93(myS) 3 Offset 32
-                              MemberDecorate 94($Global) 0 Offset 0
-                              MemberDecorate 94($Global) 1 Offset 1620
-                              MemberDecorate 94($Global) 2 Offset 1636
-                              Decorate 94($Global) Block
-                              Decorate 96 DescriptorSet 0
+                              Name 38  "empty"
+                              Name 40  "e"
+                              Name 41  "containEmpty"
+                              MemberName 41(containEmpty) 0  "e"
+                              Name 43  "ce"
+                              Name 49  "input"
+                              Name 51  "input"
+                              Name 53  "s"
+                              Name 54  "IN_S"
+                              MemberName 54(IN_S) 0  "a"
+                              MemberName 54(IN_S) 1  "b"
+                              MemberName 54(IN_S) 2  "c"
+                              MemberName 54(IN_S) 3  "d"
+                              MemberName 54(IN_S) 4  "ff2"
+                              MemberName 54(IN_S) 5  "ff3"
+                              MemberName 54(IN_S) 6  "ff4"
+                              Name 56  "s"
+                              Name 79  "s_ff1"
+                              Name 94  "@entryPointOutput"
+                              Name 95  "param"
+                              Name 97  "param"
+                              Name 101  "myS"
+                              MemberName 101(myS) 0  "b"
+                              MemberName 101(myS) 1  "c"
+                              MemberName 101(myS) 2  "a"
+                              MemberName 101(myS) 3  "d"
+                              Name 102  "$Global"
+                              MemberName 102($Global) 0  "s1"
+                              MemberName 102($Global) 1  "ff5"
+                              MemberName 102($Global) 2  "ff6"
+                              Name 104  ""
+                              Decorate 51(input) Location 0
+                              MemberDecorate 54(IN_S) 1 Flat
+                              MemberDecorate 54(IN_S) 2 NoPerspective
+                              MemberDecorate 54(IN_S) 2 Centroid
+                              MemberDecorate 54(IN_S) 3 Centroid
+                              Decorate 56(s) Location 1
+                              Decorate 79(s_ff1) BuiltIn FrontFacing
+                              Decorate 94(@entryPointOutput) Location 0
+                              MemberDecorate 101(myS) 0 Offset 0
+                              MemberDecorate 101(myS) 1 Offset 4
+                              MemberDecorate 101(myS) 2 Offset 16
+                              MemberDecorate 101(myS) 3 Offset 32
+                              MemberDecorate 102($Global) 0 Offset 0
+                              MemberDecorate 102($Global) 1 Offset 1620
+                              MemberDecorate 102($Global) 2 Offset 1636
+                              Decorate 102($Global) Block
+                              Decorate 104 DescriptorSet 0
                2:             TypeVoid
                2:             TypeVoid
                3:             TypeFunction 2
                3:             TypeFunction 2
                6:             TypeFloat 32
                6:             TypeFloat 32
@@ -320,76 +337,80 @@ gl_FragCoord origin is upper left
               32:     31(int) Constant 0
               32:     31(int) Constant 0
               33:     31(int) Constant 7
               33:     31(int) Constant 7
               36:             TypePointer Private 7(fvec4)
               36:             TypePointer Private 7(fvec4)
-              42:             TypePointer Input 7(fvec4)
-       43(input):     42(ptr) Variable Input
-        46(IN_S):             TypeStruct 7(fvec4) 9(bool) 6(float) 10(fvec2) 9(bool) 9(bool) 7(fvec4)
-              47:             TypePointer Input 46(IN_S)
-           48(s):     47(ptr) Variable Input
-              52:     31(int) Constant 1
-              53:             TypePointer Input 9(bool)
-              56:             TypePointer Function 9(bool)
-              58:     31(int) Constant 2
-              59:             TypePointer Input 6(float)
-              62:             TypePointer Function 6(float)
-              64:     31(int) Constant 3
-              65:             TypePointer Input 10(fvec2)
-              68:             TypePointer Function 10(fvec2)
-              70:     31(int) Constant 4
-       71(s_ff1):     53(ptr) Variable Input
-              74:     31(int) Constant 5
-              78:     31(int) Constant 6
-              85:             TypePointer Output 7(fvec4)
-86(@entryPointOutput):     85(ptr) Variable Output
-              92:             TypeInt 32 0
-         93(myS):             TypeStruct 92(int) 92(int) 7(fvec4) 7(fvec4)
-     94($Global):             TypeStruct 93(myS) 6(float) 6(float)
-              95:             TypePointer Uniform 94($Global)
-              96:     95(ptr) Variable Uniform
+       38(empty):             TypeStruct
+              39:             TypePointer Function 38(empty)
+41(containEmpty):             TypeStruct 38(empty)
+              42:             TypePointer Function 41(containEmpty)
+              50:             TypePointer Input 7(fvec4)
+       51(input):     50(ptr) Variable Input
+        54(IN_S):             TypeStruct 7(fvec4) 9(bool) 6(float) 10(fvec2) 9(bool) 9(bool) 7(fvec4)
+              55:             TypePointer Input 54(IN_S)
+           56(s):     55(ptr) Variable Input
+              60:     31(int) Constant 1
+              61:             TypePointer Input 9(bool)
+              64:             TypePointer Function 9(bool)
+              66:     31(int) Constant 2
+              67:             TypePointer Input 6(float)
+              70:             TypePointer Function 6(float)
+              72:     31(int) Constant 3
+              73:             TypePointer Input 10(fvec2)
+              76:             TypePointer Function 10(fvec2)
+              78:     31(int) Constant 4
+       79(s_ff1):     61(ptr) Variable Input
+              82:     31(int) Constant 5
+              86:     31(int) Constant 6
+              93:             TypePointer Output 7(fvec4)
+94(@entryPointOutput):     93(ptr) Variable Output
+             100:             TypeInt 32 0
+        101(myS):             TypeStruct 100(int) 100(int) 7(fvec4) 7(fvec4)
+    102($Global):             TypeStruct 101(myS) 6(float) 6(float)
+             103:             TypePointer Uniform 102($Global)
+             104:    103(ptr) Variable Uniform
 4(PixelShaderFunction):           2 Function None 3
 4(PixelShaderFunction):           2 Function None 3
                5:             Label
                5:             Label
-       41(input):      8(ptr) Variable Function
-           45(s):     12(ptr) Variable Function
-       87(param):      8(ptr) Variable Function
-       89(param):     12(ptr) Variable Function
-              44:    7(fvec4) Load 43(input)
-                              Store 41(input) 44
-              49:     42(ptr) AccessChain 48(s) 32
-              50:    7(fvec4) Load 49
-              51:      8(ptr) AccessChain 45(s) 32
-                              Store 51 50
-              54:     53(ptr) AccessChain 48(s) 52
-              55:     9(bool) Load 54
-              57:     56(ptr) AccessChain 45(s) 52
-                              Store 57 55
-              60:     59(ptr) AccessChain 48(s) 58
-              61:    6(float) Load 60
-              63:     62(ptr) AccessChain 45(s) 58
-                              Store 63 61
-              66:     65(ptr) AccessChain 48(s) 64
-              67:   10(fvec2) Load 66
-              69:     68(ptr) AccessChain 45(s) 64
-                              Store 69 67
-              72:     9(bool) Load 71(s_ff1)
-              73:     56(ptr) AccessChain 45(s) 70
-                              Store 73 72
-              75:     53(ptr) AccessChain 48(s) 70
-              76:     9(bool) Load 75
-              77:     56(ptr) AccessChain 45(s) 74
-                              Store 77 76
-              79:     53(ptr) AccessChain 48(s) 74
-              80:     9(bool) Load 79
-              81:     56(ptr) AccessChain 45(s) 78
+       49(input):      8(ptr) Variable Function
+           53(s):     12(ptr) Variable Function
+       95(param):      8(ptr) Variable Function
+       97(param):     12(ptr) Variable Function
+              52:    7(fvec4) Load 51(input)
+                              Store 49(input) 52
+              57:     50(ptr) AccessChain 56(s) 32
+              58:    7(fvec4) Load 57
+              59:      8(ptr) AccessChain 53(s) 32
+                              Store 59 58
+              62:     61(ptr) AccessChain 56(s) 60
+              63:     9(bool) Load 62
+              65:     64(ptr) AccessChain 53(s) 60
+                              Store 65 63
+              68:     67(ptr) AccessChain 56(s) 66
+              69:    6(float) Load 68
+              71:     70(ptr) AccessChain 53(s) 66
+                              Store 71 69
+              74:     73(ptr) AccessChain 56(s) 72
+              75:   10(fvec2) Load 74
+              77:     76(ptr) AccessChain 53(s) 72
+                              Store 77 75
+              80:     9(bool) Load 79(s_ff1)
+              81:     64(ptr) AccessChain 53(s) 78
                               Store 81 80
                               Store 81 80
-              82:     42(ptr) AccessChain 48(s) 78
-              83:    7(fvec4) Load 82
-              84:      8(ptr) AccessChain 45(s) 33
-                              Store 84 83
-              88:    7(fvec4) Load 41(input)
-                              Store 87(param) 88
-              90:    11(IN_S) Load 45(s)
-                              Store 89(param) 90
-              91:    7(fvec4) FunctionCall 16(@PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41;) 87(param) 89(param)
-                              Store 86(@entryPointOutput) 91
+              83:     61(ptr) AccessChain 56(s) 78
+              84:     9(bool) Load 83
+              85:     64(ptr) AccessChain 53(s) 82
+                              Store 85 84
+              87:     61(ptr) AccessChain 56(s) 82
+              88:     9(bool) Load 87
+              89:     64(ptr) AccessChain 53(s) 86
+                              Store 89 88
+              90:     50(ptr) AccessChain 56(s) 86
+              91:    7(fvec4) Load 90
+              92:      8(ptr) AccessChain 53(s) 33
+                              Store 92 91
+              96:    7(fvec4) Load 49(input)
+                              Store 95(param) 96
+              98:    11(IN_S) Load 53(s)
+                              Store 97(param) 98
+              99:    7(fvec4) FunctionCall 16(@PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41;) 95(param) 97(param)
+                              Store 94(@entryPointOutput) 99
                               Return
                               Return
                               FunctionEnd
                               FunctionEnd
 16(@PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41;):    7(fvec4) Function None 13
 16(@PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41;):    7(fvec4) Function None 13
@@ -397,6 +418,8 @@ gl_FragCoord origin is upper left
            15(s):     12(ptr) FunctionParameter
            15(s):     12(ptr) FunctionParameter
               17:             Label
               17:             Label
           21(s3):     20(ptr) Variable Function
           21(s3):     20(ptr) Variable Function
+           40(e):     39(ptr) Variable Function
+          43(ce):     42(ptr) Variable Function
               22:      19(FS) Load 21(s3)
               22:      19(FS) Load 21(s3)
               23:      19(FS) Load 21(s3)
               23:      19(FS) Load 21(s3)
               24:   18(bvec3) CompositeExtract 22 0
               24:   18(bvec3) CompositeExtract 22 0
@@ -407,6 +430,9 @@ gl_FragCoord origin is upper left
               35:    7(fvec4) Load 34
               35:    7(fvec4) Load 34
               37:     36(ptr) AccessChain 30(s2) 32
               37:     36(ptr) AccessChain 30(s2) 32
                               Store 37 35
                               Store 37 35
-              38:    7(fvec4) Load 14(input)
-                              ReturnValue 38
+              44:     39(ptr) AccessChain 43(ce) 32
+              45:   38(empty) Load 44
+                              Store 40(e) 45
+              46:    7(fvec4) Load 14(input)
+                              ReturnValue 46
                               FunctionEnd
                               FunctionEnd

+ 84 - 0
3rdparty/glslang/Test/baseResults/hlsl.structStructName.frag.out

@@ -0,0 +1,84 @@
+hlsl.structStructName.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:4  Function Definition: @main( (temp int)
+0:4    Function Parameters: 
+0:?     Sequence
+0:6      Branch: Return with expression
+0:6        s: direct index for structure (temp int)
+0:6          't' (temp structure{temp int s})
+0:6          Constant:
+0:6            0 (const int)
+0:4  Function Definition: main( (temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child (temp int)
+0:?         '@entryPointOutput' (layout(location=0 ) out int)
+0:4        Function Call: @main( (temp int)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out int)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:4  Function Definition: @main( (temp int)
+0:4    Function Parameters: 
+0:?     Sequence
+0:6      Branch: Return with expression
+0:6        s: direct index for structure (temp int)
+0:6          't' (temp structure{temp int s})
+0:6          Constant:
+0:6            0 (const int)
+0:4  Function Definition: main( (temp void)
+0:4    Function Parameters: 
+0:?     Sequence
+0:4      move second child to first child (temp int)
+0:?         '@entryPointOutput' (layout(location=0 ) out int)
+0:4        Function Call: @main( (temp int)
+0:?   Linker Objects
+0:?     '@entryPointOutput' (layout(location=0 ) out int)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 22
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 20
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 8  "@main("
+                              Name 10  "S"
+                              MemberName 10(S) 0  "s"
+                              Name 12  "t"
+                              Name 20  "@entryPointOutput"
+                              Decorate 20(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypeFunction 6(int)
+           10(S):             TypeStruct 6(int)
+              11:             TypePointer Function 10(S)
+              13:      6(int) Constant 0
+              14:             TypePointer Function 6(int)
+              19:             TypePointer Output 6(int)
+20(@entryPointOutput):     19(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              21:      6(int) FunctionCall 8(@main()
+                              Store 20(@entryPointOutput) 21
+                              Return
+                              FunctionEnd
+       8(@main():      6(int) Function None 7
+               9:             Label
+           12(t):     11(ptr) Variable Function
+              15:     14(ptr) AccessChain 12(t) 13
+              16:      6(int) Load 15
+                              ReturnValue 16
+                              FunctionEnd

+ 81 - 81
3rdparty/glslang/Test/baseResults/hlsl.structbuffer.atomics.frag.out

@@ -8,8 +8,8 @@ gl_FragCoord origin is upper left
 0:?     Sequence
 0:?     Sequence
 0:8      AtomicAdd (temp void)
 0:8      AtomicAdd (temp void)
 0:8        indirect index (layout(row_major std430 ) buffer uint)
 0:8        indirect index (layout(row_major std430 ) buffer uint)
-0:8          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:8            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:8          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:8            'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:8            Constant:
 0:8            Constant:
 0:8              0 (const uint)
 0:8              0 (const uint)
 0:8          right-shift (temp int)
 0:8          right-shift (temp int)
@@ -23,8 +23,8 @@ gl_FragCoord origin is upper left
 0:9        'u' (temp uint)
 0:9        'u' (temp uint)
 0:9        AtomicAdd (temp uint)
 0:9        AtomicAdd (temp uint)
 0:9          indirect index (layout(row_major std430 ) buffer uint)
 0:9          indirect index (layout(row_major std430 ) buffer uint)
-0:9            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:9              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:9            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:9              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:9              Constant:
 0:9              Constant:
 0:9                0 (const uint)
 0:9                0 (const uint)
 0:9            right-shift (temp int)
 0:9            right-shift (temp int)
@@ -36,8 +36,8 @@ gl_FragCoord origin is upper left
 0:9            1 (const int)
 0:9            1 (const int)
 0:10      AtomicAnd (temp void)
 0:10      AtomicAnd (temp void)
 0:10        indirect index (layout(row_major std430 ) buffer uint)
 0:10        indirect index (layout(row_major std430 ) buffer uint)
-0:10          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:10            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:10          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:10            'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:10            Constant:
 0:10            Constant:
 0:10              0 (const uint)
 0:10              0 (const uint)
 0:10          right-shift (temp int)
 0:10          right-shift (temp int)
@@ -51,8 +51,8 @@ gl_FragCoord origin is upper left
 0:11        'u' (temp uint)
 0:11        'u' (temp uint)
 0:11        AtomicAnd (temp uint)
 0:11        AtomicAnd (temp uint)
 0:11          indirect index (layout(row_major std430 ) buffer uint)
 0:11          indirect index (layout(row_major std430 ) buffer uint)
-0:11            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:11              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:11            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:11              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:11              Constant:
 0:11              Constant:
 0:11                0 (const uint)
 0:11                0 (const uint)
 0:11            right-shift (temp int)
 0:11            right-shift (temp int)
@@ -67,8 +67,8 @@ gl_FragCoord origin is upper left
 0:12        Convert int to uint (temp uint)
 0:12        Convert int to uint (temp uint)
 0:12          AtomicCompSwap (temp int)
 0:12          AtomicCompSwap (temp int)
 0:12            indirect index (layout(row_major std430 ) buffer uint)
 0:12            indirect index (layout(row_major std430 ) buffer uint)
-0:12              sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:12                'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:12              @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:12                'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:12                Constant:
 0:12                Constant:
 0:12                  0 (const uint)
 0:12                  0 (const uint)
 0:12              right-shift (temp int)
 0:12              right-shift (temp int)
@@ -84,8 +84,8 @@ gl_FragCoord origin is upper left
 0:14        'u' (temp uint)
 0:14        'u' (temp uint)
 0:14        AtomicExchange (temp uint)
 0:14        AtomicExchange (temp uint)
 0:14          indirect index (layout(row_major std430 ) buffer uint)
 0:14          indirect index (layout(row_major std430 ) buffer uint)
-0:14            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:14              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:14            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:14              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:14              Constant:
 0:14              Constant:
 0:14                0 (const uint)
 0:14                0 (const uint)
 0:14            right-shift (temp int)
 0:14            right-shift (temp int)
@@ -97,8 +97,8 @@ gl_FragCoord origin is upper left
 0:14            1 (const int)
 0:14            1 (const int)
 0:15      AtomicMax (temp void)
 0:15      AtomicMax (temp void)
 0:15        indirect index (layout(row_major std430 ) buffer uint)
 0:15        indirect index (layout(row_major std430 ) buffer uint)
-0:15          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:15            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:15          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:15            'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:15            Constant:
 0:15            Constant:
 0:15              0 (const uint)
 0:15              0 (const uint)
 0:15          right-shift (temp int)
 0:15          right-shift (temp int)
@@ -112,8 +112,8 @@ gl_FragCoord origin is upper left
 0:16        'u' (temp uint)
 0:16        'u' (temp uint)
 0:16        AtomicMax (temp uint)
 0:16        AtomicMax (temp uint)
 0:16          indirect index (layout(row_major std430 ) buffer uint)
 0:16          indirect index (layout(row_major std430 ) buffer uint)
-0:16            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:16              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:16            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:16              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:16              Constant:
 0:16              Constant:
 0:16                0 (const uint)
 0:16                0 (const uint)
 0:16            right-shift (temp int)
 0:16            right-shift (temp int)
@@ -125,8 +125,8 @@ gl_FragCoord origin is upper left
 0:16            1 (const int)
 0:16            1 (const int)
 0:17      AtomicMin (temp void)
 0:17      AtomicMin (temp void)
 0:17        indirect index (layout(row_major std430 ) buffer uint)
 0:17        indirect index (layout(row_major std430 ) buffer uint)
-0:17          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:17            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:17          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:17            'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:17            Constant:
 0:17            Constant:
 0:17              0 (const uint)
 0:17              0 (const uint)
 0:17          right-shift (temp int)
 0:17          right-shift (temp int)
@@ -140,8 +140,8 @@ gl_FragCoord origin is upper left
 0:18        'u' (temp uint)
 0:18        'u' (temp uint)
 0:18        AtomicMin (temp uint)
 0:18        AtomicMin (temp uint)
 0:18          indirect index (layout(row_major std430 ) buffer uint)
 0:18          indirect index (layout(row_major std430 ) buffer uint)
-0:18            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:18              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:18            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:18              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:18              Constant:
 0:18              Constant:
 0:18                0 (const uint)
 0:18                0 (const uint)
 0:18            right-shift (temp int)
 0:18            right-shift (temp int)
@@ -153,8 +153,8 @@ gl_FragCoord origin is upper left
 0:18            1 (const int)
 0:18            1 (const int)
 0:19      AtomicOr (temp void)
 0:19      AtomicOr (temp void)
 0:19        indirect index (layout(row_major std430 ) buffer uint)
 0:19        indirect index (layout(row_major std430 ) buffer uint)
-0:19          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:19            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:19          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:19            'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:19            Constant:
 0:19            Constant:
 0:19              0 (const uint)
 0:19              0 (const uint)
 0:19          right-shift (temp int)
 0:19          right-shift (temp int)
@@ -168,8 +168,8 @@ gl_FragCoord origin is upper left
 0:20        'u' (temp uint)
 0:20        'u' (temp uint)
 0:20        AtomicOr (temp uint)
 0:20        AtomicOr (temp uint)
 0:20          indirect index (layout(row_major std430 ) buffer uint)
 0:20          indirect index (layout(row_major std430 ) buffer uint)
-0:20            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:20              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:20            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:20              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:20              Constant:
 0:20              Constant:
 0:20                0 (const uint)
 0:20                0 (const uint)
 0:20            right-shift (temp int)
 0:20            right-shift (temp int)
@@ -181,8 +181,8 @@ gl_FragCoord origin is upper left
 0:20            1 (const int)
 0:20            1 (const int)
 0:21      AtomicXor (temp void)
 0:21      AtomicXor (temp void)
 0:21        indirect index (layout(row_major std430 ) buffer uint)
 0:21        indirect index (layout(row_major std430 ) buffer uint)
-0:21          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:21            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:21          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:21            'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:21            Constant:
 0:21            Constant:
 0:21              0 (const uint)
 0:21              0 (const uint)
 0:21          right-shift (temp int)
 0:21          right-shift (temp int)
@@ -196,8 +196,8 @@ gl_FragCoord origin is upper left
 0:22        'u' (temp uint)
 0:22        'u' (temp uint)
 0:22        AtomicXor (temp uint)
 0:22        AtomicXor (temp uint)
 0:22          indirect index (layout(row_major std430 ) buffer uint)
 0:22          indirect index (layout(row_major std430 ) buffer uint)
-0:22            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:22              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:22            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:22              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:22              Constant:
 0:22              Constant:
 0:22                0 (const uint)
 0:22                0 (const uint)
 0:22            right-shift (temp int)
 0:22            right-shift (temp int)
@@ -211,8 +211,8 @@ gl_FragCoord origin is upper left
 0:24        Construct vec4 (temp 4-component vector of float)
 0:24        Construct vec4 (temp 4-component vector of float)
 0:24          Convert uint to float (temp float)
 0:24          Convert uint to float (temp float)
 0:24            indirect index (layout(row_major std430 ) buffer uint)
 0:24            indirect index (layout(row_major std430 ) buffer uint)
-0:24              sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:24                'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:24              @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:24                'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:24                Constant:
 0:24                Constant:
 0:24                  0 (const uint)
 0:24                  0 (const uint)
 0:24              right-shift (temp int)
 0:24              right-shift (temp int)
@@ -230,7 +230,7 @@ gl_FragCoord origin is upper left
 0:5        Function Call: @main(u1; (temp 4-component vector of float)
 0:5        Function Call: @main(u1; (temp 4-component vector of float)
 0:?           'pos' (temp uint)
 0:?           'pos' (temp uint)
 0:?   Linker Objects
 0:?   Linker Objects
-0:?     'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:?     'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     'pos' (layout(location=0 ) in uint)
 0:?     'pos' (layout(location=0 ) in uint)
 
 
@@ -247,8 +247,8 @@ gl_FragCoord origin is upper left
 0:?     Sequence
 0:?     Sequence
 0:8      AtomicAdd (temp void)
 0:8      AtomicAdd (temp void)
 0:8        indirect index (layout(row_major std430 ) buffer uint)
 0:8        indirect index (layout(row_major std430 ) buffer uint)
-0:8          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:8            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:8          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:8            'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:8            Constant:
 0:8            Constant:
 0:8              0 (const uint)
 0:8              0 (const uint)
 0:8          right-shift (temp int)
 0:8          right-shift (temp int)
@@ -262,8 +262,8 @@ gl_FragCoord origin is upper left
 0:9        'u' (temp uint)
 0:9        'u' (temp uint)
 0:9        AtomicAdd (temp uint)
 0:9        AtomicAdd (temp uint)
 0:9          indirect index (layout(row_major std430 ) buffer uint)
 0:9          indirect index (layout(row_major std430 ) buffer uint)
-0:9            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:9              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:9            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:9              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:9              Constant:
 0:9              Constant:
 0:9                0 (const uint)
 0:9                0 (const uint)
 0:9            right-shift (temp int)
 0:9            right-shift (temp int)
@@ -275,8 +275,8 @@ gl_FragCoord origin is upper left
 0:9            1 (const int)
 0:9            1 (const int)
 0:10      AtomicAnd (temp void)
 0:10      AtomicAnd (temp void)
 0:10        indirect index (layout(row_major std430 ) buffer uint)
 0:10        indirect index (layout(row_major std430 ) buffer uint)
-0:10          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:10            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:10          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:10            'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:10            Constant:
 0:10            Constant:
 0:10              0 (const uint)
 0:10              0 (const uint)
 0:10          right-shift (temp int)
 0:10          right-shift (temp int)
@@ -290,8 +290,8 @@ gl_FragCoord origin is upper left
 0:11        'u' (temp uint)
 0:11        'u' (temp uint)
 0:11        AtomicAnd (temp uint)
 0:11        AtomicAnd (temp uint)
 0:11          indirect index (layout(row_major std430 ) buffer uint)
 0:11          indirect index (layout(row_major std430 ) buffer uint)
-0:11            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:11              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:11            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:11              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:11              Constant:
 0:11              Constant:
 0:11                0 (const uint)
 0:11                0 (const uint)
 0:11            right-shift (temp int)
 0:11            right-shift (temp int)
@@ -306,8 +306,8 @@ gl_FragCoord origin is upper left
 0:12        Convert int to uint (temp uint)
 0:12        Convert int to uint (temp uint)
 0:12          AtomicCompSwap (temp int)
 0:12          AtomicCompSwap (temp int)
 0:12            indirect index (layout(row_major std430 ) buffer uint)
 0:12            indirect index (layout(row_major std430 ) buffer uint)
-0:12              sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:12                'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:12              @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:12                'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:12                Constant:
 0:12                Constant:
 0:12                  0 (const uint)
 0:12                  0 (const uint)
 0:12              right-shift (temp int)
 0:12              right-shift (temp int)
@@ -323,8 +323,8 @@ gl_FragCoord origin is upper left
 0:14        'u' (temp uint)
 0:14        'u' (temp uint)
 0:14        AtomicExchange (temp uint)
 0:14        AtomicExchange (temp uint)
 0:14          indirect index (layout(row_major std430 ) buffer uint)
 0:14          indirect index (layout(row_major std430 ) buffer uint)
-0:14            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:14              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:14            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:14              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:14              Constant:
 0:14              Constant:
 0:14                0 (const uint)
 0:14                0 (const uint)
 0:14            right-shift (temp int)
 0:14            right-shift (temp int)
@@ -336,8 +336,8 @@ gl_FragCoord origin is upper left
 0:14            1 (const int)
 0:14            1 (const int)
 0:15      AtomicMax (temp void)
 0:15      AtomicMax (temp void)
 0:15        indirect index (layout(row_major std430 ) buffer uint)
 0:15        indirect index (layout(row_major std430 ) buffer uint)
-0:15          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:15            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:15          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:15            'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:15            Constant:
 0:15            Constant:
 0:15              0 (const uint)
 0:15              0 (const uint)
 0:15          right-shift (temp int)
 0:15          right-shift (temp int)
@@ -351,8 +351,8 @@ gl_FragCoord origin is upper left
 0:16        'u' (temp uint)
 0:16        'u' (temp uint)
 0:16        AtomicMax (temp uint)
 0:16        AtomicMax (temp uint)
 0:16          indirect index (layout(row_major std430 ) buffer uint)
 0:16          indirect index (layout(row_major std430 ) buffer uint)
-0:16            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:16              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:16            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:16              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:16              Constant:
 0:16              Constant:
 0:16                0 (const uint)
 0:16                0 (const uint)
 0:16            right-shift (temp int)
 0:16            right-shift (temp int)
@@ -364,8 +364,8 @@ gl_FragCoord origin is upper left
 0:16            1 (const int)
 0:16            1 (const int)
 0:17      AtomicMin (temp void)
 0:17      AtomicMin (temp void)
 0:17        indirect index (layout(row_major std430 ) buffer uint)
 0:17        indirect index (layout(row_major std430 ) buffer uint)
-0:17          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:17            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:17          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:17            'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:17            Constant:
 0:17            Constant:
 0:17              0 (const uint)
 0:17              0 (const uint)
 0:17          right-shift (temp int)
 0:17          right-shift (temp int)
@@ -379,8 +379,8 @@ gl_FragCoord origin is upper left
 0:18        'u' (temp uint)
 0:18        'u' (temp uint)
 0:18        AtomicMin (temp uint)
 0:18        AtomicMin (temp uint)
 0:18          indirect index (layout(row_major std430 ) buffer uint)
 0:18          indirect index (layout(row_major std430 ) buffer uint)
-0:18            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:18              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:18            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:18              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:18              Constant:
 0:18              Constant:
 0:18                0 (const uint)
 0:18                0 (const uint)
 0:18            right-shift (temp int)
 0:18            right-shift (temp int)
@@ -392,8 +392,8 @@ gl_FragCoord origin is upper left
 0:18            1 (const int)
 0:18            1 (const int)
 0:19      AtomicOr (temp void)
 0:19      AtomicOr (temp void)
 0:19        indirect index (layout(row_major std430 ) buffer uint)
 0:19        indirect index (layout(row_major std430 ) buffer uint)
-0:19          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:19            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:19          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:19            'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:19            Constant:
 0:19            Constant:
 0:19              0 (const uint)
 0:19              0 (const uint)
 0:19          right-shift (temp int)
 0:19          right-shift (temp int)
@@ -407,8 +407,8 @@ gl_FragCoord origin is upper left
 0:20        'u' (temp uint)
 0:20        'u' (temp uint)
 0:20        AtomicOr (temp uint)
 0:20        AtomicOr (temp uint)
 0:20          indirect index (layout(row_major std430 ) buffer uint)
 0:20          indirect index (layout(row_major std430 ) buffer uint)
-0:20            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:20              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:20            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:20              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:20              Constant:
 0:20              Constant:
 0:20                0 (const uint)
 0:20                0 (const uint)
 0:20            right-shift (temp int)
 0:20            right-shift (temp int)
@@ -420,8 +420,8 @@ gl_FragCoord origin is upper left
 0:20            1 (const int)
 0:20            1 (const int)
 0:21      AtomicXor (temp void)
 0:21      AtomicXor (temp void)
 0:21        indirect index (layout(row_major std430 ) buffer uint)
 0:21        indirect index (layout(row_major std430 ) buffer uint)
-0:21          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:21            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:21          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:21            'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:21            Constant:
 0:21            Constant:
 0:21              0 (const uint)
 0:21              0 (const uint)
 0:21          right-shift (temp int)
 0:21          right-shift (temp int)
@@ -435,8 +435,8 @@ gl_FragCoord origin is upper left
 0:22        'u' (temp uint)
 0:22        'u' (temp uint)
 0:22        AtomicXor (temp uint)
 0:22        AtomicXor (temp uint)
 0:22          indirect index (layout(row_major std430 ) buffer uint)
 0:22          indirect index (layout(row_major std430 ) buffer uint)
-0:22            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:22              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:22            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:22              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:22              Constant:
 0:22              Constant:
 0:22                0 (const uint)
 0:22                0 (const uint)
 0:22            right-shift (temp int)
 0:22            right-shift (temp int)
@@ -450,8 +450,8 @@ gl_FragCoord origin is upper left
 0:24        Construct vec4 (temp 4-component vector of float)
 0:24        Construct vec4 (temp 4-component vector of float)
 0:24          Convert uint to float (temp float)
 0:24          Convert uint to float (temp float)
 0:24            indirect index (layout(row_major std430 ) buffer uint)
 0:24            indirect index (layout(row_major std430 ) buffer uint)
-0:24              sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
-0:24                'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:24              @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:24                'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:24                Constant:
 0:24                Constant:
 0:24                  0 (const uint)
 0:24                  0 (const uint)
 0:24              right-shift (temp int)
 0:24              right-shift (temp int)
@@ -469,7 +469,7 @@ gl_FragCoord origin is upper left
 0:5        Function Call: @main(u1; (temp 4-component vector of float)
 0:5        Function Call: @main(u1; (temp 4-component vector of float)
 0:?           'pos' (temp uint)
 0:?           'pos' (temp uint)
 0:?   Linker Objects
 0:?   Linker Objects
-0:?     'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:?     'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     'pos' (layout(location=0 ) in uint)
 0:?     'pos' (layout(location=0 ) in uint)
 
 
@@ -486,8 +486,8 @@ gl_FragCoord origin is upper left
                               Name 12  "@main(u1;"
                               Name 12  "@main(u1;"
                               Name 11  "pos"
                               Name 11  "pos"
                               Name 15  "sbuf"
                               Name 15  "sbuf"
-                              MemberName 15(sbuf) 0  "sbuf"
-                              Name 17  ""
+                              MemberName 15(sbuf) 0  "@data"
+                              Name 17  "sbuf"
                               Name 29  "u"
                               Name 29  "u"
                               Name 78  "pos"
                               Name 78  "pos"
                               Name 80  "pos"
                               Name 80  "pos"
@@ -496,7 +496,7 @@ gl_FragCoord origin is upper left
                               Decorate 14 ArrayStride 4
                               Decorate 14 ArrayStride 4
                               MemberDecorate 15(sbuf) 0 Offset 0
                               MemberDecorate 15(sbuf) 0 Offset 0
                               Decorate 15(sbuf) BufferBlock
                               Decorate 15(sbuf) BufferBlock
-                              Decorate 17 DescriptorSet 0
+                              Decorate 17(sbuf) DescriptorSet 0
                               Decorate 80(pos) Location 0
                               Decorate 80(pos) Location 0
                               Decorate 83(@entryPointOutput) Location 0
                               Decorate 83(@entryPointOutput) Location 0
                2:             TypeVoid
                2:             TypeVoid
@@ -509,7 +509,7 @@ gl_FragCoord origin is upper left
               14:             TypeRuntimeArray 6(int)
               14:             TypeRuntimeArray 6(int)
         15(sbuf):             TypeStruct 14
         15(sbuf):             TypeStruct 14
               16:             TypePointer Uniform 15(sbuf)
               16:             TypePointer Uniform 15(sbuf)
-              17:     16(ptr) Variable Uniform
+        17(sbuf):     16(ptr) Variable Uniform
               18:             TypeInt 32 1
               18:             TypeInt 32 1
               19:     18(int) Constant 0
               19:     18(int) Constant 0
               20:     18(int) Constant 8
               20:     18(int) Constant 8
@@ -539,59 +539,59 @@ gl_FragCoord origin is upper left
               13:             Label
               13:             Label
            29(u):      7(ptr) Variable Function
            29(u):      7(ptr) Variable Function
               22:     18(int) ShiftRightArithmetic 20 21
               22:     18(int) ShiftRightArithmetic 20 21
-              24:     23(ptr) AccessChain 17 19 22
+              24:     23(ptr) AccessChain 17(sbuf) 19 22
               28:           2 AtomicIAdd 24 26 27 25
               28:           2 AtomicIAdd 24 26 27 25
               30:     18(int) ShiftRightArithmetic 20 21
               30:     18(int) ShiftRightArithmetic 20 21
-              31:     23(ptr) AccessChain 17 19 30
+              31:     23(ptr) AccessChain 17(sbuf) 19 30
               32:      6(int) AtomicIAdd 31 26 27 25
               32:      6(int) AtomicIAdd 31 26 27 25
                               Store 29(u) 32
                               Store 29(u) 32
               33:     18(int) ShiftRightArithmetic 20 21
               33:     18(int) ShiftRightArithmetic 20 21
-              34:     23(ptr) AccessChain 17 19 33
+              34:     23(ptr) AccessChain 17(sbuf) 19 33
               35:           2 AtomicAnd 34 26 27 25
               35:           2 AtomicAnd 34 26 27 25
               36:     18(int) ShiftRightArithmetic 20 21
               36:     18(int) ShiftRightArithmetic 20 21
-              37:     23(ptr) AccessChain 17 19 36
+              37:     23(ptr) AccessChain 17(sbuf) 19 36
               38:      6(int) AtomicAnd 37 26 27 25
               38:      6(int) AtomicAnd 37 26 27 25
                               Store 29(u) 38
                               Store 29(u) 38
               39:     18(int) ShiftRightArithmetic 20 21
               39:     18(int) ShiftRightArithmetic 20 21
-              40:     23(ptr) AccessChain 17 19 39
+              40:     23(ptr) AccessChain 17(sbuf) 19 39
               41:     18(int) AtomicCompareExchange 40 26 27 27 21 25
               41:     18(int) AtomicCompareExchange 40 26 27 27 21 25
               42:      6(int) Bitcast 41
               42:      6(int) Bitcast 41
                               Store 29(u) 42
                               Store 29(u) 42
               43:     18(int) ShiftRightArithmetic 20 21
               43:     18(int) ShiftRightArithmetic 20 21
-              44:     23(ptr) AccessChain 17 19 43
+              44:     23(ptr) AccessChain 17(sbuf) 19 43
               45:      6(int) AtomicExchange 44 26 27 25
               45:      6(int) AtomicExchange 44 26 27 25
                               Store 29(u) 45
                               Store 29(u) 45
               46:     18(int) ShiftRightArithmetic 20 21
               46:     18(int) ShiftRightArithmetic 20 21
-              47:     23(ptr) AccessChain 17 19 46
+              47:     23(ptr) AccessChain 17(sbuf) 19 46
               48:           2 AtomicSMax 47 26 27 25
               48:           2 AtomicSMax 47 26 27 25
               49:     18(int) ShiftRightArithmetic 20 21
               49:     18(int) ShiftRightArithmetic 20 21
-              50:     23(ptr) AccessChain 17 19 49
+              50:     23(ptr) AccessChain 17(sbuf) 19 49
               51:      6(int) AtomicUMax 50 26 27 25
               51:      6(int) AtomicUMax 50 26 27 25
                               Store 29(u) 51
                               Store 29(u) 51
               52:     18(int) ShiftRightArithmetic 20 21
               52:     18(int) ShiftRightArithmetic 20 21
-              53:     23(ptr) AccessChain 17 19 52
+              53:     23(ptr) AccessChain 17(sbuf) 19 52
               54:           2 AtomicSMin 53 26 27 25
               54:           2 AtomicSMin 53 26 27 25
               55:     18(int) ShiftRightArithmetic 20 21
               55:     18(int) ShiftRightArithmetic 20 21
-              56:     23(ptr) AccessChain 17 19 55
+              56:     23(ptr) AccessChain 17(sbuf) 19 55
               57:      6(int) AtomicUMin 56 26 27 25
               57:      6(int) AtomicUMin 56 26 27 25
                               Store 29(u) 57
                               Store 29(u) 57
               58:     18(int) ShiftRightArithmetic 20 21
               58:     18(int) ShiftRightArithmetic 20 21
-              59:     23(ptr) AccessChain 17 19 58
+              59:     23(ptr) AccessChain 17(sbuf) 19 58
               60:           2 AtomicOr 59 26 27 25
               60:           2 AtomicOr 59 26 27 25
               61:     18(int) ShiftRightArithmetic 20 21
               61:     18(int) ShiftRightArithmetic 20 21
-              62:     23(ptr) AccessChain 17 19 61
+              62:     23(ptr) AccessChain 17(sbuf) 19 61
               63:      6(int) AtomicOr 62 26 27 25
               63:      6(int) AtomicOr 62 26 27 25
                               Store 29(u) 63
                               Store 29(u) 63
               64:     18(int) ShiftRightArithmetic 20 21
               64:     18(int) ShiftRightArithmetic 20 21
-              65:     23(ptr) AccessChain 17 19 64
+              65:     23(ptr) AccessChain 17(sbuf) 19 64
               66:           2 AtomicXor 65 26 27 25
               66:           2 AtomicXor 65 26 27 25
               67:     18(int) ShiftRightArithmetic 20 21
               67:     18(int) ShiftRightArithmetic 20 21
-              68:     23(ptr) AccessChain 17 19 67
+              68:     23(ptr) AccessChain 17(sbuf) 19 67
               69:      6(int) AtomicXor 68 26 27 25
               69:      6(int) AtomicXor 68 26 27 25
                               Store 29(u) 69
                               Store 29(u) 69
               70:      6(int) Load 11(pos)
               70:      6(int) Load 11(pos)
               71:     18(int) ShiftRightLogical 70 21
               71:     18(int) ShiftRightLogical 70 21
-              72:     23(ptr) AccessChain 17 19 71
+              72:     23(ptr) AccessChain 17(sbuf) 19 71
               73:      6(int) Load 72
               73:      6(int) Load 72
               74:    8(float) ConvertUToF 73
               74:    8(float) ConvertUToF 73
               75:    9(fvec4) CompositeConstruct 74 74 74 74
               75:    9(fvec4) CompositeConstruct 74 74 74 74

+ 63 - 63
3rdparty/glslang/Test/baseResults/hlsl.structbuffer.byte.frag.out

@@ -10,8 +10,8 @@ gl_FragCoord origin is upper left
 0:7        move second child to first child (temp uint)
 0:7        move second child to first child (temp uint)
 0:7          'size' (temp uint)
 0:7          'size' (temp uint)
 0:7          array length (temp uint)
 0:7          array length (temp uint)
-0:7            sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:7              'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:7            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:7              'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:7              Constant:
 0:7              Constant:
 0:7                0 (const uint)
 0:7                0 (const uint)
 0:12      Branch: Return with expression
 0:12      Branch: Return with expression
@@ -19,9 +19,9 @@ gl_FragCoord origin is upper left
 0:10          add (temp 4-component vector of float)
 0:10          add (temp 4-component vector of float)
 0:9            add (temp 4-component vector of float)
 0:9            add (temp 4-component vector of float)
 0:9              Convert uint to float (temp float)
 0:9              Convert uint to float (temp float)
-0:9                indirect index (layout(row_major std430 ) readonly buffer uint)
-0:9                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:9                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:9                indirect index (layout(row_major std430 ) buffer uint)
+0:9                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:9                    'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:9                    Constant:
 0:9                    Constant:
 0:9                      0 (const uint)
 0:9                      0 (const uint)
 0:9                  right-shift (temp int)
 0:9                  right-shift (temp int)
@@ -42,14 +42,14 @@ gl_FragCoord origin is upper left
 0:10                          2 (const int)
 0:10                          2 (const int)
 0:?                     Construct vec2 (temp 2-component vector of uint)
 0:?                     Construct vec2 (temp 2-component vector of uint)
 0:10                      indirect index (temp float)
 0:10                      indirect index (temp float)
-0:10                        sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:10                          'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:10                        @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:10                          'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:10                          Constant:
 0:10                          Constant:
 0:10                            0 (const uint)
 0:10                            0 (const uint)
 0:10                        'byteAddrTemp' (temp int)
 0:10                        'byteAddrTemp' (temp int)
 0:10                      indirect index (temp float)
 0:10                      indirect index (temp float)
-0:10                        sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:10                          'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:10                        @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:10                          'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:10                          Constant:
 0:10                          Constant:
 0:10                            0 (const uint)
 0:10                            0 (const uint)
 0:10                        add (temp int)
 0:10                        add (temp int)
@@ -74,14 +74,14 @@ gl_FragCoord origin is upper left
 0:11                        2 (const int)
 0:11                        2 (const int)
 0:?                   Construct vec3 (temp 3-component vector of uint)
 0:?                   Construct vec3 (temp 3-component vector of uint)
 0:11                    indirect index (temp float)
 0:11                    indirect index (temp float)
-0:11                      sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:11                        'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:11                      @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:11                        'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:11                        Constant:
 0:11                        Constant:
 0:11                          0 (const uint)
 0:11                          0 (const uint)
 0:11                      'byteAddrTemp' (temp int)
 0:11                      'byteAddrTemp' (temp int)
 0:11                    indirect index (temp float)
 0:11                    indirect index (temp float)
-0:11                      sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:11                        'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:11                      @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:11                        'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:11                        Constant:
 0:11                        Constant:
 0:11                          0 (const uint)
 0:11                          0 (const uint)
 0:11                      add (temp int)
 0:11                      add (temp int)
@@ -89,8 +89,8 @@ gl_FragCoord origin is upper left
 0:11                        Constant:
 0:11                        Constant:
 0:11                          1 (const int)
 0:11                          1 (const int)
 0:11                    indirect index (temp float)
 0:11                    indirect index (temp float)
-0:11                      sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:11                        'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:11                      @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:11                        'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:11                        Constant:
 0:11                        Constant:
 0:11                          0 (const uint)
 0:11                          0 (const uint)
 0:11                      add (temp int)
 0:11                      add (temp int)
@@ -112,14 +112,14 @@ gl_FragCoord origin is upper left
 0:12                    2 (const int)
 0:12                    2 (const int)
 0:?               Construct vec4 (temp 4-component vector of uint)
 0:?               Construct vec4 (temp 4-component vector of uint)
 0:12                indirect index (temp float)
 0:12                indirect index (temp float)
-0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:12                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:12                    'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:12                    Constant:
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                      0 (const uint)
 0:12                  'byteAddrTemp' (temp int)
 0:12                  'byteAddrTemp' (temp int)
 0:12                indirect index (temp float)
 0:12                indirect index (temp float)
-0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:12                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:12                    'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:12                    Constant:
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                      0 (const uint)
 0:12                  add (temp int)
 0:12                  add (temp int)
@@ -127,8 +127,8 @@ gl_FragCoord origin is upper left
 0:12                    Constant:
 0:12                    Constant:
 0:12                      1 (const int)
 0:12                      1 (const int)
 0:12                indirect index (temp float)
 0:12                indirect index (temp float)
-0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:12                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:12                    'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:12                    Constant:
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                      0 (const uint)
 0:12                  add (temp int)
 0:12                  add (temp int)
@@ -136,8 +136,8 @@ gl_FragCoord origin is upper left
 0:12                    Constant:
 0:12                    Constant:
 0:12                      2 (const int)
 0:12                      2 (const int)
 0:12                indirect index (temp float)
 0:12                indirect index (temp float)
-0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:12                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:12                    'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:12                    Constant:
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                      0 (const uint)
 0:12                  add (temp int)
 0:12                  add (temp int)
@@ -155,7 +155,7 @@ gl_FragCoord origin is upper left
 0:5        Function Call: @main(u1; (temp 4-component vector of float)
 0:5        Function Call: @main(u1; (temp 4-component vector of float)
 0:?           'pos' (temp uint)
 0:?           'pos' (temp uint)
 0:?   Linker Objects
 0:?   Linker Objects
-0:?     'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:?     'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     'pos' (layout(location=0 ) in uint)
 0:?     'pos' (layout(location=0 ) in uint)
 
 
@@ -174,8 +174,8 @@ gl_FragCoord origin is upper left
 0:7        move second child to first child (temp uint)
 0:7        move second child to first child (temp uint)
 0:7          'size' (temp uint)
 0:7          'size' (temp uint)
 0:7          array length (temp uint)
 0:7          array length (temp uint)
-0:7            sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:7              'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:7            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:7              'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:7              Constant:
 0:7              Constant:
 0:7                0 (const uint)
 0:7                0 (const uint)
 0:12      Branch: Return with expression
 0:12      Branch: Return with expression
@@ -183,9 +183,9 @@ gl_FragCoord origin is upper left
 0:10          add (temp 4-component vector of float)
 0:10          add (temp 4-component vector of float)
 0:9            add (temp 4-component vector of float)
 0:9            add (temp 4-component vector of float)
 0:9              Convert uint to float (temp float)
 0:9              Convert uint to float (temp float)
-0:9                indirect index (layout(row_major std430 ) readonly buffer uint)
-0:9                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:9                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:9                indirect index (layout(row_major std430 ) buffer uint)
+0:9                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:9                    'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:9                    Constant:
 0:9                    Constant:
 0:9                      0 (const uint)
 0:9                      0 (const uint)
 0:9                  right-shift (temp int)
 0:9                  right-shift (temp int)
@@ -206,14 +206,14 @@ gl_FragCoord origin is upper left
 0:10                          2 (const int)
 0:10                          2 (const int)
 0:?                     Construct vec2 (temp 2-component vector of uint)
 0:?                     Construct vec2 (temp 2-component vector of uint)
 0:10                      indirect index (temp float)
 0:10                      indirect index (temp float)
-0:10                        sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:10                          'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:10                        @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:10                          'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:10                          Constant:
 0:10                          Constant:
 0:10                            0 (const uint)
 0:10                            0 (const uint)
 0:10                        'byteAddrTemp' (temp int)
 0:10                        'byteAddrTemp' (temp int)
 0:10                      indirect index (temp float)
 0:10                      indirect index (temp float)
-0:10                        sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:10                          'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:10                        @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:10                          'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:10                          Constant:
 0:10                          Constant:
 0:10                            0 (const uint)
 0:10                            0 (const uint)
 0:10                        add (temp int)
 0:10                        add (temp int)
@@ -238,14 +238,14 @@ gl_FragCoord origin is upper left
 0:11                        2 (const int)
 0:11                        2 (const int)
 0:?                   Construct vec3 (temp 3-component vector of uint)
 0:?                   Construct vec3 (temp 3-component vector of uint)
 0:11                    indirect index (temp float)
 0:11                    indirect index (temp float)
-0:11                      sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:11                        'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:11                      @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:11                        'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:11                        Constant:
 0:11                        Constant:
 0:11                          0 (const uint)
 0:11                          0 (const uint)
 0:11                      'byteAddrTemp' (temp int)
 0:11                      'byteAddrTemp' (temp int)
 0:11                    indirect index (temp float)
 0:11                    indirect index (temp float)
-0:11                      sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:11                        'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:11                      @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:11                        'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:11                        Constant:
 0:11                        Constant:
 0:11                          0 (const uint)
 0:11                          0 (const uint)
 0:11                      add (temp int)
 0:11                      add (temp int)
@@ -253,8 +253,8 @@ gl_FragCoord origin is upper left
 0:11                        Constant:
 0:11                        Constant:
 0:11                          1 (const int)
 0:11                          1 (const int)
 0:11                    indirect index (temp float)
 0:11                    indirect index (temp float)
-0:11                      sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:11                        'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:11                      @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:11                        'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:11                        Constant:
 0:11                        Constant:
 0:11                          0 (const uint)
 0:11                          0 (const uint)
 0:11                      add (temp int)
 0:11                      add (temp int)
@@ -276,14 +276,14 @@ gl_FragCoord origin is upper left
 0:12                    2 (const int)
 0:12                    2 (const int)
 0:?               Construct vec4 (temp 4-component vector of uint)
 0:?               Construct vec4 (temp 4-component vector of uint)
 0:12                indirect index (temp float)
 0:12                indirect index (temp float)
-0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:12                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:12                    'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:12                    Constant:
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                      0 (const uint)
 0:12                  'byteAddrTemp' (temp int)
 0:12                  'byteAddrTemp' (temp int)
 0:12                indirect index (temp float)
 0:12                indirect index (temp float)
-0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:12                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:12                    'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:12                    Constant:
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                      0 (const uint)
 0:12                  add (temp int)
 0:12                  add (temp int)
@@ -291,8 +291,8 @@ gl_FragCoord origin is upper left
 0:12                    Constant:
 0:12                    Constant:
 0:12                      1 (const int)
 0:12                      1 (const int)
 0:12                indirect index (temp float)
 0:12                indirect index (temp float)
-0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:12                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:12                    'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:12                    Constant:
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                      0 (const uint)
 0:12                  add (temp int)
 0:12                  add (temp int)
@@ -300,8 +300,8 @@ gl_FragCoord origin is upper left
 0:12                    Constant:
 0:12                    Constant:
 0:12                      2 (const int)
 0:12                      2 (const int)
 0:12                indirect index (temp float)
 0:12                indirect index (temp float)
-0:12                  sbuf: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of uint)
-0:12                    'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:12                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:12                    'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:12                    Constant:
 0:12                    Constant:
 0:12                      0 (const uint)
 0:12                      0 (const uint)
 0:12                  add (temp int)
 0:12                  add (temp int)
@@ -319,7 +319,7 @@ gl_FragCoord origin is upper left
 0:5        Function Call: @main(u1; (temp 4-component vector of float)
 0:5        Function Call: @main(u1; (temp 4-component vector of float)
 0:?           'pos' (temp uint)
 0:?           'pos' (temp uint)
 0:?   Linker Objects
 0:?   Linker Objects
-0:?     'anon@0' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of uint sbuf})
+0:?     'sbuf' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint @data})
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     'pos' (layout(location=0 ) in uint)
 0:?     'pos' (layout(location=0 ) in uint)
 
 
@@ -337,8 +337,8 @@ gl_FragCoord origin is upper left
                               Name 11  "pos"
                               Name 11  "pos"
                               Name 14  "size"
                               Name 14  "size"
                               Name 16  "sbuf"
                               Name 16  "sbuf"
-                              MemberName 16(sbuf) 0  "sbuf"
-                              Name 18  ""
+                              MemberName 16(sbuf) 0  "@data"
+                              Name 18  "sbuf"
                               Name 30  "byteAddrTemp"
                               Name 30  "byteAddrTemp"
                               Name 53  "byteAddrTemp"
                               Name 53  "byteAddrTemp"
                               Name 78  "byteAddrTemp"
                               Name 78  "byteAddrTemp"
@@ -350,7 +350,7 @@ gl_FragCoord origin is upper left
                               MemberDecorate 16(sbuf) 0 NonWritable
                               MemberDecorate 16(sbuf) 0 NonWritable
                               MemberDecorate 16(sbuf) 0 Offset 0
                               MemberDecorate 16(sbuf) 0 Offset 0
                               Decorate 16(sbuf) BufferBlock
                               Decorate 16(sbuf) BufferBlock
-                              Decorate 18 DescriptorSet 0
+                              Decorate 18(sbuf) DescriptorSet 0
                               Decorate 107(pos) Location 0
                               Decorate 107(pos) Location 0
                               Decorate 110(@entryPointOutput) Location 0
                               Decorate 110(@entryPointOutput) Location 0
                2:             TypeVoid
                2:             TypeVoid
@@ -363,7 +363,7 @@ gl_FragCoord origin is upper left
               15:             TypeRuntimeArray 6(int)
               15:             TypeRuntimeArray 6(int)
         16(sbuf):             TypeStruct 15
         16(sbuf):             TypeStruct 15
               17:             TypePointer Uniform 16(sbuf)
               17:             TypePointer Uniform 16(sbuf)
-              18:     17(ptr) Variable Uniform
+        18(sbuf):     17(ptr) Variable Uniform
               19:             TypeInt 32 1
               19:             TypeInt 32 1
               21:     19(int) Constant 0
               21:     19(int) Constant 0
               23:     19(int) Constant 2
               23:     19(int) Constant 2
@@ -403,11 +403,11 @@ gl_FragCoord origin is upper left
 30(byteAddrTemp):     29(ptr) Variable Function
 30(byteAddrTemp):     29(ptr) Variable Function
 53(byteAddrTemp):     29(ptr) Variable Function
 53(byteAddrTemp):     29(ptr) Variable Function
 78(byteAddrTemp):     29(ptr) Variable Function
 78(byteAddrTemp):     29(ptr) Variable Function
-              20:     19(int) ArrayLength 18 0
+              20:     19(int) ArrayLength 18(sbuf) 0
                               Store 14(size) 20
                               Store 14(size) 20
               22:      6(int) Load 11(pos)
               22:      6(int) Load 11(pos)
               24:     19(int) ShiftRightLogical 22 23
               24:     19(int) ShiftRightLogical 22 23
-              26:     25(ptr) AccessChain 18 21 24
+              26:     25(ptr) AccessChain 18(sbuf) 21 24
               27:      6(int) Load 26
               27:      6(int) Load 26
               28:    8(float) ConvertUToF 27
               28:    8(float) ConvertUToF 27
               31:      6(int) Load 11(pos)
               31:      6(int) Load 11(pos)
@@ -415,11 +415,11 @@ gl_FragCoord origin is upper left
               34:     19(int) ShiftRightLogical 33 23
               34:     19(int) ShiftRightLogical 33 23
                               Store 30(byteAddrTemp) 34
                               Store 30(byteAddrTemp) 34
               35:     19(int) Load 30(byteAddrTemp)
               35:     19(int) Load 30(byteAddrTemp)
-              36:     25(ptr) AccessChain 18 21 35
+              36:     25(ptr) AccessChain 18(sbuf) 21 35
               37:      6(int) Load 36
               37:      6(int) Load 36
               38:     19(int) Load 30(byteAddrTemp)
               38:     19(int) Load 30(byteAddrTemp)
               40:     19(int) IAdd 38 39
               40:     19(int) IAdd 38 39
-              41:     25(ptr) AccessChain 18 21 40
+              41:     25(ptr) AccessChain 18(sbuf) 21 40
               42:      6(int) Load 41
               42:      6(int) Load 41
               44:   43(ivec2) CompositeConstruct 37 42
               44:   43(ivec2) CompositeConstruct 37 42
               46:   45(fvec2) ConvertUToF 44
               46:   45(fvec2) ConvertUToF 44
@@ -433,15 +433,15 @@ gl_FragCoord origin is upper left
               57:     19(int) ShiftRightLogical 56 23
               57:     19(int) ShiftRightLogical 56 23
                               Store 53(byteAddrTemp) 57
                               Store 53(byteAddrTemp) 57
               58:     19(int) Load 53(byteAddrTemp)
               58:     19(int) Load 53(byteAddrTemp)
-              59:     25(ptr) AccessChain 18 21 58
+              59:     25(ptr) AccessChain 18(sbuf) 21 58
               60:      6(int) Load 59
               60:      6(int) Load 59
               61:     19(int) Load 53(byteAddrTemp)
               61:     19(int) Load 53(byteAddrTemp)
               62:     19(int) IAdd 61 39
               62:     19(int) IAdd 61 39
-              63:     25(ptr) AccessChain 18 21 62
+              63:     25(ptr) AccessChain 18(sbuf) 21 62
               64:      6(int) Load 63
               64:      6(int) Load 63
               65:     19(int) Load 53(byteAddrTemp)
               65:     19(int) Load 53(byteAddrTemp)
               66:     19(int) IAdd 65 23
               66:     19(int) IAdd 65 23
-              67:     25(ptr) AccessChain 18 21 66
+              67:     25(ptr) AccessChain 18(sbuf) 21 66
               68:      6(int) Load 67
               68:      6(int) Load 67
               70:   69(ivec3) CompositeConstruct 60 64 68
               70:   69(ivec3) CompositeConstruct 60 64 68
               72:   71(fvec3) ConvertUToF 70
               72:   71(fvec3) ConvertUToF 70
@@ -455,19 +455,19 @@ gl_FragCoord origin is upper left
               82:     19(int) ShiftRightLogical 81 23
               82:     19(int) ShiftRightLogical 81 23
                               Store 78(byteAddrTemp) 82
                               Store 78(byteAddrTemp) 82
               83:     19(int) Load 78(byteAddrTemp)
               83:     19(int) Load 78(byteAddrTemp)
-              84:     25(ptr) AccessChain 18 21 83
+              84:     25(ptr) AccessChain 18(sbuf) 21 83
               85:      6(int) Load 84
               85:      6(int) Load 84
               86:     19(int) Load 78(byteAddrTemp)
               86:     19(int) Load 78(byteAddrTemp)
               87:     19(int) IAdd 86 39
               87:     19(int) IAdd 86 39
-              88:     25(ptr) AccessChain 18 21 87
+              88:     25(ptr) AccessChain 18(sbuf) 21 87
               89:      6(int) Load 88
               89:      6(int) Load 88
               90:     19(int) Load 78(byteAddrTemp)
               90:     19(int) Load 78(byteAddrTemp)
               91:     19(int) IAdd 90 23
               91:     19(int) IAdd 90 23
-              92:     25(ptr) AccessChain 18 21 91
+              92:     25(ptr) AccessChain 18(sbuf) 21 91
               93:      6(int) Load 92
               93:      6(int) Load 92
               94:     19(int) Load 78(byteAddrTemp)
               94:     19(int) Load 78(byteAddrTemp)
               96:     19(int) IAdd 94 95
               96:     19(int) IAdd 94 95
-              97:     25(ptr) AccessChain 18 21 96
+              97:     25(ptr) AccessChain 18(sbuf) 21 96
               98:      6(int) Load 97
               98:      6(int) Load 97
              100:   99(ivec4) CompositeConstruct 85 89 93 98
              100:   99(ivec4) CompositeConstruct 85 89 93 98
              101:    9(fvec4) ConvertUToF 100
              101:    9(fvec4) ConvertUToF 100

+ 45 - 45
3rdparty/glslang/Test/baseResults/hlsl.structbuffer.coherent.frag.out

@@ -7,9 +7,9 @@ gl_FragCoord origin is upper left
 0:12      'pos' (in uint)
 0:12      'pos' (in uint)
 0:?     Sequence
 0:?     Sequence
 0:13      move second child to first child (temp float)
 0:13      move second child to first child (temp float)
-0:13        indirect index (layout(row_major std430 ) coherent temp float)
-0:13          sbuf2: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of float)
-0:13            'anon@1' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of float sbuf2})
+0:13        indirect index (layout(row_major std430 ) buffer float)
+0:13          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
+0:13            'sbuf2' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:13            Constant:
 0:13            Constant:
 0:13              0 (const uint)
 0:13              0 (const uint)
 0:13          add (temp uint)
 0:13          add (temp uint)
@@ -22,8 +22,8 @@ gl_FragCoord origin is upper left
 0:17        move second child to first child (temp uint)
 0:17        move second child to first child (temp uint)
 0:17          'size' (temp uint)
 0:17          'size' (temp uint)
 0:17          array length (temp uint)
 0:17          array length (temp uint)
-0:17            sbuf: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
-0:17              'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
+0:17            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
+0:17              'sbuf' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
 0:17              Constant:
 0:17              Constant:
 0:17                0 (const uint)
 0:17                0 (const uint)
 0:17        move second child to first child (temp uint)
 0:17        move second child to first child (temp uint)
@@ -33,9 +33,9 @@ gl_FragCoord origin is upper left
 0:19      Test condition and select (temp void)
 0:19      Test condition and select (temp void)
 0:19        Condition
 0:19        Condition
 0:19        test: direct index for structure (temp bool)
 0:19        test: direct index for structure (temp bool)
-0:19          indirect index (layout(row_major std430 ) coherent temp structure{temp 3-component vector of float color, temp bool test})
-0:19            sbuf: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
-0:19              'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
+0:19          indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test})
+0:19            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
+0:19              'sbuf' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
 0:19              Constant:
 0:19              Constant:
 0:19                0 (const uint)
 0:19                0 (const uint)
 0:19            'pos' (in uint)
 0:19            'pos' (in uint)
@@ -46,17 +46,17 @@ gl_FragCoord origin is upper left
 0:?           Construct vec4 (temp 4-component vector of float)
 0:?           Construct vec4 (temp 4-component vector of float)
 0:20            add (temp 3-component vector of float)
 0:20            add (temp 3-component vector of float)
 0:20              color: direct index for structure (temp 3-component vector of float)
 0:20              color: direct index for structure (temp 3-component vector of float)
-0:20                indirect index (layout(row_major std430 ) coherent temp structure{temp 3-component vector of float color, temp bool test})
-0:20                  sbuf: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
-0:20                    'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
+0:20                indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test})
+0:20                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
+0:20                    'sbuf' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
 0:20                    Constant:
 0:20                    Constant:
 0:20                      0 (const uint)
 0:20                      0 (const uint)
 0:20                  'pos' (in uint)
 0:20                  'pos' (in uint)
 0:20                Constant:
 0:20                Constant:
 0:20                  0 (const int)
 0:20                  0 (const int)
-0:20              indirect index (layout(row_major std430 ) coherent temp float)
-0:20                sbuf2: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of float)
-0:20                  'anon@1' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of float sbuf2})
+0:20              indirect index (layout(row_major std430 ) buffer float)
+0:20                @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
+0:20                  'sbuf2' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:20                  Constant:
 0:20                  Constant:
 0:20                    0 (const uint)
 0:20                    0 (const uint)
 0:20                'pos' (in uint)
 0:20                'pos' (in uint)
@@ -80,8 +80,8 @@ gl_FragCoord origin is upper left
 0:12        Function Call: @main(u1; (temp 4-component vector of float)
 0:12        Function Call: @main(u1; (temp 4-component vector of float)
 0:?           'pos' (temp uint)
 0:?           'pos' (temp uint)
 0:?   Linker Objects
 0:?   Linker Objects
-0:?     'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
-0:?     'anon@1' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of float sbuf2})
+0:?     'sbuf' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
+0:?     'sbuf2' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     'pos' (layout(location=0 ) in uint)
 0:?     'pos' (layout(location=0 ) in uint)
 
 
@@ -97,9 +97,9 @@ gl_FragCoord origin is upper left
 0:12      'pos' (in uint)
 0:12      'pos' (in uint)
 0:?     Sequence
 0:?     Sequence
 0:13      move second child to first child (temp float)
 0:13      move second child to first child (temp float)
-0:13        indirect index (layout(row_major std430 ) coherent temp float)
-0:13          sbuf2: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of float)
-0:13            'anon@1' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of float sbuf2})
+0:13        indirect index (layout(row_major std430 ) buffer float)
+0:13          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
+0:13            'sbuf2' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:13            Constant:
 0:13            Constant:
 0:13              0 (const uint)
 0:13              0 (const uint)
 0:13          add (temp uint)
 0:13          add (temp uint)
@@ -112,8 +112,8 @@ gl_FragCoord origin is upper left
 0:17        move second child to first child (temp uint)
 0:17        move second child to first child (temp uint)
 0:17          'size' (temp uint)
 0:17          'size' (temp uint)
 0:17          array length (temp uint)
 0:17          array length (temp uint)
-0:17            sbuf: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
-0:17              'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
+0:17            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
+0:17              'sbuf' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
 0:17              Constant:
 0:17              Constant:
 0:17                0 (const uint)
 0:17                0 (const uint)
 0:17        move second child to first child (temp uint)
 0:17        move second child to first child (temp uint)
@@ -123,9 +123,9 @@ gl_FragCoord origin is upper left
 0:19      Test condition and select (temp void)
 0:19      Test condition and select (temp void)
 0:19        Condition
 0:19        Condition
 0:19        test: direct index for structure (temp bool)
 0:19        test: direct index for structure (temp bool)
-0:19          indirect index (layout(row_major std430 ) coherent temp structure{temp 3-component vector of float color, temp bool test})
-0:19            sbuf: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
-0:19              'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
+0:19          indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test})
+0:19            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
+0:19              'sbuf' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
 0:19              Constant:
 0:19              Constant:
 0:19                0 (const uint)
 0:19                0 (const uint)
 0:19            'pos' (in uint)
 0:19            'pos' (in uint)
@@ -136,17 +136,17 @@ gl_FragCoord origin is upper left
 0:?           Construct vec4 (temp 4-component vector of float)
 0:?           Construct vec4 (temp 4-component vector of float)
 0:20            add (temp 3-component vector of float)
 0:20            add (temp 3-component vector of float)
 0:20              color: direct index for structure (temp 3-component vector of float)
 0:20              color: direct index for structure (temp 3-component vector of float)
-0:20                indirect index (layout(row_major std430 ) coherent temp structure{temp 3-component vector of float color, temp bool test})
-0:20                  sbuf: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
-0:20                    'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
+0:20                indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test})
+0:20                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
+0:20                    'sbuf' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
 0:20                    Constant:
 0:20                    Constant:
 0:20                      0 (const uint)
 0:20                      0 (const uint)
 0:20                  'pos' (in uint)
 0:20                  'pos' (in uint)
 0:20                Constant:
 0:20                Constant:
 0:20                  0 (const int)
 0:20                  0 (const int)
-0:20              indirect index (layout(row_major std430 ) coherent temp float)
-0:20                sbuf2: direct index for structure (layout(row_major std430 ) coherent buffer implicitly-sized array of float)
-0:20                  'anon@1' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of float sbuf2})
+0:20              indirect index (layout(row_major std430 ) buffer float)
+0:20                @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
+0:20                  'sbuf2' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:20                  Constant:
 0:20                  Constant:
 0:20                    0 (const uint)
 0:20                    0 (const uint)
 0:20                'pos' (in uint)
 0:20                'pos' (in uint)
@@ -170,8 +170,8 @@ gl_FragCoord origin is upper left
 0:12        Function Call: @main(u1; (temp 4-component vector of float)
 0:12        Function Call: @main(u1; (temp 4-component vector of float)
 0:?           'pos' (temp uint)
 0:?           'pos' (temp uint)
 0:?   Linker Objects
 0:?   Linker Objects
-0:?     'anon@0' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
-0:?     'anon@1' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) coherent buffer implicitly-sized array of float sbuf2})
+0:?     'sbuf' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
+0:?     'sbuf2' (layout(row_major std430 ) coherent buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     'pos' (layout(location=0 ) in uint)
 0:?     'pos' (layout(location=0 ) in uint)
 
 
@@ -188,15 +188,15 @@ gl_FragCoord origin is upper left
                               Name 12  "@main(u1;"
                               Name 12  "@main(u1;"
                               Name 11  "pos"
                               Name 11  "pos"
                               Name 15  "sbuf2"
                               Name 15  "sbuf2"
-                              MemberName 15(sbuf2) 0  "sbuf2"
-                              Name 17  ""
+                              MemberName 15(sbuf2) 0  "@data"
+                              Name 17  "sbuf2"
                               Name 26  "size"
                               Name 26  "size"
                               Name 28  "sb_t"
                               Name 28  "sb_t"
                               MemberName 28(sb_t) 0  "color"
                               MemberName 28(sb_t) 0  "color"
                               MemberName 28(sb_t) 1  "test"
                               MemberName 28(sb_t) 1  "test"
                               Name 30  "sbuf"
                               Name 30  "sbuf"
-                              MemberName 30(sbuf) 0  "sbuf"
-                              Name 32  ""
+                              MemberName 30(sbuf) 0  "@data"
+                              Name 32  "sbuf"
                               Name 34  "stride"
                               Name 34  "stride"
                               Name 69  "pos"
                               Name 69  "pos"
                               Name 71  "pos"
                               Name 71  "pos"
@@ -206,7 +206,7 @@ gl_FragCoord origin is upper left
                               MemberDecorate 15(sbuf2) 0 Coherent
                               MemberDecorate 15(sbuf2) 0 Coherent
                               MemberDecorate 15(sbuf2) 0 Offset 0
                               MemberDecorate 15(sbuf2) 0 Offset 0
                               Decorate 15(sbuf2) BufferBlock
                               Decorate 15(sbuf2) BufferBlock
-                              Decorate 17 DescriptorSet 0
+                              Decorate 17(sbuf2) DescriptorSet 0
                               MemberDecorate 28(sb_t) 0 Coherent
                               MemberDecorate 28(sb_t) 0 Coherent
                               MemberDecorate 28(sb_t) 0 Offset 0
                               MemberDecorate 28(sb_t) 0 Offset 0
                               MemberDecorate 28(sb_t) 1 Coherent
                               MemberDecorate 28(sb_t) 1 Coherent
@@ -215,7 +215,7 @@ gl_FragCoord origin is upper left
                               MemberDecorate 30(sbuf) 0 Coherent
                               MemberDecorate 30(sbuf) 0 Coherent
                               MemberDecorate 30(sbuf) 0 Offset 0
                               MemberDecorate 30(sbuf) 0 Offset 0
                               Decorate 30(sbuf) BufferBlock
                               Decorate 30(sbuf) BufferBlock
-                              Decorate 32 DescriptorSet 0
+                              Decorate 32(sbuf) DescriptorSet 0
                               Decorate 71(pos) Location 0
                               Decorate 71(pos) Location 0
                               Decorate 74(@entryPointOutput) Location 0
                               Decorate 74(@entryPointOutput) Location 0
                2:             TypeVoid
                2:             TypeVoid
@@ -228,7 +228,7 @@ gl_FragCoord origin is upper left
               14:             TypeRuntimeArray 8(float)
               14:             TypeRuntimeArray 8(float)
        15(sbuf2):             TypeStruct 14
        15(sbuf2):             TypeStruct 14
               16:             TypePointer Uniform 15(sbuf2)
               16:             TypePointer Uniform 15(sbuf2)
-              17:     16(ptr) Variable Uniform
+       17(sbuf2):     16(ptr) Variable Uniform
               18:             TypeInt 32 1
               18:             TypeInt 32 1
               19:     18(int) Constant 0
               19:     18(int) Constant 0
               21:      6(int) Constant 1
               21:      6(int) Constant 1
@@ -239,7 +239,7 @@ gl_FragCoord origin is upper left
               29:             TypeRuntimeArray 28(sb_t)
               29:             TypeRuntimeArray 28(sb_t)
         30(sbuf):             TypeStruct 29
         30(sbuf):             TypeStruct 29
               31:             TypePointer Uniform 30(sbuf)
               31:             TypePointer Uniform 30(sbuf)
-              32:     31(ptr) Variable Uniform
+        32(sbuf):     31(ptr) Variable Uniform
               35:      6(int) Constant 16
               35:      6(int) Constant 16
               37:     18(int) Constant 1
               37:     18(int) Constant 1
               38:             TypePointer Uniform 6(int)
               38:             TypePointer Uniform 6(int)
@@ -270,23 +270,23 @@ gl_FragCoord origin is upper left
       34(stride):      7(ptr) Variable Function
       34(stride):      7(ptr) Variable Function
               20:      6(int) Load 11(pos)
               20:      6(int) Load 11(pos)
               22:      6(int) IAdd 20 21
               22:      6(int) IAdd 20 21
-              25:     24(ptr) AccessChain 17 19 22
+              25:     24(ptr) AccessChain 17(sbuf2) 19 22
                               Store 25 23
                               Store 25 23
-              33:     18(int) ArrayLength 32 0
+              33:     18(int) ArrayLength 32(sbuf) 0
                               Store 26(size) 33
                               Store 26(size) 33
                               Store 34(stride) 35
                               Store 34(stride) 35
               36:      6(int) Load 11(pos)
               36:      6(int) Load 11(pos)
-              39:     38(ptr) AccessChain 32 19 36 37
+              39:     38(ptr) AccessChain 32(sbuf) 19 36 37
               40:      6(int) Load 39
               40:      6(int) Load 39
               43:    41(bool) INotEqual 40 42
               43:    41(bool) INotEqual 40 42
                               SelectionMerge 45 None
                               SelectionMerge 45 None
                               BranchConditional 43 44 61
                               BranchConditional 43 44 61
               44:               Label
               44:               Label
               46:      6(int)   Load 11(pos)
               46:      6(int)   Load 11(pos)
-              48:     47(ptr)   AccessChain 32 19 46 19
+              48:     47(ptr)   AccessChain 32(sbuf) 19 46 19
               49:   27(fvec3)   Load 48
               49:   27(fvec3)   Load 48
               50:      6(int)   Load 11(pos)
               50:      6(int)   Load 11(pos)
-              51:     24(ptr)   AccessChain 17 19 50
+              51:     24(ptr)   AccessChain 17(sbuf2) 19 50
               52:    8(float)   Load 51
               52:    8(float)   Load 51
               53:   27(fvec3)   CompositeConstruct 52 52 52
               53:   27(fvec3)   CompositeConstruct 52 52 52
               54:   27(fvec3)   FAdd 49 53
               54:   27(fvec3)   FAdd 49 53

+ 266 - 0
3rdparty/glslang/Test/baseResults/hlsl.structbuffer.fn.frag.out

@@ -0,0 +1,266 @@
+hlsl.structbuffer.fn.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:9  Function Definition: get(block--vu4[0]1;u1; (temp 4-component vector of uint)
+0:9    Function Parameters: 
+0:9      'sb' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:9      'bufferOffset' (in uint)
+0:?     Sequence
+0:10      Branch: Return with expression
+0:10        indirect index (layout(row_major std430 ) buffer 4-component vector of uint)
+0:10          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint)
+0:10            'sb' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:10            Constant:
+0:10              0 (const uint)
+0:10          'bufferOffset' (in uint)
+0:14  Function Definition: set(block--vu4[0]1;u1;vu4; (temp void)
+0:14    Function Parameters: 
+0:14      'sb' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:14      'bufferOffset' (in uint)
+0:14      'data' (in 4-component vector of uint)
+0:?     Sequence
+0:15      move second child to first child (temp 4-component vector of uint)
+0:15        indirect index (layout(row_major std430 ) buffer 4-component vector of uint)
+0:15          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint)
+0:15            'sb' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:15            Constant:
+0:15              0 (const uint)
+0:15          'bufferOffset' (in uint)
+0:15        'data' (in 4-component vector of uint)
+0:19  Function Definition: @main(u1; (temp 4-component vector of float)
+0:19    Function Parameters: 
+0:19      'pos' (in uint)
+0:?     Sequence
+0:20      Function Call: set(block--vu4[0]1;u1;vu4; (temp void)
+0:20        'sbuf2' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:20        Constant:
+0:20          2 (const uint)
+0:20        Function Call: get(block--vu4[0]1;u1; (temp 4-component vector of uint)
+0:20          'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:20          Constant:
+0:20            3 (const uint)
+0:22      Branch: Return with expression
+0:22        Constant:
+0:22          0.000000
+0:22          0.000000
+0:22          0.000000
+0:22          0.000000
+0:19  Function Definition: main( (temp void)
+0:19    Function Parameters: 
+0:?     Sequence
+0:19      move second child to first child (temp uint)
+0:?         'pos' (temp uint)
+0:?         'pos' (layout(location=0 ) in uint)
+0:19      move second child to first child (temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:19        Function Call: @main(u1; (temp 4-component vector of float)
+0:?           'pos' (temp uint)
+0:?   Linker Objects
+0:?     'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:?     'sbuf2' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:?     'sbuf3' (layout(binding=12 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of 3-component vector of uint @data})
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'pos' (layout(location=0 ) in uint)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:9  Function Definition: get(block--vu4[0]1;u1; (temp 4-component vector of uint)
+0:9    Function Parameters: 
+0:9      'sb' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:9      'bufferOffset' (in uint)
+0:?     Sequence
+0:10      Branch: Return with expression
+0:10        indirect index (layout(row_major std430 ) buffer 4-component vector of uint)
+0:10          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint)
+0:10            'sb' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:10            Constant:
+0:10              0 (const uint)
+0:10          'bufferOffset' (in uint)
+0:14  Function Definition: set(block--vu4[0]1;u1;vu4; (temp void)
+0:14    Function Parameters: 
+0:14      'sb' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:14      'bufferOffset' (in uint)
+0:14      'data' (in 4-component vector of uint)
+0:?     Sequence
+0:15      move second child to first child (temp 4-component vector of uint)
+0:15        indirect index (layout(row_major std430 ) buffer 4-component vector of uint)
+0:15          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint)
+0:15            'sb' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:15            Constant:
+0:15              0 (const uint)
+0:15          'bufferOffset' (in uint)
+0:15        'data' (in 4-component vector of uint)
+0:19  Function Definition: @main(u1; (temp 4-component vector of float)
+0:19    Function Parameters: 
+0:19      'pos' (in uint)
+0:?     Sequence
+0:20      Function Call: set(block--vu4[0]1;u1;vu4; (temp void)
+0:20        'sbuf2' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:20        Constant:
+0:20          2 (const uint)
+0:20        Function Call: get(block--vu4[0]1;u1; (temp 4-component vector of uint)
+0:20          'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:20          Constant:
+0:20            3 (const uint)
+0:22      Branch: Return with expression
+0:22        Constant:
+0:22          0.000000
+0:22          0.000000
+0:22          0.000000
+0:22          0.000000
+0:19  Function Definition: main( (temp void)
+0:19    Function Parameters: 
+0:?     Sequence
+0:19      move second child to first child (temp uint)
+0:?         'pos' (temp uint)
+0:?         'pos' (layout(location=0 ) in uint)
+0:19      move second child to first child (temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:19        Function Call: @main(u1; (temp 4-component vector of float)
+0:?           'pos' (temp uint)
+0:?   Linker Objects
+0:?     'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:?     'sbuf2' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of 4-component vector of uint @data})
+0:?     'sbuf3' (layout(binding=12 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of 3-component vector of uint @data})
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'pos' (layout(location=0 ) in uint)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 71
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 59 62
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 9  ""
+                              MemberName 9 0  "@data"
+                              Name 15  "get(block--vu4[0]1;u1;"
+                              Name 13  "sb"
+                              Name 14  "bufferOffset"
+                              Name 18  ""
+                              MemberName 18 0  "@data"
+                              Name 25  "set(block--vu4[0]1;u1;vu4;"
+                              Name 22  "sb"
+                              Name 23  "bufferOffset"
+                              Name 24  "data"
+                              Name 31  "@main(u1;"
+                              Name 30  "pos"
+                              Name 44  "sbuf2"
+                              Name 46  "sbuf"
+                              Name 48  "param"
+                              Name 50  "param"
+                              Name 51  "param"
+                              Name 57  "pos"
+                              Name 59  "pos"
+                              Name 62  "@entryPointOutput"
+                              Name 63  "param"
+                              Name 68  "sbuf3"
+                              MemberName 68(sbuf3) 0  "@data"
+                              Name 70  "sbuf3"
+                              Decorate 8 ArrayStride 16
+                              MemberDecorate 9 0 NonWritable
+                              MemberDecorate 9 0 Offset 0
+                              Decorate 9 BufferBlock
+                              Decorate 17 ArrayStride 16
+                              MemberDecorate 18 0 Offset 0
+                              Decorate 18 BufferBlock
+                              Decorate 44(sbuf2) DescriptorSet 0
+                              Decorate 46(sbuf) DescriptorSet 0
+                              Decorate 46(sbuf) Binding 10
+                              Decorate 59(pos) Location 0
+                              Decorate 62(@entryPointOutput) Location 0
+                              Decorate 67 ArrayStride 16
+                              MemberDecorate 68(sbuf3) 0 NonWritable
+                              MemberDecorate 68(sbuf3) 0 Offset 0
+                              Decorate 68(sbuf3) BufferBlock
+                              Decorate 70(sbuf3) DescriptorSet 0
+                              Decorate 70(sbuf3) Binding 12
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypeVector 6(int) 4
+               8:             TypeRuntimeArray 7(ivec4)
+               9:             TypeStruct 8
+              10:             TypePointer Uniform 9(struct)
+              11:             TypePointer Function 6(int)
+              12:             TypeFunction 7(ivec4) 10(ptr) 11(ptr)
+              17:             TypeRuntimeArray 7(ivec4)
+              18:             TypeStruct 17
+              19:             TypePointer Uniform 18(struct)
+              20:             TypePointer Function 7(ivec4)
+              21:             TypeFunction 2 19(ptr) 11(ptr) 20(ptr)
+              27:             TypeFloat 32
+              28:             TypeVector 27(float) 4
+              29:             TypeFunction 28(fvec4) 11(ptr)
+              33:             TypeInt 32 1
+              34:     33(int) Constant 0
+              36:             TypePointer Uniform 7(ivec4)
+       44(sbuf2):     19(ptr) Variable Uniform
+              45:      6(int) Constant 2
+        46(sbuf):     10(ptr) Variable Uniform
+              47:      6(int) Constant 3
+              53:   27(float) Constant 0
+              54:   28(fvec4) ConstantComposite 53 53 53 53
+              58:             TypePointer Input 6(int)
+         59(pos):     58(ptr) Variable Input
+              61:             TypePointer Output 28(fvec4)
+62(@entryPointOutput):     61(ptr) Variable Output
+              66:             TypeVector 6(int) 3
+              67:             TypeRuntimeArray 66(ivec3)
+       68(sbuf3):             TypeStruct 67
+              69:             TypePointer Uniform 68(sbuf3)
+       70(sbuf3):     69(ptr) Variable Uniform
+         4(main):           2 Function None 3
+               5:             Label
+         57(pos):     11(ptr) Variable Function
+       63(param):     11(ptr) Variable Function
+              60:      6(int) Load 59(pos)
+                              Store 57(pos) 60
+              64:      6(int) Load 57(pos)
+                              Store 63(param) 64
+              65:   28(fvec4) FunctionCall 31(@main(u1;) 63(param)
+                              Store 62(@entryPointOutput) 65
+                              Return
+                              FunctionEnd
+15(get(block--vu4[0]1;u1;):    7(ivec4) Function None 12
+          13(sb):     10(ptr) FunctionParameter
+14(bufferOffset):     11(ptr) FunctionParameter
+              16:             Label
+              35:      6(int) Load 14(bufferOffset)
+              37:     36(ptr) AccessChain 13(sb) 34 35
+              38:    7(ivec4) Load 37
+                              ReturnValue 38
+                              FunctionEnd
+25(set(block--vu4[0]1;u1;vu4;):           2 Function None 21
+          22(sb):     19(ptr) FunctionParameter
+23(bufferOffset):     11(ptr) FunctionParameter
+        24(data):     20(ptr) FunctionParameter
+              26:             Label
+              41:      6(int) Load 23(bufferOffset)
+              42:    7(ivec4) Load 24(data)
+              43:     36(ptr) AccessChain 22(sb) 34 41
+                              Store 43 42
+                              Return
+                              FunctionEnd
+   31(@main(u1;):   28(fvec4) Function None 29
+         30(pos):     11(ptr) FunctionParameter
+              32:             Label
+       48(param):     11(ptr) Variable Function
+       50(param):     11(ptr) Variable Function
+       51(param):     20(ptr) Variable Function
+                              Store 48(param) 47
+              49:    7(ivec4) FunctionCall 15(get(block--vu4[0]1;u1;) 46(sbuf) 48(param)
+                              Store 50(param) 45
+                              Store 51(param) 49
+              52:           2 FunctionCall 25(set(block--vu4[0]1;u1;vu4;) 44(sbuf2) 50(param) 51(param)
+                              ReturnValue 54
+                              FunctionEnd

+ 46 - 46
3rdparty/glslang/Test/baseResults/hlsl.structbuffer.frag.out

@@ -9,9 +9,9 @@ gl_FragCoord origin is upper left
 0:13      Sequence
 0:13      Sequence
 0:13        move second child to first child (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2})
 0:13        move second child to first child (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2})
 0:13          'mydata' (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2})
 0:13          'mydata' (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:13          indirect index (layout(binding=10 row_major std430 ) readonly buffer structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:13            sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:13              'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf})
+0:13          indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:13            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:13              'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} @data})
 0:13              Constant:
 0:13              Constant:
 0:13                0 (const uint)
 0:13                0 (const uint)
 0:13            'pos' (in uint)
 0:13            'pos' (in uint)
@@ -19,8 +19,8 @@ gl_FragCoord origin is upper left
 0:17        move second child to first child (temp uint)
 0:17        move second child to first child (temp uint)
 0:17          'size' (temp uint)
 0:17          'size' (temp uint)
 0:17          array length (temp uint)
 0:17          array length (temp uint)
-0:17            sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:17              'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf})
+0:17            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:17              'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} @data})
 0:17              Constant:
 0:17              Constant:
 0:17                0 (const uint)
 0:17                0 (const uint)
 0:17        move second child to first child (temp uint)
 0:17        move second child to first child (temp uint)
@@ -30,9 +30,9 @@ gl_FragCoord origin is upper left
 0:19      Test condition and select (temp void)
 0:19      Test condition and select (temp void)
 0:19        Condition
 0:19        Condition
 0:19        test: direct index for structure (temp bool)
 0:19        test: direct index for structure (temp bool)
-0:19          indirect index (layout(binding=10 row_major std430 ) readonly temp structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:19            sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:19              'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf})
+0:19          indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:19            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:19              'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} @data})
 0:19              Constant:
 0:19              Constant:
 0:19                0 (const uint)
 0:19                0 (const uint)
 0:19            'pos' (in uint)
 0:19            'pos' (in uint)
@@ -43,17 +43,17 @@ gl_FragCoord origin is upper left
 0:?           Construct vec4 (temp 4-component vector of float)
 0:?           Construct vec4 (temp 4-component vector of float)
 0:20            add (temp 3-component vector of float)
 0:20            add (temp 3-component vector of float)
 0:20              color: direct index for structure (temp 3-component vector of float)
 0:20              color: direct index for structure (temp 3-component vector of float)
-0:20                indirect index (layout(binding=10 row_major std430 ) readonly temp structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:20                  sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:20                    'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf})
+0:20                indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:20                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:20                    'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} @data})
 0:20                    Constant:
 0:20                    Constant:
 0:20                      0 (const uint)
 0:20                      0 (const uint)
 0:20                  'pos' (in uint)
 0:20                  'pos' (in uint)
 0:20                Constant:
 0:20                Constant:
 0:20                  0 (const int)
 0:20                  0 (const int)
-0:20              indirect index (layout(row_major std430 ) readonly temp float)
-0:20                sbuf2: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of float)
-0:20                  'anon@1' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of float sbuf2})
+0:20              indirect index (layout(row_major std430 ) buffer float)
+0:20                @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
+0:20                  'sbuf2' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:20                  Constant:
 0:20                  Constant:
 0:20                    0 (const uint)
 0:20                    0 (const uint)
 0:20                'pos' (in uint)
 0:20                'pos' (in uint)
@@ -86,8 +86,8 @@ gl_FragCoord origin is upper left
 0:12        Function Call: @main(u1; (temp 4-component vector of float)
 0:12        Function Call: @main(u1; (temp 4-component vector of float)
 0:?           'pos' (temp uint)
 0:?           'pos' (temp uint)
 0:?   Linker Objects
 0:?   Linker Objects
-0:?     'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf})
-0:?     'anon@1' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of float sbuf2})
+0:?     'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} @data})
+0:?     'sbuf2' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     'pos' (layout(location=0 ) in uint)
 0:?     'pos' (layout(location=0 ) in uint)
 
 
@@ -105,9 +105,9 @@ gl_FragCoord origin is upper left
 0:13      Sequence
 0:13      Sequence
 0:13        move second child to first child (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2})
 0:13        move second child to first child (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2})
 0:13          'mydata' (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2})
 0:13          'mydata' (temp structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:13          indirect index (layout(binding=10 row_major std430 ) readonly buffer structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:13            sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:13              'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf})
+0:13          indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:13            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:13              'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} @data})
 0:13              Constant:
 0:13              Constant:
 0:13                0 (const uint)
 0:13                0 (const uint)
 0:13            'pos' (in uint)
 0:13            'pos' (in uint)
@@ -115,8 +115,8 @@ gl_FragCoord origin is upper left
 0:17        move second child to first child (temp uint)
 0:17        move second child to first child (temp uint)
 0:17          'size' (temp uint)
 0:17          'size' (temp uint)
 0:17          array length (temp uint)
 0:17          array length (temp uint)
-0:17            sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:17              'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf})
+0:17            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:17              'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} @data})
 0:17              Constant:
 0:17              Constant:
 0:17                0 (const uint)
 0:17                0 (const uint)
 0:17        move second child to first child (temp uint)
 0:17        move second child to first child (temp uint)
@@ -126,9 +126,9 @@ gl_FragCoord origin is upper left
 0:19      Test condition and select (temp void)
 0:19      Test condition and select (temp void)
 0:19        Condition
 0:19        Condition
 0:19        test: direct index for structure (temp bool)
 0:19        test: direct index for structure (temp bool)
-0:19          indirect index (layout(binding=10 row_major std430 ) readonly temp structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:19            sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:19              'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf})
+0:19          indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:19            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:19              'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} @data})
 0:19              Constant:
 0:19              Constant:
 0:19                0 (const uint)
 0:19                0 (const uint)
 0:19            'pos' (in uint)
 0:19            'pos' (in uint)
@@ -139,17 +139,17 @@ gl_FragCoord origin is upper left
 0:?           Construct vec4 (temp 4-component vector of float)
 0:?           Construct vec4 (temp 4-component vector of float)
 0:20            add (temp 3-component vector of float)
 0:20            add (temp 3-component vector of float)
 0:20              color: direct index for structure (temp 3-component vector of float)
 0:20              color: direct index for structure (temp 3-component vector of float)
-0:20                indirect index (layout(binding=10 row_major std430 ) readonly temp structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:20                  sbuf: direct index for structure (layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
-0:20                    'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf})
+0:20                indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:20                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2})
+0:20                    'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} @data})
 0:20                    Constant:
 0:20                    Constant:
 0:20                      0 (const uint)
 0:20                      0 (const uint)
 0:20                  'pos' (in uint)
 0:20                  'pos' (in uint)
 0:20                Constant:
 0:20                Constant:
 0:20                  0 (const int)
 0:20                  0 (const int)
-0:20              indirect index (layout(row_major std430 ) readonly temp float)
-0:20                sbuf2: direct index for structure (layout(row_major std430 ) readonly buffer implicitly-sized array of float)
-0:20                  'anon@1' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of float sbuf2})
+0:20              indirect index (layout(row_major std430 ) buffer float)
+0:20                @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
+0:20                  'sbuf2' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:20                  Constant:
 0:20                  Constant:
 0:20                    0 (const uint)
 0:20                    0 (const uint)
 0:20                'pos' (in uint)
 0:20                'pos' (in uint)
@@ -182,8 +182,8 @@ gl_FragCoord origin is upper left
 0:12        Function Call: @main(u1; (temp 4-component vector of float)
 0:12        Function Call: @main(u1; (temp 4-component vector of float)
 0:?           'pos' (temp uint)
 0:?           'pos' (temp uint)
 0:?   Linker Objects
 0:?   Linker Objects
-0:?     'anon@0' (layout(binding=10 row_major std430 ) readonly buffer block{layout(binding=10 row_major std430 ) readonly buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} sbuf})
-0:?     'anon@1' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) readonly buffer implicitly-sized array of float sbuf2})
+0:?     'sbuf' (layout(binding=10 row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test, temp bool test2} @data})
+0:?     'sbuf2' (layout(row_major std430 ) readonly buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     'pos' (layout(location=0 ) in uint)
 0:?     'pos' (layout(location=0 ) in uint)
 
 
@@ -209,13 +209,13 @@ gl_FragCoord origin is upper left
                               MemberName 19(sb_t) 1  "test"
                               MemberName 19(sb_t) 1  "test"
                               MemberName 19(sb_t) 2  "test2"
                               MemberName 19(sb_t) 2  "test2"
                               Name 21  "sbuf"
                               Name 21  "sbuf"
-                              MemberName 21(sbuf) 0  "sbuf"
-                              Name 23  ""
+                              MemberName 21(sbuf) 0  "@data"
+                              Name 23  "sbuf"
                               Name 40  "size"
                               Name 40  "size"
                               Name 42  "stride"
                               Name 42  "stride"
                               Name 57  "sbuf2"
                               Name 57  "sbuf2"
-                              MemberName 57(sbuf2) 0  "sbuf2"
-                              Name 59  ""
+                              MemberName 57(sbuf2) 0  "@data"
+                              Name 59  "sbuf2"
                               Name 85  "pos"
                               Name 85  "pos"
                               Name 87  "pos"
                               Name 87  "pos"
                               Name 90  "@entryPointOutput"
                               Name 90  "@entryPointOutput"
@@ -230,13 +230,13 @@ gl_FragCoord origin is upper left
                               MemberDecorate 21(sbuf) 0 NonWritable
                               MemberDecorate 21(sbuf) 0 NonWritable
                               MemberDecorate 21(sbuf) 0 Offset 0
                               MemberDecorate 21(sbuf) 0 Offset 0
                               Decorate 21(sbuf) BufferBlock
                               Decorate 21(sbuf) BufferBlock
-                              Decorate 23 DescriptorSet 0
-                              Decorate 23 Binding 10
+                              Decorate 23(sbuf) DescriptorSet 0
+                              Decorate 23(sbuf) Binding 10
                               Decorate 56 ArrayStride 4
                               Decorate 56 ArrayStride 4
                               MemberDecorate 57(sbuf2) 0 NonWritable
                               MemberDecorate 57(sbuf2) 0 NonWritable
                               MemberDecorate 57(sbuf2) 0 Offset 0
                               MemberDecorate 57(sbuf2) 0 Offset 0
                               Decorate 57(sbuf2) BufferBlock
                               Decorate 57(sbuf2) BufferBlock
-                              Decorate 59 DescriptorSet 0
+                              Decorate 59(sbuf2) DescriptorSet 0
                               Decorate 87(pos) Location 0
                               Decorate 87(pos) Location 0
                               Decorate 90(@entryPointOutput) Location 0
                               Decorate 90(@entryPointOutput) Location 0
                2:             TypeVoid
                2:             TypeVoid
@@ -254,7 +254,7 @@ gl_FragCoord origin is upper left
               20:             TypeRuntimeArray 19(sb_t)
               20:             TypeRuntimeArray 19(sb_t)
         21(sbuf):             TypeStruct 20
         21(sbuf):             TypeStruct 20
               22:             TypePointer Uniform 21(sbuf)
               22:             TypePointer Uniform 21(sbuf)
-              23:     22(ptr) Variable Uniform
+        23(sbuf):     22(ptr) Variable Uniform
               24:             TypeInt 32 1
               24:             TypeInt 32 1
               25:     24(int) Constant 0
               25:     24(int) Constant 0
               27:             TypePointer Uniform 19(sb_t)
               27:             TypePointer Uniform 19(sb_t)
@@ -269,7 +269,7 @@ gl_FragCoord origin is upper left
               56:             TypeRuntimeArray 8(float)
               56:             TypeRuntimeArray 8(float)
        57(sbuf2):             TypeStruct 56
        57(sbuf2):             TypeStruct 56
               58:             TypePointer Uniform 57(sbuf2)
               58:             TypePointer Uniform 57(sbuf2)
-              59:     58(ptr) Variable Uniform
+       59(sbuf2):     58(ptr) Variable Uniform
               61:             TypePointer Uniform 8(float)
               61:             TypePointer Uniform 8(float)
               66:    8(float) Constant 0
               66:    8(float) Constant 0
               73:             TypePointer Function 8(float)
               73:             TypePointer Function 8(float)
@@ -296,7 +296,7 @@ gl_FragCoord origin is upper left
         40(size):      7(ptr) Variable Function
         40(size):      7(ptr) Variable Function
       42(stride):      7(ptr) Variable Function
       42(stride):      7(ptr) Variable Function
               26:      6(int) Load 11(pos)
               26:      6(int) Load 11(pos)
-              28:     27(ptr) AccessChain 23 25 26
+              28:     27(ptr) AccessChain 23(sbuf) 25 26
               29:    19(sb_t) Load 28
               29:    19(sb_t) Load 28
               30:   14(fvec3) CompositeExtract 29 0
               30:   14(fvec3) CompositeExtract 29 0
               32:     31(ptr) AccessChain 18(mydata) 25
               32:     31(ptr) AccessChain 18(mydata) 25
@@ -307,21 +307,21 @@ gl_FragCoord origin is upper left
               37:      6(int) CompositeExtract 29 2
               37:      6(int) CompositeExtract 29 2
               39:     35(ptr) AccessChain 18(mydata) 38
               39:     35(ptr) AccessChain 18(mydata) 38
                               Store 39 37
                               Store 39 37
-              41:     24(int) ArrayLength 23 0
+              41:     24(int) ArrayLength 23(sbuf) 0
                               Store 40(size) 41
                               Store 40(size) 41
                               Store 42(stride) 43
                               Store 42(stride) 43
               44:      6(int) Load 11(pos)
               44:      6(int) Load 11(pos)
-              46:     45(ptr) AccessChain 23 25 44 34
+              46:     45(ptr) AccessChain 23(sbuf) 25 44 34
               47:      6(int) Load 46
               47:      6(int) Load 46
               49:    15(bool) INotEqual 47 48
               49:    15(bool) INotEqual 47 48
                               SelectionMerge 51 None
                               SelectionMerge 51 None
                               BranchConditional 49 50 72
                               BranchConditional 49 50 72
               50:               Label
               50:               Label
               52:      6(int)   Load 11(pos)
               52:      6(int)   Load 11(pos)
-              54:     53(ptr)   AccessChain 23 25 52 25
+              54:     53(ptr)   AccessChain 23(sbuf) 25 52 25
               55:   14(fvec3)   Load 54
               55:   14(fvec3)   Load 54
               60:      6(int)   Load 11(pos)
               60:      6(int)   Load 11(pos)
-              62:     61(ptr)   AccessChain 59 25 60
+              62:     61(ptr)   AccessChain 59(sbuf2) 25 60
               63:    8(float)   Load 62
               63:    8(float)   Load 62
               64:   14(fvec3)   CompositeConstruct 63 63 63
               64:   14(fvec3)   CompositeConstruct 63 63 63
               65:   14(fvec3)   FAdd 55 64
               65:   14(fvec3)   FAdd 55 64

+ 45 - 45
3rdparty/glslang/Test/baseResults/hlsl.structbuffer.rw.frag.out

@@ -7,9 +7,9 @@ gl_FragCoord origin is upper left
 0:12      'pos' (in uint)
 0:12      'pos' (in uint)
 0:?     Sequence
 0:?     Sequence
 0:13      move second child to first child (temp float)
 0:13      move second child to first child (temp float)
-0:13        indirect index (layout(row_major std430 ) temp float)
-0:13          sbuf2: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
-0:13            'anon@1' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float sbuf2})
+0:13        indirect index (layout(row_major std430 ) buffer float)
+0:13          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
+0:13            'sbuf2' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:13            Constant:
 0:13            Constant:
 0:13              0 (const uint)
 0:13              0 (const uint)
 0:13          add (temp uint)
 0:13          add (temp uint)
@@ -22,8 +22,8 @@ gl_FragCoord origin is upper left
 0:17        move second child to first child (temp uint)
 0:17        move second child to first child (temp uint)
 0:17          'size' (temp uint)
 0:17          'size' (temp uint)
 0:17          array length (temp uint)
 0:17          array length (temp uint)
-0:17            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
-0:17              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
+0:17            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
+0:17              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
 0:17              Constant:
 0:17              Constant:
 0:17                0 (const uint)
 0:17                0 (const uint)
 0:17        move second child to first child (temp uint)
 0:17        move second child to first child (temp uint)
@@ -33,9 +33,9 @@ gl_FragCoord origin is upper left
 0:19      Test condition and select (temp void)
 0:19      Test condition and select (temp void)
 0:19        Condition
 0:19        Condition
 0:19        test: direct index for structure (temp bool)
 0:19        test: direct index for structure (temp bool)
-0:19          indirect index (layout(row_major std430 ) temp structure{temp 3-component vector of float color, temp bool test})
-0:19            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
-0:19              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
+0:19          indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test})
+0:19            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
+0:19              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
 0:19              Constant:
 0:19              Constant:
 0:19                0 (const uint)
 0:19                0 (const uint)
 0:19            'pos' (in uint)
 0:19            'pos' (in uint)
@@ -46,17 +46,17 @@ gl_FragCoord origin is upper left
 0:?           Construct vec4 (temp 4-component vector of float)
 0:?           Construct vec4 (temp 4-component vector of float)
 0:20            add (temp 3-component vector of float)
 0:20            add (temp 3-component vector of float)
 0:20              color: direct index for structure (temp 3-component vector of float)
 0:20              color: direct index for structure (temp 3-component vector of float)
-0:20                indirect index (layout(row_major std430 ) temp structure{temp 3-component vector of float color, temp bool test})
-0:20                  sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
-0:20                    'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
+0:20                indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test})
+0:20                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
+0:20                    'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
 0:20                    Constant:
 0:20                    Constant:
 0:20                      0 (const uint)
 0:20                      0 (const uint)
 0:20                  'pos' (in uint)
 0:20                  'pos' (in uint)
 0:20                Constant:
 0:20                Constant:
 0:20                  0 (const int)
 0:20                  0 (const int)
-0:20              indirect index (layout(row_major std430 ) temp float)
-0:20                sbuf2: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
-0:20                  'anon@1' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float sbuf2})
+0:20              indirect index (layout(row_major std430 ) buffer float)
+0:20                @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
+0:20                  'sbuf2' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:20                  Constant:
 0:20                  Constant:
 0:20                    0 (const uint)
 0:20                    0 (const uint)
 0:20                'pos' (in uint)
 0:20                'pos' (in uint)
@@ -80,8 +80,8 @@ gl_FragCoord origin is upper left
 0:12        Function Call: @main(u1; (temp 4-component vector of float)
 0:12        Function Call: @main(u1; (temp 4-component vector of float)
 0:?           'pos' (temp uint)
 0:?           'pos' (temp uint)
 0:?   Linker Objects
 0:?   Linker Objects
-0:?     'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
-0:?     'anon@1' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float sbuf2})
+0:?     'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
+0:?     'sbuf2' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     'pos' (layout(location=0 ) in uint)
 0:?     'pos' (layout(location=0 ) in uint)
 
 
@@ -97,9 +97,9 @@ gl_FragCoord origin is upper left
 0:12      'pos' (in uint)
 0:12      'pos' (in uint)
 0:?     Sequence
 0:?     Sequence
 0:13      move second child to first child (temp float)
 0:13      move second child to first child (temp float)
-0:13        indirect index (layout(row_major std430 ) temp float)
-0:13          sbuf2: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
-0:13            'anon@1' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float sbuf2})
+0:13        indirect index (layout(row_major std430 ) buffer float)
+0:13          @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
+0:13            'sbuf2' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:13            Constant:
 0:13            Constant:
 0:13              0 (const uint)
 0:13              0 (const uint)
 0:13          add (temp uint)
 0:13          add (temp uint)
@@ -112,8 +112,8 @@ gl_FragCoord origin is upper left
 0:17        move second child to first child (temp uint)
 0:17        move second child to first child (temp uint)
 0:17          'size' (temp uint)
 0:17          'size' (temp uint)
 0:17          array length (temp uint)
 0:17          array length (temp uint)
-0:17            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
-0:17              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
+0:17            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
+0:17              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
 0:17              Constant:
 0:17              Constant:
 0:17                0 (const uint)
 0:17                0 (const uint)
 0:17        move second child to first child (temp uint)
 0:17        move second child to first child (temp uint)
@@ -123,9 +123,9 @@ gl_FragCoord origin is upper left
 0:19      Test condition and select (temp void)
 0:19      Test condition and select (temp void)
 0:19        Condition
 0:19        Condition
 0:19        test: direct index for structure (temp bool)
 0:19        test: direct index for structure (temp bool)
-0:19          indirect index (layout(row_major std430 ) temp structure{temp 3-component vector of float color, temp bool test})
-0:19            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
-0:19              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
+0:19          indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test})
+0:19            @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
+0:19              'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
 0:19              Constant:
 0:19              Constant:
 0:19                0 (const uint)
 0:19                0 (const uint)
 0:19            'pos' (in uint)
 0:19            'pos' (in uint)
@@ -136,17 +136,17 @@ gl_FragCoord origin is upper left
 0:?           Construct vec4 (temp 4-component vector of float)
 0:?           Construct vec4 (temp 4-component vector of float)
 0:20            add (temp 3-component vector of float)
 0:20            add (temp 3-component vector of float)
 0:20              color: direct index for structure (temp 3-component vector of float)
 0:20              color: direct index for structure (temp 3-component vector of float)
-0:20                indirect index (layout(row_major std430 ) temp structure{temp 3-component vector of float color, temp bool test})
-0:20                  sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
-0:20                    'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
+0:20                indirect index (layout(row_major std430 ) buffer structure{temp 3-component vector of float color, temp bool test})
+0:20                  @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test})
+0:20                    'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
 0:20                    Constant:
 0:20                    Constant:
 0:20                      0 (const uint)
 0:20                      0 (const uint)
 0:20                  'pos' (in uint)
 0:20                  'pos' (in uint)
 0:20                Constant:
 0:20                Constant:
 0:20                  0 (const int)
 0:20                  0 (const int)
-0:20              indirect index (layout(row_major std430 ) temp float)
-0:20                sbuf2: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
-0:20                  'anon@1' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float sbuf2})
+0:20              indirect index (layout(row_major std430 ) buffer float)
+0:20                @data: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of float)
+0:20                  'sbuf2' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:20                  Constant:
 0:20                  Constant:
 0:20                    0 (const uint)
 0:20                    0 (const uint)
 0:20                'pos' (in uint)
 0:20                'pos' (in uint)
@@ -170,8 +170,8 @@ gl_FragCoord origin is upper left
 0:12        Function Call: @main(u1; (temp 4-component vector of float)
 0:12        Function Call: @main(u1; (temp 4-component vector of float)
 0:?           'pos' (temp uint)
 0:?           'pos' (temp uint)
 0:?   Linker Objects
 0:?   Linker Objects
-0:?     'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} sbuf})
-0:?     'anon@1' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float sbuf2})
+0:?     'sbuf' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of structure{temp 3-component vector of float color, temp bool test} @data})
+0:?     'sbuf2' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of float @data})
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
 0:?     'pos' (layout(location=0 ) in uint)
 0:?     'pos' (layout(location=0 ) in uint)
 
 
@@ -188,15 +188,15 @@ gl_FragCoord origin is upper left
                               Name 12  "@main(u1;"
                               Name 12  "@main(u1;"
                               Name 11  "pos"
                               Name 11  "pos"
                               Name 15  "sbuf2"
                               Name 15  "sbuf2"
-                              MemberName 15(sbuf2) 0  "sbuf2"
-                              Name 17  ""
+                              MemberName 15(sbuf2) 0  "@data"
+                              Name 17  "sbuf2"
                               Name 26  "size"
                               Name 26  "size"
                               Name 28  "sb_t"
                               Name 28  "sb_t"
                               MemberName 28(sb_t) 0  "color"
                               MemberName 28(sb_t) 0  "color"
                               MemberName 28(sb_t) 1  "test"
                               MemberName 28(sb_t) 1  "test"
                               Name 30  "sbuf"
                               Name 30  "sbuf"
-                              MemberName 30(sbuf) 0  "sbuf"
-                              Name 32  ""
+                              MemberName 30(sbuf) 0  "@data"
+                              Name 32  "sbuf"
                               Name 34  "stride"
                               Name 34  "stride"
                               Name 69  "pos"
                               Name 69  "pos"
                               Name 71  "pos"
                               Name 71  "pos"
@@ -205,13 +205,13 @@ gl_FragCoord origin is upper left
                               Decorate 14 ArrayStride 4
                               Decorate 14 ArrayStride 4
                               MemberDecorate 15(sbuf2) 0 Offset 0
                               MemberDecorate 15(sbuf2) 0 Offset 0
                               Decorate 15(sbuf2) BufferBlock
                               Decorate 15(sbuf2) BufferBlock
-                              Decorate 17 DescriptorSet 0
+                              Decorate 17(sbuf2) DescriptorSet 0
                               MemberDecorate 28(sb_t) 0 Offset 0
                               MemberDecorate 28(sb_t) 0 Offset 0
                               MemberDecorate 28(sb_t) 1 Offset 12
                               MemberDecorate 28(sb_t) 1 Offset 12
                               Decorate 29 ArrayStride 16
                               Decorate 29 ArrayStride 16
                               MemberDecorate 30(sbuf) 0 Offset 0
                               MemberDecorate 30(sbuf) 0 Offset 0
                               Decorate 30(sbuf) BufferBlock
                               Decorate 30(sbuf) BufferBlock
-                              Decorate 32 DescriptorSet 0
+                              Decorate 32(sbuf) DescriptorSet 0
                               Decorate 71(pos) Location 0
                               Decorate 71(pos) Location 0
                               Decorate 74(@entryPointOutput) Location 0
                               Decorate 74(@entryPointOutput) Location 0
                2:             TypeVoid
                2:             TypeVoid
@@ -224,7 +224,7 @@ gl_FragCoord origin is upper left
               14:             TypeRuntimeArray 8(float)
               14:             TypeRuntimeArray 8(float)
        15(sbuf2):             TypeStruct 14
        15(sbuf2):             TypeStruct 14
               16:             TypePointer Uniform 15(sbuf2)
               16:             TypePointer Uniform 15(sbuf2)
-              17:     16(ptr) Variable Uniform
+       17(sbuf2):     16(ptr) Variable Uniform
               18:             TypeInt 32 1
               18:             TypeInt 32 1
               19:     18(int) Constant 0
               19:     18(int) Constant 0
               21:      6(int) Constant 1
               21:      6(int) Constant 1
@@ -235,7 +235,7 @@ gl_FragCoord origin is upper left
               29:             TypeRuntimeArray 28(sb_t)
               29:             TypeRuntimeArray 28(sb_t)
         30(sbuf):             TypeStruct 29
         30(sbuf):             TypeStruct 29
               31:             TypePointer Uniform 30(sbuf)
               31:             TypePointer Uniform 30(sbuf)
-              32:     31(ptr) Variable Uniform
+        32(sbuf):     31(ptr) Variable Uniform
               35:      6(int) Constant 16
               35:      6(int) Constant 16
               37:     18(int) Constant 1
               37:     18(int) Constant 1
               38:             TypePointer Uniform 6(int)
               38:             TypePointer Uniform 6(int)
@@ -266,23 +266,23 @@ gl_FragCoord origin is upper left
       34(stride):      7(ptr) Variable Function
       34(stride):      7(ptr) Variable Function
               20:      6(int) Load 11(pos)
               20:      6(int) Load 11(pos)
               22:      6(int) IAdd 20 21
               22:      6(int) IAdd 20 21
-              25:     24(ptr) AccessChain 17 19 22
+              25:     24(ptr) AccessChain 17(sbuf2) 19 22
                               Store 25 23
                               Store 25 23
-              33:     18(int) ArrayLength 32 0
+              33:     18(int) ArrayLength 32(sbuf) 0
                               Store 26(size) 33
                               Store 26(size) 33
                               Store 34(stride) 35
                               Store 34(stride) 35
               36:      6(int) Load 11(pos)
               36:      6(int) Load 11(pos)
-              39:     38(ptr) AccessChain 32 19 36 37
+              39:     38(ptr) AccessChain 32(sbuf) 19 36 37
               40:      6(int) Load 39
               40:      6(int) Load 39
               43:    41(bool) INotEqual 40 42
               43:    41(bool) INotEqual 40 42
                               SelectionMerge 45 None
                               SelectionMerge 45 None
                               BranchConditional 43 44 61
                               BranchConditional 43 44 61
               44:               Label
               44:               Label
               46:      6(int)   Load 11(pos)
               46:      6(int)   Load 11(pos)
-              48:     47(ptr)   AccessChain 32 19 46 19
+              48:     47(ptr)   AccessChain 32(sbuf) 19 46 19
               49:   27(fvec3)   Load 48
               49:   27(fvec3)   Load 48
               50:      6(int)   Load 11(pos)
               50:      6(int)   Load 11(pos)
-              51:     24(ptr)   AccessChain 17 19 50
+              51:     24(ptr)   AccessChain 17(sbuf2) 19 50
               52:    8(float)   Load 51
               52:    8(float)   Load 51
               53:   27(fvec3)   CompositeConstruct 52 52 52
               53:   27(fvec3)   CompositeConstruct 52 52 52
               54:   27(fvec3)   FAdd 49 53
               54:   27(fvec3)   FAdd 49 53

File diff suppressed because it is too large
+ 191 - 191
3rdparty/glslang/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out


+ 49 - 15
3rdparty/glslang/Test/baseResults/spv.Operations.frag.out

@@ -3,12 +3,12 @@ Warning, version 450 is not yet complete; most version-specific features are pre
 
 
 // Module Version 10000
 // Module Version 10000
 // Generated by (magic number): 80001
 // Generated by (magic number): 80001
-// Id's are bound by 509
+// Id's are bound by 532
 
 
                               Capability Shader
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 11 22 212 288 485 503 508
+                              EntryPoint Fragment 4  "main" 11 22 212 288 485 526 531
                               ExecutionMode 4 OriginUpperLeft
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 450
                               Source GLSL 450
                               Name 4  "main"
                               Name 4  "main"
@@ -24,13 +24,15 @@ Warning, version 450 is not yet complete; most version-specific features are pre
                               Name 305  "b"
                               Name 305  "b"
                               Name 342  "ub42"
                               Name 342  "ub42"
                               Name 485  "FragColor"
                               Name 485  "FragColor"
-                              Name 503  "uiv4"
-                              Name 505  "ub"
-                              Name 508  "uuv4"
+                              Name 503  "m1"
+                              Name 510  "m2"
+                              Name 526  "uiv4"
+                              Name 528  "ub"
+                              Name 531  "uuv4"
                               Decorate 22(ui) Flat
                               Decorate 22(ui) Flat
                               Decorate 288(uui) Flat
                               Decorate 288(uui) Flat
-                              Decorate 503(uiv4) Flat
-                              Decorate 508(uuv4) Flat
+                              Decorate 526(uiv4) Flat
+                              Decorate 531(uuv4) Flat
                2:             TypeVoid
                2:             TypeVoid
                3:             TypeFunction 2
                3:             TypeFunction 2
                6:             TypeFloat 32
                6:             TypeFloat 32
@@ -65,14 +67,24 @@ Warning, version 450 is not yet complete; most version-specific features are pre
              472:     18(int) Constant 17
              472:     18(int) Constant 17
              484:             TypePointer Output 7(fvec4)
              484:             TypePointer Output 7(fvec4)
   485(FragColor):    484(ptr) Variable Output
   485(FragColor):    484(ptr) Variable Output
-             501:             TypeVector 18(int) 4
-             502:             TypePointer Input 501(ivec4)
-       503(uiv4):    502(ptr) Variable Input
-             504:             TypePointer Private 178(bool)
-         505(ub):    504(ptr) Variable Private
-             506:             TypeVector 141(int) 4
-             507:             TypePointer Input 506(ivec4)
-       508(uuv4):    507(ptr) Variable Input
+             501:             TypeMatrix 7(fvec4) 4
+             502:             TypePointer Function 501
+             504:    6(float) Constant 0
+             505:    7(fvec4) ConstantComposite 461 504 504 504
+             506:    7(fvec4) ConstantComposite 504 461 504 504
+             507:    7(fvec4) ConstantComposite 504 504 461 504
+             508:    7(fvec4) ConstantComposite 504 504 504 461
+             509:         501 ConstantComposite 505 506 507 508
+             511:    7(fvec4) ConstantComposite 504 504 504 504
+             512:         501 ConstantComposite 511 511 511 511
+             524:             TypeVector 18(int) 4
+             525:             TypePointer Input 524(ivec4)
+       526(uiv4):    525(ptr) Variable Input
+             527:             TypePointer Private 178(bool)
+         528(ub):    527(ptr) Variable Private
+             529:             TypeVector 141(int) 4
+             530:             TypePointer Input 529(ivec4)
+       531(uuv4):    530(ptr) Variable Input
          4(main):           2 Function None 3
          4(main):           2 Function None 3
                5:             Label
                5:             Label
             9(v):      8(ptr) Variable Function
             9(v):      8(ptr) Variable Function
@@ -81,6 +93,9 @@ Warning, version 450 is not yet complete; most version-specific features are pre
           285(u):    284(ptr) Variable Function
           285(u):    284(ptr) Variable Function
           305(b):    304(ptr) Variable Function
           305(b):    304(ptr) Variable Function
              486:      8(ptr) Variable Function
              486:      8(ptr) Variable Function
+         503(m1):    502(ptr) Variable Function
+         510(m2):    502(ptr) Variable Function
+             513:    502(ptr) Variable Function
               12:    7(fvec4) Load 11(uv4)
               12:    7(fvec4) Load 11(uv4)
               13:    7(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 12
               13:    7(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 12
                               Store 9(v) 13
                               Store 9(v) 13
@@ -666,5 +681,24 @@ Warning, version 450 is not yet complete; most version-specific features are pre
              489:             Label
              489:             Label
              500:    7(fvec4) Load 486
              500:    7(fvec4) Load 486
                               Store 485(FragColor) 500
                               Store 485(FragColor) 500
+                              Store 503(m1) 509
+                              Store 510(m2) 512
+             514:   178(bool) Load 305(b)
+                              SelectionMerge 516 None
+                              BranchConditional 514 515 518
+             515:               Label
+             517:         501   Load 503(m1)
+                                Store 513 517
+                                Branch 516
+             518:               Label
+             519:         501   Load 510(m2)
+                                Store 513 519
+                                Branch 516
+             516:             Label
+             520:      8(ptr) AccessChain 513 405
+             521:    7(fvec4) Load 520
+             522:    7(fvec4) Load 485(FragColor)
+             523:    7(fvec4) FAdd 522 521
+                              Store 485(FragColor) 523
                               Return
                               Return
                               FunctionEnd
                               FunctionEnd

+ 38 - 0
3rdparty/glslang/Test/baseResults/spv.deviceGroup.frag.out

@@ -0,0 +1,38 @@
+spv.deviceGroup.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 17
+
+                              Capability Shader
+                              Capability DeviceGroup
+                              Extension  "SPV_KHR_device_group"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_device_group"
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 12  "gl_DeviceIndex"
+                              Decorate 12(gl_DeviceIndex) BuiltIn DeviceIndex
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:             TypeInt 32 1
+              11:             TypePointer UniformConstant 10(int)
+12(gl_DeviceIndex):     11(ptr) Variable UniformConstant
+              15:    6(float) Constant 0
+         4(main):           2 Function None 3
+               5:             Label
+              13:     10(int) Load 12(gl_DeviceIndex)
+              14:    6(float) ConvertSToF 13
+              16:    7(fvec4) CompositeConstruct 14 15 15 15
+                              Store 9(color) 16
+                              Return
+                              FunctionEnd

+ 59 - 0
3rdparty/glslang/Test/baseResults/spv.drawParams.vert.out

@@ -0,0 +1,59 @@
+spv.drawParams.vert
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 29
+
+                              Capability Shader
+                              Capability DrawParameters
+                              Extension  "SPV_KHR_shader_draw_parameters"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 10 13 16 21
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_shader_draw_parameters"
+                              Name 4  "main"
+                              Name 8  "a"
+                              Name 10  "gl_BaseVertexARB"
+                              Name 12  "b"
+                              Name 13  "gl_BaseInstanceARB"
+                              Name 15  "c"
+                              Name 16  "gl_DrawIDARB"
+                              Name 21  "pos"
+                              Decorate 10(gl_BaseVertexARB) BuiltIn BaseVertex
+                              Decorate 13(gl_BaseInstanceARB) BuiltIn BaseInstance
+                              Decorate 16(gl_DrawIDARB) BuiltIn DrawIndex
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Function 6(int)
+               9:             TypePointer Input 6(int)
+10(gl_BaseVertexARB):      9(ptr) Variable Input
+13(gl_BaseInstanceARB):      9(ptr) Variable Input
+16(gl_DrawIDARB):      9(ptr) Variable Input
+              18:             TypeFloat 32
+              19:             TypeVector 18(float) 3
+              20:             TypePointer Output 19(fvec3)
+         21(pos):     20(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+            8(a):      7(ptr) Variable Function
+           12(b):      7(ptr) Variable Function
+           15(c):      7(ptr) Variable Function
+              11:      6(int) Load 10(gl_BaseVertexARB)
+                              Store 8(a) 11
+              14:      6(int) Load 13(gl_BaseInstanceARB)
+                              Store 12(b) 14
+              17:      6(int) Load 16(gl_DrawIDARB)
+                              Store 15(c) 17
+              22:      6(int) Load 8(a)
+              23:   18(float) ConvertSToF 22
+              24:      6(int) Load 12(b)
+              25:   18(float) ConvertSToF 24
+              26:      6(int) Load 15(c)
+              27:   18(float) ConvertSToF 26
+              28:   19(fvec3) CompositeConstruct 23 25 27
+                              Store 21(pos) 28
+                              Return
+                              FunctionEnd

+ 38 - 0
3rdparty/glslang/Test/baseResults/spv.multiView.frag.out

@@ -0,0 +1,38 @@
+spv.multiView.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 17
+
+                              Capability Shader
+                              Capability MultiView
+                              Extension  "SPV_KHR_multiview"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 9
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_multiview"
+                              Name 4  "main"
+                              Name 9  "color"
+                              Name 12  "gl_ViewIndex"
+                              Decorate 12(gl_ViewIndex) BuiltIn ViewIndex
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypePointer Output 7(fvec4)
+        9(color):      8(ptr) Variable Output
+              10:             TypeInt 32 1
+              11:             TypePointer UniformConstant 10(int)
+12(gl_ViewIndex):     11(ptr) Variable UniformConstant
+              15:    6(float) Constant 0
+         4(main):           2 Function None 3
+               5:             Label
+              13:     10(int) Load 12(gl_ViewIndex)
+              14:    6(float) ConvertSToF 13
+              16:    7(fvec4) CompositeConstruct 14 15 15 15
+                              Store 9(color) 16
+                              Return
+                              FunctionEnd

+ 3 - 3
3rdparty/glslang/Test/baseResults/spv.specConstant.vert.out

@@ -13,7 +13,7 @@ Warning, version 400 is not yet complete; most version-specific features are pre
                               Source GLSL 400
                               Source GLSL 400
                               Name 4  "main"
                               Name 4  "main"
                               Name 9  "arraySize"
                               Name 9  "arraySize"
-                              Name 14  "foo(vf4[s1516];"
+                              Name 14  "foo(vf4[s1518];"
                               Name 13  "p"
                               Name 13  "p"
                               Name 17  "builtin_spec_constant("
                               Name 17  "builtin_spec_constant("
                               Name 20  "color"
                               Name 20  "color"
@@ -104,10 +104,10 @@ Warning, version 400 is not yet complete; most version-specific features are pre
                               Store 20(color) 46
                               Store 20(color) 46
               48:          10 Load 22(ucol)
               48:          10 Load 22(ucol)
                               Store 47(param) 48
                               Store 47(param) 48
-              49:           2 FunctionCall 14(foo(vf4[s1516];) 47(param)
+              49:           2 FunctionCall 14(foo(vf4[s1518];) 47(param)
                               Return
                               Return
                               FunctionEnd
                               FunctionEnd
-14(foo(vf4[s1516];):           2 Function None 12
+14(foo(vf4[s1518];):           2 Function None 12
            13(p):     11(ptr) FunctionParameter
            13(p):     11(ptr) FunctionParameter
               15:             Label
               15:             Label
               54:     24(ptr) AccessChain 53(dupUcol) 23
               54:     24(ptr) AccessChain 53(dupUcol) 23

+ 14 - 14
3rdparty/glslang/Test/baseResults/spv.ssbo.autoassign.frag.out

@@ -16,15 +16,15 @@ spv.ssbo.autoassign.frag
                               MemberName 14(BufType) 0  "va"
                               MemberName 14(BufType) 0  "va"
                               MemberName 14(BufType) 1  "vb"
                               MemberName 14(BufType) 1  "vb"
                               Name 16  "SB0"
                               Name 16  "SB0"
-                              MemberName 16(SB0) 0  "SB0"
-                              Name 18  ""
+                              MemberName 16(SB0) 0  "@data"
+                              Name 18  "SB0"
                               Name 26  "TestCB"
                               Name 26  "TestCB"
                               MemberName 26(TestCB) 0  "W"
                               MemberName 26(TestCB) 0  "W"
                               MemberName 26(TestCB) 1  "H"
                               MemberName 26(TestCB) 1  "H"
                               Name 28  ""
                               Name 28  ""
                               Name 55  "SB1"
                               Name 55  "SB1"
-                              MemberName 55(SB1) 0  "SB1"
-                              Name 57  ""
+                              MemberName 55(SB1) 0  "@data"
+                              Name 57  "SB1"
                               Name 86  "pos"
                               Name 86  "pos"
                               Name 88  "pos"
                               Name 88  "pos"
                               Name 91  "@entryPointOutput"
                               Name 91  "@entryPointOutput"
@@ -37,8 +37,8 @@ spv.ssbo.autoassign.frag
                               MemberDecorate 16(SB0) 0 NonWritable
                               MemberDecorate 16(SB0) 0 NonWritable
                               MemberDecorate 16(SB0) 0 Offset 0
                               MemberDecorate 16(SB0) 0 Offset 0
                               Decorate 16(SB0) BufferBlock
                               Decorate 16(SB0) BufferBlock
-                              Decorate 18 DescriptorSet 0
-                              Decorate 18 Binding 30
+                              Decorate 18(SB0) DescriptorSet 0
+                              Decorate 18(SB0) Binding 30
                               MemberDecorate 26(TestCB) 0 Offset 0
                               MemberDecorate 26(TestCB) 0 Offset 0
                               MemberDecorate 26(TestCB) 1 Offset 4
                               MemberDecorate 26(TestCB) 1 Offset 4
                               Decorate 26(TestCB) Block
                               Decorate 26(TestCB) Block
@@ -47,8 +47,8 @@ spv.ssbo.autoassign.frag
                               Decorate 54 ArrayStride 32
                               Decorate 54 ArrayStride 32
                               MemberDecorate 55(SB1) 0 Offset 0
                               MemberDecorate 55(SB1) 0 Offset 0
                               Decorate 55(SB1) BufferBlock
                               Decorate 55(SB1) BufferBlock
-                              Decorate 57 DescriptorSet 0
-                              Decorate 57 Binding 31
+                              Decorate 57(SB1) DescriptorSet 0
+                              Decorate 57(SB1) Binding 31
                               Decorate 88(pos) Location 0
                               Decorate 88(pos) Location 0
                               Decorate 91(@entryPointOutput) Location 0
                               Decorate 91(@entryPointOutput) Location 0
                2:             TypeVoid
                2:             TypeVoid
@@ -61,7 +61,7 @@ spv.ssbo.autoassign.frag
               15:             TypeRuntimeArray 14(BufType)
               15:             TypeRuntimeArray 14(BufType)
          16(SB0):             TypeStruct 15
          16(SB0):             TypeStruct 15
               17:             TypePointer Uniform 16(SB0)
               17:             TypePointer Uniform 16(SB0)
-              18:     17(ptr) Variable Uniform
+         18(SB0):     17(ptr) Variable Uniform
               19:             TypeInt 32 1
               19:             TypeInt 32 1
               20:     19(int) Constant 0
               20:     19(int) Constant 0
               21:             TypeInt 32 0
               21:             TypeInt 32 0
@@ -77,7 +77,7 @@ spv.ssbo.autoassign.frag
               54:             TypeRuntimeArray 14(BufType)
               54:             TypeRuntimeArray 14(BufType)
          55(SB1):             TypeStruct 54
          55(SB1):             TypeStruct 54
               56:             TypePointer Uniform 55(SB1)
               56:             TypePointer Uniform 55(SB1)
-              57:     56(ptr) Variable Uniform
+         57(SB1):     56(ptr) Variable Uniform
               87:             TypePointer Input 7(fvec4)
               87:             TypePointer Input 7(fvec4)
          88(pos):     87(ptr) Variable Input
          88(pos):     87(ptr) Variable Input
               90:             TypePointer Output 7(fvec4)
               90:             TypePointer Output 7(fvec4)
@@ -107,7 +107,7 @@ spv.ssbo.autoassign.frag
               35:     23(ptr) AccessChain 10(pos) 34
               35:     23(ptr) AccessChain 10(pos) 34
               36:    6(float) Load 35
               36:    6(float) Load 35
               37:    6(float) FAdd 33 36
               37:    6(float) FAdd 33 36
-              39:     38(ptr) AccessChain 18 20 37 20
+              39:     38(ptr) AccessChain 18(SB0) 20 37 20
               40:    7(fvec4) Load 39
               40:    7(fvec4) Load 39
               41:     23(ptr) AccessChain 10(pos) 22
               41:     23(ptr) AccessChain 10(pos) 22
               42:    6(float) Load 41
               42:    6(float) Load 41
@@ -118,7 +118,7 @@ spv.ssbo.autoassign.frag
               47:     23(ptr) AccessChain 10(pos) 34
               47:     23(ptr) AccessChain 10(pos) 34
               48:    6(float) Load 47
               48:    6(float) Load 47
               49:    6(float) FAdd 46 48
               49:    6(float) FAdd 46 48
-              51:     38(ptr) AccessChain 18 20 49 50
+              51:     38(ptr) AccessChain 18(SB0) 20 49 50
               52:    7(fvec4) Load 51
               52:    7(fvec4) Load 51
               53:    7(fvec4) FAdd 40 52
               53:    7(fvec4) FAdd 40 52
                               Store 13(vTmp) 53
                               Store 13(vTmp) 53
@@ -131,7 +131,7 @@ spv.ssbo.autoassign.frag
               64:     23(ptr) AccessChain 10(pos) 34
               64:     23(ptr) AccessChain 10(pos) 34
               65:    6(float) Load 64
               65:    6(float) Load 64
               66:    6(float) FAdd 63 65
               66:    6(float) FAdd 63 65
-              67:     38(ptr) AccessChain 57 20 66 20
+              67:     38(ptr) AccessChain 57(SB1) 20 66 20
               68:    7(fvec4) Load 67
               68:    7(fvec4) Load 67
               69:     23(ptr) AccessChain 10(pos) 22
               69:     23(ptr) AccessChain 10(pos) 22
               70:    6(float) Load 69
               70:    6(float) Load 69
@@ -142,7 +142,7 @@ spv.ssbo.autoassign.frag
               75:     23(ptr) AccessChain 10(pos) 34
               75:     23(ptr) AccessChain 10(pos) 34
               76:    6(float) Load 75
               76:    6(float) Load 75
               77:    6(float) FAdd 74 76
               77:    6(float) FAdd 74 76
-              78:     38(ptr) AccessChain 57 20 77 50
+              78:     38(ptr) AccessChain 57(SB1) 20 77 50
               79:    7(fvec4) Load 78
               79:    7(fvec4) Load 78
               80:    7(fvec4) FAdd 68 79
               80:    7(fvec4) FAdd 68 79
               81:    7(fvec4) Load 13(vTmp)
               81:    7(fvec4) Load 13(vTmp)

+ 4 - 1
3rdparty/glslang/Test/baseResults/tokenPaste.vert.out

@@ -5,7 +5,10 @@ ERROR: 0:40: '##' : unexpected location; end of replacement list
 ERROR: 0:49: '##' : combined tokens are too long 
 ERROR: 0:49: '##' : combined tokens are too long 
 ERROR: 0:52: '##' : not supported for these tokens 
 ERROR: 0:52: '##' : not supported for these tokens 
 ERROR: 0:69: '##' : combined token is invalid 
 ERROR: 0:69: '##' : combined token is invalid 
-ERROR: 5 compilation errors.  No code generated.
+ERROR: 0:82: 'macro expansion' : Too few args in Macro rec
+ERROR: 0:82: '##' : unexpected location 
+ERROR: 0:82: '##' : unexpected location 
+ERROR: 8 compilation errors.  No code generated.
 
 
 
 
 Shader version: 450
 Shader version: 450

+ 14 - 19
3rdparty/glslang/Test/hlsl.intrinsics.f1632.frag

@@ -1,34 +1,29 @@
-float PixelShaderFunctionS(float inF0)
+float PixelShaderFunctionS(uint inF0)
 {
 {
-    f32tof16(inF0);
-
-    return 0.0;
+    return f16tof32(inF0);
 }
 }
 
 
-float1 PixelShaderFunction1(float1 inF0)
+float1 PixelShaderFunction1(uint1 inF0)
 {
 {
-    // TODO: ... add when float1 prototypes are generated
-    return 0.0;
+    return f16tof32(inF0);
 }
 }
 
 
-float2 PixelShaderFunction2(float2 inF0)
+float2 PixelShaderFunction2(uint2 inF0)
 {
 {
-    f32tof16(inF0);
-
-    return float2(1,2);
+    return f16tof32(inF0);
 }
 }
 
 
-float3 PixelShaderFunction3(float3 inF0)
+float3 PixelShaderFunction3(uint3 inF0)
 {
 {
-    f32tof16(inF0);
-
-    return float3(1,2,3);
+    return f16tof32(inF0);
 }
 }
 
 
-float4 PixelShaderFunction(float4 inF0)
+float4 PixelShaderFunction(uint4 inF0)
 {
 {
-    f32tof16(inF0);
-
-    return float4(1,2,3,4);
+    return f16tof32(inF0);
 }
 }
 
 
+float4 main() : SV_Target0
+{
+    return 0;
+}

+ 29 - 0
3rdparty/glslang/Test/hlsl.intrinsics.f3216.frag

@@ -0,0 +1,29 @@
+uint PixelShaderFunctionS(float inF0)
+{
+    return f32tof16(inF0);
+}
+
+uint1 PixelShaderFunction1(float1 inF0)
+{
+    return f32tof16(inF0);
+}
+
+uint2 PixelShaderFunction2(float2 inF0)
+{
+    return f32tof16(inF0);
+}
+
+uint3 PixelShaderFunction3(float3 inF0)
+{
+    return f32tof16(inF0);
+}
+
+uint4 PixelShaderFunction(float4 inF0)
+{
+    return f32tof16(inF0);
+}
+
+float4 main() : SV_Target0
+{
+    return 0;
+}

+ 4 - 0
3rdparty/glslang/Test/hlsl.numericsuffixes.frag

@@ -13,6 +13,10 @@ PS_OUTPUT main()
     int   r06 = 6L;      // upper long int
     int   r06 = 6L;      // upper long int
     int   r07 = 071;     // octal
     int   r07 = 071;     // octal
     uint  r08 = 072u;    // unsigned octal
     uint  r08 = 072u;    // unsigned octal
+    float r09 = 1.h;     // half
+    float r10 = 1.H;     // half
+    float r11 = 1.1h;    // half
+    float r12 = 1.1H;    // half
 
 
     PS_OUTPUT ps_output;
     PS_OUTPUT ps_output;
     ps_output.color = r07; // gets 71 octal = 57 decimal
     ps_output.color = r07; // gets 71 octal = 57 decimal

+ 12 - 2
3rdparty/glslang/Test/hlsl.struct.frag

@@ -12,7 +12,7 @@ struct myS {
 
 
 myS s1;
 myS s1;
 
 
-static struct {
+static class {
     float4 i;
     float4 i;
 } s2;
 } s2;
 
 
@@ -30,14 +30,24 @@ struct IN_S {
 float ff5 : packoffset(c101.y) : register(ps_5_0, s[5]);
 float ff5 : packoffset(c101.y) : register(ps_5_0, s[5]);
 float ff6 : packoffset(c102.y) : register(s3[5]);
 float ff6 : packoffset(c102.y) : register(s3[5]);
 
 
+struct empty {};
+
+struct containEmpty {
+    empty e;
+};
+
 float4 PixelShaderFunction(float4 input, IN_S s) : COLOR0
 float4 PixelShaderFunction(float4 input, IN_S s) : COLOR0
 {
 {
-    struct FS {
+    class FS {
         bool3 b3;
         bool3 b3;
     } s3;
     } s3;
 
 
     s3 == s3;
     s3 == s3;
     s2.i = s.ff4;
     s2.i = s.ff4;
 
 
+    containEmpty ce;
+    empty e;
+    e = ce.e;
+
     return input;
     return input;
 }
 }

+ 7 - 0
3rdparty/glslang/Test/hlsl.structStructName.frag

@@ -0,0 +1,7 @@
+struct S { int s; };
+
+int main()
+{
+    struct S t;
+    return t.s;
+}

+ 23 - 0
3rdparty/glslang/Test/hlsl.structbuffer.fn.frag

@@ -0,0 +1,23 @@
+
+StructuredBuffer<uint4>  sbuf : register(t10);
+RWStructuredBuffer<uint4> sbuf2;
+
+// Not shared, because of type difference.
+StructuredBuffer<uint3>  sbuf3 : register(t12);
+
+uint4 get(in StructuredBuffer<uint4> sb, uint bufferOffset)
+{
+    return sb[bufferOffset];
+}
+
+void set(in RWStructuredBuffer<uint4> sb, uint bufferOffset, uint4 data)
+{
+    sb[bufferOffset] = data;
+}
+
+float4 main(uint pos : FOO) : SV_Target0
+{
+    set(sbuf2, 2, get(sbuf, 3));
+
+    return 0;
+}

+ 3 - 0
3rdparty/glslang/Test/spv.Operations.frag

@@ -135,4 +135,7 @@ void main()
     b = !b;
     b = !b;
 
 
     FragColor = b ? vec4(i) + vec4(f) + v : v;
     FragColor = b ? vec4(i) + vec4(f) + v : v;
+
+    mat4 m1 = mat4(1.0), m2 = mat4(0.0);
+    FragColor += (b ? m1 : m2)[1];
 }
 }

+ 9 - 0
3rdparty/glslang/Test/spv.deviceGroup.frag

@@ -0,0 +1,9 @@
+#version 450
+
+#extension GL_EXT_device_group : enable
+
+out vec4 color;
+
+void main() {
+    color = vec4(gl_DeviceIndex, 0, 0, 0);
+}

+ 13 - 0
3rdparty/glslang/Test/spv.drawParams.vert

@@ -0,0 +1,13 @@
+#version 450
+
+#extension GL_ARB_shader_draw_parameters : enable
+
+out vec3 pos;
+
+void main()
+{
+    int a = gl_BaseVertexARB;
+    int b = gl_BaseInstanceARB;
+    int c = gl_DrawIDARB;
+    pos = vec3(a, b, c);
+}

+ 9 - 0
3rdparty/glslang/Test/spv.multiView.frag

@@ -0,0 +1,9 @@
+#version 450
+
+#extension GL_EXT_multiview : enable
+
+out vec4 color;
+
+void main() {
+    color = vec4(gl_ViewIndex, 0, 0, 0);
+}

+ 3 - 0
3rdparty/glslang/Test/tokenPaste.vert

@@ -77,3 +77,6 @@ uniform M_OUTER(argPaste);
 #define M_NEST2(q) int q ## suff
 #define M_NEST2(q) int q ## suff
 #define M_OUTER2(p) M_NEST2(p ## 20)
 #define M_OUTER2(p) M_NEST2(p ## 20)
 uniform M_OUTER2(argPaste);
 uniform M_OUTER2(argPaste);
+
+#define rec(x)##
+rec(rec())

+ 4 - 0
3rdparty/glslang/glslang/Include/BaseTypes.h

@@ -203,6 +203,9 @@ enum TBuiltInVariable {
     EbvBaryCoordPullModel,
     EbvBaryCoordPullModel,
 #endif
 #endif
 
 
+    EbvViewIndex,
+    EbvDeviceIndex,
+
 #ifdef NV_EXTENSIONS
 #ifdef NV_EXTENSIONS
     EbvViewportMaskNV,
     EbvViewportMaskNV,
     EbvSecondaryPositionNV,
     EbvSecondaryPositionNV,
@@ -210,6 +213,7 @@ enum TBuiltInVariable {
     EbvPositionPerViewNV,
     EbvPositionPerViewNV,
     EbvViewportMaskPerViewNV,
     EbvViewportMaskPerViewNV,
 #endif 
 #endif 
+
     // HLSL built-ins that live only temporarily, until they get remapped
     // HLSL built-ins that live only temporarily, until they get remapped
     // to one of the above.
     // to one of the above.
     EbvFragDepthGreater,
     EbvFragDepthGreater,

+ 2 - 0
3rdparty/glslang/glslang/Include/Types.h

@@ -188,6 +188,8 @@ struct TSampler {   // misnomer now; includes images, textures without sampler,
         case EbtFloat:               break;
         case EbtFloat:               break;
         case EbtInt:  s.append("i"); break;
         case EbtInt:  s.append("i"); break;
         case EbtUint: s.append("u"); break;
         case EbtUint: s.append("u"); break;
+        case EbtInt64:  s.append("i64"); break;
+        case EbtUint64: s.append("u64"); break;
         default:  break;  // some compilers want this
         default:  break;  // some compilers want this
         }
         }
         if (image) {
         if (image) {

+ 2 - 2
3rdparty/glslang/glslang/Include/revision.h

@@ -2,5 +2,5 @@
 // For the version, it uses the latest git tag followed by the number of commits.
 // For the version, it uses the latest git tag followed by the number of commits.
 // For the date, it uses the current date (when then script is run).
 // For the date, it uses the current date (when then script is run).
 
 
-#define GLSLANG_REVISION "Overload400-PrecQual.1845"
-#define GLSLANG_DATE "24-Feb-2017"
+#define GLSLANG_REVISION "Overload400-PrecQual.1875"
+#define GLSLANG_DATE "03-Mar-2017"

+ 15 - 0
3rdparty/glslang/glslang/MachineIndependent/Initialize.cpp

@@ -85,6 +85,8 @@ TBuiltIns::TBuiltIns()
     prefixes[EbtFloat] =  "";
     prefixes[EbtFloat] =  "";
     prefixes[EbtInt]   = "i";
     prefixes[EbtInt]   = "i";
     prefixes[EbtUint]  = "u";
     prefixes[EbtUint]  = "u";
+    prefixes[EbtInt64]  = "i64";
+    prefixes[EbtUint64] = "u64";
     postfixes[2] = "2";
     postfixes[2] = "2";
     postfixes[3] = "3";
     postfixes[3] = "3";
     postfixes[4] = "4";
     postfixes[4] = "4";
@@ -103,6 +105,7 @@ TBuiltIns::~TBuiltIns()
 {
 {
 }
 }
 
 
+
 //
 //
 // Add all context-independent built-in functions and variables that are present
 // Add all context-independent built-in functions and variables that are present
 // for the given version and profile.  Share common ones across stages, otherwise
 // for the given version and profile.  Share common ones across stages, otherwise
@@ -3698,6 +3701,11 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
             "\n");
             "\n");
     }
     }
 
 
+    if (profile != EEsProfile) {
+        commonBuiltins.append("uniform int gl_ViewIndex;");
+        commonBuiltins.append("uniform int gl_DeviceIndex;");  // GL_EXT_device_group
+    }
+
     // printf("%s\n", commonBuiltins.c_str());
     // printf("%s\n", commonBuiltins.c_str());
     // printf("%s\n", stageBuiltins[EShLangFragment].c_str());
     // printf("%s\n", stageBuiltins[EShLangFragment].c_str());
 }
 }
@@ -5308,6 +5316,13 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
             symbolTable.setFunctionExtensions("imageAtomicExchange", 1, &E_GL_OES_shader_image_atomic);
             symbolTable.setFunctionExtensions("imageAtomicExchange", 1, &E_GL_OES_shader_image_atomic);
             symbolTable.setFunctionExtensions("imageAtomicCompSwap", 1, &E_GL_OES_shader_image_atomic);
             symbolTable.setFunctionExtensions("imageAtomicCompSwap", 1, &E_GL_OES_shader_image_atomic);
         }
         }
+
+        if (profile != EEsProfile) {
+            symbolTable.setFunctionExtensions("gl_DeviceIndex",  1, &E_GL_EXT_device_group);
+            BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
+            symbolTable.setFunctionExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview);
+            BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
+        }
         break;
         break;
 
 
     case EShLangCompute:
     case EShLangCompute:

+ 7 - 5
3rdparty/glslang/glslang/MachineIndependent/ParseHelper.cpp

@@ -5597,11 +5597,10 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con
 
 
     mergeObjectLayoutQualifiers(defaultQualification, currentBlockQualifier, true);
     mergeObjectLayoutQualifiers(defaultQualification, currentBlockQualifier, true);
 
 
-    // "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."
     // "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() || currentBlockQualifier.hasAlign()) {
+    if (currentBlockQualifier.hasAlign()) {
         if (defaultQualification.layoutPacking != ElpStd140 && defaultQualification.layoutPacking != ElpStd430) {
         if (defaultQualification.layoutPacking != ElpStd140 && defaultQualification.layoutPacking != ElpStd430) {
-            error(loc, "can only be used with std140 or std430 layout packing", "offset/align", "");
+            error(loc, "can only be used with std140 or std430 layout packing", "align", "");
             defaultQualification.layoutAlign = -1;
             defaultQualification.layoutAlign = -1;
         }
         }
     }
     }
@@ -5643,9 +5642,12 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con
             }
             }
         } else
         } else
             memberWithoutLocation = true;
             memberWithoutLocation = true;
-        if (memberQualifier.hasAlign()) {
+
+        // "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)
             if (defaultQualification.layoutPacking != ElpStd140 && defaultQualification.layoutPacking != ElpStd430)
-                error(memberLoc, "can only be used with std140 or std430 layout packing", "align", "");
+                error(memberLoc, "can only be used with std140 or std430 layout packing", "offset/align", "");
         }
         }
 
 
         TQualifier newMemberQualification = defaultQualification;
         TQualifier newMemberQualification = defaultQualification;

+ 5 - 1
3rdparty/glslang/glslang/MachineIndependent/SymbolTable.cpp

@@ -103,7 +103,11 @@ void TType::buildMangledName(TString& mangledName)
             mangledName += "M";
             mangledName += "M";
         break;
         break;
     case EbtStruct:
     case EbtStruct:
-        mangledName += "struct-";
+    case EbtBlock:
+        if (basicType == EbtStruct)
+            mangledName += "struct-";
+        else
+            mangledName += "block-";
         if (typeName)
         if (typeName)
             mangledName += *typeName;
             mangledName += *typeName;
         for (unsigned int i = 0; i < structure->size(); ++i) {
         for (unsigned int i = 0; i < structure->size(); ++i) {

+ 5 - 1
3rdparty/glslang/glslang/MachineIndependent/Versions.cpp

@@ -232,6 +232,10 @@ void TParseVersions::initializeExtensionBehavior()
     extensionBehavior[E_GL_OES_tessellation_point_size]  = EBhDisable;
     extensionBehavior[E_GL_OES_tessellation_point_size]  = EBhDisable;
     extensionBehavior[E_GL_OES_texture_buffer]           = EBhDisable;
     extensionBehavior[E_GL_OES_texture_buffer]           = EBhDisable;
     extensionBehavior[E_GL_OES_texture_cube_map_array]   = EBhDisable;
     extensionBehavior[E_GL_OES_texture_cube_map_array]   = EBhDisable;
+
+    // EXT extensions
+    extensionBehavior[E_GL_EXT_device_group]             = EBhDisable;
+    extensionBehavior[E_GL_EXT_multiview]                = EBhDisable;
 }
 }
 
 
 // Get code that is not part of a shared symbol table, is specific to this shader,
 // Get code that is not part of a shared symbol table, is specific to this shader,
@@ -683,7 +687,7 @@ void TParseVersions::doubleCheck(const TSourceLoc& loc, const char* op)
 }
 }
 
 
 #ifdef AMD_EXTENSIONS
 #ifdef AMD_EXTENSIONS
-// Call for any operation needing GLSL float16 data-type support.
+// Call for any operation needing float16 data-type support.
 void TParseVersions::float16Check(const TSourceLoc& loc, const char* op, bool builtIn)
 void TParseVersions::float16Check(const TSourceLoc& loc, const char* op, bool builtIn)
 {
 {
     if (!builtIn) {
     if (!builtIn) {

+ 4 - 0
3rdparty/glslang/glslang/MachineIndependent/Versions.h

@@ -132,6 +132,10 @@ const char* const E_GL_ARB_sparse_texture_clamp         = "GL_ARB_sparse_texture
 const char* const E_GL_EXT_shader_non_constant_global_initializers = "GL_EXT_shader_non_constant_global_initializers";
 const char* const E_GL_EXT_shader_non_constant_global_initializers = "GL_EXT_shader_non_constant_global_initializers";
 const char* const E_GL_EXT_shader_image_load_formatted = "GL_EXT_shader_image_load_formatted";
 const char* const E_GL_EXT_shader_image_load_formatted = "GL_EXT_shader_image_load_formatted";
 
 
+// EXT extensions
+const char* const E_GL_EXT_device_group                 = "GL_EXT_device_group";
+const char* const E_GL_EXT_multiview                    = "GL_EXT_multiview";
+
 // #line and #include
 // #line and #include
 const char* const E_GL_GOOGLE_cpp_style_line_directive          = "GL_GOOGLE_cpp_style_line_directive";
 const char* const E_GL_GOOGLE_cpp_style_line_directive          = "GL_GOOGLE_cpp_style_line_directive";
 const char* const E_GL_GOOGLE_include_directive                 = "GL_GOOGLE_include_directive";
 const char* const E_GL_GOOGLE_include_directive                 = "GL_GOOGLE_include_directive";

+ 3 - 1
3rdparty/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp

@@ -986,6 +986,8 @@ TPpContext::TokenStream* TPpContext::PrescanMacroArg(TokenStream& arg, TPpToken*
     int token;
     int token;
     while ((token = scanToken(ppToken)) != tMarkerInput::marker && token != EndOfInput) {
     while ((token = scanToken(ppToken)) != tMarkerInput::marker && token != EndOfInput) {
         token = tokenPaste(token, *ppToken);
         token = tokenPaste(token, *ppToken);
+        if (token == tMarkerInput::marker || token == EndOfInput)
+            break;
         if (token == PpAtomIdentifier && MacroExpand(ppToken, false, newLineOkay) != 0)
         if (token == PpAtomIdentifier && MacroExpand(ppToken, false, newLineOkay) != 0)
             continue;
             continue;
         expandedArg->putToken(token, ppToken);
         expandedArg->putToken(token, ppToken);
@@ -1050,7 +1052,7 @@ int TPpContext::tMacroInput::scan(TPpToken* ppToken)
     // TODO: preprocessor:  properly handle whitespace (or lack of it) between tokens when expanding
     // TODO: preprocessor:  properly handle whitespace (or lack of it) between tokens when expanding
     if (token == PpAtomIdentifier) {
     if (token == PpAtomIdentifier) {
         int i;
         int i;
-        for (i = mac->args.size() - 1; i >= 0; i--)
+        for (i = (int)mac->args.size() - 1; i >= 0; i--)
             if (strcmp(pp->atomStrings.getString(mac->args[i]), ppToken->name) == 0)
             if (strcmp(pp->atomStrings.getString(mac->args[i]), ppToken->name) == 0)
                 break;
                 break;
         if (i >= 0) {
         if (i >= 0) {

+ 1 - 1
3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpContext.h

@@ -236,7 +236,7 @@ public:
         void reset() { current = 0; }
         void reset() { current = 0; }
 
 
     protected:
     protected:
-        void putSubtoken(int);
+        void putSubtoken(char);
         int getSubtoken();
         int getSubtoken();
         void ungetSubtoken();
         void ungetSubtoken();
 
 

+ 36 - 16
3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp

@@ -101,9 +101,16 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
 {
 {
     bool HasDecimalOrExponent = false;
     bool HasDecimalOrExponent = false;
     int isDouble = 0;
     int isDouble = 0;
+    bool generateFloat16 = false;
+    bool acceptFloat16 = parseContext.intermediate.getSource() == EShSourceHlsl;
+    bool isFloat16 = false;
+    bool requireHF = false;
 #ifdef AMD_EXTENSIONS
 #ifdef AMD_EXTENSIONS
-    int isFloat16 = 0;
-    bool enableFloat16 = parseContext.version >= 450 && parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float);
+    if (parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float)) {
+        acceptFloat16 = true;
+        generateFloat16 = true;
+        requireHF = true;
+    }
 #endif
 #endif
 
 
     const auto saveName = [&](int ch) {
     const auto saveName = [&](int ch) {
@@ -158,21 +165,27 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
             saveName(ch2);
             saveName(ch2);
             isDouble = 1;
             isDouble = 1;
         }
         }
+    } else if (acceptFloat16 && (ch == 'h' || ch == 'H')) {
 #ifdef AMD_EXTENSIONS
 #ifdef AMD_EXTENSIONS
-    } else if (enableFloat16 && (ch == 'h' || ch == 'H')) {
-        parseContext.float16Check(ppToken->loc, "half floating-point suffix");
+        if (generateFloat16)
+            parseContext.float16Check(ppToken->loc, "half floating-point suffix");
+#endif
         if (!HasDecimalOrExponent)
         if (!HasDecimalOrExponent)
             parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
             parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
-        int ch2 = getChar();
-        if (ch2 != 'f' && ch2 != 'F') {
-            ungetChar();
-            ungetChar();
+        if (requireHF) {
+            int ch2 = getChar();
+            if (ch2 != 'f' && ch2 != 'F') {
+                ungetChar();
+                ungetChar();
+            } else {
+                saveName(ch);
+                saveName(ch2);
+                isFloat16 = generateFloat16;
+            }
         } else {
         } else {
             saveName(ch);
             saveName(ch);
-            saveName(ch2);
-            isFloat16 = 1;
+            isFloat16 = generateFloat16;
         }
         }
-#endif
     } else if (ch == 'f' || ch == 'F') {
     } else if (ch == 'f' || ch == 'F') {
         parseContext.profileRequires(ppToken->loc,  EEsProfile, 300, nullptr, "floating-point suffix");
         parseContext.profileRequires(ppToken->loc,  EEsProfile, 300, nullptr, "floating-point suffix");
         if (! parseContext.relaxedErrors())
         if (! parseContext.relaxedErrors())
@@ -197,10 +210,8 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
     // Return the right token type
     // Return the right token type
     if (isDouble)
     if (isDouble)
         return PpAtomConstDouble;
         return PpAtomConstDouble;
-#ifdef AMD_EXTENSIONS
     else if (isFloat16)
     else if (isFloat16)
         return PpAtomConstFloat16;
         return PpAtomConstFloat16;
-#endif
     else
     else
         return PpAtomConstFloat;
         return PpAtomConstFloat;
 }
 }
@@ -216,6 +227,15 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
     int ii = 0;
     int ii = 0;
     unsigned long long ival = 0;
     unsigned long long ival = 0;
     bool enableInt64 = pp->parseContext.version >= 450 && pp->parseContext.extensionTurnedOn(E_GL_ARB_gpu_shader_int64);
     bool enableInt64 = pp->parseContext.version >= 450 && pp->parseContext.extensionTurnedOn(E_GL_ARB_gpu_shader_int64);
+    bool acceptHalf = pp->parseContext.intermediate.getSource() == EShSourceHlsl;
+#ifdef AMD_EXTENSIONS
+    if (pp->parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float))
+        acceptHalf = true;
+#endif
+
+    const auto floatingPointChar = [&](int ch) { return ch == '.' || ch == 'e' || ch == 'E' ||
+                                                                     ch == 'f' || ch == 'F' ||
+                                                     (acceptHalf && (ch == 'h' || ch == 'H')); };
 
 
     ppToken->ival = 0;
     ppToken->ival = 0;
     ppToken->i64val = 0;
     ppToken->i64val = 0;
@@ -380,7 +400,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                         ch = getch();
                         ch = getch();
                     } while (ch >= '0' && ch <= '9');
                     } while (ch >= '0' && ch <= '9');
                 }
                 }
-                if (ch == '.' || ch == 'e' || ch == 'f' || ch == 'E' || ch == 'F')
+                if (floatingPointChar(ch))
                     return pp->lFloatConst(len, ch, ppToken);
                     return pp->lFloatConst(len, ch, ppToken);
 
 
                 // wasn't a float, so must be octal...
                 // wasn't a float, so must be octal...
@@ -435,9 +455,9 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                 }
                 }
                 ch = getch();
                 ch = getch();
             } while (ch >= '0' && ch <= '9');
             } while (ch >= '0' && ch <= '9');
-            if (ch == '.' || ch == 'e' || ch == 'f' || ch == 'E' || ch == 'F') {
+            if (floatingPointChar(ch))
                 return pp->lFloatConst(len, ch, ppToken);
                 return pp->lFloatConst(len, ch, ppToken);
-            } else {
+            else {
                 // Finish handling signed and unsigned integers
                 // Finish handling signed and unsigned integers
                 int numericLen = len;
                 int numericLen = len;
                 bool isUnsigned = false;
                 bool isUnsigned = false;

+ 3 - 3
3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp

@@ -96,9 +96,8 @@ NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 namespace glslang {
 namespace glslang {
 
 
 // push onto back of stream
 // push onto back of stream
-void TPpContext::TokenStream::putSubtoken(int subtoken)
+void TPpContext::TokenStream::putSubtoken(char subtoken)
 {
 {
-    assert((subtoken & ~0xff) == 0);
     data.push_back(static_cast<unsigned char>(subtoken));
     data.push_back(static_cast<unsigned char>(subtoken));
 }
 }
 
 
@@ -125,7 +124,8 @@ void TPpContext::TokenStream::putToken(int token, TPpToken* ppToken)
     const char* s;
     const char* s;
     char* str = NULL;
     char* str = NULL;
 
 
-    putSubtoken(token);
+    assert((token & ~0xff) == 0);
+    putSubtoken(static_cast<char>(token));
 
 
     switch (token) {
     switch (token) {
     case PpAtomIdentifier:
     case PpAtomIdentifier:

+ 0 - 2
3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h

@@ -127,9 +127,7 @@ enum EFixedAtoms {
     PpAtomConstUint64,
     PpAtomConstUint64,
     PpAtomConstFloat,
     PpAtomConstFloat,
     PpAtomConstDouble,
     PpAtomConstDouble,
-#ifdef AMD_EXTENSIONS
     PpAtomConstFloat16,
     PpAtomConstFloat16,
-#endif
     PpAtomConstString,
     PpAtomConstString,
 
 
     // Identifiers
     // Identifiers

+ 0 - 8
3rdparty/glslang/glslang/Public/ShaderLang.h

@@ -203,14 +203,6 @@ SH_IMPORT_EXPORT int ShCompile(
     EShMessages messages = EShMsgDefault // warnings and errors
     EShMessages messages = EShMsgDefault // warnings and errors
     );
     );
 
 
-SH_IMPORT_EXPORT int ShLink(
-    const ShHandle,               // linker object
-    const ShHandle h[],           // compiler objects to link together
-    const int numHandles,
-    ShHandle uniformMap,          // updated with new uniforms
-    short int** uniformsAccessed,  // returned with indexes of uniforms accessed
-    int* numUniformsAccessed);
-
 SH_IMPORT_EXPORT int ShLinkExt(
 SH_IMPORT_EXPORT int ShLinkExt(
     const ShHandle,               // linker object
     const ShHandle,               // linker object
     const ShHandle h[],           // compiler objects to link together
     const ShHandle h[],           // compiler objects to link together

+ 4 - 1
3rdparty/glslang/gtests/Hlsl.FromFile.cpp

@@ -132,7 +132,8 @@ INSTANTIATE_TEST_CASE_P(
         {"hlsl.intrinsics.evalfns.frag", "main"},
         {"hlsl.intrinsics.evalfns.frag", "main"},
         {"hlsl.intrinsics.d3dcolortoubyte4.frag", "main"},
         {"hlsl.intrinsics.d3dcolortoubyte4.frag", "main"},
         {"hlsl.intrinsics.double.frag", "PixelShaderFunction"},
         {"hlsl.intrinsics.double.frag", "PixelShaderFunction"},
-        {"hlsl.intrinsics.f1632.frag", "PixelShaderFunction"},
+        {"hlsl.intrinsics.f1632.frag", "main"},
+        {"hlsl.intrinsics.f3216.frag", "main"},
         {"hlsl.intrinsics.frag", "main"},
         {"hlsl.intrinsics.frag", "main"},
         {"hlsl.intrinsics.lit.frag", "PixelShaderFunction"},
         {"hlsl.intrinsics.lit.frag", "PixelShaderFunction"},
         {"hlsl.intrinsics.negative.comp", "ComputeShaderFunction"},
         {"hlsl.intrinsics.negative.comp", "ComputeShaderFunction"},
@@ -225,10 +226,12 @@ INSTANTIATE_TEST_CASE_P(
         {"hlsl.structbuffer.atomics.frag", "main"},
         {"hlsl.structbuffer.atomics.frag", "main"},
         {"hlsl.structbuffer.byte.frag", "main"},
         {"hlsl.structbuffer.byte.frag", "main"},
         {"hlsl.structbuffer.coherent.frag", "main"},
         {"hlsl.structbuffer.coherent.frag", "main"},
+        {"hlsl.structbuffer.fn.frag", "main"},
         {"hlsl.structbuffer.rw.frag", "main"},
         {"hlsl.structbuffer.rw.frag", "main"},
         {"hlsl.structbuffer.rwbyte.frag", "main"},
         {"hlsl.structbuffer.rwbyte.frag", "main"},
         {"hlsl.structin.vert", "main"},
         {"hlsl.structin.vert", "main"},
         {"hlsl.structIoFourWay.frag", "main"},
         {"hlsl.structIoFourWay.frag", "main"},
+        {"hlsl.structStructName.frag", "main"},
         {"hlsl.intrinsics.vert", "VertexShaderFunction"},
         {"hlsl.intrinsics.vert", "VertexShaderFunction"},
         {"hlsl.matType.frag", "PixelShaderFunction"},
         {"hlsl.matType.frag", "PixelShaderFunction"},
         {"hlsl.matType.bool.frag", "main"},
         {"hlsl.matType.bool.frag", "main"},

+ 7 - 2
3rdparty/glslang/gtests/Spv.FromFile.cpp

@@ -225,7 +225,9 @@ INSTANTIATE_TEST_CASE_P(
         "spv.dataOutIndirect.vert",
         "spv.dataOutIndirect.vert",
         "spv.deepRvalue.frag",
         "spv.deepRvalue.frag",
         "spv.depthOut.frag",
         "spv.depthOut.frag",
+        "spv.deviceGroup.frag",
         "spv.discard-dce.frag",
         "spv.discard-dce.frag",
+        "spv.drawParams.vert",
         "spv.doWhileLoop.frag",
         "spv.doWhileLoop.frag",
         "spv.earlyReturnDiscard.frag",
         "spv.earlyReturnDiscard.frag",
         "spv.flowControl.frag",
         "spv.flowControl.frag",
@@ -234,8 +236,10 @@ INSTANTIATE_TEST_CASE_P(
         "spv.functionCall.frag",
         "spv.functionCall.frag",
         "spv.functionNestedOpaque.vert",
         "spv.functionNestedOpaque.vert",
         "spv.functionSemantics.frag",
         "spv.functionSemantics.frag",
+        "spv.GeometryShaderPassthrough.geom",
         "spv.interpOps.frag",
         "spv.interpOps.frag",
         "spv.int64.frag",
         "spv.int64.frag",
+        "spv.intOps.vert",
         "spv.layoutNested.vert",
         "spv.layoutNested.vert",
         "spv.length.frag",
         "spv.length.frag",
         "spv.localAggregates.frag",
         "spv.localAggregates.frag",
@@ -248,16 +252,17 @@ INSTANTIATE_TEST_CASE_P(
         "spv.merge-unreachable.frag",
         "spv.merge-unreachable.frag",
         "spv.multiStruct.comp",
         "spv.multiStruct.comp",
         "spv.multiStructFuncall.frag",
         "spv.multiStructFuncall.frag",
+        "spv.multiView.frag",
         "spv.newTexture.frag",
         "spv.newTexture.frag",
         "spv.noDeadDecorations.vert",
         "spv.noDeadDecorations.vert",
         "spv.nonSquare.vert",
         "spv.nonSquare.vert",
+        "spv.noWorkgroup.comp",
         "spv.offsets.frag",
         "spv.offsets.frag",
         "spv.Operations.frag",
         "spv.Operations.frag",
-        "spv.intOps.vert",
-        "spv.noWorkgroup.comp",
         "spv.precision.frag",
         "spv.precision.frag",
         "spv.prepost.frag",
         "spv.prepost.frag",
         "spv.qualifiers.vert",
         "spv.qualifiers.vert",
+        "spv.sampleMaskOverrideCoverage.frag",
         "spv.shaderBallot.comp",
         "spv.shaderBallot.comp",
         "spv.shaderDrawParams.vert",
         "spv.shaderDrawParams.vert",
         "spv.shaderGroupVote.comp",
         "spv.shaderGroupVote.comp",

+ 53 - 49
3rdparty/glslang/hlsl/hlslGrammar.cpp

@@ -406,36 +406,13 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& node, TIntermNode*& node2)
                 }
                 }
             }
             }
 
 
-            TString* blockName = idToken.string;
-
-            // For structbuffers, we couldn't create the block type while accepting the
-            // template type, because we need the identifier name.  Now that we have that,
-            // we can create the buffer type.
-            // TODO: how to determine this without looking for implicit array sizes?
-            if (variableType.getBasicType() == EbtBlock) {
-                const int memberCount = variableType.getStruct()->size();
-                assert(memberCount > 0);
-
-                TType* contentType = (*variableType.getStruct())[memberCount-1].type;
-                
-                // Set the field name and qualifier from the declaration, now that we know it.
-                if (contentType->isRuntimeSizedArray()) {
-                    contentType->getQualifier() = variableType.getQualifier();
-                    blockName     = nullptr;        // this will be an anonymous block...
-                    contentType->setFieldName(*idToken.string); // field name is declaration name
-                    variableType.setTypeName(*idToken.string);
-                }
-            }
-
-            // Hand off the actual declaration
-
             // TODO: things scoped within an annotation need their own name space;
             // TODO: things scoped within an annotation need their own name space;
             // TODO: strings are not yet handled.
             // TODO: strings are not yet handled.
             if (variableType.getBasicType() != EbtString && parseContext.getAnnotationNestingLevel() == 0) {
             if (variableType.getBasicType() != EbtString && parseContext.getAnnotationNestingLevel() == 0) {
                 if (typedefDecl)
                 if (typedefDecl)
                     parseContext.declareTypedef(idToken.loc, *idToken.string, variableType);
                     parseContext.declareTypedef(idToken.loc, *idToken.string, variableType);
                 else if (variableType.getBasicType() == EbtBlock)
                 else if (variableType.getBasicType() == EbtBlock)
-                    parseContext.declareBlock(idToken.loc, variableType, blockName);
+                    parseContext.declareBlock(idToken.loc, variableType, idToken.string);
                 else {
                 else {
                     if (variableType.getQualifier().storage == EvqUniform && ! variableType.containsOpaque()) {
                     if (variableType.getQualifier().storage == EvqUniform && ! variableType.containsOpaque()) {
                         // this isn't really an individual variable, but a member of the $Global buffer
                         // this isn't really an individual variable, but a member of the $Global buffer
@@ -1282,6 +1259,7 @@ bool HlslGrammar::acceptType(TType& type)
         return acceptStructBufferType(type);
         return acceptStructBufferType(type);
         break;
         break;
 
 
+    case EHTokClass:
     case EHTokStruct:
     case EHTokStruct:
     case EHTokCBuffer:
     case EHTokCBuffer:
     case EHTokTBuffer:
     case EHTokTBuffer:
@@ -1291,9 +1269,8 @@ bool HlslGrammar::acceptType(TType& type)
         // An identifier could be for a user-defined type.
         // An identifier could be for a user-defined type.
         // Note we cache the symbol table lookup, to save for a later rule
         // Note we cache the symbol table lookup, to save for a later rule
         // when this is not a type.
         // when this is not a type.
-        token.symbol = parseContext.symbolTable.find(*token.string);
-        if (token.symbol && token.symbol->getAsVariable() && token.symbol->getAsVariable()->isUserType()) {
-            type.shallowCopy(token.symbol->getType());
+        token.symbol = parseContext.lookupUserType(*token.string, type);
+        if (token.symbol != nullptr) {
             advanceToken();
             advanceToken();
             return true;
             return true;
         } else
         } else
@@ -1752,9 +1729,11 @@ bool HlslGrammar::acceptType(TType& type)
 // struct
 // struct
 //      : struct_type IDENTIFIER post_decls LEFT_BRACE struct_declaration_list RIGHT_BRACE
 //      : struct_type IDENTIFIER post_decls LEFT_BRACE struct_declaration_list RIGHT_BRACE
 //      | struct_type            post_decls LEFT_BRACE struct_declaration_list RIGHT_BRACE
 //      | struct_type            post_decls LEFT_BRACE struct_declaration_list RIGHT_BRACE
+//      | struct_type IDENTIFIER // use of previously declared struct type
 //
 //
 // struct_type
 // struct_type
 //      : STRUCT
 //      : STRUCT
+//      | CLASS
 //      | CBUFFER
 //      | CBUFFER
 //      | TBUFFER
 //      | TBUFFER
 //
 //
@@ -1770,8 +1749,9 @@ bool HlslGrammar::acceptStruct(TType& type)
     // TBUFFER
     // TBUFFER
     else if (acceptTokenClass(EHTokTBuffer))
     else if (acceptTokenClass(EHTokTBuffer))
         storageQualifier = EvqBuffer;
         storageQualifier = EvqBuffer;
+    // CLASS
     // STRUCT
     // STRUCT
-    else if (! acceptTokenClass(EHTokStruct))
+    else if (! acceptTokenClass(EHTokClass) && ! acceptTokenClass(EHTokStruct))
         return false;
         return false;
 
 
     // IDENTIFIER
     // IDENTIFIER
@@ -1784,12 +1764,18 @@ bool HlslGrammar::acceptStruct(TType& type)
     // post_decls
     // post_decls
     TQualifier postDeclQualifier;
     TQualifier postDeclQualifier;
     postDeclQualifier.clear();
     postDeclQualifier.clear();
-    acceptPostDecls(postDeclQualifier);
+    bool postDeclsFound = acceptPostDecls(postDeclQualifier);
 
 
     // LEFT_BRACE
     // LEFT_BRACE
+    // struct_type IDENTIFIER
     if (! acceptTokenClass(EHTokLeftBrace)) {
     if (! acceptTokenClass(EHTokLeftBrace)) {
-        expected("{");
-        return false;
+        if (structName.size() > 0 && !postDeclsFound && parseContext.lookupUserType(structName, type) != nullptr) {
+            // struct_type IDENTIFIER
+            return true;
+        } else {
+            expected("{");
+            return false;
+        }
     }
     }
 
 
     // struct_declaration_list
     // struct_declaration_list
@@ -1888,18 +1874,26 @@ bool HlslGrammar::acceptStructBufferType(TType& type)
     TArraySizes unsizedArray;
     TArraySizes unsizedArray;
     unsizedArray.addInnerSize(UnsizedArraySize);
     unsizedArray.addInnerSize(UnsizedArraySize);
     templateType->newArraySizes(unsizedArray);
     templateType->newArraySizes(unsizedArray);
-    templateType->getQualifier().storage = storage;
-    templateType->getQualifier().readonly = readonly;
+
+    // field name is canonical for all structbuffers
+    templateType->setFieldName("@data");
 
 
     // Create block type.  TODO: hidden internal uint member when needed
     // Create block type.  TODO: hidden internal uint member when needed
+
     TTypeList* blockStruct = new TTypeList;
     TTypeList* blockStruct = new TTypeList;
     TTypeLoc  member = { templateType, token.loc };
     TTypeLoc  member = { templateType, token.loc };
     blockStruct->push_back(member);
     blockStruct->push_back(member);
 
 
+    // This is the type of the buffer block (SSBO)
     TType blockType(blockStruct, "", templateType->getQualifier());
     TType blockType(blockStruct, "", templateType->getQualifier());
 
 
-    // It's not until we see the name during declaration that we can set the
-    // field name.  That happens in HlslGrammar::acceptDeclaration.
+    blockType.getQualifier().storage = storage;
+    blockType.getQualifier().readonly = readonly;
+
+    // We may have created an equivalent type before, in which case we should use its
+    // deep structure.
+    parseContext.shareStructBufferType(blockType);
+
     type.shallowCopy(blockType);
     type.shallowCopy(blockType);
 
 
     return true;
     return true;
@@ -2527,8 +2521,8 @@ bool HlslGrammar::acceptPostfixExpression(TIntermTyped*& node)
         ~tFinalize() { parseContext.finalizeFlattening(); }
         ~tFinalize() { parseContext.finalizeFlattening(); }
         HlslParseContext& parseContext;
         HlslParseContext& parseContext;
     private:
     private:
-        const tFinalize& operator=(const tFinalize& f);
-        tFinalize(const tFinalize& f);
+        const tFinalize& operator=(const tFinalize& f) { return *this; }
+        tFinalize(const tFinalize& f) : parseContext(f.parseContext) { }
     } finalize(parseContext);
     } finalize(parseContext);
 
 
     // Initialize the flattening accumulation data, so we can track data across multiple bracket or
     // Initialize the flattening accumulation data, so we can track data across multiple bracket or
@@ -3289,11 +3283,18 @@ void HlslGrammar::acceptArraySpecifier(TArraySizes*& arraySizes)
 //        COLON LAYOUT layout_qualifier_list
 //        COLON LAYOUT layout_qualifier_list
 //        annotations // optional
 //        annotations // optional
 //
 //
-void HlslGrammar::acceptPostDecls(TQualifier& qualifier)
+// Return true if any tokens were accepted. That is,
+// false can be returned on successfully recognizing nothing,
+// not necessarily meaning bad syntax.
+//
+bool HlslGrammar::acceptPostDecls(TQualifier& qualifier)
 {
 {
+    bool found = false;
+
     do {
     do {
         // COLON
         // COLON
         if (acceptTokenClass(EHTokColon)) {
         if (acceptTokenClass(EHTokColon)) {
+            found = true;
             HlslToken idToken;
             HlslToken idToken;
             if (peekTokenClass(EHTokLayout))
             if (peekTokenClass(EHTokLayout))
                 acceptLayoutQualifierList(qualifier);
                 acceptLayoutQualifierList(qualifier);
@@ -3301,18 +3302,18 @@ void HlslGrammar::acceptPostDecls(TQualifier& qualifier)
                 // PACKOFFSET LEFT_PAREN c[Subcomponent][.component] RIGHT_PAREN
                 // PACKOFFSET LEFT_PAREN c[Subcomponent][.component] RIGHT_PAREN
                 if (! acceptTokenClass(EHTokLeftParen)) {
                 if (! acceptTokenClass(EHTokLeftParen)) {
                     expected("(");
                     expected("(");
-                    return;
+                    return false;
                 }
                 }
                 HlslToken locationToken;
                 HlslToken locationToken;
                 if (! acceptIdentifier(locationToken)) {
                 if (! acceptIdentifier(locationToken)) {
                     expected("c[subcomponent][.component]");
                     expected("c[subcomponent][.component]");
-                    return;
+                    return false;
                 }
                 }
                 HlslToken componentToken;
                 HlslToken componentToken;
                 if (acceptTokenClass(EHTokDot)) {
                 if (acceptTokenClass(EHTokDot)) {
                     if (! acceptIdentifier(componentToken)) {
                     if (! acceptIdentifier(componentToken)) {
                         expected("component");
                         expected("component");
-                        return;
+                        return false;
                     }
                     }
                 }
                 }
                 if (! acceptTokenClass(EHTokRightParen)) {
                 if (! acceptTokenClass(EHTokRightParen)) {
@@ -3322,19 +3323,19 @@ void HlslGrammar::acceptPostDecls(TQualifier& qualifier)
                 parseContext.handlePackOffset(locationToken.loc, qualifier, *locationToken.string, componentToken.string);
                 parseContext.handlePackOffset(locationToken.loc, qualifier, *locationToken.string, componentToken.string);
             } else if (! acceptIdentifier(idToken)) {
             } else if (! acceptIdentifier(idToken)) {
                 expected("layout, semantic, packoffset, or register");
                 expected("layout, semantic, packoffset, or register");
-                return;
+                return false;
             } else if (*idToken.string == "register") {
             } else if (*idToken.string == "register") {
                 // REGISTER LEFT_PAREN [shader_profile,] Type#[subcomp]opt (COMMA SPACEN)opt RIGHT_PAREN
                 // REGISTER LEFT_PAREN [shader_profile,] Type#[subcomp]opt (COMMA SPACEN)opt RIGHT_PAREN
                 // LEFT_PAREN
                 // LEFT_PAREN
                 if (! acceptTokenClass(EHTokLeftParen)) {
                 if (! acceptTokenClass(EHTokLeftParen)) {
                     expected("(");
                     expected("(");
-                    return;
+                    return false;
                 }
                 }
                 HlslToken registerDesc;  // for Type#
                 HlslToken registerDesc;  // for Type#
                 HlslToken profile;
                 HlslToken profile;
                 if (! acceptIdentifier(registerDesc)) {
                 if (! acceptIdentifier(registerDesc)) {
                     expected("register number description");
                     expected("register number description");
-                    return;
+                    return false;
                 }
                 }
                 if (registerDesc.string->size() > 1 && !isdigit((*registerDesc.string)[1]) &&
                 if (registerDesc.string->size() > 1 && !isdigit((*registerDesc.string)[1]) &&
                                                        acceptTokenClass(EHTokComma)) {
                                                        acceptTokenClass(EHTokComma)) {
@@ -3343,7 +3344,7 @@ void HlslGrammar::acceptPostDecls(TQualifier& qualifier)
                     profile = registerDesc;
                     profile = registerDesc;
                     if (! acceptIdentifier(registerDesc)) {
                     if (! acceptIdentifier(registerDesc)) {
                         expected("register number description");
                         expected("register number description");
-                        return;
+                        return false;
                     }
                     }
                 }
                 }
                 int subComponent = 0;
                 int subComponent = 0;
@@ -3351,7 +3352,7 @@ void HlslGrammar::acceptPostDecls(TQualifier& qualifier)
                     // LEFT_BRACKET subcomponent RIGHT_BRACKET
                     // LEFT_BRACKET subcomponent RIGHT_BRACKET
                     if (! peekTokenClass(EHTokIntConstant)) {
                     if (! peekTokenClass(EHTokIntConstant)) {
                         expected("literal integer");
                         expected("literal integer");
-                        return;
+                        return false;
                     }
                     }
                     subComponent = token.i;
                     subComponent = token.i;
                     advanceToken();
                     advanceToken();
@@ -3365,7 +3366,7 @@ void HlslGrammar::acceptPostDecls(TQualifier& qualifier)
                 if (acceptTokenClass(EHTokComma)) {
                 if (acceptTokenClass(EHTokComma)) {
                     if (! acceptIdentifier(spaceDesc)) {
                     if (! acceptIdentifier(spaceDesc)) {
                         expected ("space identifier");
                         expected ("space identifier");
-                        return;
+                        return false;
                     }
                     }
                 }
                 }
                 // RIGHT_PAREN
                 // RIGHT_PAREN
@@ -3378,12 +3379,15 @@ void HlslGrammar::acceptPostDecls(TQualifier& qualifier)
                 // semantic, in idToken.string
                 // semantic, in idToken.string
                 parseContext.handleSemantic(idToken.loc, qualifier, *idToken.string);
                 parseContext.handleSemantic(idToken.loc, qualifier, *idToken.string);
             }
             }
-        } else if (peekTokenClass(EHTokLeftAngle))
+        } else if (peekTokenClass(EHTokLeftAngle)) {
+            found = true;
             acceptAnnotations(qualifier);
             acceptAnnotations(qualifier);
-        else
+        } else
             break;
             break;
 
 
     } while (true);
     } while (true);
+
+    return found;
 }
 }
 
 
 } // end namespace glslang
 } // end namespace glslang

+ 1 - 1
3rdparty/glslang/hlsl/hlslGrammar.h

@@ -114,7 +114,7 @@ namespace glslang {
         bool acceptCaseLabel(TIntermNode*&);
         bool acceptCaseLabel(TIntermNode*&);
         bool acceptDefaultLabel(TIntermNode*&);
         bool acceptDefaultLabel(TIntermNode*&);
         void acceptArraySpecifier(TArraySizes*&);
         void acceptArraySpecifier(TArraySizes*&);
-        void acceptPostDecls(TQualifier&);
+        bool acceptPostDecls(TQualifier&);
         bool acceptDefaultParameterDeclaration(const TType&, TIntermTyped*&);
         bool acceptDefaultParameterDeclaration(const TType&, TIntermTyped*&);
 
 
         HlslParseContext& parseContext;  // state of parsing and helper functions for building the intermediate
         HlslParseContext& parseContext;  // state of parsing and helper functions for building the intermediate

+ 252 - 20
3rdparty/glslang/hlsl/hlslParseHelper.cpp

@@ -691,6 +691,22 @@ TIntermTyped* HlslParseContext::handleBracketOperator(const TSourceLoc& loc, TIn
         }
         }
     }
     }
 
 
+    // Handle operator[] on structured buffers: this indexes into the array element of the buffer.
+    // indexStructBufferContent returns nullptr if it isn't a structuredbuffer (SSBO).
+    TIntermTyped* sbArray = indexStructBufferContent(loc, base);
+    if (sbArray != nullptr) {
+        if (sbArray == nullptr)
+            return nullptr;
+
+        // Now we'll apply the [] index to that array
+        const TOperator idxOp = (index->getQualifier().storage == EvqConst) ? EOpIndexDirect : EOpIndexIndirect;
+
+        TIntermTyped* element = intermediate.addIndex(idxOp, sbArray, index, loc);
+        const TType derefType(sbArray->getType(), 0);
+        element->setType(derefType);
+        return element;
+    }
+
     return nullptr;
     return nullptr;
 }
 }
 
 
@@ -866,9 +882,7 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt
             const int vecSize = sampler.isShadow() ? 1 : 4; // TODO: handle arbitrary sample return sizes
             const int vecSize = sampler.isShadow() ? 1 : 4; // TODO: handle arbitrary sample return sizes
             return intermediate.addMethod(base, TType(sampler.type, EvqTemporary, vecSize), &field, loc);
             return intermediate.addMethod(base, TType(sampler.type, EvqTemporary, vecSize), &field, loc);
         }
         }
-    } else if (isStructBufferMethod(field) && 
-               base->getType().isRuntimeSizedArray() &&
-               (base->getQualifier().storage == EvqUniform || base->getQualifier().storage == EvqBuffer)) {
+    } else if (isStructBufferType(base->getType())) {
         TType retType(base->getType(), 0);
         TType retType(base->getType(), 0);
         return intermediate.addMethod(base, retType, &field, loc);
         return intermediate.addMethod(base, retType, &field, loc);
     } else if (field == "Append" ||
     } else if (field == "Append" ||
@@ -1919,9 +1933,11 @@ void HlslParseContext::remapNonEntryPointIO(TFunction& function)
     if (function.getType().getBasicType() != EbtVoid)
     if (function.getType().getBasicType() != EbtVoid)
         clearUniformInputOutput(function.getWritableType().getQualifier());
         clearUniformInputOutput(function.getWritableType().getQualifier());
 
 
-    // parameters
+    // parameters.
+    // References to structuredbuffer types are left unmodified
     for (int i = 0; i < function.getParamCount(); i++)
     for (int i = 0; i < function.getParamCount(); i++)
-        clearUniformInputOutput(function[i].type->getQualifier());
+        if (!isReference(*function[i].type))
+            clearUniformInputOutput(function[i].type->getQualifier());
 }
 }
 
 
 // Handle function returns, including type conversions to the function return type
 // Handle function returns, including type conversions to the function return type
@@ -2284,12 +2300,16 @@ void HlslParseContext::decomposeStructBufferMethods(const TSourceLoc& loc, TInte
 
 
     const TOperator op  = node->getAsOperator()->getOp();
     const TOperator op  = node->getAsOperator()->getOp();
     TIntermAggregate* argAggregate = arguments ? arguments->getAsAggregate() : nullptr;
     TIntermAggregate* argAggregate = arguments ? arguments->getAsAggregate() : nullptr;
+    if (argAggregate == nullptr)
+        return;
 
 
-    TIntermTyped* argArray = argAggregate ? argAggregate->getSequence()[0]->getAsTyped() : nullptr;  // array
+    // Buffer is the object upon which method is called, so always arg 0
+    TIntermTyped* bufferObj = argAggregate->getSequence()[0]->getAsTyped();
 
 
-    // Bail out if not a block method
-    if (argArray == nullptr || !argArray->getType().isRuntimeSizedArray())
-        return;
+    // Index to obtain the runtime sized array out of the buffer.
+    TIntermTyped* argArray = indexStructBufferContent(loc, bufferObj);
+    if (argArray == nullptr)
+        return;  // It might not be a struct buffer method.
 
 
     switch (op) {
     switch (op) {
     case EOpMethodLoad:
     case EOpMethodLoad:
@@ -2432,7 +2452,7 @@ void HlslParseContext::decomposeStructBufferMethods(const TSourceLoc& loc, TInte
 
 
     case EOpMethodGetDimensions:
     case EOpMethodGetDimensions:
         {
         {
-            const int numArgs = argAggregate->getSequence().size();
+            const int numArgs = (int)argAggregate->getSequence().size();
             TIntermTyped* argNumItems = argAggregate->getSequence()[1]->getAsTyped();  // out num items
             TIntermTyped* argNumItems = argAggregate->getSequence()[1]->getAsTyped();  // out num items
             TIntermTyped* argStride   = numArgs > 2 ? argAggregate->getSequence()[2]->getAsTyped() : nullptr;  // out stride
             TIntermTyped* argStride   = numArgs > 2 ? argAggregate->getSequence()[2]->getAsTyped() : nullptr;  // out stride
 
 
@@ -3564,10 +3584,107 @@ void HlslParseContext::decomposeIntrinsic(const TSourceLoc& loc, TIntermTyped*&
         }
         }
 
 
     case EOpF16tof32:
     case EOpF16tof32:
+        {
+            // input uvecN with low 16 bits of each component holding a float16.  convert to float32.
+            TIntermTyped* argValue = node->getAsUnaryNode()->getOperand();
+            TIntermTyped* zero = intermediate.addConstantUnion(0, loc, true);
+            const int vecSize = argValue->getType().getVectorSize();
+
+            TOperator constructOp = EOpNull;
+            switch (vecSize) {
+            case 1: constructOp = EOpNull;          break; // direct use, no construct needed
+            case 2: constructOp = EOpConstructVec2; break;
+            case 3: constructOp = EOpConstructVec3; break;
+            case 4: constructOp = EOpConstructVec4; break;
+            default: assert(0); break;
+            }
+
+            // For scalar case, we don't need to construct another type.
+            TIntermAggregate* result = (vecSize > 1) ? new TIntermAggregate(constructOp) : nullptr;
+
+            if (result) {
+                result->setType(TType(EbtFloat, EvqTemporary, vecSize));
+                result->setLoc(loc);
+            }
+
+            for (int idx = 0; idx < vecSize; ++idx) {
+                TIntermTyped* idxConst = intermediate.addConstantUnion(idx, loc, true);
+                TIntermTyped* component = argValue->getType().isVector() ? 
+                    intermediate.addIndex(EOpIndexDirect, argValue, idxConst, loc) : argValue;
+
+                if (component != argValue)
+                    component->setType(TType(argValue->getBasicType(), EvqTemporary));
+
+                TIntermTyped* unpackOp  = new TIntermUnary(EOpUnpackHalf2x16);
+                unpackOp->setType(TType(EbtFloat, EvqTemporary, 2));
+                unpackOp->getAsUnaryNode()->setOperand(component);
+                unpackOp->setLoc(loc);
+
+                TIntermTyped* lowOrder  = intermediate.addIndex(EOpIndexDirect, unpackOp, zero, loc);
+                
+                if (result != nullptr) {
+                    result->getSequence().push_back(lowOrder);
+                    node = result;
+                } else {
+                    node = lowOrder;
+                }
+            }
+            
+            break;
+        }
+
     case EOpF32tof16:
     case EOpF32tof16:
         {
         {
-            // Temporary until decomposition is available.
-            error(loc, "unimplemented intrinsic: handle natively", "f32tof16", "");
+            // input floatN converted to 16 bit float in low order bits of each component of uintN
+            TIntermTyped* argValue = node->getAsUnaryNode()->getOperand();
+
+            TIntermTyped* zero = intermediate.addConstantUnion(0.0, EbtFloat, loc, true);
+            const int vecSize = argValue->getType().getVectorSize();
+
+            TOperator constructOp = EOpNull;
+            switch (vecSize) {
+            case 1: constructOp = EOpNull;           break; // direct use, no construct needed
+            case 2: constructOp = EOpConstructUVec2; break;
+            case 3: constructOp = EOpConstructUVec3; break;
+            case 4: constructOp = EOpConstructUVec4; break;
+            default: assert(0); break;
+            }
+
+            // For scalar case, we don't need to construct another type.
+            TIntermAggregate* result = (vecSize > 1) ? new TIntermAggregate(constructOp) : nullptr;
+
+            if (result) {
+                result->setType(TType(EbtUint, EvqTemporary, vecSize));
+                result->setLoc(loc);
+            }
+
+            for (int idx = 0; idx < vecSize; ++idx) {
+                TIntermTyped* idxConst = intermediate.addConstantUnion(idx, loc, true);
+                TIntermTyped* component = argValue->getType().isVector() ? 
+                    intermediate.addIndex(EOpIndexDirect, argValue, idxConst, loc) : argValue;
+
+                if (component != argValue)
+                    component->setType(TType(argValue->getBasicType(), EvqTemporary));
+
+                TIntermAggregate* vec2ComponentAndZero = new TIntermAggregate(EOpConstructVec2);
+                vec2ComponentAndZero->getSequence().push_back(component);
+                vec2ComponentAndZero->getSequence().push_back(zero);
+                vec2ComponentAndZero->setType(TType(EbtFloat, EvqTemporary, 2));
+                vec2ComponentAndZero->setLoc(loc);
+                
+                TIntermTyped* packOp = new TIntermUnary(EOpPackHalf2x16);
+                packOp->getAsUnaryNode()->setOperand(vec2ComponentAndZero);
+                packOp->setLoc(loc);
+                packOp->setType(TType(EbtUint, EvqTemporary));
+
+                if (result != nullptr) {
+                    result->getSequence().push_back(packOp);
+                    node = result;
+                } else {
+                    node = packOp;
+                }
+            }
+
             break;
             break;
         }
         }
 
 
@@ -3637,13 +3754,13 @@ TIntermTyped* HlslParseContext::handleFunctionCall(const TSourceLoc& loc, TFunct
         // Find it in the symbol table.
         // Find it in the symbol table.
         //
         //
         const TFunction* fnCandidate = nullptr;
         const TFunction* fnCandidate = nullptr;
-        bool builtIn;
+        bool builtIn = false;
 
 
         // TODO: this needs improvement: there's no way at present to look up a signature in
         // TODO: this needs improvement: there's no way at present to look up a signature in
         // the symbol table for an arbitrary type.  This is a temporary hack until that ability exists.
         // the symbol table for an arbitrary type.  This is a temporary hack until that ability exists.
         // It will have false positives, since it doesn't check arg counts or types.
         // It will have false positives, since it doesn't check arg counts or types.
         if (arguments && arguments->getAsAggregate()) {
         if (arguments && arguments->getAsAggregate()) {
-            if (arguments->getAsAggregate()->getSequence()[0]->getAsTyped()->getType().isRuntimeSizedArray()) {
+            if (isStructBufferType(arguments->getAsAggregate()->getSequence()[0]->getAsTyped()->getType())) {
                 if (isStructBufferMethod(function->getName())) {
                 if (isStructBufferMethod(function->getName())) {
                     const TString mangle = function->getName() + "(";
                     const TString mangle = function->getName() + "(";
                     TSymbol* symbol = symbolTable.find(mangle, &builtIn);
                     TSymbol* symbol = symbolTable.find(mangle, &builtIn);
@@ -5033,6 +5150,101 @@ void HlslParseContext::redeclareBuiltinBlock(const TSourceLoc& loc, TTypeList& n
     trackLinkage(*block);
     trackLinkage(*block);
 }
 }
 
 
+//
+// Generate index to the array element in a structure buffer (SSBO)
+//
+TIntermTyped* HlslParseContext::indexStructBufferContent(const TSourceLoc& loc, TIntermTyped* buffer) const
+{
+    // Bail out if not a struct buffer
+    if (buffer == nullptr || ! isStructBufferType(buffer->getType()))
+        return nullptr;
+
+    // Runtime sized array is always the last element.
+    const TTypeList* bufferStruct = buffer->getType().getStruct();
+    TIntermTyped* arrayPosition = intermediate.addConstantUnion(unsigned(bufferStruct->size()-1), loc);
+
+    TIntermTyped* argArray = intermediate.addIndex(EOpIndexDirectStruct, buffer, arrayPosition, loc);
+    argArray->setType(*(*bufferStruct)[bufferStruct->size()-1].type);
+
+    return argArray;
+}
+
+//
+// IFF type is a structuredbuffer/byteaddressbuffer type, return the content
+// (template) type.   E.g, StructuredBuffer<MyType> -> MyType.  Else return nullptr.
+//
+TType* HlslParseContext::getStructBufferContentType(const TType& type) const
+{
+    if (type.getBasicType() != EbtBlock)
+        return nullptr;
+
+    const int memberCount = (int)type.getStruct()->size();
+    assert(memberCount > 0);
+
+    TType* contentType = (*type.getStruct())[memberCount-1].type;
+
+    return contentType->isRuntimeSizedArray() ? contentType : nullptr;
+}
+
+//
+// If an existing struct buffer has a sharable type, then share it.
+//
+void HlslParseContext::shareStructBufferType(TType& type)
+{
+    // PackOffset must be equivalent to share types on a per-member basis.
+    // Note: cannot use auto type due to recursion.  Thus, this is a std::function.
+    const std::function<bool(TType& lhs, TType& rhs)>
+    compareQualifiers = [&](TType& lhs, TType& rhs) -> bool {
+        if (lhs.getQualifier().layoutOffset != rhs.getQualifier().layoutOffset)
+            return false;
+
+        if (lhs.isStruct() != rhs.isStruct())
+            return false;
+
+        if (lhs.isStruct() && rhs.isStruct()) {
+            if (lhs.getStruct()->size() != rhs.getStruct()->size())
+                return false;
+
+            for (int i = 0; i < int(lhs.getStruct()->size()); ++i)
+                if (!compareQualifiers(*(*lhs.getStruct())[i].type, *(*rhs.getStruct())[i].type))
+                    return false;
+        }
+
+        return true;
+    };
+
+    // We need to compare certain qualifiers in addition to the type.
+    const auto typeEqual = [compareQualifiers](TType& lhs, TType& rhs) -> bool {
+        if (lhs.getQualifier().readonly != rhs.getQualifier().readonly)
+            return false;
+
+        // If both are structures, recursively look for packOffset equality
+        // as well as type equality.
+        return compareQualifiers(lhs, rhs) && lhs == rhs;
+    };
+
+    // TString typeName;
+    // type.appendMangledName(typeName);
+    // type.setTypeName(typeName);
+
+    // This is an exhaustive O(N) search, but real world shaders have
+    // only a small number of these.
+    for (int idx = 0; idx < int(structBufferTypes.size()); ++idx) {
+        // If the deep structure matches, modulo qualifiers, use it
+        if (typeEqual(*structBufferTypes[idx], type)) {
+            type.shallowCopy(*structBufferTypes[idx]);
+            return;
+        }
+    }
+
+    // Otherwise, remember it:
+    TType* typeCopy = new TType;
+    typeCopy->shallowCopy(type);
+    structBufferTypes.push_back(typeCopy);
+
+    // structBuffTypes.push_back(type.getWritableStruct());
+}
+
 void HlslParseContext::paramFix(TType& type)
 void HlslParseContext::paramFix(TType& type)
 {
 {
     switch (type.getQualifier().storage) {
     switch (type.getQualifier().storage) {
@@ -5043,6 +5255,18 @@ void HlslParseContext::paramFix(TType& type)
     case EvqTemporary:
     case EvqTemporary:
         type.getQualifier().storage = EvqIn;
         type.getQualifier().storage = EvqIn;
         break;
         break;
+    case EvqBuffer:
+        {
+            // SSBO parameter.  These do not go through the declareBlock path since they are fn parameters.
+            correctUniform(type.getQualifier());
+            TQualifier bufferQualifier = globalBufferDefaults;
+            mergeObjectLayoutQualifiers(bufferQualifier, type.getQualifier(), true);
+            bufferQualifier.storage = type.getQualifier().storage;
+            bufferQualifier.readonly = type.getQualifier().readonly;
+            bufferQualifier.coherent = type.getQualifier().coherent;
+            type.getQualifier() = bufferQualifier;
+            break;
+        }
     default:
     default:
         break;
         break;
     }
     }
@@ -5874,6 +6098,19 @@ void HlslParseContext::declareStruct(const TSourceLoc& loc, TString& structName,
     ioTypeMap[type.getStruct()] = newLists;
     ioTypeMap[type.getStruct()] = newLists;
 }
 }
 
 
+// Lookup a user-type by name.
+// If found, fill in the type and return the defining symbol.
+// If not found, return nullptr.
+TSymbol* HlslParseContext::lookupUserType(const TString& typeName, TType& type)
+{
+    TSymbol* symbol = symbolTable.find(typeName);
+    if (symbol && symbol->getAsVariable() && symbol->getAsVariable()->isUserType()) {
+        type.shallowCopy(symbol->getType());
+        return symbol;
+    } else
+        return nullptr;
+}
+
 //
 //
 // Do everything necessary to handle a variable (non-block) declaration.
 // Do everything necessary to handle a variable (non-block) declaration.
 // Either redeclaring a variable, or making a new one, updating the symbol
 // Either redeclaring a variable, or making a new one, updating the symbol
@@ -5914,6 +6151,7 @@ TIntermNode* HlslParseContext::declareVariable(const TSourceLoc& loc, TString& i
             if (it != ioTypeMap.end())
             if (it != ioTypeMap.end())
                 type.setStruct(it->second.uniform);
                 type.setStruct(it->second.uniform);
         }
         }
+
         break;
         break;
     default:
     default:
         break;
         break;
@@ -6551,8 +6789,6 @@ void HlslParseContext::declareBlock(const TSourceLoc& loc, TType& type, const TS
                 error(memberLoc, "member cannot contradict block (or what block inherited from global)", "xfb_buffer", "");
                 error(memberLoc, "member cannot contradict block (or what block inherited from global)", "xfb_buffer", "");
         }
         }
 
 
-        if (memberQualifier.hasPacking())
-            error(memberLoc, "member of block cannot have a packing layout qualifier", typeList[member].type->getFieldName().c_str(), "");
         if (memberQualifier.hasLocation()) {
         if (memberQualifier.hasLocation()) {
             switch (type.getQualifier().storage) {
             switch (type.getQualifier().storage) {
             case EvqVaryingIn:
             case EvqVaryingIn:
@@ -6564,10 +6800,6 @@ void HlslParseContext::declareBlock(const TSourceLoc& loc, TType& type, const TS
             }
             }
         } else
         } else
             memberWithoutLocation = true;
             memberWithoutLocation = true;
-        if (memberQualifier.hasAlign()) {
-            if (defaultQualification.layoutPacking != ElpStd140 && defaultQualification.layoutPacking != ElpStd430)
-                error(memberLoc, "can only be used with std140 or std430 layout packing", "align", "");
-        }
 
 
         TQualifier newMemberQualification = defaultQualification;
         TQualifier newMemberQualification = defaultQualification;
         mergeQualifiers(newMemberQualification, memberQualifier);
         mergeQualifiers(newMemberQualification, memberQualifier);

+ 15 - 0
3rdparty/glslang/hlsl/hlslParseHelper.h

@@ -133,6 +133,7 @@ public:
     const TFunction* findFunction(const TSourceLoc& loc, TFunction& call, bool& builtIn, TIntermTyped*& args);
     const TFunction* findFunction(const TSourceLoc& loc, TFunction& call, bool& builtIn, TIntermTyped*& args);
     void declareTypedef(const TSourceLoc&, TString& identifier, const TType&);
     void declareTypedef(const TSourceLoc&, TString& identifier, const TType&);
     void declareStruct(const TSourceLoc&, TString& structName, TType&);
     void declareStruct(const TSourceLoc&, TString& structName, TType&);
+    TSymbol* lookupUserType(const TString&, TType&);
     TIntermNode* declareVariable(const TSourceLoc&, TString& identifier, TType&, TIntermTyped* initializer = 0);
     TIntermNode* declareVariable(const TSourceLoc&, TString& identifier, TType&, TIntermTyped* initializer = 0);
     void lengthenList(const TSourceLoc&, TIntermSequence& list, int size);
     void lengthenList(const TSourceLoc&, TIntermSequence& list, int size);
     TIntermTyped* addConstructor(const TSourceLoc&, TIntermNode*, const TType&);
     TIntermTyped* addConstructor(const TSourceLoc&, TIntermNode*, const TType&);
@@ -180,6 +181,9 @@ public:
     void initFlattening() { flattenLevel.push_back(0); flattenOffset.push_back(0); }
     void initFlattening() { flattenLevel.push_back(0); flattenOffset.push_back(0); }
     void finalizeFlattening() { flattenLevel.pop_back(); flattenOffset.pop_back(); }
     void finalizeFlattening() { flattenLevel.pop_back(); flattenOffset.pop_back(); }
 
 
+    // Share struct buffer deep types
+    void shareStructBufferType(TType&);
+
 protected:
 protected:
     struct TFlattenData {
     struct TFlattenData {
         TFlattenData() : nextBinding(TQualifier::layoutBindingEnd) { }
         TFlattenData() : nextBinding(TQualifier::layoutBindingEnd) { }
@@ -248,6 +252,14 @@ protected:
     bool isSamplerMethod(const TString& name) const;
     bool isSamplerMethod(const TString& name) const;
     bool isStructBufferMethod(const TString& name) const;
     bool isStructBufferMethod(const TString& name) const;
 
 
+    TType* getStructBufferContentType(const TType& type) const;
+    bool isStructBufferType(const TType& type) const { return getStructBufferContentType(type) != nullptr; }
+    TIntermTyped* indexStructBufferContent(const TSourceLoc& loc, TIntermTyped* buffer) const;
+
+    // Return true if this type is a reference.  This is not currently a type method in case that's
+    // a language specific answer.
+    bool isReference(const TType& type) const { return isStructBufferType(type); }
+
     // Pass through to base class after remembering builtin mappings.
     // Pass through to base class after remembering builtin mappings.
     using TParseContextBase::trackLinkage;
     using TParseContextBase::trackLinkage;
     void trackLinkage(TSymbol& variable) override;
     void trackLinkage(TSymbol& variable) override;
@@ -330,6 +342,9 @@ protected:
     // Structure splitting data:
     // Structure splitting data:
     TMap<int, TVariable*>              splitIoVars;  // variables with the builtin interstage IO removed, indexed by unique ID.
     TMap<int, TVariable*>              splitIoVars;  // variables with the builtin interstage IO removed, indexed by unique ID.
 
 
+    // Structuredbuffer shared types.  Typically there are only a few.
+    TVector<TType*> structBufferTypes;
+
     // The builtin interstage IO map considers e.g, EvqPosition on input and output separately, so that we
     // The builtin interstage IO map considers e.g, EvqPosition on input and output separately, so that we
     // can build the linkage correctly if position appears on both sides.  Otherwise, multiple positions
     // can build the linkage correctly if position appears on both sides.  Otherwise, multiple positions
     // are considered identical.
     // are considered identical.

+ 2 - 1
3rdparty/glslang/hlsl/hlslScanContext.cpp

@@ -327,6 +327,7 @@ void HlslScanContext::fillInKeywordMap()
     (*KeywordMap)["RWStructuredBuffer"] =      EHTokRWStructuredBuffer;
     (*KeywordMap)["RWStructuredBuffer"] =      EHTokRWStructuredBuffer;
     (*KeywordMap)["StructuredBuffer"] =        EHTokStructuredBuffer;
     (*KeywordMap)["StructuredBuffer"] =        EHTokStructuredBuffer;
 
 
+    (*KeywordMap)["class"] =                   EHTokClass;
     (*KeywordMap)["struct"] =                  EHTokStruct;
     (*KeywordMap)["struct"] =                  EHTokStruct;
     (*KeywordMap)["cbuffer"] =                 EHTokCBuffer;
     (*KeywordMap)["cbuffer"] =                 EHTokCBuffer;
     (*KeywordMap)["tbuffer"] =                 EHTokTBuffer;
     (*KeywordMap)["tbuffer"] =                 EHTokTBuffer;
@@ -354,7 +355,6 @@ void HlslScanContext::fillInKeywordMap()
     ReservedSet->insert("auto");
     ReservedSet->insert("auto");
     ReservedSet->insert("catch");
     ReservedSet->insert("catch");
     ReservedSet->insert("char");
     ReservedSet->insert("char");
-    ReservedSet->insert("class");
     ReservedSet->insert("const_cast");
     ReservedSet->insert("const_cast");
     ReservedSet->insert("enum");
     ReservedSet->insert("enum");
     ReservedSet->insert("explicit");
     ReservedSet->insert("explicit");
@@ -740,6 +740,7 @@ EHlslTokenClass HlslScanContext::tokenizeIdentifier()
         return keyword;
         return keyword;
 
 
     // variable, user type, ...
     // variable, user type, ...
+    case EHTokClass:
     case EHTokStruct:
     case EHTokStruct:
     case EHTokTypedef:
     case EHTokTypedef:
     case EHTokCBuffer:
     case EHTokCBuffer:

+ 1 - 0
3rdparty/glslang/hlsl/hlslTokens.h

@@ -268,6 +268,7 @@ enum EHlslTokenClass {
     // variable, user type, ...
     // variable, user type, ...
     EHTokIdentifier,
     EHTokIdentifier,
     EHTokTypeName,
     EHTokTypeName,
+    EHTokClass,
     EHTokStruct,
     EHTokStruct,
     EHTokCBuffer,
     EHTokCBuffer,
     EHTokTBuffer,
     EHTokTBuffer,

Some files were not shown because too many files changed in this diff