Branimir Karadžić 9 лет назад
Родитель
Сommit
38efe9a41f
35 измененных файлов с 866 добавлено и 114 удалено
  1. 11 2
      3rdparty/glslang/SPIRV/GLSL.ext.NV.h
  2. 23 1
      3rdparty/glslang/SPIRV/GlslangToSpv.cpp
  3. 1 1
      3rdparty/glslang/SPIRV/GlslangToSpv.h
  4. 53 15
      3rdparty/glslang/SPIRV/SpvBuilder.cpp
  5. 7 2
      3rdparty/glslang/SPIRV/disassemble.cpp
  6. 4 2
      3rdparty/glslang/SPIRV/doc.cpp
  7. 16 2
      3rdparty/glslang/StandAlone/StandAlone.cpp
  8. 4 4
      3rdparty/glslang/Test/baseResults/310.comp.out
  9. 5 5
      3rdparty/glslang/Test/baseResults/310.frag.out
  10. 10 10
      3rdparty/glslang/Test/baseResults/310.tesc.out
  11. 8 8
      3rdparty/glslang/Test/baseResults/310.tese.out
  12. 1 1
      3rdparty/glslang/Test/baseResults/420.vert.out
  13. 1 1
      3rdparty/glslang/Test/baseResults/spv.140.frag.out
  14. 1 1
      3rdparty/glslang/Test/baseResults/spv.300layout.vert.out
  15. 352 0
      3rdparty/glslang/Test/baseResults/spv.image.load-formatted.frag.out
  16. 28 1
      3rdparty/glslang/Test/baseResults/spv.matrix.frag.out
  17. 78 0
      3rdparty/glslang/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out
  18. 62 0
      3rdparty/glslang/Test/baseResults/spv.multiviewPerViewAttributes.vert.out
  19. 2 2
      3rdparty/glslang/Test/baseResults/spv.shaderGroupVote.comp.out
  20. 27 25
      3rdparty/glslang/Test/baseResults/spv.stereoViewRendering.tesc.out
  21. 1 1
      3rdparty/glslang/Test/spv.140.frag
  22. 1 1
      3rdparty/glslang/Test/spv.300layout.vert
  23. 74 0
      3rdparty/glslang/Test/spv.image.load-formatted.frag
  24. 3 0
      3rdparty/glslang/Test/spv.matrix.frag
  25. 14 0
      3rdparty/glslang/Test/spv.multiviewPerViewAttributes.tesc
  26. 10 0
      3rdparty/glslang/Test/spv.multiviewPerViewAttributes.vert
  27. 4 0
      3rdparty/glslang/glslang/Include/BaseTypes.h
  28. 2 0
      3rdparty/glslang/glslang/Include/Types.h
  29. 2 2
      3rdparty/glslang/glslang/Include/revision.h
  30. 31 13
      3rdparty/glslang/glslang/MachineIndependent/Initialize.cpp
  31. 19 10
      3rdparty/glslang/glslang/MachineIndependent/ParseHelper.cpp
  32. 3 0
      3rdparty/glslang/glslang/MachineIndependent/Versions.cpp
  33. 2 0
      3rdparty/glslang/glslang/MachineIndependent/Versions.h
  34. 2 0
      3rdparty/glslang/gtests/Spv.FromFile.cpp
  35. 4 4
      3rdparty/glslang/hlsl/hlslParseHelper.cpp

+ 11 - 2
3rdparty/glslang/SPIRV/GLSL.ext.NV.h

