Przeglądaj źródła

Updated glslang.

Branimir Karadžić 8 lat temu
rodzic
commit
bdea8d2ce6
53 zmienionych plików z 1765 dodań i 1346 usunięć
  1. 0 4
      3rdparty/glslang/.gitignore
  2. 5 0
      3rdparty/glslang/CMakeLists.txt
  3. 6 3
      3rdparty/glslang/OGLCompilersDLL/CMakeLists.txt
  4. 9 5
      3rdparty/glslang/SPIRV/CMakeLists.txt
  5. 2 1
      3rdparty/glslang/SPIRV/GLSL.ext.KHR.h
  6. 27 5
      3rdparty/glslang/SPIRV/GlslangToSpv.cpp
  7. 5 4
      3rdparty/glslang/SPIRV/SpvBuilder.cpp
  8. 3 2
      3rdparty/glslang/SPIRV/SpvBuilder.h
  9. 5 1
      3rdparty/glslang/SPIRV/doc.cpp
  10. 4 2
      3rdparty/glslang/SPIRV/spirv.hpp
  11. 8 5
      3rdparty/glslang/StandAlone/CMakeLists.txt
  12. 5 0
      3rdparty/glslang/Test/300.vert
  13. 16 10
      3rdparty/glslang/Test/baseResults/300.vert.out
  14. 1 1
      3rdparty/glslang/Test/baseResults/hlsl.attribute.frag.out
  15. 1 1
      3rdparty/glslang/Test/baseResults/hlsl.if.frag.out
  16. 297 279
      3rdparty/glslang/Test/baseResults/hlsl.intrinsics.comp.out
  17. 495 467
      3rdparty/glslang/Test/baseResults/hlsl.intrinsics.frag.out
  18. 469 429
      3rdparty/glslang/Test/baseResults/hlsl.intrinsics.vert.out
  19. 1 1
      3rdparty/glslang/Test/baseResults/hlsl.switch.frag.out
  20. 43 0
      3rdparty/glslang/Test/baseResults/spv.arbPostDepthCoverage.frag.out
  21. 7 0
      3rdparty/glslang/Test/baseResults/spv.arbPostDepthCoverage_Error.frag.out
  22. 23 0
      3rdparty/glslang/Test/baseResults/spv.extPostDepthCoverage.frag.out
  23. 4 0
      3rdparty/glslang/Test/baseResults/spv.extPostDepthCoverage_Error.frag.out
  24. 15 14
      3rdparty/glslang/Test/baseResults/spv.texture.sampler.transform.frag.out
  25. 1 1
      3rdparty/glslang/Test/hlsl.switch.frag
  26. 7 0
      3rdparty/glslang/Test/runtests
  27. 2 0
      3rdparty/glslang/Test/spv.OVR_multiview.vert
  28. 13 0
      3rdparty/glslang/Test/spv.arbPostDepthCoverage.frag
  29. 12 0
      3rdparty/glslang/Test/spv.arbPostDepthCoverage_Error.frag
  30. 9 0
      3rdparty/glslang/Test/spv.extPostDepthCoverage.frag
  31. 9 0
      3rdparty/glslang/Test/spv.extPostDepthCoverage_Error.frag
  32. 1 1
      3rdparty/glslang/Test/vulkan.frag
  33. 12 7
      3rdparty/glslang/glslang/CMakeLists.txt
  34. 8 0
      3rdparty/glslang/glslang/Include/Types.h
  35. 30 4
      3rdparty/glslang/glslang/Include/intermediate.h
  36. 13 13
      3rdparty/glslang/glslang/MachineIndependent/Intermediate.cpp
  37. 23 0
      3rdparty/glslang/glslang/MachineIndependent/ParseHelper.cpp
  38. 5 1
      3rdparty/glslang/glslang/MachineIndependent/Versions.cpp
  39. 7 0
      3rdparty/glslang/glslang/MachineIndependent/Versions.h
  40. 2 0
      3rdparty/glslang/glslang/MachineIndependent/intermOut.cpp
  41. 8 2
      3rdparty/glslang/glslang/MachineIndependent/iomapper.cpp
  42. 8 0
      3rdparty/glslang/glslang/MachineIndependent/linkValidate.cpp
  43. 7 4
      3rdparty/glslang/glslang/MachineIndependent/localintermediate.h
  44. 6 3
      3rdparty/glslang/glslang/OSDependent/Unix/CMakeLists.txt
  45. 6 3
      3rdparty/glslang/glslang/OSDependent/Windows/CMakeLists.txt
  46. 9 3
      3rdparty/glslang/glslang/Public/ShaderLang.h
  47. 4 2
      3rdparty/glslang/gtests/CMakeLists.txt
  48. 4 0
      3rdparty/glslang/gtests/Spv.FromFile.cpp
  49. 6 3
      3rdparty/glslang/hlsl/CMakeLists.txt
  50. 11 23
      3rdparty/glslang/hlsl/hlslGrammar.cpp
  51. 2 2
      3rdparty/glslang/hlsl/hlslGrammar.h
  52. 84 33
      3rdparty/glslang/hlsl/hlslParseHelper.cpp
  53. 5 7
      3rdparty/glslang/hlsl/hlslParseHelper.h

+ 0 - 4
3rdparty/glslang/.gitignore

@@ -6,8 +6,4 @@ tags
 TAGS
 build/
 Test/localResults/
-Test/multiThread.out
-Test/singleThread.out
-Test/vert.spv
-Test/frag.spv
 External/googletest

+ 5 - 0
3rdparty/glslang/CMakeLists.txt

@@ -6,6 +6,11 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON)
 # Adhere to GNU filesystem layout conventions
 include(GNUInstallDirs)
 
+option(SKIP_GLSLANG_INSTALL "Skip installation" ${SKIP_GLSLANG_INSTALL})
+if(NOT ${SKIP_GLSLANG_INSTALL})
+  set(ENABLE_GLSLANG_INSTALL ON)
+endif()
+
 option(ENABLE_AMD_EXTENSIONS "Enables support of AMD-specific extensions" ON)
 option(ENABLE_GLSLANG_BINARIES "Builds glslangValidator and spirv-remap" ON)
 

+ 6 - 3
3rdparty/glslang/OGLCompilersDLL/CMakeLists.txt

@@ -1,11 +1,14 @@
 set(SOURCES InitializeDll.cpp InitializeDll.h)
 
 add_library(OGLCompiler STATIC ${SOURCES})
-set_property(TARGET OGLCompiler PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET OGLCompiler PROPERTY FOLDER glslang)
+set_property(TARGET OGLCompiler PROPERTY POSITION_INDEPENDENT_CODE ON)
 
 if(WIN32)
     source_group("Source" FILES ${SOURCES})
 endif(WIN32)
 
