Web: Remove/rationalize a set of *_EXTENSIONS, using GLSLANG_WEB.
Focus was on the front end (not SPIR-V), minus the grammar. Reduces #ifdef count by around 320 and makes the web build 270K smaller, which is about 90% the target size. The grammar and scanner will be another step, as will the SPIR-V backend. This makes heavy use of methods #ifdef'd to return false as a global way of turning off code, relying on C++ DCE to do the rest.
This commit is contained in:
		
							parent
							
								
									e66dace97e
								
							
						
					
					
						commit
						7015bd658e
					
				@ -441,7 +441,7 @@ spv::Decoration TGlslangToSpvTraverser::TranslateInterpolationDecoration(const g
 | 
				
			|||||||
    if (qualifier.smooth)
 | 
					    if (qualifier.smooth)
 | 
				
			||||||
        // Smooth decoration doesn't exist in SPIR-V 1.0
 | 
					        // Smooth decoration doesn't exist in SPIR-V 1.0
 | 
				
			||||||
        return spv::DecorationMax;
 | 
					        return spv::DecorationMax;
 | 
				
			||||||
    else if (qualifier.nopersp)
 | 
					    else if (qualifier.isNonPerspective())
 | 
				
			||||||
        return spv::DecorationNoPerspective;
 | 
					        return spv::DecorationNoPerspective;
 | 
				
			||||||
    else if (qualifier.flat)
 | 
					    else if (qualifier.flat)
 | 
				
			||||||
        return spv::DecorationFlat;
 | 
					        return spv::DecorationFlat;
 | 
				
			||||||
@ -984,7 +984,7 @@ spv::ImageFormat TGlslangToSpvTraverser::TranslateImageFormat(const glslang::TTy
 | 
				
			|||||||
    assert(type.getBasicType() == glslang::EbtSampler);
 | 
					    assert(type.getBasicType() == glslang::EbtSampler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Check for capabilities
 | 
					    // Check for capabilities
 | 
				
			||||||
    switch (type.getQualifier().layoutFormat) {
 | 
					    switch (type.getQualifier().getFormat()) {
 | 
				
			||||||
    case glslang::ElfRg32f:
 | 
					    case glslang::ElfRg32f:
 | 
				
			||||||
    case glslang::ElfRg16f:
 | 
					    case glslang::ElfRg16f:
 | 
				
			||||||
    case glslang::ElfR11fG11fB10f:
 | 
					    case glslang::ElfR11fG11fB10f:
 | 
				
			||||||
@ -1021,7 +1021,7 @@ spv::ImageFormat TGlslangToSpvTraverser::TranslateImageFormat(const glslang::TTy
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // do the translation
 | 
					    // do the translation
 | 
				
			||||||
    switch (type.getQualifier().layoutFormat) {
 | 
					    switch (type.getQualifier().getFormat()) {
 | 
				
			||||||
    case glslang::ElfNone:          return spv::ImageFormatUnknown;
 | 
					    case glslang::ElfNone:          return spv::ImageFormatUnknown;
 | 
				
			||||||
    case glslang::ElfRgba32f:       return spv::ImageFormatRgba32f;
 | 
					    case glslang::ElfRgba32f:       return spv::ImageFormatRgba32f;
 | 
				
			||||||
    case glslang::ElfRgba16f:       return spv::ImageFormatRgba16f;
 | 
					    case glslang::ElfRgba16f:       return spv::ImageFormatRgba16f;
 | 
				
			||||||
@ -1155,7 +1155,7 @@ spv::StorageClass TGlslangToSpvTraverser::TranslateStorageClass(const glslang::T
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (type.getQualifier().isUniformOrBuffer()) {
 | 
					    if (type.getQualifier().isUniformOrBuffer()) {
 | 
				
			||||||
        if (type.getQualifier().layoutPushConstant)
 | 
					        if (type.getQualifier().isPushConstant())
 | 
				
			||||||
            return spv::StorageClassPushConstant;
 | 
					            return spv::StorageClassPushConstant;
 | 
				
			||||||
        if (type.getBasicType() == glslang::EbtBlock)
 | 
					        if (type.getBasicType() == glslang::EbtBlock)
 | 
				
			||||||
            return spv::StorageClassUniform;
 | 
					            return spv::StorageClassUniform;
 | 
				
			||||||
@ -1230,10 +1230,8 @@ bool IsDescriptorResource(const glslang::TType& type)
 | 
				
			|||||||
    // uniform and buffer blocks are included, unless it is a push_constant
 | 
					    // uniform and buffer blocks are included, unless it is a push_constant
 | 
				
			||||||
    if (type.getBasicType() == glslang::EbtBlock)
 | 
					    if (type.getBasicType() == glslang::EbtBlock)
 | 
				
			||||||
        return type.getQualifier().isUniformOrBuffer() &&
 | 
					        return type.getQualifier().isUniformOrBuffer() &&
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					        ! type.getQualifier().isShaderRecordNV() &&
 | 
				
			||||||
        ! type.getQualifier().layoutShaderRecordNV &&
 | 
					        ! type.getQualifier().isPushConstant();
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        ! type.getQualifier().layoutPushConstant;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // non block...
 | 
					    // non block...
 | 
				
			||||||
    // basically samplerXXX/subpass/sampler/texture are all included
 | 
					    // basically samplerXXX/subpass/sampler/texture are all included
 | 
				
			||||||
@ -1253,9 +1251,9 @@ void InheritQualifiers(glslang::TQualifier& child, const glslang::TQualifier& pa
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (parent.invariant)
 | 
					    if (parent.invariant)
 | 
				
			||||||
        child.invariant = true;
 | 
					        child.invariant = true;
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    if (parent.nopersp)
 | 
					    if (parent.nopersp)
 | 
				
			||||||
        child.nopersp = true;
 | 
					        child.nopersp = true;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    if (parent.explicitInterp)
 | 
					    if (parent.explicitInterp)
 | 
				
			||||||
        child.explicitInterp = true;
 | 
					        child.explicitInterp = true;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@ -1802,7 +1800,7 @@ bool TGlslangToSpvTraverser::visitBinary(glslang::TVisit /* visit */, glslang::T
 | 
				
			|||||||
                // Load through a block reference is performed with a dot operator that
 | 
					                // Load through a block reference is performed with a dot operator that
 | 
				
			||||||
                // is mapped to EOpIndexDirectStruct. When we get to the actual reference,
 | 
					                // is mapped to EOpIndexDirectStruct. When we get to the actual reference,
 | 
				
			||||||
                // do a load and reset the access chain.
 | 
					                // do a load and reset the access chain.
 | 
				
			||||||
                if (node->getLeft()->getBasicType() == glslang::EbtReference &&
 | 
					                if (node->getLeft()->isReference() &&
 | 
				
			||||||
                    !node->getLeft()->getType().isArray() &&
 | 
					                    !node->getLeft()->getType().isArray() &&
 | 
				
			||||||
                    node->getOp() == glslang::EOpIndexDirectStruct)
 | 
					                    node->getOp() == glslang::EOpIndexDirectStruct)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@ -3560,7 +3558,7 @@ spv::Id TGlslangToSpvTraverser::convertGlslangStructToSpvType(const glslang::TTy
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            // Make forward pointers for any pointer members, and create a list of members to
 | 
					            // Make forward pointers for any pointer members, and create a list of members to
 | 
				
			||||||
            // convert to spirv types after creating the struct.
 | 
					            // convert to spirv types after creating the struct.
 | 
				
			||||||
            if (glslangMember.getBasicType() == glslang::EbtReference) {
 | 
					            if (glslangMember.isReference()) {
 | 
				
			||||||
                if (forwardPointers.find(glslangMember.getReferentType()) == forwardPointers.end()) {
 | 
					                if (forwardPointers.find(glslangMember.getReferentType()) == forwardPointers.end()) {
 | 
				
			||||||
                    deferredForwardPointers.push_back(std::make_pair(&glslangMember, memberQualifier));
 | 
					                    deferredForwardPointers.push_back(std::make_pair(&glslangMember, memberQualifier));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -4093,7 +4091,7 @@ void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslF
 | 
				
			|||||||
        if (paramPrecision != spv::NoPrecision)
 | 
					        if (paramPrecision != spv::NoPrecision)
 | 
				
			||||||
            decorations.push_back(paramPrecision);
 | 
					            decorations.push_back(paramPrecision);
 | 
				
			||||||
        TranslateMemoryDecoration(type.getQualifier(), decorations, useVulkanMemoryModel);
 | 
					        TranslateMemoryDecoration(type.getQualifier(), decorations, useVulkanMemoryModel);
 | 
				
			||||||
        if (type.getBasicType() == glslang::EbtReference) {
 | 
					        if (type.isReference()) {
 | 
				
			||||||
            // Original and non-writable params pass the pointer directly and
 | 
					            // Original and non-writable params pass the pointer directly and
 | 
				
			||||||
            // use restrict/aliased, others are stored to a pointer in Function
 | 
					            // use restrict/aliased, others are stored to a pointer in Function
 | 
				
			||||||
            // memory and use RestrictPointer/AliasedPointer.
 | 
					            // memory and use RestrictPointer/AliasedPointer.
 | 
				
			||||||
@ -7741,6 +7739,7 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    if (symbol->getQualifier().hasAttachment())
 | 
					    if (symbol->getQualifier().hasAttachment())
 | 
				
			||||||
        builder.addDecoration(id, spv::DecorationInputAttachmentIndex, symbol->getQualifier().layoutAttachment);
 | 
					        builder.addDecoration(id, spv::DecorationInputAttachmentIndex, symbol->getQualifier().layoutAttachment);
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    if (glslangIntermediate->getXfbMode()) {
 | 
					    if (glslangIntermediate->getXfbMode()) {
 | 
				
			||||||
        builder.addCapability(spv::CapabilityTransformFeedback);
 | 
					        builder.addCapability(spv::CapabilityTransformFeedback);
 | 
				
			||||||
        if (symbol->getQualifier().hasXfbBuffer()) {
 | 
					        if (symbol->getQualifier().hasXfbBuffer()) {
 | 
				
			||||||
@ -7752,6 +7751,7 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
 | 
				
			|||||||
        if (symbol->getQualifier().hasXfbOffset())
 | 
					        if (symbol->getQualifier().hasXfbOffset())
 | 
				
			||||||
            builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutXfbOffset);
 | 
					            builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutXfbOffset);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (symbol->getType().isImage()) {
 | 
					    if (symbol->getType().isImage()) {
 | 
				
			||||||
        std::vector<spv::Decoration> memory;
 | 
					        std::vector<spv::Decoration> memory;
 | 
				
			||||||
@ -7815,7 +7815,7 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
 | 
				
			|||||||
                              symbol->getType().getQualifier().semanticName);
 | 
					                              symbol->getType().getQualifier().semanticName);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (symbol->getBasicType() == glslang::EbtReference) {
 | 
					    if (symbol->isReference()) {
 | 
				
			||||||
        builder.addDecoration(id, symbol->getType().getQualifier().restrict ? spv::DecorationRestrictPointerEXT : spv::DecorationAliasedPointerEXT);
 | 
					        builder.addDecoration(id, symbol->getType().getQualifier().restrict ? spv::DecorationRestrictPointerEXT : spv::DecorationAliasedPointerEXT);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -50,12 +50,8 @@ namespace spv {
 | 
				
			|||||||
        // Include C-based headers that don't have a namespace
 | 
					        // Include C-based headers that don't have a namespace
 | 
				
			||||||
        #include "GLSL.ext.KHR.h"
 | 
					        #include "GLSL.ext.KHR.h"
 | 
				
			||||||
        #include "GLSL.ext.EXT.h"
 | 
					        #include "GLSL.ext.EXT.h"
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        #include "GLSL.ext.AMD.h"
 | 
					        #include "GLSL.ext.AMD.h"
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        #include "GLSL.ext.NV.h"
 | 
					        #include "GLSL.ext.NV.h"
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -98,22 +94,17 @@ const char* ExecutionModelString(int model)
 | 
				
			|||||||
    case 4:  return "Fragment";
 | 
					    case 4:  return "Fragment";
 | 
				
			||||||
    case 5:  return "GLCompute";
 | 
					    case 5:  return "GLCompute";
 | 
				
			||||||
    case 6:  return "Kernel";
 | 
					    case 6:  return "Kernel";
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case ExecutionModelTaskNV: return "TaskNV";
 | 
					    case ExecutionModelTaskNV: return "TaskNV";
 | 
				
			||||||
    case ExecutionModelMeshNV: return "MeshNV";
 | 
					    case ExecutionModelMeshNV: return "MeshNV";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    default: return "Bad";
 | 
					    default: return "Bad";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case ExecutionModelRayGenerationNV: return "RayGenerationNV";
 | 
					    case ExecutionModelRayGenerationNV: return "RayGenerationNV";
 | 
				
			||||||
    case ExecutionModelIntersectionNV:  return "IntersectionNV";
 | 
					    case ExecutionModelIntersectionNV:  return "IntersectionNV";
 | 
				
			||||||
    case ExecutionModelAnyHitNV:        return "AnyHitNV";
 | 
					    case ExecutionModelAnyHitNV:        return "AnyHitNV";
 | 
				
			||||||
    case ExecutionModelClosestHitNV:    return "ClosestHitNV";
 | 
					    case ExecutionModelClosestHitNV:    return "ClosestHitNV";
 | 
				
			||||||
    case ExecutionModelMissNV:          return "MissNV";
 | 
					    case ExecutionModelMissNV:          return "MissNV";
 | 
				
			||||||
    case ExecutionModelCallableNV:      return "CallableNV";
 | 
					    case ExecutionModelCallableNV:      return "CallableNV";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -183,13 +174,11 @@ const char* ExecutionModeString(int mode)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    case 4446:  return "PostDepthCoverage";
 | 
					    case 4446:  return "PostDepthCoverage";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case ExecutionModeOutputLinesNV:            return "OutputLinesNV";
 | 
					    case ExecutionModeOutputLinesNV:            return "OutputLinesNV";
 | 
				
			||||||
    case ExecutionModeOutputPrimitivesNV:       return "OutputPrimitivesNV";
 | 
					    case ExecutionModeOutputPrimitivesNV:       return "OutputPrimitivesNV";
 | 
				
			||||||
    case ExecutionModeOutputTrianglesNV:        return "OutputTrianglesNV";
 | 
					    case ExecutionModeOutputTrianglesNV:        return "OutputTrianglesNV";
 | 
				
			||||||
    case ExecutionModeDerivativeGroupQuadsNV:   return "DerivativeGroupQuadsNV";
 | 
					    case ExecutionModeDerivativeGroupQuadsNV:   return "DerivativeGroupQuadsNV";
 | 
				
			||||||
    case ExecutionModeDerivativeGroupLinearNV:  return "DerivativeGroupLinearNV";
 | 
					    case ExecutionModeDerivativeGroupLinearNV:  return "DerivativeGroupLinearNV";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case ExecutionModePixelInterlockOrderedEXT:         return "PixelInterlockOrderedEXT";
 | 
					    case ExecutionModePixelInterlockOrderedEXT:         return "PixelInterlockOrderedEXT";
 | 
				
			||||||
    case ExecutionModePixelInterlockUnorderedEXT:       return "PixelInterlockUnorderedEXT";
 | 
					    case ExecutionModePixelInterlockUnorderedEXT:       return "PixelInterlockUnorderedEXT";
 | 
				
			||||||
@ -220,14 +209,12 @@ const char* StorageClassString(int StorageClass)
 | 
				
			|||||||
    case 11: return "Image";
 | 
					    case 11: return "Image";
 | 
				
			||||||
    case 12: return "StorageBuffer";
 | 
					    case 12: return "StorageBuffer";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case StorageClassRayPayloadNV:            return "RayPayloadNV";
 | 
					    case StorageClassRayPayloadNV:            return "RayPayloadNV";
 | 
				
			||||||
    case StorageClassHitAttributeNV:          return "HitAttributeNV";
 | 
					    case StorageClassHitAttributeNV:          return "HitAttributeNV";
 | 
				
			||||||
    case StorageClassIncomingRayPayloadNV:    return "IncomingRayPayloadNV";
 | 
					    case StorageClassIncomingRayPayloadNV:    return "IncomingRayPayloadNV";
 | 
				
			||||||
    case StorageClassShaderRecordBufferNV:    return "ShaderRecordBufferNV";
 | 
					    case StorageClassShaderRecordBufferNV:    return "ShaderRecordBufferNV";
 | 
				
			||||||
    case StorageClassCallableDataNV:          return "CallableDataNV";
 | 
					    case StorageClassCallableDataNV:          return "CallableDataNV";
 | 
				
			||||||
    case StorageClassIncomingCallableDataNV:  return "IncomingCallableDataNV";
 | 
					    case StorageClassIncomingCallableDataNV:  return "IncomingCallableDataNV";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case StorageClassPhysicalStorageBufferEXT: return "PhysicalStorageBufferEXT";
 | 
					    case StorageClassPhysicalStorageBufferEXT: return "PhysicalStorageBufferEXT";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -289,10 +276,7 @@ const char* DecorationString(int decoration)
 | 
				
			|||||||
    case DecorationCeiling:
 | 
					    case DecorationCeiling:
 | 
				
			||||||
    default:  return "Bad";
 | 
					    default:  return "Bad";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    case DecorationExplicitInterpAMD: return "ExplicitInterpAMD";
 | 
					    case DecorationExplicitInterpAMD: return "ExplicitInterpAMD";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case DecorationOverrideCoverageNV:          return "OverrideCoverageNV";
 | 
					    case DecorationOverrideCoverageNV:          return "OverrideCoverageNV";
 | 
				
			||||||
    case DecorationPassthroughNV:               return "PassthroughNV";
 | 
					    case DecorationPassthroughNV:               return "PassthroughNV";
 | 
				
			||||||
    case DecorationViewportRelativeNV:          return "ViewportRelativeNV";
 | 
					    case DecorationViewportRelativeNV:          return "ViewportRelativeNV";
 | 
				
			||||||
@ -301,7 +285,6 @@ const char* DecorationString(int decoration)
 | 
				
			|||||||
    case DecorationPerViewNV:                   return "PerViewNV";
 | 
					    case DecorationPerViewNV:                   return "PerViewNV";
 | 
				
			||||||
    case DecorationPerTaskNV:                   return "PerTaskNV";
 | 
					    case DecorationPerTaskNV:                   return "PerTaskNV";
 | 
				
			||||||
    case DecorationPerVertexNV:                 return "PerVertexNV";
 | 
					    case DecorationPerVertexNV:                 return "PerVertexNV";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case DecorationNonUniformEXT:           return "DecorationNonUniformEXT";
 | 
					    case DecorationNonUniformEXT:           return "DecorationNonUniformEXT";
 | 
				
			||||||
    case DecorationHlslCounterBufferGOOGLE: return "DecorationHlslCounterBufferGOOGLE";
 | 
					    case DecorationHlslCounterBufferGOOGLE: return "DecorationHlslCounterBufferGOOGLE";
 | 
				
			||||||
@ -371,7 +354,6 @@ const char* BuiltInString(int builtIn)
 | 
				
			|||||||
    case 4426: return "DrawIndex";
 | 
					    case 4426: return "DrawIndex";
 | 
				
			||||||
    case 5014: return "FragStencilRefEXT";
 | 
					    case 5014: return "FragStencilRefEXT";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    case 4992: return "BaryCoordNoPerspAMD";
 | 
					    case 4992: return "BaryCoordNoPerspAMD";
 | 
				
			||||||
    case 4993: return "BaryCoordNoPerspCentroidAMD";
 | 
					    case 4993: return "BaryCoordNoPerspCentroidAMD";
 | 
				
			||||||
    case 4994: return "BaryCoordNoPerspSampleAMD";
 | 
					    case 4994: return "BaryCoordNoPerspSampleAMD";
 | 
				
			||||||
@ -379,9 +361,6 @@ const char* BuiltInString(int builtIn)
 | 
				
			|||||||
    case 4996: return "BaryCoordSmoothCentroidAMD";
 | 
					    case 4996: return "BaryCoordSmoothCentroidAMD";
 | 
				
			||||||
    case 4997: return "BaryCoordSmoothSampleAMD";
 | 
					    case 4997: return "BaryCoordSmoothSampleAMD";
 | 
				
			||||||
    case 4998: return "BaryCoordPullModelAMD";
 | 
					    case 4998: return "BaryCoordPullModelAMD";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case BuiltInLaunchIdNV:                 return "LaunchIdNV";
 | 
					    case BuiltInLaunchIdNV:                 return "LaunchIdNV";
 | 
				
			||||||
    case BuiltInLaunchSizeNV:               return "LaunchSizeNV";
 | 
					    case BuiltInLaunchSizeNV:               return "LaunchSizeNV";
 | 
				
			||||||
    case BuiltInWorldRayOriginNV:           return "WorldRayOriginNV";
 | 
					    case BuiltInWorldRayOriginNV:           return "WorldRayOriginNV";
 | 
				
			||||||
@ -405,14 +384,12 @@ const char* BuiltInString(int builtIn)
 | 
				
			|||||||
//    case BuiltInInvocationsPerPixelNV:      return "InvocationsPerPixelNV"; // superseded by BuiltInFragInvocationCountEXT
 | 
					//    case BuiltInInvocationsPerPixelNV:      return "InvocationsPerPixelNV"; // superseded by BuiltInFragInvocationCountEXT
 | 
				
			||||||
    case BuiltInBaryCoordNV:                return "BaryCoordNV";
 | 
					    case BuiltInBaryCoordNV:                return "BaryCoordNV";
 | 
				
			||||||
    case BuiltInBaryCoordNoPerspNV:         return "BaryCoordNoPerspNV";
 | 
					    case BuiltInBaryCoordNoPerspNV:         return "BaryCoordNoPerspNV";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case BuiltInFragSizeEXT:                return "FragSizeEXT";
 | 
					    case BuiltInFragSizeEXT:                return "FragSizeEXT";
 | 
				
			||||||
    case BuiltInFragInvocationCountEXT:     return "FragInvocationCountEXT";
 | 
					    case BuiltInFragInvocationCountEXT:     return "FragInvocationCountEXT";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case 5264: return "FullyCoveredEXT";
 | 
					    case 5264: return "FullyCoveredEXT";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case BuiltInTaskCountNV:           return "TaskCountNV";
 | 
					    case BuiltInTaskCountNV:           return "TaskCountNV";
 | 
				
			||||||
    case BuiltInPrimitiveCountNV:      return "PrimitiveCountNV";
 | 
					    case BuiltInPrimitiveCountNV:      return "PrimitiveCountNV";
 | 
				
			||||||
    case BuiltInPrimitiveIndicesNV:    return "PrimitiveIndicesNV";
 | 
					    case BuiltInPrimitiveIndicesNV:    return "PrimitiveIndicesNV";
 | 
				
			||||||
@ -421,7 +398,6 @@ const char* BuiltInString(int builtIn)
 | 
				
			|||||||
    case BuiltInLayerPerViewNV:        return "LayerPerViewNV";
 | 
					    case BuiltInLayerPerViewNV:        return "LayerPerViewNV";
 | 
				
			||||||
    case BuiltInMeshViewCountNV:       return "MeshViewCountNV";
 | 
					    case BuiltInMeshViewCountNV:       return "MeshViewCountNV";
 | 
				
			||||||
    case BuiltInMeshViewIndicesNV:     return "MeshViewIndicesNV";
 | 
					    case BuiltInMeshViewIndicesNV:     return "MeshViewIndicesNV";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    case BuiltInWarpsPerSMNV:           return "WarpsPerSMNV";
 | 
					    case BuiltInWarpsPerSMNV:           return "WarpsPerSMNV";
 | 
				
			||||||
    case BuiltInSMCountNV:              return "SMCountNV";
 | 
					    case BuiltInSMCountNV:              return "SMCountNV";
 | 
				
			||||||
    case BuiltInWarpIDNV:               return "WarpIDNV";
 | 
					    case BuiltInWarpIDNV:               return "WarpIDNV";
 | 
				
			||||||
@ -780,11 +756,9 @@ const char* GroupOperationString(int gop)
 | 
				
			|||||||
    case GroupOperationInclusiveScan:  return "InclusiveScan";
 | 
					    case GroupOperationInclusiveScan:  return "InclusiveScan";
 | 
				
			||||||
    case GroupOperationExclusiveScan:  return "ExclusiveScan";
 | 
					    case GroupOperationExclusiveScan:  return "ExclusiveScan";
 | 
				
			||||||
    case GroupOperationClusteredReduce:  return "ClusteredReduce";
 | 
					    case GroupOperationClusteredReduce:  return "ClusteredReduce";
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case GroupOperationPartitionedReduceNV:  return "PartitionedReduceNV";
 | 
					    case GroupOperationPartitionedReduceNV:  return "PartitionedReduceNV";
 | 
				
			||||||
    case GroupOperationPartitionedInclusiveScanNV:  return "PartitionedInclusiveScanNV";
 | 
					    case GroupOperationPartitionedInclusiveScanNV:  return "PartitionedInclusiveScanNV";
 | 
				
			||||||
    case GroupOperationPartitionedExclusiveScanNV:  return "PartitionedExclusiveScanNV";
 | 
					    case GroupOperationPartitionedExclusiveScanNV:  return "PartitionedExclusiveScanNV";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    default: return "Bad";
 | 
					    default: return "Bad";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -901,17 +875,14 @@ const char* CapabilityString(int info)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    case CapabilityStencilExportEXT: return "StencilExportEXT";
 | 
					    case CapabilityStencilExportEXT: return "StencilExportEXT";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    case CapabilityFloat16ImageAMD:       return "Float16ImageAMD";
 | 
					    case CapabilityFloat16ImageAMD:       return "Float16ImageAMD";
 | 
				
			||||||
    case CapabilityImageGatherBiasLodAMD: return "ImageGatherBiasLodAMD";
 | 
					    case CapabilityImageGatherBiasLodAMD: return "ImageGatherBiasLodAMD";
 | 
				
			||||||
    case CapabilityFragmentMaskAMD:       return "FragmentMaskAMD";
 | 
					    case CapabilityFragmentMaskAMD:       return "FragmentMaskAMD";
 | 
				
			||||||
    case CapabilityImageReadWriteLodAMD:  return "ImageReadWriteLodAMD";
 | 
					    case CapabilityImageReadWriteLodAMD:  return "ImageReadWriteLodAMD";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case CapabilityAtomicStorageOps:             return "AtomicStorageOps";
 | 
					    case CapabilityAtomicStorageOps:             return "AtomicStorageOps";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case CapabilitySampleMaskPostDepthCoverage:  return "SampleMaskPostDepthCoverage";
 | 
					    case CapabilitySampleMaskPostDepthCoverage:  return "SampleMaskPostDepthCoverage";
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case CapabilityGeometryShaderPassthroughNV:     return "GeometryShaderPassthroughNV";
 | 
					    case CapabilityGeometryShaderPassthroughNV:     return "GeometryShaderPassthroughNV";
 | 
				
			||||||
    case CapabilityShaderViewportIndexLayerNV:      return "ShaderViewportIndexLayerNV";
 | 
					    case CapabilityShaderViewportIndexLayerNV:      return "ShaderViewportIndexLayerNV";
 | 
				
			||||||
    case CapabilityShaderViewportMaskNV:            return "ShaderViewportMaskNV";
 | 
					    case CapabilityShaderViewportMaskNV:            return "ShaderViewportMaskNV";
 | 
				
			||||||
@ -926,7 +897,6 @@ const char* CapabilityString(int info)
 | 
				
			|||||||
    case CapabilityImageFootprintNV:                return "ImageFootprintNV";
 | 
					    case CapabilityImageFootprintNV:                return "ImageFootprintNV";
 | 
				
			||||||
//    case CapabilityShadingRateNV:                   return "ShadingRateNV";  // superseded by FragmentDensityEXT
 | 
					//    case CapabilityShadingRateNV:                   return "ShadingRateNV";  // superseded by FragmentDensityEXT
 | 
				
			||||||
    case CapabilitySampleMaskOverrideCoverageNV:    return "SampleMaskOverrideCoverageNV";
 | 
					    case CapabilitySampleMaskOverrideCoverageNV:    return "SampleMaskOverrideCoverageNV";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    case CapabilityFragmentDensityEXT:              return "FragmentDensityEXT";
 | 
					    case CapabilityFragmentDensityEXT:              return "FragmentDensityEXT";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case CapabilityFragmentFullyCoveredEXT: return "FragmentFullyCoveredEXT";
 | 
					    case CapabilityFragmentFullyCoveredEXT: return "FragmentFullyCoveredEXT";
 | 
				
			||||||
@ -1336,7 +1306,6 @@ const char* OpcodeString(int op)
 | 
				
			|||||||
    case 4430: return "OpSubgroupAllEqualKHR";
 | 
					    case 4430: return "OpSubgroupAllEqualKHR";
 | 
				
			||||||
    case 4432: return "OpSubgroupReadInvocationKHR";
 | 
					    case 4432: return "OpSubgroupReadInvocationKHR";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    case 5000: return "OpGroupIAddNonUniformAMD";
 | 
					    case 5000: return "OpGroupIAddNonUniformAMD";
 | 
				
			||||||
    case 5001: return "OpGroupFAddNonUniformAMD";
 | 
					    case 5001: return "OpGroupFAddNonUniformAMD";
 | 
				
			||||||
    case 5002: return "OpGroupFMinNonUniformAMD";
 | 
					    case 5002: return "OpGroupFMinNonUniformAMD";
 | 
				
			||||||
@ -1348,14 +1317,12 @@ const char* OpcodeString(int op)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    case 5011: return "OpFragmentMaskFetchAMD";
 | 
					    case 5011: return "OpFragmentMaskFetchAMD";
 | 
				
			||||||
    case 5012: return "OpFragmentFetchAMD";
 | 
					    case 5012: return "OpFragmentFetchAMD";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case OpReadClockKHR:               return "OpReadClockKHR";
 | 
					    case OpReadClockKHR:               return "OpReadClockKHR";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case OpDecorateStringGOOGLE:       return "OpDecorateStringGOOGLE";
 | 
					    case OpDecorateStringGOOGLE:       return "OpDecorateStringGOOGLE";
 | 
				
			||||||
    case OpMemberDecorateStringGOOGLE: return "OpMemberDecorateStringGOOGLE";
 | 
					    case OpMemberDecorateStringGOOGLE: return "OpMemberDecorateStringGOOGLE";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case OpGroupNonUniformPartitionNV:       return "OpGroupNonUniformPartitionNV";
 | 
					    case OpGroupNonUniformPartitionNV:       return "OpGroupNonUniformPartitionNV";
 | 
				
			||||||
    case OpReportIntersectionNV:             return "OpReportIntersectionNV";
 | 
					    case OpReportIntersectionNV:             return "OpReportIntersectionNV";
 | 
				
			||||||
    case OpIgnoreIntersectionNV:             return "OpIgnoreIntersectionNV";
 | 
					    case OpIgnoreIntersectionNV:             return "OpIgnoreIntersectionNV";
 | 
				
			||||||
@ -1365,7 +1332,6 @@ const char* OpcodeString(int op)
 | 
				
			|||||||
    case OpExecuteCallableNV:                return "OpExecuteCallableNV";
 | 
					    case OpExecuteCallableNV:                return "OpExecuteCallableNV";
 | 
				
			||||||
    case OpImageSampleFootprintNV:           return "OpImageSampleFootprintNV";
 | 
					    case OpImageSampleFootprintNV:           return "OpImageSampleFootprintNV";
 | 
				
			||||||
    case OpWritePackedPrimitiveIndices4x8NV: return "OpWritePackedPrimitiveIndices4x8NV";
 | 
					    case OpWritePackedPrimitiveIndices4x8NV: return "OpWritePackedPrimitiveIndices4x8NV";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case OpTypeCooperativeMatrixNV:         return "OpTypeCooperativeMatrixNV";
 | 
					    case OpTypeCooperativeMatrixNV:         return "OpTypeCooperativeMatrixNV";
 | 
				
			||||||
    case OpCooperativeMatrixLoadNV:         return "OpCooperativeMatrixLoadNV";
 | 
					    case OpCooperativeMatrixLoadNV:         return "OpCooperativeMatrixLoadNV";
 | 
				
			||||||
@ -2685,7 +2651,6 @@ void Parameterize()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    InstructionDesc[OpModuleProcessed].operands.push(OperandLiteralString, "'process'");
 | 
					    InstructionDesc[OpModuleProcessed].operands.push(OperandLiteralString, "'process'");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandScope, "'Execution'");
 | 
					    InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandScope, "'Execution'");
 | 
				
			||||||
    InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'");
 | 
					    InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandGroupOperation, "'Operation'");
 | 
				
			||||||
    InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandId, "'X'");
 | 
					    InstructionDesc[OpGroupIAddNonUniformAMD].operands.push(OperandId, "'X'");
 | 
				
			||||||
@ -2724,9 +2689,7 @@ void Parameterize()
 | 
				
			|||||||
    InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Image'");
 | 
					    InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Image'");
 | 
				
			||||||
    InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Coordinate'");
 | 
					    InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Coordinate'");
 | 
				
			||||||
    InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Fragment Index'");
 | 
					    InstructionDesc[OpFragmentFetchAMD].operands.push(OperandId, "'Fragment Index'");
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    InstructionDesc[OpGroupNonUniformPartitionNV].operands.push(OperandId, "X");
 | 
					    InstructionDesc[OpGroupNonUniformPartitionNV].operands.push(OperandId, "X");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    InstructionDesc[OpTypeAccelerationStructureNV].setResultAndType(true, false);
 | 
					    InstructionDesc[OpTypeAccelerationStructureNV].setResultAndType(true, false);
 | 
				
			||||||
@ -2764,7 +2727,6 @@ void Parameterize()
 | 
				
			|||||||
    
 | 
					    
 | 
				
			||||||
    InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Index Offset'");
 | 
					    InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Index Offset'");
 | 
				
			||||||
    InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Packed Indices'");
 | 
					    InstructionDesc[OpWritePackedPrimitiveIndices4x8NV].operands.push(OperandId, "'Packed Indices'");
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Component Type'");
 | 
					    InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Component Type'");
 | 
				
			||||||
    InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Scope'");
 | 
					    InstructionDesc[OpTypeCooperativeMatrixNV].operands.push(OperandId, "'Scope'");
 | 
				
			||||||
 | 
				
			|||||||
@ -257,7 +257,6 @@ const char* GetBinaryName(EShLanguage stage)
 | 
				
			|||||||
        case EShLangGeometry:        name = "geom.spv";    break;
 | 
					        case EShLangGeometry:        name = "geom.spv";    break;
 | 
				
			||||||
        case EShLangFragment:        name = "frag.spv";    break;
 | 
					        case EShLangFragment:        name = "frag.spv";    break;
 | 
				
			||||||
        case EShLangCompute:         name = "comp.spv";    break;
 | 
					        case EShLangCompute:         name = "comp.spv";    break;
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        case EShLangRayGenNV:        name = "rgen.spv";    break;
 | 
					        case EShLangRayGenNV:        name = "rgen.spv";    break;
 | 
				
			||||||
        case EShLangIntersectNV:     name = "rint.spv";    break;
 | 
					        case EShLangIntersectNV:     name = "rint.spv";    break;
 | 
				
			||||||
        case EShLangAnyHitNV:        name = "rahit.spv";   break;
 | 
					        case EShLangAnyHitNV:        name = "rahit.spv";   break;
 | 
				
			||||||
@ -266,7 +265,6 @@ const char* GetBinaryName(EShLanguage stage)
 | 
				
			|||||||
        case EShLangCallableNV:      name = "rcall.spv";   break;
 | 
					        case EShLangCallableNV:      name = "rcall.spv";   break;
 | 
				
			||||||
        case EShLangMeshNV:          name = "mesh.spv";    break;
 | 
					        case EShLangMeshNV:          name = "mesh.spv";    break;
 | 
				
			||||||
        case EShLangTaskNV:          name = "task.spv";    break;
 | 
					        case EShLangTaskNV:          name = "task.spv";    break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        default:                     name = "unknown";     break;
 | 
					        default:                     name = "unknown";     break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else
 | 
					    } else
 | 
				
			||||||
@ -1389,7 +1387,6 @@ EShLanguage FindLanguage(const std::string& name, bool parseStageName)
 | 
				
			|||||||
        return EShLangFragment;
 | 
					        return EShLangFragment;
 | 
				
			||||||
    else if (stageName == "comp")
 | 
					    else if (stageName == "comp")
 | 
				
			||||||
        return EShLangCompute;
 | 
					        return EShLangCompute;
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    else if (stageName == "rgen")
 | 
					    else if (stageName == "rgen")
 | 
				
			||||||
        return EShLangRayGenNV;
 | 
					        return EShLangRayGenNV;
 | 
				
			||||||
    else if (stageName == "rint")
 | 
					    else if (stageName == "rint")
 | 
				
			||||||
@ -1406,7 +1403,6 @@ EShLanguage FindLanguage(const std::string& name, bool parseStageName)
 | 
				
			|||||||
        return EShLangMeshNV;
 | 
					        return EShLangMeshNV;
 | 
				
			||||||
    else if (stageName == "task")
 | 
					    else if (stageName == "task")
 | 
				
			||||||
        return EShLangTaskNV;
 | 
					        return EShLangTaskNV;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    usage();
 | 
					    usage();
 | 
				
			||||||
    return EShLangVertex;
 | 
					    return EShLangVertex;
 | 
				
			||||||
@ -1476,7 +1472,6 @@ void usage()
 | 
				
			|||||||
           "    .geom   for a geometry shader\n"
 | 
					           "    .geom   for a geometry shader\n"
 | 
				
			||||||
           "    .frag   for a fragment shader\n"
 | 
					           "    .frag   for a fragment shader\n"
 | 
				
			||||||
           "    .comp   for a compute shader\n"
 | 
					           "    .comp   for a compute shader\n"
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
           "    .mesh   for a mesh shader\n"
 | 
					           "    .mesh   for a mesh shader\n"
 | 
				
			||||||
           "    .task   for a task shader\n"
 | 
					           "    .task   for a task shader\n"
 | 
				
			||||||
           "    .rgen    for a ray generation shader\n"
 | 
					           "    .rgen    for a ray generation shader\n"
 | 
				
			||||||
@ -1485,7 +1480,6 @@ void usage()
 | 
				
			|||||||
           "    .rchit   for a ray closest hit shader\n"
 | 
					           "    .rchit   for a ray closest hit shader\n"
 | 
				
			||||||
           "    .rmiss   for a ray miss shader\n"
 | 
					           "    .rmiss   for a ray miss shader\n"
 | 
				
			||||||
           "    .rcall   for a ray callable shader\n"
 | 
					           "    .rcall   for a ray callable shader\n"
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
           "    .glsl   for .vert.glsl, .tesc.glsl, ..., .comp.glsl compound suffixes\n"
 | 
					           "    .glsl   for .vert.glsl, .tesc.glsl, ..., .comp.glsl compound suffixes\n"
 | 
				
			||||||
           "    .hlsl   for .vert.hlsl, .tesc.hlsl, ..., .comp.hlsl compound suffixes\n"
 | 
					           "    .hlsl   for .vert.hlsl, .tesc.hlsl, ..., .comp.hlsl compound suffixes\n"
 | 
				
			||||||
           "\n"
 | 
					           "\n"
 | 
				
			||||||
 | 
				
			|||||||
@ -1 +1 @@
 | 
				
			|||||||
1085952 ../build/install/bin/glslangValidator.exe
 | 
					812032 ../build/install/bin/glslangValidator.exe
 | 
				
			||||||
 | 
				
			|||||||
@ -61,11 +61,7 @@ enum TBasicType {
 | 
				
			|||||||
    EbtSampler,
 | 
					    EbtSampler,
 | 
				
			||||||
    EbtStruct,
 | 
					    EbtStruct,
 | 
				
			||||||
    EbtBlock,
 | 
					    EbtBlock,
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    EbtAccStructNV,
 | 
					    EbtAccStructNV,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EbtReference,
 | 
					    EbtReference,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // HLSL types that live only temporarily.
 | 
					    // HLSL types that live only temporarily.
 | 
				
			||||||
@ -94,13 +90,11 @@ enum TStorageQualifier {
 | 
				
			|||||||
    EvqBuffer,        // read/write, shared with app
 | 
					    EvqBuffer,        // read/write, shared with app
 | 
				
			||||||
    EvqShared,        // compute shader's read/write 'shared' qualifier
 | 
					    EvqShared,        // compute shader's read/write 'shared' qualifier
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    EvqPayloadNV,
 | 
					    EvqPayloadNV,
 | 
				
			||||||
    EvqPayloadInNV,
 | 
					    EvqPayloadInNV,
 | 
				
			||||||
    EvqHitAttrNV,
 | 
					    EvqHitAttrNV,
 | 
				
			||||||
    EvqCallableDataNV,
 | 
					    EvqCallableDataNV,
 | 
				
			||||||
    EvqCallableDataInNV,
 | 
					    EvqCallableDataInNV,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // parameters
 | 
					    // parameters
 | 
				
			||||||
    EvqIn,            // also, for 'in' in the grammar before we know if it's a pipeline input or an 'in' parameter
 | 
					    EvqIn,            // also, for 'in' in the grammar before we know if it's a pipeline input or an 'in' parameter
 | 
				
			||||||
@ -221,7 +215,6 @@ enum TBuiltInVariable {
 | 
				
			|||||||
    EbvSampleMask,
 | 
					    EbvSampleMask,
 | 
				
			||||||
    EbvHelperInvocation,
 | 
					    EbvHelperInvocation,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    EbvBaryCoordNoPersp,
 | 
					    EbvBaryCoordNoPersp,
 | 
				
			||||||
    EbvBaryCoordNoPerspCentroid,
 | 
					    EbvBaryCoordNoPerspCentroid,
 | 
				
			||||||
    EbvBaryCoordNoPerspSample,
 | 
					    EbvBaryCoordNoPerspSample,
 | 
				
			||||||
@ -229,7 +222,6 @@ enum TBuiltInVariable {
 | 
				
			|||||||
    EbvBaryCoordSmoothCentroid,
 | 
					    EbvBaryCoordSmoothCentroid,
 | 
				
			||||||
    EbvBaryCoordSmoothSample,
 | 
					    EbvBaryCoordSmoothSample,
 | 
				
			||||||
    EbvBaryCoordPullModel,
 | 
					    EbvBaryCoordPullModel,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EbvViewIndex,
 | 
					    EbvViewIndex,
 | 
				
			||||||
    EbvDeviceIndex,
 | 
					    EbvDeviceIndex,
 | 
				
			||||||
@ -237,7 +229,6 @@ enum TBuiltInVariable {
 | 
				
			|||||||
    EbvFragSizeEXT,
 | 
					    EbvFragSizeEXT,
 | 
				
			||||||
    EbvFragInvocationCountEXT,
 | 
					    EbvFragInvocationCountEXT,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    EbvViewportMaskNV,
 | 
					    EbvViewportMaskNV,
 | 
				
			||||||
    EbvSecondaryPositionNV,
 | 
					    EbvSecondaryPositionNV,
 | 
				
			||||||
    EbvSecondaryViewportMaskNV,
 | 
					    EbvSecondaryViewportMaskNV,
 | 
				
			||||||
@ -273,7 +264,6 @@ enum TBuiltInVariable {
 | 
				
			|||||||
    EbvLayerPerViewNV,
 | 
					    EbvLayerPerViewNV,
 | 
				
			||||||
    EbvMeshViewCountNV,
 | 
					    EbvMeshViewCountNV,
 | 
				
			||||||
    EbvMeshViewIndicesNV,
 | 
					    EbvMeshViewIndicesNV,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // sm builtins
 | 
					    // sm builtins
 | 
				
			||||||
    EbvWarpsPerSM,
 | 
					    EbvWarpsPerSM,
 | 
				
			||||||
@ -299,6 +289,19 @@ enum TBuiltInVariable {
 | 
				
			|||||||
    EbvLast
 | 
					    EbvLast
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// In this enum, order matters; users can assume higher precision is a bigger value
 | 
				
			||||||
 | 
					// and EpqNone is 0.
 | 
				
			||||||
 | 
					enum TPrecisionQualifier {
 | 
				
			||||||
 | 
					    EpqNone = 0,
 | 
				
			||||||
 | 
					    EpqLow,
 | 
				
			||||||
 | 
					    EpqMedium,
 | 
				
			||||||
 | 
					    EpqHigh
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					__inline const char* GetStorageQualifierString(TStorageQualifier q) { return ""; }
 | 
				
			||||||
 | 
					__inline const char* GetPrecisionQualifierString(TPrecisionQualifier p) { return ""; }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
// These will show up in error messages
 | 
					// These will show up in error messages
 | 
				
			||||||
__inline const char* GetStorageQualifierString(TStorageQualifier q)
 | 
					__inline const char* GetStorageQualifierString(TStorageQualifier q)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -325,13 +328,11 @@ __inline const char* GetStorageQualifierString(TStorageQualifier q)
 | 
				
			|||||||
    case EvqPointCoord:     return "gl_PointCoord";  break;
 | 
					    case EvqPointCoord:     return "gl_PointCoord";  break;
 | 
				
			||||||
    case EvqFragColor:      return "fragColor";      break;
 | 
					    case EvqFragColor:      return "fragColor";      break;
 | 
				
			||||||
    case EvqFragDepth:      return "gl_FragDepth";   break;
 | 
					    case EvqFragDepth:      return "gl_FragDepth";   break;
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case EvqPayloadNV:        return "rayPayloadNV";     break;
 | 
					    case EvqPayloadNV:        return "rayPayloadNV";     break;
 | 
				
			||||||
    case EvqPayloadInNV:      return "rayPayloadInNV";   break;
 | 
					    case EvqPayloadInNV:      return "rayPayloadInNV";   break;
 | 
				
			||||||
    case EvqHitAttrNV:        return "hitAttributeNV";   break;
 | 
					    case EvqHitAttrNV:        return "hitAttributeNV";   break;
 | 
				
			||||||
    case EvqCallableDataNV:   return "callableDataNV";   break;
 | 
					    case EvqCallableDataNV:   return "callableDataNV";   break;
 | 
				
			||||||
    case EvqCallableDataInNV: return "callableDataInNV"; break;
 | 
					    case EvqCallableDataInNV: return "callableDataInNV"; break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    default:                return "unknown qualifier";
 | 
					    default:                return "unknown qualifier";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -413,7 +414,6 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
 | 
				
			|||||||
    case EbvSampleMask:           return "SampleMaskIn";
 | 
					    case EbvSampleMask:           return "SampleMaskIn";
 | 
				
			||||||
    case EbvHelperInvocation:     return "HelperInvocation";
 | 
					    case EbvHelperInvocation:     return "HelperInvocation";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    case EbvBaryCoordNoPersp:           return "BaryCoordNoPersp";
 | 
					    case EbvBaryCoordNoPersp:           return "BaryCoordNoPersp";
 | 
				
			||||||
    case EbvBaryCoordNoPerspCentroid:   return "BaryCoordNoPerspCentroid";
 | 
					    case EbvBaryCoordNoPerspCentroid:   return "BaryCoordNoPerspCentroid";
 | 
				
			||||||
    case EbvBaryCoordNoPerspSample:     return "BaryCoordNoPerspSample";
 | 
					    case EbvBaryCoordNoPerspSample:     return "BaryCoordNoPerspSample";
 | 
				
			||||||
@ -421,7 +421,6 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
 | 
				
			|||||||
    case EbvBaryCoordSmoothCentroid:    return "BaryCoordSmoothCentroid";
 | 
					    case EbvBaryCoordSmoothCentroid:    return "BaryCoordSmoothCentroid";
 | 
				
			||||||
    case EbvBaryCoordSmoothSample:      return "BaryCoordSmoothSample";
 | 
					    case EbvBaryCoordSmoothSample:      return "BaryCoordSmoothSample";
 | 
				
			||||||
    case EbvBaryCoordPullModel:         return "BaryCoordPullModel";
 | 
					    case EbvBaryCoordPullModel:         return "BaryCoordPullModel";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case EbvViewIndex:                  return "ViewIndex";
 | 
					    case EbvViewIndex:                  return "ViewIndex";
 | 
				
			||||||
    case EbvDeviceIndex:                return "DeviceIndex";
 | 
					    case EbvDeviceIndex:                return "DeviceIndex";
 | 
				
			||||||
@ -429,7 +428,6 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
 | 
				
			|||||||
    case EbvFragSizeEXT:                return "FragSizeEXT";
 | 
					    case EbvFragSizeEXT:                return "FragSizeEXT";
 | 
				
			||||||
    case EbvFragInvocationCountEXT:     return "FragInvocationCountEXT";
 | 
					    case EbvFragInvocationCountEXT:     return "FragInvocationCountEXT";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case EbvViewportMaskNV:             return "ViewportMaskNV";
 | 
					    case EbvViewportMaskNV:             return "ViewportMaskNV";
 | 
				
			||||||
    case EbvSecondaryPositionNV:        return "SecondaryPositionNV";
 | 
					    case EbvSecondaryPositionNV:        return "SecondaryPositionNV";
 | 
				
			||||||
    case EbvSecondaryViewportMaskNV:    return "SecondaryViewportMaskNV";
 | 
					    case EbvSecondaryViewportMaskNV:    return "SecondaryViewportMaskNV";
 | 
				
			||||||
@ -464,7 +462,6 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
 | 
				
			|||||||
    case EbvLayerPerViewNV:             return "LayerPerViewNV";
 | 
					    case EbvLayerPerViewNV:             return "LayerPerViewNV";
 | 
				
			||||||
    case EbvMeshViewCountNV:            return "MeshViewCountNV";
 | 
					    case EbvMeshViewCountNV:            return "MeshViewCountNV";
 | 
				
			||||||
    case EbvMeshViewIndicesNV:          return "MeshViewIndicesNV";
 | 
					    case EbvMeshViewIndicesNV:          return "MeshViewIndicesNV";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case EbvWarpsPerSM:                 return "WarpsPerSMNV";
 | 
					    case EbvWarpsPerSM:                 return "WarpsPerSMNV";
 | 
				
			||||||
    case EbvSMCount:                    return "SMCountNV";
 | 
					    case EbvSMCount:                    return "SMCountNV";
 | 
				
			||||||
@ -475,15 +472,6 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// In this enum, order matters; users can assume higher precision is a bigger value
 | 
					 | 
				
			||||||
// and EpqNone is 0.
 | 
					 | 
				
			||||||
enum TPrecisionQualifier {
 | 
					 | 
				
			||||||
    EpqNone = 0,
 | 
					 | 
				
			||||||
    EpqLow,
 | 
					 | 
				
			||||||
    EpqMedium,
 | 
					 | 
				
			||||||
    EpqHigh
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
__inline const char* GetPrecisionQualifierString(TPrecisionQualifier p)
 | 
					__inline const char* GetPrecisionQualifierString(TPrecisionQualifier p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    switch (p) {
 | 
					    switch (p) {
 | 
				
			||||||
@ -494,6 +482,7 @@ __inline const char* GetPrecisionQualifierString(TPrecisionQualifier p)
 | 
				
			|||||||
    default:        return "unknown precision qualifier";
 | 
					    default:        return "unknown precision qualifier";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__inline bool isTypeSignedInt(TBasicType type)
 | 
					__inline bool isTypeSignedInt(TBasicType type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -209,18 +209,18 @@ struct TSampler {   // misnomer now; includes images, textures without sampler,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        switch (type) {
 | 
					        switch (type) {
 | 
				
			||||||
        case EbtFloat:                   break;
 | 
					        case EbtFloat:                   break;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					        case EbtInt:    s.append("i");   break;
 | 
				
			||||||
 | 
					        case EbtUint:   s.append("u");   break;
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        case EbtFloat16: s.append("f16"); break;
 | 
					        case EbtFloat16: s.append("f16"); break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        case EbtInt8:   s.append("i8");  break;
 | 
					        case EbtInt8:   s.append("i8");  break;
 | 
				
			||||||
        case EbtUint16: s.append("u8");  break;
 | 
					        case EbtUint16: s.append("u8");  break;
 | 
				
			||||||
        case EbtInt16:  s.append("i16"); break;
 | 
					        case EbtInt16:  s.append("i16"); break;
 | 
				
			||||||
        case EbtUint8:  s.append("u16"); break;
 | 
					        case EbtUint8:  s.append("u16"); break;
 | 
				
			||||||
        case EbtInt:    s.append("i");   break;
 | 
					 | 
				
			||||||
        case EbtUint:   s.append("u");   break;
 | 
					 | 
				
			||||||
        case EbtInt64:  s.append("i64"); break;
 | 
					        case EbtInt64:  s.append("i64"); break;
 | 
				
			||||||
        case EbtUint64: s.append("u64"); break;
 | 
					        case EbtUint64: s.append("u64"); break;
 | 
				
			||||||
        default:  break;  // some compilers want this
 | 
					#endif
 | 
				
			||||||
 | 
					        default:  break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (image) {
 | 
					        if (image) {
 | 
				
			||||||
            if (dim == EsdSubpass)
 | 
					            if (dim == EsdSubpass)
 | 
				
			||||||
@ -472,11 +472,9 @@ public:
 | 
				
			|||||||
        centroid     = false;
 | 
					        centroid     = false;
 | 
				
			||||||
        smooth       = false;
 | 
					        smooth       = false;
 | 
				
			||||||
        flat         = false;
 | 
					        flat         = false;
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        nopersp      = false;
 | 
					        nopersp      = false;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        explicitInterp = false;
 | 
					        explicitInterp = false;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        pervertexNV = false;
 | 
					        pervertexNV = false;
 | 
				
			||||||
        perPrimitiveNV = false;
 | 
					        perPrimitiveNV = false;
 | 
				
			||||||
        perViewNV = false;
 | 
					        perViewNV = false;
 | 
				
			||||||
@ -523,11 +521,9 @@ public:
 | 
				
			|||||||
    bool centroid     : 1;
 | 
					    bool centroid     : 1;
 | 
				
			||||||
    bool smooth       : 1;
 | 
					    bool smooth       : 1;
 | 
				
			||||||
    bool flat         : 1;
 | 
					    bool flat         : 1;
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    bool nopersp      : 1;
 | 
					    bool nopersp      : 1;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    bool explicitInterp : 1;
 | 
					    bool explicitInterp : 1;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    bool pervertexNV  : 1;
 | 
					    bool pervertexNV  : 1;
 | 
				
			||||||
    bool perPrimitiveNV : 1;
 | 
					    bool perPrimitiveNV : 1;
 | 
				
			||||||
    bool perViewNV : 1;
 | 
					    bool perViewNV : 1;
 | 
				
			||||||
@ -558,20 +554,24 @@ public:
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    bool bufferReferenceNeedsVulkanMemoryModel() const
 | 
					    bool bufferReferenceNeedsVulkanMemoryModel() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
        // include qualifiers that map to load/store availability/visibility/nonprivate memory access operands
 | 
					        // include qualifiers that map to load/store availability/visibility/nonprivate memory access operands
 | 
				
			||||||
        return subgroupcoherent || workgroupcoherent || queuefamilycoherent || devicecoherent || coherent || nonprivate;
 | 
					        return subgroupcoherent || workgroupcoherent || queuefamilycoherent || devicecoherent || coherent || nonprivate;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool isInterpolation() const
 | 
					    bool isInterpolation() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        return flat || smooth || nopersp || explicitInterp;
 | 
					        return flat || smooth || nopersp || explicitInterp;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
        return flat || smooth || nopersp;
 | 
					        return flat || smooth;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    bool isExplicitInterpolation() const
 | 
					    bool isExplicitInterpolation() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return explicitInterp;
 | 
					        return explicitInterp;
 | 
				
			||||||
@ -580,10 +580,10 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    bool isAuxiliary() const
 | 
					    bool isAuxiliary() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        return centroid || patch || sample || pervertexNV;
 | 
					        return centroid || patch || sample || pervertexNV;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
        return centroid || patch || sample;
 | 
					        return centroid;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -651,33 +651,6 @@ public:
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool isPerPrimitive() const
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        return perPrimitiveNV;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool isPerView() const
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        return perViewNV;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool isTaskMemory() const
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        return perTaskNV;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    bool isIo() const
 | 
					    bool isIo() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        switch (storage) {
 | 
					        switch (storage) {
 | 
				
			||||||
@ -717,6 +690,15 @@ public:
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					    bool isPerView() const { return false; }
 | 
				
			||||||
 | 
					    bool isTaskMemory() const { return false; }
 | 
				
			||||||
 | 
					    bool isArrayedIo(EShLanguage language) const { return false; }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    bool isPerPrimitive() const { return perPrimitiveNV; }
 | 
				
			||||||
 | 
					    bool isPerView() const { return perViewNV; }
 | 
				
			||||||
 | 
					    bool isTaskMemory() const { return perTaskNV; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // True if this type of IO is supposed to be arrayed with extra level for per-vertex data
 | 
					    // True if this type of IO is supposed to be arrayed with extra level for per-vertex data
 | 
				
			||||||
    bool isArrayedIo(EShLanguage language) const
 | 
					    bool isArrayedIo(EShLanguage language) const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -727,40 +709,37 @@ public:
 | 
				
			|||||||
            return ! patch && (isPipeInput() || isPipeOutput());
 | 
					            return ! patch && (isPipeInput() || isPipeOutput());
 | 
				
			||||||
        case EShLangTessEvaluation:
 | 
					        case EShLangTessEvaluation:
 | 
				
			||||||
            return ! patch && isPipeInput();
 | 
					            return ! patch && isPipeInput();
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        case EShLangFragment:
 | 
					        case EShLangFragment:
 | 
				
			||||||
            return pervertexNV && isPipeInput();
 | 
					            return pervertexNV && isPipeInput();
 | 
				
			||||||
        case EShLangMeshNV:
 | 
					        case EShLangMeshNV:
 | 
				
			||||||
            return ! perTaskNV && isPipeOutput();
 | 
					            return ! perTaskNV && isPipeOutput();
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Implementing an embedded layout-qualifier class here, since C++ can't have a real class bitfield
 | 
					    // Implementing an embedded layout-qualifier class here, since C++ can't have a real class bitfield
 | 
				
			||||||
    void clearLayout()  // all layout
 | 
					    void clearLayout()  // all layout
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        clearUniformLayout();
 | 
					        clearUniformLayout();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        layoutPushConstant = false;
 | 
					        layoutPushConstant = false;
 | 
				
			||||||
        layoutBufferReference = false;
 | 
					        layoutBufferReference = false;
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        layoutPassthrough = false;
 | 
					        layoutPassthrough = false;
 | 
				
			||||||
        layoutViewportRelative = false;
 | 
					        layoutViewportRelative = false;
 | 
				
			||||||
        // -2048 as the default value indicating layoutSecondaryViewportRelative is not set
 | 
					        // -2048 as the default value indicating layoutSecondaryViewportRelative is not set
 | 
				
			||||||
        layoutSecondaryViewportRelativeOffset = -2048;
 | 
					        layoutSecondaryViewportRelativeOffset = -2048;
 | 
				
			||||||
        layoutShaderRecordNV = false;
 | 
					        layoutShaderRecordNV = false;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        layoutBufferReferenceAlign = layoutBufferReferenceAlignEnd;
 | 
					        layoutBufferReferenceAlign = layoutBufferReferenceAlignEnd;
 | 
				
			||||||
 | 
					        layoutFormat = ElfNone;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        clearInterstageLayout();
 | 
					        clearInterstageLayout();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        layoutSpecConstantId = layoutSpecConstantIdEnd;
 | 
					        layoutSpecConstantId = layoutSpecConstantIdEnd;
 | 
				
			||||||
 | 
					 | 
				
			||||||
        layoutFormat = ElfNone;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    void clearInterstageLayout()
 | 
					    void clearInterstageLayout()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -787,11 +766,9 @@ public:
 | 
				
			|||||||
               hasAnyLocation() ||
 | 
					               hasAnyLocation() ||
 | 
				
			||||||
               hasStream() ||
 | 
					               hasStream() ||
 | 
				
			||||||
               hasFormat() ||
 | 
					               hasFormat() ||
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					               isShaderRecordNV() ||
 | 
				
			||||||
               layoutShaderRecordNV ||
 | 
					               isPushConstant() ||
 | 
				
			||||||
#endif
 | 
					               hasBufferReference();
 | 
				
			||||||
               layoutPushConstant ||
 | 
					 | 
				
			||||||
               layoutBufferReference;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    bool hasLayout() const
 | 
					    bool hasLayout() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -836,6 +813,7 @@ public:
 | 
				
			|||||||
                 unsigned int layoutSpecConstantId       : 11;
 | 
					                 unsigned int layoutSpecConstantId       : 11;
 | 
				
			||||||
    static const unsigned int layoutSpecConstantIdEnd = 0x7FF;
 | 
					    static const unsigned int layoutSpecConstantIdEnd = 0x7FF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    // stored as log2 of the actual alignment value
 | 
					    // stored as log2 of the actual alignment value
 | 
				
			||||||
                 unsigned int layoutBufferReferenceAlign :  6;
 | 
					                 unsigned int layoutBufferReferenceAlign :  6;
 | 
				
			||||||
    static const unsigned int layoutBufferReferenceAlignEnd = 0x3F;
 | 
					    static const unsigned int layoutBufferReferenceAlignEnd = 0x3F;
 | 
				
			||||||
@ -844,8 +822,6 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    bool layoutPushConstant;
 | 
					    bool layoutPushConstant;
 | 
				
			||||||
    bool layoutBufferReference;
 | 
					    bool layoutBufferReference;
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    bool layoutPassthrough;
 | 
					    bool layoutPassthrough;
 | 
				
			||||||
    bool layoutViewportRelative;
 | 
					    bool layoutViewportRelative;
 | 
				
			||||||
    int layoutSecondaryViewportRelativeOffset;
 | 
					    int layoutSecondaryViewportRelativeOffset;
 | 
				
			||||||
@ -899,14 +875,6 @@ public:
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return layoutLocation != layoutLocationEnd;
 | 
					        return layoutLocation != layoutLocationEnd;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    bool hasComponent() const
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return layoutComponent != layoutComponentEnd;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    bool hasIndex() const
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return layoutIndex != layoutIndexEnd;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    bool hasSet() const
 | 
					    bool hasSet() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return layoutSet != layoutSetEnd;
 | 
					        return layoutSet != layoutSetEnd;
 | 
				
			||||||
@ -915,6 +883,32 @@ public:
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return layoutBinding != layoutBindingEnd;
 | 
					        return layoutBinding != layoutBindingEnd;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					    bool isNonPerspective() const { return false; }
 | 
				
			||||||
 | 
					    bool hasIndex() const { return false; }
 | 
				
			||||||
 | 
					    bool hasComponent() const { return false; }
 | 
				
			||||||
 | 
					    bool hasStream() const { return false; }
 | 
				
			||||||
 | 
					    bool hasFormat() const { return false; }
 | 
				
			||||||
 | 
					    bool hasXfb() const { return false; }
 | 
				
			||||||
 | 
					    bool hasXfbBuffer() const { return false; }
 | 
				
			||||||
 | 
					    bool hasXfbStride() const { return false; }
 | 
				
			||||||
 | 
					    bool hasXfbOffset() const { return false; }
 | 
				
			||||||
 | 
					    bool hasAttachment() const { return false; }
 | 
				
			||||||
 | 
					    TLayoutFormat getFormat() const { return ElfNone; }
 | 
				
			||||||
 | 
					    bool isPushConstant() const { return false; }
 | 
				
			||||||
 | 
					    bool isShaderRecordNV() const { return false; }
 | 
				
			||||||
 | 
					    bool hasBufferReference() const { return false; }
 | 
				
			||||||
 | 
					    bool hasBufferReferenceAlign() const { return false; }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    bool isNonPerspective() const { return nopersp; }
 | 
				
			||||||
 | 
					    bool hasIndex() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return layoutIndex != layoutIndexEnd;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    bool hasComponent() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return layoutComponent != layoutComponentEnd;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    bool hasStream() const
 | 
					    bool hasStream() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return layoutStream != layoutStreamEnd;
 | 
					        return layoutStream != layoutStreamEnd;
 | 
				
			||||||
@ -945,16 +939,21 @@ public:
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return layoutAttachment != layoutAttachmentEnd;
 | 
					        return layoutAttachment != layoutAttachmentEnd;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    TLayoutFormat getFormat() const { return layoutFormat; }
 | 
				
			||||||
 | 
					    bool isPushConstant() const { return layoutPushConstant; }
 | 
				
			||||||
 | 
					    bool isShaderRecordNV() const { return layoutShaderRecordNV; }
 | 
				
			||||||
 | 
					    bool hasBufferReference() const { return layoutBufferReference; }
 | 
				
			||||||
 | 
					    bool hasBufferReferenceAlign() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return layoutBufferReferenceAlign != layoutBufferReferenceAlignEnd;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    bool hasSpecConstantId() const
 | 
					    bool hasSpecConstantId() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // Not the same thing as being a specialization constant, this
 | 
					        // Not the same thing as being a specialization constant, this
 | 
				
			||||||
        // is just whether or not it was declared with an ID.
 | 
					        // is just whether or not it was declared with an ID.
 | 
				
			||||||
        return layoutSpecConstantId != layoutSpecConstantIdEnd;
 | 
					        return layoutSpecConstantId != layoutSpecConstantIdEnd;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    bool hasBufferReferenceAlign() const
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return layoutBufferReferenceAlign != layoutBufferReferenceAlignEnd;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    bool isSpecConstant() const
 | 
					    bool isSpecConstant() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // True if type is a specialization constant, whether or not it
 | 
					        // True if type is a specialization constant, whether or not it
 | 
				
			||||||
@ -1150,18 +1149,20 @@ struct TShaderQualifiers {
 | 
				
			|||||||
    bool pointMode;
 | 
					    bool pointMode;
 | 
				
			||||||
    int localSize[3];         // compute shader
 | 
					    int localSize[3];         // compute shader
 | 
				
			||||||
    int localSizeSpecId[3];   // compute shader specialization id for gl_WorkGroupSize
 | 
					    int localSizeSpecId[3];   // compute shader specialization id for gl_WorkGroupSize
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    bool earlyFragmentTests;  // fragment input
 | 
					    bool earlyFragmentTests;  // fragment input
 | 
				
			||||||
    bool postDepthCoverage;   // fragment input
 | 
					    bool postDepthCoverage;   // fragment input
 | 
				
			||||||
    TLayoutDepth layoutDepth;
 | 
					    TLayoutDepth layoutDepth;
 | 
				
			||||||
    bool blendEquation;       // true if any blend equation was specified
 | 
					    bool blendEquation;       // true if any blend equation was specified
 | 
				
			||||||
    int numViews;             // multiview extenstions
 | 
					    int numViews;             // multiview extenstions
 | 
				
			||||||
    TInterlockOrdering interlockOrdering;
 | 
					    TInterlockOrdering interlockOrdering;
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    bool layoutOverrideCoverage;        // true if layout override_coverage set
 | 
					    bool layoutOverrideCoverage;        // true if layout override_coverage set
 | 
				
			||||||
    bool layoutDerivativeGroupQuads;    // true if layout derivative_group_quadsNV set
 | 
					    bool layoutDerivativeGroupQuads;    // true if layout derivative_group_quadsNV set
 | 
				
			||||||
    bool layoutDerivativeGroupLinear;   // true if layout derivative_group_linearNV set
 | 
					    bool layoutDerivativeGroupLinear;   // true if layout derivative_group_linearNV set
 | 
				
			||||||
    int primitives;                     // mesh shader "max_primitives"DerivativeGroupLinear;   // true if layout derivative_group_linearNV set
 | 
					    int primitives;                     // mesh shader "max_primitives"DerivativeGroupLinear;   // true if layout derivative_group_linearNV set
 | 
				
			||||||
 | 
					    TLayoutDepth getDepth() const { return layoutDepth; }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    TLayoutDepth getDepth() const { return EldNone; }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void init()
 | 
					    void init()
 | 
				
			||||||
@ -1180,20 +1181,26 @@ struct TShaderQualifiers {
 | 
				
			|||||||
        localSizeSpecId[0] = TQualifier::layoutNotSet;
 | 
					        localSizeSpecId[0] = TQualifier::layoutNotSet;
 | 
				
			||||||
        localSizeSpecId[1] = TQualifier::layoutNotSet;
 | 
					        localSizeSpecId[1] = TQualifier::layoutNotSet;
 | 
				
			||||||
        localSizeSpecId[2] = TQualifier::layoutNotSet;
 | 
					        localSizeSpecId[2] = TQualifier::layoutNotSet;
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        earlyFragmentTests = false;
 | 
					        earlyFragmentTests = false;
 | 
				
			||||||
        postDepthCoverage = false;
 | 
					        postDepthCoverage = false;
 | 
				
			||||||
        layoutDepth = EldNone;
 | 
					        layoutDepth = EldNone;
 | 
				
			||||||
        blendEquation = false;
 | 
					        blendEquation = false;
 | 
				
			||||||
        numViews = TQualifier::layoutNotSet;
 | 
					        numViews = TQualifier::layoutNotSet;
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        layoutOverrideCoverage      = false;
 | 
					        layoutOverrideCoverage      = false;
 | 
				
			||||||
        layoutDerivativeGroupQuads  = false;
 | 
					        layoutDerivativeGroupQuads  = false;
 | 
				
			||||||
        layoutDerivativeGroupLinear = false;
 | 
					        layoutDerivativeGroupLinear = false;
 | 
				
			||||||
        primitives                  = TQualifier::layoutNotSet;
 | 
					        primitives                  = TQualifier::layoutNotSet;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        interlockOrdering = EioNone;
 | 
					        interlockOrdering = EioNone;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					    bool hasBlendEquation() const { return false; }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    bool hasBlendEquation() const { return blendEquation; }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Merge in characteristics from the 'src' qualifier.  They can override when
 | 
					    // Merge in characteristics from the 'src' qualifier.  They can override when
 | 
				
			||||||
    // set, but never erase when not set.
 | 
					    // set, but never erase when not set.
 | 
				
			||||||
    void merge(const TShaderQualifiers& src)
 | 
					    void merge(const TShaderQualifiers& src)
 | 
				
			||||||
@ -1222,6 +1229,7 @@ struct TShaderQualifiers {
 | 
				
			|||||||
            if (src.localSizeSpecId[i] != TQualifier::layoutNotSet)
 | 
					            if (src.localSizeSpecId[i] != TQualifier::layoutNotSet)
 | 
				
			||||||
                localSizeSpecId[i] = src.localSizeSpecId[i];
 | 
					                localSizeSpecId[i] = src.localSizeSpecId[i];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        if (src.earlyFragmentTests)
 | 
					        if (src.earlyFragmentTests)
 | 
				
			||||||
            earlyFragmentTests = true;
 | 
					            earlyFragmentTests = true;
 | 
				
			||||||
        if (src.postDepthCoverage)
 | 
					        if (src.postDepthCoverage)
 | 
				
			||||||
@ -1232,7 +1240,6 @@ struct TShaderQualifiers {
 | 
				
			|||||||
            blendEquation = src.blendEquation;
 | 
					            blendEquation = src.blendEquation;
 | 
				
			||||||
        if (src.numViews != TQualifier::layoutNotSet)
 | 
					        if (src.numViews != TQualifier::layoutNotSet)
 | 
				
			||||||
            numViews = src.numViews;
 | 
					            numViews = src.numViews;
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        if (src.layoutOverrideCoverage)
 | 
					        if (src.layoutOverrideCoverage)
 | 
				
			||||||
            layoutOverrideCoverage = src.layoutOverrideCoverage;
 | 
					            layoutOverrideCoverage = src.layoutOverrideCoverage;
 | 
				
			||||||
        if (src.layoutDerivativeGroupQuads)
 | 
					        if (src.layoutDerivativeGroupQuads)
 | 
				
			||||||
@ -1241,10 +1248,9 @@ struct TShaderQualifiers {
 | 
				
			|||||||
            layoutDerivativeGroupLinear = src.layoutDerivativeGroupLinear;
 | 
					            layoutDerivativeGroupLinear = src.layoutDerivativeGroupLinear;
 | 
				
			||||||
        if (src.primitives != TQualifier::layoutNotSet)
 | 
					        if (src.primitives != TQualifier::layoutNotSet)
 | 
				
			||||||
            primitives = src.primitives;
 | 
					            primitives = src.primitives;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (src.interlockOrdering != EioNone)
 | 
					        if (src.interlockOrdering != EioNone)
 | 
				
			||||||
            interlockOrdering = src.interlockOrdering;
 | 
					            interlockOrdering = src.interlockOrdering;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1580,9 +1586,9 @@ public:
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    virtual bool isOpaque() const { return basicType == EbtSampler || basicType == EbtAtomicUint
 | 
					    virtual bool isOpaque() const { return basicType == EbtSampler
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        || basicType == EbtAccStructNV
 | 
					         || basicType == EbtAtomicUint || basicType == EbtAccStructNV
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
        ; }
 | 
					        ; }
 | 
				
			||||||
    virtual bool isBuiltIn() const { return getQualifier().builtIn != EbvNone; }
 | 
					    virtual bool isBuiltIn() const { return getQualifier().builtIn != EbvNone; }
 | 
				
			||||||
@ -1592,7 +1598,13 @@ public:
 | 
				
			|||||||
    virtual bool isSubpass() const { return basicType == EbtSampler && getSampler().isSubpass(); }
 | 
					    virtual bool isSubpass() const { return basicType == EbtSampler && getSampler().isSubpass(); }
 | 
				
			||||||
    virtual bool isTexture() const { return basicType == EbtSampler && getSampler().isTexture(); }
 | 
					    virtual bool isTexture() const { return basicType == EbtSampler && getSampler().isTexture(); }
 | 
				
			||||||
    virtual bool isParameterized()  const { return typeParameters != nullptr; }
 | 
					    virtual bool isParameterized()  const { return typeParameters != nullptr; }
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					    virtual bool isCoopMat() const { return false; }
 | 
				
			||||||
 | 
					    virtual bool isReference() const { return false; }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
    virtual bool isCoopMat() const { return coopmat; }
 | 
					    virtual bool isCoopMat() const { return coopmat; }
 | 
				
			||||||
 | 
					    virtual bool isReference() const { return getBasicType() == EbtReference; }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // return true if this type contains any subtype which satisfies the given predicate.
 | 
					    // return true if this type contains any subtype which satisfies the given predicate.
 | 
				
			||||||
    template <typename P>
 | 
					    template <typename P>
 | 
				
			||||||
@ -1673,20 +1685,29 @@ public:
 | 
				
			|||||||
        return contains([](const TType* t) { return t->isArray() && t->arraySizes->isOuterSpecialization(); } );
 | 
					        return contains([](const TType* t) { return t->isArray() && t->arraySizes->isOuterSpecialization(); } );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					    virtual bool contains16BitFloat() const { return false; }
 | 
				
			||||||
 | 
					    virtual bool contains16BitInt() const { return false; }
 | 
				
			||||||
 | 
					    virtual bool contains8BitInt() const { return false; }
 | 
				
			||||||
 | 
					    virtual bool containsCoopMat() const { return false; }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    virtual bool contains16BitFloat() const
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return containsBasicType(EbtFloat16);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    virtual bool contains16BitInt() const
 | 
					    virtual bool contains16BitInt() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return containsBasicType(EbtInt16) || containsBasicType(EbtUint16);
 | 
					        return containsBasicType(EbtInt16) || containsBasicType(EbtUint16);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    virtual bool contains8BitInt() const
 | 
					    virtual bool contains8BitInt() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return containsBasicType(EbtInt8) || containsBasicType(EbtUint8);
 | 
					        return containsBasicType(EbtInt8) || containsBasicType(EbtUint8);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    virtual bool containsCoopMat() const
 | 
					    virtual bool containsCoopMat() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return contains([](const TType* t) { return t->coopmat; } );
 | 
					        return contains([](const TType* t) { return t->coopmat; } );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Array editing methods.  Array descriptors can be shared across
 | 
					    // Array editing methods.  Array descriptors can be shared across
 | 
				
			||||||
    // type instances.  This allows all uses of the same array
 | 
					    // type instances.  This allows all uses of the same array
 | 
				
			||||||
@ -1746,11 +1767,9 @@ public:
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        if (isUnsizedArray() && !(skipNonvariablyIndexed || isArrayVariablyIndexed()))
 | 
					        if (isUnsizedArray() && !(skipNonvariablyIndexed || isArrayVariablyIndexed()))
 | 
				
			||||||
            changeOuterArraySize(getImplicitArraySize());
 | 
					            changeOuterArraySize(getImplicitArraySize());
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        // For multi-dim per-view arrays, set unsized inner dimension size to 1
 | 
					        // For multi-dim per-view arrays, set unsized inner dimension size to 1
 | 
				
			||||||
        if (qualifier.isPerView() && arraySizes && arraySizes->isInnerUnsized())
 | 
					        if (qualifier.isPerView() && arraySizes && arraySizes->isInnerUnsized())
 | 
				
			||||||
            arraySizes->clearInnerUnsized();
 | 
					            arraySizes->clearInnerUnsized();
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        if (isStruct() && structure->size() > 0) {
 | 
					        if (isStruct() && structure->size() > 0) {
 | 
				
			||||||
            int lastMember = (int)structure->size() - 1;
 | 
					            int lastMember = (int)structure->size() - 1;
 | 
				
			||||||
            for (int i = 0; i < lastMember; ++i)
 | 
					            for (int i = 0; i < lastMember; ++i)
 | 
				
			||||||
@ -1808,16 +1827,17 @@ public:
 | 
				
			|||||||
    static const char* getBasicString(TBasicType t)
 | 
					    static const char* getBasicString(TBasicType t)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        switch (t) {
 | 
					        switch (t) {
 | 
				
			||||||
        case EbtVoid:              return "void";
 | 
					 | 
				
			||||||
        case EbtFloat:             return "float";
 | 
					        case EbtFloat:             return "float";
 | 
				
			||||||
 | 
					        case EbtInt:               return "int";
 | 
				
			||||||
 | 
					        case EbtUint:              return "uint";
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
 | 
					        case EbtVoid:              return "void";
 | 
				
			||||||
        case EbtDouble:            return "double";
 | 
					        case EbtDouble:            return "double";
 | 
				
			||||||
        case EbtFloat16:           return "float16_t";
 | 
					        case EbtFloat16:           return "float16_t";
 | 
				
			||||||
        case EbtInt8:              return "int8_t";
 | 
					        case EbtInt8:              return "int8_t";
 | 
				
			||||||
        case EbtUint8:             return "uint8_t";
 | 
					        case EbtUint8:             return "uint8_t";
 | 
				
			||||||
        case EbtInt16:             return "int16_t";
 | 
					        case EbtInt16:             return "int16_t";
 | 
				
			||||||
        case EbtUint16:            return "uint16_t";
 | 
					        case EbtUint16:            return "uint16_t";
 | 
				
			||||||
        case EbtInt:               return "int";
 | 
					 | 
				
			||||||
        case EbtUint:              return "uint";
 | 
					 | 
				
			||||||
        case EbtInt64:             return "int64_t";
 | 
					        case EbtInt64:             return "int64_t";
 | 
				
			||||||
        case EbtUint64:            return "uint64_t";
 | 
					        case EbtUint64:            return "uint64_t";
 | 
				
			||||||
        case EbtBool:              return "bool";
 | 
					        case EbtBool:              return "bool";
 | 
				
			||||||
@ -1825,14 +1845,20 @@ public:
 | 
				
			|||||||
        case EbtSampler:           return "sampler/image";
 | 
					        case EbtSampler:           return "sampler/image";
 | 
				
			||||||
        case EbtStruct:            return "structure";
 | 
					        case EbtStruct:            return "structure";
 | 
				
			||||||
        case EbtBlock:             return "block";
 | 
					        case EbtBlock:             return "block";
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        case EbtAccStructNV:       return "accelerationStructureNV";
 | 
					        case EbtAccStructNV:       return "accelerationStructureNV";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        case EbtReference:         return "reference";
 | 
					        case EbtReference:         return "reference";
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
        default:                   return "unknown type";
 | 
					        default:                   return "unknown type";
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					    TString getCompleteString() const { return ""; }
 | 
				
			||||||
 | 
					    const char* getStorageQualifierString() const { return ""; }
 | 
				
			||||||
 | 
					    const char* getBuiltInVariableString() const { return ""; }
 | 
				
			||||||
 | 
					    const char* getPrecisionQualifierString() const { return ""; }
 | 
				
			||||||
 | 
					    TString getBasicTypeString() const { return ""; }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
    TString getCompleteString() const
 | 
					    TString getCompleteString() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        TString typeString;
 | 
					        TString typeString;
 | 
				
			||||||
@ -1921,7 +1947,6 @@ public:
 | 
				
			|||||||
                    appendUint(1u << qualifier.layoutBufferReferenceAlign);
 | 
					                    appendUint(1u << qualifier.layoutBufferReferenceAlign);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
                if (qualifier.layoutPassthrough)
 | 
					                if (qualifier.layoutPassthrough)
 | 
				
			||||||
                    appendStr(" passthrough");
 | 
					                    appendStr(" passthrough");
 | 
				
			||||||
                if (qualifier.layoutViewportRelative)
 | 
					                if (qualifier.layoutViewportRelative)
 | 
				
			||||||
@ -1932,7 +1957,6 @@ public:
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                if (qualifier.layoutShaderRecordNV)
 | 
					                if (qualifier.layoutShaderRecordNV)
 | 
				
			||||||
                    appendStr(" shaderRecordNV");
 | 
					                    appendStr(" shaderRecordNV");
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                appendStr(")");
 | 
					                appendStr(")");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -1950,11 +1974,8 @@ public:
 | 
				
			|||||||
            appendStr(" flat");
 | 
					            appendStr(" flat");
 | 
				
			||||||
        if (qualifier.nopersp)
 | 
					        if (qualifier.nopersp)
 | 
				
			||||||
            appendStr(" noperspective");
 | 
					            appendStr(" noperspective");
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        if (qualifier.explicitInterp)
 | 
					        if (qualifier.explicitInterp)
 | 
				
			||||||
            appendStr(" __explicitInterpAMD");
 | 
					            appendStr(" __explicitInterpAMD");
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        if (qualifier.pervertexNV)
 | 
					        if (qualifier.pervertexNV)
 | 
				
			||||||
            appendStr(" pervertexNV");
 | 
					            appendStr(" pervertexNV");
 | 
				
			||||||
        if (qualifier.perPrimitiveNV)
 | 
					        if (qualifier.perPrimitiveNV)
 | 
				
			||||||
@ -1963,7 +1984,6 @@ public:
 | 
				
			|||||||
            appendStr(" perviewNV");
 | 
					            appendStr(" perviewNV");
 | 
				
			||||||
        if (qualifier.perTaskNV)
 | 
					        if (qualifier.perTaskNV)
 | 
				
			||||||
            appendStr(" taskNV");
 | 
					            appendStr(" taskNV");
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        if (qualifier.patch)
 | 
					        if (qualifier.patch)
 | 
				
			||||||
            appendStr(" patch");
 | 
					            appendStr(" patch");
 | 
				
			||||||
        if (qualifier.sample)
 | 
					        if (qualifier.sample)
 | 
				
			||||||
@ -2078,6 +2098,8 @@ public:
 | 
				
			|||||||
    const char* getStorageQualifierString() const { return GetStorageQualifierString(qualifier.storage); }
 | 
					    const char* getStorageQualifierString() const { return GetStorageQualifierString(qualifier.storage); }
 | 
				
			||||||
    const char* getBuiltInVariableString() const { return GetBuiltInVariableString(qualifier.builtIn); }
 | 
					    const char* getBuiltInVariableString() const { return GetBuiltInVariableString(qualifier.builtIn); }
 | 
				
			||||||
    const char* getPrecisionQualifierString() const { return GetPrecisionQualifierString(qualifier.precision); }
 | 
					    const char* getPrecisionQualifierString() const { return GetPrecisionQualifierString(qualifier.precision); }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const TTypeList* getStruct() const { assert(isStruct()); return structure; }
 | 
					    const TTypeList* getStruct() const { assert(isStruct()); return structure; }
 | 
				
			||||||
    void setStruct(TTypeList* s) { assert(isStruct()); structure = s; }
 | 
					    void setStruct(TTypeList* s) { assert(isStruct()); structure = s; }
 | 
				
			||||||
    TTypeList* getWritableStruct() const { assert(isStruct()); return structure; }  // This should only be used when known to not be sharing with other threads
 | 
					    TTypeList* getWritableStruct() const { assert(isStruct()); return structure; }  // This should only be used when known to not be sharing with other threads
 | 
				
			||||||
@ -2146,10 +2168,10 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    bool sameReferenceType(const TType& right) const
 | 
					    bool sameReferenceType(const TType& right) const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if ((basicType == EbtReference) != (right.basicType == EbtReference))
 | 
					        if (isReference() != right.isReference())
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if ((basicType != EbtReference) && (right.basicType != EbtReference))
 | 
					        if (!isReference() && !right.isReference())
 | 
				
			||||||
            return true;
 | 
					            return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert(referentType != nullptr);
 | 
					        assert(referentType != nullptr);
 | 
				
			||||||
@ -2220,6 +2242,9 @@ public:
 | 
				
			|||||||
        return ! operator==(right);
 | 
					        return ! operator==(right);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					    unsigned int getBufferReferenceAlignment() const { return 0; }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
    unsigned int getBufferReferenceAlignment() const
 | 
					    unsigned int getBufferReferenceAlignment() const
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (getBasicType() == glslang::EbtReference) {
 | 
					        if (getBasicType() == glslang::EbtReference) {
 | 
				
			||||||
@ -2229,6 +2254,7 @@ public:
 | 
				
			|||||||
            return 0;
 | 
					            return 0;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
    // Require consumer to pick between deep copy and shallow copy.
 | 
					    // Require consumer to pick between deep copy and shallow copy.
 | 
				
			||||||
 | 
				
			|||||||
@ -422,11 +422,9 @@ enum TOperator {
 | 
				
			|||||||
    EOpReflect,
 | 
					    EOpReflect,
 | 
				
			||||||
    EOpRefract,
 | 
					    EOpRefract,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    EOpMin3,
 | 
					    EOpMin3,
 | 
				
			||||||
    EOpMax3,
 | 
					    EOpMax3,
 | 
				
			||||||
    EOpMid3,
 | 
					    EOpMid3,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EOpDPdx,            // Fragment only
 | 
					    EOpDPdx,            // Fragment only
 | 
				
			||||||
    EOpDPdy,            // Fragment only
 | 
					    EOpDPdy,            // Fragment only
 | 
				
			||||||
@ -441,10 +439,7 @@ enum TOperator {
 | 
				
			|||||||
    EOpInterpolateAtCentroid, // Fragment only
 | 
					    EOpInterpolateAtCentroid, // Fragment only
 | 
				
			||||||
    EOpInterpolateAtSample,   // Fragment only
 | 
					    EOpInterpolateAtSample,   // Fragment only
 | 
				
			||||||
    EOpInterpolateAtOffset,   // Fragment only
 | 
					    EOpInterpolateAtOffset,   // Fragment only
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    EOpInterpolateAtVertex,
 | 
					    EOpInterpolateAtVertex,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EOpMatrixTimesMatrix,
 | 
					    EOpMatrixTimesMatrix,
 | 
				
			||||||
    EOpOuterProduct,
 | 
					    EOpOuterProduct,
 | 
				
			||||||
@ -534,7 +529,6 @@ enum TOperator {
 | 
				
			|||||||
    EOpSubgroupQuadSwapVertical,
 | 
					    EOpSubgroupQuadSwapVertical,
 | 
				
			||||||
    EOpSubgroupQuadSwapDiagonal,
 | 
					    EOpSubgroupQuadSwapDiagonal,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    EOpSubgroupPartition,
 | 
					    EOpSubgroupPartition,
 | 
				
			||||||
    EOpSubgroupPartitionedAdd,
 | 
					    EOpSubgroupPartitionedAdd,
 | 
				
			||||||
    EOpSubgroupPartitionedMul,
 | 
					    EOpSubgroupPartitionedMul,
 | 
				
			||||||
@ -557,11 +551,9 @@ enum TOperator {
 | 
				
			|||||||
    EOpSubgroupPartitionedExclusiveAnd,
 | 
					    EOpSubgroupPartitionedExclusiveAnd,
 | 
				
			||||||
    EOpSubgroupPartitionedExclusiveOr,
 | 
					    EOpSubgroupPartitionedExclusiveOr,
 | 
				
			||||||
    EOpSubgroupPartitionedExclusiveXor,
 | 
					    EOpSubgroupPartitionedExclusiveXor,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EOpSubgroupGuardStop,
 | 
					    EOpSubgroupGuardStop,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    EOpMinInvocations,
 | 
					    EOpMinInvocations,
 | 
				
			||||||
    EOpMaxInvocations,
 | 
					    EOpMaxInvocations,
 | 
				
			||||||
    EOpAddInvocations,
 | 
					    EOpAddInvocations,
 | 
				
			||||||
@ -588,7 +580,6 @@ enum TOperator {
 | 
				
			|||||||
    EOpCubeFaceIndex,
 | 
					    EOpCubeFaceIndex,
 | 
				
			||||||
    EOpCubeFaceCoord,
 | 
					    EOpCubeFaceCoord,
 | 
				
			||||||
    EOpTime,
 | 
					    EOpTime,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EOpAtomicAdd,
 | 
					    EOpAtomicAdd,
 | 
				
			||||||
    EOpAtomicMin,
 | 
					    EOpAtomicMin,
 | 
				
			||||||
@ -795,10 +786,8 @@ enum TOperator {
 | 
				
			|||||||
    EOpImageQuerySamples,
 | 
					    EOpImageQuerySamples,
 | 
				
			||||||
    EOpImageLoad,
 | 
					    EOpImageLoad,
 | 
				
			||||||
    EOpImageStore,
 | 
					    EOpImageStore,
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    EOpImageLoadLod,
 | 
					    EOpImageLoadLod,
 | 
				
			||||||
    EOpImageStoreLod,
 | 
					    EOpImageStoreLod,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    EOpImageAtomicAdd,
 | 
					    EOpImageAtomicAdd,
 | 
				
			||||||
    EOpImageAtomicMin,
 | 
					    EOpImageAtomicMin,
 | 
				
			||||||
    EOpImageAtomicMax,
 | 
					    EOpImageAtomicMax,
 | 
				
			||||||
@ -813,9 +802,7 @@ enum TOperator {
 | 
				
			|||||||
    EOpSubpassLoad,
 | 
					    EOpSubpassLoad,
 | 
				
			||||||
    EOpSubpassLoadMS,
 | 
					    EOpSubpassLoadMS,
 | 
				
			||||||
    EOpSparseImageLoad,
 | 
					    EOpSparseImageLoad,
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    EOpSparseImageLoadLod,
 | 
					    EOpSparseImageLoadLod,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EOpImageGuardEnd,
 | 
					    EOpImageGuardEnd,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -853,13 +840,11 @@ enum TOperator {
 | 
				
			|||||||
    EOpTextureOffsetClamp,
 | 
					    EOpTextureOffsetClamp,
 | 
				
			||||||
    EOpTextureGradClamp,
 | 
					    EOpTextureGradClamp,
 | 
				
			||||||
    EOpTextureGradOffsetClamp,
 | 
					    EOpTextureGradOffsetClamp,
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    EOpTextureGatherLod,
 | 
					    EOpTextureGatherLod,
 | 
				
			||||||
    EOpTextureGatherLodOffset,
 | 
					    EOpTextureGatherLodOffset,
 | 
				
			||||||
    EOpTextureGatherLodOffsets,
 | 
					    EOpTextureGatherLodOffsets,
 | 
				
			||||||
    EOpFragmentMaskFetch,
 | 
					    EOpFragmentMaskFetch,
 | 
				
			||||||
    EOpFragmentFetch,
 | 
					    EOpFragmentFetch,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EOpSparseTextureGuardBegin,
 | 
					    EOpSparseTextureGuardBegin,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -879,15 +864,12 @@ enum TOperator {
 | 
				
			|||||||
    EOpSparseTextureOffsetClamp,
 | 
					    EOpSparseTextureOffsetClamp,
 | 
				
			||||||
    EOpSparseTextureGradClamp,
 | 
					    EOpSparseTextureGradClamp,
 | 
				
			||||||
    EOpSparseTextureGradOffsetClamp,
 | 
					    EOpSparseTextureGradOffsetClamp,
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    EOpSparseTextureGatherLod,
 | 
					    EOpSparseTextureGatherLod,
 | 
				
			||||||
    EOpSparseTextureGatherLodOffset,
 | 
					    EOpSparseTextureGatherLodOffset,
 | 
				
			||||||
    EOpSparseTextureGatherLodOffsets,
 | 
					    EOpSparseTextureGatherLodOffsets,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EOpSparseTextureGuardEnd,
 | 
					    EOpSparseTextureGuardEnd,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    EOpImageFootprintGuardBegin,
 | 
					    EOpImageFootprintGuardBegin,
 | 
				
			||||||
    EOpImageSampleFootprintNV,
 | 
					    EOpImageSampleFootprintNV,
 | 
				
			||||||
    EOpImageSampleFootprintClampNV,
 | 
					    EOpImageSampleFootprintClampNV,
 | 
				
			||||||
@ -895,7 +877,6 @@ enum TOperator {
 | 
				
			|||||||
    EOpImageSampleFootprintGradNV,
 | 
					    EOpImageSampleFootprintGradNV,
 | 
				
			||||||
    EOpImageSampleFootprintGradClampNV,
 | 
					    EOpImageSampleFootprintGradClampNV,
 | 
				
			||||||
    EOpImageFootprintGuardEnd,
 | 
					    EOpImageFootprintGuardEnd,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    EOpSamplingGuardEnd,
 | 
					    EOpSamplingGuardEnd,
 | 
				
			||||||
    EOpTextureGuardEnd,
 | 
					    EOpTextureGuardEnd,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -914,14 +895,12 @@ enum TOperator {
 | 
				
			|||||||
    EOpFindLSB,
 | 
					    EOpFindLSB,
 | 
				
			||||||
    EOpFindMSB,
 | 
					    EOpFindMSB,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    EOpTraceNV,
 | 
					    EOpTraceNV,
 | 
				
			||||||
    EOpReportIntersectionNV,
 | 
					    EOpReportIntersectionNV,
 | 
				
			||||||
    EOpIgnoreIntersectionNV,
 | 
					    EOpIgnoreIntersectionNV,
 | 
				
			||||||
    EOpTerminateRayNV,
 | 
					    EOpTerminateRayNV,
 | 
				
			||||||
    EOpExecuteCallableNV,
 | 
					    EOpExecuteCallableNV,
 | 
				
			||||||
    EOpWritePackedPrimitiveIndices4x8NV,
 | 
					    EOpWritePackedPrimitiveIndices4x8NV,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    // HLSL operations
 | 
					    // HLSL operations
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
@ -1110,6 +1089,7 @@ public:
 | 
				
			|||||||
    virtual bool isStruct() const { return type.isStruct(); }
 | 
					    virtual bool isStruct() const { return type.isStruct(); }
 | 
				
			||||||
    virtual bool isFloatingDomain() const { return type.isFloatingDomain(); }
 | 
					    virtual bool isFloatingDomain() const { return type.isFloatingDomain(); }
 | 
				
			||||||
    virtual bool isIntegerDomain() const { return type.isIntegerDomain(); }
 | 
					    virtual bool isIntegerDomain() const { return type.isIntegerDomain(); }
 | 
				
			||||||
 | 
					    virtual bool isReference() const { return type.isReference(); }
 | 
				
			||||||
    TString getCompleteString() const { return type.getCompleteString(); }
 | 
					    TString getCompleteString() const { return type.getCompleteString(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
@ -1303,9 +1283,7 @@ struct TCrackedTextureOp {
 | 
				
			|||||||
    bool grad;
 | 
					    bool grad;
 | 
				
			||||||
    bool subpass;
 | 
					    bool subpass;
 | 
				
			||||||
    bool lodClamp;
 | 
					    bool lodClamp;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    bool fragMask;
 | 
					    bool fragMask;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
@ -1323,9 +1301,7 @@ public:
 | 
				
			|||||||
    bool isSampling() const { return op > EOpSamplingGuardBegin && op < EOpSamplingGuardEnd; }
 | 
					    bool isSampling() const { return op > EOpSamplingGuardBegin && op < EOpSamplingGuardEnd; }
 | 
				
			||||||
    bool isImage()    const { return op > EOpImageGuardBegin    && op < EOpImageGuardEnd; }
 | 
					    bool isImage()    const { return op > EOpImageGuardBegin    && op < EOpImageGuardEnd; }
 | 
				
			||||||
    bool isSparseTexture() const { return op > EOpSparseTextureGuardBegin && op < EOpSparseTextureGuardEnd; }
 | 
					    bool isSparseTexture() const { return op > EOpSparseTextureGuardBegin && op < EOpSparseTextureGuardEnd; }
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    bool isImageFootprint() const { return op > EOpImageFootprintGuardBegin && op < EOpImageFootprintGuardEnd; }
 | 
					    bool isImageFootprint() const { return op > EOpImageFootprintGuardBegin && op < EOpImageFootprintGuardEnd; }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    bool isSparseImage()   const { return op == EOpSparseImageLoad; }
 | 
					    bool isSparseImage()   const { return op == EOpSparseImageLoad; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void setOperationPrecision(TPrecisionQualifier p) { operationPrecision = p; }
 | 
					    void setOperationPrecision(TPrecisionQualifier p) { operationPrecision = p; }
 | 
				
			||||||
@ -1356,9 +1332,7 @@ public:
 | 
				
			|||||||
        cracked.grad = false;
 | 
					        cracked.grad = false;
 | 
				
			||||||
        cracked.subpass = false;
 | 
					        cracked.subpass = false;
 | 
				
			||||||
        cracked.lodClamp = false;
 | 
					        cracked.lodClamp = false;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        cracked.fragMask = false;
 | 
					        cracked.fragMask = false;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        switch (op) {
 | 
					        switch (op) {
 | 
				
			||||||
        case EOpImageQuerySize:
 | 
					        case EOpImageQuerySize:
 | 
				
			||||||
@ -1467,7 +1441,6 @@ public:
 | 
				
			|||||||
            cracked.gather = true;
 | 
					            cracked.gather = true;
 | 
				
			||||||
            cracked.offsets = true;
 | 
					            cracked.offsets = true;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        case EOpTextureGatherLod:
 | 
					        case EOpTextureGatherLod:
 | 
				
			||||||
        case EOpSparseTextureGatherLod:
 | 
					        case EOpSparseTextureGatherLod:
 | 
				
			||||||
            cracked.gather = true;
 | 
					            cracked.gather = true;
 | 
				
			||||||
@ -1498,8 +1471,6 @@ public:
 | 
				
			|||||||
            cracked.subpass = sampler.dim == EsdSubpass;
 | 
					            cracked.subpass = sampler.dim == EsdSubpass;
 | 
				
			||||||
            cracked.fragMask = true;
 | 
					            cracked.fragMask = true;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        case EOpImageSampleFootprintNV:
 | 
					        case EOpImageSampleFootprintNV:
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        case EOpImageSampleFootprintClampNV:
 | 
					        case EOpImageSampleFootprintClampNV:
 | 
				
			||||||
@ -1515,7 +1486,6 @@ public:
 | 
				
			|||||||
            cracked.lodClamp = true;
 | 
					            cracked.lodClamp = true;
 | 
				
			||||||
            cracked.grad = true;
 | 
					            cracked.grad = true;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        case EOpSubpassLoad:
 | 
					        case EOpSubpassLoad:
 | 
				
			||||||
        case EOpSubpassLoadMS:
 | 
					        case EOpSubpassLoadMS:
 | 
				
			||||||
            cracked.subpass = true;
 | 
					            cracked.subpass = true;
 | 
				
			||||||
 | 
				
			|||||||
@ -292,13 +292,12 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TIntermTyped* right
 | 
				
			|||||||
                        newConstArray[i].setIConst(0);
 | 
					                        newConstArray[i].setIConst(0);
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                    } else goto modulo_default;
 | 
					                    } else goto modulo_default;
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
                case EbtInt64:
 | 
					                case EbtInt64:
 | 
				
			||||||
                    if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == LLONG_MIN) {
 | 
					                    if (rightUnionArray[i].getI64Const() == -1 && leftUnionArray[i].getI64Const() == LLONG_MIN) {
 | 
				
			||||||
                        newConstArray[i].setI64Const(0);
 | 
					                        newConstArray[i].setI64Const(0);
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                    } else goto modulo_default;
 | 
					                    } else goto modulo_default;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                case EbtInt16:
 | 
					                case EbtInt16:
 | 
				
			||||||
                    if (rightUnionArray[i].getIConst() == -1 && leftUnionArray[i].getIConst() == SHRT_MIN) {
 | 
					                    if (rightUnionArray[i].getIConst() == -1 && leftUnionArray[i].getIConst() == SHRT_MIN) {
 | 
				
			||||||
                        newConstArray[i].setIConst(0);
 | 
					                        newConstArray[i].setIConst(0);
 | 
				
			||||||
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -123,12 +123,12 @@ TIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIn
 | 
				
			|||||||
    if ((op == EOpAdd || op == EOpSub) && extensionRequested(E_GL_EXT_buffer_reference2)) {
 | 
					    if ((op == EOpAdd || op == EOpSub) && extensionRequested(E_GL_EXT_buffer_reference2)) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // No addressing math on struct with unsized array.
 | 
					        // No addressing math on struct with unsized array.
 | 
				
			||||||
        if ((left->getBasicType() == EbtReference && left->getType().getReferentType()->containsUnsizedArray()) ||
 | 
					        if ((left->isReference() && left->getType().getReferentType()->containsUnsizedArray()) ||
 | 
				
			||||||
            (right->getBasicType() == EbtReference && right->getType().getReferentType()->containsUnsizedArray())) {
 | 
					            (right->isReference() && right->getType().getReferentType()->containsUnsizedArray())) {
 | 
				
			||||||
            return nullptr;
 | 
					            return nullptr;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (left->getBasicType() == EbtReference && isTypeInt(right->getBasicType())) {
 | 
					        if (left->isReference() && isTypeInt(right->getBasicType())) {
 | 
				
			||||||
            const TType& referenceType = left->getType();
 | 
					            const TType& referenceType = left->getType();
 | 
				
			||||||
            TIntermConstantUnion* size = addConstantUnion((unsigned long long)computeBufferReferenceTypeSize(left->getType()), loc, true);
 | 
					            TIntermConstantUnion* size = addConstantUnion((unsigned long long)computeBufferReferenceTypeSize(left->getType()), loc, true);
 | 
				
			||||||
            left  = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, left, TType(EbtUint64));
 | 
					            left  = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, left, TType(EbtUint64));
 | 
				
			||||||
@ -141,7 +141,7 @@ TIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIn
 | 
				
			|||||||
            return node;
 | 
					            return node;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (op == EOpAdd && right->getBasicType() == EbtReference && isTypeInt(left->getBasicType())) {
 | 
					        if (op == EOpAdd && right->isReference() && isTypeInt(left->getBasicType())) {
 | 
				
			||||||
            const TType& referenceType = right->getType();
 | 
					            const TType& referenceType = right->getType();
 | 
				
			||||||
            TIntermConstantUnion* size = addConstantUnion((unsigned long long)computeBufferReferenceTypeSize(right->getType()), loc, true);
 | 
					            TIntermConstantUnion* size = addConstantUnion((unsigned long long)computeBufferReferenceTypeSize(right->getType()), loc, true);
 | 
				
			||||||
            right = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, right, TType(EbtUint64));
 | 
					            right = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, right, TType(EbtUint64));
 | 
				
			||||||
@ -154,7 +154,7 @@ TIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIn
 | 
				
			|||||||
            return node;
 | 
					            return node;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (op == EOpSub && left->getBasicType() == EbtReference && right->getBasicType() == EbtReference) {
 | 
					        if (op == EOpSub && left->isReference() && right->isReference()) {
 | 
				
			||||||
            TIntermConstantUnion* size = addConstantUnion((long long)computeBufferReferenceTypeSize(left->getType()), loc, true);
 | 
					            TIntermConstantUnion* size = addConstantUnion((long long)computeBufferReferenceTypeSize(left->getType()), loc, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            left = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, left, TType(EbtUint64));
 | 
					            left = addBuiltInFunctionCall(loc, EOpConvPtrToUint64, true, left, TType(EbtUint64));
 | 
				
			||||||
@ -170,7 +170,7 @@ TIntermTyped* TIntermediate::addBinaryMath(TOperator op, TIntermTyped* left, TIn
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // No other math operators supported on references
 | 
					        // No other math operators supported on references
 | 
				
			||||||
        if (left->getBasicType() == EbtReference || right->getBasicType() == EbtReference) {
 | 
					        if (left->isReference() || right->isReference()) {
 | 
				
			||||||
            return nullptr;
 | 
					            return nullptr;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -290,7 +290,7 @@ TIntermTyped* TIntermediate::addAssign(TOperator op, TIntermTyped* left, TInterm
 | 
				
			|||||||
    // Convert "reference += int" to "reference = reference + int". We need this because the
 | 
					    // Convert "reference += int" to "reference = reference + int". We need this because the
 | 
				
			||||||
    // "reference + int" calculation involves a cast back to the original type, which makes it
 | 
					    // "reference + int" calculation involves a cast back to the original type, which makes it
 | 
				
			||||||
    // not an lvalue.
 | 
					    // not an lvalue.
 | 
				
			||||||
    if ((op == EOpAddAssign || op == EOpSubAssign) && left->getBasicType() == EbtReference &&
 | 
					    if ((op == EOpAddAssign || op == EOpSubAssign) && left->isReference() &&
 | 
				
			||||||
        extensionRequested(E_GL_EXT_buffer_reference2)) {
 | 
					        extensionRequested(E_GL_EXT_buffer_reference2)) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!(right->getType().isScalar() && right->getType().isIntegerDomain()))
 | 
					        if (!(right->getType().isScalar() && right->getType().isIntegerDomain()))
 | 
				
			||||||
@ -536,9 +536,7 @@ bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const
 | 
				
			|||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    case EbtAtomicUint:
 | 
					    case EbtAtomicUint:
 | 
				
			||||||
    case EbtSampler:
 | 
					    case EbtSampler:
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case EbtAccStructNV:
 | 
					    case EbtAccStructNV:
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        // opaque types can be passed to functions
 | 
					        // opaque types can be passed to functions
 | 
				
			||||||
        if (op == EOpFunction)
 | 
					        if (op == EOpFunction)
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
@ -1110,7 +1108,7 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt
 | 
				
			|||||||
    case EOpConstructStruct:
 | 
					    case EOpConstructStruct:
 | 
				
			||||||
    case EOpConstructCooperativeMatrix:
 | 
					    case EOpConstructCooperativeMatrix:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (type.getBasicType() == EbtReference || node->getType().getBasicType() == EbtReference) {
 | 
					        if (type.isReference() || node->getType().isReference()) {
 | 
				
			||||||
            // types must match to assign a reference
 | 
					            // types must match to assign a reference
 | 
				
			||||||
            if (type == node->getType())
 | 
					            if (type == node->getType())
 | 
				
			||||||
                return node;
 | 
					                return node;
 | 
				
			||||||
@ -1670,7 +1668,7 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat
 | 
				
			|||||||
            case EbtFloat:
 | 
					            case EbtFloat:
 | 
				
			||||||
            case EbtDouble:
 | 
					            case EbtDouble:
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
            case EbtInt16:
 | 
					            case EbtInt16:
 | 
				
			||||||
            case EbtUint16:
 | 
					            case EbtUint16:
 | 
				
			||||||
                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 | 
					                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 | 
				
			||||||
@ -1688,17 +1686,15 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat
 | 
				
			|||||||
                 return true;
 | 
					                 return true;
 | 
				
			||||||
            case EbtBool:
 | 
					            case EbtBool:
 | 
				
			||||||
                 return (getSource() == EShSourceHlsl);
 | 
					                 return (getSource() == EShSourceHlsl);
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
            case EbtInt16:
 | 
					            case EbtInt16:
 | 
				
			||||||
            case EbtUint16:
 | 
					            case EbtUint16:
 | 
				
			||||||
                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 | 
					                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            case EbtFloat16:
 | 
					            case EbtFloat16:
 | 
				
			||||||
                return 
 | 
					                return 
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                    extensionRequested(E_GL_AMD_gpu_shader_half_float) ||
 | 
					                    extensionRequested(E_GL_AMD_gpu_shader_half_float) ||
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                    getSource() == EShSourceHlsl;
 | 
					                    getSource() == EShSourceHlsl;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
            default:
 | 
					            default:
 | 
				
			||||||
                 return false;
 | 
					                 return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -1710,7 +1706,7 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat
 | 
				
			|||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            case EbtBool:
 | 
					            case EbtBool:
 | 
				
			||||||
                return getSource() == EShSourceHlsl;
 | 
					                return getSource() == EShSourceHlsl;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
            case EbtInt16:
 | 
					            case EbtInt16:
 | 
				
			||||||
            case EbtUint16:
 | 
					            case EbtUint16:
 | 
				
			||||||
                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 | 
					                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 | 
				
			||||||
@ -1724,7 +1720,7 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat
 | 
				
			|||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            case EbtBool:
 | 
					            case EbtBool:
 | 
				
			||||||
                return getSource() == EShSourceHlsl;
 | 
					                return getSource() == EShSourceHlsl;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
            case EbtInt16:
 | 
					            case EbtInt16:
 | 
				
			||||||
                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 | 
					                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@ -1738,7 +1734,7 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat
 | 
				
			|||||||
            case EbtInt64:
 | 
					            case EbtInt64:
 | 
				
			||||||
            case EbtUint64:
 | 
					            case EbtUint64:
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
            case EbtInt16:
 | 
					            case EbtInt16:
 | 
				
			||||||
            case EbtUint16:
 | 
					            case EbtUint16:
 | 
				
			||||||
                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 | 
					                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 | 
				
			||||||
@ -1751,15 +1747,15 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat
 | 
				
			|||||||
            case EbtInt:
 | 
					            case EbtInt:
 | 
				
			||||||
            case EbtInt64:
 | 
					            case EbtInt64:
 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
            case EbtInt16:
 | 
					            case EbtInt16:
 | 
				
			||||||
                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 | 
					                return extensionRequested(E_GL_AMD_gpu_shader_int16);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
            default:
 | 
					            default:
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        case EbtFloat16:
 | 
					        case EbtFloat16:
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
            switch (from) {
 | 
					            switch (from) {
 | 
				
			||||||
            case EbtInt16:
 | 
					            case EbtInt16:
 | 
				
			||||||
            case EbtUint16:
 | 
					            case EbtUint16:
 | 
				
			||||||
@ -1769,10 +1765,8 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat
 | 
				
			|||||||
            default:
 | 
					            default:
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        case EbtUint16:
 | 
					        case EbtUint16:
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
            switch (from) {
 | 
					            switch (from) {
 | 
				
			||||||
            case EbtInt16:
 | 
					            case EbtInt16:
 | 
				
			||||||
            case EbtUint16:
 | 
					            case EbtUint16:
 | 
				
			||||||
@ -1780,8 +1774,8 @@ bool TIntermediate::canImplicitlyPromote(TBasicType from, TBasicType to, TOperat
 | 
				
			|||||||
            default:
 | 
					            default:
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
        default:
 | 
					        default:
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -152,12 +152,10 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op,
 | 
				
			|||||||
    case EvqBuffer:
 | 
					    case EvqBuffer:
 | 
				
			||||||
        if (node->getQualifier().readonly)
 | 
					        if (node->getQualifier().readonly)
 | 
				
			||||||
            message = "can't modify a readonly buffer";
 | 
					            message = "can't modify a readonly buffer";
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					        if (node->getQualifier().isShaderRecordNV())
 | 
				
			||||||
        if (node->getQualifier().layoutShaderRecordNV)
 | 
					 | 
				
			||||||
            message = "can't modify a shaderrecordnv qualified buffer";
 | 
					            message = "can't modify a shaderrecordnv qualified buffer";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    case EvqHitAttrNV:
 | 
					    case EvqHitAttrNV:
 | 
				
			||||||
        if (language != EShLangIntersectNV)
 | 
					        if (language != EShLangIntersectNV)
 | 
				
			||||||
            message = "cannot modify hitAttributeNV in this stage";
 | 
					            message = "cannot modify hitAttributeNV in this stage";
 | 
				
			||||||
@ -178,7 +176,7 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op,
 | 
				
			|||||||
        case EbtVoid:
 | 
					        case EbtVoid:
 | 
				
			||||||
            message = "can't modify void";
 | 
					            message = "can't modify void";
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        case EbtAccStructNV:
 | 
					        case EbtAccStructNV:
 | 
				
			||||||
            message = "can't modify accelerationStructureNV";
 | 
					            message = "can't modify accelerationStructureNV";
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -299,10 +299,12 @@ public:
 | 
				
			|||||||
    TIntermTyped* handleBracketDereference(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index);
 | 
					    TIntermTyped* handleBracketDereference(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index);
 | 
				
			||||||
    void handleIndexLimits(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index);
 | 
					    void handleIndexLimits(const TSourceLoc&, TIntermTyped* base, TIntermTyped* index);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    void makeEditable(TSymbol*&) override;
 | 
					    void makeEditable(TSymbol*&) override;
 | 
				
			||||||
 | 
					    void ioArrayCheck(const TSourceLoc&, const TType&, const TString& identifier);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    bool isIoResizeArray(const TType&) const;
 | 
					    bool isIoResizeArray(const TType&) const;
 | 
				
			||||||
    void fixIoArraySize(const TSourceLoc&, TType&);
 | 
					    void fixIoArraySize(const TSourceLoc&, TType&);
 | 
				
			||||||
    void ioArrayCheck(const TSourceLoc&, const TType&, const TString& identifier);
 | 
					 | 
				
			||||||
    void handleIoResizeArrayAccess(const TSourceLoc&, TIntermTyped* base);
 | 
					    void handleIoResizeArrayAccess(const TSourceLoc&, TIntermTyped* base);
 | 
				
			||||||
    void checkIoArraysConsistency(const TSourceLoc&, bool tailOnly = false);
 | 
					    void checkIoArraysConsistency(const TSourceLoc&, bool tailOnly = false);
 | 
				
			||||||
    int getIoArrayImplicitSize(const TQualifier&, TString* featureString = nullptr) const;
 | 
					    int getIoArrayImplicitSize(const TQualifier&, TString* featureString = nullptr) const;
 | 
				
			||||||
@ -443,7 +445,9 @@ protected:
 | 
				
			|||||||
    bool isRuntimeLength(const TIntermTyped&) const;
 | 
					    bool isRuntimeLength(const TIntermTyped&) const;
 | 
				
			||||||
    TIntermNode* executeInitializer(const TSourceLoc&, TIntermTyped* initializer, TVariable* variable);
 | 
					    TIntermNode* executeInitializer(const TSourceLoc&, TIntermTyped* initializer, TVariable* variable);
 | 
				
			||||||
    TIntermTyped* convertInitializerList(const TSourceLoc&, const TType&, TIntermTyped* initializer);
 | 
					    TIntermTyped* convertInitializerList(const TSourceLoc&, const TType&, TIntermTyped* initializer);
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    void finish() override;
 | 
					    void finish() override;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
 | 
				
			|||||||
@ -1645,7 +1645,7 @@ int TScanContext::identifierOrType()
 | 
				
			|||||||
        if (const TVariable* variable = parserToken->sType.lex.symbol->getAsVariable()) {
 | 
					        if (const TVariable* variable = parserToken->sType.lex.symbol->getAsVariable()) {
 | 
				
			||||||
            if (variable->isUserType() &&
 | 
					            if (variable->isUserType() &&
 | 
				
			||||||
                // treat redeclaration of forward-declared buffer/uniform reference as an identifier
 | 
					                // treat redeclaration of forward-declared buffer/uniform reference as an identifier
 | 
				
			||||||
                !(variable->getType().getBasicType() == EbtReference && afterBuffer)) {
 | 
					                !(variable->getType().isReference() && afterBuffer)) {
 | 
				
			||||||
                afterType = true;
 | 
					                afterType = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                return TYPE_NAME;
 | 
					                return TYPE_NAME;
 | 
				
			||||||
 | 
				
			|||||||
@ -326,6 +326,7 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable,  TS
 | 
				
			|||||||
    InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangFragment, source,
 | 
					    InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangFragment, source,
 | 
				
			||||||
                               infoSink, commonTable, symbolTables);
 | 
					                               infoSink, commonTable, symbolTables);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    // check for tessellation
 | 
					    // check for tessellation
 | 
				
			||||||
    if ((profile != EEsProfile && version >= 150) ||
 | 
					    if ((profile != EEsProfile && version >= 150) ||
 | 
				
			||||||
        (profile == EEsProfile && version >= 310)) {
 | 
					        (profile == EEsProfile && version >= 310)) {
 | 
				
			||||||
@ -347,7 +348,6 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable,  TS
 | 
				
			|||||||
        InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangCompute, source,
 | 
					        InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangCompute, source,
 | 
				
			||||||
                                   infoSink, commonTable, symbolTables);
 | 
					                                   infoSink, commonTable, symbolTables);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    // check for ray tracing stages
 | 
					    // check for ray tracing stages
 | 
				
			||||||
    if (profile != EEsProfile && version >= 450) {
 | 
					    if (profile != EEsProfile && version >= 450) {
 | 
				
			||||||
        InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangRayGenNV, source,
 | 
					        InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangRayGenNV, source,
 | 
				
			||||||
@ -581,6 +581,7 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo
 | 
				
			|||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    // Correct for stage type...
 | 
					    // Correct for stage type...
 | 
				
			||||||
    switch (stage) {
 | 
					    switch (stage) {
 | 
				
			||||||
    case EShLangGeometry:
 | 
					    case EShLangGeometry:
 | 
				
			||||||
@ -612,7 +613,6 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo
 | 
				
			|||||||
            version = profile == EEsProfile ? 310 : 420;
 | 
					            version = profile == EEsProfile ? 310 : 420;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case EShLangRayGenNV:
 | 
					    case EShLangRayGenNV:
 | 
				
			||||||
    case EShLangIntersectNV:
 | 
					    case EShLangIntersectNV:
 | 
				
			||||||
    case EShLangAnyHitNV:
 | 
					    case EShLangAnyHitNV:
 | 
				
			||||||
@ -633,10 +633,10 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo
 | 
				
			|||||||
            infoSink.info.message(EPrefixError, "#version: mesh/task shaders require es profile with version 320 or above, or non-es profile with version 450 or above");
 | 
					            infoSink.info.message(EPrefixError, "#version: mesh/task shaders require es profile with version 320 or above, or non-es profile with version 450 or above");
 | 
				
			||||||
            version = profile == EEsProfile ? 320 : 450;
 | 
					            version = profile == EEsProfile ? 320 : 450;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (profile == EEsProfile && version >= 300 && versionNotFirst) {
 | 
					    if (profile == EEsProfile && version >= 300 && versionNotFirst) {
 | 
				
			||||||
        correct = false;
 | 
					        correct = false;
 | 
				
			||||||
 | 
				
			|||||||
@ -61,24 +61,24 @@ void TType::buildMangledName(TString& mangledName) const
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    switch (basicType) {
 | 
					    switch (basicType) {
 | 
				
			||||||
    case EbtFloat:              mangledName += 'f';      break;
 | 
					    case EbtFloat:              mangledName += 'f';      break;
 | 
				
			||||||
    case EbtDouble:             mangledName += 'd';      break;
 | 
					 | 
				
			||||||
    case EbtFloat16:            mangledName += "f16";    break;
 | 
					 | 
				
			||||||
    case EbtInt:                mangledName += 'i';      break;
 | 
					    case EbtInt:                mangledName += 'i';      break;
 | 
				
			||||||
    case EbtUint:               mangledName += 'u';      break;
 | 
					    case EbtUint:               mangledName += 'u';      break;
 | 
				
			||||||
 | 
					    case EbtBool:               mangledName += 'b';      break;
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
 | 
					    case EbtDouble:             mangledName += 'd';      break;
 | 
				
			||||||
 | 
					    case EbtFloat16:            mangledName += "f16";    break;
 | 
				
			||||||
    case EbtInt8:               mangledName += "i8";     break;
 | 
					    case EbtInt8:               mangledName += "i8";     break;
 | 
				
			||||||
    case EbtUint8:              mangledName += "u8";     break;
 | 
					    case EbtUint8:              mangledName += "u8";     break;
 | 
				
			||||||
    case EbtInt16:              mangledName += "i16";    break;
 | 
					    case EbtInt16:              mangledName += "i16";    break;
 | 
				
			||||||
    case EbtUint16:             mangledName += "u16";    break;
 | 
					    case EbtUint16:             mangledName += "u16";    break;
 | 
				
			||||||
    case EbtInt64:              mangledName += "i64";    break;
 | 
					    case EbtInt64:              mangledName += "i64";    break;
 | 
				
			||||||
    case EbtUint64:             mangledName += "u64";    break;
 | 
					    case EbtUint64:             mangledName += "u64";    break;
 | 
				
			||||||
    case EbtBool:               mangledName += 'b';      break;
 | 
					 | 
				
			||||||
    case EbtAtomicUint:         mangledName += "au";     break;
 | 
					    case EbtAtomicUint:         mangledName += "au";     break;
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case EbtAccStructNV:        mangledName += "asnv";   break;
 | 
					    case EbtAccStructNV:        mangledName += "asnv";   break;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    case EbtSampler:
 | 
					    case EbtSampler:
 | 
				
			||||||
        switch (sampler.type) {
 | 
					        switch (sampler.type) {
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        case EbtFloat16: mangledName += "f16"; break;
 | 
					        case EbtFloat16: mangledName += "f16"; break;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
        case EbtInt:   mangledName += "i"; break;
 | 
					        case EbtInt:   mangledName += "i"; break;
 | 
				
			||||||
 | 
				
			|||||||
@ -145,6 +145,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace glslang {
 | 
					namespace glslang {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Initialize all extensions, almost always to 'disable', as once their features
 | 
					// Initialize all extensions, almost always to 'disable', as once their features
 | 
				
			||||||
// are incorporated into a core version, their features are supported through allowing that
 | 
					// are incorporated into a core version, their features are supported through allowing that
 | 
				
			||||||
@ -221,7 +223,6 @@ void TParseVersions::initializeExtensionBehavior()
 | 
				
			|||||||
    extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive]          = EBhDisable;
 | 
					    extensionBehavior[E_GL_GOOGLE_cpp_style_line_directive]          = EBhDisable;
 | 
				
			||||||
    extensionBehavior[E_GL_GOOGLE_include_directive]                 = EBhDisable;
 | 
					    extensionBehavior[E_GL_GOOGLE_include_directive]                 = EBhDisable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    extensionBehavior[E_GL_AMD_shader_ballot]                        = EBhDisable;
 | 
					    extensionBehavior[E_GL_AMD_shader_ballot]                        = EBhDisable;
 | 
				
			||||||
    extensionBehavior[E_GL_AMD_shader_trinary_minmax]                = EBhDisable;
 | 
					    extensionBehavior[E_GL_AMD_shader_trinary_minmax]                = EBhDisable;
 | 
				
			||||||
    extensionBehavior[E_GL_AMD_shader_explicit_vertex_parameter]     = EBhDisable;
 | 
					    extensionBehavior[E_GL_AMD_shader_explicit_vertex_parameter]     = EBhDisable;
 | 
				
			||||||
@ -232,9 +233,7 @@ void TParseVersions::initializeExtensionBehavior()
 | 
				
			|||||||
    extensionBehavior[E_GL_AMD_shader_image_load_store_lod]          = EBhDisable;
 | 
					    extensionBehavior[E_GL_AMD_shader_image_load_store_lod]          = EBhDisable;
 | 
				
			||||||
    extensionBehavior[E_GL_AMD_shader_fragment_mask]                 = EBhDisable;
 | 
					    extensionBehavior[E_GL_AMD_shader_fragment_mask]                 = EBhDisable;
 | 
				
			||||||
    extensionBehavior[E_GL_AMD_gpu_shader_half_float_fetch]          = EBhDisable;
 | 
					    extensionBehavior[E_GL_AMD_gpu_shader_half_float_fetch]          = EBhDisable;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    extensionBehavior[E_GL_NV_sample_mask_override_coverage]         = EBhDisable;
 | 
					    extensionBehavior[E_GL_NV_sample_mask_override_coverage]         = EBhDisable;
 | 
				
			||||||
    extensionBehavior[E_SPV_NV_geometry_shader_passthrough]          = EBhDisable;
 | 
					    extensionBehavior[E_SPV_NV_geometry_shader_passthrough]          = EBhDisable;
 | 
				
			||||||
    extensionBehavior[E_GL_NV_viewport_array2]                       = EBhDisable;
 | 
					    extensionBehavior[E_GL_NV_viewport_array2]                       = EBhDisable;
 | 
				
			||||||
@ -250,7 +249,6 @@ void TParseVersions::initializeExtensionBehavior()
 | 
				
			|||||||
    extensionBehavior[E_GL_NV_compute_shader_derivatives]            = EBhDisable;
 | 
					    extensionBehavior[E_GL_NV_compute_shader_derivatives]            = EBhDisable;
 | 
				
			||||||
    extensionBehavior[E_GL_NV_shader_texture_footprint]              = EBhDisable;
 | 
					    extensionBehavior[E_GL_NV_shader_texture_footprint]              = EBhDisable;
 | 
				
			||||||
    extensionBehavior[E_GL_NV_mesh_shader]                           = EBhDisable;
 | 
					    extensionBehavior[E_GL_NV_mesh_shader]                           = EBhDisable;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    extensionBehavior[E_GL_NV_cooperative_matrix]                    = EBhDisable;
 | 
					    extensionBehavior[E_GL_NV_cooperative_matrix]                    = EBhDisable;
 | 
				
			||||||
    extensionBehavior[E_GL_NV_shader_sm_builtins]                    = EBhDisable;
 | 
					    extensionBehavior[E_GL_NV_shader_sm_builtins]                    = EBhDisable;
 | 
				
			||||||
@ -302,6 +300,7 @@ void TParseVersions::initializeExtensionBehavior()
 | 
				
			|||||||
    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_float32] = EBhDisable;
 | 
					    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_float32] = EBhDisable;
 | 
				
			||||||
    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_float64] = EBhDisable;
 | 
					    extensionBehavior[E_GL_EXT_shader_explicit_arithmetic_types_float64] = EBhDisable;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif // GLSLANG_WEB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Get code that is not part of a shared symbol table, is specific to this shader,
 | 
					// Get code that is not part of a shared symbol table, is specific to this shader,
 | 
				
			||||||
// or needed by the preprocessor (which does not use a shared symbol table).
 | 
					// or needed by the preprocessor (which does not use a shared symbol table).
 | 
				
			||||||
@ -311,6 +310,9 @@ void TParseVersions::getPreamble(std::string& preamble)
 | 
				
			|||||||
        preamble =
 | 
					        preamble =
 | 
				
			||||||
            "#define GL_ES 1\n"
 | 
					            "#define GL_ES 1\n"
 | 
				
			||||||
            "#define GL_FRAGMENT_PRECISION_HIGH 1\n"
 | 
					            "#define GL_FRAGMENT_PRECISION_HIGH 1\n"
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					            ;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
            "#define GL_OES_texture_3D 1\n"
 | 
					            "#define GL_OES_texture_3D 1\n"
 | 
				
			||||||
            "#define GL_OES_standard_derivatives 1\n"
 | 
					            "#define GL_OES_standard_derivatives 1\n"
 | 
				
			||||||
            "#define GL_EXT_frag_depth 1\n"
 | 
					            "#define GL_EXT_frag_depth 1\n"
 | 
				
			||||||
@ -350,11 +352,9 @@ void TParseVersions::getPreamble(std::string& preamble)
 | 
				
			|||||||
            "#define GL_EXT_shader_non_constant_global_initializers 1\n"
 | 
					            "#define GL_EXT_shader_non_constant_global_initializers 1\n"
 | 
				
			||||||
            ;
 | 
					            ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
            if (profile == EEsProfile && version >= 300) {
 | 
					            if (profile == EEsProfile && version >= 300) {
 | 
				
			||||||
                preamble += "#define GL_NV_shader_noperspective_interpolation 1\n";
 | 
					                preamble += "#define GL_NV_shader_noperspective_interpolation 1\n";
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        preamble =
 | 
					        preamble =
 | 
				
			||||||
@ -412,7 +412,6 @@ void TParseVersions::getPreamble(std::string& preamble)
 | 
				
			|||||||
            "#define E_GL_EXT_shader_atomic_int64 1\n"
 | 
					            "#define E_GL_EXT_shader_atomic_int64 1\n"
 | 
				
			||||||
            "#define E_GL_EXT_shader_realtime_clock 1\n"
 | 
					            "#define E_GL_EXT_shader_realtime_clock 1\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
            "#define GL_AMD_shader_ballot 1\n"
 | 
					            "#define GL_AMD_shader_ballot 1\n"
 | 
				
			||||||
            "#define GL_AMD_shader_trinary_minmax 1\n"
 | 
					            "#define GL_AMD_shader_trinary_minmax 1\n"
 | 
				
			||||||
            "#define GL_AMD_shader_explicit_vertex_parameter 1\n"
 | 
					            "#define GL_AMD_shader_explicit_vertex_parameter 1\n"
 | 
				
			||||||
@ -423,9 +422,7 @@ void TParseVersions::getPreamble(std::string& preamble)
 | 
				
			|||||||
            "#define GL_AMD_shader_image_load_store_lod 1\n"
 | 
					            "#define GL_AMD_shader_image_load_store_lod 1\n"
 | 
				
			||||||
            "#define GL_AMD_shader_fragment_mask 1\n"
 | 
					            "#define GL_AMD_shader_fragment_mask 1\n"
 | 
				
			||||||
            "#define GL_AMD_gpu_shader_half_float_fetch 1\n"
 | 
					            "#define GL_AMD_gpu_shader_half_float_fetch 1\n"
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
            "#define GL_NV_sample_mask_override_coverage 1\n"
 | 
					            "#define GL_NV_sample_mask_override_coverage 1\n"
 | 
				
			||||||
            "#define GL_NV_geometry_shader_passthrough 1\n"
 | 
					            "#define GL_NV_geometry_shader_passthrough 1\n"
 | 
				
			||||||
            "#define GL_NV_viewport_array2 1\n"
 | 
					            "#define GL_NV_viewport_array2 1\n"
 | 
				
			||||||
@ -438,7 +435,6 @@ void TParseVersions::getPreamble(std::string& preamble)
 | 
				
			|||||||
            "#define GL_NV_compute_shader_derivatives 1\n"
 | 
					            "#define GL_NV_compute_shader_derivatives 1\n"
 | 
				
			||||||
            "#define GL_NV_shader_texture_footprint 1\n"
 | 
					            "#define GL_NV_shader_texture_footprint 1\n"
 | 
				
			||||||
            "#define GL_NV_mesh_shader 1\n"
 | 
					            "#define GL_NV_mesh_shader 1\n"
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            "#define GL_NV_cooperative_matrix 1\n"
 | 
					            "#define GL_NV_cooperative_matrix 1\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            "#define GL_EXT_shader_explicit_arithmetic_types 1\n"
 | 
					            "#define GL_EXT_shader_explicit_arithmetic_types 1\n"
 | 
				
			||||||
@ -458,8 +454,10 @@ void TParseVersions::getPreamble(std::string& preamble)
 | 
				
			|||||||
            if (profile == ECompatibilityProfile)
 | 
					            if (profile == ECompatibilityProfile)
 | 
				
			||||||
                preamble += "#define GL_compatibility_profile 1\n";
 | 
					                preamble += "#define GL_compatibility_profile 1\n";
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					#endif // GLSLANG_WEB
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    if ((profile != EEsProfile && version >= 140) ||
 | 
					    if ((profile != EEsProfile && version >= 140) ||
 | 
				
			||||||
        (profile == EEsProfile && version >= 310)) {
 | 
					        (profile == EEsProfile && version >= 310)) {
 | 
				
			||||||
        preamble +=
 | 
					        preamble +=
 | 
				
			||||||
@ -481,6 +479,7 @@ void TParseVersions::getPreamble(std::string& preamble)
 | 
				
			|||||||
            "#define GL_GOOGLE_cpp_style_line_directive 1\n"
 | 
					            "#define GL_GOOGLE_cpp_style_line_directive 1\n"
 | 
				
			||||||
            "#define GL_GOOGLE_include_directive 1\n"
 | 
					            "#define GL_GOOGLE_include_directive 1\n"
 | 
				
			||||||
            ;
 | 
					            ;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // #define VULKAN XXXX
 | 
					    // #define VULKAN XXXX
 | 
				
			||||||
    const int numberBufSize = 12;
 | 
					    const int numberBufSize = 12;
 | 
				
			||||||
@ -491,6 +490,8 @@ void TParseVersions::getPreamble(std::string& preamble)
 | 
				
			|||||||
        preamble += numberBuf;
 | 
					        preamble += numberBuf;
 | 
				
			||||||
        preamble += "\n";
 | 
					        preamble += "\n";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    // #define GL_SPIRV XXXX
 | 
					    // #define GL_SPIRV XXXX
 | 
				
			||||||
    if (spvVersion.openGl > 0) {
 | 
					    if (spvVersion.openGl > 0) {
 | 
				
			||||||
        preamble += "#define GL_SPIRV ";
 | 
					        preamble += "#define GL_SPIRV ";
 | 
				
			||||||
@ -498,7 +499,7 @@ void TParseVersions::getPreamble(std::string& preamble)
 | 
				
			|||||||
        preamble += numberBuf;
 | 
					        preamble += numberBuf;
 | 
				
			||||||
        preamble += "\n";
 | 
					        preamble += "\n";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
@ -528,7 +529,6 @@ const char* StageName(EShLanguage stage)
 | 
				
			|||||||
    case EShLangGeometry:       return "geometry";
 | 
					    case EShLangGeometry:       return "geometry";
 | 
				
			||||||
    case EShLangFragment:       return "fragment";
 | 
					    case EShLangFragment:       return "fragment";
 | 
				
			||||||
    case EShLangCompute:        return "compute";
 | 
					    case EShLangCompute:        return "compute";
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case EShLangRayGenNV:       return "ray-generation";
 | 
					    case EShLangRayGenNV:       return "ray-generation";
 | 
				
			||||||
    case EShLangIntersectNV:    return "intersection";
 | 
					    case EShLangIntersectNV:    return "intersection";
 | 
				
			||||||
    case EShLangAnyHitNV:       return "any-hit";
 | 
					    case EShLangAnyHitNV:       return "any-hit";
 | 
				
			||||||
@ -537,7 +537,6 @@ const char* StageName(EShLanguage stage)
 | 
				
			|||||||
    case EShLangCallableNV:     return "callable";
 | 
					    case EShLangCallableNV:     return "callable";
 | 
				
			||||||
    case EShLangMeshNV:         return "mesh";
 | 
					    case EShLangMeshNV:         return "mesh";
 | 
				
			||||||
    case EShLangTaskNV:         return "task";
 | 
					    case EShLangTaskNV:         return "task";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    default:                    return "unknown stage";
 | 
					    default:                    return "unknown stage";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -609,6 +608,13 @@ void TParseVersions::requireStage(const TSourceLoc& loc, EShLanguage stage, cons
 | 
				
			|||||||
    requireStage(loc, static_cast<EShLanguageMask>(1 << stage), featureDesc);
 | 
					    requireStage(loc, static_cast<EShLanguageMask>(1 << stage), featureDesc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void TParseVersions::unimplemented(const TSourceLoc& loc, const char* featureDesc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    error(loc, "feature not yet implemented", featureDesc, "");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Within a set of profiles, see if a feature is deprecated and give an error or warning based on whether
 | 
					// Within a set of profiles, see if a feature is deprecated and give an error or warning based on whether
 | 
				
			||||||
// a future compatibility context is being use.
 | 
					// a future compatibility context is being use.
 | 
				
			||||||
@ -642,11 +648,6 @@ void TParseVersions::requireNotRemoved(const TSourceLoc& loc, int profileMask, i
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TParseVersions::unimplemented(const TSourceLoc& loc, const char* featureDesc)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    error(loc, "feature not yet implemented", featureDesc, "");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Returns true if at least one of the extensions in the extensions parameter is requested. Otherwise, returns false.
 | 
					// Returns true if at least one of the extensions in the extensions parameter is requested. Otherwise, returns false.
 | 
				
			||||||
// Warns appropriately if the requested behavior of an extension is "warn".
 | 
					// Warns appropriately if the requested behavior of an extension is "warn".
 | 
				
			||||||
bool TParseVersions::checkExtensionsRequested(const TSourceLoc& loc, int numExtensions, const char* const extensions[], const char* featureDesc)
 | 
					bool TParseVersions::checkExtensionsRequested(const TSourceLoc& loc, int numExtensions, const char* const extensions[], const char* featureDesc)
 | 
				
			||||||
@ -815,10 +816,8 @@ void TParseVersions::updateExtensionBehavior(int line, const char* extension, co
 | 
				
			|||||||
        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
 | 
					        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
 | 
				
			||||||
    else if (strcmp(extension, "GL_KHR_shader_subgroup_quad") == 0)
 | 
					    else if (strcmp(extension, "GL_KHR_shader_subgroup_quad") == 0)
 | 
				
			||||||
        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
 | 
					        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    else if (strcmp(extension, "GL_NV_shader_subgroup_partitioned") == 0)
 | 
					    else if (strcmp(extension, "GL_NV_shader_subgroup_partitioned") == 0)
 | 
				
			||||||
        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
 | 
					        updateExtensionBehavior(line, "GL_KHR_shader_subgroup_basic", behaviorString);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    else if (strcmp(extension, "GL_EXT_buffer_reference2") == 0)
 | 
					    else if (strcmp(extension, "GL_EXT_buffer_reference2") == 0)
 | 
				
			||||||
        updateExtensionBehavior(line, "GL_EXT_buffer_reference", behaviorString);
 | 
					        updateExtensionBehavior(line, "GL_EXT_buffer_reference", behaviorString);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -866,7 +865,6 @@ void TParseVersions::updateExtensionBehavior(const char* extension, TExtensionBe
 | 
				
			|||||||
// Check if extension is used with correct shader stage.
 | 
					// Check if extension is used with correct shader stage.
 | 
				
			||||||
void TParseVersions::checkExtensionStage(const TSourceLoc& loc, const char * const extension)
 | 
					void TParseVersions::checkExtensionStage(const TSourceLoc& loc, const char * const extension)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    // GL_NV_mesh_shader extension is only allowed in task/mesh shaders
 | 
					    // GL_NV_mesh_shader extension is only allowed in task/mesh shaders
 | 
				
			||||||
    if (strcmp(extension, "GL_NV_mesh_shader") == 0) {
 | 
					    if (strcmp(extension, "GL_NV_mesh_shader") == 0) {
 | 
				
			||||||
        requireStage(loc, (EShLanguageMask)(EShLangTaskNVMask | EShLangMeshNVMask | EShLangFragmentMask),
 | 
					        requireStage(loc, (EShLanguageMask)(EShLangTaskNVMask | EShLangMeshNVMask | EShLangFragmentMask),
 | 
				
			||||||
@ -874,7 +872,6 @@ void TParseVersions::checkExtensionStage(const TSourceLoc& loc, const char * con
 | 
				
			|||||||
        profileRequires(loc, ECoreProfile, 450, 0, "#extension GL_NV_mesh_shader");
 | 
					        profileRequires(loc, ECoreProfile, 450, 0, "#extension GL_NV_mesh_shader");
 | 
				
			||||||
        profileRequires(loc, EEsProfile, 320, 0, "#extension GL_NV_mesh_shader");
 | 
					        profileRequires(loc, EEsProfile, 320, 0, "#extension GL_NV_mesh_shader");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Call for any operation needing full GLSL integer data-type support.
 | 
					// Call for any operation needing full GLSL integer data-type support.
 | 
				
			||||||
@ -896,9 +893,7 @@ void TParseVersions::float16Check(const TSourceLoc& loc, const char* op, bool bu
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    if (!builtIn) {
 | 
					    if (!builtIn) {
 | 
				
			||||||
        const char* const extensions[] = {
 | 
					        const char* const extensions[] = {
 | 
				
			||||||
#if AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                                           E_GL_AMD_gpu_shader_half_float,
 | 
					                                           E_GL_AMD_gpu_shader_half_float,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                                           E_GL_EXT_shader_explicit_arithmetic_types,
 | 
					                                           E_GL_EXT_shader_explicit_arithmetic_types,
 | 
				
			||||||
                                           E_GL_EXT_shader_explicit_arithmetic_types_float16};
 | 
					                                           E_GL_EXT_shader_explicit_arithmetic_types_float16};
 | 
				
			||||||
        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);
 | 
					        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);
 | 
				
			||||||
@ -908,9 +903,7 @@ void TParseVersions::float16Check(const TSourceLoc& loc, const char* op, bool bu
 | 
				
			|||||||
bool TParseVersions::float16Arithmetic()
 | 
					bool TParseVersions::float16Arithmetic()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char* const extensions[] = {
 | 
					    const char* const extensions[] = {
 | 
				
			||||||
#if AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                                       E_GL_AMD_gpu_shader_half_float,
 | 
					                                       E_GL_AMD_gpu_shader_half_float,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                                       E_GL_EXT_shader_explicit_arithmetic_types,
 | 
					                                       E_GL_EXT_shader_explicit_arithmetic_types,
 | 
				
			||||||
                                       E_GL_EXT_shader_explicit_arithmetic_types_float16};
 | 
					                                       E_GL_EXT_shader_explicit_arithmetic_types_float16};
 | 
				
			||||||
    return extensionsTurnedOn(sizeof(extensions)/sizeof(extensions[0]), extensions);
 | 
					    return extensionsTurnedOn(sizeof(extensions)/sizeof(extensions[0]), extensions);
 | 
				
			||||||
@ -919,9 +912,7 @@ bool TParseVersions::float16Arithmetic()
 | 
				
			|||||||
bool TParseVersions::int16Arithmetic()
 | 
					bool TParseVersions::int16Arithmetic()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    const char* const extensions[] = {
 | 
					    const char* const extensions[] = {
 | 
				
			||||||
#if AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                                       E_GL_AMD_gpu_shader_int16,
 | 
					                                       E_GL_AMD_gpu_shader_int16,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                                       E_GL_EXT_shader_explicit_arithmetic_types,
 | 
					                                       E_GL_EXT_shader_explicit_arithmetic_types,
 | 
				
			||||||
                                       E_GL_EXT_shader_explicit_arithmetic_types_int16};
 | 
					                                       E_GL_EXT_shader_explicit_arithmetic_types_int16};
 | 
				
			||||||
    return extensionsTurnedOn(sizeof(extensions)/sizeof(extensions[0]), extensions);
 | 
					    return extensionsTurnedOn(sizeof(extensions)/sizeof(extensions[0]), extensions);
 | 
				
			||||||
@ -943,9 +934,7 @@ void TParseVersions::requireFloat16Arithmetic(const TSourceLoc& loc, const char*
 | 
				
			|||||||
    combined += featureDesc;
 | 
					    combined += featureDesc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const char* const extensions[] = {
 | 
					    const char* const extensions[] = {
 | 
				
			||||||
#if AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                                       E_GL_AMD_gpu_shader_half_float,
 | 
					                                       E_GL_AMD_gpu_shader_half_float,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                                       E_GL_EXT_shader_explicit_arithmetic_types,
 | 
					                                       E_GL_EXT_shader_explicit_arithmetic_types,
 | 
				
			||||||
                                       E_GL_EXT_shader_explicit_arithmetic_types_float16};
 | 
					                                       E_GL_EXT_shader_explicit_arithmetic_types_float16};
 | 
				
			||||||
    requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, combined.c_str());
 | 
					    requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, combined.c_str());
 | 
				
			||||||
@ -959,9 +948,7 @@ void TParseVersions::requireInt16Arithmetic(const TSourceLoc& loc, const char* o
 | 
				
			|||||||
    combined += featureDesc;
 | 
					    combined += featureDesc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const char* const extensions[] = {
 | 
					    const char* const extensions[] = {
 | 
				
			||||||
#if AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                                       E_GL_AMD_gpu_shader_int16,
 | 
					                                       E_GL_AMD_gpu_shader_int16,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                                       E_GL_EXT_shader_explicit_arithmetic_types,
 | 
					                                       E_GL_EXT_shader_explicit_arithmetic_types,
 | 
				
			||||||
                                       E_GL_EXT_shader_explicit_arithmetic_types_int16};
 | 
					                                       E_GL_EXT_shader_explicit_arithmetic_types_int16};
 | 
				
			||||||
    requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, combined.c_str());
 | 
					    requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, combined.c_str());
 | 
				
			||||||
@ -984,9 +971,7 @@ void TParseVersions::float16ScalarVectorCheck(const TSourceLoc& loc, const char*
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    if (!builtIn) {
 | 
					    if (!builtIn) {
 | 
				
			||||||
        const char* const extensions[] = {
 | 
					        const char* const extensions[] = {
 | 
				
			||||||
#if AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                                           E_GL_AMD_gpu_shader_half_float,
 | 
					                                           E_GL_AMD_gpu_shader_half_float,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                                           E_GL_EXT_shader_16bit_storage,
 | 
					                                           E_GL_EXT_shader_16bit_storage,
 | 
				
			||||||
                                           E_GL_EXT_shader_explicit_arithmetic_types,
 | 
					                                           E_GL_EXT_shader_explicit_arithmetic_types,
 | 
				
			||||||
                                           E_GL_EXT_shader_explicit_arithmetic_types_float16};
 | 
					                                           E_GL_EXT_shader_explicit_arithmetic_types_float16};
 | 
				
			||||||
@ -1026,7 +1011,6 @@ void TParseVersions::explicitInt8Check(const TSourceLoc& loc, const char* op, bo
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
// Call for any operation needing GLSL float16 opaque-type support
 | 
					// Call for any operation needing GLSL float16 opaque-type support
 | 
				
			||||||
void TParseVersions::float16OpaqueCheck(const TSourceLoc& loc, const char* op, bool builtIn)
 | 
					void TParseVersions::float16OpaqueCheck(const TSourceLoc& loc, const char* op, bool builtIn)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -1036,16 +1020,13 @@ void TParseVersions::float16OpaqueCheck(const TSourceLoc& loc, const char* op, b
 | 
				
			|||||||
        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 400, nullptr, op);
 | 
					        profileRequires(loc, ECoreProfile | ECompatibilityProfile, 400, nullptr, op);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Call for any operation needing GLSL explicit int16 data-type support.
 | 
					// Call for any operation needing GLSL explicit int16 data-type support.
 | 
				
			||||||
void TParseVersions::explicitInt16Check(const TSourceLoc& loc, const char* op, bool builtIn)
 | 
					void TParseVersions::explicitInt16Check(const TSourceLoc& loc, const char* op, bool builtIn)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (! builtIn) {
 | 
					    if (! builtIn) {
 | 
				
			||||||
        const char* const extensions[] = {
 | 
					        const char* const extensions[] = {
 | 
				
			||||||
#if AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                                           E_GL_AMD_gpu_shader_int16,
 | 
					                                           E_GL_AMD_gpu_shader_int16,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                                           E_GL_EXT_shader_explicit_arithmetic_types,
 | 
					                                           E_GL_EXT_shader_explicit_arithmetic_types,
 | 
				
			||||||
                                           E_GL_EXT_shader_explicit_arithmetic_types_int16};
 | 
					                                           E_GL_EXT_shader_explicit_arithmetic_types_int16};
 | 
				
			||||||
        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);
 | 
					        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);
 | 
				
			||||||
@ -1056,9 +1037,7 @@ void TParseVersions::int16ScalarVectorCheck(const TSourceLoc& loc, const char* o
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    if (! builtIn) {
 | 
					    if (! builtIn) {
 | 
				
			||||||
    	const char* const extensions[] = {
 | 
					    	const char* const extensions[] = {
 | 
				
			||||||
#if AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                                           E_GL_AMD_gpu_shader_int16,
 | 
					                                           E_GL_AMD_gpu_shader_int16,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                                           E_GL_EXT_shader_16bit_storage,
 | 
					                                           E_GL_EXT_shader_16bit_storage,
 | 
				
			||||||
                                           E_GL_EXT_shader_explicit_arithmetic_types,
 | 
					                                           E_GL_EXT_shader_explicit_arithmetic_types,
 | 
				
			||||||
                                           E_GL_EXT_shader_explicit_arithmetic_types_int16};
 | 
					                                           E_GL_EXT_shader_explicit_arithmetic_types_int16};
 | 
				
			||||||
@ -1107,6 +1086,7 @@ void TParseVersions::fcoopmatCheck(const TSourceLoc& loc, const char* op, bool b
 | 
				
			|||||||
        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);
 | 
					        requireExtensions(loc, sizeof(extensions)/sizeof(extensions[0]), extensions, op);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif // GLSLANG_WEB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Call for any operation removed because SPIR-V is in use.
 | 
					// Call for any operation removed because SPIR-V is in use.
 | 
				
			||||||
void TParseVersions::spvRemoved(const TSourceLoc& loc, const char* op)
 | 
					void TParseVersions::spvRemoved(const TSourceLoc& loc, const char* op)
 | 
				
			||||||
 | 
				
			|||||||
@ -193,7 +193,6 @@ const int Num_OVR_multiview_EXTs = sizeof(OVR_multiview_EXTs) / sizeof(OVR_multi
 | 
				
			|||||||
const char* const E_GL_GOOGLE_cpp_style_line_directive          = "GL_GOOGLE_cpp_style_line_directive";
 | 
					const char* const E_GL_GOOGLE_cpp_style_line_directive          = "GL_GOOGLE_cpp_style_line_directive";
 | 
				
			||||||
const char* const E_GL_GOOGLE_include_directive                 = "GL_GOOGLE_include_directive";
 | 
					const char* const E_GL_GOOGLE_include_directive                 = "GL_GOOGLE_include_directive";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
const char* const E_GL_AMD_shader_ballot                        = "GL_AMD_shader_ballot";
 | 
					const char* const E_GL_AMD_shader_ballot                        = "GL_AMD_shader_ballot";
 | 
				
			||||||
const char* const E_GL_AMD_shader_trinary_minmax                = "GL_AMD_shader_trinary_minmax";
 | 
					const char* const E_GL_AMD_shader_trinary_minmax                = "GL_AMD_shader_trinary_minmax";
 | 
				
			||||||
const char* const E_GL_AMD_shader_explicit_vertex_parameter     = "GL_AMD_shader_explicit_vertex_parameter";
 | 
					const char* const E_GL_AMD_shader_explicit_vertex_parameter     = "GL_AMD_shader_explicit_vertex_parameter";
 | 
				
			||||||
@ -204,9 +203,6 @@ const char* const E_GL_AMD_gpu_shader_int16                     = "GL_AMD_gpu_sh
 | 
				
			|||||||
const char* const E_GL_AMD_shader_image_load_store_lod          = "GL_AMD_shader_image_load_store_lod";
 | 
					const char* const E_GL_AMD_shader_image_load_store_lod          = "GL_AMD_shader_image_load_store_lod";
 | 
				
			||||||
const char* const E_GL_AMD_shader_fragment_mask                 = "GL_AMD_shader_fragment_mask";
 | 
					const char* const E_GL_AMD_shader_fragment_mask                 = "GL_AMD_shader_fragment_mask";
 | 
				
			||||||
const char* const E_GL_AMD_gpu_shader_half_float_fetch          = "GL_AMD_gpu_shader_half_float_fetch";
 | 
					const char* const E_GL_AMD_gpu_shader_half_float_fetch          = "GL_AMD_gpu_shader_half_float_fetch";
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char* const E_GL_NV_sample_mask_override_coverage         = "GL_NV_sample_mask_override_coverage";
 | 
					const char* const E_GL_NV_sample_mask_override_coverage         = "GL_NV_sample_mask_override_coverage";
 | 
				
			||||||
const char* const E_SPV_NV_geometry_shader_passthrough          = "GL_NV_geometry_shader_passthrough";
 | 
					const char* const E_SPV_NV_geometry_shader_passthrough          = "GL_NV_geometry_shader_passthrough";
 | 
				
			||||||
@ -228,7 +224,6 @@ const char* const E_GL_NV_mesh_shader                           = "GL_NV_mesh_sh
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const char* const viewportEXTs[] = { E_GL_ARB_shader_viewport_layer_array, E_GL_NV_viewport_array2 };
 | 
					const char* const viewportEXTs[] = { E_GL_ARB_shader_viewport_layer_array, E_GL_NV_viewport_array2 };
 | 
				
			||||||
const int Num_viewportEXTs = sizeof(viewportEXTs) / sizeof(viewportEXTs[0]);
 | 
					const int Num_viewportEXTs = sizeof(viewportEXTs) / sizeof(viewportEXTs[0]);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const char* const E_GL_NV_cooperative_matrix                    = "GL_NV_cooperative_matrix";
 | 
					const char* const E_GL_NV_cooperative_matrix                    = "GL_NV_cooperative_matrix";
 | 
				
			||||||
const char* const E_GL_NV_shader_sm_builtins                    = "GL_NV_shader_sm_builtins";
 | 
					const char* const E_GL_NV_shader_sm_builtins                    = "GL_NV_shader_sm_builtins";
 | 
				
			||||||
 | 
				
			|||||||
@ -78,7 +78,6 @@
 | 
				
			|||||||
#define GL_DOUBLE_MAT4x2                  0x8F4D
 | 
					#define GL_DOUBLE_MAT4x2                  0x8F4D
 | 
				
			||||||
#define GL_DOUBLE_MAT4x3                  0x8F4E
 | 
					#define GL_DOUBLE_MAT4x3                  0x8F4E
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
// Those constants are borrowed from extension NV_gpu_shader5
 | 
					// Those constants are borrowed from extension NV_gpu_shader5
 | 
				
			||||||
#define GL_FLOAT16_NV                     0x8FF8
 | 
					#define GL_FLOAT16_NV                     0x8FF8
 | 
				
			||||||
#define GL_FLOAT16_VEC2_NV                0x8FF9
 | 
					#define GL_FLOAT16_VEC2_NV                0x8FF9
 | 
				
			||||||
@ -94,7 +93,6 @@
 | 
				
			|||||||
#define GL_FLOAT16_MAT3x4_AMD             0x91CB
 | 
					#define GL_FLOAT16_MAT3x4_AMD             0x91CB
 | 
				
			||||||
#define GL_FLOAT16_MAT4x2_AMD             0x91CC
 | 
					#define GL_FLOAT16_MAT4x2_AMD             0x91CC
 | 
				
			||||||
#define GL_FLOAT16_MAT4x3_AMD             0x91CD
 | 
					#define GL_FLOAT16_MAT4x3_AMD             0x91CD
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define GL_SAMPLER_1D                     0x8B5D
 | 
					#define GL_SAMPLER_1D                     0x8B5D
 | 
				
			||||||
#define GL_SAMPLER_2D                     0x8B5E
 | 
					#define GL_SAMPLER_2D                     0x8B5E
 | 
				
			||||||
 | 
				
			|||||||
@ -309,12 +309,16 @@ primary_expression
 | 
				
			|||||||
        $$ = $1;
 | 
					        $$ = $1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | INT32CONSTANT {
 | 
					    | INT32CONSTANT {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitInt32Check($1.loc, "32-bit signed literal");
 | 
					        parseContext.explicitInt32Check($1.loc, "32-bit signed literal");
 | 
				
			||||||
        $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true);
 | 
					        $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | UINT32CONSTANT {
 | 
					    | UINT32CONSTANT {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitInt32Check($1.loc, "32-bit signed literal");
 | 
					        parseContext.explicitInt32Check($1.loc, "32-bit signed literal");
 | 
				
			||||||
        $$ = parseContext.intermediate.addConstantUnion($1.u, $1.loc, true);
 | 
					        $$ = parseContext.intermediate.addConstantUnion($1.u, $1.loc, true);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | INTCONSTANT {
 | 
					    | INTCONSTANT {
 | 
				
			||||||
        $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true);
 | 
					        $$ = parseContext.intermediate.addConstantUnion($1.i, $1.loc, true);
 | 
				
			||||||
@ -332,12 +336,16 @@ primary_expression
 | 
				
			|||||||
        $$ = parseContext.intermediate.addConstantUnion($1.u64, $1.loc, true);
 | 
					        $$ = parseContext.intermediate.addConstantUnion($1.u64, $1.loc, true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | INT16CONSTANT {
 | 
					    | INT16CONSTANT {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitInt16Check($1.loc, "16-bit integer literal");
 | 
					        parseContext.explicitInt16Check($1.loc, "16-bit integer literal");
 | 
				
			||||||
        $$ = parseContext.intermediate.addConstantUnion((short)$1.i, $1.loc, true);
 | 
					        $$ = parseContext.intermediate.addConstantUnion((short)$1.i, $1.loc, true);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | UINT16CONSTANT {
 | 
					    | UINT16CONSTANT {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitInt16Check($1.loc, "16-bit unsigned integer literal");
 | 
					        parseContext.explicitInt16Check($1.loc, "16-bit unsigned integer literal");
 | 
				
			||||||
        $$ = parseContext.intermediate.addConstantUnion((unsigned short)$1.u, $1.loc, true);
 | 
					        $$ = parseContext.intermediate.addConstantUnion((unsigned short)$1.u, $1.loc, true);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | FLOATCONSTANT {
 | 
					    | FLOATCONSTANT {
 | 
				
			||||||
        $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat, $1.loc, true);
 | 
					        $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat, $1.loc, true);
 | 
				
			||||||
@ -347,8 +355,10 @@ primary_expression
 | 
				
			|||||||
        $$ = parseContext.intermediate.addConstantUnion($1.d, EbtDouble, $1.loc, true);
 | 
					        $$ = parseContext.intermediate.addConstantUnion($1.d, EbtDouble, $1.loc, true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | FLOAT16CONSTANT {
 | 
					    | FLOAT16CONSTANT {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float literal");
 | 
					        parseContext.float16Check($1.loc, "half float literal");
 | 
				
			||||||
        $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat16, $1.loc, true);
 | 
					        $$ = parseContext.intermediate.addConstantUnion($1.d, EbtFloat16, $1.loc, true);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | BOOLCONSTANT {
 | 
					    | BOOLCONSTANT {
 | 
				
			||||||
        $$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true);
 | 
					        $$ = parseContext.intermediate.addConstantUnion($1.b, $1.loc, true);
 | 
				
			||||||
@ -1136,15 +1146,13 @@ interpolation_qualifier
 | 
				
			|||||||
        $$.qualifier.flat = true;
 | 
					        $$.qualifier.flat = true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | NOPERSPECTIVE {
 | 
					    | NOPERSPECTIVE {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.globalCheck($1.loc, "noperspective");
 | 
					        parseContext.globalCheck($1.loc, "noperspective");
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
        parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective");
 | 
					        parseContext.profileRequires($1.loc, EEsProfile, 0, E_GL_NV_shader_noperspective_interpolation, "noperspective");
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
        parseContext.requireProfile($1.loc, ~EEsProfile, "noperspective");
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "noperspective");
 | 
					        parseContext.profileRequires($1.loc, ENoProfile, 130, 0, "noperspective");
 | 
				
			||||||
        $$.init($1.loc);
 | 
					        $$.init($1.loc);
 | 
				
			||||||
        $$.qualifier.nopersp = true;
 | 
					        $$.qualifier.nopersp = true;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | EXPLICITINTERPAMD {
 | 
					    | EXPLICITINTERPAMD {
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					#ifdef AMD_EXTENSIONS
 | 
				
			||||||
@ -1463,16 +1471,20 @@ storage_qualifier
 | 
				
			|||||||
        $$.qualifier.writeonly = true;
 | 
					        $$.qualifier.writeonly = true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | SUBROUTINE {
 | 
					    | SUBROUTINE {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.spvRemoved($1.loc, "subroutine");
 | 
					        parseContext.spvRemoved($1.loc, "subroutine");
 | 
				
			||||||
        parseContext.globalCheck($1.loc, "subroutine");
 | 
					        parseContext.globalCheck($1.loc, "subroutine");
 | 
				
			||||||
        parseContext.unimplemented($1.loc, "subroutine");
 | 
					        parseContext.unimplemented($1.loc, "subroutine");
 | 
				
			||||||
        $$.init($1.loc);
 | 
					        $$.init($1.loc);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN {
 | 
					    | SUBROUTINE LEFT_PAREN type_name_list RIGHT_PAREN {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.spvRemoved($1.loc, "subroutine");
 | 
					        parseContext.spvRemoved($1.loc, "subroutine");
 | 
				
			||||||
        parseContext.globalCheck($1.loc, "subroutine");
 | 
					        parseContext.globalCheck($1.loc, "subroutine");
 | 
				
			||||||
        parseContext.unimplemented($1.loc, "subroutine");
 | 
					        parseContext.unimplemented($1.loc, "subroutine");
 | 
				
			||||||
        $$.init($1.loc);
 | 
					        $$.init($1.loc);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ;
 | 
					    ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1583,19 +1595,25 @@ type_specifier_nonarray
 | 
				
			|||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | FLOAT16_T {
 | 
					    | FLOAT16_T {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16ScalarVectorCheck($1.loc, "float16_t", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16ScalarVectorCheck($1.loc, "float16_t", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | FLOAT32_T {
 | 
					    | FLOAT32_T {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | FLOAT64_T {
 | 
					    | FLOAT64_T {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | INT {
 | 
					    | INT {
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
@ -1607,34 +1625,46 @@ type_specifier_nonarray
 | 
				
			|||||||
        $$.basicType = EbtUint;
 | 
					        $$.basicType = EbtUint;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | INT8_T {
 | 
					    | INT8_T {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtInt8;
 | 
					        $$.basicType = EbtInt8;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | UINT8_T {
 | 
					    | UINT8_T {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtUint8;
 | 
					        $$.basicType = EbtUint8;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | INT16_T {
 | 
					    | INT16_T {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtInt16;
 | 
					        $$.basicType = EbtInt16;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | UINT16_T {
 | 
					    | UINT16_T {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtUint16;
 | 
					        $$.basicType = EbtUint16;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | INT32_T {
 | 
					    | INT32_T {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitInt32Check($1.loc, "32-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitInt32Check($1.loc, "32-bit signed integer", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtInt;
 | 
					        $$.basicType = EbtInt;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | UINT32_T {
 | 
					    | UINT32_T {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtUint;
 | 
					        $$.basicType = EbtUint;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | INT64_T {
 | 
					    | INT64_T {
 | 
				
			||||||
        parseContext.int64Check($1.loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int64Check($1.loc, "64-bit integer", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
@ -1684,40 +1714,52 @@ type_specifier_nonarray
 | 
				
			|||||||
        $$.setVector(4);
 | 
					        $$.setVector(4);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16VEC2 {
 | 
					    | F16VEC2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16ScalarVectorCheck($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16ScalarVectorCheck($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setVector(2);
 | 
					        $$.setVector(2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16VEC3 {
 | 
					    | F16VEC3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16ScalarVectorCheck($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16ScalarVectorCheck($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setVector(3);
 | 
					        $$.setVector(3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16VEC4 {
 | 
					    | F16VEC4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16ScalarVectorCheck($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16ScalarVectorCheck($1.loc, "half float vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setVector(4);
 | 
					        $$.setVector(4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32VEC2 {
 | 
					    | F32VEC2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setVector(2);
 | 
					        $$.setVector(2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32VEC3 {
 | 
					    | F32VEC3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setVector(3);
 | 
					        $$.setVector(3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32VEC4 {
 | 
					    | F32VEC4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setVector(4);
 | 
					        $$.setVector(4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64VEC2 {
 | 
					    | F64VEC2 {
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
@ -1768,58 +1810,76 @@ type_specifier_nonarray
 | 
				
			|||||||
        $$.setVector(4);
 | 
					        $$.setVector(4);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | I8VEC2 {
 | 
					    | I8VEC2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtInt8;
 | 
					        $$.basicType = EbtInt8;
 | 
				
			||||||
        $$.setVector(2);
 | 
					        $$.setVector(2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | I8VEC3 {
 | 
					    | I8VEC3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtInt8;
 | 
					        $$.basicType = EbtInt8;
 | 
				
			||||||
        $$.setVector(3);
 | 
					        $$.setVector(3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | I8VEC4 {
 | 
					    | I8VEC4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int8ScalarVectorCheck($1.loc, "8-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtInt8;
 | 
					        $$.basicType = EbtInt8;
 | 
				
			||||||
        $$.setVector(4);
 | 
					        $$.setVector(4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | I16VEC2 {
 | 
					    | I16VEC2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtInt16;
 | 
					        $$.basicType = EbtInt16;
 | 
				
			||||||
        $$.setVector(2);
 | 
					        $$.setVector(2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | I16VEC3 {
 | 
					    | I16VEC3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtInt16;
 | 
					        $$.basicType = EbtInt16;
 | 
				
			||||||
        $$.setVector(3);
 | 
					        $$.setVector(3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | I16VEC4 {
 | 
					    | I16VEC4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int16ScalarVectorCheck($1.loc, "16-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtInt16;
 | 
					        $$.basicType = EbtInt16;
 | 
				
			||||||
        $$.setVector(4);
 | 
					        $$.setVector(4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | I32VEC2 {
 | 
					    | I32VEC2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtInt;
 | 
					        $$.basicType = EbtInt;
 | 
				
			||||||
        $$.setVector(2);
 | 
					        $$.setVector(2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | I32VEC3 {
 | 
					    | I32VEC3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtInt;
 | 
					        $$.basicType = EbtInt;
 | 
				
			||||||
        $$.setVector(3);
 | 
					        $$.setVector(3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | I32VEC4 {
 | 
					    | I32VEC4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitInt32Check($1.loc, "32-bit signed integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtInt;
 | 
					        $$.basicType = EbtInt;
 | 
				
			||||||
        $$.setVector(4);
 | 
					        $$.setVector(4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | I64VEC2 {
 | 
					    | I64VEC2 {
 | 
				
			||||||
        parseContext.int64Check($1.loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int64Check($1.loc, "64-bit integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
@ -1858,58 +1918,76 @@ type_specifier_nonarray
 | 
				
			|||||||
        $$.setVector(4);
 | 
					        $$.setVector(4);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | U8VEC2 {
 | 
					    | U8VEC2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtUint8;
 | 
					        $$.basicType = EbtUint8;
 | 
				
			||||||
        $$.setVector(2);
 | 
					        $$.setVector(2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | U8VEC3 {
 | 
					    | U8VEC3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtUint8;
 | 
					        $$.basicType = EbtUint8;
 | 
				
			||||||
        $$.setVector(3);
 | 
					        $$.setVector(3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | U8VEC4 {
 | 
					    | U8VEC4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int8ScalarVectorCheck($1.loc, "8-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtUint8;
 | 
					        $$.basicType = EbtUint8;
 | 
				
			||||||
        $$.setVector(4);
 | 
					        $$.setVector(4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | U16VEC2 {
 | 
					    | U16VEC2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtUint16;
 | 
					        $$.basicType = EbtUint16;
 | 
				
			||||||
        $$.setVector(2);
 | 
					        $$.setVector(2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | U16VEC3 {
 | 
					    | U16VEC3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtUint16;
 | 
					        $$.basicType = EbtUint16;
 | 
				
			||||||
        $$.setVector(3);
 | 
					        $$.setVector(3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | U16VEC4 {
 | 
					    | U16VEC4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int16ScalarVectorCheck($1.loc, "16-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtUint16;
 | 
					        $$.basicType = EbtUint16;
 | 
				
			||||||
        $$.setVector(4);
 | 
					        $$.setVector(4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | U32VEC2 {
 | 
					    | U32VEC2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtUint;
 | 
					        $$.basicType = EbtUint;
 | 
				
			||||||
        $$.setVector(2);
 | 
					        $$.setVector(2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | U32VEC3 {
 | 
					    | U32VEC3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtUint;
 | 
					        $$.basicType = EbtUint;
 | 
				
			||||||
        $$.setVector(3);
 | 
					        $$.setVector(3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | U32VEC4 {
 | 
					    | U32VEC4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitInt32Check($1.loc, "32-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtUint;
 | 
					        $$.basicType = EbtUint;
 | 
				
			||||||
        $$.setVector(4);
 | 
					        $$.setVector(4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | U64VEC2 {
 | 
					    | U64VEC2 {
 | 
				
			||||||
        parseContext.int64Check($1.loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.int64Check($1.loc, "64-bit unsigned integer vector", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
@ -2062,220 +2140,292 @@ type_specifier_nonarray
 | 
				
			|||||||
        $$.setMatrix(4, 4);
 | 
					        $$.setMatrix(4, 4);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16MAT2 {
 | 
					    | F16MAT2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setMatrix(2, 2);
 | 
					        $$.setMatrix(2, 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16MAT3 {
 | 
					    | F16MAT3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setMatrix(3, 3);
 | 
					        $$.setMatrix(3, 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16MAT4 {
 | 
					    | F16MAT4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setMatrix(4, 4);
 | 
					        $$.setMatrix(4, 4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16MAT2X2 {
 | 
					    | F16MAT2X2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setMatrix(2, 2);
 | 
					        $$.setMatrix(2, 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16MAT2X3 {
 | 
					    | F16MAT2X3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setMatrix(2, 3);
 | 
					        $$.setMatrix(2, 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16MAT2X4 {
 | 
					    | F16MAT2X4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setMatrix(2, 4);
 | 
					        $$.setMatrix(2, 4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16MAT3X2 {
 | 
					    | F16MAT3X2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setMatrix(3, 2);
 | 
					        $$.setMatrix(3, 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16MAT3X3 {
 | 
					    | F16MAT3X3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setMatrix(3, 3);
 | 
					        $$.setMatrix(3, 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16MAT3X4 {
 | 
					    | F16MAT3X4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setMatrix(3, 4);
 | 
					        $$.setMatrix(3, 4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16MAT4X2 {
 | 
					    | F16MAT4X2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setMatrix(4, 2);
 | 
					        $$.setMatrix(4, 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16MAT4X3 {
 | 
					    | F16MAT4X3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setMatrix(4, 3);
 | 
					        $$.setMatrix(4, 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F16MAT4X4 {
 | 
					    | F16MAT4X4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.float16Check($1.loc, "half float matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat16;
 | 
					        $$.basicType = EbtFloat16;
 | 
				
			||||||
        $$.setMatrix(4, 4);
 | 
					        $$.setMatrix(4, 4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32MAT2 {
 | 
					    | F32MAT2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setMatrix(2, 2);
 | 
					        $$.setMatrix(2, 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32MAT3 {
 | 
					    | F32MAT3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setMatrix(3, 3);
 | 
					        $$.setMatrix(3, 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32MAT4 {
 | 
					    | F32MAT4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setMatrix(4, 4);
 | 
					        $$.setMatrix(4, 4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32MAT2X2 {
 | 
					    | F32MAT2X2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setMatrix(2, 2);
 | 
					        $$.setMatrix(2, 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32MAT2X3 {
 | 
					    | F32MAT2X3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setMatrix(2, 3);
 | 
					        $$.setMatrix(2, 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32MAT2X4 {
 | 
					    | F32MAT2X4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setMatrix(2, 4);
 | 
					        $$.setMatrix(2, 4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32MAT3X2 {
 | 
					    | F32MAT3X2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setMatrix(3, 2);
 | 
					        $$.setMatrix(3, 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32MAT3X3 {
 | 
					    | F32MAT3X3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setMatrix(3, 3);
 | 
					        $$.setMatrix(3, 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32MAT3X4 {
 | 
					    | F32MAT3X4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setMatrix(3, 4);
 | 
					        $$.setMatrix(3, 4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32MAT4X2 {
 | 
					    | F32MAT4X2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setMatrix(4, 2);
 | 
					        $$.setMatrix(4, 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32MAT4X3 {
 | 
					    | F32MAT4X3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setMatrix(4, 3);
 | 
					        $$.setMatrix(4, 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F32MAT4X4 {
 | 
					    | F32MAT4X4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat32Check($1.loc, "float32_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.setMatrix(4, 4);
 | 
					        $$.setMatrix(4, 4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64MAT2 {
 | 
					    | F64MAT2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
        $$.setMatrix(2, 2);
 | 
					        $$.setMatrix(2, 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64MAT3 {
 | 
					    | F64MAT3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
        $$.setMatrix(3, 3);
 | 
					        $$.setMatrix(3, 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64MAT4 {
 | 
					    | F64MAT4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
        $$.setMatrix(4, 4);
 | 
					        $$.setMatrix(4, 4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64MAT2X2 {
 | 
					    | F64MAT2X2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
        $$.setMatrix(2, 2);
 | 
					        $$.setMatrix(2, 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64MAT2X3 {
 | 
					    | F64MAT2X3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
        $$.setMatrix(2, 3);
 | 
					        $$.setMatrix(2, 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64MAT2X4 {
 | 
					    | F64MAT2X4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
        $$.setMatrix(2, 4);
 | 
					        $$.setMatrix(2, 4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64MAT3X2 {
 | 
					    | F64MAT3X2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
        $$.setMatrix(3, 2);
 | 
					        $$.setMatrix(3, 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64MAT3X3 {
 | 
					    | F64MAT3X3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
        $$.setMatrix(3, 3);
 | 
					        $$.setMatrix(3, 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64MAT3X4 {
 | 
					    | F64MAT3X4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
        $$.setMatrix(3, 4);
 | 
					        $$.setMatrix(3, 4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64MAT4X2 {
 | 
					    | F64MAT4X2 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
        $$.setMatrix(4, 2);
 | 
					        $$.setMatrix(4, 2);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64MAT4X3 {
 | 
					    | F64MAT4X3 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
        $$.setMatrix(4, 3);
 | 
					        $$.setMatrix(4, 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | F64MAT4X4 {
 | 
					    | F64MAT4X4 {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.explicitFloat64Check($1.loc, "float64_t matrix", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtDouble;
 | 
					        $$.basicType = EbtDouble;
 | 
				
			||||||
        $$.setMatrix(4, 4);
 | 
					        $$.setMatrix(4, 4);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | ACCSTRUCTNV {
 | 
					    | ACCSTRUCTNV {
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					#ifdef NV_EXTENSIONS
 | 
				
			||||||
@ -3215,10 +3365,12 @@ type_specifier_nonarray
 | 
				
			|||||||
        $$.sampler.setSubpass(EbtUint, true);
 | 
					        $$.sampler.setSubpass(EbtUint, true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | FCOOPMATNV {
 | 
					    | FCOOPMATNV {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        parseContext.fcoopmatCheck($1.loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel());
 | 
					        parseContext.fcoopmatCheck($1.loc, "fcoopmatNV", parseContext.symbolTable.atBuiltInLevel());
 | 
				
			||||||
        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
					        $$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
 | 
				
			||||||
        $$.basicType = EbtFloat;
 | 
					        $$.basicType = EbtFloat;
 | 
				
			||||||
        $$.coopmat = true;
 | 
					        $$.coopmat = true;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    | struct_specifier {
 | 
					    | struct_specifier {
 | 
				
			||||||
        $$ = $1;
 | 
					        $$ = $1;
 | 
				
			||||||
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -35,6 +35,8 @@
 | 
				
			|||||||
// POSSIBILITY OF SUCH DAMAGE.
 | 
					// POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "localintermediate.h"
 | 
					#include "localintermediate.h"
 | 
				
			||||||
#include "../Include/InfoSink.h"
 | 
					#include "../Include/InfoSink.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -174,7 +176,7 @@ bool TOutputTraverser::visitBinary(TVisit /* visit */, TIntermBinary* node)
 | 
				
			|||||||
    case EOpIndexIndirect: out.debug << "indirect index"; break;
 | 
					    case EOpIndexIndirect: out.debug << "indirect index"; break;
 | 
				
			||||||
    case EOpIndexDirectStruct:
 | 
					    case EOpIndexDirectStruct:
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            bool reference = node->getLeft()->getType().getBasicType() == EbtReference;
 | 
					            bool reference = node->getLeft()->getType().isReference();
 | 
				
			||||||
            const TTypeList *members = reference ? node->getLeft()->getType().getReferentType()->getStruct() : node->getLeft()->getType().getStruct();
 | 
					            const TTypeList *members = reference ? node->getLeft()->getType().getReferentType()->getStruct() : node->getLeft()->getType().getStruct();
 | 
				
			||||||
            out.debug << (*members)[node->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst()].type->getFieldName();
 | 
					            out.debug << (*members)[node->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst()].type->getFieldName();
 | 
				
			||||||
            out.debug << ": direct index for structure";      break;
 | 
					            out.debug << ": direct index for structure";      break;
 | 
				
			||||||
@ -615,7 +617,6 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)
 | 
				
			|||||||
    case EOpSubgroupQuadSwapVertical:        out.debug << "subgroupQuadSwapVertical";        break;
 | 
					    case EOpSubgroupQuadSwapVertical:        out.debug << "subgroupQuadSwapVertical";        break;
 | 
				
			||||||
    case EOpSubgroupQuadSwapDiagonal:        out.debug << "subgroupQuadSwapDiagonal";        break;
 | 
					    case EOpSubgroupQuadSwapDiagonal:        out.debug << "subgroupQuadSwapDiagonal";        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case EOpSubgroupPartition:                          out.debug << "subgroupPartitionNV";                          break;
 | 
					    case EOpSubgroupPartition:                          out.debug << "subgroupPartitionNV";                          break;
 | 
				
			||||||
    case EOpSubgroupPartitionedAdd:                     out.debug << "subgroupPartitionedAddNV";                     break;
 | 
					    case EOpSubgroupPartitionedAdd:                     out.debug << "subgroupPartitionedAddNV";                     break;
 | 
				
			||||||
    case EOpSubgroupPartitionedMul:                     out.debug << "subgroupPartitionedMulNV";                     break;
 | 
					    case EOpSubgroupPartitionedMul:                     out.debug << "subgroupPartitionedMulNV";                     break;
 | 
				
			||||||
@ -638,7 +639,6 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)
 | 
				
			|||||||
    case EOpSubgroupPartitionedExclusiveAnd:            out.debug << "subgroupPartitionedExclusiveAndNV";            break;
 | 
					    case EOpSubgroupPartitionedExclusiveAnd:            out.debug << "subgroupPartitionedExclusiveAndNV";            break;
 | 
				
			||||||
    case EOpSubgroupPartitionedExclusiveOr:             out.debug << "subgroupPartitionedExclusiveOrNV";             break;
 | 
					    case EOpSubgroupPartitionedExclusiveOr:             out.debug << "subgroupPartitionedExclusiveOrNV";             break;
 | 
				
			||||||
    case EOpSubgroupPartitionedExclusiveXor:            out.debug << "subgroupPartitionedExclusiveXorNV";            break;
 | 
					    case EOpSubgroupPartitionedExclusiveXor:            out.debug << "subgroupPartitionedExclusiveXorNV";            break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case EOpClip:                   out.debug << "clip";                  break;
 | 
					    case EOpClip:                   out.debug << "clip";                  break;
 | 
				
			||||||
    case EOpIsFinite:               out.debug << "isfinite";              break;
 | 
					    case EOpIsFinite:               out.debug << "isfinite";              break;
 | 
				
			||||||
@ -648,7 +648,6 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    case EOpSparseTexelsResident:   out.debug << "sparseTexelsResident";  break;
 | 
					    case EOpSparseTexelsResident:   out.debug << "sparseTexelsResident";  break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    case EOpMinInvocations:             out.debug << "minInvocations";              break;
 | 
					    case EOpMinInvocations:             out.debug << "minInvocations";              break;
 | 
				
			||||||
    case EOpMaxInvocations:             out.debug << "maxInvocations";              break;
 | 
					    case EOpMaxInvocations:             out.debug << "maxInvocations";              break;
 | 
				
			||||||
    case EOpAddInvocations:             out.debug << "addInvocations";              break;
 | 
					    case EOpAddInvocations:             out.debug << "addInvocations";              break;
 | 
				
			||||||
@ -677,7 +676,6 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    case EOpCubeFaceIndex:          out.debug << "cubeFaceIndex";               break;
 | 
					    case EOpCubeFaceIndex:          out.debug << "cubeFaceIndex";               break;
 | 
				
			||||||
    case EOpCubeFaceCoord:          out.debug << "cubeFaceCoord";               break;
 | 
					    case EOpCubeFaceCoord:          out.debug << "cubeFaceCoord";               break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case EOpSubpassLoad:   out.debug << "subpassLoad";   break;
 | 
					    case EOpSubpassLoad:   out.debug << "subpassLoad";   break;
 | 
				
			||||||
    case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break;
 | 
					    case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break;
 | 
				
			||||||
@ -863,7 +861,6 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    case EOpReadInvocation:             out.debug << "readInvocation";        break;
 | 
					    case EOpReadInvocation:             out.debug << "readInvocation";        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    case EOpSwizzleInvocations:         out.debug << "swizzleInvocations";       break;
 | 
					    case EOpSwizzleInvocations:         out.debug << "swizzleInvocations";       break;
 | 
				
			||||||
    case EOpSwizzleInvocationsMasked:   out.debug << "swizzleInvocationsMasked"; break;
 | 
					    case EOpSwizzleInvocationsMasked:   out.debug << "swizzleInvocationsMasked"; break;
 | 
				
			||||||
    case EOpWriteInvocation:            out.debug << "writeInvocation";          break;
 | 
					    case EOpWriteInvocation:            out.debug << "writeInvocation";          break;
 | 
				
			||||||
@ -871,9 +868,7 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
 | 
				
			|||||||
    case EOpMin3:                       out.debug << "min3";                  break;
 | 
					    case EOpMin3:                       out.debug << "min3";                  break;
 | 
				
			||||||
    case EOpMax3:                       out.debug << "max3";                  break;
 | 
					    case EOpMax3:                       out.debug << "max3";                  break;
 | 
				
			||||||
    case EOpMid3:                       out.debug << "mid3";                  break;
 | 
					    case EOpMid3:                       out.debug << "mid3";                  break;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    case EOpTime:                       out.debug << "time";                  break;
 | 
					    case EOpTime:                       out.debug << "time";                  break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case EOpAtomicAdd:                  out.debug << "AtomicAdd";             break;
 | 
					    case EOpAtomicAdd:                  out.debug << "AtomicAdd";             break;
 | 
				
			||||||
    case EOpAtomicMin:                  out.debug << "AtomicMin";             break;
 | 
					    case EOpAtomicMin:                  out.debug << "AtomicMin";             break;
 | 
				
			||||||
@ -910,10 +905,8 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
 | 
				
			|||||||
    case EOpImageAtomicCompSwap:        out.debug << "imageAtomicCompSwap";   break;
 | 
					    case EOpImageAtomicCompSwap:        out.debug << "imageAtomicCompSwap";   break;
 | 
				
			||||||
    case EOpImageAtomicLoad:            out.debug << "imageAtomicLoad";       break;
 | 
					    case EOpImageAtomicLoad:            out.debug << "imageAtomicLoad";       break;
 | 
				
			||||||
    case EOpImageAtomicStore:           out.debug << "imageAtomicStore";      break;
 | 
					    case EOpImageAtomicStore:           out.debug << "imageAtomicStore";      break;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    case EOpImageLoadLod:               out.debug << "imageLoadLod";          break;
 | 
					    case EOpImageLoadLod:               out.debug << "imageLoadLod";          break;
 | 
				
			||||||
    case EOpImageStoreLod:              out.debug << "imageStoreLod";         break;
 | 
					    case EOpImageStoreLod:              out.debug << "imageStoreLod";         break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case EOpTextureQuerySize:           out.debug << "textureSize";           break;
 | 
					    case EOpTextureQuerySize:           out.debug << "textureSize";           break;
 | 
				
			||||||
    case EOpTextureQueryLod:            out.debug << "textureQueryLod";       break;
 | 
					    case EOpTextureQueryLod:            out.debug << "textureQueryLod";       break;
 | 
				
			||||||
@ -940,11 +933,9 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
 | 
				
			|||||||
    case EOpTextureOffsetClamp:         out.debug << "textureOffsetClamp";    break;
 | 
					    case EOpTextureOffsetClamp:         out.debug << "textureOffsetClamp";    break;
 | 
				
			||||||
    case EOpTextureGradClamp:           out.debug << "textureGradClamp";      break;
 | 
					    case EOpTextureGradClamp:           out.debug << "textureGradClamp";      break;
 | 
				
			||||||
    case EOpTextureGradOffsetClamp:     out.debug << "textureGradOffsetClamp";  break;
 | 
					    case EOpTextureGradOffsetClamp:     out.debug << "textureGradOffsetClamp";  break;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    case EOpTextureGatherLod:           out.debug << "textureGatherLod";        break;
 | 
					    case EOpTextureGatherLod:           out.debug << "textureGatherLod";        break;
 | 
				
			||||||
    case EOpTextureGatherLodOffset:     out.debug << "textureGatherLodOffset";  break;
 | 
					    case EOpTextureGatherLodOffset:     out.debug << "textureGatherLodOffset";  break;
 | 
				
			||||||
    case EOpTextureGatherLodOffsets:    out.debug << "textureGatherLodOffsets"; break;
 | 
					    case EOpTextureGatherLodOffsets:    out.debug << "textureGatherLodOffsets"; break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case EOpSparseTexture:                  out.debug << "sparseTexture";                   break;
 | 
					    case EOpSparseTexture:                  out.debug << "sparseTexture";                   break;
 | 
				
			||||||
    case EOpSparseTextureOffset:            out.debug << "sparseTextureOffset";             break;
 | 
					    case EOpSparseTextureOffset:            out.debug << "sparseTextureOffset";             break;
 | 
				
			||||||
@ -962,19 +953,15 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
 | 
				
			|||||||
    case EOpSparseTextureOffsetClamp:       out.debug << "sparseTextureOffsetClamp";        break;
 | 
					    case EOpSparseTextureOffsetClamp:       out.debug << "sparseTextureOffsetClamp";        break;
 | 
				
			||||||
    case EOpSparseTextureGradClamp:         out.debug << "sparseTextureGradClamp";          break;
 | 
					    case EOpSparseTextureGradClamp:         out.debug << "sparseTextureGradClamp";          break;
 | 
				
			||||||
    case EOpSparseTextureGradOffsetClamp:   out.debug << "sparseTextureGradOffsetClam";     break;
 | 
					    case EOpSparseTextureGradOffsetClamp:   out.debug << "sparseTextureGradOffsetClam";     break;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    case EOpSparseTextureGatherLod:         out.debug << "sparseTextureGatherLod";          break;
 | 
					    case EOpSparseTextureGatherLod:         out.debug << "sparseTextureGatherLod";          break;
 | 
				
			||||||
    case EOpSparseTextureGatherLodOffset:   out.debug << "sparseTextureGatherLodOffset";    break;
 | 
					    case EOpSparseTextureGatherLodOffset:   out.debug << "sparseTextureGatherLodOffset";    break;
 | 
				
			||||||
    case EOpSparseTextureGatherLodOffsets:  out.debug << "sparseTextureGatherLodOffsets";   break;
 | 
					    case EOpSparseTextureGatherLodOffsets:  out.debug << "sparseTextureGatherLodOffsets";   break;
 | 
				
			||||||
    case EOpSparseImageLoadLod:             out.debug << "sparseImageLoadLod";              break;
 | 
					    case EOpSparseImageLoadLod:             out.debug << "sparseImageLoadLod";              break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case EOpImageSampleFootprintNV:             out.debug << "imageSampleFootprintNV";          break;
 | 
					    case EOpImageSampleFootprintNV:             out.debug << "imageSampleFootprintNV";          break;
 | 
				
			||||||
    case EOpImageSampleFootprintClampNV:        out.debug << "imageSampleFootprintClampNV";     break;
 | 
					    case EOpImageSampleFootprintClampNV:        out.debug << "imageSampleFootprintClampNV";     break;
 | 
				
			||||||
    case EOpImageSampleFootprintLodNV:          out.debug << "imageSampleFootprintLodNV";       break;
 | 
					    case EOpImageSampleFootprintLodNV:          out.debug << "imageSampleFootprintLodNV";       break;
 | 
				
			||||||
    case EOpImageSampleFootprintGradNV:         out.debug << "imageSampleFootprintGradNV";      break;
 | 
					    case EOpImageSampleFootprintGradNV:         out.debug << "imageSampleFootprintGradNV";      break;
 | 
				
			||||||
    case EOpImageSampleFootprintGradClampNV:    out.debug << "mageSampleFootprintGradClampNV";  break;
 | 
					    case EOpImageSampleFootprintGradClampNV:    out.debug << "mageSampleFootprintGradClampNV";  break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    case EOpAddCarry:                   out.debug << "addCarry";              break;
 | 
					    case EOpAddCarry:                   out.debug << "addCarry";              break;
 | 
				
			||||||
    case EOpSubBorrow:                  out.debug << "subBorrow";             break;
 | 
					    case EOpSubBorrow:                  out.debug << "subBorrow";             break;
 | 
				
			||||||
    case EOpUMulExtended:               out.debug << "uMulExtended";          break;
 | 
					    case EOpUMulExtended:               out.debug << "uMulExtended";          break;
 | 
				
			||||||
@ -988,9 +975,7 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    case EOpInterpolateAtSample:   out.debug << "interpolateAtSample";    break;
 | 
					    case EOpInterpolateAtSample:   out.debug << "interpolateAtSample";    break;
 | 
				
			||||||
    case EOpInterpolateAtOffset:   out.debug << "interpolateAtOffset";    break;
 | 
					    case EOpInterpolateAtOffset:   out.debug << "interpolateAtOffset";    break;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    case EOpInterpolateAtVertex:   out.debug << "interpolateAtVertex";    break;
 | 
					    case EOpInterpolateAtVertex:   out.debug << "interpolateAtVertex";    break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case EOpSinCos:                     out.debug << "sincos";                break;
 | 
					    case EOpSinCos:                     out.debug << "sincos";                break;
 | 
				
			||||||
    case EOpGenMul:                     out.debug << "mul";                   break;
 | 
					    case EOpGenMul:                     out.debug << "mul";                   break;
 | 
				
			||||||
@ -1057,7 +1042,6 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
 | 
				
			|||||||
    case EOpSubgroupQuadSwapVertical:        out.debug << "subgroupQuadSwapVertical"; break;
 | 
					    case EOpSubgroupQuadSwapVertical:        out.debug << "subgroupQuadSwapVertical"; break;
 | 
				
			||||||
    case EOpSubgroupQuadSwapDiagonal:        out.debug << "subgroupQuadSwapDiagonal"; break;
 | 
					    case EOpSubgroupQuadSwapDiagonal:        out.debug << "subgroupQuadSwapDiagonal"; break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case EOpSubgroupPartition:                          out.debug << "subgroupPartitionNV";                          break;
 | 
					    case EOpSubgroupPartition:                          out.debug << "subgroupPartitionNV";                          break;
 | 
				
			||||||
    case EOpSubgroupPartitionedAdd:                     out.debug << "subgroupPartitionedAddNV";                     break;
 | 
					    case EOpSubgroupPartitionedAdd:                     out.debug << "subgroupPartitionedAddNV";                     break;
 | 
				
			||||||
    case EOpSubgroupPartitionedMul:                     out.debug << "subgroupPartitionedMulNV";                     break;
 | 
					    case EOpSubgroupPartitionedMul:                     out.debug << "subgroupPartitionedMulNV";                     break;
 | 
				
			||||||
@ -1080,19 +1064,16 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
 | 
				
			|||||||
    case EOpSubgroupPartitionedExclusiveAnd:            out.debug << "subgroupPartitionedExclusiveAndNV";            break;
 | 
					    case EOpSubgroupPartitionedExclusiveAnd:            out.debug << "subgroupPartitionedExclusiveAndNV";            break;
 | 
				
			||||||
    case EOpSubgroupPartitionedExclusiveOr:             out.debug << "subgroupPartitionedExclusiveOrNV";             break;
 | 
					    case EOpSubgroupPartitionedExclusiveOr:             out.debug << "subgroupPartitionedExclusiveOrNV";             break;
 | 
				
			||||||
    case EOpSubgroupPartitionedExclusiveXor:            out.debug << "subgroupPartitionedExclusiveXorNV";            break;
 | 
					    case EOpSubgroupPartitionedExclusiveXor:            out.debug << "subgroupPartitionedExclusiveXorNV";            break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case EOpSubpassLoad:   out.debug << "subpassLoad";   break;
 | 
					    case EOpSubpassLoad:   out.debug << "subpassLoad";   break;
 | 
				
			||||||
    case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break;
 | 
					    case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case EOpTraceNV:                          out.debug << "traceNV"; break;
 | 
					    case EOpTraceNV:                          out.debug << "traceNV"; break;
 | 
				
			||||||
    case EOpReportIntersectionNV:             out.debug << "reportIntersectionNV"; break;
 | 
					    case EOpReportIntersectionNV:             out.debug << "reportIntersectionNV"; break;
 | 
				
			||||||
    case EOpIgnoreIntersectionNV:             out.debug << "ignoreIntersectionNV"; break;
 | 
					    case EOpIgnoreIntersectionNV:             out.debug << "ignoreIntersectionNV"; break;
 | 
				
			||||||
    case EOpTerminateRayNV:                   out.debug << "terminateRayNV"; break;
 | 
					    case EOpTerminateRayNV:                   out.debug << "terminateRayNV"; break;
 | 
				
			||||||
    case EOpExecuteCallableNV:                out.debug << "executeCallableNV"; break;
 | 
					    case EOpExecuteCallableNV:                out.debug << "executeCallableNV"; break;
 | 
				
			||||||
    case EOpWritePackedPrimitiveIndices4x8NV: out.debug << "writePackedPrimitiveIndices4x8NV"; break;
 | 
					    case EOpWritePackedPrimitiveIndices4x8NV: out.debug << "writePackedPrimitiveIndices4x8NV"; break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case EOpCooperativeMatrixLoad:  out.debug << "Load cooperative matrix";  break;
 | 
					    case EOpCooperativeMatrixLoad:  out.debug << "Load cooperative matrix";  break;
 | 
				
			||||||
    case EOpCooperativeMatrixStore:  out.debug << "Store cooperative matrix";  break;
 | 
					    case EOpCooperativeMatrixStore:  out.debug << "Store cooperative matrix";  break;
 | 
				
			||||||
@ -1509,16 +1490,13 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree)
 | 
				
			|||||||
            infoSink.debug << "interlock ordering = " << TQualifier::getInterlockOrderingString(interlockOrdering) << "\n";
 | 
					            infoSink.debug << "interlock ordering = " << TQualifier::getInterlockOrderingString(interlockOrdering) << "\n";
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case EShLangMeshNV:
 | 
					    case EShLangMeshNV:
 | 
				
			||||||
        infoSink.debug << "max_vertices = " << vertices << "\n";
 | 
					        infoSink.debug << "max_vertices = " << vertices << "\n";
 | 
				
			||||||
        infoSink.debug << "max_primitives = " << primitives << "\n";
 | 
					        infoSink.debug << "max_primitives = " << primitives << "\n";
 | 
				
			||||||
        infoSink.debug << "output primitive = " << TQualifier::getGeometryString(outputPrimitive) << "\n";
 | 
					        infoSink.debug << "output primitive = " << TQualifier::getGeometryString(outputPrimitive) << "\n";
 | 
				
			||||||
        // Fall through
 | 
					        // Fall through
 | 
				
			||||||
 | 
					 | 
				
			||||||
    case EShLangTaskNV:
 | 
					    case EShLangTaskNV:
 | 
				
			||||||
        // Fall through
 | 
					        // Fall through
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    case EShLangCompute:
 | 
					    case EShLangCompute:
 | 
				
			||||||
        infoSink.debug << "local_size = (" << localSize[0] << ", " << localSize[1] << ", " << localSize[2] << ")\n";
 | 
					        infoSink.debug << "local_size = (" << localSize[0] << ", " << localSize[1] << ", " << localSize[2] << ")\n";
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@ -1547,3 +1525,5 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // end namespace glslang
 | 
					} // end namespace glslang
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // not GLSLANG_WEB
 | 
				
			||||||
@ -75,7 +75,7 @@ public:
 | 
				
			|||||||
            target = &inputList;
 | 
					            target = &inputList;
 | 
				
			||||||
        else if (base->getQualifier().storage == EvqVaryingOut)
 | 
					        else if (base->getQualifier().storage == EvqVaryingOut)
 | 
				
			||||||
            target = &outputList;
 | 
					            target = &outputList;
 | 
				
			||||||
        else if (base->getQualifier().isUniformOrBuffer() && !base->getQualifier().layoutPushConstant)
 | 
					        else if (base->getQualifier().isUniformOrBuffer() && !base->getQualifier().isPushConstant())
 | 
				
			||||||
            target = &uniformList;
 | 
					            target = &uniformList;
 | 
				
			||||||
        if (target) {
 | 
					        if (target) {
 | 
				
			||||||
            TVarEntryInfo ent = {base->getId(), base, ! traverseAll};
 | 
					            TVarEntryInfo ent = {base->getId(), base, ! traverseAll};
 | 
				
			||||||
@ -355,7 +355,7 @@ struct TSymbolValidater
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else if (base->getQualifier().isUniformOrBuffer() && ! base->getQualifier().layoutPushConstant) {
 | 
					        } else if (base->getQualifier().isUniformOrBuffer() && ! base->getQualifier().isPushConstant()) {
 | 
				
			||||||
            // validate uniform type;
 | 
					            // validate uniform type;
 | 
				
			||||||
            for (int i = 0; i < EShLangCount; i++) {
 | 
					            for (int i = 0; i < EShLangCount; i++) {
 | 
				
			||||||
                if (i != currentStage && outVarMaps[i] != nullptr) {
 | 
					                if (i != currentStage && outVarMaps[i] != nullptr) {
 | 
				
			||||||
 | 
				
			|||||||
@ -78,11 +78,15 @@ void TIntermediate::warn(TInfoSink& infoSink, const char* message)
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
void TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit)
 | 
					void TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    mergeCallGraphs(infoSink, unit);
 | 
					    mergeCallGraphs(infoSink, unit);
 | 
				
			||||||
    mergeModes(infoSink, unit);
 | 
					    mergeModes(infoSink, unit);
 | 
				
			||||||
    mergeTrees(infoSink, unit);
 | 
					    mergeTrees(infoSink, unit);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void TIntermediate::mergeCallGraphs(TInfoSink& infoSink, TIntermediate& unit)
 | 
					void TIntermediate::mergeCallGraphs(TInfoSink& infoSink, TIntermediate& unit)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (unit.getNumEntryPoints() > 0) {
 | 
					    if (unit.getNumEntryPoints() > 0) {
 | 
				
			||||||
@ -142,18 +146,13 @@ void TIntermediate::mergeModes(TInfoSink& infoSink, TIntermediate& unit)
 | 
				
			|||||||
    if (vertices == TQualifier::layoutNotSet)
 | 
					    if (vertices == TQualifier::layoutNotSet)
 | 
				
			||||||
        vertices = unit.vertices;
 | 
					        vertices = unit.vertices;
 | 
				
			||||||
    else if (vertices != unit.vertices) {
 | 
					    else if (vertices != unit.vertices) {
 | 
				
			||||||
        if (language == EShLangGeometry
 | 
					        if (language == EShLangGeometry || language == EShLangMeshNV)
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
            || language == EShLangMeshNV
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
            error(infoSink, "Contradictory layout max_vertices values");
 | 
					            error(infoSink, "Contradictory layout max_vertices values");
 | 
				
			||||||
        else if (language == EShLangTessControl)
 | 
					        else if (language == EShLangTessControl)
 | 
				
			||||||
            error(infoSink, "Contradictory layout vertices values");
 | 
					            error(infoSink, "Contradictory layout vertices values");
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            assert(0);
 | 
					            assert(0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    if (primitives == TQualifier::layoutNotSet)
 | 
					    if (primitives == TQualifier::layoutNotSet)
 | 
				
			||||||
        primitives = unit.primitives;
 | 
					        primitives = unit.primitives;
 | 
				
			||||||
    else if (primitives != unit.primitives) {
 | 
					    else if (primitives != unit.primitives) {
 | 
				
			||||||
@ -162,7 +161,6 @@ void TIntermediate::mergeModes(TInfoSink& infoSink, TIntermediate& unit)
 | 
				
			|||||||
        else
 | 
					        else
 | 
				
			||||||
            assert(0);
 | 
					            assert(0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (inputPrimitive == ElgNone)
 | 
					    if (inputPrimitive == ElgNone)
 | 
				
			||||||
        inputPrimitive = unit.inputPrimitive;
 | 
					        inputPrimitive = unit.inputPrimitive;
 | 
				
			||||||
@ -224,21 +222,16 @@ void TIntermediate::mergeModes(TInfoSink& infoSink, TIntermediate& unit)
 | 
				
			|||||||
        xfbBuffers[b].implicitStride = std::max(xfbBuffers[b].implicitStride, unit.xfbBuffers[b].implicitStride);
 | 
					        xfbBuffers[b].implicitStride = std::max(xfbBuffers[b].implicitStride, unit.xfbBuffers[b].implicitStride);
 | 
				
			||||||
        if (unit.xfbBuffers[b].contains64BitType)
 | 
					        if (unit.xfbBuffers[b].contains64BitType)
 | 
				
			||||||
            xfbBuffers[b].contains64BitType = true;
 | 
					            xfbBuffers[b].contains64BitType = true;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        if (unit.xfbBuffers[b].contains32BitType)
 | 
					        if (unit.xfbBuffers[b].contains32BitType)
 | 
				
			||||||
            xfbBuffers[b].contains32BitType = true;
 | 
					            xfbBuffers[b].contains32BitType = true;
 | 
				
			||||||
        if (unit.xfbBuffers[b].contains16BitType)
 | 
					        if (unit.xfbBuffers[b].contains16BitType)
 | 
				
			||||||
            xfbBuffers[b].contains16BitType = true;
 | 
					            xfbBuffers[b].contains16BitType = true;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        // TODO: 4.4 link: enhanced layouts: compare ranges
 | 
					        // TODO: 4.4 link: enhanced layouts: compare ranges
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    MERGE_TRUE(multiStream);
 | 
					    MERGE_TRUE(multiStream);
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    MERGE_TRUE(layoutOverrideCoverage);
 | 
					    MERGE_TRUE(layoutOverrideCoverage);
 | 
				
			||||||
    MERGE_TRUE(geoPassthroughEXT);
 | 
					    MERGE_TRUE(geoPassthroughEXT);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (unsigned int i = 0; i < unit.shiftBinding.size(); ++i) {
 | 
					    for (unsigned int i = 0; i < unit.shiftBinding.size(); ++i) {
 | 
				
			||||||
        if (unit.shiftBinding[i] > 0)
 | 
					        if (unit.shiftBinding[i] > 0)
 | 
				
			||||||
@ -287,13 +280,8 @@ void TIntermediate::mergeTrees(TInfoSink& infoSink, TIntermediate& unit)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Getting this far means we have two existing trees to merge...
 | 
					    // Getting this far means we have two existing trees to merge...
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    numShaderRecordNVBlocks += unit.numShaderRecordNVBlocks;
 | 
					    numShaderRecordNVBlocks += unit.numShaderRecordNVBlocks;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    numTaskNVBlocks += unit.numTaskNVBlocks;
 | 
					    numTaskNVBlocks += unit.numTaskNVBlocks;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Get the top-level globals of each unit
 | 
					    // Get the top-level globals of each unit
 | 
				
			||||||
    TIntermSequence& globals = treeRoot->getAsAggregate()->getSequence();
 | 
					    TIntermSequence& globals = treeRoot->getAsAggregate()->getSequence();
 | 
				
			||||||
@ -493,6 +481,7 @@ void TIntermediate::mergeImplicitArraySizes(TType& type, const TType& unitType)
 | 
				
			|||||||
    for (int i = 0; i < (int)type.getStruct()->size(); ++i)
 | 
					    for (int i = 0; i < (int)type.getStruct()->size(); ++i)
 | 
				
			||||||
        mergeImplicitArraySizes(*(*type.getStruct())[i].type, *(*unitType.getStruct())[i].type);
 | 
					        mergeImplicitArraySizes(*(*type.getStruct())[i].type, *(*unitType.getStruct())[i].type);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif // not GLSLANG_WEB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Compare two global objects from two compilation units and see if they match
 | 
					// Compare two global objects from two compilation units and see if they match
 | 
				
			||||||
@ -547,7 +536,7 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy
 | 
				
			|||||||
        symbol.getQualifier().flat      != unitSymbol.getQualifier().flat ||
 | 
					        symbol.getQualifier().flat      != unitSymbol.getQualifier().flat ||
 | 
				
			||||||
        symbol.getQualifier().sample    != unitSymbol.getQualifier().sample ||
 | 
					        symbol.getQualifier().sample    != unitSymbol.getQualifier().sample ||
 | 
				
			||||||
        symbol.getQualifier().patch     != unitSymbol.getQualifier().patch ||
 | 
					        symbol.getQualifier().patch     != unitSymbol.getQualifier().patch ||
 | 
				
			||||||
        symbol.getQualifier().nopersp   != unitSymbol.getQualifier().nopersp) {
 | 
					        symbol.getQualifier().isNonPerspective() != unitSymbol.getQualifier().isNonPerspective()) {
 | 
				
			||||||
        error(infoSink, "Interpolation and auxiliary storage qualifiers must match:");
 | 
					        error(infoSink, "Interpolation and auxiliary storage qualifiers must match:");
 | 
				
			||||||
        writeTypeComparison = true;
 | 
					        writeTypeComparison = true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -615,7 +604,7 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
 | 
				
			|||||||
            warn(infoSink, "Entry point not found");
 | 
					            warn(infoSink, "Entry point not found");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (numPushConstants > 1)
 | 
					    if (getNumPushConstants() > 1)
 | 
				
			||||||
        error(infoSink, "Only one push_constant block is allowed per stage");
 | 
					        error(infoSink, "Only one push_constant block is allowed per stage");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // recursion and missing body checking
 | 
					    // recursion and missing body checking
 | 
				
			||||||
@ -629,6 +618,7 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
 | 
				
			|||||||
    if (invocations == TQualifier::layoutNotSet)
 | 
					    if (invocations == TQualifier::layoutNotSet)
 | 
				
			||||||
        invocations = 1;
 | 
					        invocations = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    if (inIoAccessed("gl_ClipDistance") && inIoAccessed("gl_ClipVertex"))
 | 
					    if (inIoAccessed("gl_ClipDistance") && inIoAccessed("gl_ClipVertex"))
 | 
				
			||||||
        error(infoSink, "Can only use one of gl_ClipDistance or gl_ClipVertex (gl_ClipDistance is preferred)");
 | 
					        error(infoSink, "Can only use one of gl_ClipDistance or gl_ClipVertex (gl_ClipDistance is preferred)");
 | 
				
			||||||
    if (inIoAccessed("gl_CullDistance") && inIoAccessed("gl_ClipVertex"))
 | 
					    if (inIoAccessed("gl_CullDistance") && inIoAccessed("gl_ClipVertex"))
 | 
				
			||||||
@ -642,12 +632,10 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
 | 
				
			|||||||
    for (size_t b = 0; b < xfbBuffers.size(); ++b) {
 | 
					    for (size_t b = 0; b < xfbBuffers.size(); ++b) {
 | 
				
			||||||
        if (xfbBuffers[b].contains64BitType)
 | 
					        if (xfbBuffers[b].contains64BitType)
 | 
				
			||||||
            RoundToPow2(xfbBuffers[b].implicitStride, 8);
 | 
					            RoundToPow2(xfbBuffers[b].implicitStride, 8);
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        else if (xfbBuffers[b].contains32BitType)
 | 
					        else if (xfbBuffers[b].contains32BitType)
 | 
				
			||||||
            RoundToPow2(xfbBuffers[b].implicitStride, 4);
 | 
					            RoundToPow2(xfbBuffers[b].implicitStride, 4);
 | 
				
			||||||
        else if (xfbBuffers[b].contains16BitType)
 | 
					        else if (xfbBuffers[b].contains16BitType)
 | 
				
			||||||
            RoundToPow2(xfbBuffers[b].implicitStride, 2);
 | 
					            RoundToPow2(xfbBuffers[b].implicitStride, 2);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // "It is a compile-time or link-time error to have
 | 
					        // "It is a compile-time or link-time error to have
 | 
				
			||||||
        // any xfb_offset that overflows xfb_stride, whether stated on declarations before or after the xfb_stride, or
 | 
					        // any xfb_offset that overflows xfb_stride, whether stated on declarations before or after the xfb_stride, or
 | 
				
			||||||
@ -668,16 +656,11 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
 | 
				
			|||||||
            error(infoSink, "xfb_stride must be multiple of 8 for buffer holding a double or 64-bit integer:");
 | 
					            error(infoSink, "xfb_stride must be multiple of 8 for buffer holding a double or 64-bit integer:");
 | 
				
			||||||
            infoSink.info.prefix(EPrefixError);
 | 
					            infoSink.info.prefix(EPrefixError);
 | 
				
			||||||
            infoSink.info << "    xfb_buffer " << (unsigned int)b << ", xfb_stride " << xfbBuffers[b].stride << "\n";
 | 
					            infoSink.info << "    xfb_buffer " << (unsigned int)b << ", xfb_stride " << xfbBuffers[b].stride << "\n";
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        } else if (xfbBuffers[b].contains32BitType && ! IsMultipleOfPow2(xfbBuffers[b].stride, 4)) {
 | 
					        } else if (xfbBuffers[b].contains32BitType && ! IsMultipleOfPow2(xfbBuffers[b].stride, 4)) {
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
        } else if (! IsMultipleOfPow2(xfbBuffers[b].stride, 4)) {
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            error(infoSink, "xfb_stride must be multiple of 4:");
 | 
					            error(infoSink, "xfb_stride must be multiple of 4:");
 | 
				
			||||||
            infoSink.info.prefix(EPrefixError);
 | 
					            infoSink.info.prefix(EPrefixError);
 | 
				
			||||||
            infoSink.info << "    xfb_buffer " << (unsigned int)b << ", xfb_stride " << xfbBuffers[b].stride << "\n";
 | 
					            infoSink.info << "    xfb_buffer " << (unsigned int)b << ", xfb_stride " << xfbBuffers[b].stride << "\n";
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        // "If the buffer is capturing any
 | 
					        // "If the buffer is capturing any
 | 
				
			||||||
        // outputs with half-precision or 16-bit integer components, the stride must be a multiple of 2"
 | 
					        // outputs with half-precision or 16-bit integer components, the stride must be a multiple of 2"
 | 
				
			||||||
        else if (xfbBuffers[b].contains16BitType && ! IsMultipleOfPow2(xfbBuffers[b].stride, 2)) {
 | 
					        else if (xfbBuffers[b].contains16BitType && ! IsMultipleOfPow2(xfbBuffers[b].stride, 2)) {
 | 
				
			||||||
@ -686,7 +669,6 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
 | 
				
			|||||||
            infoSink.info << "    xfb_buffer " << (unsigned int)b << ", xfb_stride " << xfbBuffers[b].stride << "\n";
 | 
					            infoSink.info << "    xfb_buffer " << (unsigned int)b << ", xfb_stride " << xfbBuffers[b].stride << "\n";
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        // "The resulting stride (implicit or explicit), when divided by 4, must be less than or equal to the
 | 
					        // "The resulting stride (implicit or explicit), when divided by 4, must be less than or equal to the
 | 
				
			||||||
        // implementation-dependent constant gl_MaxTransformFeedbackInterleavedComponents."
 | 
					        // implementation-dependent constant gl_MaxTransformFeedbackInterleavedComponents."
 | 
				
			||||||
        if (xfbBuffers[b].stride > (unsigned int)(4 * resources.maxTransformFeedbackInterleavedComponents)) {
 | 
					        if (xfbBuffers[b].stride > (unsigned int)(4 * resources.maxTransformFeedbackInterleavedComponents)) {
 | 
				
			||||||
@ -730,8 +712,6 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
 | 
				
			|||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case EShLangCompute:
 | 
					    case EShLangCompute:
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    case EShLangRayGenNV:
 | 
					    case EShLangRayGenNV:
 | 
				
			||||||
    case EShLangIntersectNV:
 | 
					    case EShLangIntersectNV:
 | 
				
			||||||
    case EShLangAnyHitNV:
 | 
					    case EShLangAnyHitNV:
 | 
				
			||||||
@ -764,8 +744,6 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
 | 
				
			|||||||
        if (numTaskNVBlocks > 1)
 | 
					        if (numTaskNVBlocks > 1)
 | 
				
			||||||
            error(infoSink, "Only one taskNV interface block is allowed per shader");
 | 
					            error(infoSink, "Only one taskNV interface block is allowed per shader");
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        error(infoSink, "Unknown Stage.");
 | 
					        error(infoSink, "Unknown Stage.");
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
@ -787,6 +765,7 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
 | 
				
			|||||||
    } finalLinkTraverser;
 | 
					    } finalLinkTraverser;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    treeRoot->traverse(&finalLinkTraverser);
 | 
					    treeRoot->traverse(&finalLinkTraverser);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
@ -1187,14 +1166,10 @@ int TIntermediate::computeTypeLocationSize(const TType& type, EShLanguage stage)
 | 
				
			|||||||
        // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
 | 
					        // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
 | 
				
			||||||
        // TODO: are there valid cases of having an unsized array with a location?  If so, running this code too early.
 | 
					        // TODO: are there valid cases of having an unsized array with a location?  If so, running this code too early.
 | 
				
			||||||
        TType elementType(type, 0);
 | 
					        TType elementType(type, 0);
 | 
				
			||||||
        if (type.isSizedArray()
 | 
					        if (type.isSizedArray() && !type.getQualifier().isPerView())
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
            && !type.getQualifier().isPerView()
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
            return type.getOuterArraySize() * computeTypeLocationSize(elementType, stage);
 | 
					            return type.getOuterArraySize() * computeTypeLocationSize(elementType, stage);
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
            // unset perViewNV attributes for arrayed per-view outputs: "perviewNV vec4 v[MAX_VIEWS][3];"
 | 
					            // unset perViewNV attributes for arrayed per-view outputs: "perviewNV vec4 v[MAX_VIEWS][3];"
 | 
				
			||||||
            elementType.getQualifier().perViewNV = false;
 | 
					            elementType.getQualifier().perViewNV = false;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@ -1273,6 +1248,7 @@ int TIntermediate::computeTypeUniformLocationSize(const TType& type)
 | 
				
			|||||||
    return 1;
 | 
					    return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
// Accumulate xfb buffer ranges and check for collisions as the accumulation is done.
 | 
					// Accumulate xfb buffer ranges and check for collisions as the accumulation is done.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.
 | 
					// Returns < 0 if no collision, >= 0 if collision and the value returned is a colliding value.
 | 
				
			||||||
@ -1285,11 +1261,7 @@ int TIntermediate::addXfbBufferOffset(const TType& type)
 | 
				
			|||||||
    TXfbBuffer& buffer = xfbBuffers[qualifier.layoutXfbBuffer];
 | 
					    TXfbBuffer& buffer = xfbBuffers[qualifier.layoutXfbBuffer];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // compute the range
 | 
					    // compute the range
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    unsigned int size = computeTypeXfbSize(type, buffer.contains64BitType, buffer.contains32BitType, buffer.contains16BitType);
 | 
					    unsigned int size = computeTypeXfbSize(type, buffer.contains64BitType, buffer.contains32BitType, buffer.contains16BitType);
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    unsigned int size = computeTypeXfbSize(type, buffer.contains64BitType);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    buffer.implicitStride = std::max(buffer.implicitStride, qualifier.layoutXfbOffset + size);
 | 
					    buffer.implicitStride = std::max(buffer.implicitStride, qualifier.layoutXfbOffset + size);
 | 
				
			||||||
    TRange range(qualifier.layoutXfbOffset, qualifier.layoutXfbOffset + size - 1);
 | 
					    TRange range(qualifier.layoutXfbOffset, qualifier.layoutXfbOffset + size - 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1309,15 +1281,10 @@ int TIntermediate::addXfbBufferOffset(const TType& type)
 | 
				
			|||||||
// Recursively figure out how many bytes of xfb buffer are used by the given type.
 | 
					// Recursively figure out how many bytes of xfb buffer are used by the given type.
 | 
				
			||||||
// Return the size of type, in bytes.
 | 
					// Return the size of type, in bytes.
 | 
				
			||||||
// Sets contains64BitType to true if the type contains a 64-bit data type.
 | 
					// Sets contains64BitType to true if the type contains a 64-bit data type.
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
// Sets contains32BitType to true if the type contains a 32-bit data type.
 | 
					// Sets contains32BitType to true if the type contains a 32-bit data type.
 | 
				
			||||||
// Sets contains16BitType to true if the type contains a 16-bit data type.
 | 
					// Sets contains16BitType to true if the type contains a 16-bit data type.
 | 
				
			||||||
// N.B. Caller must set contains64BitType, contains32BitType, and contains16BitType to false before calling.
 | 
					// N.B. Caller must set contains64BitType, contains32BitType, and contains16BitType to false before calling.
 | 
				
			||||||
unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains64BitType, bool& contains32BitType, bool& contains16BitType) const
 | 
					unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains64BitType, bool& contains32BitType, bool& contains16BitType) const
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
// N.B. Caller must set contains64BitType to false before calling.
 | 
					 | 
				
			||||||
unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains64BitType) const
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // "...if applied to an aggregate containing a double or 64-bit integer, the offset must also be a multiple of 8,
 | 
					    // "...if applied to an aggregate containing a double or 64-bit integer, the offset must also be a multiple of 8,
 | 
				
			||||||
    // and the space taken in the buffer will be a multiple of 8.
 | 
					    // and the space taken in the buffer will be a multiple of 8.
 | 
				
			||||||
@ -1330,44 +1297,32 @@ unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains
 | 
				
			|||||||
        // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
 | 
					        // TODO: perf: this can be flattened by using getCumulativeArraySize(), and a deref that discards all arrayness
 | 
				
			||||||
        assert(type.isSizedArray());
 | 
					        assert(type.isSizedArray());
 | 
				
			||||||
        TType elementType(type, 0);
 | 
					        TType elementType(type, 0);
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        return type.getOuterArraySize() * computeTypeXfbSize(elementType, contains64BitType, contains16BitType, contains16BitType);
 | 
					        return type.getOuterArraySize() * computeTypeXfbSize(elementType, contains64BitType, contains16BitType, contains16BitType);
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
        return type.getOuterArraySize() * computeTypeXfbSize(elementType, contains64BitType);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (type.isStruct()) {
 | 
					    if (type.isStruct()) {
 | 
				
			||||||
        unsigned int size = 0;
 | 
					        unsigned int size = 0;
 | 
				
			||||||
        bool structContains64BitType = false;
 | 
					        bool structContains64BitType = false;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        bool structContains32BitType = false;
 | 
					        bool structContains32BitType = false;
 | 
				
			||||||
        bool structContains16BitType = false;
 | 
					        bool structContains16BitType = false;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        for (int member = 0; member < (int)type.getStruct()->size(); ++member) {
 | 
					        for (int member = 0; member < (int)type.getStruct()->size(); ++member) {
 | 
				
			||||||
            TType memberType(type, member);
 | 
					            TType memberType(type, member);
 | 
				
			||||||
            // "... if applied to
 | 
					            // "... if applied to
 | 
				
			||||||
            // an aggregate containing a double or 64-bit integer, the offset must also be a multiple of 8,
 | 
					            // an aggregate containing a double or 64-bit integer, the offset must also be a multiple of 8,
 | 
				
			||||||
            // and the space taken in the buffer will be a multiple of 8."
 | 
					            // and the space taken in the buffer will be a multiple of 8."
 | 
				
			||||||
            bool memberContains64BitType = false;
 | 
					            bool memberContains64BitType = false;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
            bool memberContains32BitType = false;
 | 
					            bool memberContains32BitType = false;
 | 
				
			||||||
            bool memberContains16BitType = false;
 | 
					            bool memberContains16BitType = false;
 | 
				
			||||||
            int memberSize = computeTypeXfbSize(memberType, memberContains64BitType, memberContains32BitType, memberContains16BitType);
 | 
					            int memberSize = computeTypeXfbSize(memberType, memberContains64BitType, memberContains32BitType, memberContains16BitType);
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
            int memberSize = computeTypeXfbSize(memberType, memberContains64BitType);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            if (memberContains64BitType) {
 | 
					            if (memberContains64BitType) {
 | 
				
			||||||
                structContains64BitType = true;
 | 
					                structContains64BitType = true;
 | 
				
			||||||
                RoundToPow2(size, 8);
 | 
					                RoundToPow2(size, 8);
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
            } else if (memberContains32BitType) {
 | 
					            } else if (memberContains32BitType) {
 | 
				
			||||||
                structContains32BitType = true;
 | 
					                structContains32BitType = true;
 | 
				
			||||||
                RoundToPow2(size, 4);
 | 
					                RoundToPow2(size, 4);
 | 
				
			||||||
            } else if (memberContains16BitType) {
 | 
					            } else if (memberContains16BitType) {
 | 
				
			||||||
                structContains16BitType = true;
 | 
					                structContains16BitType = true;
 | 
				
			||||||
                RoundToPow2(size, 2);
 | 
					                RoundToPow2(size, 2);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            size += memberSize;
 | 
					            size += memberSize;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -1375,14 +1330,12 @@ unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains
 | 
				
			|||||||
        if (structContains64BitType) {
 | 
					        if (structContains64BitType) {
 | 
				
			||||||
            contains64BitType = true;
 | 
					            contains64BitType = true;
 | 
				
			||||||
            RoundToPow2(size, 8);
 | 
					            RoundToPow2(size, 8);
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        } else if (structContains32BitType) {
 | 
					        } else if (structContains32BitType) {
 | 
				
			||||||
            contains32BitType = true;
 | 
					            contains32BitType = true;
 | 
				
			||||||
            RoundToPow2(size, 4);
 | 
					            RoundToPow2(size, 4);
 | 
				
			||||||
        } else if (structContains16BitType) {
 | 
					        } else if (structContains16BitType) {
 | 
				
			||||||
            contains16BitType = true;
 | 
					            contains16BitType = true;
 | 
				
			||||||
            RoundToPow2(size, 2);
 | 
					            RoundToPow2(size, 2);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return size;
 | 
					        return size;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -1402,7 +1355,6 @@ unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains
 | 
				
			|||||||
    if (type.getBasicType() == EbtDouble || type.getBasicType() == EbtInt64 || type.getBasicType() == EbtUint64) {
 | 
					    if (type.getBasicType() == EbtDouble || type.getBasicType() == EbtInt64 || type.getBasicType() == EbtUint64) {
 | 
				
			||||||
        contains64BitType = true;
 | 
					        contains64BitType = true;
 | 
				
			||||||
        return 8 * numComponents;
 | 
					        return 8 * numComponents;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    } else if (type.getBasicType() == EbtFloat16 || type.getBasicType() == EbtInt16 || type.getBasicType() == EbtUint16) {
 | 
					    } else if (type.getBasicType() == EbtFloat16 || type.getBasicType() == EbtInt16 || type.getBasicType() == EbtUint16) {
 | 
				
			||||||
        contains16BitType = true;
 | 
					        contains16BitType = true;
 | 
				
			||||||
        return 2 * numComponents;
 | 
					        return 2 * numComponents;
 | 
				
			||||||
@ -1412,11 +1364,8 @@ unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains
 | 
				
			|||||||
        contains32BitType = true;
 | 
					        contains32BitType = true;
 | 
				
			||||||
        return 4 * numComponents;
 | 
					        return 4 * numComponents;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    } else
 | 
					 | 
				
			||||||
        return 4 * numComponents;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#endif // not GLSLANG_WEB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const int baseAlignmentVec4Std140 = 16;
 | 
					const int baseAlignmentVec4Std140 = 16;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1741,7 +1690,7 @@ int TIntermediate::getBlockSize(const TType& blockType)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
int TIntermediate::computeBufferReferenceTypeSize(const TType& type)
 | 
					int TIntermediate::computeBufferReferenceTypeSize(const TType& type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    assert(type.getBasicType() == EbtReference);
 | 
					    assert(type.isReference());
 | 
				
			||||||
    int size = getBlockSize(*type.getReferentType());
 | 
					    int size = getBlockSize(*type.getReferentType());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int align = type.getBufferReferenceAlignment();
 | 
					    int align = type.getBufferReferenceAlignment();
 | 
				
			||||||
 | 
				
			|||||||
@ -149,20 +149,14 @@ struct TOffsetRange {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Things that need to be tracked per xfb buffer.
 | 
					// Things that need to be tracked per xfb buffer.
 | 
				
			||||||
struct TXfbBuffer {
 | 
					struct TXfbBuffer {
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    TXfbBuffer() : stride(TQualifier::layoutXfbStrideEnd), implicitStride(0), contains64BitType(false),
 | 
					    TXfbBuffer() : stride(TQualifier::layoutXfbStrideEnd), implicitStride(0), contains64BitType(false),
 | 
				
			||||||
                   contains32BitType(false), contains16BitType(false) { }
 | 
					                   contains32BitType(false), contains16BitType(false) { }
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    TXfbBuffer() : stride(TQualifier::layoutXfbStrideEnd), implicitStride(0), contains64BitType(false) { }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    std::vector<TRange> ranges;  // byte offsets that have already been assigned
 | 
					    std::vector<TRange> ranges;  // byte offsets that have already been assigned
 | 
				
			||||||
    unsigned int stride;
 | 
					    unsigned int stride;
 | 
				
			||||||
    unsigned int implicitStride;
 | 
					    unsigned int implicitStride;
 | 
				
			||||||
    bool contains64BitType;
 | 
					    bool contains64BitType;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    bool contains32BitType;
 | 
					    bool contains32BitType;
 | 
				
			||||||
    bool contains16BitType;
 | 
					    bool contains16BitType;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Track a set of strings describing how the module was processed.
 | 
					// Track a set of strings describing how the module was processed.
 | 
				
			||||||
@ -217,7 +211,6 @@ class TSymbolTable;
 | 
				
			|||||||
class TSymbol;
 | 
					class TSymbol;
 | 
				
			||||||
class TVariable;
 | 
					class TVariable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Texture and Sampler transformation mode.
 | 
					// Texture and Sampler transformation mode.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
@ -226,7 +219,6 @@ enum ComputeDerivativeMode {
 | 
				
			|||||||
    LayoutDerivativeGroupQuads,   // derivative_group_quadsNV
 | 
					    LayoutDerivativeGroupQuads,   // derivative_group_quadsNV
 | 
				
			||||||
    LayoutDerivativeGroupLinear,  // derivative_group_linearNV
 | 
					    LayoutDerivativeGroupLinear,  // derivative_group_linearNV
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Set of helper functions to help parse and build the tree.
 | 
					// Set of helper functions to help parse and build the tree.
 | 
				
			||||||
@ -248,7 +240,7 @@ public:
 | 
				
			|||||||
        postDepthCoverage(false), depthLayout(EldNone), depthReplacing(false),
 | 
					        postDepthCoverage(false), depthLayout(EldNone), depthReplacing(false),
 | 
				
			||||||
        hlslFunctionality1(false),
 | 
					        hlslFunctionality1(false),
 | 
				
			||||||
        blendEquations(0), xfbMode(false), multiStream(false),
 | 
					        blendEquations(0), xfbMode(false), multiStream(false),
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        layoutOverrideCoverage(false),
 | 
					        layoutOverrideCoverage(false),
 | 
				
			||||||
        geoPassthroughEXT(false),
 | 
					        geoPassthroughEXT(false),
 | 
				
			||||||
        numShaderRecordNVBlocks(0),
 | 
					        numShaderRecordNVBlocks(0),
 | 
				
			||||||
@ -286,7 +278,11 @@ public:
 | 
				
			|||||||
    void setLimits(const TBuiltInResource& r) { resources = r; }
 | 
					    void setLimits(const TBuiltInResource& r) { resources = r; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool postProcess(TIntermNode*, EShLanguage);
 | 
					    bool postProcess(TIntermNode*, EShLanguage);
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					    void output(TInfoSink&, bool tree) { }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
    void output(TInfoSink&, bool tree);
 | 
					    void output(TInfoSink&, bool tree);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    void removeTree();
 | 
					    void removeTree();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef ENABLE_HLSL
 | 
					#ifdef ENABLE_HLSL
 | 
				
			||||||
@ -480,7 +476,12 @@ public:
 | 
				
			|||||||
    int getNumEntryPoints() const { return numEntryPoints; }
 | 
					    int getNumEntryPoints() const { return numEntryPoints; }
 | 
				
			||||||
    int getNumErrors() const { return numErrors; }
 | 
					    int getNumErrors() const { return numErrors; }
 | 
				
			||||||
    void addPushConstantCount() { ++numPushConstants; }
 | 
					    void addPushConstantCount() { ++numPushConstants; }
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					    int getNumPushConstants() const { return 0; }
 | 
				
			||||||
 | 
					    void addShaderRecordNVCount() { }
 | 
				
			||||||
 | 
					    void addTaskNVCount() { }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    int getNumPushConstants() const { return numPushConstants; }
 | 
				
			||||||
    void addShaderRecordNVCount() { ++numShaderRecordNVBlocks; }
 | 
					    void addShaderRecordNVCount() { ++numShaderRecordNVBlocks; }
 | 
				
			||||||
    void addTaskNVCount() { ++numTaskNVBlocks; }
 | 
					    void addTaskNVCount() { ++numTaskNVBlocks; }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@ -702,6 +703,7 @@ public:
 | 
				
			|||||||
    static int computeTypeLocationSize(const TType&, EShLanguage);
 | 
					    static int computeTypeLocationSize(const TType&, EShLanguage);
 | 
				
			||||||
    static int computeTypeUniformLocationSize(const TType&);
 | 
					    static int computeTypeUniformLocationSize(const TType&);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    bool setXfbBufferStride(int buffer, unsigned stride)
 | 
					    bool setXfbBufferStride(int buffer, unsigned stride)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (xfbBuffers[buffer].stride != TQualifier::layoutXfbStrideEnd)
 | 
					        if (xfbBuffers[buffer].stride != TQualifier::layoutXfbStrideEnd)
 | 
				
			||||||
@ -711,9 +713,7 @@ public:
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    unsigned getXfbStride(int buffer) const { return xfbBuffers[buffer].stride; }
 | 
					    unsigned getXfbStride(int buffer) const { return xfbBuffers[buffer].stride; }
 | 
				
			||||||
    int addXfbBufferOffset(const TType&);
 | 
					    int addXfbBufferOffset(const TType&);
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    unsigned int computeTypeXfbSize(const TType&, bool& contains64BitType, bool& contains32BitType, bool& contains16BitType) const;
 | 
					    unsigned int computeTypeXfbSize(const TType&, bool& contains64BitType, bool& contains32BitType, bool& contains16BitType) const;
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    unsigned int computeTypeXfbSize(const TType&, bool& contains64BitType) const;
 | 
					    unsigned int computeTypeXfbSize(const TType&, bool& contains64BitType) const;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    static int getBaseAlignmentScalar(const TType&, int& size);
 | 
					    static int getBaseAlignmentScalar(const TType&, int& size);
 | 
				
			||||||
@ -727,7 +727,7 @@ public:
 | 
				
			|||||||
    static int computeBufferReferenceTypeSize(const TType&);
 | 
					    static int computeBufferReferenceTypeSize(const TType&);
 | 
				
			||||||
    bool promote(TIntermOperator*);
 | 
					    bool promote(TIntermOperator*);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    void setLayoutOverrideCoverage() { layoutOverrideCoverage = true; }
 | 
					    void setLayoutOverrideCoverage() { layoutOverrideCoverage = true; }
 | 
				
			||||||
    bool getLayoutOverrideCoverage() const { return layoutOverrideCoverage; }
 | 
					    bool getLayoutOverrideCoverage() const { return layoutOverrideCoverage; }
 | 
				
			||||||
    void setGeoPassthroughEXT() { geoPassthroughEXT = true; }
 | 
					    void setGeoPassthroughEXT() { geoPassthroughEXT = true; }
 | 
				
			||||||
@ -796,25 +796,27 @@ public:
 | 
				
			|||||||
    const char* const implicitCounterName;
 | 
					    const char* const implicitCounterName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Certain explicit conversions are allowed conditionally
 | 
					    // Certain explicit conversions are allowed conditionally
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					    bool getArithemeticInt8Enabled() const { return false; }
 | 
				
			||||||
 | 
					    bool getArithemeticInt16Enabled() const { return false; }
 | 
				
			||||||
 | 
					    bool getArithemeticFloat16Enabled() const { return false; }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
    bool getArithemeticInt8Enabled() const {
 | 
					    bool getArithemeticInt8Enabled() const {
 | 
				
			||||||
        return extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
 | 
					        return extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
 | 
				
			||||||
               extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int8);
 | 
					               extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int8);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    bool getArithemeticInt16Enabled() const {
 | 
					    bool getArithemeticInt16Enabled() const {
 | 
				
			||||||
        return extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
 | 
					        return extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
               extensionRequested(E_GL_AMD_gpu_shader_int16) ||
 | 
					               extensionRequested(E_GL_AMD_gpu_shader_int16) ||
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
               extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int16);
 | 
					               extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_int16);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool getArithemeticFloat16Enabled() const {
 | 
					    bool getArithemeticFloat16Enabled() const {
 | 
				
			||||||
        return extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
 | 
					        return extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types) ||
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
               extensionRequested(E_GL_AMD_gpu_shader_half_float) ||
 | 
					               extensionRequested(E_GL_AMD_gpu_shader_half_float) ||
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
               extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float16);
 | 
					               extensionRequested(E_GL_EXT_shader_explicit_arithmetic_types_float16);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
    TIntermSymbol* addSymbol(int Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&);
 | 
					    TIntermSymbol* addSymbol(int Id, const TString&, const TType&, const TConstUnionArray&, TIntermTyped* subtree, const TSourceLoc&);
 | 
				
			||||||
@ -847,7 +849,15 @@ protected:
 | 
				
			|||||||
    bool isConversionAllowed(TOperator op, TIntermTyped* node) const;
 | 
					    bool isConversionAllowed(TOperator op, TIntermTyped* node) const;
 | 
				
			||||||
    TIntermTyped* createConversion(TBasicType convertTo, TIntermTyped* node) const;
 | 
					    TIntermTyped* createConversion(TBasicType convertTo, TIntermTyped* node) const;
 | 
				
			||||||
    std::tuple<TBasicType, TBasicType> getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const;
 | 
					    std::tuple<TBasicType, TBasicType> getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const;
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					    bool extensionRequested(const char *extension) const { return false; }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    // I think this function should go away.
 | 
				
			||||||
 | 
					    // This data structure is just a log to pass on to back ends.
 | 
				
			||||||
 | 
					    // Versioning and extensions are handled in Version.cpp, with a rich
 | 
				
			||||||
 | 
					    // set of functions for querying stages, versions, extension enable/disabled, etc.
 | 
				
			||||||
    bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();}
 | 
					    bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
    static const char* getResourceName(TResourceType);
 | 
					    static const char* getResourceName(TResourceType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const EShLanguage language;  // stage, known at construction time
 | 
					    const EShLanguage language;  // stage, known at construction time
 | 
				
			||||||
@ -891,7 +901,7 @@ protected:
 | 
				
			|||||||
    std::vector<TXfbBuffer> xfbBuffers;     // all the data we need to track per xfb buffer
 | 
					    std::vector<TXfbBuffer> xfbBuffers;     // all the data we need to track per xfb buffer
 | 
				
			||||||
    bool multiStream;
 | 
					    bool multiStream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    bool layoutOverrideCoverage;
 | 
					    bool layoutOverrideCoverage;
 | 
				
			||||||
    bool geoPassthroughEXT;
 | 
					    bool geoPassthroughEXT;
 | 
				
			||||||
    int numShaderRecordNVBlocks;
 | 
					    int numShaderRecordNVBlocks;
 | 
				
			||||||
 | 
				
			|||||||
@ -61,22 +61,55 @@ public:
 | 
				
			|||||||
          spvVersion(spvVersion), forwardCompatible(forwardCompatible),
 | 
					          spvVersion(spvVersion), forwardCompatible(forwardCompatible),
 | 
				
			||||||
          intermediate(interm), messages(messages), numErrors(0), currentScanner(0) { }
 | 
					          intermediate(interm), messages(messages), numErrors(0), currentScanner(0) { }
 | 
				
			||||||
    virtual ~TParseVersions() { }
 | 
					    virtual ~TParseVersions() { }
 | 
				
			||||||
    virtual void initializeExtensionBehavior();
 | 
					 | 
				
			||||||
    virtual void requireProfile(const TSourceLoc&, int queryProfiles, const char* featureDesc);
 | 
					    virtual void requireProfile(const TSourceLoc&, int queryProfiles, const char* featureDesc);
 | 
				
			||||||
    virtual void profileRequires(const TSourceLoc&, int queryProfiles, int minVersion, int numExtensions, const char* const extensions[], const char* featureDesc);
 | 
					    virtual void profileRequires(const TSourceLoc&, int queryProfiles, int minVersion, int numExtensions, const char* const extensions[], const char* featureDesc);
 | 
				
			||||||
    virtual void profileRequires(const TSourceLoc&, int queryProfiles, int minVersion, const char* const extension, const char* featureDesc);
 | 
					    virtual void profileRequires(const TSourceLoc&, int queryProfiles, int minVersion, const char* const extension, const char* featureDesc);
 | 
				
			||||||
    virtual void requireStage(const TSourceLoc&, EShLanguageMask, const char* featureDesc);
 | 
					    virtual void requireStage(const TSourceLoc&, EShLanguageMask, const char* featureDesc);
 | 
				
			||||||
    virtual void requireStage(const TSourceLoc&, EShLanguage, const char* featureDesc);
 | 
					    virtual void requireStage(const TSourceLoc&, EShLanguage, const char* featureDesc);
 | 
				
			||||||
 | 
					#ifdef GLSLANG_WEB
 | 
				
			||||||
 | 
					    virtual void initializeExtensionBehavior() { }
 | 
				
			||||||
 | 
					    virtual void checkDeprecated(const TSourceLoc&, int queryProfiles, int depVersion, const char* featureDesc) { }
 | 
				
			||||||
 | 
					    virtual void requireNotRemoved(const TSourceLoc&, int queryProfiles, int removedVersion, const char* featureDesc) { }
 | 
				
			||||||
 | 
					    virtual void requireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[],
 | 
				
			||||||
 | 
					        const char* featureDesc) { }
 | 
				
			||||||
 | 
					    virtual void ppRequireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[],
 | 
				
			||||||
 | 
					        const char* featureDesc) { }
 | 
				
			||||||
 | 
					    virtual TExtensionBehavior getExtensionBehavior(const char*) { return EBhMissing; }
 | 
				
			||||||
 | 
					    virtual bool extensionTurnedOn(const char* const extension) { return false; }
 | 
				
			||||||
 | 
					    virtual bool extensionsTurnedOn(int numExtensions, const char* const extensions[]) { return false; }
 | 
				
			||||||
 | 
					    virtual void updateExtensionBehavior(int line, const char* const extension, const char* behavior) { }
 | 
				
			||||||
 | 
					    virtual void updateExtensionBehavior(const char* const extension, TExtensionBehavior) { }
 | 
				
			||||||
 | 
					    virtual void checkExtensionStage(const TSourceLoc&, const char* const extension) { }
 | 
				
			||||||
 | 
					    virtual void fullIntegerCheck(const TSourceLoc&, const char* op) { }
 | 
				
			||||||
 | 
					    virtual void doubleCheck(const TSourceLoc&, const char* op) { }
 | 
				
			||||||
 | 
					    virtual bool float16Arithmetic() { return false; }
 | 
				
			||||||
 | 
					    virtual void requireFloat16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc) { }
 | 
				
			||||||
 | 
					    virtual bool int16Arithmetic() { return false; }
 | 
				
			||||||
 | 
					    virtual void requireInt16Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc) { }
 | 
				
			||||||
 | 
					    virtual bool int8Arithmetic() { return false; }
 | 
				
			||||||
 | 
					    virtual void requireInt8Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc) { }
 | 
				
			||||||
 | 
					    virtual void int64Check(const TSourceLoc&, const char* op, bool builtIn = false) { }
 | 
				
			||||||
 | 
					    virtual void explicitFloat32Check(const TSourceLoc&, const char* op, bool builtIn = false) { }
 | 
				
			||||||
 | 
					    virtual void explicitFloat64Check(const TSourceLoc&, const char* op, bool builtIn = false) { }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    virtual void initializeExtensionBehavior();
 | 
				
			||||||
    virtual void checkDeprecated(const TSourceLoc&, int queryProfiles, int depVersion, const char* featureDesc);
 | 
					    virtual void checkDeprecated(const TSourceLoc&, int queryProfiles, int depVersion, const char* featureDesc);
 | 
				
			||||||
    virtual void requireNotRemoved(const TSourceLoc&, int queryProfiles, int removedVersion, const char* featureDesc);
 | 
					    virtual void requireNotRemoved(const TSourceLoc&, int queryProfiles, int removedVersion, const char* featureDesc);
 | 
				
			||||||
    virtual void unimplemented(const TSourceLoc&, const char* featureDesc);
 | 
					    virtual void requireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[],
 | 
				
			||||||
    virtual void requireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[], const char* featureDesc);
 | 
					        const char* featureDesc);
 | 
				
			||||||
    virtual void ppRequireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[], const char* featureDesc);
 | 
					    virtual void ppRequireExtensions(const TSourceLoc&, int numExtensions, const char* const extensions[],
 | 
				
			||||||
 | 
					        const char* featureDesc);
 | 
				
			||||||
    virtual TExtensionBehavior getExtensionBehavior(const char*);
 | 
					    virtual TExtensionBehavior getExtensionBehavior(const char*);
 | 
				
			||||||
    virtual bool extensionTurnedOn(const char* const extension);
 | 
					    virtual bool extensionTurnedOn(const char* const extension);
 | 
				
			||||||
    virtual bool extensionsTurnedOn(int numExtensions, const char* const extensions[]);
 | 
					    virtual bool extensionsTurnedOn(int numExtensions, const char* const extensions[]);
 | 
				
			||||||
    virtual void updateExtensionBehavior(int line, const char* const extension, const char* behavior);
 | 
					    virtual void updateExtensionBehavior(int line, const char* const extension, const char* behavior);
 | 
				
			||||||
 | 
					    virtual void updateExtensionBehavior(const char* const extension, TExtensionBehavior);
 | 
				
			||||||
 | 
					    virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[],
 | 
				
			||||||
 | 
					        const char* featureDesc);
 | 
				
			||||||
 | 
					    virtual void checkExtensionStage(const TSourceLoc&, const char* const extension);
 | 
				
			||||||
    virtual void fullIntegerCheck(const TSourceLoc&, const char* op);
 | 
					    virtual void fullIntegerCheck(const TSourceLoc&, const char* op);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    virtual void unimplemented(const TSourceLoc&, const char* featureDesc);
 | 
				
			||||||
    virtual void doubleCheck(const TSourceLoc&, const char* op);
 | 
					    virtual void doubleCheck(const TSourceLoc&, const char* op);
 | 
				
			||||||
    virtual void float16Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
					    virtual void float16Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
				
			||||||
    virtual void float16ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
					    virtual void float16ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
				
			||||||
@ -88,23 +121,19 @@ public:
 | 
				
			|||||||
    virtual void int8ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
					    virtual void int8ScalarVectorCheck(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
				
			||||||
    virtual bool int8Arithmetic();
 | 
					    virtual bool int8Arithmetic();
 | 
				
			||||||
    virtual void requireInt8Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc);
 | 
					    virtual void requireInt8Arithmetic(const TSourceLoc& loc, const char* op, const char* featureDesc);
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
    virtual void float16OpaqueCheck(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
					    virtual void float16OpaqueCheck(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    virtual void int64Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
					    virtual void int64Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
				
			||||||
    virtual void explicitInt8Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
					    virtual void explicitInt8Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
				
			||||||
    virtual void explicitInt16Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
					    virtual void explicitInt16Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
				
			||||||
    virtual void explicitInt32Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
					    virtual void explicitInt32Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
				
			||||||
    virtual void explicitFloat32Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
					    virtual void explicitFloat32Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
				
			||||||
    virtual void explicitFloat64Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
					    virtual void explicitFloat64Check(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
				
			||||||
 | 
					    virtual void fcoopmatCheck(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
				
			||||||
 | 
					#endif // GLSLANG_WEB
 | 
				
			||||||
    virtual void spvRemoved(const TSourceLoc&, const char* op);
 | 
					    virtual void spvRemoved(const TSourceLoc&, const char* op);
 | 
				
			||||||
    virtual void vulkanRemoved(const TSourceLoc&, const char* op);
 | 
					    virtual void vulkanRemoved(const TSourceLoc&, const char* op);
 | 
				
			||||||
    virtual void requireVulkan(const TSourceLoc&, const char* op);
 | 
					    virtual void requireVulkan(const TSourceLoc&, const char* op);
 | 
				
			||||||
    virtual void requireSpv(const TSourceLoc&, const char* op);
 | 
					    virtual void requireSpv(const TSourceLoc&, const char* op);
 | 
				
			||||||
    virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[], const char* featureDesc);
 | 
					 | 
				
			||||||
    virtual void updateExtensionBehavior(const char* const extension, TExtensionBehavior);
 | 
					 | 
				
			||||||
    virtual void checkExtensionStage(const TSourceLoc&, const char* const extension);
 | 
					 | 
				
			||||||
    virtual void fcoopmatCheck(const TSourceLoc&, const char* op, bool builtIn = false);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    virtual void C_DECL error(const TSourceLoc&, const char* szReason, const char* szToken,
 | 
					    virtual void C_DECL error(const TSourceLoc&, const char* szReason, const char* szToken,
 | 
				
			||||||
        const char* szExtraInfoFormat, ...) = 0;
 | 
					        const char* szExtraInfoFormat, ...) = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -792,10 +792,8 @@ int TPpContext::CPPpragma(TPpToken* ppToken)
 | 
				
			|||||||
        case PpAtomConstUint:
 | 
					        case PpAtomConstUint:
 | 
				
			||||||
        case PpAtomConstInt64:
 | 
					        case PpAtomConstInt64:
 | 
				
			||||||
        case PpAtomConstUint64:
 | 
					        case PpAtomConstUint64:
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        case PpAtomConstInt16:
 | 
					        case PpAtomConstInt16:
 | 
				
			||||||
        case PpAtomConstUint16:
 | 
					        case PpAtomConstUint16:
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        case PpAtomConstFloat:
 | 
					        case PpAtomConstFloat:
 | 
				
			||||||
        case PpAtomConstDouble:
 | 
					        case PpAtomConstDouble:
 | 
				
			||||||
        case PpAtomConstFloat16:
 | 
					        case PpAtomConstFloat16:
 | 
				
			||||||
@ -963,9 +961,11 @@ int TPpContext::readCPPline(TPpToken* ppToken)
 | 
				
			|||||||
        case PpAtomLine:
 | 
					        case PpAtomLine:
 | 
				
			||||||
            token = CPPline(ppToken);
 | 
					            token = CPPline(ppToken);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        case PpAtomPragma:
 | 
					        case PpAtomPragma:
 | 
				
			||||||
            token = CPPpragma(ppToken);
 | 
					            token = CPPpragma(ppToken);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
        case PpAtomUndef:
 | 
					        case PpAtomUndef:
 | 
				
			||||||
            token = CPPundef(ppToken);
 | 
					            token = CPPundef(ppToken);
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
				
			|||||||
@ -259,6 +259,7 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
 | 
				
			|||||||
    // Suffix:
 | 
					    // Suffix:
 | 
				
			||||||
    bool isDouble = false;
 | 
					    bool isDouble = false;
 | 
				
			||||||
    bool isFloat16 = false;
 | 
					    bool isFloat16 = false;
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
    if (ch == 'l' || ch == 'L') {
 | 
					    if (ch == 'l' || ch == 'L') {
 | 
				
			||||||
        if (ifdepth == 0 && parseContext.intermediate.getSource() == EShSourceGlsl)
 | 
					        if (ifdepth == 0 && parseContext.intermediate.getSource() == EShSourceGlsl)
 | 
				
			||||||
            parseContext.doubleCheck(ppToken->loc, "double floating-point suffix");
 | 
					            parseContext.doubleCheck(ppToken->loc, "double floating-point suffix");
 | 
				
			||||||
@ -297,11 +298,15 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
 | 
				
			|||||||
            saveName(ch);
 | 
					            saveName(ch);
 | 
				
			||||||
            isFloat16 = true;
 | 
					            isFloat16 = true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else if (ch == 'f' || ch == 'F') {
 | 
					    } else
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    if (ch == 'f' || ch == 'F') {
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
        if (ifdepth == 0)
 | 
					        if (ifdepth == 0)
 | 
				
			||||||
            parseContext.profileRequires(ppToken->loc,  EEsProfile, 300, nullptr, "floating-point suffix");
 | 
					            parseContext.profileRequires(ppToken->loc,  EEsProfile, 300, nullptr, "floating-point suffix");
 | 
				
			||||||
        if (ifdepth == 0 && !parseContext.relaxedErrors())
 | 
					        if (ifdepth == 0 && !parseContext.relaxedErrors())
 | 
				
			||||||
            parseContext.profileRequires(ppToken->loc, ~EEsProfile, 120, nullptr, "floating-point suffix");
 | 
					            parseContext.profileRequires(ppToken->loc, ~EEsProfile, 120, nullptr, "floating-point suffix");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
        if (ifdepth == 0 && !hasDecimalOrExponent)
 | 
					        if (ifdepth == 0 && !hasDecimalOrExponent)
 | 
				
			||||||
            parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
 | 
					            parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
 | 
				
			||||||
        saveName(ch);
 | 
					        saveName(ch);
 | 
				
			||||||
@ -470,9 +475,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
 | 
				
			|||||||
    static const int Num_Int64_Extensions = sizeof(Int64_Extensions) / sizeof(Int64_Extensions[0]);
 | 
					    static const int Num_Int64_Extensions = sizeof(Int64_Extensions) / sizeof(Int64_Extensions[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static const char* const Int16_Extensions[] = {
 | 
					    static const char* const Int16_Extensions[] = {
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        E_GL_AMD_gpu_shader_int16,
 | 
					        E_GL_AMD_gpu_shader_int16,
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        E_GL_EXT_shader_explicit_arithmetic_types,
 | 
					        E_GL_EXT_shader_explicit_arithmetic_types,
 | 
				
			||||||
        E_GL_EXT_shader_explicit_arithmetic_types_int16 };
 | 
					        E_GL_EXT_shader_explicit_arithmetic_types_int16 };
 | 
				
			||||||
    static const int Num_Int16_Extensions = sizeof(Int16_Extensions) / sizeof(Int16_Extensions[0]);
 | 
					    static const int Num_Int16_Extensions = sizeof(Int16_Extensions) / sizeof(Int16_Extensions[0]);
 | 
				
			||||||
@ -581,6 +584,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
 | 
				
			|||||||
                        ppToken->name[len++] = (char)ch;
 | 
					                        ppToken->name[len++] = (char)ch;
 | 
				
			||||||
                    isUnsigned = true;
 | 
					                    isUnsigned = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
                    int nextCh = getch();
 | 
					                    int nextCh = getch();
 | 
				
			||||||
                    if (nextCh == 'l' || nextCh == 'L') {
 | 
					                    if (nextCh == 'l' || nextCh == 'L') {
 | 
				
			||||||
                        if (len < MaxTokenLength)
 | 
					                        if (len < MaxTokenLength)
 | 
				
			||||||
@ -589,7 +593,6 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
 | 
				
			|||||||
                    } else
 | 
					                    } else
 | 
				
			||||||
                        ungetch();
 | 
					                        ungetch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                    nextCh = getch();
 | 
					                    nextCh = getch();
 | 
				
			||||||
                    if ((nextCh == 's' || nextCh == 'S') &&
 | 
					                    if ((nextCh == 's' || nextCh == 'S') &&
 | 
				
			||||||
                            pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
					                            pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
				
			||||||
@ -598,12 +601,10 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
 | 
				
			|||||||
                        isInt16 = true;
 | 
					                        isInt16 = true;
 | 
				
			||||||
                    } else
 | 
					                    } else
 | 
				
			||||||
                        ungetch();
 | 
					                        ungetch();
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                } else if (ch == 'l' || ch == 'L') {
 | 
					                } else if (ch == 'l' || ch == 'L') {
 | 
				
			||||||
                    if (len < MaxTokenLength)
 | 
					                    if (len < MaxTokenLength)
 | 
				
			||||||
                        ppToken->name[len++] = (char)ch;
 | 
					                        ppToken->name[len++] = (char)ch;
 | 
				
			||||||
                    isInt64 = true;
 | 
					                    isInt64 = true;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                } else if ((ch == 's' || ch == 'S') &&
 | 
					                } else if ((ch == 's' || ch == 'S') &&
 | 
				
			||||||
                           pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
					                           pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
				
			||||||
                    if (len < MaxTokenLength)
 | 
					                    if (len < MaxTokenLength)
 | 
				
			||||||
@ -614,6 +615,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
 | 
				
			|||||||
                    ungetch();
 | 
					                    ungetch();
 | 
				
			||||||
                ppToken->name[len] = '\0';
 | 
					                ppToken->name[len] = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
					                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
				
			||||||
                    if (pp->ifdepth == 0) {
 | 
					                    if (pp->ifdepth == 0) {
 | 
				
			||||||
                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
 | 
					                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
 | 
				
			||||||
@ -634,7 +636,9 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    ppToken->ival = (int)ival;
 | 
					                    ppToken->ival = (int)ival;
 | 
				
			||||||
                    return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;
 | 
					                    return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;
 | 
				
			||||||
                } else {
 | 
					                } else
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                    if (ival > 0xffffffffu && !AlreadyComplained)
 | 
					                    if (ival > 0xffffffffu && !AlreadyComplained)
 | 
				
			||||||
                        pp->parseContext.ppError(ppToken->loc, "hexadecimal literal too big", "", "");
 | 
					                        pp->parseContext.ppError(ppToken->loc, "hexadecimal literal too big", "", "");
 | 
				
			||||||
                    ppToken->ival = (int)ival;
 | 
					                    ppToken->ival = (int)ival;
 | 
				
			||||||
@ -699,7 +703,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
 | 
				
			|||||||
                    } else
 | 
					                    } else
 | 
				
			||||||
                        ungetch();
 | 
					                        ungetch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
                    nextCh = getch();
 | 
					                    nextCh = getch();
 | 
				
			||||||
                    if ((nextCh == 's' || nextCh == 'S') && 
 | 
					                    if ((nextCh == 's' || nextCh == 'S') && 
 | 
				
			||||||
                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
					                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
				
			||||||
@ -708,12 +712,10 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
 | 
				
			|||||||
                        isInt16 = true;
 | 
					                        isInt16 = true;
 | 
				
			||||||
                    } else
 | 
					                    } else
 | 
				
			||||||
                        ungetch();
 | 
					                        ungetch();
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                } else if (ch == 'l' || ch == 'L') {
 | 
					                } else if (ch == 'l' || ch == 'L') {
 | 
				
			||||||
                    if (len < MaxTokenLength)
 | 
					                    if (len < MaxTokenLength)
 | 
				
			||||||
                        ppToken->name[len++] = (char)ch;
 | 
					                        ppToken->name[len++] = (char)ch;
 | 
				
			||||||
                    isInt64 = true;
 | 
					                    isInt64 = true;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                } else if ((ch == 's' || ch == 'S') && 
 | 
					                } else if ((ch == 's' || ch == 'S') && 
 | 
				
			||||||
                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
					                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
				
			||||||
                    if (len < MaxTokenLength)
 | 
					                    if (len < MaxTokenLength)
 | 
				
			||||||
@ -730,6 +732,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
 | 
				
			|||||||
                if (octalOverflow)
 | 
					                if (octalOverflow)
 | 
				
			||||||
                    pp->parseContext.ppError(ppToken->loc, "octal literal too big", "", "");
 | 
					                    pp->parseContext.ppError(ppToken->loc, "octal literal too big", "", "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
					                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
				
			||||||
                    if (pp->ifdepth == 0) {
 | 
					                    if (pp->ifdepth == 0) {
 | 
				
			||||||
                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
 | 
					                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
 | 
				
			||||||
@ -750,7 +753,9 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    ppToken->ival = (int)ival;
 | 
					                    ppToken->ival = (int)ival;
 | 
				
			||||||
                    return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;
 | 
					                    return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;
 | 
				
			||||||
                } else {
 | 
					                } else
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                    ppToken->ival = (int)ival;
 | 
					                    ppToken->ival = (int)ival;
 | 
				
			||||||
                    return isUnsigned ? PpAtomConstUint : PpAtomConstInt;
 | 
					                    return isUnsigned ? PpAtomConstUint : PpAtomConstInt;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -790,7 +795,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
 | 
				
			|||||||
                    } else
 | 
					                    } else
 | 
				
			||||||
                        ungetch();
 | 
					                        ungetch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					#ifndef GLSLANG_WEB
 | 
				
			||||||
                    nextCh = getch();
 | 
					                    nextCh = getch();
 | 
				
			||||||
                    if ((nextCh == 's' || nextCh == 'S') &&
 | 
					                    if ((nextCh == 's' || nextCh == 'S') &&
 | 
				
			||||||
                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
					                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
				
			||||||
@ -799,12 +804,10 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
 | 
				
			|||||||
                        isInt16 = true;
 | 
					                        isInt16 = true;
 | 
				
			||||||
                    } else
 | 
					                    } else
 | 
				
			||||||
                        ungetch();
 | 
					                        ungetch();
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                } else if (ch == 'l' || ch == 'L') {
 | 
					                } else if (ch == 'l' || ch == 'L') {
 | 
				
			||||||
                    if (len < MaxTokenLength)
 | 
					                    if (len < MaxTokenLength)
 | 
				
			||||||
                        ppToken->name[len++] = (char)ch;
 | 
					                        ppToken->name[len++] = (char)ch;
 | 
				
			||||||
                    isInt64 = true;
 | 
					                    isInt64 = true;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
                } else if ((ch == 's' || ch == 'S') &&
 | 
					                } else if ((ch == 's' || ch == 'S') &&
 | 
				
			||||||
                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
					                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
 | 
				
			||||||
                    if (len < MaxTokenLength)
 | 
					                    if (len < MaxTokenLength)
 | 
				
			||||||
 | 
				
			|||||||
@ -41,9 +41,7 @@ namespace {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
using CompileToAstTest = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
					using CompileToAstTest = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
using CompileToAstTestNV = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
					using CompileToAstTestNV = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST_P(CompileToAstTest, FromFile)
 | 
					TEST_P(CompileToAstTest, FromFile)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -52,7 +50,6 @@ TEST_P(CompileToAstTest, FromFile)
 | 
				
			|||||||
                            Target::AST);
 | 
					                            Target::AST);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
// Compiling GLSL to SPIR-V under OpenGL semantics (NV extensions enabled).
 | 
					// Compiling GLSL to SPIR-V under OpenGL semantics (NV extensions enabled).
 | 
				
			||||||
TEST_P(CompileToAstTestNV, FromFile)
 | 
					TEST_P(CompileToAstTestNV, FromFile)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -60,7 +57,6 @@ TEST_P(CompileToAstTestNV, FromFile)
 | 
				
			|||||||
                            Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
 | 
					                            Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
 | 
				
			||||||
                            Target::AST);
 | 
					                            Target::AST);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// clang-format off
 | 
					// clang-format off
 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					INSTANTIATE_TEST_CASE_P(
 | 
				
			||||||
@ -281,7 +277,6 @@ INSTANTIATE_TEST_CASE_P(
 | 
				
			|||||||
    FileNameAsCustomTestSuffix
 | 
					    FileNameAsCustomTestSuffix
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					INSTANTIATE_TEST_CASE_P(
 | 
				
			||||||
    Glsl, CompileToAstTestNV,
 | 
					    Glsl, CompileToAstTestNV,
 | 
				
			||||||
    ::testing::ValuesIn(std::vector<std::string>({
 | 
					    ::testing::ValuesIn(std::vector<std::string>({
 | 
				
			||||||
@ -289,7 +284,6 @@ INSTANTIATE_TEST_CASE_P(
 | 
				
			|||||||
    })),
 | 
					    })),
 | 
				
			||||||
    FileNameAsCustomTestSuffix
 | 
					    FileNameAsCustomTestSuffix
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
// clang-format on
 | 
					// clang-format on
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}  // anonymous namespace
 | 
					}  // anonymous namespace
 | 
				
			||||||
 | 
				
			|||||||
@ -72,12 +72,8 @@ using OpenGLSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
				
			|||||||
using VulkanAstSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
					using VulkanAstSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
				
			||||||
using HlslIoMap = GlslangTest<::testing::TestWithParam<IoMapData>>;
 | 
					using HlslIoMap = GlslangTest<::testing::TestWithParam<IoMapData>>;
 | 
				
			||||||
using GlslIoMap = GlslangTest<::testing::TestWithParam<IoMapData>>;
 | 
					using GlslIoMap = GlslangTest<::testing::TestWithParam<IoMapData>>;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
using CompileVulkanToSpirvTestAMD = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
					using CompileVulkanToSpirvTestAMD = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
using CompileVulkanToSpirvTestNV = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
					using CompileVulkanToSpirvTestNV = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
using CompileUpgradeTextureToSampledTextureAndDropSamplersTest = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
					using CompileUpgradeTextureToSampledTextureAndDropSamplersTest = GlslangTest<::testing::TestWithParam<std::string>>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Compiling GLSL to SPIR-V under Vulkan semantics. Expected to successfully
 | 
					// Compiling GLSL to SPIR-V under Vulkan semantics. Expected to successfully
 | 
				
			||||||
@ -179,7 +175,6 @@ TEST_P(GlslIoMap, FromFile)
 | 
				
			|||||||
                                 GetParam().flattenUniforms);
 | 
					                                 GetParam().flattenUniforms);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
// Compiling GLSL to SPIR-V under Vulkan semantics (AMD extensions enabled).
 | 
					// Compiling GLSL to SPIR-V under Vulkan semantics (AMD extensions enabled).
 | 
				
			||||||
// Expected to successfully generate SPIR-V.
 | 
					// Expected to successfully generate SPIR-V.
 | 
				
			||||||
TEST_P(CompileVulkanToSpirvTestAMD, FromFile)
 | 
					TEST_P(CompileVulkanToSpirvTestAMD, FromFile)
 | 
				
			||||||
@ -188,9 +183,7 @@ TEST_P(CompileVulkanToSpirvTestAMD, FromFile)
 | 
				
			|||||||
                            Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
 | 
					                            Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
 | 
				
			||||||
                            Target::Spv);
 | 
					                            Target::Spv);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
// Compiling GLSL to SPIR-V under Vulkan semantics (NV extensions enabled).
 | 
					// Compiling GLSL to SPIR-V under Vulkan semantics (NV extensions enabled).
 | 
				
			||||||
// Expected to successfully generate SPIR-V.
 | 
					// Expected to successfully generate SPIR-V.
 | 
				
			||||||
TEST_P(CompileVulkanToSpirvTestNV, FromFile)
 | 
					TEST_P(CompileVulkanToSpirvTestNV, FromFile)
 | 
				
			||||||
@ -199,7 +192,6 @@ TEST_P(CompileVulkanToSpirvTestNV, FromFile)
 | 
				
			|||||||
                            Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
 | 
					                            Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
 | 
				
			||||||
                            Target::Spv);
 | 
					                            Target::Spv);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST_P(CompileUpgradeTextureToSampledTextureAndDropSamplersTest, FromFile)
 | 
					TEST_P(CompileUpgradeTextureToSampledTextureAndDropSamplersTest, FromFile)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -572,7 +564,6 @@ INSTANTIATE_TEST_CASE_P(
 | 
				
			|||||||
    FileNameAsCustomTestSuffix
 | 
					    FileNameAsCustomTestSuffix
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					INSTANTIATE_TEST_CASE_P(
 | 
				
			||||||
    Glsl, CompileVulkanToSpirvTestAMD,
 | 
					    Glsl, CompileVulkanToSpirvTestAMD,
 | 
				
			||||||
    ::testing::ValuesIn(std::vector<std::string>({
 | 
					    ::testing::ValuesIn(std::vector<std::string>({
 | 
				
			||||||
@ -588,9 +579,7 @@ INSTANTIATE_TEST_CASE_P(
 | 
				
			|||||||
    })),
 | 
					    })),
 | 
				
			||||||
    FileNameAsCustomTestSuffix
 | 
					    FileNameAsCustomTestSuffix
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					INSTANTIATE_TEST_CASE_P(
 | 
				
			||||||
    Glsl, CompileVulkanToSpirvTestNV,
 | 
					    Glsl, CompileVulkanToSpirvTestNV,
 | 
				
			||||||
    ::testing::ValuesIn(std::vector<std::string>({
 | 
					    ::testing::ValuesIn(std::vector<std::string>({
 | 
				
			||||||
@ -638,7 +627,6 @@ INSTANTIATE_TEST_CASE_P(
 | 
				
			|||||||
})),
 | 
					})),
 | 
				
			||||||
FileNameAsCustomTestSuffix
 | 
					FileNameAsCustomTestSuffix
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
INSTANTIATE_TEST_CASE_P(
 | 
					INSTANTIATE_TEST_CASE_P(
 | 
				
			||||||
    Glsl, CompileUpgradeTextureToSampledTextureAndDropSamplersTest,
 | 
					    Glsl, CompileUpgradeTextureToSampledTextureAndDropSamplersTest,
 | 
				
			||||||
 | 
				
			|||||||
@ -60,7 +60,6 @@ EShLanguage GetShaderStage(const std::string& stage)
 | 
				
			|||||||
        return EShLangFragment;
 | 
					        return EShLangFragment;
 | 
				
			||||||
    } else if (stage == "comp") {
 | 
					    } else if (stage == "comp") {
 | 
				
			||||||
        return EShLangCompute;
 | 
					        return EShLangCompute;
 | 
				
			||||||
#ifdef NV_EXTENSIONS
 | 
					 | 
				
			||||||
    } else if (stage == "rgen") {
 | 
					    } else if (stage == "rgen") {
 | 
				
			||||||
        return EShLangRayGenNV;
 | 
					        return EShLangRayGenNV;
 | 
				
			||||||
    } else if (stage == "rint") {
 | 
					    } else if (stage == "rint") {
 | 
				
			||||||
@ -77,7 +76,6 @@ EShLanguage GetShaderStage(const std::string& stage)
 | 
				
			|||||||
        return EShLangTaskNV;
 | 
					        return EShLangTaskNV;
 | 
				
			||||||
    } else if (stage == "mesh") {
 | 
					    } else if (stage == "mesh") {
 | 
				
			||||||
        return EShLangMeshNV;
 | 
					        return EShLangMeshNV;
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        assert(0 && "Unknown shader stage");
 | 
					        assert(0 && "Unknown shader stage");
 | 
				
			||||||
        return EShLangCount;
 | 
					        return EShLangCount;
 | 
				
			||||||
 | 
				
			|||||||
@ -8703,25 +8703,19 @@ void HlslParseContext::fixXfbOffsets(TQualifier& qualifier, TTypeList& typeList)
 | 
				
			|||||||
    for (unsigned int member = 0; member < typeList.size(); ++member) {
 | 
					    for (unsigned int member = 0; member < typeList.size(); ++member) {
 | 
				
			||||||
        TQualifier& memberQualifier = typeList[member].type->getQualifier();
 | 
					        TQualifier& memberQualifier = typeList[member].type->getQualifier();
 | 
				
			||||||
        bool contains64BitType = false;
 | 
					        bool contains64BitType = false;
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
        bool contains32BitType = false;
 | 
					        bool contains32BitType = false;
 | 
				
			||||||
        bool contains16BitType = false;
 | 
					        bool contains16BitType = false;
 | 
				
			||||||
        int memberSize = intermediate.computeTypeXfbSize(*typeList[member].type, contains64BitType, contains32BitType, contains16BitType);
 | 
					        int memberSize = intermediate.computeTypeXfbSize(*typeList[member].type, contains64BitType, contains32BitType, contains16BitType);
 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
        int memberSize = intermediate.computeTypeXfbSize(*typeList[member].type, contains64BitType);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
        // see if we need to auto-assign an offset to this member
 | 
					        // see if we need to auto-assign an offset to this member
 | 
				
			||||||
        if (! memberQualifier.hasXfbOffset()) {
 | 
					        if (! memberQualifier.hasXfbOffset()) {
 | 
				
			||||||
            // "if applied to an aggregate containing a double or 64-bit integer, the offset must also be a multiple of 8"
 | 
					            // "if applied to an aggregate containing a double or 64-bit integer, the offset must also be a multiple of 8"
 | 
				
			||||||
            if (contains64BitType)
 | 
					            if (contains64BitType)
 | 
				
			||||||
                RoundToPow2(nextOffset, 8);
 | 
					                RoundToPow2(nextOffset, 8);
 | 
				
			||||||
#ifdef AMD_EXTENSIONS
 | 
					 | 
				
			||||||
            else if (contains32BitType)
 | 
					            else if (contains32BitType)
 | 
				
			||||||
                RoundToPow2(nextOffset, 4);
 | 
					                RoundToPow2(nextOffset, 4);
 | 
				
			||||||
            // "if applied to an aggregate containing a half float or 16-bit integer, the offset must also be a multiple of 2"
 | 
					            // "if applied to an aggregate containing a half float or 16-bit integer, the offset must also be a multiple of 2"
 | 
				
			||||||
            else if (contains16BitType)
 | 
					            else if (contains16BitType)
 | 
				
			||||||
                RoundToPow2(nextOffset, 2);
 | 
					                RoundToPow2(nextOffset, 2);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            memberQualifier.layoutXfbOffset = nextOffset;
 | 
					            memberQualifier.layoutXfbOffset = nextOffset;
 | 
				
			||||||
        } else
 | 
					        } else
 | 
				
			||||||
            nextOffset = memberQualifier.layoutXfbOffset;
 | 
					            nextOffset = memberQualifier.layoutXfbOffset;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user