@@ -1,5 +1,5 @@
 /*
 /*
-** Copyright (c) 2014-2016 The Khronos Group Inc.
+** Copyright (c) 2014-2017 The Khronos Group Inc.
 **
 **
 ** Permission is hereby granted, free of charge, to any person obtaining a copy
 ** Permission is hereby granted, free of charge, to any person obtaining a copy
 ** of this software and/or associated documentation files (the "Materials"),
 ** of this software and/or associated documentation files (the "Materials"),
@@ -33,7 +33,7 @@ enum Op;
 enum Capability;
 enum Capability;
 
 
 static const int GLSLextNVVersion = 100;
 static const int GLSLextNVVersion = 100;
-static const int GLSLextNVRevision = 4;
+static const int GLSLextNVRevision = 5;
 
 
 //SPV_NV_sample_mask_override_coverage
 //SPV_NV_sample_mask_override_coverage
 const char* const E_SPV_NV_sample_mask_override_coverage = "SPV_NV_sample_mask_override_coverage";
 const char* const E_SPV_NV_sample_mask_override_coverage = "SPV_NV_sample_mask_override_coverage";
@@ -71,4 +71,13 @@ static const BuiltIn BuiltInSecondaryViewportMaskNV = static_cast<BuiltIn>(5258)
 
 
 static const Capability CapabilityShaderStereoViewNV = static_cast<Capability>(5259);
 static const Capability CapabilityShaderStereoViewNV = static_cast<Capability>(5259);
 
 
+
+//SPV_NVX_multiview_per_view_attributes
+const char* const E_SPV_NVX_multiview_per_view_attributes = "SPV_NVX_multiview_per_view_attributes";
+
+static const BuiltIn BuiltInPositionPerViewNV = static_cast<BuiltIn>(5260);
+static const BuiltIn BuiltInViewportMaskPerViewNV = static_cast<BuiltIn>(5261);
+
+static const Capability CapabilityPerViewAttributesNV = static_cast<Capability>(5262);
+
 #endif  // #ifndef GLSLextNV_H
 #endif  // #ifndef GLSLextNV_H

+ 23 - 1
3rdparty/glslang/SPIRV/GlslangToSpv.cpp

@@ -642,6 +642,14 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI
         builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);
         builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);
         builder.addCapability(spv::CapabilityShaderStereoViewNV);
         builder.addCapability(spv::CapabilityShaderStereoViewNV);
         return spv::BuiltInSecondaryViewportMaskNV;
         return spv::BuiltInSecondaryViewportMaskNV;
+    case glslang::EbvPositionPerViewNV:
+        builder.addExtension(spv::E_SPV_NVX_multiview_per_view_attributes);
+        builder.addCapability(spv::CapabilityPerViewAttributesNV);
+        return spv::BuiltInPositionPerViewNV;
+    case glslang::EbvViewportMaskPerViewNV:
+        builder.addExtension(spv::E_SPV_NVX_multiview_per_view_attributes);
+        builder.addCapability(spv::CapabilityPerViewAttributesNV);
+        return spv::BuiltInViewportMaskPerViewNV;
 #endif 
 #endif 
     default:                               return spv::BuiltInMax;
     default:                               return spv::BuiltInMax;
     }
     }
@@ -2384,6 +2392,11 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type,
                     builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);
                     builder.addExtension(spv::E_SPV_NV_stereo_view_rendering);
                 }
                 }
             }
             }
+            if (glslangMember.getQualifier().layoutPassthrough) {
+                addMemberDecoration(spvType, member, (spv::Decoration)spv::DecorationPassthroughNV);
+                builder.addCapability(spv::CapabilityGeometryShaderPassthroughNV);
+                builder.addExtension(spv::E_SPV_NV_geometry_shader_passthrough);
+            }
 #endif
 #endif
         }
         }
     }
     }
@@ -2661,6 +2674,8 @@ void TGlslangToSpvTraverser::declareUseOfStructMember(const glslang::TTypeList&
     case glslang::EbvViewportMaskNV:
     case glslang::EbvViewportMaskNV:
     case glslang::EbvSecondaryPositionNV:
     case glslang::EbvSecondaryPositionNV:
     case glslang::EbvSecondaryViewportMaskNV:
     case glslang::EbvSecondaryViewportMaskNV:
+    case glslang::EbvPositionPerViewNV:
+    case glslang::EbvViewportMaskPerViewNV:
 #endif
 #endif
         // Generate the associated capability.  Delegate to TranslateBuiltInDecoration.
         // Generate the associated capability.  Delegate to TranslateBuiltInDecoration.
         // Alternately, we could just call this for any glslang built-in, since the
         // Alternately, we could just call this for any glslang built-in, since the
@@ -5312,11 +5327,15 @@ void OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName)
 }
 }
 
 
 // Write SPIR-V out to a text file with 32-bit hexadecimal words
 // Write SPIR-V out to a text file with 32-bit hexadecimal words
-void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName)
+void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName, const char* varName)
 {
 {
     std::ofstream out;
     std::ofstream out;
     out.open(baseName, std::ios::binary | std::ios::out);
     out.open(baseName, std::ios::binary | std::ios::out);
     out << "\t// " GLSLANG_REVISION " " GLSLANG_DATE << std::endl;
     out << "\t// " GLSLANG_REVISION " " GLSLANG_DATE << std::endl;
+    if (varName != nullptr) {
+        out << "\t #pragma once" << std::endl;
+        out << "const uint32_t " << varName << "[] = {" << std::endl;
+    }
     const int WORDS_PER_LINE = 8;
     const int WORDS_PER_LINE = 8;
     for (int i = 0; i < (int)spirv.size(); i += WORDS_PER_LINE) {
     for (int i = 0; i < (int)spirv.size(); i += WORDS_PER_LINE) {
         out << "\t";
         out << "\t";
@@ -5329,6 +5348,9 @@ void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName)
         }
         }
         out << std::endl;
         out << std::endl;
     }
     }
+    if (varName != nullptr) {
+        out << "};";
+    }
     out.close();
     out.close();
 }
 }
 
 

+ 1 - 1
3rdparty/glslang/SPIRV/GlslangToSpv.h

@@ -49,6 +49,6 @@ void GetSpirvVersion(std::string&);
 void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv);
 void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv);
 void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, spv::SpvBuildLogger* logger);
 void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, spv::SpvBuildLogger* logger);
 void OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName);
 void OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName);
-void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName);
+void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName, const char* varName);
 
 
 }
 }

+ 53 - 15
3rdparty/glslang/SPIRV/SpvBuilder.cpp

@@ -1832,34 +1832,72 @@ Id Builder::createConstructor(Decoration precision, const std::vector<Id>& sourc
     if (sources.size() == 1 && isScalar(sources[0]) && numTargetComponents > 1)
     if (sources.size() == 1 && isScalar(sources[0]) && numTargetComponents > 1)
         return smearScalar(precision, sources[0], resultTypeId);
         return smearScalar(precision, sources[0], resultTypeId);
 
 
+    // accumulate the arguments for OpCompositeConstruct
+    std::vector<Id> constituents;
     Id scalarTypeId = getScalarTypeId(resultTypeId);
     Id scalarTypeId = getScalarTypeId(resultTypeId);
-    std::vector<Id> constituents;  // accumulate the arguments for OpCompositeConstruct
-    for (unsigned int i = 0; i < sources.size(); ++i) {
-        assert(! isAggregate(sources[i]));
-        unsigned int sourceSize = getNumComponents(sources[i]);
+
+    // lambda to store the result of visiting an argument component
+    const auto latchResult = [&](Id comp) {
+        if (numTargetComponents > 1)
+            constituents.push_back(comp);
+        else
+            result = comp;
+        ++targetComponent;
+    };
+
+    // lambda to visit a vector argument's components
+    const auto accumulateVectorConstituents = [&](Id sourceArg) {
+        unsigned int sourceSize = getNumComponents(sourceArg);
         unsigned int sourcesToUse = sourceSize;
         unsigned int sourcesToUse = sourceSize;
         if (sourcesToUse + targetComponent > numTargetComponents)
         if (sourcesToUse + targetComponent > numTargetComponents)
             sourcesToUse = numTargetComponents - targetComponent;
             sourcesToUse = numTargetComponents - targetComponent;
 
 
         for (unsigned int s = 0; s < sourcesToUse; ++s) {
         for (unsigned int s = 0; s < sourcesToUse; ++s) {
-            Id arg = sources[i];
-            if (sourceSize > 1) {
-                std::vector<unsigned> swiz;
-                swiz.push_back(s);
-                arg = createRvalueSwizzle(precision, scalarTypeId, arg, swiz);
-            }
+            std::vector<unsigned> swiz;
+            swiz.push_back(s);
+            latchResult(createRvalueSwizzle(precision, scalarTypeId, sourceArg, swiz));
+        }
+    };
 
 
-            if (numTargetComponents > 1)
-                constituents.push_back(arg);
-            else
-                result = arg;
-            ++targetComponent;
+    // lambda to visit a matrix argument's components
+    const auto accumulateMatrixConstituents = [&](Id sourceArg) {
+        unsigned int sourceSize = getNumColumns(sourceArg) * getNumRows(sourceArg);
+        unsigned int sourcesToUse = sourceSize;
+        if (sourcesToUse + targetComponent > numTargetComponents)
+            sourcesToUse = numTargetComponents - targetComponent;
+
+        int col = 0;
+        int row = 0;
+        for (unsigned int s = 0; s < sourcesToUse; ++s) {
+            if (row >= getNumRows(sourceArg)) {
+                row = 0;
+                col++;
+            }
+            std::vector<Id> indexes;
+            indexes.push_back(col);
+            indexes.push_back(row);
+            latchResult(createCompositeExtract(sourceArg, scalarTypeId, indexes));
+            row++;
         }
         }
+    };
+
+    // Go through the source arguments, each one could have either
+    // a single or multiple components to contribute.
+    for (unsigned int i = 0; i < sources.size(); ++i) {
+        if (isScalar(sources[i]))
+            latchResult(sources[i]);
+        else if (isVector(sources[i]))
+            accumulateVectorConstituents(sources[i]);
+        else if (isMatrix(sources[i]))
+            accumulateMatrixConstituents(sources[i]);
+        else
+            assert(0);
 
 
         if (targetComponent >= numTargetComponents)
         if (targetComponent >= numTargetComponents)
             break;
             break;
     }
     }
 
 
+    // If the result is a vector, make it from the gathered constituents.
     if (constituents.size() > 0)
     if (constituents.size() > 0)
         result = createCompositeConstruct(resultTypeId, constituents);
         result = createCompositeConstruct(resultTypeId, constituents);
 
 

+ 7 - 2
3rdparty/glslang/SPIRV/disassemble.cpp

@@ -483,7 +483,8 @@ void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode,
 #ifdef NV_EXTENSIONS
 #ifdef NV_EXTENSIONS
                 }else if (strcmp(spv::E_SPV_NV_sample_mask_override_coverage, name) == 0 ||
                 }else if (strcmp(spv::E_SPV_NV_sample_mask_override_coverage, name) == 0 ||
                           strcmp(spv::E_SPV_NV_geometry_shader_passthrough, name) == 0 ||
                           strcmp(spv::E_SPV_NV_geometry_shader_passthrough, name) == 0 ||
-                          strcmp(spv::E_SPV_NV_viewport_array2, name) == 0) {
+                          strcmp(spv::E_SPV_NV_viewport_array2, name) == 0 ||
+                          strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0) {
                     extInstSet = GLSLextNVInst;
                     extInstSet = GLSLextNVInst;
 #endif
 #endif
                 }
                 }
@@ -659,7 +660,8 @@ static const char* GLSLextNVGetDebugNames(const char* name, unsigned entrypoint)
     if (strcmp(name, spv::E_SPV_NV_sample_mask_override_coverage) == 0 ||
     if (strcmp(name, spv::E_SPV_NV_sample_mask_override_coverage) == 0 ||
         strcmp(name, spv::E_SPV_NV_geometry_shader_passthrough) == 0 ||
         strcmp(name, spv::E_SPV_NV_geometry_shader_passthrough) == 0 ||
         strcmp(name, spv::E_ARB_shader_viewport_layer_array) == 0 ||
         strcmp(name, spv::E_ARB_shader_viewport_layer_array) == 0 ||
-        strcmp(name, spv::E_SPV_NV_viewport_array2) == 0){
+        strcmp(name, spv::E_SPV_NV_viewport_array2) == 0 ||
+        strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0) {
         switch (entrypoint) {
         switch (entrypoint) {
         case DecorationOverrideCoverageNV:          return "OverrideCoverageNV";
         case DecorationOverrideCoverageNV:          return "OverrideCoverageNV";
         case DecorationPassthroughNV:               return "PassthroughNV";
         case DecorationPassthroughNV:               return "PassthroughNV";
@@ -671,6 +673,9 @@ static const char* GLSLextNVGetDebugNames(const char* name, unsigned entrypoint)
         case BuiltInSecondaryPositionNV:            return "SecondaryPositionNV";
         case BuiltInSecondaryPositionNV:            return "SecondaryPositionNV";
         case BuiltInSecondaryViewportMaskNV:        return "SecondaryViewportMaskNV";
         case BuiltInSecondaryViewportMaskNV:        return "SecondaryViewportMaskNV";
         case CapabilityShaderStereoViewNV:          return "ShaderStereoViewNV";
         case CapabilityShaderStereoViewNV:          return "ShaderStereoViewNV";
+        case BuiltInPositionPerViewNV:              return "PositionPerViewNV";
+        case BuiltInViewportMaskPerViewNV:          return "ViewportMaskPerViewNV";
+        case CapabilityPerViewAttributesNV:         return "PerViewAttributesNV";
         default:                                    return "Bad";
         default:                                    return "Bad";
         }
         }
     }
     }

+ 4 - 2
3rdparty/glslang/SPIRV/doc.cpp

@@ -344,6 +344,8 @@ const char* BuiltInString(int builtIn)
     case 5253: return "ViewportMaskNV";
     case 5253: return "ViewportMaskNV";
     case 5257: return "SecondaryPositionNV";
     case 5257: return "SecondaryPositionNV";
     case 5258: return "SecondaryViewportMaskNV";
     case 5258: return "SecondaryViewportMaskNV";
+    case 5260: return "PositionPerViewNV";
+    case 5261: return "ViewportMaskPerViewNV";
 #endif
 #endif
     }
     }
 }
 }
@@ -1169,8 +1171,8 @@ const char* OpcodeString(int op)
 
 
     case 4421: return "OpSubgroupBallotKHR";
     case 4421: return "OpSubgroupBallotKHR";
     case 4422: return "OpSubgroupFirstInvocationKHR";
     case 4422: return "OpSubgroupFirstInvocationKHR";
-    case 4428: return "OpSubgroupAnyKHR";
-    case 4429: return "OpSubgroupAllKHR";
+    case 4428: return "OpSubgroupAllKHR";
+    case 4429: return "OpSubgroupAnyKHR";
     case 4430: return "OpSubgroupAllEqualKHR";
     case 4430: return "OpSubgroupAllEqualKHR";
     case 4432: return "OpSubgroupReadInvocationKHR";
     case 4432: return "OpSubgroupReadInvocationKHR";
 
 

+ 16 - 2
3rdparty/glslang/StandAlone/StandAlone.cpp

@@ -163,6 +163,7 @@ const char* binaryFileName = nullptr;
 const char* entryPointName = nullptr;
 const char* entryPointName = nullptr;
 const char* sourceEntryPointName = nullptr;
 const char* sourceEntryPointName = nullptr;
 const char* shaderStageName = nullptr;
 const char* shaderStageName = nullptr;
+const char* variableName = nullptr;
 
 
 std::array<unsigned int, EShLangCount> baseSamplerBinding;
 std::array<unsigned int, EShLangCount> baseSamplerBinding;
 std::array<unsigned int, EShLangCount> baseTextureBinding;
 std::array<unsigned int, EShLangCount> baseTextureBinding;
@@ -302,7 +303,18 @@ void ProcessArguments(int argc, char* argv[])
                     } else if (lowerword == "no-storage-format" || // synonyms
                     } else if (lowerword == "no-storage-format" || // synonyms
                                lowerword == "nsf") {
                                lowerword == "nsf") {
                         Options |= EOptionNoStorageFormat;
                         Options |= EOptionNoStorageFormat;
-                    } else if (lowerword == "source-entrypoint" || // synonyms
+                    } else if (lowerword == "variable-name" || // synonyms
+                        lowerword == "vn") {
+                        Options |= EOptionOutputHexadecimal;
+                        variableName = argv[1];
+                        if (argc > 0) {
+                            argc--;
+                            argv++;
+                        } else
+                            Error("no <C-variable-name> provided for --variable-name");
+                        break;
+                    }
+                    else if (lowerword == "source-entrypoint" || // synonyms
                                lowerword == "sep") {
                                lowerword == "sep") {
                         sourceEntryPointName = argv[1];
                         sourceEntryPointName = argv[1];
                         if (argc > 0) {
                         if (argc > 0) {
@@ -650,7 +662,7 @@ void CompileAndLinkShaderUnits(std::vector<ShaderCompUnit> compUnits)
                     if (! (Options & EOptionMemoryLeakMode)) {
                     if (! (Options & EOptionMemoryLeakMode)) {
                         printf("%s", logger.getAllMessages().c_str());
                         printf("%s", logger.getAllMessages().c_str());
                         if (Options & EOptionOutputHexadecimal) {
                         if (Options & EOptionOutputHexadecimal) {
-                            glslang::OutputSpvHex(spirv, GetBinaryName((EShLanguage)stage));
+							glslang::OutputSpvHex(spirv, GetBinaryName((EShLanguage)stage), variableName);
                         } else {
                         } else {
                             glslang::OutputSpvBin(spirv, GetBinaryName((EShLanguage)stage));
                             glslang::OutputSpvBin(spirv, GetBinaryName((EShLanguage)stage));
                         }
                         }
@@ -987,6 +999,8 @@ void usage()
            "\n"
            "\n"
            "  --keep-uncalled                         don't eliminate uncalled functions when linking\n"
            "  --keep-uncalled                         don't eliminate uncalled functions when linking\n"
            "  --ku                                    synonym for --keep-uncalled\n"
            "  --ku                                    synonym for --keep-uncalled\n"
+		   "  --variable-name <name>                  Creates a C header file that contains a uint32_t array named <name> initialized with the shader binary code.\n"
+		   "  --vn <name>                             synonym for --variable-name <name>.\n"
            );
            );
 
 
     exit(EFailUsage);
     exit(EFailUsage);

+ 4 - 4
3rdparty/glslang/Test/baseResults/310.comp.out

@@ -16,7 +16,7 @@ ERROR: 0:47: 'local_size' : can only apply to 'in'
 ERROR: 0:61: 'assign' :  l-value required "ro" (can't modify a readonly buffer)
 ERROR: 0:61: 'assign' :  l-value required "ro" (can't modify a readonly buffer)
 ERROR: 0:66: 'buffer' : buffers can be declared only as blocks 
 ERROR: 0:66: 'buffer' : buffers can be declared only as blocks 
 ERROR: 0:68: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:68: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:76: '' : image variables not declared 'writeonly' must have a format layout qualifier 
+ERROR: 0:76: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:81: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:81: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:82: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:82: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:87: 'imageAtomicCompSwap' : required extension not requested: GL_OES_shader_image_atomic
 ERROR: 0:87: 'imageAtomicCompSwap' : required extension not requested: GL_OES_shader_image_atomic
@@ -54,12 +54,12 @@ ERROR: 0:171: 'samplerCubeArray' : Reserved word.
 ERROR: 0:171: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:171: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:172: 'iimage2DRect' : Reserved word. 
 ERROR: 0:172: 'iimage2DRect' : Reserved word. 
 ERROR: 0:172: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:172: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:172: '' : image variables not declared 'writeonly' must have a format layout qualifier 
+ERROR: 0:172: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:173: 'image2DMS' : Reserved word. 
 ERROR: 0:173: 'image2DMS' : Reserved word. 
-ERROR: 0:173: '' : image variables not declared 'writeonly' must have a format layout qualifier 
+ERROR: 0:173: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:174: 'uimage2DMSArray' : Reserved word. 
 ERROR: 0:174: 'uimage2DMSArray' : Reserved word. 
 ERROR: 0:174: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:174: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:174: '' : image variables not declared 'writeonly' must have a format layout qualifier 
+ERROR: 0:174: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:181: 'rgba32f' : format requires readonly or writeonly memory qualifier 
 ERROR: 0:181: 'rgba32f' : format requires readonly or writeonly memory qualifier 
 ERROR: 0:182: 'rgba8i' : format requires readonly or writeonly memory qualifier 
 ERROR: 0:182: 'rgba8i' : format requires readonly or writeonly memory qualifier 
 ERROR: 0:183: 'rgba16ui' : format requires readonly or writeonly memory qualifier 
 ERROR: 0:183: 'rgba16ui' : format requires readonly or writeonly memory qualifier 

+ 5 - 5
3rdparty/glslang/Test/baseResults/310.frag.out

@@ -19,13 +19,13 @@ ERROR: 0:44: 'texel offset' : value is out of range: [gl_MinProgramTexelOffset,
 ERROR: 0:45: 'texel offset' : value is out of range: [gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset]
 ERROR: 0:45: 'texel offset' : value is out of range: [gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset]
 ERROR: 0:45: 'texel offset' : value is out of range: [gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset]
 ERROR: 0:45: 'texel offset' : value is out of range: [gl_MinProgramTexelOffset, gl_MaxProgramTexelOffset]
 ERROR: 0:66: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:66: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:66: '' : image variables not declared 'writeonly' must have a format layout qualifier 
+ERROR: 0:66: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:67: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:67: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:67: '' : image variables not declared 'writeonly' must have a format layout qualifier 
+ERROR: 0:67: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:68: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:68: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:68: '' : image variables not declared 'writeonly' must have a format layout qualifier 
+ERROR: 0:68: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:69: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:69: 'sampler/image' : type requires declaration of default precision qualifier 
-ERROR: 0:69: '' : image variables not declared 'writeonly' must have a format layout qualifier 
+ERROR: 0:69: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:73: 'binding' : requires block, or sampler/image, or atomic-counter type 
 ERROR: 0:73: 'binding' : requires block, or sampler/image, or atomic-counter type 
 ERROR: 0:77: 'location' : location is too large 
 ERROR: 0:77: 'location' : location is too large 
 ERROR: 0:81: 'location' : too large for fragment output 
 ERROR: 0:81: 'location' : too large for fragment output 
@@ -36,7 +36,7 @@ ERROR: 0:83: 'layout-id value' : cannot be negative
 ERROR: 0:96: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:96: 'sampler/image' : type requires declaration of default precision qualifier 
 ERROR: 0:110: 'out' : cannot be bool 
 ERROR: 0:110: 'out' : cannot be bool 
 ERROR: 0:111: 'image2D' : sampler/image types can only be used in uniform variables or function parameters: imageOut
 ERROR: 0:111: 'image2D' : sampler/image types can only be used in uniform variables or function parameters: imageOut
-ERROR: 0:111: '' : image variables not declared 'writeonly' must have a format layout qualifier 
+ERROR: 0:111: 'image variables declared 'writeonly' without a format layout qualifier' : not supported with this profile: es
 ERROR: 0:112: 'out' : cannot be a matrix 
 ERROR: 0:112: 'out' : cannot be a matrix 
 ERROR: 0:114: 'in' : cannot be bool 
 ERROR: 0:114: 'in' : cannot be bool 
 ERROR: 0:115: 'sampler2D' : sampler/image types can only be used in uniform variables or function parameters: ino
 ERROR: 0:115: 'sampler2D' : sampler/image types can only be used in uniform variables or function parameters: ino

+ 10 - 10
3rdparty/glslang/Test/baseResults/310.tesc.out

@@ -71,8 +71,8 @@ ERROR: node is still EOpNull!
 0:25        move second child to first child (temp highp 4-component vector of float)
 0:25        move second child to first child (temp highp 4-component vector of float)
 0:25          'p' (temp highp 4-component vector of float)
 0:25          'p' (temp highp 4-component vector of float)
 0:25          gl_Position: direct index for structure (in highp 4-component vector of float Position)
 0:25          gl_Position: direct index for structure (in highp 4-component vector of float Position)
-0:25            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:25              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:25            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:25              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
 0:25              Constant:
 0:25              Constant:
 0:25                1 (const int)
 0:25                1 (const int)
 0:25            Constant:
 0:25            Constant:
@@ -81,8 +81,8 @@ ERROR: node is still EOpNull!
 0:26        move second child to first child (temp highp float)
 0:26        move second child to first child (temp highp float)
 0:26          'ps' (temp highp float)
 0:26          'ps' (temp highp float)
 0:26          gl_PointSize: direct index for structure (in highp float PointSize)
 0:26          gl_PointSize: direct index for structure (in highp float PointSize)
-0:26            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:26              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:26            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:26              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
 0:26              Constant:
 0:26              Constant:
 0:26                1 (const int)
 0:26                1 (const int)
 0:26            Constant:
 0:26            Constant:
@@ -210,8 +210,8 @@ ERROR: node is still EOpNull!
 0:114        move second child to first child (temp highp float)
 0:114        move second child to first child (temp highp float)
 0:114          'ps' (temp highp float)
 0:114          'ps' (temp highp float)
 0:114          gl_PointSize: direct index for structure (in highp float PointSize)
 0:114          gl_PointSize: direct index for structure (in highp float PointSize)
-0:114            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:114              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:114            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:114              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
 0:114              Constant:
 0:114              Constant:
 0:114                1 (const int)
 0:114                1 (const int)
 0:114            Constant:
 0:114            Constant:
@@ -402,8 +402,8 @@ ERROR: node is still EOpNull!
 0:25        move second child to first child (temp highp 4-component vector of float)
 0:25        move second child to first child (temp highp 4-component vector of float)
 0:25          'p' (temp highp 4-component vector of float)
 0:25          'p' (temp highp 4-component vector of float)
 0:25          gl_Position: direct index for structure (in highp 4-component vector of float Position)
 0:25          gl_Position: direct index for structure (in highp 4-component vector of float Position)
-0:25            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:25              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:25            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:25              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
 0:25              Constant:
 0:25              Constant:
 0:25                1 (const int)
 0:25                1 (const int)
 0:25            Constant:
 0:25            Constant:
@@ -412,8 +412,8 @@ ERROR: node is still EOpNull!
 0:26        move second child to first child (temp highp float)
 0:26        move second child to first child (temp highp float)
 0:26          'ps' (temp highp float)
 0:26          'ps' (temp highp float)
 0:26          gl_PointSize: direct index for structure (in highp float PointSize)
 0:26          gl_PointSize: direct index for structure (in highp float PointSize)
-0:26            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:26              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:26            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:26              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
 0:26              Constant:
 0:26              Constant:
 0:26                1 (const int)
 0:26                1 (const int)
 0:26            Constant:
 0:26            Constant:

+ 8 - 8
3rdparty/glslang/Test/baseResults/310.tese.out

@@ -78,8 +78,8 @@ ERROR: node is still EOpNull!
 0:36        move second child to first child (temp highp 4-component vector of float)
 0:36        move second child to first child (temp highp 4-component vector of float)
 0:36          'p' (temp highp 4-component vector of float)
 0:36          'p' (temp highp 4-component vector of float)
 0:36          gl_Position: direct index for structure (in highp 4-component vector of float Position)
 0:36          gl_Position: direct index for structure (in highp 4-component vector of float Position)
-0:36            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:36              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:36            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:36              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
 0:36              Constant:
 0:36              Constant:
 0:36                1 (const int)
 0:36                1 (const int)
 0:36            Constant:
 0:36            Constant:
@@ -88,8 +88,8 @@ ERROR: node is still EOpNull!
 0:37        move second child to first child (temp highp float)
 0:37        move second child to first child (temp highp float)
 0:37          'ps' (temp highp float)
 0:37          'ps' (temp highp float)
 0:37          gl_PointSize: direct index for structure (in highp float PointSize)
 0:37          gl_PointSize: direct index for structure (in highp float PointSize)
-0:37            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:37              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:37            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
+0:37              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in implicitly-sized array of highp 4-component vector of float gl_PositionPerViewNV})
 0:37              Constant:
 0:37              Constant:
 0:37                1 (const int)
 0:37                1 (const int)
 0:37            Constant:
 0:37            Constant:
@@ -211,8 +211,8 @@ ERROR: node is still EOpNull!
 0:36        move second child to first child (temp highp 4-component vector of float)
 0:36        move second child to first child (temp highp 4-component vector of float)
 0:36          'p' (temp highp 4-component vector of float)
 0:36          'p' (temp highp 4-component vector of float)
 0:36          gl_Position: direct index for structure (in highp 4-component vector of float Position)
 0:36          gl_Position: direct index for structure (in highp 4-component vector of float Position)
-0:36            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:36              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:36            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:36              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
 0:36              Constant:
 0:36              Constant:
 0:36                1 (const int)
 0:36                1 (const int)
 0:36            Constant:
 0:36            Constant:
@@ -221,8 +221,8 @@ ERROR: node is still EOpNull!
 0:37        move second child to first child (temp highp float)
 0:37        move second child to first child (temp highp float)
 0:37          'ps' (temp highp float)
 0:37          'ps' (temp highp float)
 0:37          gl_PointSize: direct index for structure (in highp float PointSize)
 0:37          gl_PointSize: direct index for structure (in highp float PointSize)
-0:37            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
-0:37              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV})
+0:37            direct index (temp block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
+0:37              'gl_in' (in 32-element array of block{in highp 4-component vector of float Position gl_Position, in highp float PointSize gl_PointSize, in highp 4-component vector of float gl_SecondaryPositionNV, in 1-element array of highp 4-component vector of float gl_PositionPerViewNV})
 0:37              Constant:
 0:37              Constant:
 0:37                1 (const int)
 0:37                1 (const int)
 0:37            Constant:
 0:37            Constant:

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

@@ -33,7 +33,7 @@ ERROR: 0:85: '' : vertex input cannot be further qualified
 ERROR: 0:86: 'patch' : not supported in this stage: vertex
 ERROR: 0:86: 'patch' : not supported in this stage: vertex
 ERROR: 0:100: '=' : global const initializers must be constant 'const int'
 ERROR: 0:100: '=' : global const initializers must be constant 'const int'
 ERROR: 0:101: '' : array size must be a constant integer expression 
 ERROR: 0:101: '' : array size must be a constant integer expression 
-ERROR: 0:107: '' : image variables not declared 'writeonly' must have a format layout qualifier 
+ERROR: 0:107: 'image variables declared 'writeonly' without a format layout qualifier' : not supported for this version or the enabled extensions 
 ERROR: 0:114: 'imageAtomicMin' : only supported on image with format r32i or r32ui 
 ERROR: 0:114: 'imageAtomicMin' : only supported on image with format r32i or r32ui 
 ERROR: 0:115: 'imageAtomicMax' : no matching overloaded function found 
 ERROR: 0:115: 'imageAtomicMax' : no matching overloaded function found 
 ERROR: 0:119: 'writeonly' : argument cannot drop memory qualifier when passed to formal parameter 
 ERROR: 0:119: 'writeonly' : argument cannot drop memory qualifier when passed to formal parameter 

+ 1 - 1
3rdparty/glslang/Test/baseResults/spv.140.frag.out

@@ -54,7 +54,7 @@ spv.140.frag
                               MemberDecorate 87(bn) 3 Offset 576
                               MemberDecorate 87(bn) 3 Offset 576
                               MemberDecorate 87(bn) 3 MatrixStride 16
                               MemberDecorate 87(bn) 3 MatrixStride 16
                               MemberDecorate 87(bn) 4 RowMajor
                               MemberDecorate 87(bn) 4 RowMajor
-                              MemberDecorate 87(bn) 4 Offset 640
+                              MemberDecorate 87(bn) 4 Offset 1024
                               MemberDecorate 87(bn) 4 MatrixStride 16
                               MemberDecorate 87(bn) 4 MatrixStride 16
                               Decorate 87(bn) Block
                               Decorate 87(bn) Block
                               Decorate 89 DescriptorSet 0
                               Decorate 89 DescriptorSet 0

+ 1 - 1
3rdparty/glslang/Test/baseResults/spv.300layout.vert.out

@@ -61,7 +61,7 @@ Warning, version 310 is not yet complete; most version-specific features are pre
                               MemberDecorate 45(T3) 2 ColMajor
                               MemberDecorate 45(T3) 2 ColMajor
                               MemberDecorate 45(T3) 2 Offset 128
                               MemberDecorate 45(T3) 2 Offset 128
                               MemberDecorate 45(T3) 2 MatrixStride 16
                               MemberDecorate 45(T3) 2 MatrixStride 16
-                              MemberDecorate 45(T3) 3 Offset 160
+                              MemberDecorate 45(T3) 3 Offset 2048
                               Decorate 45(T3) Block
                               Decorate 45(T3) Block
                               Decorate 47 DescriptorSet 0
                               Decorate 47 DescriptorSet 0
                               MemberDecorate 78(T2) 0 Offset 0
                               MemberDecorate 78(T2) 0 Offset 0

+ 352 - 0
3rdparty/glslang/Test/baseResults/spv.image.load-formatted.frag.out

@@ -0,0 +1,352 @@
+spv.image.load-formatted.frag
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 240
+
+                              Capability Shader
+                              Capability SampledRect
+                              Capability Sampled1D
+                              Capability SampledCubeArray
+                              Capability SampledBuffer
+                              Capability ImageMSArray
+                              Capability ImageQuery
+                              Capability StorageImageReadWithoutFormat
+                              Capability StorageImageWriteWithoutFormat
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 132 142 152 233 237 239
+                              ExecutionMode 4 OriginUpperLeft
+                              Source GLSL 450
+                              SourceExtension  "GL_EXT_shader_image_load_formatted"
+                              Name 4  "main"
+                              Name 9  "iv"
+                              Name 15  "i1D"
+                              Name 27  "i2D"
+                              Name 38  "i3D"
+                              Name 45  "iCube"
+                              Name 55  "iCubeArray"
+                              Name 62  "i2DRect"
+                              Name 72  "i1DArray"
+                              Name 82  "i2DArray"
+                              Name 89  "iBuffer"
+                              Name 98  "i2DMS"
+                              Name 108  "i2DMSArray"
+                              Name 127  "v"
+                              Name 132  "ic1D"
+                              Name 142  "ic2D"
+                              Name 152  "ic3D"
+                              Name 228  "wo2D"
+                              Name 233  "fragData"
+                              Name 237  "ic4D"
+                              Name 239  "value"
+                              Decorate 15(i1D) DescriptorSet 0
+                              Decorate 15(i1D) Binding 0
+                              Decorate 27(i2D) DescriptorSet 0
+                              Decorate 27(i2D) Binding 1
+                              Decorate 38(i3D) DescriptorSet 0
+                              Decorate 38(i3D) Binding 2
+                              Decorate 45(iCube) DescriptorSet 0
+                              Decorate 45(iCube) Binding 3
+                              Decorate 55(iCubeArray) DescriptorSet 0
+                              Decorate 55(iCubeArray) Binding 4
+                              Decorate 62(i2DRect) DescriptorSet 0
+                              Decorate 62(i2DRect) Binding 5
+                              Decorate 72(i1DArray) DescriptorSet 0
+                              Decorate 72(i1DArray) Binding 6
+                              Decorate 82(i2DArray) DescriptorSet 0
+                              Decorate 82(i2DArray) Binding 7
+                              Decorate 89(iBuffer) DescriptorSet 0
+                              Decorate 89(iBuffer) Binding 8
+                              Decorate 98(i2DMS) DescriptorSet 0
+                              Decorate 98(i2DMS) Binding 9
+                              Decorate 108(i2DMSArray) DescriptorSet 0
+                              Decorate 108(i2DMSArray) Binding 10
+                              Decorate 132(ic1D) Flat
+                              Decorate 142(ic2D) Flat
+                              Decorate 152(ic3D) Flat
+                              Decorate 228(wo2D) DescriptorSet 0
+                              Decorate 228(wo2D) Binding 1
+                              Decorate 228(wo2D) NonReadable
+                              Decorate 237(ic4D) Flat
+                              Decorate 239(value) Flat
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypeVector 6(int) 3
+               8:             TypePointer Function 7(ivec3)
+              10:      6(int) Constant 0
+              11:    7(ivec3) ConstantComposite 10 10 10
+              12:             TypeFloat 32
+              13:             TypeImage 12(float) 1D nonsampled format:Unknown
+              14:             TypePointer UniformConstant 13
+         15(i1D):     14(ptr) Variable UniformConstant
+              18:             TypeInt 32 0
+              19:     18(int) Constant 0
+              20:             TypePointer Function 6(int)
+              25:             TypeImage 12(float) 2D nonsampled format:Unknown
+              26:             TypePointer UniformConstant 25
+         27(i2D):     26(ptr) Variable UniformConstant
+              29:             TypeVector 6(int) 2
+              36:             TypeImage 12(float) 3D nonsampled format:Unknown
+              37:             TypePointer UniformConstant 36
+         38(i3D):     37(ptr) Variable UniformConstant
+              43:             TypeImage 12(float) Cube nonsampled format:Unknown
+              44:             TypePointer UniformConstant 43
+       45(iCube):     44(ptr) Variable UniformConstant
+              53:             TypeImage 12(float) Cube array nonsampled format:Unknown
+              54:             TypePointer UniformConstant 53
+  55(iCubeArray):     54(ptr) Variable UniformConstant
+              60:             TypeImage 12(float) Rect nonsampled format:Unknown
+              61:             TypePointer UniformConstant 60
+     62(i2DRect):     61(ptr) Variable UniformConstant
+              70:             TypeImage 12(float) 1D array nonsampled format:Unknown
+              71:             TypePointer UniformConstant 70
+    72(i1DArray):     71(ptr) Variable UniformConstant
+              80:             TypeImage 12(float) 2D array nonsampled format:Unknown
+              81:             TypePointer UniformConstant 80
+    82(i2DArray):     81(ptr) Variable UniformConstant
+              87:             TypeImage 12(float) Buffer nonsampled format:Unknown
+              88:             TypePointer UniformConstant 87
+     89(iBuffer):     88(ptr) Variable UniformConstant
+              96:             TypeImage 12(float) 2D multi-sampled nonsampled format:Unknown
+              97:             TypePointer UniformConstant 96
+       98(i2DMS):     97(ptr) Variable UniformConstant
+             106:             TypeImage 12(float) 2D array multi-sampled nonsampled format:Unknown
+             107:             TypePointer UniformConstant 106
+ 108(i2DMSArray):    107(ptr) Variable UniformConstant
+             125:             TypeVector 12(float) 4
+             126:             TypePointer Function 125(fvec4)
+             128:   12(float) Constant 0
+             129:  125(fvec4) ConstantComposite 128 128 128 128
+             131:             TypePointer Input 6(int)
+       132(ic1D):    131(ptr) Variable Input
+             141:             TypePointer Input 29(ivec2)
+       142(ic2D):    141(ptr) Variable Input
+             151:             TypePointer Input 7(ivec3)
+       152(ic3D):    151(ptr) Variable Input
+             210:      6(int) Constant 1
+             216:      6(int) Constant 2
+             220:      6(int) Constant 3
+             226:      6(int) Constant 4
+       228(wo2D):     26(ptr) Variable UniformConstant
+             232:             TypePointer Output 125(fvec4)
+   233(fragData):    232(ptr) Variable Output
+             235:             TypeVector 6(int) 4
+             236:             TypePointer Input 235(ivec4)
+       237(ic4D):    236(ptr) Variable Input
+             238:             TypePointer Input 18(int)
+      239(value):    238(ptr) Variable Input
+         4(main):           2 Function None 3
+               5:             Label
+           9(iv):      8(ptr) Variable Function
+          127(v):    126(ptr) Variable Function
+                              Store 9(iv) 11
+              16:          13 Load 15(i1D)
+              17:      6(int) ImageQuerySize 16
+              21:     20(ptr) AccessChain 9(iv) 19
+              22:      6(int) Load 21
+              23:      6(int) IAdd 22 17
+              24:     20(ptr) AccessChain 9(iv) 19
+                              Store 24 23
+              28:          25 Load 27(i2D)
+              30:   29(ivec2) ImageQuerySize 28
+              31:    7(ivec3) Load 9(iv)
+              32:   29(ivec2) VectorShuffle 31 31 0 1
+              33:   29(ivec2) IAdd 32 30
+              34:    7(ivec3) Load 9(iv)
+              35:    7(ivec3) VectorShuffle 34 33 3 4 2
+                              Store 9(iv) 35
+              39:          36 Load 38(i3D)
+              40:    7(ivec3) ImageQuerySize 39
+              41:    7(ivec3) Load 9(iv)
+              42:    7(ivec3) IAdd 41 40
+                              Store 9(iv) 42
+              46:          43 Load 45(iCube)
+              47:   29(ivec2) ImageQuerySize 46
+              48:    7(ivec3) Load 9(iv)
+              49:   29(ivec2) VectorShuffle 48 48 0 1
+              50:   29(ivec2) IAdd 49 47
+              51:    7(ivec3) Load 9(iv)
+              52:    7(ivec3) VectorShuffle 51 50 3 4 2
+                              Store 9(iv) 52
+              56:          53 Load 55(iCubeArray)
+              57:    7(ivec3) ImageQuerySize 56
+              58:    7(ivec3) Load 9(iv)
+              59:    7(ivec3) IAdd 58 57
+                              Store 9(iv) 59
+              63:          60 Load 62(i2DRect)
+              64:   29(ivec2) ImageQuerySize 63
+              65:    7(ivec3) Load 9(iv)
+              66:   29(ivec2) VectorShuffle 65 65 0 1
+              67:   29(ivec2) IAdd 66 64
+              68:    7(ivec3) Load 9(iv)
+              69:    7(ivec3) VectorShuffle 68 67 3 4 2
+                              Store 9(iv) 69
+              73:          70 Load 72(i1DArray)
+              74:   29(ivec2) ImageQuerySize 73
+              75:    7(ivec3) Load 9(iv)
+              76:   29(ivec2) VectorShuffle 75 75 0 1
+              77:   29(ivec2) IAdd 76 74
+              78:    7(ivec3) Load 9(iv)
+              79:    7(ivec3) VectorShuffle 78 77 3 4 2
+                              Store 9(iv) 79
+              83:          80 Load 82(i2DArray)
+              84:    7(ivec3) ImageQuerySize 83
+              85:    7(ivec3) Load 9(iv)
+              86:    7(ivec3) IAdd 85 84
+                              Store 9(iv) 86
+              90:          87 Load 89(iBuffer)
+              91:      6(int) ImageQuerySize 90
+              92:     20(ptr) AccessChain 9(iv) 19
+              93:      6(int) Load 92
+              94:      6(int) IAdd 93 91
+              95:     20(ptr) AccessChain 9(iv) 19
+                              Store 95 94
+              99:          96 Load 98(i2DMS)
+             100:   29(ivec2) ImageQuerySize 99
+             101:    7(ivec3) Load 9(iv)
+             102:   29(ivec2) VectorShuffle 101 101 0 1
+             103:   29(ivec2) IAdd 102 100
+             104:    7(ivec3) Load 9(iv)
+             105:    7(ivec3) VectorShuffle 104 103 3 4 2
+                              Store 9(iv) 105
+             109:         106 Load 108(i2DMSArray)
+             110:    7(ivec3) ImageQuerySize 109
+             111:    7(ivec3) Load 9(iv)
+             112:    7(ivec3) IAdd 111 110
+                              Store 9(iv) 112
+             113:          96 Load 98(i2DMS)
+             114:      6(int) ImageQuerySamples 113
+             115:     20(ptr) AccessChain 9(iv) 19
+             116:      6(int) Load 115
+             117:      6(int) IAdd 116 114
+             118:     20(ptr) AccessChain 9(iv) 19
+                              Store 118 117
+             119:         106 Load 108(i2DMSArray)
+             120:      6(int) ImageQuerySamples 119
+             121:     20(ptr) AccessChain 9(iv) 19
+             122:      6(int) Load 121
+             123:      6(int) IAdd 122 120
+             124:     20(ptr) AccessChain 9(iv) 19
+                              Store 124 123
+                              Store 127(v) 129
+             130:          13 Load 15(i1D)
+             133:      6(int) Load 132(ic1D)
+             134:  125(fvec4) ImageRead 130 133
+             135:  125(fvec4) Load 127(v)
+             136:  125(fvec4) FAdd 135 134
+                              Store 127(v) 136
+             137:          13 Load 15(i1D)
+             138:      6(int) Load 132(ic1D)
+             139:  125(fvec4) Load 127(v)
+                              ImageWrite 137 138 139
+             140:          25 Load 27(i2D)
+             143:   29(ivec2) Load 142(ic2D)
+             144:  125(fvec4) ImageRead 140 143
+             145:  125(fvec4) Load 127(v)
+             146:  125(fvec4) FAdd 145 144
+                              Store 127(v) 146
+             147:          25 Load 27(i2D)
+             148:   29(ivec2) Load 142(ic2D)
+             149:  125(fvec4) Load 127(v)
+                              ImageWrite 147 148 149
+             150:          36 Load 38(i3D)
+             153:    7(ivec3) Load 152(ic3D)
+             154:  125(fvec4) ImageRead 150 153
+             155:  125(fvec4) Load 127(v)
+             156:  125(fvec4) FAdd 155 154
+                              Store 127(v) 156
+             157:          36 Load 38(i3D)
+             158:    7(ivec3) Load 152(ic3D)
+             159:  125(fvec4) Load 127(v)
+                              ImageWrite 157 158 159
+             160:          43 Load 45(iCube)
+             161:    7(ivec3) Load 152(ic3D)
+             162:  125(fvec4) ImageRead 160 161
+             163:  125(fvec4) Load 127(v)
+             164:  125(fvec4) FAdd 163 162
+                              Store 127(v) 164
+             165:          43 Load 45(iCube)
+             166:    7(ivec3) Load 152(ic3D)
+             167:  125(fvec4) Load 127(v)
+                              ImageWrite 165 166 167
+             168:          53 Load 55(iCubeArray)
+             169:    7(ivec3) Load 152(ic3D)
+             170:  125(fvec4) ImageRead 168 169
+             171:  125(fvec4) Load 127(v)
+             172:  125(fvec4) FAdd 171 170
+                              Store 127(v) 172
+             173:          53 Load 55(iCubeArray)
+             174:    7(ivec3) Load 152(ic3D)
+             175:  125(fvec4) Load 127(v)
+                              ImageWrite 173 174 175
+             176:          60 Load 62(i2DRect)
+             177:   29(ivec2) Load 142(ic2D)
+             178:  125(fvec4) ImageRead 176 177
+             179:  125(fvec4) Load 127(v)
+             180:  125(fvec4) FAdd 179 178
+                              Store 127(v) 180
+             181:          60 Load 62(i2DRect)
+             182:   29(ivec2) Load 142(ic2D)
+             183:  125(fvec4) Load 127(v)
+                              ImageWrite 181 182 183
+             184:          70 Load 72(i1DArray)
+             185:   29(ivec2) Load 142(ic2D)
+             186:  125(fvec4) ImageRead 184 185
+             187:  125(fvec4) Load 127(v)
+             188:  125(fvec4) FAdd 187 186
+                              Store 127(v) 188
+             189:          70 Load 72(i1DArray)
+             190:   29(ivec2) Load 142(ic2D)
+             191:  125(fvec4) Load 127(v)
+                              ImageWrite 189 190 191
+             192:          80 Load 82(i2DArray)
+             193:    7(ivec3) Load 152(ic3D)
+             194:  125(fvec4) ImageRead 192 193
+             195:  125(fvec4) Load 127(v)
+             196:  125(fvec4) FAdd 195 194
+                              Store 127(v) 196
+             197:          80 Load 82(i2DArray)
+             198:    7(ivec3) Load 152(ic3D)
+             199:  125(fvec4) Load 127(v)
+                              ImageWrite 197 198 199
+             200:          87 Load 89(iBuffer)
+             201:      6(int) Load 132(ic1D)
+             202:  125(fvec4) ImageRead 200 201
+             203:  125(fvec4) Load 127(v)
+             204:  125(fvec4) FAdd 203 202
+                              Store 127(v) 204
+             205:          87 Load 89(iBuffer)
+             206:      6(int) Load 132(ic1D)
+             207:  125(fvec4) Load 127(v)
+                              ImageWrite 205 206 207
+             208:          96 Load 98(i2DMS)
+             209:   29(ivec2) Load 142(ic2D)
+             211:  125(fvec4) ImageRead 208 209 Sample 210
+             212:  125(fvec4) Load 127(v)
+             213:  125(fvec4) FAdd 212 211
+                              Store 127(v) 213
+             214:          96 Load 98(i2DMS)
+             215:   29(ivec2) Load 142(ic2D)
+             217:  125(fvec4) Load 127(v)
+                              ImageWrite 214 215 217 Sample 216
+             218:         106 Load 108(i2DMSArray)
+             219:    7(ivec3) Load 152(ic3D)
+             221:  125(fvec4) ImageRead 218 219 Sample 220
+             222:  125(fvec4) Load 127(v)
+             223:  125(fvec4) FAdd 222 221
+                              Store 127(v) 223
+             224:         106 Load 108(i2DMSArray)
+             225:    7(ivec3) Load 152(ic3D)
+             227:  125(fvec4) Load 127(v)
+                              ImageWrite 224 225 227 Sample 226
+             229:          25 Load 228(wo2D)
+             230:   29(ivec2) Load 142(ic2D)
+             231:  125(fvec4) Load 127(v)
+                              ImageWrite 229 230 231
+             234:  125(fvec4) Load 127(v)
+                              Store 233(fragData) 234
+                              Return
+                              FunctionEnd

+ 28 - 1
3rdparty/glslang/Test/baseResults/spv.matrix.frag.out

@@ -3,7 +3,7 @@ Warning, version 420 is not yet complete; most version-specific features are pre
 
 
 // Module Version 10000
 // Module Version 10000
 // Generated by (magic number): 80001
 // Generated by (magic number): 80001
-// Id's are bound by 261
+// Id's are bound by 286
 
 
                               Capability Shader
                               Capability Shader
                               Capability Float64
                               Capability Float64
@@ -55,6 +55,9 @@ Warning, version 420 is not yet complete; most version-specific features are pre
              186:             TypePointer Output 7(fvec4)
              186:             TypePointer Output 7(fvec4)
       187(color):    186(ptr) Variable Output
       187(color):    186(ptr) Variable Output
              208:    6(float) Constant 0
              208:    6(float) Constant 0
+             270:             TypeVector 6(float) 2
+             271:             TypeMatrix 270(fvec2) 2
+             279:    6(float) Constant 1088841318
          4(main):           2 Function None 3
          4(main):           2 Function None 3
                5:             Label
                5:             Label
        10(sum34):      9(ptr) Variable Function
        10(sum34):      9(ptr) Variable Function
@@ -305,5 +308,29 @@ Warning, version 420 is not yet complete; most version-specific features are pre
              259:    7(fvec4) Load 187(color)
              259:    7(fvec4) Load 187(color)
              260:    7(fvec4) FAdd 259 258
              260:    7(fvec4) FAdd 259 258
                               Store 187(color) 260
                               Store 187(color) 260
+             261:         172 Load 174(m43)
+             262:    6(float) CompositeExtract 261 0 0
+             263:    6(float) CompositeExtract 261 0 1
+             264:    6(float) CompositeExtract 261 0 2
+             265:    6(float) CompositeExtract 261 1 0
+             266:    7(fvec4) CompositeConstruct 262 263 264 265
+             267:    7(fvec4) Load 187(color)
+             268:    7(fvec4) FAdd 267 266
+                              Store 187(color) 268
+             269:    6(float) Load 28(f)
+             272:  270(fvec2) CompositeConstruct 269 208
+             273:  270(fvec2) CompositeConstruct 208 269
+             274:         271 CompositeConstruct 272 273
+             275:    6(float) CompositeExtract 274 0 0
+             276:    6(float) CompositeExtract 274 0 1
+             277:    6(float) CompositeExtract 274 1 0
+             278:  157(fvec3) CompositeConstruct 275 276 277
+             280:    6(float) CompositeExtract 278 0
+             281:    6(float) CompositeExtract 278 1
+             282:    6(float) CompositeExtract 278 2
+             283:    7(fvec4) CompositeConstruct 280 281 282 279
+             284:    7(fvec4) Load 187(color)
+             285:    7(fvec4) FAdd 284 283
+                              Store 187(color) 285
                               Return
                               Return
                               FunctionEnd
                               FunctionEnd

+ 78 - 0
3rdparty/glslang/Test/baseResults/spv.multiviewPerViewAttributes.tesc.out

@@ -0,0 +1,78 @@
+spv.multiviewPerViewAttributes.tesc
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 37
+
+                              Capability Tessellation
+                              Capability Bad
+                              Extension  "SPV_NVX_multiview_per_view_attributes"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint TessellationControl 4  "main" 17 19 31
+                              ExecutionMode 4 OutputVertices 4
+                              Source GLSL 450
+                              SourceExtension  "GL_NVX_multiview_per_view_attributes"
+                              Name 4  "main"
+                              Name 13  "gl_PerVertex"
+                              MemberName 13(gl_PerVertex) 0  "gl_PositionPerViewNV"
+                              MemberName 13(gl_PerVertex) 1  "gl_ViewportMaskPerViewNV"
+                              Name 17  "gl_out"
+                              Name 19  "gl_InvocationID"
+                              Name 27  "gl_PerVertex"
+                              MemberName 27(gl_PerVertex) 0  "gl_Position"
+                              MemberName 27(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 27(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 27(gl_PerVertex) 3  "gl_CullDistance"
+                              MemberName 27(gl_PerVertex) 4  "gl_SecondaryPositionNV"
+                              MemberName 27(gl_PerVertex) 5  "gl_PositionPerViewNV"
+                              Name 31  "gl_in"
+                              MemberDecorate 13(gl_PerVertex) 0 BuiltIn PositionPerViewNV
+                              MemberDecorate 13(gl_PerVertex) 1 BuiltIn ViewportMaskPerViewNV
+                              Decorate 13(gl_PerVertex) Block
+                              Decorate 19(gl_InvocationID) BuiltIn InvocationId
+                              MemberDecorate 27(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 27(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 27(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 27(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 27(gl_PerVertex) Block
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeInt 32 0
+               9:      8(int) Constant 1
+              10:             TypeArray 7(fvec4) 9
+              11:             TypeInt 32 1
+              12:             TypeArray 11(int) 9
+13(gl_PerVertex):             TypeStruct 10 12
+              14:      8(int) Constant 4
+              15:             TypeArray 13(gl_PerVertex) 14
+              16:             TypePointer Output 15
+      17(gl_out):     16(ptr) Variable Output
+              18:             TypePointer Input 11(int)
+19(gl_InvocationID):     18(ptr) Variable Input
+              21:     11(int) Constant 1
+              22:     11(int) Constant 0
+              23:             TypePointer Output 11(int)
+              26:             TypeArray 6(float) 9
+27(gl_PerVertex):             TypeStruct 7(fvec4) 6(float) 26 26 7(fvec4) 10
+              28:      8(int) Constant 32
+              29:             TypeArray 27(gl_PerVertex) 28
+              30:             TypePointer Input 29
+       31(gl_in):     30(ptr) Variable Input
+              32:             TypePointer Input 7(fvec4)
+              35:             TypePointer Output 7(fvec4)
+         4(main):           2 Function None 3
+               5:             Label
+              20:     11(int) Load 19(gl_InvocationID)
+              24:     23(ptr) AccessChain 17(gl_out) 20 21 22
+                              Store 24 21
+              25:     11(int) Load 19(gl_InvocationID)
+              33:     32(ptr) AccessChain 31(gl_in) 21 22
+              34:    7(fvec4) Load 33
+              36:     35(ptr) AccessChain 17(gl_out) 25 22 22
+                              Store 36 34
+                              Return
+                              FunctionEnd

+ 62 - 0
3rdparty/glslang/Test/baseResults/spv.multiviewPerViewAttributes.vert.out

@@ -0,0 +1,62 @@
+spv.multiviewPerViewAttributes.vert
+Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 29
+
+                              Capability Shader
+                              Capability Bad
+                              Extension  "SPV_NVX_multiview_per_view_attributes"
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Vertex 4  "main" 11 20 24
+                              Source GLSL 450
+                              SourceExtension  "GL_NVX_multiview_per_view_attributes"
+                              Name 4  "main"
+                              Name 11  "gl_ViewportMaskPerViewNV"
+                              Name 20  "gl_PositionPerViewNV"
+                              Name 22  "gl_PerVertex"
+                              MemberName 22(gl_PerVertex) 0  "gl_Position"
+                              MemberName 22(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 22(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 22(gl_PerVertex) 3  "gl_CullDistance"
+                              Name 24  ""
+                              Decorate 11(gl_ViewportMaskPerViewNV) BuiltIn ViewportMaskPerViewNV
+                              Decorate 20(gl_PositionPerViewNV) BuiltIn PositionPerViewNV
+                              MemberDecorate 22(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 22(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 22(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 22(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 22(gl_PerVertex) Block
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 1
+               7:             TypeInt 32 0
+               8:      7(int) Constant 1
+               9:             TypeArray 6(int) 8
+              10:             TypePointer Output 9
+11(gl_ViewportMaskPerViewNV):     10(ptr) Variable Output
+              12:      6(int) Constant 0
+              13:      6(int) Constant 1
+              14:             TypePointer Output 6(int)
+              16:             TypeFloat 32
+              17:             TypeVector 16(float) 4
+              18:             TypeArray 17(fvec4) 8
+              19:             TypePointer Output 18
+20(gl_PositionPerViewNV):     19(ptr) Variable Output
+              21:             TypeArray 16(float) 8
+22(gl_PerVertex):             TypeStruct 17(fvec4) 16(float) 21 21
+              23:             TypePointer Output 22(gl_PerVertex)
+              24:     23(ptr) Variable Output
+              25:             TypePointer Output 17(fvec4)
+         4(main):           2 Function None 3
+               5:             Label
+              15:     14(ptr) AccessChain 11(gl_ViewportMaskPerViewNV) 12
+                              Store 15 13
+              26:     25(ptr) AccessChain 24 12
+              27:   17(fvec4) Load 26
+              28:     25(ptr) AccessChain 20(gl_PositionPerViewNV) 12
+                              Store 28 27
+                              Return
+                              FunctionEnd

+ 2 - 2
3rdparty/glslang/Test/baseResults/spv.shaderGroupVote.comp.out

@@ -48,10 +48,10 @@ Warning, version 450 is not yet complete; most version-specific features are pre
               19:     6(bool) INotEqual 17 18
               19:     6(bool) INotEqual 17 18
                               Store 8(b1) 19
                               Store 8(b1) 19
               20:     6(bool) Load 8(b1)
               20:     6(bool) Load 8(b1)
-              21:     6(bool) SubgroupAllKHR 20
+              21:     6(bool) SubgroupAnyKHR 20
                               Store 8(b1) 21
                               Store 8(b1) 21
               22:     6(bool) Load 8(b1)
               22:     6(bool) Load 8(b1)
-              23:     6(bool) SubgroupAnyKHR 22
+              23:     6(bool) SubgroupAllKHR 22
                               Store 8(b1) 23
                               Store 8(b1) 23
               24:     6(bool) Load 8(b1)
               24:     6(bool) Load 8(b1)
               25:     6(bool) SubgroupAllEqualKHR 24
               25:     6(bool) SubgroupAllEqualKHR 24

+ 27 - 25
3rdparty/glslang/Test/baseResults/spv.stereoViewRendering.tesc.out

@@ -3,7 +3,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre
 
 
 // Module Version 10000
 // Module Version 10000
 // Generated by (magic number): 80001
 // Generated by (magic number): 80001
-// Id's are bound by 38
+// Id's are bound by 39
 
 
                               Capability Geometry
                               Capability Geometry
                               Capability Tessellation
                               Capability Tessellation
@@ -13,7 +13,7 @@ Warning, version 450 is not yet complete; most version-specific features are pre
                               Extension  "SPV_NV_viewport_array2"
                               Extension  "SPV_NV_viewport_array2"
                1:             ExtInstImport  "GLSL.std.450"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 16 18 32
+                              EntryPoint TessellationControl 4  "main" 16 18 33
                               ExecutionMode 4 OutputVertices 4
                               ExecutionMode 4 OutputVertices 4
                               Source GLSL 450
                               Source GLSL 450
                               SourceExtension  "GL_NV_stereo_view_rendering"
                               SourceExtension  "GL_NV_stereo_view_rendering"
@@ -25,13 +25,14 @@ Warning, version 450 is not yet complete; most version-specific features are pre
                               MemberName 12(gl_PerVertex) 2  "gl_SecondaryViewportMaskNV"
                               MemberName 12(gl_PerVertex) 2  "gl_SecondaryViewportMaskNV"
                               Name 16  "gl_out"
                               Name 16  "gl_out"
                               Name 18  "gl_InvocationID"
                               Name 18  "gl_InvocationID"
-                              Name 28  "gl_PerVertex"
-                              MemberName 28(gl_PerVertex) 0  "gl_Position"
-                              MemberName 28(gl_PerVertex) 1  "gl_PointSize"
-                              MemberName 28(gl_PerVertex) 2  "gl_ClipDistance"
-                              MemberName 28(gl_PerVertex) 3  "gl_CullDistance"
-                              MemberName 28(gl_PerVertex) 4  "gl_SecondaryPositionNV"
-                              Name 32  "gl_in"
+                              Name 29  "gl_PerVertex"
+                              MemberName 29(gl_PerVertex) 0  "gl_Position"
+                              MemberName 29(gl_PerVertex) 1  "gl_PointSize"
+                              MemberName 29(gl_PerVertex) 2  "gl_ClipDistance"
+                              MemberName 29(gl_PerVertex) 3  "gl_CullDistance"
+                              MemberName 29(gl_PerVertex) 4  "gl_SecondaryPositionNV"
+                              MemberName 29(gl_PerVertex) 5  "gl_PositionPerViewNV"
+                              Name 33  "gl_in"
                               MemberDecorate 12(gl_PerVertex) 0 BuiltIn Layer
                               MemberDecorate 12(gl_PerVertex) 0 BuiltIn Layer
                               MemberDecorate 12(gl_PerVertex) 0 ViewportRelativeNV
                               MemberDecorate 12(gl_PerVertex) 0 ViewportRelativeNV
                               MemberDecorate 12(gl_PerVertex) 0 SecondaryViewportRelativeNV 1
                               MemberDecorate 12(gl_PerVertex) 0 SecondaryViewportRelativeNV 1
@@ -39,11 +40,11 @@ Warning, version 450 is not yet complete; most version-specific features are pre
                               MemberDecorate 12(gl_PerVertex) 2 BuiltIn SecondaryViewportMaskNV
                               MemberDecorate 12(gl_PerVertex) 2 BuiltIn SecondaryViewportMaskNV
                               Decorate 12(gl_PerVertex) Block
                               Decorate 12(gl_PerVertex) Block
                               Decorate 18(gl_InvocationID) BuiltIn InvocationId
                               Decorate 18(gl_InvocationID) BuiltIn InvocationId
-                              MemberDecorate 28(gl_PerVertex) 0 BuiltIn Position
-                              MemberDecorate 28(gl_PerVertex) 1 BuiltIn PointSize
-                              MemberDecorate 28(gl_PerVertex) 2 BuiltIn ClipDistance
-                              MemberDecorate 28(gl_PerVertex) 3 BuiltIn CullDistance
-                              Decorate 28(gl_PerVertex) Block
+                              MemberDecorate 29(gl_PerVertex) 0 BuiltIn Position
+                              MemberDecorate 29(gl_PerVertex) 1 BuiltIn PointSize
+                              MemberDecorate 29(gl_PerVertex) 2 BuiltIn ClipDistance
+                              MemberDecorate 29(gl_PerVertex) 3 BuiltIn CullDistance
+                              Decorate 29(gl_PerVertex) Block
                2:             TypeVoid
                2:             TypeVoid
                3:             TypeFunction 2
                3:             TypeFunction 2
                6:             TypeInt 32 1
                6:             TypeInt 32 1
@@ -65,22 +66,23 @@ Warning, version 450 is not yet complete; most version-specific features are pre
               23:             TypePointer Output 6(int)
               23:             TypePointer Output 6(int)
               26:      9(int) Constant 1
               26:      9(int) Constant 1
               27:             TypeArray 7(float) 26
               27:             TypeArray 7(float) 26
-28(gl_PerVertex):             TypeStruct 8(fvec4) 7(float) 27 27 8(fvec4)
-              29:      9(int) Constant 32
-              30:             TypeArray 28(gl_PerVertex) 29
-              31:             TypePointer Input 30
-       32(gl_in):     31(ptr) Variable Input
-              33:             TypePointer Input 8(fvec4)
-              36:             TypePointer Output 8(fvec4)
+              28:             TypeArray 8(fvec4) 26
+29(gl_PerVertex):             TypeStruct 8(fvec4) 7(float) 27 27 8(fvec4) 28
+              30:      9(int) Constant 32
+              31:             TypeArray 29(gl_PerVertex) 30
+              32:             TypePointer Input 31
+       33(gl_in):     32(ptr) Variable Input
+              34:             TypePointer Input 8(fvec4)
+              37:             TypePointer Output 8(fvec4)
          4(main):           2 Function None 3
          4(main):           2 Function None 3
                5:             Label
                5:             Label
               19:      6(int) Load 18(gl_InvocationID)
               19:      6(int) Load 18(gl_InvocationID)
               24:     23(ptr) AccessChain 16(gl_out) 19 20 21
               24:     23(ptr) AccessChain 16(gl_out) 19 20 21
                               Store 24 22
                               Store 24 22
               25:      6(int) Load 18(gl_InvocationID)
               25:      6(int) Load 18(gl_InvocationID)
-              34:     33(ptr) AccessChain 32(gl_in) 22 21
-              35:    8(fvec4) Load 34
-              37:     36(ptr) AccessChain 16(gl_out) 25 22
-                              Store 37 35
+              35:     34(ptr) AccessChain 33(gl_in) 22 21
+              36:    8(fvec4) Load 35
+              38:     37(ptr) AccessChain 16(gl_out) 25 22
+                              Store 38 36
                               Return
                               Return
                               FunctionEnd
                               FunctionEnd

+ 1 - 1
3rdparty/glslang/Test/spv.140.frag

@@ -14,7 +14,7 @@ layout(std140) uniform bn {
     layout(column_major) mat4 matca[4];
     layout(column_major) mat4 matca[4];
     layout(row_major) mat4 matr;
     layout(row_major) mat4 matr;
     layout(column_major) mat4 matc;
     layout(column_major) mat4 matc;
-    mat4 matrdef;
+    layout(align=512, offset=1024) mat4 matrdef;
 };
 };
 
 
 uniform sampler2DRect sampR;
 uniform sampler2DRect sampR;

+ 1 - 1
3rdparty/glslang/Test/spv.300layout.vert

@@ -25,7 +25,7 @@ layout(column_major) uniform T3 { // shared and column_major
     mat4 M3; // column_major
     mat4 M3; // column_major
     layout(row_major) mat4 M4; // row major
     layout(row_major) mat4 M4; // row major
     mat2x3 N2; // column_major
     mat2x3 N2; // column_major
-    uvec3 uv3a[4];
+    layout(align=16, offset=2048) uvec3 uv3a[4];
 };
 };
 
 
 in uint uiuin;
 in uint uiuin;

+ 74 - 0
3rdparty/glslang/Test/spv.image.load-formatted.frag

@@ -0,0 +1,74 @@
+#version 450
+
+#extension GL_EXT_shader_image_load_formatted : require
+
+layout(binding = 0)    uniform image1D         i1D;
+layout(binding = 1)    uniform image2D         i2D;
+layout(binding = 2)    uniform image3D         i3D;
+layout(binding = 3)    uniform imageCube       iCube;
+layout(binding = 4)    uniform imageCubeArray  iCubeArray;
+layout(binding = 5)    uniform image2DRect     i2DRect;
+layout(binding = 6)    uniform image1DArray    i1DArray;
+layout(binding = 7)       uniform image2DArray    i2DArray;
+layout(binding = 8)    uniform imageBuffer     iBuffer;
+layout(binding = 9)    uniform image2DMS       i2DMS;
+layout(binding = 10)   uniform image2DMSArray  i2DMSArray;
+
+flat in int     ic1D;
+flat in ivec2   ic2D;
+flat in ivec3   ic3D;
+flat in ivec4   ic4D;
+
+writeonly layout(binding = 1)   uniform image2D         wo2D;
+
+flat in uint value;
+
+out vec4 fragData;
+
+void main()
+{
+    ivec3 iv = ivec3(0);
+    iv.x    += imageSize(i1D);
+    iv.xy   += imageSize(i2D);
+    iv.xyz  += imageSize(i3D);
+    iv.xy   += imageSize(iCube);
+    iv.xyz  += imageSize(iCubeArray);
+    iv.xy   += imageSize(i2DRect);
+    iv.xy   += imageSize(i1DArray);
+    iv.xyz  += imageSize(i2DArray);
+    iv.x    += imageSize(iBuffer);
+    iv.xy   += imageSize(i2DMS);
+    iv.xyz  += imageSize(i2DMSArray);
+
+    iv.x    += imageSamples(i2DMS);
+    iv.x    += imageSamples(i2DMSArray);
+
+    vec4 v = vec4(0.0);
+    v += imageLoad(i1D, ic1D);
+    imageStore(i1D, ic1D, v);
+    v += imageLoad(i2D, ic2D);
+    imageStore(i2D, ic2D, v);
+    v += imageLoad(i3D, ic3D);
+    imageStore(i3D, ic3D, v);
+    v += imageLoad(iCube, ic3D);
+    imageStore(iCube, ic3D, v);
+    v += imageLoad(iCubeArray, ic3D);
+    imageStore(iCubeArray, ic3D, v);
+    v += imageLoad(i2DRect, ic2D);
+    imageStore(i2DRect, ic2D, v);
+    v += imageLoad(i1DArray, ic2D);
+    imageStore(i1DArray, ic2D, v);
+    v += imageLoad(i2DArray, ic3D);
+    imageStore(i2DArray, ic3D, v);
+    v += imageLoad(iBuffer, ic1D);
+    imageStore(iBuffer, ic1D, v);
+    v += imageLoad(i2DMS, ic2D, 1);
+    imageStore(i2DMS, ic2D, 2, v);
+    v += imageLoad(i2DMSArray, ic3D, 3);
+    imageStore(i2DMSArray, ic3D, 4, v);
+
+    imageStore(wo2D, ic2D, v);
+
+    fragData = v;
+}
+

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

@@ -43,4 +43,7 @@ void main()
     sum34 += mat3x4(v3, f, v3, f, v3, f);
     sum34 += mat3x4(v3, f, v3, f, v3, f);
 
 
     color += sum3 * m43 + sum4;
     color += sum3 * m43 + sum4;
+
+    color += vec4(m43);
+    color += vec4(vec3(mat2(f)), 7.2);
 }
 }

+ 14 - 0
3rdparty/glslang/Test/spv.multiviewPerViewAttributes.tesc

@@ -0,0 +1,14 @@
+#version 450
+
+#extension GL_NVX_multiview_per_view_attributes :require
+
+layout(vertices = 4) out;
+out gl_PerVertex {
+    int gl_ViewportMaskPerViewNV[];
+    vec4 gl_PositionPerViewNV[];
+ } gl_out[];
+void main()
+{
+    gl_out[gl_InvocationID].gl_ViewportMaskPerViewNV[0]    = 1;
+    gl_out[gl_InvocationID].gl_PositionPerViewNV[0]        =  gl_in[1].gl_Position;
+}

+ 10 - 0
3rdparty/glslang/Test/spv.multiviewPerViewAttributes.vert

@@ -0,0 +1,10 @@
+#version 450
+
+#extension GL_NVX_multiview_per_view_attributes :require
+
+void main()
+{
+    gl_ViewportMaskPerViewNV[0]    = 1;
+    gl_PositionPerViewNV[0]        = gl_Position;
+}
+

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

@@ -207,6 +207,8 @@ enum TBuiltInVariable {
     EbvViewportMaskNV,
     EbvViewportMaskNV,
     EbvSecondaryPositionNV,
     EbvSecondaryPositionNV,
     EbvSecondaryViewportMaskNV,
     EbvSecondaryViewportMaskNV,
+    EbvPositionPerViewNV,
+    EbvViewportMaskPerViewNV,
 #endif 
 #endif 
     // HLSL built-ins that live only temporarily, until they get remapped
     // HLSL built-ins that live only temporarily, until they get remapped
     // to one of the above.
     // to one of the above.
@@ -325,6 +327,8 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
     case EbvViewportMaskNV:             return "ViewportMaskNV";
     case EbvViewportMaskNV:             return "ViewportMaskNV";
     case EbvSecondaryPositionNV:        return "SecondaryPositionNV";
     case EbvSecondaryPositionNV:        return "SecondaryPositionNV";
     case EbvSecondaryViewportMaskNV:    return "SecondaryViewportMaskNV";
     case EbvSecondaryViewportMaskNV:    return "SecondaryViewportMaskNV";
+    case EbvPositionPerViewNV:          return "PositionPerViewNV";
+    case EbvViewportMaskPerViewNV:      return "ViewportMaskPerViewNV";
 #endif 
 #endif 
     default:                      return "unknown built-in variable";
     default:                      return "unknown built-in variable";
     }
     }

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

@@ -1360,6 +1360,8 @@ public:
         case EbvViewportMaskNV:
         case EbvViewportMaskNV:
         case EbvSecondaryPositionNV:
         case EbvSecondaryPositionNV:
         case EbvSecondaryViewportMaskNV:
         case EbvSecondaryViewportMaskNV:
+        case EbvPositionPerViewNV:
+        case EbvViewportMaskPerViewNV:
 #endif
 #endif
             return true;
             return true;
         default:
         default:

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

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

+ 31 - 13
3rdparty/glslang/glslang/MachineIndependent/Initialize.cpp

@@ -3249,6 +3249,8 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
                 "out int gl_ViewportMask[];"
                 "out int gl_ViewportMask[];"
                 "out int gl_SecondaryViewportMaskNV[];"
                 "out int gl_SecondaryViewportMaskNV[];"
                 "out vec4 gl_SecondaryPositionNV;"
                 "out vec4 gl_SecondaryPositionNV;"
+                "out vec4 gl_PositionPerViewNV[];"
+                "out int  gl_ViewportMaskPerViewNV[];"
                 );
                 );
 #endif
 #endif
 
 
@@ -3313,6 +3315,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
                 "float gl_CullDistance[];"
                 "float gl_CullDistance[];"
 #ifdef NV_EXTENSIONS
 #ifdef NV_EXTENSIONS
                 "vec4 gl_SecondaryPositionNV;"
                 "vec4 gl_SecondaryPositionNV;"
+                "vec4 gl_PositionPerViewNV[];"
 #endif
 #endif
                 );
                 );
         stageBuiltins[EShLangGeometry].append(
         stageBuiltins[EShLangGeometry].append(
@@ -3362,9 +3365,11 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
 #ifdef NV_EXTENSIONS
 #ifdef NV_EXTENSIONS
         if (version >= 450)
         if (version >= 450)
             stageBuiltins[EShLangGeometry].append(
             stageBuiltins[EShLangGeometry].append(
-            "out int gl_ViewportMask[];"
-            "out int gl_SecondaryViewportMaskNV[];"
-            "out vec4 gl_SecondaryPositionNV;"
+                "out int gl_ViewportMask[];"
+                "out int gl_SecondaryViewportMaskNV[];"
+                "out vec4 gl_SecondaryPositionNV;"
+                "out vec4 gl_PositionPerViewNV[];"
+                "out int  gl_ViewportMaskPerViewNV[];"
             );
             );
 #endif
 #endif
 
 
@@ -3424,11 +3429,13 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
             stageBuiltins[EShLangTessControl].append(
             stageBuiltins[EShLangTessControl].append(
                 "float gl_CullDistance[];"
                 "float gl_CullDistance[];"
 #ifdef NV_EXTENSIONS
 #ifdef NV_EXTENSIONS
-                "int gl_ViewportIndex;"
-                "int gl_Layer;"
-                "int gl_ViewportMask[];"
+                "int  gl_ViewportIndex;"
+                "int  gl_Layer;"
+                "int  gl_ViewportMask[];"
                 "vec4 gl_SecondaryPositionNV;"
                 "vec4 gl_SecondaryPositionNV;"
-                "int gl_SecondaryViewportMaskNV[];"
+                "int  gl_SecondaryViewportMaskNV[];"
+                "vec4 gl_PositionPerViewNV[];"
+                "int  gl_ViewportMaskPerViewNV[];"
 #endif
 #endif
                 );
                 );
         stageBuiltins[EShLangTessControl].append(
         stageBuiltins[EShLangTessControl].append(
@@ -3503,11 +3510,13 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
 #ifdef NV_EXTENSIONS
 #ifdef NV_EXTENSIONS
         if (version >= 450)
         if (version >= 450)
             stageBuiltins[EShLangTessEvaluation].append(
             stageBuiltins[EShLangTessEvaluation].append(
-                "out int gl_ViewportIndex;"
-                "out int gl_Layer;"
-                "out int gl_ViewportMask[];"
+                "out int  gl_ViewportIndex;"
+                "out int  gl_Layer;"
+                "out int  gl_ViewportMask[];"
                 "out vec4 gl_SecondaryPositionNV;"
                 "out vec4 gl_SecondaryPositionNV;"
-                "out int gl_SecondaryViewportMaskNV[];"
+                "out int  gl_SecondaryViewportMaskNV[];"
+                "out vec4 gl_PositionPerViewNV[];"
+                "out int  gl_ViewportMaskPerViewNV[];"
                 );
                 );
 #endif
 #endif
 
 
@@ -4446,6 +4455,7 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf
                         "highp float gl_PointSize;"
                         "highp float gl_PointSize;"
 #ifdef NV_EXTENSIONS
 #ifdef NV_EXTENSIONS
                         "highp vec4 gl_SecondaryPositionNV;"
                         "highp vec4 gl_SecondaryPositionNV;"
+                        "highp vec4 gl_PositionPerViewNV[];"
 #endif
 #endif
                     "} gl_in[gl_MaxPatchVertices];"
                     "} gl_in[gl_MaxPatchVertices];"
                     "\n");
                     "\n");
@@ -4635,6 +4645,7 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf
                         "float gl_CullDistance[];"
                         "float gl_CullDistance[];"
 #ifdef NV_EXTENSIONS
 #ifdef NV_EXTENSIONS
                         "vec4 gl_SecondaryPositionNV;"
                         "vec4 gl_SecondaryPositionNV;"
+                        "vec4 gl_PositionPerViewNV[];"
 #endif
 #endif
                        );
                        );
                 s.append(
                 s.append(
@@ -5033,19 +5044,26 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
         symbolTable.setVariableExtensions("gl_ViewportMask",            1, &E_GL_NV_viewport_array2);
         symbolTable.setVariableExtensions("gl_ViewportMask",            1, &E_GL_NV_viewport_array2);
         symbolTable.setVariableExtensions("gl_SecondaryPositionNV",     1, &E_GL_NV_stereo_view_rendering);
         symbolTable.setVariableExtensions("gl_SecondaryPositionNV",     1, &E_GL_NV_stereo_view_rendering);
         symbolTable.setVariableExtensions("gl_SecondaryViewportMaskNV", 1, &E_GL_NV_stereo_view_rendering);
         symbolTable.setVariableExtensions("gl_SecondaryViewportMaskNV", 1, &E_GL_NV_stereo_view_rendering);
+        symbolTable.setVariableExtensions("gl_PositionPerViewNV",       1, &E_GL_NVX_multiview_per_view_attributes);
+        symbolTable.setVariableExtensions("gl_ViewportMaskPerViewNV",   1, &E_GL_NVX_multiview_per_view_attributes);
 
 
         BuiltInVariable("gl_ViewportMask",              EbvViewportMaskNV,          symbolTable);
         BuiltInVariable("gl_ViewportMask",              EbvViewportMaskNV,          symbolTable);
         BuiltInVariable("gl_SecondaryPositionNV",       EbvSecondaryPositionNV,     symbolTable);
         BuiltInVariable("gl_SecondaryPositionNV",       EbvSecondaryPositionNV,     symbolTable);
         BuiltInVariable("gl_SecondaryViewportMaskNV",   EbvSecondaryViewportMaskNV, symbolTable);
         BuiltInVariable("gl_SecondaryViewportMaskNV",   EbvSecondaryViewportMaskNV, symbolTable);
+        BuiltInVariable("gl_PositionPerViewNV",         EbvPositionPerViewNV,       symbolTable);
+        BuiltInVariable("gl_ViewportMaskPerViewNV",     EbvViewportMaskPerViewNV,   symbolTable);
 
 
-        if (language != EShLangVertex) 
+        if (language != EShLangVertex) {
             BuiltInVariable("gl_in", "gl_SecondaryPositionNV", EbvSecondaryPositionNV, symbolTable);
             BuiltInVariable("gl_in", "gl_SecondaryPositionNV", EbvSecondaryPositionNV, symbolTable);
-
+            BuiltInVariable("gl_in", "gl_PositionPerViewNV",   EbvPositionPerViewNV,   symbolTable);
+        }
         BuiltInVariable("gl_out", "gl_Layer",                   EbvLayer,                   symbolTable);
         BuiltInVariable("gl_out", "gl_Layer",                   EbvLayer,                   symbolTable);
         BuiltInVariable("gl_out", "gl_ViewportIndex",           EbvViewportIndex,           symbolTable);
         BuiltInVariable("gl_out", "gl_ViewportIndex",           EbvViewportIndex,           symbolTable);
         BuiltInVariable("gl_out", "gl_ViewportMask",            EbvViewportMaskNV,          symbolTable);
         BuiltInVariable("gl_out", "gl_ViewportMask",            EbvViewportMaskNV,          symbolTable);
         BuiltInVariable("gl_out", "gl_SecondaryPositionNV",     EbvSecondaryPositionNV,     symbolTable);
         BuiltInVariable("gl_out", "gl_SecondaryPositionNV",     EbvSecondaryPositionNV,     symbolTable);
         BuiltInVariable("gl_out", "gl_SecondaryViewportMaskNV", EbvSecondaryViewportMaskNV, symbolTable);
         BuiltInVariable("gl_out", "gl_SecondaryViewportMaskNV", EbvSecondaryViewportMaskNV, symbolTable);
+        BuiltInVariable("gl_out", "gl_PositionPerViewNV",       EbvPositionPerViewNV,       symbolTable);
+        BuiltInVariable("gl_out", "gl_ViewportMaskPerViewNV",   EbvViewportMaskPerViewNV,   symbolTable);
 #endif
 #endif
 
 
         BuiltInVariable("gl_PatchVerticesIn", EbvPatchVertices,  symbolTable);
         BuiltInVariable("gl_PatchVerticesIn", EbvPatchVertices,  symbolTable);

+ 19 - 10
3rdparty/glslang/glslang/MachineIndependent/ParseHelper.cpp

@@ -4008,16 +4008,20 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
         //  - uniform offsets
         //  - uniform offsets
         //  - atomic_uint offsets
         //  - atomic_uint offsets
         const char* feature = "offset";
         const char* feature = "offset";
-        requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, feature);
-        const char* exts[2] = { E_GL_ARB_enhanced_layouts, E_GL_ARB_shader_atomic_counters };
-        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 420, 2, exts, feature);
-        profileRequires(loc, EEsProfile, 310, nullptr, feature);
+        if (spvVersion.spv == 0) {
+            requireProfile(loc, EEsProfile | ECoreProfile | ECompatibilityProfile, feature);
+            const char* exts[2] = { E_GL_ARB_enhanced_layouts, E_GL_ARB_shader_atomic_counters };
+            profileRequires(loc, ECoreProfile | ECompatibilityProfile, 420, 2, exts, feature);
+            profileRequires(loc, EEsProfile, 310, nullptr, feature);
+        }
         publicType.qualifier.layoutOffset = value;
         publicType.qualifier.layoutOffset = value;
         return;
         return;
     } else if (id == "align") {
     } else if (id == "align") {
         const char* feature = "uniform buffer-member align";
         const char* feature = "uniform buffer-member align";
-        requireProfile(loc, ECoreProfile | ECompatibilityProfile, feature);
-        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, E_GL_ARB_enhanced_layouts, feature);
+        if (spvVersion.spv == 0) {
+            requireProfile(loc, ECoreProfile | ECompatibilityProfile, feature);
+            profileRequires(loc, ECoreProfile | ECompatibilityProfile, 440, E_GL_ARB_enhanced_layouts, feature);
+        }
         // "The specified alignment must be a power of 2, or a compile-time error results."
         // "The specified alignment must be a power of 2, or a compile-time error results."
         if (! IsPow2(value))
         if (! IsPow2(value))
             error(loc, "must be a power of 2", "align", "");
             error(loc, "must be a power of 2", "align", "");
@@ -4495,8 +4499,11 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type)
                 }
                 }
             }
             }
         }
         }
-    } else if (type.isImage() && ! qualifier.writeonly)
-        error(loc, "image variables not declared 'writeonly' must have a format layout qualifier", "", "");
+    } else if (type.isImage() && ! qualifier.writeonly) {
+        const char *explanation = "image variables declared 'writeonly' without a format layout qualifier";
+        requireProfile(loc, ECoreProfile | ECompatibilityProfile, explanation);
+        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 0, E_GL_EXT_shader_image_load_formatted, explanation);
+    }
 
 
     if (qualifier.layoutPushConstant && type.getBasicType() != EbtBlock)
     if (qualifier.layoutPushConstant && type.getBasicType() != EbtBlock)
         error(loc, "can only be used with a block", "push_constant", "");
         error(loc, "can only be used with a block", "push_constant", "");
@@ -5546,8 +5553,10 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con
         if (memberType.isArray())
         if (memberType.isArray())
             arrayUnsizedCheck(memberLoc, currentBlockQualifier, &memberType.getArraySizes(), false, member == typeList.size() - 1);
             arrayUnsizedCheck(memberLoc, currentBlockQualifier, &memberType.getArraySizes(), false, member == typeList.size() - 1);
         if (memberQualifier.hasOffset()) {
         if (memberQualifier.hasOffset()) {
-            requireProfile(memberLoc, ~EEsProfile, "offset on block member");
-            profileRequires(memberLoc, ~EEsProfile, 440, E_GL_ARB_enhanced_layouts, "offset on block member");
+            if (spvVersion.spv == 0) {
+                requireProfile(memberLoc, ~EEsProfile, "offset on block member");
+                profileRequires(memberLoc, ~EEsProfile, 440, E_GL_ARB_enhanced_layouts, "offset on block member");
+            }
         }
         }
 
 
         if (memberType.containsOpaque())
         if (memberType.containsOpaque())

+ 3 - 0
3rdparty/glslang/glslang/MachineIndependent/Versions.cpp

@@ -182,6 +182,7 @@ void TParseVersions::initializeExtensionBehavior()
 //    extensionBehavior[E_GL_ARB_cull_distance]                = EBhDisable;    // present for 4.5, but need extension control over block members
 //    extensionBehavior[E_GL_ARB_cull_distance]                = EBhDisable;    // present for 4.5, but need extension control over block members
 
 
     extensionBehavior[E_GL_EXT_shader_non_constant_global_initializers] = EBhDisable;
     extensionBehavior[E_GL_EXT_shader_non_constant_global_initializers] = EBhDisable;
+    extensionBehavior[E_GL_EXT_shader_image_load_formatted]  = EBhDisable;
 
 
     // #line and #include
     // #line and #include
     extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive]          = EBhDisable;
     extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive]          = EBhDisable;
@@ -201,6 +202,7 @@ void TParseVersions::initializeExtensionBehavior()
     extensionBehavior[E_GL_ARB_shader_viewport_layer_array]          = EBhDisable;
     extensionBehavior[E_GL_ARB_shader_viewport_layer_array]          = EBhDisable;
     extensionBehavior[E_GL_NV_viewport_array2]                       = EBhDisable;
     extensionBehavior[E_GL_NV_viewport_array2]                       = EBhDisable;
     extensionBehavior[E_GL_NV_stereo_view_rendering]                 = EBhDisable;
     extensionBehavior[E_GL_NV_stereo_view_rendering]                 = EBhDisable;
+    extensionBehavior[E_GL_NVX_multiview_per_view_attributes]        = EBhDisable;
 #endif
 #endif
 
 
     // AEP
     // AEP
@@ -302,6 +304,7 @@ void TParseVersions::getPreamble(std::string& preamble)
             "#define GL_ARB_sparse_texture_clamp 1\n"
             "#define GL_ARB_sparse_texture_clamp 1\n"
 //            "#define GL_ARB_cull_distance 1\n"    // present for 4.5, but need extension control over block members
 //            "#define GL_ARB_cull_distance 1\n"    // present for 4.5, but need extension control over block members
             "#define GL_EXT_shader_non_constant_global_initializers 1\n"
             "#define GL_EXT_shader_non_constant_global_initializers 1\n"
+            "#define GL_EXT_shader_image_load_formatted 1\n"
 
 
 #ifdef AMD_EXTENSIONS
 #ifdef AMD_EXTENSIONS
             "#define GL_AMD_shader_ballot 1\n"
             "#define GL_AMD_shader_ballot 1\n"

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

@@ -130,6 +130,7 @@ const char* const E_GL_ARB_sparse_texture_clamp         = "GL_ARB_sparse_texture
 // 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_cull_distance            = "GL_ARB_cull_distance";  // present for 4.5, but need extension control over block members
 
 
 const char* const E_GL_EXT_shader_non_constant_global_initializers = "GL_EXT_shader_non_constant_global_initializers";
 const char* const E_GL_EXT_shader_non_constant_global_initializers = "GL_EXT_shader_non_constant_global_initializers";
+const char* const E_GL_EXT_shader_image_load_formatted = "GL_EXT_shader_image_load_formatted";
 
 
 // #line and #include
 // #line and #include
 const char* const E_GL_GOOGLE_cpp_style_line_directive          = "GL_GOOGLE_cpp_style_line_directive";
 const char* const E_GL_GOOGLE_cpp_style_line_directive          = "GL_GOOGLE_cpp_style_line_directive";
@@ -149,6 +150,7 @@ const char* const E_SPV_NV_geometry_shader_passthrough          = "GL_NV_geometr
 const char* const E_GL_ARB_shader_viewport_layer_array          = "GL_ARB_shader_viewport_layer_array";
 const char* const E_GL_ARB_shader_viewport_layer_array          = "GL_ARB_shader_viewport_layer_array";
 const char* const E_GL_NV_viewport_array2                       = "GL_NV_viewport_array2";
 const char* const E_GL_NV_viewport_array2                       = "GL_NV_viewport_array2";
 const char* const E_GL_NV_stereo_view_rendering                 = "GL_NV_stereo_view_rendering";
 const char* const E_GL_NV_stereo_view_rendering                 = "GL_NV_stereo_view_rendering";
+const char* const E_GL_NVX_multiview_per_view_attributes        = "GL_NVX_multiview_per_view_attributes";
 
 
 // Arrays of extensions for the above viewportEXTs duplications
 // Arrays of extensions for the above viewportEXTs duplications
 
 

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

@@ -386,6 +386,8 @@ INSTANTIATE_TEST_CASE_P(
     "spv.viewportArray2.tesc",
     "spv.viewportArray2.tesc",
     "spv.stereoViewRendering.vert",
     "spv.stereoViewRendering.vert",
     "spv.stereoViewRendering.tesc",
     "spv.stereoViewRendering.tesc",
+    "spv.multiviewPerViewAttributes.vert",
+    "spv.multiviewPerViewAttributes.tesc",
 })),
 })),
 FileNameAsCustomTestSuffix
 FileNameAsCustomTestSuffix
 );
 );

+ 4 - 4
3rdparty/glslang/hlsl/hlslParseHelper.cpp

@@ -543,7 +543,7 @@ bool HlslParseContext::parseMatrixSwizzleSelector(const TSourceLoc& loc, const T
                 error(loc, "matrix component swizzle missing", compString.c_str(), "");
                 error(loc, "matrix component swizzle missing", compString.c_str(), "");
                 return false;
                 return false;
             }
             }
-            startPos[numComps++] = c + 1;
+            startPos[numComps++] = (int)c + 1;
         }
         }
     }
     }
 
 
@@ -2153,7 +2153,7 @@ TIntermTyped* HlslParseContext::handleAssignToMatrixSwizzle(const TSourceLoc& lo
     TIntermTyped* vectorAssign = nullptr;
     TIntermTyped* vectorAssign = nullptr;
     if (vector == nullptr) {
     if (vector == nullptr) {
         // create a new intermediate vector variable to assign to
         // create a new intermediate vector variable to assign to
-        TType vectorType(matrix->getBasicType(), EvqTemporary, matrix->getQualifier().precision, swizzle.size()/2);
+        TType vectorType(matrix->getBasicType(), EvqTemporary, matrix->getQualifier().precision, (int)swizzle.size()/2);
         vector = intermediate.addSymbol(*makeInternalVariable("intermVec", vectorType), loc);
         vector = intermediate.addSymbol(*makeInternalVariable("intermVec", vectorType), loc);
 
 
         // assign the right to the new vector
         // assign the right to the new vector
@@ -3887,6 +3887,8 @@ void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, con
         qualifier.builtIn = EbvGlobalInvocationId;
         qualifier.builtIn = EbvGlobalInvocationId;
     else if (semanticUpperCase == "SV_GROUPTHREADID")
     else if (semanticUpperCase == "SV_GROUPTHREADID")
         qualifier.builtIn = EbvLocalInvocationId;
         qualifier.builtIn = EbvLocalInvocationId;
+    else if (semanticUpperCase == "SV_GROUPINDEX")
+        qualifier.builtIn = EbvLocalInvocationIndex;
     else if (semanticUpperCase == "SV_GROUPID")
     else if (semanticUpperCase == "SV_GROUPID")
         qualifier.builtIn = EbvWorkGroupId;
         qualifier.builtIn = EbvWorkGroupId;
     else if (semanticUpperCase == "SV_DOMAINLOCATION")
     else if (semanticUpperCase == "SV_DOMAINLOCATION")
@@ -3903,8 +3905,6 @@ void HlslParseContext::handleSemantic(TSourceLoc loc, TQualifier& qualifier, con
         qualifier.builtIn = EbvFragDepthLesser;
         qualifier.builtIn = EbvFragDepthLesser;
     else if( semanticUpperCase == "SV_STENCILREF")
     else if( semanticUpperCase == "SV_STENCILREF")
         error(loc, "unimplemented; need ARB_shader_stencil_export", "SV_STENCILREF", "");
         error(loc, "unimplemented; need ARB_shader_stencil_export", "SV_STENCILREF", "");
-    else if( semanticUpperCase == "SV_GROUPINDEX")
-        error(loc, "unimplemented", "SV_GROUPINDEX", "");
 }
 }
 
 
 //
 //