-install(TARGETS OGLCompiler
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    install(TARGETS OGLCompiler
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+endif(ENABLE_GLSLANG_INSTALL)

+ 9 - 5
3rdparty/glslang/SPIRV/CMakeLists.txt

@@ -40,18 +40,22 @@ if(ENABLE_NV_EXTENSIONS)
 endif(ENABLE_NV_EXTENSIONS)
 
 add_library(SPIRV STATIC ${SOURCES} ${HEADERS})
-set_property(TARGET SPIRV PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET SPIRV PROPERTY FOLDER glslang)
+set_property(TARGET SPIRV PROPERTY POSITION_INDEPENDENT_CODE ON)
 target_link_libraries(SPIRV glslang)
 
 add_library(SPVRemapper STATIC ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
-set_property(TARGET SPVRemapper PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET SPVRemapper PROPERTY FOLDER glslang)
+set_property(TARGET SPVRemapper PROPERTY POSITION_INDEPENDENT_CODE ON)
 
 if(WIN32)
     source_group("Source" FILES ${SOURCES} ${HEADERS})
     source_group("Source" FILES ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
 endif(WIN32)
 
-install(TARGETS SPIRV SPVRemapper
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    install(TARGETS SPIRV SPVRemapper
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
 
-install(FILES ${HEADERS} ${SPVREMAP_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/SPIRV/)
+    install(FILES ${HEADERS} ${SPVREMAP_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/SPIRV/)
+endif(ENABLE_GLSLANG_INSTALL)

+ 2 - 1
3rdparty/glslang/SPIRV/GLSL.ext.KHR.h

@@ -32,7 +32,7 @@ enum Op;
 enum Capability;
 
 static const int GLSLextKHRVersion = 100;
-static const int GLSLextKHRRevision = 1;
+static const int GLSLextKHRRevision = 2;
 
 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";
@@ -41,5 +41,6 @@ static const char* const E_SPV_KHR_multiview                    = "SPV_KHR_multi
 static const char* const E_SPV_KHR_shader_draw_parameters       = "SPV_KHR_shader_draw_parameters";
 static const char* const E_SPV_KHR_16bit_storage                = "SPV_KHR_16bit_storage";
 static const char* const E_SPV_KHR_storage_buffer_storage_class = "SPV_KHR_storage_buffer_storage_class";
+static const char* const E_SPV_KHR_post_depth_coverage          = "SPV_KHR_post_depth_coverage";
 
 #endif  // #ifndef GLSLextKHR_H

+ 27 - 5
3rdparty/glslang/SPIRV/GlslangToSpv.cpp

@@ -122,6 +122,7 @@ protected:
     spv::Decoration TranslateAuxiliaryStorageDecoration(const glslang::TQualifier& qualifier);
     spv::BuiltIn TranslateBuiltInDecoration(glslang::TBuiltInVariable, bool memberDeclaration);
     spv::ImageFormat TranslateImageFormat(const glslang::TType& type);
+    spv::SelectionControlMask TranslateSelectionControl(glslang::TSelectionControl) const;
     spv::LoopControlMask TranslateLoopControl(glslang::TLoopControl) const;
     spv::StorageClass TranslateStorageClass(const glslang::TType&);
     spv::Id createSpvVariable(const glslang::TIntermSymbol*);
@@ -741,6 +742,16 @@ spv::ImageFormat TGlslangToSpvTraverser::TranslateImageFormat(const glslang::TTy
     }
 }
 
+spv::SelectionControlMask TGlslangToSpvTraverser::TranslateSelectionControl(glslang::TSelectionControl selectionControl) const
+{
+    switch (selectionControl) {
+    case glslang::ESelectionControlNone:        return spv::SelectionControlMaskNone;
+    case glslang::ESelectionControlFlatten:     return spv::SelectionControlFlattenMask;
+    case glslang::ESelectionControlDontFlatten: return spv::SelectionControlDontFlattenMask;
+    default:                                    return spv::SelectionControlMaskNone;
+    }
+}
+
 spv::LoopControlMask TGlslangToSpvTraverser::TranslateLoopControl(glslang::TLoopControl loopControl) const
 {
     switch (loopControl) {
@@ -980,6 +991,12 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(const glslang::TIntermediate* gls
         if (glslangIntermediate->getEarlyFragmentTests())
             builder.addExecutionMode(shaderEntry, spv::ExecutionModeEarlyFragmentTests);
 
+        if (glslangIntermediate->getPostDepthCoverage()) {
+            builder.addCapability(spv::CapabilitySampleMaskPostDepthCoverage);
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModePostDepthCoverage);
+            builder.addExtension(spv::E_SPV_KHR_post_depth_coverage);
+        }
+
         switch(glslangIntermediate->getDepth()) {
         case glslang::EldGreater:  mode = spv::ExecutionModeDepthGreater; break;
         case glslang::EldLess:     mode = spv::ExecutionModeDepthLess;    break;
@@ -1935,8 +1952,7 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang
         return false;
     }
 
-    // Instead, emit control flow...
-
+    // Instead, emit control flow...    
     // Don't handle results as temporaries, because there will be two names
     // and better to leave SSA to later passes.
     spv::Id result = (node->getBasicType() == glslang::EbtVoid)
@@ -1946,8 +1962,11 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang
     // emit the condition before doing anything with selection
     node->getCondition()->traverse(this);
 
+    // Selection control:
+    const spv::SelectionControlMask control = TranslateSelectionControl(node->getSelectionControl());
+
     // make an "if" based on the value created by the condition
-    spv::Builder::If ifBuilder(accessChainLoad(node->getCondition()->getType()), builder);
+    spv::Builder::If ifBuilder(accessChainLoad(node->getCondition()->getType()), control, builder);
 
     // emit the "then" statement
     if (node->getTrueBlock() != nullptr) {
@@ -1985,6 +2004,9 @@ bool TGlslangToSpvTraverser::visitSwitch(glslang::TVisit /* visit */, glslang::T
     node->getCondition()->traverse(this);
     spv::Id selector = accessChainLoad(node->getCondition()->getAsTyped()->getType());
 
+    // Selection control:
+    const spv::SelectionControlMask control = TranslateSelectionControl(node->getSelectionControl());
+
     // browse the children to sort out code segments
     int defaultSegment = -1;
     std::vector<TIntermNode*> codeSegments;
@@ -2010,7 +2032,7 @@ bool TGlslangToSpvTraverser::visitSwitch(glslang::TVisit /* visit */, glslang::T
 
     // make the switch statement
     std::vector<spv::Block*> segmentBlocks; // returned, as the blocks allocated in the call
-    builder.makeSwitch(selector, (int)codeSegments.size(), caseValues, valueIndexToSegment, defaultSegment, segmentBlocks);
+    builder.makeSwitch(selector, control, (int)codeSegments.size(), caseValues, valueIndexToSegment, defaultSegment, segmentBlocks);
 
     // emit all the code in the segments
     breakForLoop.push(false);
@@ -5701,7 +5723,7 @@ spv::Id TGlslangToSpvTraverser::createShortCircuit(glslang::TOperator op, glslan
         leftId = builder.createUnaryOp(spv::OpLogicalNot, boolTypeId, leftId);
 
     // make an "if" based on the left value
-    spv::Builder::If ifBuilder(leftId, builder);
+    spv::Builder::If ifBuilder(leftId, spv::SelectionControlMaskNone, builder);
 
     // emit right operand as the "then" part of the "if"
     builder.clearAccessChain();

+ 5 - 4
3rdparty/glslang/SPIRV/SpvBuilder.cpp

@@ -2009,9 +2009,10 @@ Id Builder::createMatrixConstructor(Decoration precision, const std::vector<Id>&
 }
 
 // Comments in header
-Builder::If::If(Id cond, Builder& gb) :
+Builder::If::If(Id cond, unsigned int ctrl, Builder& gb) :
     builder(gb),
     condition(cond),
+    control(ctrl),
     elseBlock(0)
 {
     function = &builder.getBuildPoint()->getParent();
@@ -2052,7 +2053,7 @@ void Builder::If::makeEndIf()
 
     // Go back to the headerBlock and make the flow control split
     builder.setBuildPoint(headerBlock);
-    builder.createSelectionMerge(mergeBlock, SelectionControlMaskNone);
+    builder.createSelectionMerge(mergeBlock, control);
     if (elseBlock)
         builder.createConditionalBranch(condition, thenBlock, elseBlock);
     else
@@ -2064,7 +2065,7 @@ void Builder::If::makeEndIf()
 }
 
 // Comments in header
-void Builder::makeSwitch(Id selector, int numSegments, const std::vector<int>& caseValues,
+void Builder::makeSwitch(Id selector, unsigned int control, int numSegments, const std::vector<int>& caseValues,
                          const std::vector<int>& valueIndexToSegment, int defaultSegment,
                          std::vector<Block*>& segmentBlocks)
 {
@@ -2077,7 +2078,7 @@ void Builder::makeSwitch(Id selector, int numSegments, const std::vector<int>& c
     Block* mergeBlock = new Block(getUniqueId(), function);
 
     // make and insert the switch's selection-merge instruction
-    createSelectionMerge(mergeBlock, SelectionControlMaskNone);
+    createSelectionMerge(mergeBlock, control);
 
     // make the switch instruction
     Instruction* switchInst = new Instruction(NoResult, NoType, OpSwitch);

+ 3 - 2
3rdparty/glslang/SPIRV/SpvBuilder.h

@@ -385,7 +385,7 @@ public:
     // Helper to use for building nested control flow with if-then-else.
     class If {
     public:
-        If(Id condition, Builder& builder);
+        If(Id condition, unsigned int ctrl, Builder& builder);
         ~If() {}
 
         void makeBeginElse();
@@ -397,6 +397,7 @@ public:
 
         Builder& builder;
         Id condition;
+        unsigned int control;
         Function* function;
         Block* headerBlock;
         Block* thenBlock;
@@ -416,7 +417,7 @@ public:
     // Returns the right set of basic blocks to start each code segment with, so that the caller's
     // recursion stack can hold the memory for it.
     //
-    void makeSwitch(Id condition, int numSegments, const std::vector<int>& caseValues,
+    void makeSwitch(Id condition, unsigned int control, int numSegments, const std::vector<int>& caseValues,
                     const std::vector<int>& valueToSegment, int defaultSegment, std::vector<Block*>& segmentBB); // return argument
 
     // Add a branch to the innermost switch's merge block.

+ 5 - 1
3rdparty/glslang/SPIRV/doc.cpp

@@ -175,6 +175,7 @@ const char* ExecutionModeString(int mode)
     case 31: return "ContractionOff";
     case 32: return "Bad";
 
+    case 4446:  return "PostDepthCoverage";
     case ExecutionModeCeiling:
     default: return "Bad";
     }
@@ -636,13 +637,15 @@ const char* SelectControlString(int cont)
     }
 }
 
-const int LoopControlCeiling = 2;
+const int LoopControlCeiling = 4;
 
 const char* LoopControlString(int cont)
 {
     switch (cont) {
     case 0:  return "Unroll";
     case 1:  return "DontUnroll";
+    case 2:  return "DependencyInfinite";
+    case 3:  return "DependencyLength";
 
     case LoopControlCeiling:
     default: return "Bad";
@@ -843,6 +846,7 @@ const char* CapabilityString(int info)
     case 5009: return "ImageGatherBiasLodAMD";
 #endif
 
+    case 4447: return "SampleMaskPostDepthCoverage";
 #ifdef NV_EXTENSIONS
     case 5251: return "GeometryShaderPassthroughNV";
     case 5254: return "ShaderViewportIndexLayerNV";

+ 4 - 2
3rdparty/glslang/SPIRV/spirv.hpp

@@ -47,11 +47,11 @@ namespace spv {
 typedef unsigned int Id;
 
 #define SPV_VERSION 0x10000
-#define SPV_REVISION 10
+#define SPV_REVISION 11
 
 static const unsigned int MagicNumber = 0x07230203;
 static const unsigned int Version = 0x00010000;
-static const unsigned int Revision = 10;
+static const unsigned int Revision = 11;
 static const unsigned int OpCodeMask = 0xffff;
 static const unsigned int WordCountShift = 16;
 
@@ -122,6 +122,7 @@ enum ExecutionMode {
     ExecutionModeOutputTriangleStrip = 29,
     ExecutionModeVecTypeHint = 30,
     ExecutionModeContractionOff = 31,
+    ExecutionModePostDepthCoverage = 4446,
     ExecutionModeMax = 0x7fffffff,
 };
 
@@ -628,6 +629,7 @@ enum Capability {
     CapabilityMultiView = 4439,
     CapabilityVariablePointersStorageBuffer = 4441,
     CapabilityVariablePointers = 4442,
+    CapabilitySampleMaskPostDepthCoverage = 4447,
     CapabilitySampleMaskOverrideCoverageNV = 5249,
     CapabilityGeometryShaderPassthroughNV = 5251,
     CapabilityShaderViewportIndexLayerNV = 5254,

+ 8 - 5
3rdparty/glslang/StandAlone/CMakeLists.txt

@@ -1,6 +1,7 @@
 add_library(glslang-default-resource-limits
             ${CMAKE_CURRENT_SOURCE_DIR}/ResourceLimits.cpp)
-set_property(TARGET glslang-default-resource-limits PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET glslang-default-resource-limits PROPERTY FOLDER glslang)
+set_property(TARGET glslang-default-resource-limits PROPERTY POSITION_INDEPENDENT_CODE ON)
 
 target_include_directories(glslang-default-resource-limits
                            PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
@@ -37,8 +38,10 @@ if(WIN32)
     source_group("Source" FILES ${SOURCES})
 endif(WIN32)
 
-install(TARGETS glslangValidator
-        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    install(TARGETS glslangValidator
+            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
 
-install(TARGETS spirv-remap
-        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+    install(TARGETS spirv-remap
+            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+endif(ENABLE_GLSLANG_INSTALL)

+ 5 - 0
3rdparty/glslang/Test/300.vert

@@ -186,6 +186,8 @@ void fooDeeparray()
     yp = x; // ERROR, wrong size
 }
 
+layout(num_views = 2) in; // ERROR, no extension
+
 void mwErr()
 {
     gl_ViewID_OVR;   // ERROR, no extension
@@ -193,6 +195,9 @@ void mwErr()
 
 #extension GL_OVR_multiview : enable
 
+layout(num_views = 2) uniform float mwUniform; // ERROR, must be global
+layout(num_views = 2) in; // OK
+
 void mwOk()
 {
     gl_ViewID_OVR;

+ 16 - 10
3rdparty/glslang/Test/baseResults/300.vert.out

@@ -43,10 +43,14 @@ ERROR: 0:172: 'std430' : requires the 'buffer' storage qualifier
 ERROR: 0:175: '' : array size required 
 ERROR: 0:185: 'assign' :  cannot convert from ' temp 4-element array of highp float' to ' temp 3-element array of highp float'
 ERROR: 0:186: 'assign' :  cannot convert from ' temp 3-element array of highp float' to ' temp 4-element array of highp float'
-ERROR: 0:191: 'gl_ViewID_OVR' : required extension not requested: Possible extensions include:
+ERROR: 0:189: 'num_views' : required extension not requested: Possible extensions include:
 GL_OVR_multiview
 GL_OVR_multiview2
-ERROR: 45 compilation errors.  No code generated.
+ERROR: 0:193: 'gl_ViewID_OVR' : required extension not requested: Possible extensions include:
+GL_OVR_multiview
+GL_OVR_multiview2
+ERROR: 0:198: 'num_views' : can only apply to a standalone qualifier 
+ERROR: 47 compilation errors.  No code generated.
 
 
 Shader version: 300
@@ -293,14 +297,14 @@ ERROR: node is still EOpNull!
 0:184        'y' ( temp 4-element array of highp float)
 0:185      'xp' ( temp 3-element array of highp float)
 0:186      'yp' ( temp 4-element array of highp float)
-0:189  Function Definition: mwErr( ( global void)
-0:189    Function Parameters: 
-0:191    Sequence
-0:191      'gl_ViewID_OVR' ( in highp uint ViewIndex)
-0:196  Function Definition: mwOk( ( global void)
-0:196    Function Parameters: 
-0:198    Sequence
-0:198      'gl_ViewID_OVR' ( in highp uint ViewIndex)
+0:191  Function Definition: mwErr( ( global void)
+0:191    Function Parameters: 
+0:193    Sequence
+0:193      'gl_ViewID_OVR' ( in highp uint ViewIndex)
+0:201  Function Definition: mwOk( ( global void)
+0:201    Function Parameters: 
+0:203    Sequence
+0:203      'gl_ViewID_OVR' ( in highp uint ViewIndex)
 0:?   Linker Objects
 0:?     'm43' ( uniform highp 4X3 matrix of float)
 0:?     'm33' ( uniform highp 3X3 matrix of float)
@@ -335,6 +339,7 @@ ERROR: node is still EOpNull!
 0:?     'Binst' (layout( column_major shared) uniform block{layout( column_major shared) uniform highp int a})
 0:?     'Bfoo' ( global highp int)
 0:?     'B430i' (layout( column_major std430) uniform block{layout( column_major std430 offset=0) uniform highp int a})
+0:?     'mwUniform' ( uniform highp float)
 0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
 
@@ -494,6 +499,7 @@ ERROR: node is still EOpNull!
 0:?     'Binst' (layout( column_major shared) uniform block{layout( column_major shared) uniform highp int a})
 0:?     'Bfoo' ( global highp int)
 0:?     'B430i' (layout( column_major std430) uniform block{layout( column_major std430 offset=0) uniform highp int a})
+0:?     'mwUniform' ( uniform highp float)
 0:?     'gl_VertexID' ( gl_VertexId highp int VertexId)
 0:?     'gl_InstanceID' ( gl_InstanceId highp int InstanceId)
 

+ 1 - 1
3rdparty/glslang/Test/baseResults/hlsl.attribute.frag.out

@@ -90,7 +90,7 @@ gl_FragCoord origin is upper left
 11(@PixelShaderFunction(vf4;):           2 Function None 9
        10(input):      8(ptr) FunctionParameter
               12:             Label
-                              SelectionMerge 16 None
+                              SelectionMerge 16 DontFlatten 
                               BranchConditional 14 15 16
               15:               Label
                                 Branch 16

+ 1 - 1
3rdparty/glslang/Test/baseResults/hlsl.if.frag.out

@@ -319,7 +319,7 @@ gl_FragCoord origin is upper left
               48:    7(fvec4) Load 10(input)
               49:   16(bvec4) FOrdEqual 47 48
               50:    15(bool) All 49
-                              SelectionMerge 52 None
+                              SelectionMerge 52 Flatten 
                               BranchConditional 50 51 52
               51:               Label
               53:    7(fvec4)   Load 10(input)

+ 297 - 279
3rdparty/glslang/Test/baseResults/hlsl.intrinsics.comp.out

@@ -11,7 +11,8 @@ local_size = (1, 1, 1)
 0:17      'inU1' ( in uint)
 0:?     Sequence
 0:21      all ( temp bool)
-0:21        'inF0' ( in float)
+0:21        Convert float to bool ( temp bool)
+0:21          'inF0' ( in float)
 0:24      AtomicAdd ( temp void)
 0:24        'gs_ua' ( shared uint)
 0:24        'gs_ub' ( shared uint)
@@ -92,7 +93,8 @@ local_size = (1, 1, 1)
 0:51      'inU1' ( in 2-component vector of uint)
 0:?     Sequence
 0:55      all ( temp bool)
-0:55        'inF0' ( in 2-component vector of float)
+0:55        Convert float to bool ( temp 2-component vector of bool)
+0:55          'inF0' ( in 2-component vector of float)
 0:58      AtomicAdd ( temp void)
 0:58        'gs_ua2' ( shared 2-component vector of uint)
 0:58        'gs_ub2' ( shared 2-component vector of uint)
@@ -165,7 +167,8 @@ local_size = (1, 1, 1)
 0:78      'inU1' ( in 3-component vector of uint)
 0:?     Sequence
 0:82      all ( temp bool)
-0:82        'inF0' ( in 3-component vector of float)
+0:82        Convert float to bool ( temp 3-component vector of bool)
+0:82          'inF0' ( in 3-component vector of float)
 0:85      AtomicAdd ( temp void)
 0:85        'gs_ua3' ( shared 3-component vector of uint)
 0:85        'gs_ub3' ( shared 3-component vector of uint)
@@ -239,7 +242,8 @@ local_size = (1, 1, 1)
 0:105      'inU1' ( in 4-component vector of uint)
 0:?     Sequence
 0:109      all ( temp bool)
-0:109        'inF0' ( in 4-component vector of float)
+0:109        Convert float to bool ( temp 4-component vector of bool)
+0:109          'inF0' ( in 4-component vector of float)
 0:112      AtomicAdd ( temp void)
 0:112        'gs_ua4' ( shared 4-component vector of uint)
 0:112        'gs_ub4' ( shared 4-component vector of uint)
@@ -367,7 +371,8 @@ local_size = (1, 1, 1)
 0:17      'inU1' ( in uint)
 0:?     Sequence
 0:21      all ( temp bool)
-0:21        'inF0' ( in float)
+0:21        Convert float to bool ( temp bool)
+0:21          'inF0' ( in float)
 0:24      AtomicAdd ( temp void)
 0:24        'gs_ua' ( shared uint)
 0:24        'gs_ub' ( shared uint)
@@ -448,7 +453,8 @@ local_size = (1, 1, 1)
 0:51      'inU1' ( in 2-component vector of uint)
 0:?     Sequence
 0:55      all ( temp bool)
-0:55        'inF0' ( in 2-component vector of float)
+0:55        Convert float to bool ( temp 2-component vector of bool)
+0:55          'inF0' ( in 2-component vector of float)
 0:58      AtomicAdd ( temp void)
 0:58        'gs_ua2' ( shared 2-component vector of uint)
 0:58        'gs_ub2' ( shared 2-component vector of uint)
@@ -521,7 +527,8 @@ local_size = (1, 1, 1)
 0:78      'inU1' ( in 3-component vector of uint)
 0:?     Sequence
 0:82      all ( temp bool)
-0:82        'inF0' ( in 3-component vector of float)
+0:82        Convert float to bool ( temp 3-component vector of bool)
+0:82          'inF0' ( in 3-component vector of float)
 0:85      AtomicAdd ( temp void)
 0:85        'gs_ua3' ( shared 3-component vector of uint)
 0:85        'gs_ub3' ( shared 3-component vector of uint)
@@ -595,7 +602,8 @@ local_size = (1, 1, 1)
 0:105      'inU1' ( in 4-component vector of uint)
 0:?     Sequence
 0:109      all ( temp bool)
-0:109        'inF0' ( in 4-component vector of float)
+0:109        Convert float to bool ( temp 4-component vector of bool)
+0:109          'inF0' ( in 4-component vector of float)
 0:112      AtomicAdd ( temp void)
 0:112        'gs_ua4' ( shared 4-component vector of uint)
 0:112        'gs_ub4' ( shared 4-component vector of uint)
@@ -709,12 +717,12 @@ local_size = (1, 1, 1)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 255
+// Id's are bound by 265
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "ComputeShaderFunction" 227 230 233 237 240 243
+                              EntryPoint GLCompute 4  "ComputeShaderFunction" 237 240 243 247 250 253
                               ExecutionMode 4 LocalSize 1 1 1
                               Source HLSL 500
                               Name 4  "ComputeShaderFunction"
@@ -746,44 +754,44 @@ local_size = (1, 1, 1)
                               Name 55  "inF2"
                               Name 56  "inU0"
                               Name 57  "inU1"
-                              Name 64  "gs_ua"
-                              Name 65  "gs_ub"
-                              Name 70  "out_u1"
-                              Name 78  "gs_uc"
-                              Name 107  "gs_ua2"
-                              Name 108  "gs_ub2"
-                              Name 111  "out_u2"
-                              Name 119  "gs_uc2"
-                              Name 148  "gs_ua3"
-                              Name 149  "gs_ub3"
-                              Name 152  "out_u3"
-                              Name 160  "gs_uc3"
-                              Name 188  "gs_ua4"
-                              Name 189  "gs_ub4"
-                              Name 192  "out_u4"
-                              Name 200  "gs_uc4"
-                              Name 225  "inF0"
-                              Name 227  "inF0"
-                              Name 229  "inF1"
-                              Name 230  "inF1"
-                              Name 232  "inF2"
-                              Name 233  "inF2"
-                              Name 235  "inU0"
-                              Name 237  "inU0"
-                              Name 239  "inU1"
-                              Name 240  "inU1"
-                              Name 243  "@entryPointOutput"
-                              Name 244  "param"
-                              Name 246  "param"
-                              Name 248  "param"
-                              Name 250  "param"
-                              Name 252  "param"
-                              Decorate 227(inF0) Location 0
-                              Decorate 230(inF1) Location 1
-                              Decorate 233(inF2) Location 2
-                              Decorate 237(inU0) Location 3
-                              Decorate 240(inU1) Location 4
-                              Decorate 243(@entryPointOutput) Location 0
+                              Name 66  "gs_ua"
+                              Name 67  "gs_ub"
+                              Name 72  "out_u1"
+                              Name 80  "gs_uc"
+                              Name 111  "gs_ua2"
+                              Name 112  "gs_ub2"
+                              Name 115  "out_u2"
+                              Name 123  "gs_uc2"
+                              Name 155  "gs_ua3"
+                              Name 156  "gs_ub3"
+                              Name 159  "out_u3"
+                              Name 167  "gs_uc3"
+                              Name 198  "gs_ua4"
+                              Name 199  "gs_ub4"
+                              Name 202  "out_u4"
+                              Name 210  "gs_uc4"
+                              Name 235  "inF0"
+                              Name 237  "inF0"
+                              Name 239  "inF1"
+                              Name 240  "inF1"
+                              Name 242  "inF2"
+                              Name 243  "inF2"
+                              Name 245  "inU0"
+                              Name 247  "inU0"
+                              Name 249  "inU1"
+                              Name 250  "inU1"
+                              Name 253  "@entryPointOutput"
+                              Name 254  "param"
+                              Name 256  "param"
+                              Name 258  "param"
+                              Name 260  "param"
+                              Name 262  "param"
+                              Decorate 237(inF0) Location 0
+                              Decorate 240(inF1) Location 1
+                              Decorate 243(inF2) Location 2
+                              Decorate 247(inU0) Location 3
+                              Decorate 250(inU1) Location 4
+                              Decorate 253(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -808,75 +816,81 @@ local_size = (1, 1, 1)
               51:             TypePointer Function 50(ivec4)
               52:             TypeFunction 48(fvec4) 49(ptr) 49(ptr) 49(ptr) 51(ptr) 51(ptr)
               61:             TypeBool
-              63:             TypePointer Workgroup 8(int)
-       64(gs_ua):     63(ptr) Variable Workgroup
-       65(gs_ub):     63(ptr) Variable Workgroup
-              67:      8(int) Constant 1
-              68:      8(int) Constant 0
-       78(gs_uc):     63(ptr) Variable Workgroup
-              99:    6(float) Constant 0
-             106:             TypePointer Workgroup 26(ivec2)
-     107(gs_ua2):    106(ptr) Variable Workgroup
-     108(gs_ub2):    106(ptr) Variable Workgroup
-     119(gs_uc2):    106(ptr) Variable Workgroup
-             140:    6(float) Constant 1065353216
-             141:    6(float) Constant 1073741824
-             142:   24(fvec2) ConstantComposite 140 141
-             147:             TypePointer Workgroup 38(ivec3)
-     148(gs_ua3):    147(ptr) Variable Workgroup
-     149(gs_ub3):    147(ptr) Variable Workgroup
-     160(gs_uc3):    147(ptr) Variable Workgroup
-             181:    6(float) Constant 1077936128
-             182:   36(fvec3) ConstantComposite 140 141 181
-             187:             TypePointer Workgroup 50(ivec4)
-     188(gs_ua4):    187(ptr) Variable Workgroup
-     189(gs_ub4):    187(ptr) Variable Workgroup
-     200(gs_uc4):    187(ptr) Variable Workgroup
-             221:    6(float) Constant 1082130432
-             222:   48(fvec4) ConstantComposite 140 141 181 221
-             226:             TypePointer Input 48(fvec4)
-       227(inF0):    226(ptr) Variable Input
-       230(inF1):    226(ptr) Variable Input
-       233(inF2):    226(ptr) Variable Input
-             236:             TypePointer Input 50(ivec4)
-       237(inU0):    236(ptr) Variable Input
-       240(inU1):    236(ptr) Variable Input
-             242:             TypePointer Output 48(fvec4)
-243(@entryPointOutput):    242(ptr) Variable Output
+              62:    6(float) Constant 0
+              65:             TypePointer Workgroup 8(int)
+       66(gs_ua):     65(ptr) Variable Workgroup
+       67(gs_ub):     65(ptr) Variable Workgroup
+              69:      8(int) Constant 1
+              70:      8(int) Constant 0
+       80(gs_uc):     65(ptr) Variable Workgroup
+             106:             TypeVector 61(bool) 2
+             107:   24(fvec2) ConstantComposite 62 62
+             110:             TypePointer Workgroup 26(ivec2)
+     111(gs_ua2):    110(ptr) Variable Workgroup
+     112(gs_ub2):    110(ptr) Variable Workgroup
+     123(gs_uc2):    110(ptr) Variable Workgroup
+             144:    6(float) Constant 1065353216
+             145:    6(float) Constant 1073741824
+             146:   24(fvec2) ConstantComposite 144 145
+             150:             TypeVector 61(bool) 3
+             151:   36(fvec3) ConstantComposite 62 62 62
+             154:             TypePointer Workgroup 38(ivec3)
+     155(gs_ua3):    154(ptr) Variable Workgroup
+     156(gs_ub3):    154(ptr) Variable Workgroup
+     167(gs_uc3):    154(ptr) Variable Workgroup
+             188:    6(float) Constant 1077936128
+             189:   36(fvec3) ConstantComposite 144 145 188
+             193:             TypeVector 61(bool) 4
+             194:   48(fvec4) ConstantComposite 62 62 62 62
+             197:             TypePointer Workgroup 50(ivec4)
+     198(gs_ua4):    197(ptr) Variable Workgroup
+     199(gs_ub4):    197(ptr) Variable Workgroup
+     210(gs_uc4):    197(ptr) Variable Workgroup
+             231:    6(float) Constant 1082130432
+             232:   48(fvec4) ConstantComposite 144 145 188 231
+             236:             TypePointer Input 48(fvec4)
+       237(inF0):    236(ptr) Variable Input
+       240(inF1):    236(ptr) Variable Input
+       243(inF2):    236(ptr) Variable Input
+             246:             TypePointer Input 50(ivec4)
+       247(inU0):    246(ptr) Variable Input
+       250(inU1):    246(ptr) Variable Input
+             252:             TypePointer Output 48(fvec4)
+253(@entryPointOutput):    252(ptr) Variable Output
 4(ComputeShaderFunction):           2 Function None 3
                5:             Label
-       225(inF0):     49(ptr) Variable Function
-       229(inF1):     49(ptr) Variable Function
-       232(inF2):     49(ptr) Variable Function
-       235(inU0):     51(ptr) Variable Function
-       239(inU1):     51(ptr) Variable Function
-      244(param):     49(ptr) Variable Function
-      246(param):     49(ptr) Variable Function
-      248(param):     49(ptr) Variable Function
-      250(param):     51(ptr) Variable Function
-      252(param):     51(ptr) Variable Function
-             228:   48(fvec4) Load 227(inF0)
-                              Store 225(inF0) 228
-             231:   48(fvec4) Load 230(inF1)
-                              Store 229(inF1) 231
-             234:   48(fvec4) Load 233(inF2)
-                              Store 232(inF2) 234
-             238:   50(ivec4) Load 237(inU0)
-                              Store 235(inU0) 238
-             241:   50(ivec4) Load 240(inU1)
-                              Store 239(inU1) 241
-             245:   48(fvec4) Load 225(inF0)
-                              Store 244(param) 245
-             247:   48(fvec4) Load 229(inF1)
-                              Store 246(param) 247
-             249:   48(fvec4) Load 232(inF2)
-                              Store 248(param) 249
-             251:   50(ivec4) Load 235(inU0)
-                              Store 250(param) 251
-             253:   50(ivec4) Load 239(inU1)
-                              Store 252(param) 253
-             254:   48(fvec4) FunctionCall 58(@ComputeShaderFunction(vf4;vf4;vf4;vu4;vu4;) 244(param) 246(param) 248(param) 250(param) 252(param)
-                              Store 243(@entryPointOutput) 254
+       235(inF0):     49(ptr) Variable Function
+       239(inF1):     49(ptr) Variable Function
+       242(inF2):     49(ptr) Variable Function
+       245(inU0):     51(ptr) Variable Function
+       249(inU1):     51(ptr) Variable Function
+      254(param):     49(ptr) Variable Function
+      256(param):     49(ptr) Variable Function
+      258(param):     49(ptr) Variable Function
+      260(param):     51(ptr) Variable Function
+      262(param):     51(ptr) Variable Function
+             238:   48(fvec4) Load 237(inF0)
+                              Store 235(inF0) 238
+             241:   48(fvec4) Load 240(inF1)
+                              Store 239(inF1) 241
+             244:   48(fvec4) Load 243(inF2)
+                              Store 242(inF2) 244
+             248:   50(ivec4) Load 247(inU0)
+                              Store 245(inU0) 248
+             251:   50(ivec4) Load 250(inU1)
+                              Store 249(inU1) 251
+             255:   48(fvec4) Load 235(inF0)
+                              Store 254(param) 255
+             257:   48(fvec4) Load 239(inF1)
+                              Store 256(param) 257
+             259:   48(fvec4) Load 242(inF2)
+                              Store 258(param) 259
+             261:   50(ivec4) Load 245(inU0)
+                              Store 260(param) 261
+             263:   50(ivec4) Load 249(inU1)
+                              Store 262(param) 263
+             264:   48(fvec4) FunctionCall 58(@ComputeShaderFunction(vf4;vf4;vf4;vu4;vu4;) 254(param) 256(param) 258(param) 260(param) 262(param)
+                              Store 253(@entryPointOutput) 264
                               Return
                               FunctionEnd
 16(ComputeShaderFunctionS(f1;f1;f1;u1;u1;):    6(float) Function None 10
@@ -886,54 +900,55 @@ local_size = (1, 1, 1)
         14(inU0):      9(ptr) FunctionParameter
         15(inU1):      9(ptr) FunctionParameter
               17:             Label
-      70(out_u1):      9(ptr) Variable Function
+      72(out_u1):      9(ptr) Variable Function
               60:    6(float) Load 11(inF0)
-              62:    61(bool) All 60
-              66:      8(int) Load 65(gs_ub)
-              69:           2 AtomicIAdd 64(gs_ua) 67 68 66
-              71:      8(int) Load 65(gs_ub)
-              72:      8(int) AtomicIAdd 64(gs_ua) 67 68 71
-                              Store 70(out_u1) 72
-              73:      8(int) Load 65(gs_ub)
-              74:           2 AtomicAnd 64(gs_ua) 67 68 73
-              75:      8(int) Load 65(gs_ub)
-              76:      8(int) AtomicAnd 64(gs_ua) 67 68 75
-                              Store 70(out_u1) 76
-              77:      8(int) Load 65(gs_ub)
-              79:      8(int) Load 78(gs_uc)
-              80:      8(int) AtomicCompareExchange 64(gs_ua) 67 68 68 79 77
-                              Store 70(out_u1) 80
-              81:      8(int) Load 65(gs_ub)
-              82:      8(int) AtomicExchange 64(gs_ua) 67 68 81
-                              Store 70(out_u1) 82
-              83:      8(int) Load 65(gs_ub)
-              84:           2 AtomicSMax 64(gs_ua) 67 68 83
-              85:      8(int) Load 65(gs_ub)
-              86:      8(int) AtomicUMax 64(gs_ua) 67 68 85
-                              Store 70(out_u1) 86
-              87:      8(int) Load 65(gs_ub)
-              88:           2 AtomicSMin 64(gs_ua) 67 68 87
-              89:      8(int) Load 65(gs_ub)
-              90:      8(int) AtomicUMin 64(gs_ua) 67 68 89
-                              Store 70(out_u1) 90
-              91:      8(int) Load 65(gs_ub)
-              92:           2 AtomicOr 64(gs_ua) 67 68 91
-              93:      8(int) Load 65(gs_ub)
-              94:      8(int) AtomicOr 64(gs_ua) 67 68 93
-                              Store 70(out_u1) 94
-              95:      8(int) Load 65(gs_ub)
-              96:           2 AtomicXor 64(gs_ua) 67 68 95
-              97:      8(int) Load 65(gs_ub)
-              98:      8(int) AtomicXor 64(gs_ua) 67 68 97
-                              Store 70(out_u1) 98
-                              ReturnValue 99
+              63:    61(bool) FOrdNotEqual 60 62
+              64:    61(bool) All 63
+              68:      8(int) Load 67(gs_ub)
+              71:           2 AtomicIAdd 66(gs_ua) 69 70 68
+              73:      8(int) Load 67(gs_ub)
+              74:      8(int) AtomicIAdd 66(gs_ua) 69 70 73
+                              Store 72(out_u1) 74
+              75:      8(int) Load 67(gs_ub)
+              76:           2 AtomicAnd 66(gs_ua) 69 70 75
+              77:      8(int) Load 67(gs_ub)
+              78:      8(int) AtomicAnd 66(gs_ua) 69 70 77
+                              Store 72(out_u1) 78
+              79:      8(int) Load 67(gs_ub)
+              81:      8(int) Load 80(gs_uc)
+              82:      8(int) AtomicCompareExchange 66(gs_ua) 69 70 70 81 79
+                              Store 72(out_u1) 82
+              83:      8(int) Load 67(gs_ub)
+              84:      8(int) AtomicExchange 66(gs_ua) 69 70 83
+                              Store 72(out_u1) 84
+              85:      8(int) Load 67(gs_ub)
+              86:           2 AtomicSMax 66(gs_ua) 69 70 85
+              87:      8(int) Load 67(gs_ub)
+              88:      8(int) AtomicUMax 66(gs_ua) 69 70 87
+                              Store 72(out_u1) 88
+              89:      8(int) Load 67(gs_ub)
+              90:           2 AtomicSMin 66(gs_ua) 69 70 89
+              91:      8(int) Load 67(gs_ub)
+              92:      8(int) AtomicUMin 66(gs_ua) 69 70 91
+                              Store 72(out_u1) 92
+              93:      8(int) Load 67(gs_ub)
+              94:           2 AtomicOr 66(gs_ua) 69 70 93
+              95:      8(int) Load 67(gs_ub)
+              96:      8(int) AtomicOr 66(gs_ua) 69 70 95
+                              Store 72(out_u1) 96
+              97:      8(int) Load 67(gs_ub)
+              98:           2 AtomicXor 66(gs_ua) 69 70 97
+              99:      8(int) Load 67(gs_ub)
+             100:      8(int) AtomicXor 66(gs_ua) 69 70 99
+                              Store 72(out_u1) 100
+                              ReturnValue 62
                               FunctionEnd
 22(ComputeShaderFunction1(vf1;vf1;vf1;):    6(float) Function None 18
         19(inF0):      7(ptr) FunctionParameter
         20(inF1):      7(ptr) FunctionParameter
         21(inF2):      7(ptr) FunctionParameter
               23:             Label
-                              ReturnValue 99
+                              ReturnValue 62
                               FunctionEnd
 34(ComputeShaderFunction2(vf2;vf2;vf2;vu2;vu2;):   24(fvec2) Function None 28
         29(inF0):     25(ptr) FunctionParameter
@@ -942,47 +957,48 @@ local_size = (1, 1, 1)
         32(inU0):     27(ptr) FunctionParameter
         33(inU1):     27(ptr) FunctionParameter
               35:             Label
-     111(out_u2):     27(ptr) Variable Function
-             104:   24(fvec2) Load 29(inF0)
-             105:    61(bool) All 104
-             109:   26(ivec2) Load 108(gs_ub2)
-             110:           2 AtomicIAdd 107(gs_ua2) 67 68 109
-             112:   26(ivec2) Load 108(gs_ub2)
-             113:   26(ivec2) AtomicIAdd 107(gs_ua2) 67 68 112
-                              Store 111(out_u2) 113
-             114:   26(ivec2) Load 108(gs_ub2)
-             115:           2 AtomicAnd 107(gs_ua2) 67 68 114
-             116:   26(ivec2) Load 108(gs_ub2)
-             117:   26(ivec2) AtomicAnd 107(gs_ua2) 67 68 116
-                              Store 111(out_u2) 117
-             118:   26(ivec2) Load 108(gs_ub2)
-             120:   26(ivec2) Load 119(gs_uc2)
-             121:   26(ivec2) AtomicCompareExchange 107(gs_ua2) 67 68 68 120 118
-                              Store 111(out_u2) 121
-             122:   26(ivec2) Load 108(gs_ub2)
-             123:   26(ivec2) AtomicExchange 107(gs_ua2) 67 68 122
-                              Store 111(out_u2) 123
-             124:   26(ivec2) Load 108(gs_ub2)
-             125:           2 AtomicSMax 107(gs_ua2) 67 68 124
-             126:   26(ivec2) Load 108(gs_ub2)
-             127:   26(ivec2) AtomicUMax 107(gs_ua2) 67 68 126
-                              Store 111(out_u2) 127
-             128:   26(ivec2) Load 108(gs_ub2)
-             129:           2 AtomicSMin 107(gs_ua2) 67 68 128
-             130:   26(ivec2) Load 108(gs_ub2)
-             131:   26(ivec2) AtomicUMin 107(gs_ua2) 67 68 130
-                              Store 111(out_u2) 131
-             132:   26(ivec2) Load 108(gs_ub2)
-             133:           2 AtomicOr 107(gs_ua2) 67 68 132
-             134:   26(ivec2) Load 108(gs_ub2)
-             135:   26(ivec2) AtomicOr 107(gs_ua2) 67 68 134
-                              Store 111(out_u2) 135
-             136:   26(ivec2) Load 108(gs_ub2)
-             137:           2 AtomicXor 107(gs_ua2) 67 68 136
-             138:   26(ivec2) Load 108(gs_ub2)
-             139:   26(ivec2) AtomicXor 107(gs_ua2) 67 68 138
-                              Store 111(out_u2) 139
-                              ReturnValue 142
+     115(out_u2):     27(ptr) Variable Function
+             105:   24(fvec2) Load 29(inF0)
+             108:  106(bvec2) FOrdNotEqual 105 107
+             109:    61(bool) All 108
+             113:   26(ivec2) Load 112(gs_ub2)
+             114:           2 AtomicIAdd 111(gs_ua2) 69 70 113
+             116:   26(ivec2) Load 112(gs_ub2)
+             117:   26(ivec2) AtomicIAdd 111(gs_ua2) 69 70 116
+                              Store 115(out_u2) 117
+             118:   26(ivec2) Load 112(gs_ub2)
+             119:           2 AtomicAnd 111(gs_ua2) 69 70 118
+             120:   26(ivec2) Load 112(gs_ub2)
+             121:   26(ivec2) AtomicAnd 111(gs_ua2) 69 70 120
+                              Store 115(out_u2) 121
+             122:   26(ivec2) Load 112(gs_ub2)
+             124:   26(ivec2) Load 123(gs_uc2)
+             125:   26(ivec2) AtomicCompareExchange 111(gs_ua2) 69 70 70 124 122
+                              Store 115(out_u2) 125
+             126:   26(ivec2) Load 112(gs_ub2)
+             127:   26(ivec2) AtomicExchange 111(gs_ua2) 69 70 126
+                              Store 115(out_u2) 127
+             128:   26(ivec2) Load 112(gs_ub2)
+             129:           2 AtomicSMax 111(gs_ua2) 69 70 128
+             130:   26(ivec2) Load 112(gs_ub2)
+             131:   26(ivec2) AtomicUMax 111(gs_ua2) 69 70 130
+                              Store 115(out_u2) 131
+             132:   26(ivec2) Load 112(gs_ub2)
+             133:           2 AtomicSMin 111(gs_ua2) 69 70 132
+             134:   26(ivec2) Load 112(gs_ub2)
+             135:   26(ivec2) AtomicUMin 111(gs_ua2) 69 70 134
+                              Store 115(out_u2) 135
+             136:   26(ivec2) Load 112(gs_ub2)
+             137:           2 AtomicOr 111(gs_ua2) 69 70 136
+             138:   26(ivec2) Load 112(gs_ub2)
+             139:   26(ivec2) AtomicOr 111(gs_ua2) 69 70 138
+                              Store 115(out_u2) 139
+             140:   26(ivec2) Load 112(gs_ub2)
+             141:           2 AtomicXor 111(gs_ua2) 69 70 140
+             142:   26(ivec2) Load 112(gs_ub2)
+             143:   26(ivec2) AtomicXor 111(gs_ua2) 69 70 142
+                              Store 115(out_u2) 143
+                              ReturnValue 146
                               FunctionEnd
 46(ComputeShaderFunction3(vf3;vf3;vf3;vu3;vu3;):   36(fvec3) Function None 40
         41(inF0):     37(ptr) FunctionParameter
@@ -991,47 +1007,48 @@ local_size = (1, 1, 1)
         44(inU0):     39(ptr) FunctionParameter
         45(inU1):     39(ptr) FunctionParameter
               47:             Label
-     152(out_u3):     39(ptr) Variable Function
-             145:   36(fvec3) Load 41(inF0)
-             146:    61(bool) All 145
-             150:   38(ivec3) Load 149(gs_ub3)
-             151:           2 AtomicIAdd 148(gs_ua3) 67 68 150
-             153:   38(ivec3) Load 149(gs_ub3)
-             154:   38(ivec3) AtomicIAdd 148(gs_ua3) 67 68 153
-                              Store 152(out_u3) 154
-             155:   38(ivec3) Load 149(gs_ub3)
-             156:           2 AtomicAnd 148(gs_ua3) 67 68 155
-             157:   38(ivec3) Load 149(gs_ub3)
-             158:   38(ivec3) AtomicAnd 148(gs_ua3) 67 68 157
-                              Store 152(out_u3) 158
-             159:   38(ivec3) Load 149(gs_ub3)
-             161:   38(ivec3) Load 160(gs_uc3)
-             162:   38(ivec3) AtomicCompareExchange 148(gs_ua3) 67 68 68 161 159
-                              Store 152(out_u3) 162
-             163:   38(ivec3) Load 149(gs_ub3)
-             164:   38(ivec3) AtomicExchange 148(gs_ua3) 67 68 163
-                              Store 152(out_u3) 164
-             165:   38(ivec3) Load 149(gs_ub3)
-             166:           2 AtomicSMax 148(gs_ua3) 67 68 165
-             167:   38(ivec3) Load 149(gs_ub3)
-             168:   38(ivec3) AtomicUMax 148(gs_ua3) 67 68 167
-                              Store 152(out_u3) 168
-             169:   38(ivec3) Load 149(gs_ub3)
-             170:           2 AtomicSMin 148(gs_ua3) 67 68 169
-             171:   38(ivec3) Load 149(gs_ub3)
-             172:   38(ivec3) AtomicUMin 148(gs_ua3) 67 68 171
-                              Store 152(out_u3) 172
-             173:   38(ivec3) Load 149(gs_ub3)
-             174:           2 AtomicOr 148(gs_ua3) 67 68 173
-             175:   38(ivec3) Load 149(gs_ub3)
-             176:   38(ivec3) AtomicOr 148(gs_ua3) 67 68 175
-                              Store 152(out_u3) 176
-             177:   38(ivec3) Load 149(gs_ub3)
-             178:           2 AtomicXor 148(gs_ua3) 67 68 177
-             179:   38(ivec3) Load 149(gs_ub3)
-             180:   38(ivec3) AtomicXor 148(gs_ua3) 67 68 179
-                              Store 152(out_u3) 180
-                              ReturnValue 182
+     159(out_u3):     39(ptr) Variable Function
+             149:   36(fvec3) Load 41(inF0)
+             152:  150(bvec3) FOrdNotEqual 149 151
+             153:    61(bool) All 152
+             157:   38(ivec3) Load 156(gs_ub3)
+             158:           2 AtomicIAdd 155(gs_ua3) 69 70 157
+             160:   38(ivec3) Load 156(gs_ub3)
+             161:   38(ivec3) AtomicIAdd 155(gs_ua3) 69 70 160
+                              Store 159(out_u3) 161
+             162:   38(ivec3) Load 156(gs_ub3)
+             163:           2 AtomicAnd 155(gs_ua3) 69 70 162
+             164:   38(ivec3) Load 156(gs_ub3)
+             165:   38(ivec3) AtomicAnd 155(gs_ua3) 69 70 164
+                              Store 159(out_u3) 165
+             166:   38(ivec3) Load 156(gs_ub3)
+             168:   38(ivec3) Load 167(gs_uc3)
+             169:   38(ivec3) AtomicCompareExchange 155(gs_ua3) 69 70 70 168 166
+                              Store 159(out_u3) 169
+             170:   38(ivec3) Load 156(gs_ub3)
+             171:   38(ivec3) AtomicExchange 155(gs_ua3) 69 70 170
+                              Store 159(out_u3) 171
+             172:   38(ivec3) Load 156(gs_ub3)
+             173:           2 AtomicSMax 155(gs_ua3) 69 70 172
+             174:   38(ivec3) Load 156(gs_ub3)
+             175:   38(ivec3) AtomicUMax 155(gs_ua3) 69 70 174
+                              Store 159(out_u3) 175
+             176:   38(ivec3) Load 156(gs_ub3)
+             177:           2 AtomicSMin 155(gs_ua3) 69 70 176
+             178:   38(ivec3) Load 156(gs_ub3)
+             179:   38(ivec3) AtomicUMin 155(gs_ua3) 69 70 178
+                              Store 159(out_u3) 179
+             180:   38(ivec3) Load 156(gs_ub3)
+             181:           2 AtomicOr 155(gs_ua3) 69 70 180
+             182:   38(ivec3) Load 156(gs_ub3)
+             183:   38(ivec3) AtomicOr 155(gs_ua3) 69 70 182
+                              Store 159(out_u3) 183
+             184:   38(ivec3) Load 156(gs_ub3)
+             185:           2 AtomicXor 155(gs_ua3) 69 70 184
+             186:   38(ivec3) Load 156(gs_ub3)
+             187:   38(ivec3) AtomicXor 155(gs_ua3) 69 70 186
+                              Store 159(out_u3) 187
+                              ReturnValue 189
                               FunctionEnd
 58(@ComputeShaderFunction(vf4;vf4;vf4;vu4;vu4;):   48(fvec4) Function None 52
         53(inF0):     49(ptr) FunctionParameter
@@ -1040,45 +1057,46 @@ local_size = (1, 1, 1)
         56(inU0):     51(ptr) FunctionParameter
         57(inU1):     51(ptr) FunctionParameter
               59:             Label
-     192(out_u4):     51(ptr) Variable Function
-             185:   48(fvec4) Load 53(inF0)
-             186:    61(bool) All 185
-             190:   50(ivec4) Load 189(gs_ub4)
-             191:           2 AtomicIAdd 188(gs_ua4) 67 68 190
-             193:   50(ivec4) Load 189(gs_ub4)
-             194:   50(ivec4) AtomicIAdd 188(gs_ua4) 67 68 193
-                              Store 192(out_u4) 194
-             195:   50(ivec4) Load 189(gs_ub4)
-             196:           2 AtomicAnd 188(gs_ua4) 67 68 195
-             197:   50(ivec4) Load 189(gs_ub4)
-             198:   50(ivec4) AtomicAnd 188(gs_ua4) 67 68 197
-                              Store 192(out_u4) 198
-             199:   50(ivec4) Load 189(gs_ub4)
-             201:   50(ivec4) Load 200(gs_uc4)
-             202:   50(ivec4) AtomicCompareExchange 188(gs_ua4) 67 68 68 201 199
-                              Store 192(out_u4) 202
-             203:   50(ivec4) Load 189(gs_ub4)
-             204:   50(ivec4) AtomicExchange 188(gs_ua4) 67 68 203
-                              Store 192(out_u4) 204
-             205:   50(ivec4) Load 189(gs_ub4)
-             206:           2 AtomicSMax 188(gs_ua4) 67 68 205
-             207:   50(ivec4) Load 189(gs_ub4)
-             208:   50(ivec4) AtomicUMax 188(gs_ua4) 67 68 207
-                              Store 192(out_u4) 208
-             209:   50(ivec4) Load 189(gs_ub4)
-             210:           2 AtomicSMin 188(gs_ua4) 67 68 209
-             211:   50(ivec4) Load 189(gs_ub4)
-             212:   50(ivec4) AtomicUMin 188(gs_ua4) 67 68 211
-                              Store 192(out_u4) 212
-             213:   50(ivec4) Load 189(gs_ub4)
-             214:           2 AtomicOr 188(gs_ua4) 67 68 213
-             215:   50(ivec4) Load 189(gs_ub4)
-             216:   50(ivec4) AtomicOr 188(gs_ua4) 67 68 215
-                              Store 192(out_u4) 216
-             217:   50(ivec4) Load 189(gs_ub4)
-             218:           2 AtomicXor 188(gs_ua4) 67 68 217
-             219:   50(ivec4) Load 189(gs_ub4)
-             220:   50(ivec4) AtomicXor 188(gs_ua4) 67 68 219
-                              Store 192(out_u4) 220
-                              ReturnValue 222
+     202(out_u4):     51(ptr) Variable Function
+             192:   48(fvec4) Load 53(inF0)
+             195:  193(bvec4) FOrdNotEqual 192 194
+             196:    61(bool) All 195
+             200:   50(ivec4) Load 199(gs_ub4)
+             201:           2 AtomicIAdd 198(gs_ua4) 69 70 200
+             203:   50(ivec4) Load 199(gs_ub4)
+             204:   50(ivec4) AtomicIAdd 198(gs_ua4) 69 70 203
+                              Store 202(out_u4) 204
+             205:   50(ivec4) Load 199(gs_ub4)
+             206:           2 AtomicAnd 198(gs_ua4) 69 70 205
+             207:   50(ivec4) Load 199(gs_ub4)
+             208:   50(ivec4) AtomicAnd 198(gs_ua4) 69 70 207
+                              Store 202(out_u4) 208
+             209:   50(ivec4) Load 199(gs_ub4)
+             211:   50(ivec4) Load 210(gs_uc4)
+             212:   50(ivec4) AtomicCompareExchange 198(gs_ua4) 69 70 70 211 209
+                              Store 202(out_u4) 212
+             213:   50(ivec4) Load 199(gs_ub4)
+             214:   50(ivec4) AtomicExchange 198(gs_ua4) 69 70 213
+                              Store 202(out_u4) 214
+             215:   50(ivec4) Load 199(gs_ub4)
+             216:           2 AtomicSMax 198(gs_ua4) 69 70 215
+             217:   50(ivec4) Load 199(gs_ub4)
+             218:   50(ivec4) AtomicUMax 198(gs_ua4) 69 70 217
+                              Store 202(out_u4) 218
+             219:   50(ivec4) Load 199(gs_ub4)
+             220:           2 AtomicSMin 198(gs_ua4) 69 70 219
+             221:   50(ivec4) Load 199(gs_ub4)
+             222:   50(ivec4) AtomicUMin 198(gs_ua4) 69 70 221
+                              Store 202(out_u4) 222
+             223:   50(ivec4) Load 199(gs_ub4)
+             224:           2 AtomicOr 198(gs_ua4) 69 70 223
+             225:   50(ivec4) Load 199(gs_ub4)
+             226:   50(ivec4) AtomicOr 198(gs_ua4) 69 70 225
+                              Store 202(out_u4) 226
+             227:   50(ivec4) Load 199(gs_ub4)
+             228:           2 AtomicXor 198(gs_ua4) 69 70 227
+             229:   50(ivec4) Load 199(gs_ub4)
+             230:   50(ivec4) AtomicXor 198(gs_ua4) 69 70 229
+                              Store 202(out_u4) 230
+                              ReturnValue 232
                               FunctionEnd

Plik diff jest za duży
+ 495 - 467
3rdparty/glslang/Test/baseResults/hlsl.intrinsics.frag.out


Plik diff jest za duży
+ 469 - 429
3rdparty/glslang/Test/baseResults/hlsl.intrinsics.vert.out


+ 1 - 1
3rdparty/glslang/Test/baseResults/hlsl.switch.frag.out

@@ -399,7 +399,7 @@ gl_FragCoord origin is upper left
                                 Branch 25
               25:             Label
               36:      9(int) Load 13(c)
-                              SelectionMerge 40 None
+                              SelectionMerge 40 DontFlatten 
                               Switch 36 39 
                                      case 1: 37
                                      case 2: 38

+ 43 - 0
3rdparty/glslang/Test/baseResults/spv.arbPostDepthCoverage.frag.out

@@ -0,0 +1,43 @@
+spv.arbPostDepthCoverage.frag
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 18
+
+                              Capability Shader
+                              Capability SampleRateShading
+                              Capability SampleMaskPostDepthCoverage
+                              Extension  "SPV_KHR_post_depth_coverage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 8 13
+                              ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 EarlyFragmentTests
+                              ExecutionMode 4 PostDepthCoverage
+                              Source GLSL 450
+                              SourceExtension  "GL_ARB_post_depth_coverage"
+                              SourceExtension  "GL_EXT_post_depth_coverage"
+                              Name 4  "main"
+                              Name 8  "readSampleMaskIn"
+                              Name 13  "gl_SampleMaskIn"
+                              Decorate 8(readSampleMaskIn) Location 0
+                              Decorate 13(gl_SampleMaskIn) Flat
+                              Decorate 13(gl_SampleMaskIn) BuiltIn SampleMask
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypePointer Output 6(int)
+8(readSampleMaskIn):      7(ptr) Variable Output
+               9:             TypeInt 32 0
+              10:      9(int) Constant 1
+              11:             TypeArray 6(int) 10
+              12:             TypePointer Input 11
+13(gl_SampleMaskIn):     12(ptr) Variable Input
+              14:      6(int) Constant 0
+              15:             TypePointer Input 6(int)
+         4(main):           2 Function None 3
+               5:             Label
+              16:     15(ptr) AccessChain 13(gl_SampleMaskIn) 14
+              17:      6(int) Load 16
+                              Store 8(readSampleMaskIn) 17
+                              Return
+                              FunctionEnd

+ 7 - 0
3rdparty/glslang/Test/baseResults/spv.arbPostDepthCoverage_Error.frag.out

@@ -0,0 +1,7 @@
+spv.arbPostDepthCoverage_Error.frag
+ERROR: 0:7: 'early_fragment_tests' : can only apply to a standalone qualifier 
+ERROR: 0:7: 'post_depth_coverage' : can only apply to a standalone qualifier 
+ERROR: 2 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link

+ 23 - 0
3rdparty/glslang/Test/baseResults/spv.extPostDepthCoverage.frag.out

@@ -0,0 +1,23 @@
+spv.extPostDepthCoverage.frag
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 6
+
+                              Capability Shader
+                              Capability SampleMaskPostDepthCoverage
+                              Extension  "SPV_KHR_post_depth_coverage"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main"
+                              ExecutionMode 4 OriginUpperLeft
+                              ExecutionMode 4 EarlyFragmentTests
+                              ExecutionMode 4 PostDepthCoverage
+                              Source ESSL 310
+                              SourceExtension  "GL_EXT_post_depth_coverage"
+                              Name 4  "main"
+               2:             TypeVoid
+               3:             TypeFunction 2
+         4(main):           2 Function None 3
+               5:             Label
+                              Return
+                              FunctionEnd

+ 4 - 0
3rdparty/glslang/Test/baseResults/spv.extPostDepthCoverage_Error.frag.out

@@ -0,0 +1,4 @@
+spv.extPostDepthCoverage_Error.frag
+ERROR: Linking fragment stage: post_depth_coverage requires early_fragment_tests
+
+SPIR-V is not generated for failed compile or link

+ 15 - 14
3rdparty/glslang/Test/baseResults/spv.texture.sampler.transform.frag.out

@@ -1,19 +1,19 @@
 spv.texture.sampler.transform.frag
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 19
+// Id's are bound by 20
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 9 16
+                              EntryPoint Fragment 4  "main" 9 17
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 440
                               Name 4  "main"
                               Name 9  "color"
-                              Name 12  "tex"
-                              Name 16  "coord"
-                              Decorate 12(tex) DescriptorSet 0
+                              Name 13  "tex"
+                              Name 17  "coord"
+                              Decorate 13(tex) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -21,16 +21,17 @@ spv.texture.sampler.transform.frag
                8:             TypePointer Output 7(fvec4)
         9(color):      8(ptr) Variable Output
               10:             TypeImage 6(float) 2D sampled format:Unknown
-              11:             TypePointer UniformConstant 10
-         12(tex):     11(ptr) Variable UniformConstant
-              14:             TypeVector 6(float) 2
-              15:             TypePointer Input 14(fvec2)
-       16(coord):     15(ptr) Variable Input
+              11:             TypeSampledImage 10
+              12:             TypePointer UniformConstant 11
+         13(tex):     12(ptr) Variable UniformConstant
+              15:             TypeVector 6(float) 2
+              16:             TypePointer Input 15(fvec2)
+       17(coord):     16(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-              13:          10 Load 12(tex)
-              17:   14(fvec2) Load 16(coord)
-              18:    7(fvec4) ImageSampleImplicitLod 13 17
-                              Store 9(color) 18
+              14:          11 Load 13(tex)
+              18:   15(fvec2) Load 17(coord)
+              19:    7(fvec4) ImageSampleImplicitLod 14 18
+                              Store 9(color) 19
                               Return
                               FunctionEnd

+ 1 - 1
3rdparty/glslang/Test/hlsl.switch.frag

@@ -18,7 +18,7 @@ float4 PixelShaderFunction(float4 input, int c, int d) : COLOR0
         break;
     }
 
-    switch (c) {
+    [branch] switch (c) {
     case 1:
         ++input;
         break;

+ 7 - 0
3rdparty/glslang/Test/runtests

@@ -45,6 +45,11 @@ echo Comparing single thread to multithread for all tests in current directory..
 $EXE -i -C *.vert *.geom *.frag *.tes* *.comp > singleThread.out
 $EXE -i -C *.vert *.geom *.frag *.tes* *.comp -t > multiThread.out
 diff singleThread.out multiThread.out || HASERROR=1
+if [ $HASERROR -eq 0 ]
+then
+    rm singleThread.out
+    rm multiThread.out
+fi
 
 #
 # entry point renaming tests
@@ -147,4 +152,6 @@ else
     echo Tests Failed.
 fi
 
+rm -f comp.spv frag.spv geom.spv tesc.spv tese.spv vert.spv
+
 exit $HASERROR

+ 2 - 0
3rdparty/glslang/Test/spv.OVR_multiview.vert

@@ -2,6 +2,8 @@
 
 #extension GL_OVR_multiview : enable
 
+layout(num_views = 2) in;
+
 void main() {
     gl_Position = vec4(gl_ViewID_OVR, 0, 0, 0);
 }

+ 13 - 0
3rdparty/glslang/Test/spv.arbPostDepthCoverage.frag

@@ -0,0 +1,13 @@
+#version 450
+
+#extension GL_ARB_post_depth_coverage : enable
+#extension GL_EXT_post_depth_coverage : enable //according to ARB_post_depth_coverage, 
+                                               //if both enabled, this one should be ignored
+precision highp int;
+layout(post_depth_coverage) in;
+
+layout (location = 0) out int readSampleMaskIn;
+
+void main () {
+    readSampleMaskIn = gl_SampleMaskIn[0];
+}

+ 12 - 0
3rdparty/glslang/Test/spv.arbPostDepthCoverage_Error.frag

@@ -0,0 +1,12 @@
+#version 310 es
+
+#extension GL_ARB_post_depth_coverage : enable
+
+precision highp float;
+
+layout(post_depth_coverage, location = 0) in float a;  // should fail since post_depth_coverage may only
+                                                       // be declared on in only (not with variable declarations)
+
+void main () {
+
+}

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

@@ -0,0 +1,9 @@
+#version 310 es
+
+#extension GL_EXT_post_depth_coverage : enable
+
+layout(post_depth_coverage) in;
+layout(early_fragment_tests) in;
+
+void main () {
+}

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

@@ -0,0 +1,9 @@
+#version 450
+
+#extension GL_EXT_post_depth_coverage : enable
+
+layout(post_depth_coverage) in; // should fail since for GL_EXT_post_depth_coverage
+                                // explicit declaration of early_fragment_tests is required
+
+void main () {
+}

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

@@ -43,7 +43,7 @@ layout(push_constant) buffer pcb {            // ERROR, not on a buffer
 layout(push_constant) uniform float pcfloat;  // ERROR 2X: not on a non-block, and non-opaque outside block
 
 layout(push_constant) uniform;                // ERROR, needs an object
-
+layout(std430, push_constant) uniform pcb1 { int a; } pcb1inst;
 layout(push_constant) uniform pcb2 {
     int a;
 };                                            // Okay now to have no instance name

+ 12 - 7
3rdparty/glslang/glslang/CMakeLists.txt

@@ -79,7 +79,8 @@ set(HEADERS
 # set(BISON_GLSLParser_OUTPUT_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/MachineIndependent/glslang_tab.cpp)
 
 add_library(glslang STATIC ${BISON_GLSLParser_OUTPUT_SOURCE} ${SOURCES} ${HEADERS})
-set_property(TARGET glslang PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET glslang PROPERTY FOLDER glslang)
+set_property(TARGET glslang PROPERTY POSITION_INDEPENDENT_CODE ON)
 target_link_libraries(glslang OGLCompiler OSDependent)
 if(ENABLE_HLSL)
     target_link_libraries(glslang HLSL)
@@ -93,10 +94,14 @@ if(WIN32)
     source_group("MachineIndependent\\Preprocessor" REGULAR_EXPRESSION "MachineIndependent/preprocessor/*")
 endif(WIN32)
 
-install(TARGETS glslang
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    install(TARGETS glslang
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+endif(ENABLE_GLSLANG_INSTALL)
 
-foreach(file ${HEADERS})
-    get_filename_component(dir ${file} DIRECTORY)
-    install(FILES ${file} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/glslang/${dir})
-endforeach()
+if(ENABLE_GLSLANG_INSTALL)
+    foreach(file ${HEADERS})
+        get_filename_component(dir ${file} DIRECTORY)
+        install(FILES ${file} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/glslang/${dir})
+    endforeach()
+endif(ENABLE_GLSLANG_INSTALL)

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

@@ -968,8 +968,10 @@ struct TShaderQualifiers {
     int localSize[3];         // compute shader
     int localSizeSpecId[3];   // compute shader specialization id for gl_WorkGroupSize
     bool earlyFragmentTests;  // fragment input
+    bool postDepthCoverage;   // fragment input
     TLayoutDepth layoutDepth;
     bool blendEquation;       // true if any blend equation was specified
+    int numViews;             // multiview extenstions
 
 #ifdef NV_EXTENSIONS
     bool layoutOverrideCoverage;    // true if layout override_coverage set
@@ -992,8 +994,10 @@ struct TShaderQualifiers {
         localSizeSpecId[1] = TQualifier::layoutNotSet;
         localSizeSpecId[2] = TQualifier::layoutNotSet;
         earlyFragmentTests = false;
+        postDepthCoverage = false;
         layoutDepth = EldNone;
         blendEquation = false;
+        numViews = TQualifier::layoutNotSet;
 #ifdef NV_EXTENSIONS
         layoutOverrideCoverage = false;
 #endif
@@ -1029,10 +1033,14 @@ struct TShaderQualifiers {
         }
         if (src.earlyFragmentTests)
             earlyFragmentTests = true;
+        if (src.postDepthCoverage)
+            postDepthCoverage = true;
         if (src.layoutDepth)
             layoutDepth = src.layoutDepth;
         if (src.blendEquation)
             blendEquation = src.blendEquation;
+        if (src.numViews != TQualifier::layoutNotSet)
+            numViews = src.numViews;
 #ifdef NV_EXTENSIONS
         if (src.layoutOverrideCoverage)
             layoutOverrideCoverage = src.layoutOverrideCoverage;

+ 30 - 4
3rdparty/glslang/glslang/Include/intermediate.h

@@ -861,6 +861,15 @@ protected:
     TType type;
 };
 
+//
+// Selection control hints
+//
+enum TSelectionControl {
+    ESelectionControlNone,
+    ESelectionControlFlatten,
+    ESelectionControlDontFlatten,
+};
+
 //
 // Loop control hints
 //
@@ -945,7 +954,11 @@ public:
     // per process threadPoolAllocator, then it causes increased memory usage per compile
     // it is essential to use "symbol = sym" to assign to symbol
     TIntermSymbol(int i, const TString& n, const TType& t)
-        : TIntermTyped(t), id(i), constSubtree(nullptr)
+        : TIntermTyped(t), id(i),
+#ifdef ENABLE_HLSL
+        flattenSubset(-1),
+#endif
+        constSubtree(nullptr)
           { name = n; }
     virtual int getId() const { return id; }
     virtual const TString& getName() const { return name; }
@@ -956,9 +969,16 @@ public:
     const TConstUnionArray& getConstArray() const { return constArray; }
     void setConstSubtree(TIntermTyped* subtree) { constSubtree = subtree; }
     TIntermTyped* getConstSubtree() const { return constSubtree; }
+#ifdef ENABLE_HLSL
+    void setFlattenSubset(int subset) { flattenSubset = subset; }
+    int getFlattenSubset() const { return flattenSubset; } // -1 means full object
+#endif
 
 protected:
     int id;                      // the unique id of the symbol this node represents
+#ifdef ENABLE_HLSL
+    int flattenSubset;           // how deeply the flattened object rooted at id has been dereferenced
+#endif
     TString name;                // the name of the symbol this node represents
     TConstUnionArray constArray; // if the symbol is a front-end compile-time constant, this is its value
     TIntermTyped* constSubtree;
@@ -1274,19 +1294,22 @@ protected:
 class TIntermSelection : public TIntermTyped {
 public:
     TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB) :
-        TIntermTyped(EbtVoid), condition(cond), trueBlock(trueB), falseBlock(falseB) {}
+        TIntermTyped(EbtVoid), condition(cond), trueBlock(trueB), falseBlock(falseB), control(ESelectionControlNone) {}
     TIntermSelection(TIntermTyped* cond, TIntermNode* trueB, TIntermNode* falseB, const TType& type) :
-        TIntermTyped(type), condition(cond), trueBlock(trueB), falseBlock(falseB) {}
+        TIntermTyped(type), condition(cond), trueBlock(trueB), falseBlock(falseB), control(ESelectionControlNone) {}
     virtual void traverse(TIntermTraverser*);
     virtual TIntermTyped* getCondition() const { return condition; }
     virtual TIntermNode* getTrueBlock() const { return trueBlock; }
     virtual TIntermNode* getFalseBlock() const { return falseBlock; }
     virtual       TIntermSelection* getAsSelectionNode()       { return this; }
     virtual const TIntermSelection* getAsSelectionNode() const { return this; }
+    void setSelectionControl(TSelectionControl c) { control = c; }
+    TSelectionControl getSelectionControl() const { return control; }
 protected:
     TIntermTyped* condition;
     TIntermNode* trueBlock;
     TIntermNode* falseBlock;
+    TSelectionControl control;    // selection control hint
 };
 
 //
@@ -1297,15 +1320,18 @@ protected:
 //
 class TIntermSwitch : public TIntermNode {
 public:
-    TIntermSwitch(TIntermTyped* cond, TIntermAggregate* b) : condition(cond), body(b) { }
+    TIntermSwitch(TIntermTyped* cond, TIntermAggregate* b) : condition(cond), body(b), control(ESelectionControlNone) { }
     virtual void traverse(TIntermTraverser*);
     virtual TIntermNode* getCondition() const { return condition; }
     virtual TIntermAggregate* getBody() const { return body; }
     virtual       TIntermSwitch* getAsSwitchNode()       { return this; }
     virtual const TIntermSwitch* getAsSwitchNode() const { return this; }
+    void setSelectionControl(TSelectionControl c) { control = c; }
+    TSelectionControl getSelectionControl() const { return control; }
 protected:
     TIntermTyped* condition;
     TIntermAggregate* body;
+    TSelectionControl control;    // selection control hint
 };
 
 enum TVisit

+ 13 - 13
3rdparty/glslang/glslang/MachineIndependent/Intermediate.cpp

@@ -1614,7 +1614,7 @@ TIntermAggregate* TIntermediate::makeAggregate(const TSourceLoc& loc)
 //
 // Returns the selection node created.
 //
-TIntermTyped* TIntermediate::addSelection(TIntermTyped* cond, TIntermNodePair nodePair, const TSourceLoc& loc)
+TIntermTyped* TIntermediate::addSelection(TIntermTyped* cond, TIntermNodePair nodePair, const TSourceLoc& loc, TSelectionControl control)
 {
     //
     // Don't prune the false path for compile-time constants; it's needed
@@ -1623,6 +1623,7 @@ TIntermTyped* TIntermediate::addSelection(TIntermTyped* cond, TIntermNodePair no
 
     TIntermSelection* node = new TIntermSelection(cond, nodePair.node1, nodePair.node2);
     node->setLoc(loc);
+    node->setSelectionControl(control);
 
     return node;
 }
@@ -1665,12 +1666,12 @@ TIntermTyped* TIntermediate::addMethod(TIntermTyped* object, const TType& type,
 //
 // Returns the selection node created, or nullptr if one could not be.
 //
-TIntermTyped* TIntermediate::addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock, const TSourceLoc& loc)
+TIntermTyped* TIntermediate::addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock, const TSourceLoc& loc, TSelectionControl control)
 {
     // If it's void, go to the if-then-else selection()
     if (trueBlock->getBasicType() == EbtVoid && falseBlock->getBasicType() == EbtVoid) {
         TIntermNodePair pair = { trueBlock, falseBlock };
-        return addSelection(cond, pair, loc);
+        return addSelection(cond, pair, loc, control);
     }
 
     //
@@ -3186,6 +3187,11 @@ bool TIntermediate::specConstantPropagates(const TIntermTyped& node1, const TInt
 }
 
 struct TextureUpgradeAndSamplerRemovalTransform : public TIntermTraverser {
+    void visitSymbol(TIntermSymbol* symbol) override {
+        if (symbol->getBasicType() == EbtSampler && symbol->getType().getSampler().isTexture()) {
+            symbol->getWritableType().getSampler().combined = true;
+        }
+    }
     bool visitAggregate(TVisit, TIntermAggregate* ag) override {
         using namespace std;
         TIntermSequence& seq = ag->getSequence();
@@ -3199,17 +3205,11 @@ struct TextureUpgradeAndSamplerRemovalTransform : public TIntermTraverser {
         });
         seq.erase(newEnd, seq.end());
         // replace constructors with sampler/textures
-        // update textures into sampled textures
         for_each(seq.begin(), seq.end(), [](TIntermNode*& node) {
-            TIntermSymbol* symbol = node->getAsSymbolNode();
-            if (!symbol) {
-                TIntermAggregate *constructor = node->getAsAggregate();
-                if (constructor && constructor->getOp() == EOpConstructTextureSampler) {
-                    if (!constructor->getSequence().empty())
-                        node = constructor->getSequence()[0];
-                }
-            } else if (symbol->getBasicType() == EbtSampler && symbol->getType().getSampler().isTexture()) {
-                symbol->getWritableType().getSampler().combined = true;
+            TIntermAggregate *constructor = node->getAsAggregate();
+            if (constructor && constructor->getOp() == EOpConstructTextureSampler) {
+                if (!constructor->getSequence().empty())
+                    node = constructor->getSequence()[0];
             }
         });
         return true;

+ 23 - 0
3rdparty/glslang/glslang/MachineIndependent/ParseHelper.cpp

@@ -4015,6 +4015,14 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
             publicType.shaderQualifiers.earlyFragmentTests = true;
             return;
         }
+        if (id == "post_depth_coverage") {
+            requireExtensions(loc, Num_post_depth_coverageEXTs, post_depth_coverageEXTs, "post depth coverage");
+            if (extensionTurnedOn(E_GL_ARB_post_depth_coverage)) {
+                publicType.shaderQualifiers.earlyFragmentTests = true;
+            }
+            publicType.shaderQualifiers.postDepthCoverage = true;
+            return;
+        }
         for (TLayoutDepth depth = (TLayoutDepth)(EldNone + 1); depth < EldCount; depth = (TLayoutDepth)(depth+1)) {
             if (id == TQualifier::getLayoutDepthString(depth)) {
                 requireProfile(loc, ECoreProfile | ECompatibilityProfile, "depth layout qualifier");
@@ -4206,6 +4214,11 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
         }
         return;
     }
+    if (id == "num_views") {
+        requireExtensions(loc, Num_OVR_multiview_EXTs, OVR_multiview_EXTs, "num_views");
+        publicType.shaderQualifiers.numViews = value;
+        return;
+    }
 
 #if NV_EXTENSIONS
     if (language == EShLangVertex ||
@@ -4788,6 +4801,8 @@ void TParseContext::checkNoShaderLayouts(const TSourceLoc& loc, const TShaderQua
         error(loc, message, "invocations", "");
     if (shaderQualifiers.earlyFragmentTests)
         error(loc, message, "early_fragment_tests", "");
+    if (shaderQualifiers.postDepthCoverage)
+        error(loc, message, "post_depth_coverage", "");
     for (int i = 0; i < 3; ++i) {
         if (shaderQualifiers.localSize[i] > 1)
             error(loc, message, "local_size", "");
@@ -4804,6 +4819,8 @@ void TParseContext::checkNoShaderLayouts(const TSourceLoc& loc, const TShaderQua
     }
     if (shaderQualifiers.blendEquation)
         error(loc, message, "blend equation", "");
+    if (shaderQualifiers.numViews != TQualifier::layoutNotSet)
+        error(loc, message, "num_views", "");
 }
 
 // Correct and/or advance an object's offset layout qualifier.
@@ -6282,6 +6299,12 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con
         else
             error(loc, "can only apply to 'in'", "early_fragment_tests", "");
     }
+    if (publicType.shaderQualifiers.postDepthCoverage) {
+        if (publicType.qualifier.storage == EvqVaryingIn)
+            intermediate.setPostDepthCoverage();
+        else
+            error(loc, "can only apply to 'in'", "post_coverage_coverage", "");
+    }
     if (publicType.shaderQualifiers.blendEquation) {
         if (publicType.qualifier.storage != EvqVaryingOut)
             error(loc, "can only apply to 'out'", "blend equation", "");

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

@@ -181,9 +181,11 @@ void TParseVersions::initializeExtensionBehavior()
     extensionBehavior[E_GL_ARB_sparse_texture_clamp]         = EBhDisable;
     extensionBehavior[E_GL_ARB_shader_stencil_export]        = EBhDisable;
 //    extensionBehavior[E_GL_ARB_cull_distance]                = EBhDisable;    // present for 4.5, but need extension control over block members
+    extensionBehavior[E_GL_ARB_post_depth_coverage]          = EBhDisable;
 
     extensionBehavior[E_GL_EXT_shader_non_constant_global_initializers] = EBhDisable;
-    extensionBehavior[E_GL_EXT_shader_image_load_formatted]  = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_image_load_formatted]             = EBhDisable;
+    extensionBehavior[E_GL_EXT_post_depth_coverage]                     = EBhDisable;
 
     // #line and #include
     extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive]          = EBhDisable;
@@ -316,8 +318,10 @@ void TParseVersions::getPreamble(std::string& preamble)
             "#define GL_ARB_sparse_texture_clamp 1\n"
             "#define GL_ARB_shader_stencil_export 1\n"
 //            "#define GL_ARB_cull_distance 1\n"    // present for 4.5, but need extension control over block members
+            "#define GL_ARB_post_depth_coverage 1\n"
             "#define GL_EXT_shader_non_constant_global_initializers 1\n"
             "#define GL_EXT_shader_image_load_formatted 1\n"
+            "#define GL_EXT_post_depth_coverage 1\n"
 
 #ifdef AMD_EXTENSIONS
             "#define GL_AMD_shader_ballot 1\n"

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

@@ -135,6 +135,7 @@ const char* const E_GL_ARB_sparse_texture2              = "GL_ARB_sparse_texture
 const char* const E_GL_ARB_sparse_texture_clamp         = "GL_ARB_sparse_texture_clamp";
 const char* const E_GL_ARB_shader_stencil_export        = "GL_ARB_shader_stencil_export";
 // const char* const E_GL_ARB_cull_distance            = "GL_ARB_cull_distance";  // present for 4.5, but need extension control over block members
+const char* const E_GL_ARB_post_depth_coverage          = "GL_ARB_post_depth_coverage";
 
 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";
@@ -142,6 +143,12 @@ const char* const E_GL_EXT_shader_image_load_formatted = "GL_EXT_shader_image_lo
 // EXT extensions
 const char* const E_GL_EXT_device_group                 = "GL_EXT_device_group";
 const char* const E_GL_EXT_multiview                    = "GL_EXT_multiview";
+const char* const E_GL_EXT_post_depth_coverage          = "GL_EXT_post_depth_coverage";
+
+// Arrays of extensions for the above viewportEXTs duplications
+
+const char* const post_depth_coverageEXTs[] = { E_GL_ARB_post_depth_coverage, E_GL_EXT_post_depth_coverage };
+const int Num_post_depth_coverageEXTs = sizeof(post_depth_coverageEXTs) / sizeof(post_depth_coverageEXTs[0]);
 
 // OVR extensions
 const char* const E_GL_OVR_multiview                    = "GL_OVR_multiview";

+ 2 - 0
3rdparty/glslang/glslang/MachineIndependent/intermOut.cpp

@@ -1085,6 +1085,8 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree)
             infoSink.debug << "gl_FragCoord origin is upper left\n";
         if (earlyFragmentTests)
             infoSink.debug << "using early_fragment_tests\n";
+        if (postDepthCoverage)
+            infoSink.debug << "using post_depth_coverage\n";
         if (depthLayout != EldNone)
             infoSink.debug << "using " << TQualifier::getLayoutDepthString(depthLayout) << "\n";
         if (blendEquations != 0) {

+ 8 - 2
3rdparty/glslang/glslang/MachineIndependent/iomapper.cpp

@@ -436,7 +436,10 @@ struct TDefaultIoResolverBase : public glslang::TIoMapResolver
 
     void notifyBinding(EShLanguage, const char* /*name*/, const TType&, bool /*is_live*/) override {}
     void notifyInOut(EShLanguage, const char* /*name*/, const TType&, bool /*is_live*/) override {}
-    void endNotifications() override {}
+    void endNotifications(EShLanguage) override {}
+    void beginNotifications(EShLanguage) override {}
+    void beginResolve(EShLanguage) override {}
+    void endResolve(EShLanguage) override {}
 
 protected:
     static int getLayoutSet(const glslang::TType& type) {
@@ -704,13 +707,16 @@ bool TIoMapper::addStage(EShLanguage stage, TIntermediate &intermediate, TInfoSi
     TNotifyUniformAdaptor uniformNotify(stage, *resolver);
     TResolverUniformAdaptor uniformResolve(stage, *resolver, infoSink, hadError, intermediate);
     TResolverInOutAdaptor inOutResolve(stage, *resolver, infoSink, hadError, intermediate);
+    resolver->beginNotifications(stage);
     std::for_each(inVarMap.begin(), inVarMap.end(), inOutNotify);
     std::for_each(outVarMap.begin(), outVarMap.end(), inOutNotify);
     std::for_each(uniformVarMap.begin(), uniformVarMap.end(), uniformNotify);
-    resolver->endNotifications();
+    resolver->endNotifications(stage);
+    resolver->beginResolve(stage);
     std::for_each(inVarMap.begin(), inVarMap.end(), inOutResolve);
     std::for_each(outVarMap.begin(), outVarMap.end(), inOutResolve);
     std::for_each(uniformVarMap.begin(), uniformVarMap.end(), uniformResolve);
+    resolver->endResolve(stage);
 
     if (!hadError) {
         // sort by id again, so we can use lower bound to find entries

+ 8 - 0
3rdparty/glslang/glslang/MachineIndependent/linkValidate.cpp

@@ -101,6 +101,9 @@ void TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit)
     if (! earlyFragmentTests)
         earlyFragmentTests = unit.earlyFragmentTests;
 
+    if (!postDepthCoverage)
+        postDepthCoverage = unit.postDepthCoverage;
+
     if (depthLayout == EldNone)
         depthLayout = unit.depthLayout;
     else if (depthLayout != unit.depthLayout)
@@ -485,6 +488,11 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
             error(infoSink, "At least one shader must specify a layout(max_vertices = value)");
         break;
     case EShLangFragment:
+        // for GL_ARB_post_depth_coverage, EarlyFragmentTest is set automatically in 
+        // ParseHelper.cpp. So if we reach here, this must be GL_EXT_post_depth_coverage 
+        // requiring explicit early_fragment_tests
+        if (getPostDepthCoverage() && !getEarlyFragmentTests())
+            error(infoSink, "post_depth_coverage requires early_fragment_tests");
         break;
     case EShLangCompute:
         break;

+ 7 - 4
3rdparty/glslang/glslang/MachineIndependent/localintermediate.h

@@ -164,8 +164,8 @@ public:
         numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),
         invocations(TQualifier::layoutNotSet), vertices(TQualifier::layoutNotSet), inputPrimitive(ElgNone), outputPrimitive(ElgNone),
         pixelCenterInteger(false), originUpperLeft(false),
-        vertexSpacing(EvsNone), vertexOrder(EvoNone), pointMode(false), earlyFragmentTests(false), depthLayout(EldNone), depthReplacing(false), blendEquations(0),
-        xfbMode(false), multiStream(false),
+        vertexSpacing(EvsNone), vertexOrder(EvoNone), pointMode(false), earlyFragmentTests(false), postDepthCoverage(false), depthLayout(EldNone), depthReplacing(false),
+        blendEquations(0), xfbMode(false), multiStream(false),
 #ifdef NV_EXTENSIONS
         layoutOverrideCoverage(false),
         geoPassthroughEXT(false),
@@ -276,8 +276,8 @@ public:
     TIntermAggregate* makeAggregate(const TSourceLoc&);
     TIntermTyped* setAggregateOperator(TIntermNode*, TOperator, const TType& type, TSourceLoc);
     bool areAllChildConst(TIntermAggregate* aggrNode);
-    TIntermTyped* addSelection(TIntermTyped* cond, TIntermNodePair code, const TSourceLoc&);
-    TIntermTyped* addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock, const TSourceLoc&);
+    TIntermTyped* addSelection(TIntermTyped* cond, TIntermNodePair code, const TSourceLoc&, TSelectionControl = ESelectionControlNone);
+    TIntermTyped* addSelection(TIntermTyped* cond, TIntermTyped* trueBlock, TIntermTyped* falseBlock, const TSourceLoc&, TSelectionControl = ESelectionControlNone);
     TIntermTyped* addComma(TIntermTyped* left, TIntermTyped* right, const TSourceLoc&);
     TIntermTyped* addMethod(TIntermTyped*, const TType&, const TString*, const TSourceLoc&);
     TIntermConstantUnion* addConstantUnion(const TConstUnionArray&, const TType&, const TSourceLoc&, bool literal = false) const;
@@ -403,6 +403,8 @@ public:
     bool getPixelCenterInteger() const { return pixelCenterInteger; }
     void setEarlyFragmentTests() { earlyFragmentTests = true; }
     bool getEarlyFragmentTests() const { return earlyFragmentTests; }
+    void setPostDepthCoverage() { postDepthCoverage = true; }
+    bool getPostDepthCoverage() const { return postDepthCoverage; }
     bool setDepth(TLayoutDepth d)
     {
         if (depthLayout != EldNone)
@@ -513,6 +515,7 @@ protected:
     int localSize[3];
     int localSizeSpecId[3];
     bool earlyFragmentTests;
+    bool postDepthCoverage;
     TLayoutDepth depthLayout;
     bool depthReplacing;
     int blendEquations;        // an 'or'ing of masks of shifts of TBlendEquationShift

+ 6 - 3
3rdparty/glslang/glslang/OSDependent/Unix/CMakeLists.txt

@@ -1,5 +1,8 @@
 add_library(OSDependent STATIC ossource.cpp ../osinclude.h)
-set_property(TARGET OSDependent PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET OSDependent PROPERTY FOLDER glslang)
+set_property(TARGET OSDependent PROPERTY POSITION_INDEPENDENT_CODE ON)
 
-install(TARGETS OSDependent
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    install(TARGETS OSDependent
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+endif(ENABLE_GLSLANG_INSTALL)

+ 6 - 3
3rdparty/glslang/glslang/OSDependent/Windows/CMakeLists.txt

@@ -1,7 +1,8 @@
 set(SOURCES ossource.cpp ../osinclude.h)
 
 add_library(OSDependent STATIC ${SOURCES})
-set_property(TARGET OSDependent PROPERTY FOLDER glslang POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET OSDependent PROPERTY FOLDER glslang)
+set_property(TARGET OSDependent PROPERTY POSITION_INDEPENDENT_CODE ON)
 
 # MinGW GCC complains about function pointer casts to void*.
 # Turn that off with -fpermissive.
@@ -13,5 +14,7 @@ if(WIN32)
     source_group("Source" FILES ${SOURCES})
 endif(WIN32)
 
-install(TARGETS OSDependent
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    install(TARGETS OSDependent
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+endif(ENABLE_GLSLANG_INSTALL)

+ 9 - 3
3rdparty/glslang/glslang/Public/ShaderLang.h

@@ -362,10 +362,10 @@ public:
     void setTextureSamplerTransformMode(EShTextureSamplerTransformMode mode);
 
     // For setting up the environment (initialized in the constructor):
-    void setEnvInput(EShSource lang, EShLanguage stage, EShClient client, int version)
+    void setEnvInput(EShSource lang, EShLanguage envStage, EShClient client, int version)
     {
         environment.input.languageFamily = lang;
-        environment.input.stage = stage;
+        environment.input.stage = envStage;
         environment.input.dialect = client;
         environment.input.dialectVersion = version;
     }
@@ -583,7 +583,13 @@ public:
   // Notification of a in or out variable
   virtual void notifyInOut(EShLanguage stage, const char* name, const TType& type, bool is_live) = 0;
   // Called by mapIO when it has finished the notify pass
-  virtual void endNotifications() = 0;
+  virtual void endNotifications(EShLanguage stage) = 0;
+  // Called by mapIO when it starts its notify pass for the given stage
+  virtual void beginNotifications(EShLanguage stage) = 0;
+  // Called by mipIO when it starts its resolve pass for the given stage
+  virtual void beginResolve(EShLanguage stage) = 0;
+  // Called by mapIO when it has finished the resolve pass
+  virtual void endResolve(EShLanguage stage) = 0;
 };
 
 // Make one TProgram per set of shaders that will get linked together.  Add all

+ 4 - 2
3rdparty/glslang/gtests/CMakeLists.txt

@@ -28,8 +28,10 @@ if(BUILD_TESTING)
         add_executable(glslangtests ${TEST_SOURCES})
         set_property(TARGET glslangtests PROPERTY FOLDER tests)
         glslang_set_link_args(glslangtests)
-        install(TARGETS glslangtests
-                RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+        if(ENABLE_GLSLANG_INSTALL)
+            install(TARGETS glslangtests
+                    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+        endif(ENABLE_GLSLANG_INSTALL)
 
         set(GLSLANG_TEST_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../Test")
         # Supply a default test root directory, so that manual testing

+ 4 - 0
3rdparty/glslang/gtests/Spv.FromFile.cpp

@@ -226,6 +226,8 @@ INSTANTIATE_TEST_CASE_P(
         "spv.aggOps.frag",
         "spv.always-discard.frag",
         "spv.always-discard2.frag",
+        "spv.arbPostDepthCoverage.frag",
+        "spv.arbPostDepthCoverage_Error.frag",
         "spv.bitCast.frag",
         "spv.bool.vert",
         "spv.boolInBlock.frag",
@@ -242,6 +244,8 @@ INSTANTIATE_TEST_CASE_P(
         "spv.drawParams.vert",
         "spv.doWhileLoop.frag",
         "spv.earlyReturnDiscard.frag",
+        "spv.extPostDepthCoverage.frag",
+        "spv.extPostDepthCoverage_Error.frag",
         "spv.flowControl.frag",
         "spv.forLoop.frag",
         "spv.forwardFun.frag",

+ 6 - 3
3rdparty/glslang/hlsl/CMakeLists.txt

@@ -18,11 +18,14 @@ set(HEADERS
     hlslParseables.h)
 
 add_library(HLSL STATIC ${SOURCES} ${HEADERS})
-set_property(TARGET HLSL PROPERTY FOLDER hlsl POSITION_INDEPENDENT_CODE ON)
+set_property(TARGET HLSL PROPERTY FOLDER hlsl)
+set_property(TARGET HLSL PROPERTY POSITION_INDEPENDENT_CODE ON)
 
 if(WIN32)
     source_group("Source" FILES ${SOURCES} ${HEADERS})
 endif(WIN32)
 
-install(TARGETS HLSL
-        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+if(ENABLE_GLSLANG_INSTALL)
+    install(TARGETS HLSL
+            ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+endif(ENABLE_GLSLANG_INSTALL)

+ 11 - 23
3rdparty/glslang/hlsl/hlslGrammar.cpp

@@ -2870,23 +2870,6 @@ bool HlslGrammar::acceptPostfixExpression(TIntermTyped*& node)
         return false;
     }
 
-    // This is to guarantee we do this no matter how we get out of the stack frame.
-    // This way there's no bug if an early return forgets to do it.
-    struct tFinalize {
-        tFinalize(HlslParseContext& p) : parseContext(p) { }
-        ~tFinalize() { parseContext.finalizeFlattening(); }
-        HlslParseContext& parseContext;
-    private:
-        const tFinalize& operator=(const tFinalize&) { return *this; }
-        tFinalize(const tFinalize& f) : parseContext(f.parseContext) { }
-    } finalize(parseContext);
-
-    // Initialize the flattening accumulation data, so we can track data across multiple bracket or
-    // dot operators.  This can also be nested, e.g, for [], so we have to track each nesting
-    // level: hence the init and finalize.  Even though in practice these must be
-    // constants, they are parsed no matter what.
-    parseContext.initFlattening();
-
     // Something was found, chain as many postfix operations as exist.
     do {
         TSourceLoc loc = token.loc;
@@ -3218,10 +3201,10 @@ bool HlslGrammar::acceptStatement(TIntermNode*& statement)
         return acceptScopedCompoundStatement(statement);
 
     case EHTokIf:
-        return acceptSelectionStatement(statement);
+        return acceptSelectionStatement(statement, attributes);
 
     case EHTokSwitch:
-        return acceptSwitchStatement(statement);
+        return acceptSwitchStatement(statement, attributes);
 
     case EHTokFor:
     case EHTokDo:
@@ -3334,10 +3317,12 @@ void HlslGrammar::acceptAttributes(TAttributeMap& attributes)
 //      : IF LEFT_PAREN expression RIGHT_PAREN statement
 //      : IF LEFT_PAREN expression RIGHT_PAREN statement ELSE statement
 //
-bool HlslGrammar::acceptSelectionStatement(TIntermNode*& statement)
+bool HlslGrammar::acceptSelectionStatement(TIntermNode*& statement, const TAttributeMap& attributes)
 {
     TSourceLoc loc = token.loc;
 
+    const TSelectionControl control = parseContext.handleSelectionControl(attributes);
+
     // IF
     if (! acceptTokenClass(EHTokIf))
         return false;
@@ -3375,7 +3360,7 @@ bool HlslGrammar::acceptSelectionStatement(TIntermNode*& statement)
     }
 
     // Put the pieces together
-    statement = intermediate.addSelection(condition, thenElse, loc);
+    statement = intermediate.addSelection(condition, thenElse, loc, control);
     parseContext.popScope();
     --parseContext.controlFlowNestingLevel;
 
@@ -3385,10 +3370,13 @@ bool HlslGrammar::acceptSelectionStatement(TIntermNode*& statement)
 // switch_statement
 //      : SWITCH LEFT_PAREN expression RIGHT_PAREN compound_statement
 //
-bool HlslGrammar::acceptSwitchStatement(TIntermNode*& statement)
+bool HlslGrammar::acceptSwitchStatement(TIntermNode*& statement, const TAttributeMap& attributes)
 {
     // SWITCH
     TSourceLoc loc = token.loc;
+
+    const TSelectionControl control = parseContext.handleSelectionControl(attributes);
+
     if (! acceptTokenClass(EHTokSwitch))
         return false;
 
@@ -3408,7 +3396,7 @@ bool HlslGrammar::acceptSwitchStatement(TIntermNode*& statement)
     --parseContext.controlFlowNestingLevel;
 
     if (statementOkay)
-        statement = parseContext.addSwitch(loc, switchExpression, statement ? statement->getAsAggregate() : nullptr);
+        statement = parseContext.addSwitch(loc, switchExpression, statement ? statement->getAsAggregate() : nullptr, control);
 
     parseContext.popSwitchSequence();
     parseContext.popScope();

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

@@ -116,8 +116,8 @@ namespace glslang {
         bool acceptStatement(TIntermNode*&);
         bool acceptNestedStatement(TIntermNode*&);
         void acceptAttributes(TAttributeMap&);
-        bool acceptSelectionStatement(TIntermNode*&);
-        bool acceptSwitchStatement(TIntermNode*&);
+        bool acceptSelectionStatement(TIntermNode*&, const TAttributeMap&);
+        bool acceptSwitchStatement(TIntermNode*&, const TAttributeMap&);
         bool acceptIterationStatement(TIntermNode*&, const TAttributeMap&);
         bool acceptJumpStatement(TIntermNode*&);
         bool acceptCaseLabel(TIntermNode*&);

+ 84 - 33
3rdparty/glslang/hlsl/hlslParseHelper.cpp

@@ -1348,11 +1348,11 @@ TIntermTyped* HlslParseContext::flattenAccess(TIntermTyped* base, int member)
     const TType dereferencedType(base->getType(), member);  // dereferenced type
     const TIntermSymbol& symbolNode = *base->getAsSymbolNode();
 
-    TIntermTyped* flattened = flattenAccess(symbolNode.getId(), member, dereferencedType);
+    TIntermTyped* flattened = flattenAccess(symbolNode.getId(), member, dereferencedType, symbolNode.getFlattenSubset());
 
     return flattened ? flattened : base;
 }
-TIntermTyped* HlslParseContext::flattenAccess(int uniqueId, int member, const TType& dereferencedType)
+TIntermTyped* HlslParseContext::flattenAccess(int uniqueId, int member, const TType& dereferencedType, int subset)
 {
     const auto flattenData = flattenMap.find(uniqueId);
 
@@ -1360,18 +1360,24 @@ TIntermTyped* HlslParseContext::flattenAccess(int uniqueId, int member, const TT
         return nullptr;
 
     // Calculate new cumulative offset from the packed tree
-    flattenOffset.back() = flattenData->second.offsets[flattenOffset.back() + member];
+    int newSubset = flattenData->second.offsets[subset >= 0 ? subset + member : member];
 
+    TIntermSymbol* subsetSymbol;
     if (isFinalFlattening(dereferencedType)) {
         // Finished flattening: create symbol for variable
-        member = flattenData->second.offsets[flattenOffset.back()];
+        member = flattenData->second.offsets[newSubset];
         const TVariable* memberVariable = flattenData->second.members[member];
-        return intermediate.addSymbol(*memberVariable);
+        subsetSymbol = intermediate.addSymbol(*memberVariable);
+        subsetSymbol->setFlattenSubset(-1);
     } else {
+
         // If this is not the final flattening, accumulate the position and return
         // an object of the partially dereferenced type.
-        return new TIntermSymbol(uniqueId, "flattenShadow", dereferencedType);
+        subsetSymbol = new TIntermSymbol(uniqueId, "flattenShadow", dereferencedType);
+        subsetSymbol->setFlattenSubset(newSubset);
     }
+
+    return subsetSymbol;
 }
 
 // Find and return the split IO TVariable for id, or nullptr if none.
@@ -1753,11 +1759,9 @@ TIntermAggregate* HlslParseContext::handleFunctionDefinition(const TSourceLoc& l
                 flatten(loc, *variable);
                 const TTypeList* structure = variable->getType().getStruct();
                 for (int mem = 0; mem < (int)structure->size(); ++mem) {
-                    initFlattening();
                     paramNodes = intermediate.growAggregate(paramNodes,
                                                             flattenAccess(variable->getUniqueId(), mem, *(*structure)[mem].type),
                                                             loc);
-                    finalizeFlattening();
                 }
             } else {
                 // Add the parameter to the AST
@@ -2482,7 +2486,8 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
                 TIntermTyped* noFlattenRHS = intermediate.addSymbol(*rhsTempVar, loc);
 
                 // Add this to the aggregate being built.
-                assignList = intermediate.growAggregate(assignList, intermediate.addAssign(op, noFlattenRHS, right, loc), loc);
+                assignList = intermediate.growAggregate(assignList,
+                                                        intermediate.addAssign(op, noFlattenRHS, right, loc), loc);
             }
         }
     }
@@ -2498,7 +2503,8 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
     const TIntermTyped* outerLeft  = left;
     const TIntermTyped* outerRight = right;
 
-    const auto getMember = [&](bool isLeft, TIntermTyped* node, int member, TIntermTyped* splitNode, int splitMember) -> TIntermTyped * {
+    const auto getMember = [&](bool isLeft, TIntermTyped* node, int member, TIntermTyped* splitNode, int splitMember)
+                           -> TIntermTyped * {
         TIntermTyped* subTree;
 
         const bool flattened      = isLeft ? isFlattenLeft : isFlattenRight;
@@ -2514,12 +2520,15 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
 
         if (split && derefType.isBuiltInInterstageIO(language)) {
             // copy from interstage IO builtin if needed
-            subTree = intermediate.addSymbol(*interstageBuiltInIo.find(HlslParseContext::tInterstageIoData(derefType, outer->getType()))->second);
+            subTree = intermediate.addSymbol(*interstageBuiltInIo.find(
+                                             HlslParseContext::tInterstageIoData(derefType, outer->getType()))->second);
 
-            // Arrayness of builtIn symbols isn't handled by the normal recursion: it's been extracted and moved to the builtin.
+            // Arrayness of builtIn symbols isn't handled by the normal recursion:
+            // it's been extracted and moved to the builtin.
             if (subTree->getType().isArray() && !arrayElement.empty()) {
                 const TType splitDerefType(subTree->getType(), arrayElement.back());
-                subTree = intermediate.addIndex(EOpIndexDirect, subTree, intermediate.addConstantUnion(arrayElement.back(), loc), loc);
+                subTree = intermediate.addIndex(EOpIndexDirect, subTree,
+                                                intermediate.addConstantUnion(arrayElement.back(), loc), loc);
                 subTree->setType(splitDerefType);
             }
         } else if (flattened && isFinalFlattening(derefType)) {
@@ -2540,8 +2549,8 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
 
     // Use the proper RHS node: a new symbol from a TVariable, copy
     // of an TIntermSymbol node, or sometimes the right node directly.
-    right = rhsTempVar   ? intermediate.addSymbol(*rhsTempVar, loc) :
-            cloneSymNode ? intermediate.addSymbol(*cloneSymNode) :
+    right = rhsTempVar != nullptr   ? intermediate.addSymbol(*rhsTempVar, loc) :
+            cloneSymNode != nullptr ? intermediate.addSymbol(*cloneSymNode) :
             right;
 
     // Cannot use auto here, because this is recursive, and auto can't work out the type without seeing the
@@ -2566,8 +2575,10 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
                 TIntermTyped* subLeft  = getMember(true,  left,  element, left, element);
                 TIntermTyped* subRight = getMember(false, right, element, right, element);
 
-                TIntermTyped* subSplitLeft =  isSplitLeft  ? getMember(true,  left,  element, splitLeft, element) : subLeft;
-                TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right, element, splitRight, element) : subRight; 
+                TIntermTyped* subSplitLeft =  isSplitLeft  ? getMember(true,  left,  element, splitLeft, element)
+                                                           : subLeft;
+                TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right, element, splitRight, element)
+                                                           : subRight;
 
                 traverse(subLeft, subRight, subSplitLeft, subSplitRight);
 
@@ -2595,8 +2606,10 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
                 TIntermTyped* subRight = getMember(false, right, member, right, member);
 
                 // If there is no splitting, use the same values to avoid inefficiency.
-                TIntermTyped* subSplitLeft =  isSplitLeft  ? getMember(true,  left,  member, splitLeft, memberL) : subLeft;
-                TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right, member, splitRight, memberR) : subRight;
+                TIntermTyped* subSplitLeft =  isSplitLeft  ? getMember(true,  left,  member, splitLeft, memberL)
+                                                           : subLeft;
+                TIntermTyped* subSplitRight = isSplitRight ? getMember(false, right, member, splitRight, memberR)
+                                                           : subRight;
 
                 const TBuiltInVariable leftBuiltIn = subSplitLeft->getType().getQualifier().builtIn;
 
@@ -2604,16 +2617,22 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
 
                     // Clip and cull distance builtin assignment is complex in its own right, and is handled in
                     // a separate function dedicated to that task.  See comment above assignClipCullDistance;
-                    assignList = intermediate.growAggregate(assignList, assignClipCullDistance(loc, op, subSplitLeft, subSplitRight), loc);
-                } else if ((!isFlattenLeft && !isFlattenRight &&
-                            !typeL.containsBuiltInInterstageIO(language) && !typeR.containsBuiltInInterstageIO(language))) {
-                    // If this is the final flattening (no nested types below to flatten) we'll copy the member, else
-                    // recurse into the type hierarchy.  However, if splitting the struct, that means we can copy a whole
-                    // subtree here IFF it does not itself contain any interstage built-in IO variables, so we only have to
-                    // recurse into it if there's something for splitting to do.  That can save a lot of AST verbosity for
+                    assignList = intermediate.growAggregate(assignList, assignClipCullDistance(loc, op, subSplitLeft,
+                                                                                               subSplitRight), loc);
+                } else if (!isFlattenLeft && !isFlattenRight &&
+                           !typeL.containsBuiltInInterstageIO(language) &&
+                           !typeR.containsBuiltInInterstageIO(language)) {
+                    // If this is the final flattening (no nested types below to flatten)
+                    // we'll copy the member, else recurse into the type hierarchy.
+                    // However, if splitting the struct, that means we can copy a whole
+                    // subtree here IFF it does not itself contain any interstage built-in
+                    // IO variables, so we only have to recurse into it if there's something
+                    // for splitting to do.  That can save a lot of AST verbosity for
                     // a bunch of memberwise copies.
 
-                    assignList = intermediate.growAggregate(assignList, intermediate.addAssign(op, subSplitLeft, subSplitRight, loc), loc);
+                    assignList = intermediate.growAggregate(assignList,
+                                                            intermediate.addAssign(op, subSplitLeft, subSplitRight, loc),
+                                                            loc);
                 } else {
                     traverse(subLeft, subRight, subSplitLeft, subSplitRight);
                 }
@@ -4082,6 +4101,28 @@ void HlslParseContext::decomposeIntrinsic(const TSourceLoc& loc, TIntermTyped*&
             break;
         }
 
+    case EOpAny: // fall through
+    case EOpAll:
+        {
+            TIntermTyped* typedArg = arguments->getAsTyped();
+
+            // HLSL allows float/etc types here, and the SPIR-V opcode requires a bool.
+            // We'll convert here.  Note that for efficiency, we could add a smarter
+            // decomposition for some type cases, e.g, maybe by decomposing a dot product.
+            if (typedArg->getType().getBasicType() != EbtBool) {
+                const TType boolType(EbtBool, EvqTemporary,
+                                     typedArg->getVectorSize(),
+                                     typedArg->getMatrixCols(),
+                                     typedArg->getMatrixRows(),
+                                     typedArg->isVector());
+
+                typedArg = intermediate.addConversion(EOpConstructBool, boolType, typedArg);
+                node->getAsUnaryNode()->setOperand(typedArg);
+            }
+
+            break;
+        }
+
     case EOpSaturate:
         {
             // saturate(a) -> clamp(a,0,1)
@@ -4893,11 +4934,8 @@ void HlslParseContext::expandArguments(const TSourceLoc& loc, const TFunction& f
         if (wasFlattened(arg) && shouldFlatten(*function[param].type)) {
             // Need to pass the structure members instead of the structure.
             TVector<TIntermTyped*> memberArgs;
-            for (int memb = 0; memb < (int)arg->getType().getStruct()->size(); ++memb) {
-                initFlattening();
+            for (int memb = 0; memb < (int)arg->getType().getStruct()->size(); ++memb)
                 memberArgs.push_back(flattenAccess(arg, memb));
-                finalizeFlattening();
-            }
             setArgList(param + functionParamNumberOffset, memberArgs);
         }
     }
@@ -8242,6 +8280,19 @@ bool HlslParseContext::handleOutputGeometry(const TSourceLoc& loc, const TLayout
     return true;
 }
 
+//
+// Selection hints
+//
+TSelectionControl HlslParseContext::handleSelectionControl(const TAttributeMap& attributes) const
+{
+    if (attributes.contains(EatFlatten))
+        return ESelectionControlFlatten;
+    else if (attributes.contains(EatBranch))
+        return ESelectionControlDontFlatten;
+    else
+        return ESelectionControlNone;
+}
+
 //
 // Loop hints
 //
@@ -8255,7 +8306,6 @@ TLoopControl HlslParseContext::handleLoopControl(const TAttributeMap& attributes
         return ELoopControlNone;
 }
 
-
 //
 // Updating default qualifier for the case of a declaration with just a qualifier,
 // no type, block, or identifier.
@@ -8394,7 +8444,7 @@ void HlslParseContext::wrapupSwitchSubsequence(TIntermAggregate* statements, TIn
 // Turn the top-level node sequence built up of wrapupSwitchSubsequence
 // into a switch node.
 //
-TIntermNode* HlslParseContext::addSwitch(const TSourceLoc& loc, TIntermTyped* expression, TIntermAggregate* lastStatements)
+TIntermNode* HlslParseContext::addSwitch(const TSourceLoc& loc, TIntermTyped* expression, TIntermAggregate* lastStatements, TSelectionControl control)
 {
     wrapupSwitchSubsequence(lastStatements, nullptr);
 
@@ -8421,6 +8471,7 @@ TIntermNode* HlslParseContext::addSwitch(const TSourceLoc& loc, TIntermTyped* ex
 
     TIntermSwitch* switchNode = new TIntermSwitch(expression, body);
     switchNode->setLoc(loc);
+    switchNode->setSelectionControl(control);
 
     return switchNode;
 }

+ 5 - 7
3rdparty/glslang/hlsl/hlslParseHelper.h

@@ -159,7 +159,7 @@ public:
     void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);
     void updateStandaloneQualifierDefaults(const TSourceLoc&, const TPublicType&);
     void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode);
-    TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body);
+    TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body, TSelectionControl control);
 
     void updateImplicitArraySize(const TSourceLoc&, TIntermNode*, int index);
 
@@ -198,16 +198,15 @@ public:
     bool handleOutputGeometry(const TSourceLoc&, const TLayoutGeometry& geometry);
     bool handleInputGeometry(const TSourceLoc&, const TLayoutGeometry& geometry);
 
+    // Determine selection control from attributes
+    TSelectionControl handleSelectionControl(const TAttributeMap& attributes) const;
+
     // Determine loop control from attributes
     TLoopControl handleLoopControl(const TAttributeMap& attributes) const;
 
     // Potentially rename shader entry point function
     void renameShaderFunction(const TString*& name) const;
 
-    // Reset data for incrementally built referencing of flattened composite structures
-    void initFlattening() { flattenLevel.push_back(0); flattenOffset.push_back(0); }
-    void finalizeFlattening() { flattenLevel.pop_back(); flattenOffset.pop_back(); }
-
     // Share struct buffer deep types
     void shareStructBufferType(TType&);
 
@@ -242,7 +241,7 @@ protected:
 
     // Array and struct flattening
     TIntermTyped* flattenAccess(TIntermTyped* base, int member);
-    TIntermTyped* flattenAccess(int uniqueId, int member, const TType&);
+    TIntermTyped* flattenAccess(int uniqueId, int member, const TType&, int subset = -1);
     bool shouldFlatten(const TType&) const;
     bool wasFlattened(const TIntermTyped* node) const;
     bool wasFlattened(int id) const { return flattenMap.find(id) != flattenMap.end(); }
@@ -368,7 +367,6 @@ protected:
 
     TMap<int, TFlattenData> flattenMap;
     TVector<int> flattenLevel;  // nested postfix operator level for flattening
-    TVector<int> flattenOffset; // cumulative offset for flattening
 
     // IO-type map. Maps a pure symbol-table form of a structure-member list into
     // each of the (up to) three kinds of IO, as each as different allowed decorations,

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików