Web: Reclaim more space and make all work w/wo GLSLANG_WEB.
This commit is contained in:
		
							parent
							
								
									e5eee8fb03
								
							
						
					
					
						commit
						f8d1d7442b
					
				| @ -374,22 +374,20 @@ spv::Decoration TranslateBlockDecoration(const glslang::TType& type, bool useSto | ||||
| // Translate glslang type to SPIR-V memory decorations.
 | ||||
| void TranslateMemoryDecoration(const glslang::TQualifier& qualifier, std::vector<spv::Decoration>& memory, bool useVulkanMemoryModel) | ||||
| { | ||||
| #ifndef GLSLANG_WEB | ||||
|     if (!useVulkanMemoryModel) { | ||||
|         if (qualifier.coherent) | ||||
|         if (qualifier.isCoherent()) | ||||
|             memory.push_back(spv::DecorationCoherent); | ||||
|         if (qualifier.volatil) { | ||||
|         if (qualifier.isVolatile()) { | ||||
|             memory.push_back(spv::DecorationVolatile); | ||||
|             memory.push_back(spv::DecorationCoherent); | ||||
|         } | ||||
|     } | ||||
|     if (qualifier.restrict) | ||||
|     if (qualifier.isRestrict()) | ||||
|         memory.push_back(spv::DecorationRestrict); | ||||
|     if (qualifier.isReadOnly()) | ||||
|         memory.push_back(spv::DecorationNonWritable); | ||||
|     if (qualifier.isWriteOnly()) | ||||
|        memory.push_back(spv::DecorationNonReadable); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| // Translate glslang type to SPIR-V layout decorations.
 | ||||
| @ -1201,9 +1199,9 @@ spv::StorageClass TGlslangToSpvTraverser::TranslateStorageClass(const glslang::T | ||||
|     } | ||||
| 
 | ||||
|     switch (type.getQualifier().storage) { | ||||
|     case glslang::EvqGlobal:           return spv::StorageClassPrivate; | ||||
|     case glslang::EvqConstReadOnly:    return spv::StorageClassFunction; | ||||
|     case glslang::EvqTemporary:        return spv::StorageClassFunction; | ||||
|     case glslang::EvqGlobal:        return spv::StorageClassPrivate; | ||||
|     case glslang::EvqConstReadOnly: return spv::StorageClassFunction; | ||||
|     case glslang::EvqTemporary:     return spv::StorageClassFunction; | ||||
|     case glslang::EvqShared:           return spv::StorageClassWorkgroup; | ||||
| #ifndef GLSLANG_WEB | ||||
|     case glslang::EvqPayloadNV:        return spv::StorageClassRayPayloadNV; | ||||
| @ -1466,13 +1464,20 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, const gl | ||||
|         if (mode != spv::ExecutionModeMax) | ||||
|             builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode); | ||||
|         switch (glslangIntermediate->getInterlockOrdering()) { | ||||
|         case glslang::EioPixelInterlockOrdered:         mode = spv::ExecutionModePixelInterlockOrderedEXT;          break; | ||||
|         case glslang::EioPixelInterlockUnordered:       mode = spv::ExecutionModePixelInterlockUnorderedEXT;          break; | ||||
|         case glslang::EioSampleInterlockOrdered:        mode = spv::ExecutionModeSampleInterlockOrderedEXT;          break; | ||||
|         case glslang::EioSampleInterlockUnordered:      mode = spv::ExecutionModeSampleInterlockUnorderedEXT;          break; | ||||
|         case glslang::EioShadingRateInterlockOrdered:   mode = spv::ExecutionModeShadingRateInterlockOrderedEXT;          break; | ||||
|         case glslang::EioShadingRateInterlockUnordered: mode = spv::ExecutionModeShadingRateInterlockUnorderedEXT;          break; | ||||
|         default:                                        mode = spv::ExecutionModeMax;                   break; | ||||
|         case glslang::EioPixelInterlockOrdered:         mode = spv::ExecutionModePixelInterlockOrderedEXT; | ||||
|             break; | ||||
|         case glslang::EioPixelInterlockUnordered:       mode = spv::ExecutionModePixelInterlockUnorderedEXT; | ||||
|             break; | ||||
|         case glslang::EioSampleInterlockOrdered:        mode = spv::ExecutionModeSampleInterlockOrderedEXT; | ||||
|             break; | ||||
|         case glslang::EioSampleInterlockUnordered:      mode = spv::ExecutionModeSampleInterlockUnorderedEXT; | ||||
|             break; | ||||
|         case glslang::EioShadingRateInterlockOrdered:   mode = spv::ExecutionModeShadingRateInterlockOrderedEXT; | ||||
|             break; | ||||
|         case glslang::EioShadingRateInterlockUnordered: mode = spv::ExecutionModeShadingRateInterlockUnorderedEXT; | ||||
|             break; | ||||
|         default:                                        mode = spv::ExecutionModeMax; | ||||
|             break; | ||||
|         } | ||||
|         if (mode != spv::ExecutionModeMax) { | ||||
|             builder.addExecutionMode(shaderEntry, (spv::ExecutionMode)mode); | ||||
| @ -1495,7 +1500,6 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, const gl | ||||
|         builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0), | ||||
|                                                                            glslangIntermediate->getLocalSize(1), | ||||
|                                                                            glslangIntermediate->getLocalSize(2)); | ||||
| #ifndef GLSLANG_WEB | ||||
|         if (glslangIntermediate->getLayoutDerivativeModeNone() == glslang::LayoutDerivativeGroupQuads) { | ||||
|             builder.addCapability(spv::CapabilityComputeDerivativeGroupQuadsNV); | ||||
|             builder.addExecutionMode(shaderEntry, spv::ExecutionModeDerivativeGroupQuadsNV); | ||||
| @ -1505,7 +1509,6 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, const gl | ||||
|             builder.addExecutionMode(shaderEntry, spv::ExecutionModeDerivativeGroupLinearNV); | ||||
|             builder.addExtension(spv::E_SPV_NV_compute_shader_derivatives); | ||||
|         } | ||||
| #endif | ||||
|         break; | ||||
| #ifndef GLSLANG_WEB | ||||
|     case EShLangTessEvaluation: | ||||
| @ -3712,6 +3715,7 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type, | ||||
|             for (unsigned int i = 0; i < memory.size(); ++i) | ||||
|                 builder.addMemberDecoration(spvType, member, memory[i]); | ||||
|         } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
|         // Location assignment was already completed correctly by the front end,
 | ||||
| @ -4170,9 +4174,11 @@ void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslF | ||||
|             // memory and use RestrictPointer/AliasedPointer.
 | ||||
|             if (originalParam(type.getQualifier().storage, type, false) || | ||||
|                 !writableParam(type.getQualifier().storage)) { | ||||
|                 decorations.push_back(type.getQualifier().restrict ? spv::DecorationRestrict : spv::DecorationAliased); | ||||
|                 decorations.push_back(type.getQualifier().isRestrict() ? spv::DecorationRestrict : | ||||
|                                                                          spv::DecorationAliased); | ||||
|             } else { | ||||
|                 decorations.push_back(type.getQualifier().restrict ? spv::DecorationRestrictPointerEXT : spv::DecorationAliasedPointerEXT); | ||||
|                 decorations.push_back(type.getQualifier().isRestrict() ? spv::DecorationRestrictPointerEXT : | ||||
|                                                                          spv::DecorationAliasedPointerEXT); | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| @ -4980,6 +4986,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|     // nonprivate
 | ||||
|     if (imageType.getQualifier().nonprivate) { | ||||
|         params.nonprivate = true; | ||||
| @ -4989,6 +4996,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO | ||||
|     if (imageType.getQualifier().volatil) { | ||||
|         params.volatil = true; | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     std::vector<spv::Id> result( 1,  | ||||
|         builder.createTextureCall(precision, resultType(), sparse, cracked.fetch, cracked.proj, cracked.gather, | ||||
| @ -7492,14 +7500,6 @@ spv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op, spv: | ||||
|     spv::Scope memoryBarrierScope = glslangIntermediate->usingVulkanMemoryModel() ? spv::ScopeQueueFamilyKHR : spv::ScopeDevice; | ||||
| 
 | ||||
|     switch (op) { | ||||
| #ifndef GLSLANG_WEB | ||||
|     case glslang::EOpEmitVertex: | ||||
|         builder.createNoResultOp(spv::OpEmitVertex); | ||||
|         return 0; | ||||
|     case glslang::EOpEndPrimitive: | ||||
|         builder.createNoResultOp(spv::OpEndPrimitive); | ||||
|         return 0; | ||||
| #endif | ||||
|     case glslang::EOpBarrier: | ||||
|         if (glslangIntermediate->getStage() == EShLangTessControl) { | ||||
|             if (glslangIntermediate->usingVulkanMemoryModel()) { | ||||
| @ -7585,6 +7585,14 @@ spv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op, spv: | ||||
|         builder.createMemoryBarrier(spv::ScopeSubgroup, spv::MemorySemanticsWorkgroupMemoryMask | | ||||
|                                                         spv::MemorySemanticsAcquireReleaseMask); | ||||
|         return spv::NoResult; | ||||
| 
 | ||||
|     case glslang::EOpEmitVertex: | ||||
|         builder.createNoResultOp(spv::OpEmitVertex); | ||||
|         return 0; | ||||
|     case glslang::EOpEndPrimitive: | ||||
|         builder.createNoResultOp(spv::OpEndPrimitive); | ||||
|         return 0; | ||||
| 
 | ||||
|     case glslang::EOpSubgroupElect: { | ||||
|         std::vector<spv::Id> operands; | ||||
|         return createSubgroupOperation(op, typeId, operands, glslang::EbtVoid); | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| 399360 ../build/install/bin/glslangValidator.exe | ||||
| 396288 ../build/install/bin/glslangValidator.exe | ||||
|  | ||||
| @ -528,6 +528,7 @@ public: | ||||
| 
 | ||||
|     void clearMemory() | ||||
|     { | ||||
| #ifndef GLSLANG_WEB | ||||
|         coherent     = false; | ||||
|         devicecoherent = false; | ||||
|         queuefamilycoherent = false; | ||||
| @ -538,6 +539,7 @@ public: | ||||
|         restrict     = false; | ||||
|         readonly     = false; | ||||
|         writeonly    = false; | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     const char*         semanticName; | ||||
| @ -550,16 +552,6 @@ public: | ||||
|     bool centroid     : 1; | ||||
|     bool smooth       : 1; | ||||
|     bool flat         : 1; | ||||
|     bool coherent     : 1; | ||||
|     bool devicecoherent : 1; | ||||
|     bool queuefamilycoherent : 1; | ||||
|     bool workgroupcoherent : 1; | ||||
|     bool subgroupcoherent  : 1; | ||||
|     bool nonprivate   : 1; | ||||
|     bool volatil      : 1; | ||||
|     bool restrict     : 1; | ||||
|     bool readonly     : 1; | ||||
|     bool writeonly    : 1; | ||||
|     // having a constant_id is not sufficient: expressions have no id, but are still specConstant
 | ||||
|     bool specConstant : 1; | ||||
|     bool nonUniform   : 1; | ||||
| @ -567,6 +559,9 @@ public: | ||||
| #ifdef GLSLANG_WEB | ||||
|     bool isWriteOnly() const { return false; } | ||||
|     bool isReadOnly() const { return false; } | ||||
|     bool isRestrict() const { return false; } | ||||
|     bool isCoherent() const { return false; } | ||||
|     bool isVolatile() const { return false; } | ||||
|     bool isSample() const { return false; } | ||||
|     bool isMemory() const { return false; } | ||||
|     bool isMemoryQualifierImageAndSSBOOnly() const { return false; } | ||||
| @ -588,8 +583,21 @@ public: | ||||
|     bool perTaskNV : 1; | ||||
|     bool patch        : 1; | ||||
|     bool sample       : 1; | ||||
|     bool restrict     : 1; | ||||
|     bool readonly     : 1; | ||||
|     bool writeonly    : 1; | ||||
|     bool coherent     : 1; | ||||
|     bool volatil      : 1; | ||||
|     bool devicecoherent : 1; | ||||
|     bool queuefamilycoherent : 1; | ||||
|     bool workgroupcoherent : 1; | ||||
|     bool subgroupcoherent  : 1; | ||||
|     bool nonprivate   : 1; | ||||
|     bool isWriteOnly() const { return writeonly; } | ||||
|     bool isReadOnly() const { return readonly; } | ||||
|     bool isRestrict() const { return restrict; } | ||||
|     bool isCoherent() const { return coherent; } | ||||
|     bool isVolatile() const { return volatil; } | ||||
|     bool isSample() const { return sample; } | ||||
|     bool isMemory() const | ||||
|     { | ||||
| @ -780,8 +788,8 @@ public: | ||||
|     { | ||||
|         layoutLocation = layoutLocationEnd; | ||||
|         layoutComponent = layoutComponentEnd; | ||||
|         layoutIndex = layoutIndexEnd; | ||||
| #ifndef GLSLANG_WEB | ||||
|         layoutIndex = layoutIndexEnd; | ||||
|         clearStreamLayout(); | ||||
|         clearXfbLayout(); | ||||
| #endif | ||||
| @ -886,7 +894,9 @@ public: | ||||
| 
 | ||||
|         layoutSet = layoutSetEnd; | ||||
|         layoutBinding = layoutBindingEnd; | ||||
| #ifndef GLSLANG_WEB | ||||
|         layoutAttachment = layoutAttachmentEnd; | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     bool hasMatrix() const | ||||
| @ -923,6 +933,7 @@ public: | ||||
|     bool hasOffset() const { return false; } | ||||
|     bool isNonPerspective() const { return false; } | ||||
|     bool hasIndex() const { return false; } | ||||
|     unsigned getIndex() const { return 0; } | ||||
|     bool hasComponent() const { return false; } | ||||
|     bool hasStream() const { return false; } | ||||
|     bool hasFormat() const { return false; } | ||||
| @ -947,6 +958,7 @@ public: | ||||
|     { | ||||
|         return layoutIndex != layoutIndexEnd; | ||||
|     } | ||||
|     unsigned getIndex() const { return layoutIndex; } | ||||
|     bool hasComponent() const | ||||
|     { | ||||
|         return layoutComponent != layoutComponentEnd; | ||||
|  | ||||
| @ -1310,11 +1310,13 @@ public: | ||||
|     bool isSparseTexture()  const { return false; } | ||||
|     bool isImageFootprint() const { return false; } | ||||
|     bool isSparseImage()    const { return false; } | ||||
|     bool isSubgroup()       const { return false; } | ||||
| #else | ||||
|     bool isImage()    const { return op > EOpImageGuardBegin    && op < EOpImageGuardEnd; } | ||||
|     bool isSparseTexture() const { return op > EOpSparseTextureGuardBegin && op < EOpSparseTextureGuardEnd; } | ||||
|     bool isImageFootprint() const { return op > EOpImageFootprintGuardBegin && op < EOpImageFootprintGuardEnd; } | ||||
|     bool isSparseImage()   const { return op == EOpSparseImageLoad; } | ||||
|     bool isSubgroup() const { return op > EOpSubgroupGuardStart && op < EOpSubgroupGuardStop; } | ||||
| #endif | ||||
| 
 | ||||
|     void setOperationPrecision(TPrecisionQualifier p) { operationPrecision = p; } | ||||
|  | ||||
| @ -85,18 +85,18 @@ const int TypeStringScalarMask = ~TypeStringColumnMask;         // take type to | ||||
| 
 | ||||
| enum ArgType { | ||||
|     // numbers hardcoded to correspond to 'TypeString'; order and value matter
 | ||||
|     TypeB =   1 << 0,  // Boolean
 | ||||
|     TypeF =   1 << 1,  // float 32
 | ||||
|     TypeI =   1 << 2,  // int 32
 | ||||
|     TypeU =   1 << 3,  // uint 32
 | ||||
|     TypeF16 = 1 << 4,  // float 16
 | ||||
|     TypeF64 = 1 << 5,  // float 64
 | ||||
|     TypeI8  = 1 << 6,  // int 8
 | ||||
|     TypeI16 = 1 << 7,  // int 16
 | ||||
|     TypeI64 = 1 << 8,  // int 64
 | ||||
|     TypeU8  = 1 << 9,  // uint 8
 | ||||
|     TypeU16 = 1 << 10, // uint 16
 | ||||
|     TypeU64 = 1 << 11, // uint 64
 | ||||
|     TypeB    = 1 << 0,  // Boolean
 | ||||
|     TypeF    = 1 << 1,  // float 32
 | ||||
|     TypeI    = 1 << 2,  // int 32
 | ||||
|     TypeU    = 1 << 3,  // uint 32
 | ||||
|     TypeF16  = 1 << 4,  // float 16
 | ||||
|     TypeF64  = 1 << 5,  // float 64
 | ||||
|     TypeI8   = 1 << 6,  // int 8
 | ||||
|     TypeI16  = 1 << 7,  // int 16
 | ||||
|     TypeI64  = 1 << 8,  // int 64
 | ||||
|     TypeU8   = 1 << 9,  // uint 8
 | ||||
|     TypeU16  = 1 << 10, // uint 16
 | ||||
|     TypeU64  = 1 << 11, // uint 64
 | ||||
| }; | ||||
| // Mixtures of the above, to help the function tables
 | ||||
| const ArgType TypeFI  = static_cast<ArgType>(TypeF | TypeI); | ||||
| @ -106,22 +106,22 @@ const ArgType TypeIU  = static_cast<ArgType>(TypeI | TypeU); | ||||
| // The relationships between arguments and return type, whether anything is
 | ||||
| // output, or other unusual situations.
 | ||||
| enum ArgClass { | ||||
|     ClassRegular = 0,    // nothing special, just all vector widths with matching return type; traditional arithmetic
 | ||||
|     ClassLS   = 1 << 0,  // the last argument is also held fixed as a (type-matched) scalar while the others cycle
 | ||||
|     ClassXLS  = 1 << 1,  // the last argument is exclusively a (type-matched) scalar while the others cycle
 | ||||
|     ClassLS2  = 1 << 2,  // the last two arguments are held fixed as a (type-matched) scalar while the others cycle
 | ||||
|     ClassFS   = 1 << 3,  // the first argument is held fixed as a (type-matched) scalar while the others cycle
 | ||||
|     ClassFS2  = 1 << 4,  // the first two arguments are held fixed as a (type-matched) scalar while the others cycle
 | ||||
|     ClassLO   = 1 << 5,  // the last argument is an output
 | ||||
|     ClassB    = 1 << 6,  // return type cycles through only bool/bvec, matching vector width of args
 | ||||
|     ClassLB   = 1 << 7,  // last argument cycles through only bool/bvec, matching vector width of args
 | ||||
|     ClassV1   = 1 << 8,  // scalar only
 | ||||
|     ClassFIO  = 1 << 9,  // first argument is inout
 | ||||
|     ClassRS   = 1 << 10, // the return is held scalar as the arguments cycle
 | ||||
|     ClassNS   = 1 << 11, // no scalar prototype
 | ||||
|     ClassCV   = 1 << 12, // first argument is 'coherent volatile'
 | ||||
|     ClassFO   = 1 << 13, // first argument is output
 | ||||
|     ClassV3   = 1 << 14, // vec3 only
 | ||||
|     ClassRegular     = 0,  // nothing special, just all vector widths with matching return type; traditional arithmetic
 | ||||
|     ClassLS     = 1 << 0,  // the last argument is also held fixed as a (type-matched) scalar while the others cycle
 | ||||
|     ClassXLS    = 1 << 1,  // the last argument is exclusively a (type-matched) scalar while the others cycle
 | ||||
|     ClassLS2    = 1 << 2,  // the last two arguments are held fixed as a (type-matched) scalar while the others cycle
 | ||||
|     ClassFS     = 1 << 3,  // the first argument is held fixed as a (type-matched) scalar while the others cycle
 | ||||
|     ClassFS2    = 1 << 4,  // the first two arguments are held fixed as a (type-matched) scalar while the others cycle
 | ||||
|     ClassLO     = 1 << 5,  // the last argument is an output
 | ||||
|     ClassB      = 1 << 6,  // return type cycles through only bool/bvec, matching vector width of args
 | ||||
|     ClassLB     = 1 << 7,  // last argument cycles through only bool/bvec, matching vector width of args
 | ||||
|     ClassV1     = 1 << 8,  // scalar only
 | ||||
|     ClassFIO    = 1 << 9,  // first argument is inout
 | ||||
|     ClassRS     = 1 << 10, // the return is held scalar as the arguments cycle
 | ||||
|     ClassNS     = 1 << 11, // no scalar prototype
 | ||||
|     ClassCV     = 1 << 12, // first argument is 'coherent volatile'
 | ||||
|     ClassFO     = 1 << 13, // first argument is output
 | ||||
|     ClassV3     = 1 << 14, // vec3 only
 | ||||
| }; | ||||
| // Mixtures of the above, to help the function tables
 | ||||
| const ArgClass ClassV1FIOCV = (ArgClass)(ClassV1 | ClassFIO | ClassCV); | ||||
| @ -147,17 +147,18 @@ EProfile EDesktopProfile = static_cast<EProfile>(ENoProfile | ECoreProfile | ECo | ||||
| // Declare pointers to put into the table for versioning.
 | ||||
| #ifdef GLSLANG_WEB | ||||
|     const Versioning* Es300Desktop130 = nullptr; | ||||
| 
 | ||||
|     const Versioning Es310Desktop430Version[] = { { EEsProfile,      0, 310, 0, nullptr }, | ||||
|                                                   { EDesktopProfile, 0, 430, 0, nullptr }, | ||||
|                                                   { EBadProfile } }; | ||||
|     const Versioning* Es310Desktop430 = &Es310Desktop430Version[0]; | ||||
|     const Versioning* Es310Desktop430 = nullptr; | ||||
| #else | ||||
|     const Versioning Es300Desktop130Version[] = { { EEsProfile,      0, 300, 0, nullptr }, | ||||
|                                                   { EDesktopProfile, 0, 130, 0, nullptr }, | ||||
|                                                   { EBadProfile } }; | ||||
|     const Versioning* Es300Desktop130 = &Es300Desktop130Version[0]; | ||||
| 
 | ||||
|     const Versioning Es310Desktop430Version[] = { { EEsProfile,      0, 310, 0, nullptr }, | ||||
|                                                   { EDesktopProfile, 0, 430, 0, nullptr }, | ||||
|                                                   { EBadProfile } }; | ||||
|     const Versioning* Es310Desktop430 = &Es310Desktop430Version[0]; | ||||
| 
 | ||||
|     const Versioning Es310Desktop450Version[] = { { EEsProfile,      0, 310, 0, nullptr }, | ||||
|                                                   { EDesktopProfile, 0, 450, 0, nullptr }, | ||||
|                                                   { EBadProfile } }; | ||||
| @ -268,6 +269,7 @@ const BuiltInFunction BaseFunctions[] = { | ||||
|     { EOpMix,              "mix",              3,   TypeB,     ClassRegular, Es310Desktop450 }, | ||||
|     { EOpMix,              "mix",              3,   TypeIU,    ClassLB,      Es310Desktop450 }, | ||||
| #endif | ||||
| 
 | ||||
|     { EOpNull } | ||||
| }; | ||||
| 
 | ||||
| @ -278,6 +280,59 @@ const BuiltInFunction DerivativeFunctions[] = { | ||||
|     { EOpNull } | ||||
| }; | ||||
| 
 | ||||
| // For functions declared some other way, but still use the table to relate to operator.
 | ||||
| struct CustomFunction { | ||||
|     TOperator op;                 // operator to map the name to
 | ||||
|     const char* name;             // function name
 | ||||
|     const Versioning* versioning; // nullptr means always a valid version
 | ||||
| }; | ||||
| 
 | ||||
| const CustomFunction CustomFunctions[] = { | ||||
|     { EOpBarrier,             "barrier",             nullptr }, | ||||
|     { EOpMemoryBarrierShared, "memoryBarrierShared", nullptr }, | ||||
|     { EOpGroupMemoryBarrier,  "groupMemoryBarrier",  nullptr }, | ||||
|     { EOpMemoryBarrier,       "memoryBarrier",       nullptr }, | ||||
|     { EOpMemoryBarrierBuffer, "memoryBarrierBuffer", nullptr }, | ||||
| 
 | ||||
|     { EOpPackSnorm2x16,       "packSnorm2x16",       nullptr }, | ||||
|     { EOpUnpackSnorm2x16,     "unpackSnorm2x16",     nullptr }, | ||||
|     { EOpPackUnorm2x16,       "packUnorm2x16",       nullptr }, | ||||
|     { EOpUnpackUnorm2x16,     "unpackUnorm2x16",     nullptr }, | ||||
|     { EOpPackHalf2x16,        "packHalf2x16",        nullptr }, | ||||
|     { EOpUnpackHalf2x16,      "unpackHalf2x16",      nullptr }, | ||||
| 
 | ||||
|     { EOpMul,                 "matrixCompMult",      nullptr }, | ||||
|     { EOpOuterProduct,        "outerProduct",        nullptr }, | ||||
|     { EOpTranspose,           "transpose",           nullptr }, | ||||
|     { EOpDeterminant,         "determinant",         nullptr }, | ||||
|     { EOpMatrixInverse,       "inverse",             nullptr }, | ||||
|     { EOpFloatBitsToInt,      "floatBitsToInt",      nullptr }, | ||||
|     { EOpFloatBitsToUint,     "floatBitsToUint",     nullptr }, | ||||
|     { EOpIntBitsToFloat,      "intBitsToFloat",      nullptr }, | ||||
|     { EOpUintBitsToFloat,     "uintBitsToFloat",     nullptr }, | ||||
| 
 | ||||
|     { EOpTextureQuerySize,      "textureSize",           nullptr }, | ||||
|     { EOpTextureQueryLod,       "textureQueryLod",       nullptr }, | ||||
|     { EOpTextureQueryLevels,    "textureQueryLevels",    nullptr }, | ||||
|     { EOpTextureQuerySamples,   "textureSamples",        nullptr }, | ||||
|     { EOpTexture,               "texture",               nullptr }, | ||||
|     { EOpTextureProj,           "textureProj",           nullptr }, | ||||
|     { EOpTextureLod,            "textureLod",            nullptr }, | ||||
|     { EOpTextureOffset,         "textureOffset",         nullptr }, | ||||
|     { EOpTextureFetch,          "texelFetch",            nullptr }, | ||||
|     { EOpTextureFetchOffset,    "texelFetchOffset",      nullptr }, | ||||
|     { EOpTextureProjOffset,     "textureProjOffset",     nullptr }, | ||||
|     { EOpTextureLodOffset,      "textureLodOffset",      nullptr }, | ||||
|     { EOpTextureProjLod,        "textureProjLod",        nullptr }, | ||||
|     { EOpTextureProjLodOffset,  "textureProjLodOffset",  nullptr }, | ||||
|     { EOpTextureGrad,           "textureGrad",           nullptr }, | ||||
|     { EOpTextureGradOffset,     "textureGradOffset",     nullptr }, | ||||
|     { EOpTextureProjGrad,       "textureProjGrad",       nullptr }, | ||||
|     { EOpTextureProjGradOffset, "textureProjGradOffset", nullptr }, | ||||
| 
 | ||||
|     { EOpNull } | ||||
| }; | ||||
| 
 | ||||
| // For the given table of functions, add all the indicated prototypes for each
 | ||||
| // one, to be returned in the passed in decls.
 | ||||
| void AddTabledBuiltin(TString& decls, const BuiltInFunction& function) | ||||
| @ -384,9 +439,10 @@ bool ValidVersion(const BuiltInFunction& function, int version, EProfile profile | ||||
| // Relate a single table of built-ins to their AST operator.
 | ||||
| // This can get called redundantly (especially for the common built-ins, when
 | ||||
| // called once per stage). This is a performance issue only, not a correctness
 | ||||
| // concern.  It is done for quality arising from simplicity, as there are subtlies
 | ||||
| // concern.  It is done for quality arising from simplicity, as there are subtleties
 | ||||
| // to get correct if instead trying to do it surgically.
 | ||||
| void RelateTabledBuiltins(const BuiltInFunction* functions, TSymbolTable& symbolTable) | ||||
| template<class FunctionT> | ||||
| void RelateTabledBuiltins(const FunctionT* functions, TSymbolTable& symbolTable) | ||||
| { | ||||
|     while (functions->op != EOpNull) { | ||||
|         symbolTable.relateToOperator(functions->name, functions->op); | ||||
| @ -410,10 +466,6 @@ void TBuiltIns::addTabledBuiltins(int version, EProfile profile, const SpvVersio | ||||
|     forEachFunction(commonBuiltins, BaseFunctions); | ||||
|     forEachFunction(stageBuiltins[EShLangFragment], DerivativeFunctions); | ||||
| 
 | ||||
| #ifdef GLSLANG_WEB | ||||
|     return; | ||||
| #endif | ||||
| 
 | ||||
|     if ((profile == EEsProfile && version >= 320) || (profile != EEsProfile && version >= 450)) | ||||
|         forEachFunction(stageBuiltins[EShLangCompute], DerivativeFunctions); | ||||
| } | ||||
| @ -423,6 +475,7 @@ void TBuiltIns::relateTabledBuiltins(int /* version */, EProfile /* profile */, | ||||
| { | ||||
|     RelateTabledBuiltins(BaseFunctions, symbolTable); | ||||
|     RelateTabledBuiltins(DerivativeFunctions, symbolTable); | ||||
|     RelateTabledBuiltins(CustomFunctions, symbolTable); | ||||
| } | ||||
| 
 | ||||
| inline bool IncludeLegacy(int version, EProfile profile, const SpvVersion& spvVersion) | ||||
| @ -467,7 +520,7 @@ TBuiltIns::TBuiltIns() | ||||
|     dimMap[Esd1D] = 1; | ||||
|     dimMap[EsdRect] = 2; | ||||
|     dimMap[EsdBuffer] = 1; | ||||
|     dimMap[EsdSubpass] = 2;  // potientially unused for now
 | ||||
|     dimMap[EsdSubpass] = 2;  // potentially unused for now
 | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| @ -486,6 +539,10 @@ TBuiltIns::~TBuiltIns() | ||||
| //
 | ||||
| void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvVersion) | ||||
| { | ||||
| #ifdef GLSLANG_WEB | ||||
|     version = 310; | ||||
|     profile = EEsProfile; | ||||
| #endif | ||||
|     addTabledBuiltins(version, profile, spvVersion); | ||||
| 
 | ||||
|     //============================================================================
 | ||||
| @ -1308,14 +1365,13 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV | ||||
|         commonBuiltins.append( | ||||
|             "mediump vec2 unpackHalf2x16(highp uint);" | ||||
|             "\n"); | ||||
|     } | ||||
| #ifndef GLSLANG_WEB | ||||
|     else if (profile != EEsProfile && version >= 420) { | ||||
|     } else if (profile != EEsProfile && version >= 420) { | ||||
|         commonBuiltins.append( | ||||
|             "        vec2 unpackHalf2x16(highp uint);" | ||||
|             "\n"); | ||||
|     } | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|     if ((profile == EEsProfile && version >= 310) || | ||||
|         (profile != EEsProfile && version >= 400)) { | ||||
|         commonBuiltins.append( | ||||
| @ -3804,37 +3860,15 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV | ||||
|     // Prototypes for all control functions.
 | ||||
|     //
 | ||||
|     //============================================================================
 | ||||
| #ifdef GLSLANG_WEB | ||||
|     bool esBarrier = true; | ||||
| #else | ||||
|     bool esBarrier = (profile == EEsProfile && version >= 310); | ||||
| #endif | ||||
|     if ((profile != EEsProfile && version >= 420) || esBarrier) | ||||
|         stageBuiltins[EShLangCompute].append( | ||||
|             "void barrier();" | ||||
|             ); | ||||
|     if ((profile != EEsProfile && version >= 130) || esBarrier) | ||||
|         commonBuiltins.append( | ||||
|             "void memoryBarrier();" | ||||
|             ); | ||||
|     if ((profile != EEsProfile && version >= 420) || esBarrier) { | ||||
|         stageBuiltins[EShLangCompute].append( | ||||
|             "void memoryBarrierShared();" | ||||
|             "void groupMemoryBarrier();" | ||||
|             "void memoryBarrierBuffer();" | ||||
|             ); | ||||
|     } | ||||
| #ifndef GLSLANG_WEB | ||||
|     if ((profile != EEsProfile && version >= 420) || esBarrier) { | ||||
|         commonBuiltins.append( | ||||
|             "void memoryBarrierAtomicCounter();" | ||||
|             "void memoryBarrierImage();" | ||||
|             ); | ||||
|     } | ||||
|     if ((profile != EEsProfile && version >= 150) || esBarrier) | ||||
|         stageBuiltins[EShLangTessControl].append( | ||||
|             "void barrier();" | ||||
|             ); | ||||
|     if ((profile != EEsProfile && version >= 420) || esBarrier) | ||||
|         stageBuiltins[EShLangCompute].append( | ||||
|             "void barrier();" | ||||
|             ); | ||||
|     if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { | ||||
|         stageBuiltins[EShLangMeshNV].append( | ||||
|             "void barrier();" | ||||
| @ -3843,6 +3877,26 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV | ||||
|             "void barrier();" | ||||
|             ); | ||||
|     } | ||||
|     if ((profile != EEsProfile && version >= 130) || esBarrier) | ||||
|         commonBuiltins.append( | ||||
|             "void memoryBarrier();" | ||||
|             ); | ||||
|     if ((profile != EEsProfile && version >= 420) || esBarrier) { | ||||
|         commonBuiltins.append( | ||||
|             "void memoryBarrierBuffer();" | ||||
|             ); | ||||
|         stageBuiltins[EShLangCompute].append( | ||||
|             "void memoryBarrierShared();" | ||||
|             "void groupMemoryBarrier();" | ||||
|             ); | ||||
|     } | ||||
| #ifndef GLSLANG_WEB | ||||
|     if ((profile != EEsProfile && version >= 420) || esBarrier) { | ||||
|         commonBuiltins.append( | ||||
|             "void memoryBarrierAtomicCounter();" | ||||
|             "void memoryBarrierImage();" | ||||
|             ); | ||||
|     } | ||||
|     if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) { | ||||
|         stageBuiltins[EShLangMeshNV].append( | ||||
|             "void memoryBarrierShared();" | ||||
| @ -5329,7 +5383,6 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c | ||||
|             for (int ms = 0; ms <= 1; ++ms) // loop over "bool" multisample or not
 | ||||
| #endif | ||||
|             { | ||||
| #ifndef GLSLANG_WEB | ||||
|                 if ((ms || image) && shadow) | ||||
|                     continue; | ||||
|                 if (ms && profile != EEsProfile && version < 150) | ||||
| @ -5338,7 +5391,6 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c | ||||
|                     continue; | ||||
|                 if (ms && profile == EEsProfile && version < 310) | ||||
|                     continue; | ||||
| #endif | ||||
| 
 | ||||
|                 for (int arrayed = 0; arrayed <= 1; ++arrayed) { // loop over "bool" arrayed or not
 | ||||
| #ifdef GLSLANG_WEB | ||||
| @ -5443,14 +5495,12 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|     //
 | ||||
|     // sparseTexelsResidentARB()
 | ||||
|     //
 | ||||
|     if (profile != EEsProfile && version >= 450) { | ||||
|         commonBuiltins.append("bool sparseTexelsResidentARB(int code);\n"); | ||||
|     } | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| //
 | ||||
| @ -5737,6 +5787,11 @@ void TBuiltIns::addSubpassSampling(TSampler sampler, const TString& typeName, in | ||||
| //
 | ||||
| void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile) | ||||
| { | ||||
| #ifdef GLSLANG_WEB | ||||
|     profile = EEsProfile; | ||||
|     version = 310; | ||||
| #endif | ||||
| 
 | ||||
|     //
 | ||||
|     // texturing
 | ||||
|     //
 | ||||
| @ -6017,6 +6072,11 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, | ||||
| //
 | ||||
| void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile) | ||||
| { | ||||
| #ifdef GLSLANG_WEB | ||||
|     profile = EEsProfile; | ||||
|     version = 310; | ||||
| #endif | ||||
| 
 | ||||
|     switch (sampler.dim) { | ||||
|     case Esd2D: | ||||
|     case EsdRect: | ||||
| @ -6255,6 +6315,11 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in | ||||
| //
 | ||||
| void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language) | ||||
| { | ||||
| #ifdef GLSLANG_WEB | ||||
|     version = 310; | ||||
|     profile = EEsProfile; | ||||
| #endif | ||||
| 
 | ||||
|     //
 | ||||
|     // Initialize the context-dependent (resource-dependent) built-in strings for parsing.
 | ||||
|     //
 | ||||
| @ -6799,6 +6864,11 @@ static void BuiltInVariable(const char* blockName, const char* name, TBuiltInVar | ||||
| //
 | ||||
| void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable) | ||||
| { | ||||
| #ifdef GLSLANG_WEB | ||||
|     version = 310; | ||||
|     profile = EEsProfile; | ||||
| #endif | ||||
| 
 | ||||
|     //
 | ||||
|     // Tag built-in variables and functions with additional qualifier and extension information
 | ||||
|     // that cannot be declared with the text strings.
 | ||||
| @ -7572,8 +7642,16 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
|         BuiltInVariable("gl_LocalInvocationID",     EbvLocalInvocationId,    symbolTable); | ||||
|         BuiltInVariable("gl_GlobalInvocationID",    EbvGlobalInvocationId,   symbolTable); | ||||
|         BuiltInVariable("gl_LocalInvocationIndex",  EbvLocalInvocationIndex, symbolTable); | ||||
|         BuiltInVariable("gl_DeviceIndex",           EbvDeviceIndex,          symbolTable); | ||||
|         BuiltInVariable("gl_ViewIndex",             EbvViewIndex,            symbolTable); | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|         if ((profile != EEsProfile && version >= 140) || | ||||
|             (profile == EEsProfile && version >= 310)) { | ||||
|             symbolTable.setVariableExtensions("gl_DeviceIndex",  1, &E_GL_EXT_device_group); | ||||
|             symbolTable.setVariableExtensions("gl_ViewIndex",    1, &E_GL_EXT_multiview); | ||||
|         } | ||||
| 
 | ||||
|         if (profile != EEsProfile && version < 430) { | ||||
|             symbolTable.setVariableExtensions("gl_NumWorkGroups",        1, &E_GL_ARB_compute_shader); | ||||
|             symbolTable.setVariableExtensions("gl_WorkGroupSize",        1, &E_GL_ARB_compute_shader); | ||||
| @ -7653,17 +7731,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
|             BuiltInVariable("gl_WarpIDNV",              EbvWarpID,          symbolTable); | ||||
|             BuiltInVariable("gl_SMIDNV",                EbvSMID,            symbolTable); | ||||
|         } | ||||
| #endif | ||||
| 
 | ||||
|         if ((profile != EEsProfile && version >= 140) || | ||||
|             (profile == EEsProfile && version >= 310)) { | ||||
|             symbolTable.setVariableExtensions("gl_DeviceIndex",  1, &E_GL_EXT_device_group); | ||||
|             BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable); | ||||
|             symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview); | ||||
|             BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable); | ||||
|         } | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|         // GL_KHR_shader_subgroup
 | ||||
|         if ((profile == EEsProfile && version >= 310) || | ||||
|             (profile != EEsProfile && version >= 140)) { | ||||
| @ -8056,21 +8124,6 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
| 
 | ||||
|     relateTabledBuiltins(version, profile, spvVersion, language, symbolTable); | ||||
| 
 | ||||
|     symbolTable.relateToOperator("matrixCompMult",   EOpMul); | ||||
|     // 120 and 150 are correct for both ES and desktop
 | ||||
|     if (version >= 120) { | ||||
|         symbolTable.relateToOperator("outerProduct", EOpOuterProduct); | ||||
|         symbolTable.relateToOperator("transpose", EOpTranspose); | ||||
|         if (version >= 150) { | ||||
|             symbolTable.relateToOperator("determinant", EOpDeterminant); | ||||
|             symbolTable.relateToOperator("inverse", EOpMatrixInverse); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     symbolTable.relateToOperator("floatBitsToInt",  EOpFloatBitsToInt); | ||||
|     symbolTable.relateToOperator("floatBitsToUint", EOpFloatBitsToUint); | ||||
|     symbolTable.relateToOperator("intBitsToFloat",  EOpIntBitsToFloat); | ||||
|     symbolTable.relateToOperator("uintBitsToFloat", EOpUintBitsToFloat); | ||||
| #ifndef GLSLANG_WEB | ||||
|     symbolTable.relateToOperator("doubleBitsToInt64",  EOpDoubleBitsToInt64); | ||||
|     symbolTable.relateToOperator("doubleBitsToUint64", EOpDoubleBitsToUint64); | ||||
| @ -8085,14 +8138,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
| 
 | ||||
|     symbolTable.relateToOperator("int16BitsToHalf",  EOpInt16BitsToFloat16); | ||||
|     symbolTable.relateToOperator("uint16BitsToHalf", EOpUint16BitsToFloat16); | ||||
| #endif | ||||
| 
 | ||||
|     symbolTable.relateToOperator("packSnorm2x16",   EOpPackSnorm2x16); | ||||
|     symbolTable.relateToOperator("unpackSnorm2x16", EOpUnpackSnorm2x16); | ||||
|     symbolTable.relateToOperator("packUnorm2x16",   EOpPackUnorm2x16); | ||||
|     symbolTable.relateToOperator("unpackUnorm2x16", EOpUnpackUnorm2x16); | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|     symbolTable.relateToOperator("packSnorm4x8",    EOpPackSnorm4x8); | ||||
|     symbolTable.relateToOperator("unpackSnorm4x8",  EOpUnpackSnorm4x8); | ||||
|     symbolTable.relateToOperator("packUnorm4x8",    EOpPackUnorm4x8); | ||||
| @ -8100,21 +8146,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
| 
 | ||||
|     symbolTable.relateToOperator("packDouble2x32",    EOpPackDouble2x32); | ||||
|     symbolTable.relateToOperator("unpackDouble2x32",  EOpUnpackDouble2x32); | ||||
| #endif | ||||
| 
 | ||||
|     symbolTable.relateToOperator("packHalf2x16",    EOpPackHalf2x16); | ||||
|     symbolTable.relateToOperator("unpackHalf2x16",  EOpUnpackHalf2x16); | ||||
| 
 | ||||
|     symbolTable.relateToOperator("packInt2x32",     EOpPackInt2x32); | ||||
|     symbolTable.relateToOperator("unpackInt2x32",   EOpUnpackInt2x32); | ||||
|     symbolTable.relateToOperator("packUint2x32",    EOpPackUint2x32); | ||||
|     symbolTable.relateToOperator("unpackUint2x32",  EOpUnpackUint2x32); | ||||
| 
 | ||||
|     symbolTable.relateToOperator("barrier",                    EOpBarrier); | ||||
|     symbolTable.relateToOperator("memoryBarrier",              EOpMemoryBarrier); | ||||
|     symbolTable.relateToOperator("memoryBarrierBuffer",        EOpMemoryBarrierBuffer); | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|     symbolTable.relateToOperator("packInt2x16",     EOpPackInt2x16); | ||||
|     symbolTable.relateToOperator("unpackInt2x16",   EOpUnpackInt2x16); | ||||
|     symbolTable.relateToOperator("packUint2x16",    EOpPackUint2x16); | ||||
| @ -8179,10 +8216,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
|     symbolTable.relateToOperator("findMSB",           EOpFindMSB); | ||||
| 
 | ||||
|     symbolTable.relateToOperator("helperInvocationEXT",  EOpIsHelperInvocation); | ||||
| #endif | ||||
| 
 | ||||
|     if (PureOperatorBuiltins) { | ||||
| #ifndef GLSLANG_WEB | ||||
|         symbolTable.relateToOperator("imageSize",               EOpImageQuerySize); | ||||
|         symbolTable.relateToOperator("imageSamples",            EOpImageQuerySamples); | ||||
|         symbolTable.relateToOperator("imageLoad",               EOpImageLoad); | ||||
| @ -8200,28 +8235,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
| 
 | ||||
|         symbolTable.relateToOperator("subpassLoad",             EOpSubpassLoad); | ||||
|         symbolTable.relateToOperator("subpassLoadMS",           EOpSubpassLoadMS); | ||||
| #endif | ||||
| 
 | ||||
|         symbolTable.relateToOperator("textureSize",             EOpTextureQuerySize); | ||||
|         symbolTable.relateToOperator("textureQueryLod",         EOpTextureQueryLod); | ||||
|         symbolTable.relateToOperator("textureQueryLevels",      EOpTextureQueryLevels); | ||||
|         symbolTable.relateToOperator("textureSamples",          EOpTextureQuerySamples); | ||||
|         symbolTable.relateToOperator("texture",                 EOpTexture); | ||||
|         symbolTable.relateToOperator("textureProj",             EOpTextureProj); | ||||
|         symbolTable.relateToOperator("textureLod",              EOpTextureLod); | ||||
|         symbolTable.relateToOperator("textureOffset",           EOpTextureOffset); | ||||
|         symbolTable.relateToOperator("texelFetch",              EOpTextureFetch); | ||||
|         symbolTable.relateToOperator("texelFetchOffset",        EOpTextureFetchOffset); | ||||
|         symbolTable.relateToOperator("textureProjOffset",       EOpTextureProjOffset); | ||||
|         symbolTable.relateToOperator("textureLodOffset",        EOpTextureLodOffset); | ||||
|         symbolTable.relateToOperator("textureProjLod",          EOpTextureProjLod); | ||||
|         symbolTable.relateToOperator("textureProjLodOffset",    EOpTextureProjLodOffset); | ||||
|         symbolTable.relateToOperator("textureGrad",             EOpTextureGrad); | ||||
|         symbolTable.relateToOperator("textureGradOffset",       EOpTextureGradOffset); | ||||
|         symbolTable.relateToOperator("textureProjGrad",         EOpTextureProjGrad); | ||||
|         symbolTable.relateToOperator("textureProjGradOffset",   EOpTextureProjGradOffset); | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|         symbolTable.relateToOperator("textureGather",           EOpTextureGather); | ||||
|         symbolTable.relateToOperator("textureGatherOffset",     EOpTextureGatherOffset); | ||||
|         symbolTable.relateToOperator("textureGatherOffsets",    EOpTextureGatherOffsets); | ||||
| @ -8463,11 +8477,9 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
|             symbolTable.relateToOperator("shadow2DEXT",              EOpTexture); | ||||
|             symbolTable.relateToOperator("shadow2DProjEXT",          EOpTextureProj); | ||||
|         } | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     switch(language) { | ||||
| #ifndef GLSLANG_WEB | ||||
|     case EShLangVertex: | ||||
|         break; | ||||
| 
 | ||||
| @ -8502,12 +8514,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
|         symbolTable.relateToOperator("endInvocationInterlockARB",   EOpEndInvocationInterlock); | ||||
| 
 | ||||
|         break; | ||||
| #endif | ||||
| 
 | ||||
|     case EShLangCompute: | ||||
|         symbolTable.relateToOperator("memoryBarrierShared",         EOpMemoryBarrierShared); | ||||
|         symbolTable.relateToOperator("groupMemoryBarrier",          EOpGroupMemoryBarrier); | ||||
| #ifndef GLSLANG_WEB | ||||
|         symbolTable.relateToOperator("subgroupMemoryBarrierShared", EOpSubgroupMemoryBarrierShared); | ||||
|         if ((profile != EEsProfile && version >= 450) || | ||||
|             (profile == EEsProfile && version >= 320)) { | ||||
| @ -8524,10 +8532,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
|         symbolTable.relateToOperator("coopMatLoadNV",              EOpCooperativeMatrixLoad); | ||||
|         symbolTable.relateToOperator("coopMatStoreNV",             EOpCooperativeMatrixStore); | ||||
|         symbolTable.relateToOperator("coopMatMulAddNV",            EOpCooperativeMatrixMulAdd); | ||||
| #endif | ||||
|         break; | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|     case EShLangRayGenNV: | ||||
|     case EShLangClosestHitNV: | ||||
|     case EShLangMissNV: | ||||
| @ -8566,8 +8572,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion | ||||
| 
 | ||||
|     default: | ||||
|         assert(false && "Language not supported"); | ||||
| #endif | ||||
|     } | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| //
 | ||||
|  | ||||
| @ -801,10 +801,8 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped | ||||
|     //
 | ||||
|     // Add a new newNode for the conversion.
 | ||||
|     //
 | ||||
|     TIntermUnary* newNode = nullptr; | ||||
| 
 | ||||
|     TOperator newOp = EOpNull; | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|     bool convertToIntTypes = (convertTo == EbtInt8  || convertTo == EbtUint8  || | ||||
|                               convertTo == EbtInt16 || convertTo == EbtUint16 || | ||||
|                               convertTo == EbtInt   || convertTo == EbtUint   || | ||||
| @ -838,7 +836,10 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped | ||||
|             (node->getBasicType() == EbtFloat16 && ! convertToFloatTypes)) | ||||
|             return nullptr; | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     TIntermUnary* newNode = nullptr; | ||||
|     TOperator newOp = EOpNull; | ||||
|     if (!buildConvertOp(convertTo, node->getBasicType(), newOp)) { | ||||
|         return nullptr; | ||||
|     } | ||||
| @ -847,11 +848,14 @@ TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped | ||||
|     newNode = addUnaryNode(newOp, node, node->getLoc(), newType); | ||||
| 
 | ||||
|     if (node->getAsConstantUnion()) { | ||||
| #ifndef GLSLANG_WEB | ||||
|         // 8/16-bit storage extensions don't support 8/16-bit constants, so don't fold conversions
 | ||||
|         // to those types
 | ||||
|         if ((getArithemeticInt8Enabled() || !(convertTo == EbtInt8 || convertTo == EbtUint8)) && | ||||
|             (getArithemeticInt16Enabled() || !(convertTo == EbtInt16 || convertTo == EbtUint16)) && | ||||
|             (getArithemeticFloat16Enabled() || !(convertTo == EbtFloat16))) { | ||||
|             (getArithemeticFloat16Enabled() || !(convertTo == EbtFloat16))) | ||||
| #endif | ||||
|         { | ||||
|             TIntermTyped* folded = node->getAsConstantUnion()->fold(newOp, newType); | ||||
|             if (folded) | ||||
|                 return folded; | ||||
|  | ||||
| @ -1160,6 +1160,7 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction | ||||
|                     const TQualifier& argQualifier = argType.getQualifier(); | ||||
|                     if (argQualifier.isMemory() && (argType.containsOpaque() || argType.isReference())) { | ||||
|                         const char* message = "argument cannot drop memory qualifier when passed to formal parameter"; | ||||
| #ifndef GLSLANG_WEB | ||||
|                         if (argQualifier.volatil && ! formalQualifier.volatil) | ||||
|                             error(arguments->getLoc(), message, "volatile", ""); | ||||
|                         if (argQualifier.coherent && ! (formalQualifier.devicecoherent || formalQualifier.coherent)) | ||||
| @ -1179,6 +1180,7 @@ TIntermTyped* TParseContext::handleFunctionCall(const TSourceLoc& loc, TFunction | ||||
|                         // Don't check 'restrict', it is different than the rest:
 | ||||
|                         // "...but only restrict can be taken away from a calling argument, by a formal parameter that
 | ||||
|                         // lacks the restrict qualifier..."
 | ||||
| #endif | ||||
|                     } | ||||
|                     if (!builtIn && argQualifier.getFormat() != formalQualifier.getFormat()) { | ||||
|                         // we have mismatched formats, which should only be allowed if writeonly
 | ||||
| @ -2201,7 +2203,7 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     if (callNode.getOp() > EOpSubgroupGuardStart && callNode.getOp() < EOpSubgroupGuardStop) { | ||||
|     if (callNode.isSubgroup()) { | ||||
|         // these require SPIR-V 1.3
 | ||||
|         if (spvVersion.spv > 0 && spvVersion.spv < EShTargetSpv_1_3) | ||||
|             error(loc, "requires SPIR-V 1.3", "subgroup op", ""); | ||||
| @ -2779,6 +2781,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T | ||||
|     // it, in which case the type comes from the argument instead of from the
 | ||||
|     // constructor function.
 | ||||
|     switch (op) { | ||||
| #ifndef GLSLANG_WEB | ||||
|     case EOpConstructNonuniform: | ||||
|         if (node != nullptr && node->getAsTyped() != nullptr) { | ||||
|             type.shallowCopy(node->getAsTyped()->getType()); | ||||
| @ -2786,6 +2789,7 @@ bool TParseContext::constructorError(const TSourceLoc& loc, TIntermNode* node, T | ||||
|             type.getQualifier().nonUniform = true; | ||||
|         } | ||||
|         break; | ||||
| #endif | ||||
|     default: | ||||
|         type.shallowCopy(function.getType()); | ||||
|         break; | ||||
| @ -4475,6 +4479,7 @@ void TParseContext::paramCheckFixStorage(const TSourceLoc& loc, const TStorageQu | ||||
| 
 | ||||
| void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& qualifier, TType& type) | ||||
| { | ||||
| #ifndef GLSLANG_WEB | ||||
|     if (qualifier.isMemory()) { | ||||
|         type.getQualifier().volatil   = qualifier.volatil; | ||||
|         type.getQualifier().coherent  = qualifier.coherent; | ||||
| @ -4487,6 +4492,7 @@ void TParseContext::paramCheckFix(const TSourceLoc& loc, const TQualifier& quali | ||||
|         type.getQualifier().writeonly = qualifier.writeonly; | ||||
|         type.getQualifier().restrict  = qualifier.restrict; | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     if (qualifier.isAuxiliary() || | ||||
|         qualifier.isInterpolation()) | ||||
| @ -5387,9 +5393,7 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi | ||||
| #ifndef GLSLANG_WEB | ||||
|             if (language == EShLangMeshNV || language == EShLangTaskNV) { | ||||
|                 requireExtensions(loc, 1, &E_GL_NV_mesh_shader, "gl_WorkGroupSize"); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|             } else { | ||||
|                 profileRequires(loc, EEsProfile, 310, 0, "gl_WorkGroupSize"); | ||||
|                 profileRequires(loc, ~EEsProfile, 430, E_GL_ARB_compute_shader, "gl_WorkGroupSize"); | ||||
|             } | ||||
| @ -7382,6 +7386,7 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con | ||||
|     for (unsigned int member = 0; member < typeList.size(); ++member) { | ||||
|         TQualifier& memberQualifier = typeList[member].type->getQualifier(); | ||||
|         const TSourceLoc& memberLoc = typeList[member].loc; | ||||
| #ifndef GLSLANG_WEB | ||||
|         if (memberQualifier.hasStream()) { | ||||
|             if (defaultQualification.layoutStream != memberQualifier.layoutStream) | ||||
|                 error(memberLoc, "member cannot contradict block", "stream", ""); | ||||
| @ -7395,6 +7400,7 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con | ||||
|             if (defaultQualification.layoutXfbBuffer != memberQualifier.layoutXfbBuffer) | ||||
|                 error(memberLoc, "member cannot contradict block (or what block inherited from global)", "xfb_buffer", ""); | ||||
|         } | ||||
| #endif | ||||
| 
 | ||||
|         if (memberQualifier.hasPacking()) | ||||
|             error(memberLoc, "member of block cannot have a packing layout qualifier", typeList[member].type->getFieldName().c_str(), ""); | ||||
| @ -7437,6 +7443,7 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con | ||||
| 
 | ||||
|     layoutMemberLocationArrayCheck(loc, memberWithLocation, arraySizes); | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|     // Ensure that the block has an XfbBuffer assigned. This is needed
 | ||||
|     // because if the block has a XfbOffset assigned, then it is
 | ||||
|     // assumed that it has implicitly assigned the current global
 | ||||
| @ -7446,6 +7453,7 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con | ||||
|        if (!currentBlockQualifier.hasXfbBuffer() && currentBlockQualifier.hasXfbOffset()) | ||||
|           currentBlockQualifier.layoutXfbBuffer = globalOutputDefaults.layoutXfbBuffer; | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     // Process the members
 | ||||
|     fixBlockLocations(loc, currentBlockQualifier, typeList, memberWithLocation, memberWithoutLocation); | ||||
|  | ||||
| @ -288,6 +288,11 @@ void InitializeStageSymbolTable(TBuiltInParseables& builtInParseables, int versi | ||||
|                                 EShLanguage language, EShSource source, TInfoSink& infoSink, TSymbolTable** commonTable, | ||||
|                                 TSymbolTable** symbolTables) | ||||
| { | ||||
| #ifdef GLSLANG_WEB | ||||
|     profile = EEsProfile; | ||||
|     version = 310; | ||||
| #endif | ||||
| 
 | ||||
|     (*symbolTables[language]).adoptLevels(*commonTable[CommonIndex(profile, language)]); | ||||
|     InitializeSymbolTable(builtInParseables.getStageString(language), version, profile, spvVersion, language, source, | ||||
|                           infoSink, *symbolTables[language]); | ||||
| @ -304,6 +309,11 @@ void InitializeStageSymbolTable(TBuiltInParseables& builtInParseables, int versi | ||||
| //
 | ||||
| bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable,  TSymbolTable** symbolTables, int version, EProfile profile, const SpvVersion& spvVersion, EShSource source) | ||||
| { | ||||
| #ifdef GLSLANG_WEB | ||||
|     profile = EEsProfile; | ||||
|     version = 310; | ||||
| #endif | ||||
| 
 | ||||
|     std::unique_ptr<TBuiltInParseables> builtInParseables(CreateBuiltInParseables(infoSink, source)); | ||||
| 
 | ||||
|     if (builtInParseables == nullptr) | ||||
| @ -349,7 +359,6 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable,  TS | ||||
|         InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangCompute, source, | ||||
|                                    infoSink, commonTable, symbolTables); | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|     // check for ray tracing stages
 | ||||
|     if (profile != EEsProfile && version >= 450) { | ||||
|         InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangRayGenNV, source, | ||||
| @ -377,7 +386,6 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable,  TS | ||||
|         (profile == EEsProfile && version >= 320)) | ||||
|         InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangTaskNV, source, | ||||
|                                    infoSink, commonTable, symbolTables); | ||||
| #endif | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| @ -873,6 +881,11 @@ bool ProcessDeferred( | ||||
| 
 | ||||
|     bool goodVersion = DeduceVersionProfile(compiler->infoSink, stage, | ||||
|                                             versionNotFirst, defaultVersion, source, version, profile, spvVersion); | ||||
| #ifdef GLSLANG_WEB | ||||
|     profile = EEsProfile; | ||||
|     version = 310; | ||||
| #endif | ||||
| 
 | ||||
|     bool versionWillBeError = (versionNotFound || (profile == EEsProfile && version >= 300 && versionNotFirst)); | ||||
| #ifndef GLSLANG_WEB | ||||
|     bool warnVersionNotFirst = false; | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -103,89 +103,356 @@ extern int yydebug; | ||||
|     UTEXTURE3D = 313, | ||||
|     UTEXTURECUBE = 314, | ||||
|     UTEXTURE2DARRAY = 315, | ||||
|     LEFT_OP = 316, | ||||
|     RIGHT_OP = 317, | ||||
|     INC_OP = 318, | ||||
|     DEC_OP = 319, | ||||
|     LE_OP = 320, | ||||
|     GE_OP = 321, | ||||
|     EQ_OP = 322, | ||||
|     NE_OP = 323, | ||||
|     AND_OP = 324, | ||||
|     OR_OP = 325, | ||||
|     XOR_OP = 326, | ||||
|     MUL_ASSIGN = 327, | ||||
|     DIV_ASSIGN = 328, | ||||
|     ADD_ASSIGN = 329, | ||||
|     MOD_ASSIGN = 330, | ||||
|     LEFT_ASSIGN = 331, | ||||
|     RIGHT_ASSIGN = 332, | ||||
|     AND_ASSIGN = 333, | ||||
|     XOR_ASSIGN = 334, | ||||
|     OR_ASSIGN = 335, | ||||
|     SUB_ASSIGN = 336, | ||||
|     LEFT_PAREN = 337, | ||||
|     RIGHT_PAREN = 338, | ||||
|     LEFT_BRACKET = 339, | ||||
|     RIGHT_BRACKET = 340, | ||||
|     LEFT_BRACE = 341, | ||||
|     RIGHT_BRACE = 342, | ||||
|     DOT = 343, | ||||
|     COMMA = 344, | ||||
|     COLON = 345, | ||||
|     EQUAL = 346, | ||||
|     SEMICOLON = 347, | ||||
|     BANG = 348, | ||||
|     DASH = 349, | ||||
|     TILDE = 350, | ||||
|     PLUS = 351, | ||||
|     STAR = 352, | ||||
|     SLASH = 353, | ||||
|     PERCENT = 354, | ||||
|     LEFT_ANGLE = 355, | ||||
|     RIGHT_ANGLE = 356, | ||||
|     VERTICAL_BAR = 357, | ||||
|     CARET = 358, | ||||
|     AMPERSAND = 359, | ||||
|     QUESTION = 360, | ||||
|     INVARIANT = 361, | ||||
|     HIGH_PRECISION = 362, | ||||
|     MEDIUM_PRECISION = 363, | ||||
|     LOW_PRECISION = 364, | ||||
|     PRECISION = 365, | ||||
|     PACKED = 366, | ||||
|     RESOURCE = 367, | ||||
|     SUPERP = 368, | ||||
|     FLOATCONSTANT = 369, | ||||
|     INTCONSTANT = 370, | ||||
|     UINTCONSTANT = 371, | ||||
|     BOOLCONSTANT = 372, | ||||
|     IDENTIFIER = 373, | ||||
|     TYPE_NAME = 374, | ||||
|     CENTROID = 375, | ||||
|     IN = 376, | ||||
|     OUT = 377, | ||||
|     INOUT = 378, | ||||
|     STRUCT = 379, | ||||
|     VOID = 380, | ||||
|     WHILE = 381, | ||||
|     BREAK = 382, | ||||
|     CONTINUE = 383, | ||||
|     DO = 384, | ||||
|     ELSE = 385, | ||||
|     FOR = 386, | ||||
|     IF = 387, | ||||
|     DISCARD = 388, | ||||
|     RETURN = 389, | ||||
|     SWITCH = 390, | ||||
|     CASE = 391, | ||||
|     DEFAULT = 392, | ||||
|     UNIFORM = 393, | ||||
|     SHARED = 394, | ||||
|     BUFFER = 395, | ||||
|     FLAT = 396, | ||||
|     SMOOTH = 397, | ||||
|     LAYOUT = 398 | ||||
|     ATTRIBUTE = 316, | ||||
|     VARYING = 317, | ||||
|     FLOAT16_T = 318, | ||||
|     FLOAT32_T = 319, | ||||
|     DOUBLE = 320, | ||||
|     FLOAT64_T = 321, | ||||
|     INT64_T = 322, | ||||
|     UINT64_T = 323, | ||||
|     INT32_T = 324, | ||||
|     UINT32_T = 325, | ||||
|     INT16_T = 326, | ||||
|     UINT16_T = 327, | ||||
|     INT8_T = 328, | ||||
|     UINT8_T = 329, | ||||
|     I64VEC2 = 330, | ||||
|     I64VEC3 = 331, | ||||
|     I64VEC4 = 332, | ||||
|     U64VEC2 = 333, | ||||
|     U64VEC3 = 334, | ||||
|     U64VEC4 = 335, | ||||
|     I32VEC2 = 336, | ||||
|     I32VEC3 = 337, | ||||
|     I32VEC4 = 338, | ||||
|     U32VEC2 = 339, | ||||
|     U32VEC3 = 340, | ||||
|     U32VEC4 = 341, | ||||
|     I16VEC2 = 342, | ||||
|     I16VEC3 = 343, | ||||
|     I16VEC4 = 344, | ||||
|     U16VEC2 = 345, | ||||
|     U16VEC3 = 346, | ||||
|     U16VEC4 = 347, | ||||
|     I8VEC2 = 348, | ||||
|     I8VEC3 = 349, | ||||
|     I8VEC4 = 350, | ||||
|     U8VEC2 = 351, | ||||
|     U8VEC3 = 352, | ||||
|     U8VEC4 = 353, | ||||
|     DVEC2 = 354, | ||||
|     DVEC3 = 355, | ||||
|     DVEC4 = 356, | ||||
|     DMAT2 = 357, | ||||
|     DMAT3 = 358, | ||||
|     DMAT4 = 359, | ||||
|     F16VEC2 = 360, | ||||
|     F16VEC3 = 361, | ||||
|     F16VEC4 = 362, | ||||
|     F16MAT2 = 363, | ||||
|     F16MAT3 = 364, | ||||
|     F16MAT4 = 365, | ||||
|     F32VEC2 = 366, | ||||
|     F32VEC3 = 367, | ||||
|     F32VEC4 = 368, | ||||
|     F32MAT2 = 369, | ||||
|     F32MAT3 = 370, | ||||
|     F32MAT4 = 371, | ||||
|     F64VEC2 = 372, | ||||
|     F64VEC3 = 373, | ||||
|     F64VEC4 = 374, | ||||
|     F64MAT2 = 375, | ||||
|     F64MAT3 = 376, | ||||
|     F64MAT4 = 377, | ||||
|     DMAT2X2 = 378, | ||||
|     DMAT2X3 = 379, | ||||
|     DMAT2X4 = 380, | ||||
|     DMAT3X2 = 381, | ||||
|     DMAT3X3 = 382, | ||||
|     DMAT3X4 = 383, | ||||
|     DMAT4X2 = 384, | ||||
|     DMAT4X3 = 385, | ||||
|     DMAT4X4 = 386, | ||||
|     F16MAT2X2 = 387, | ||||
|     F16MAT2X3 = 388, | ||||
|     F16MAT2X4 = 389, | ||||
|     F16MAT3X2 = 390, | ||||
|     F16MAT3X3 = 391, | ||||
|     F16MAT3X4 = 392, | ||||
|     F16MAT4X2 = 393, | ||||
|     F16MAT4X3 = 394, | ||||
|     F16MAT4X4 = 395, | ||||
|     F32MAT2X2 = 396, | ||||
|     F32MAT2X3 = 397, | ||||
|     F32MAT2X4 = 398, | ||||
|     F32MAT3X2 = 399, | ||||
|     F32MAT3X3 = 400, | ||||
|     F32MAT3X4 = 401, | ||||
|     F32MAT4X2 = 402, | ||||
|     F32MAT4X3 = 403, | ||||
|     F32MAT4X4 = 404, | ||||
|     F64MAT2X2 = 405, | ||||
|     F64MAT2X3 = 406, | ||||
|     F64MAT2X4 = 407, | ||||
|     F64MAT3X2 = 408, | ||||
|     F64MAT3X3 = 409, | ||||
|     F64MAT3X4 = 410, | ||||
|     F64MAT4X2 = 411, | ||||
|     F64MAT4X3 = 412, | ||||
|     F64MAT4X4 = 413, | ||||
|     ATOMIC_UINT = 414, | ||||
|     ACCSTRUCTNV = 415, | ||||
|     FCOOPMATNV = 416, | ||||
|     ICOOPMATNV = 417, | ||||
|     UCOOPMATNV = 418, | ||||
|     SAMPLERCUBEARRAY = 419, | ||||
|     SAMPLERCUBEARRAYSHADOW = 420, | ||||
|     ISAMPLERCUBEARRAY = 421, | ||||
|     USAMPLERCUBEARRAY = 422, | ||||
|     SAMPLER1D = 423, | ||||
|     SAMPLER1DARRAY = 424, | ||||
|     SAMPLER1DARRAYSHADOW = 425, | ||||
|     ISAMPLER1D = 426, | ||||
|     SAMPLER1DSHADOW = 427, | ||||
|     SAMPLER2DRECT = 428, | ||||
|     SAMPLER2DRECTSHADOW = 429, | ||||
|     ISAMPLER2DRECT = 430, | ||||
|     USAMPLER2DRECT = 431, | ||||
|     SAMPLERBUFFER = 432, | ||||
|     ISAMPLERBUFFER = 433, | ||||
|     USAMPLERBUFFER = 434, | ||||
|     SAMPLER2DMS = 435, | ||||
|     ISAMPLER2DMS = 436, | ||||
|     USAMPLER2DMS = 437, | ||||
|     SAMPLER2DMSARRAY = 438, | ||||
|     ISAMPLER2DMSARRAY = 439, | ||||
|     USAMPLER2DMSARRAY = 440, | ||||
|     SAMPLEREXTERNALOES = 441, | ||||
|     SAMPLEREXTERNAL2DY2YEXT = 442, | ||||
|     ISAMPLER1DARRAY = 443, | ||||
|     USAMPLER1D = 444, | ||||
|     USAMPLER1DARRAY = 445, | ||||
|     F16SAMPLER1D = 446, | ||||
|     F16SAMPLER2D = 447, | ||||
|     F16SAMPLER3D = 448, | ||||
|     F16SAMPLER2DRECT = 449, | ||||
|     F16SAMPLERCUBE = 450, | ||||
|     F16SAMPLER1DARRAY = 451, | ||||
|     F16SAMPLER2DARRAY = 452, | ||||
|     F16SAMPLERCUBEARRAY = 453, | ||||
|     F16SAMPLERBUFFER = 454, | ||||
|     F16SAMPLER2DMS = 455, | ||||
|     F16SAMPLER2DMSARRAY = 456, | ||||
|     F16SAMPLER1DSHADOW = 457, | ||||
|     F16SAMPLER2DSHADOW = 458, | ||||
|     F16SAMPLER1DARRAYSHADOW = 459, | ||||
|     F16SAMPLER2DARRAYSHADOW = 460, | ||||
|     F16SAMPLER2DRECTSHADOW = 461, | ||||
|     F16SAMPLERCUBESHADOW = 462, | ||||
|     F16SAMPLERCUBEARRAYSHADOW = 463, | ||||
|     IMAGE1D = 464, | ||||
|     IIMAGE1D = 465, | ||||
|     UIMAGE1D = 466, | ||||
|     IMAGE2D = 467, | ||||
|     IIMAGE2D = 468, | ||||
|     UIMAGE2D = 469, | ||||
|     IMAGE3D = 470, | ||||
|     IIMAGE3D = 471, | ||||
|     UIMAGE3D = 472, | ||||
|     IMAGE2DRECT = 473, | ||||
|     IIMAGE2DRECT = 474, | ||||
|     UIMAGE2DRECT = 475, | ||||
|     IMAGECUBE = 476, | ||||
|     IIMAGECUBE = 477, | ||||
|     UIMAGECUBE = 478, | ||||
|     IMAGEBUFFER = 479, | ||||
|     IIMAGEBUFFER = 480, | ||||
|     UIMAGEBUFFER = 481, | ||||
|     IMAGE1DARRAY = 482, | ||||
|     IIMAGE1DARRAY = 483, | ||||
|     UIMAGE1DARRAY = 484, | ||||
|     IMAGE2DARRAY = 485, | ||||
|     IIMAGE2DARRAY = 486, | ||||
|     UIMAGE2DARRAY = 487, | ||||
|     IMAGECUBEARRAY = 488, | ||||
|     IIMAGECUBEARRAY = 489, | ||||
|     UIMAGECUBEARRAY = 490, | ||||
|     IMAGE2DMS = 491, | ||||
|     IIMAGE2DMS = 492, | ||||
|     UIMAGE2DMS = 493, | ||||
|     IMAGE2DMSARRAY = 494, | ||||
|     IIMAGE2DMSARRAY = 495, | ||||
|     UIMAGE2DMSARRAY = 496, | ||||
|     F16IMAGE1D = 497, | ||||
|     F16IMAGE2D = 498, | ||||
|     F16IMAGE3D = 499, | ||||
|     F16IMAGE2DRECT = 500, | ||||
|     F16IMAGECUBE = 501, | ||||
|     F16IMAGE1DARRAY = 502, | ||||
|     F16IMAGE2DARRAY = 503, | ||||
|     F16IMAGECUBEARRAY = 504, | ||||
|     F16IMAGEBUFFER = 505, | ||||
|     F16IMAGE2DMS = 506, | ||||
|     F16IMAGE2DMSARRAY = 507, | ||||
|     TEXTURECUBEARRAY = 508, | ||||
|     ITEXTURECUBEARRAY = 509, | ||||
|     UTEXTURECUBEARRAY = 510, | ||||
|     TEXTURE1D = 511, | ||||
|     ITEXTURE1D = 512, | ||||
|     UTEXTURE1D = 513, | ||||
|     TEXTURE1DARRAY = 514, | ||||
|     ITEXTURE1DARRAY = 515, | ||||
|     UTEXTURE1DARRAY = 516, | ||||
|     TEXTURE2DRECT = 517, | ||||
|     ITEXTURE2DRECT = 518, | ||||
|     UTEXTURE2DRECT = 519, | ||||
|     TEXTUREBUFFER = 520, | ||||
|     ITEXTUREBUFFER = 521, | ||||
|     UTEXTUREBUFFER = 522, | ||||
|     TEXTURE2DMS = 523, | ||||
|     ITEXTURE2DMS = 524, | ||||
|     UTEXTURE2DMS = 525, | ||||
|     TEXTURE2DMSARRAY = 526, | ||||
|     ITEXTURE2DMSARRAY = 527, | ||||
|     UTEXTURE2DMSARRAY = 528, | ||||
|     F16TEXTURE1D = 529, | ||||
|     F16TEXTURE2D = 530, | ||||
|     F16TEXTURE3D = 531, | ||||
|     F16TEXTURE2DRECT = 532, | ||||
|     F16TEXTURECUBE = 533, | ||||
|     F16TEXTURE1DARRAY = 534, | ||||
|     F16TEXTURE2DARRAY = 535, | ||||
|     F16TEXTURECUBEARRAY = 536, | ||||
|     F16TEXTUREBUFFER = 537, | ||||
|     F16TEXTURE2DMS = 538, | ||||
|     F16TEXTURE2DMSARRAY = 539, | ||||
|     SUBPASSINPUT = 540, | ||||
|     SUBPASSINPUTMS = 541, | ||||
|     ISUBPASSINPUT = 542, | ||||
|     ISUBPASSINPUTMS = 543, | ||||
|     USUBPASSINPUT = 544, | ||||
|     USUBPASSINPUTMS = 545, | ||||
|     F16SUBPASSINPUT = 546, | ||||
|     F16SUBPASSINPUTMS = 547, | ||||
|     LEFT_OP = 548, | ||||
|     RIGHT_OP = 549, | ||||
|     INC_OP = 550, | ||||
|     DEC_OP = 551, | ||||
|     LE_OP = 552, | ||||
|     GE_OP = 553, | ||||
|     EQ_OP = 554, | ||||
|     NE_OP = 555, | ||||
|     AND_OP = 556, | ||||
|     OR_OP = 557, | ||||
|     XOR_OP = 558, | ||||
|     MUL_ASSIGN = 559, | ||||
|     DIV_ASSIGN = 560, | ||||
|     ADD_ASSIGN = 561, | ||||
|     MOD_ASSIGN = 562, | ||||
|     LEFT_ASSIGN = 563, | ||||
|     RIGHT_ASSIGN = 564, | ||||
|     AND_ASSIGN = 565, | ||||
|     XOR_ASSIGN = 566, | ||||
|     OR_ASSIGN = 567, | ||||
|     SUB_ASSIGN = 568, | ||||
|     LEFT_PAREN = 569, | ||||
|     RIGHT_PAREN = 570, | ||||
|     LEFT_BRACKET = 571, | ||||
|     RIGHT_BRACKET = 572, | ||||
|     LEFT_BRACE = 573, | ||||
|     RIGHT_BRACE = 574, | ||||
|     DOT = 575, | ||||
|     COMMA = 576, | ||||
|     COLON = 577, | ||||
|     EQUAL = 578, | ||||
|     SEMICOLON = 579, | ||||
|     BANG = 580, | ||||
|     DASH = 581, | ||||
|     TILDE = 582, | ||||
|     PLUS = 583, | ||||
|     STAR = 584, | ||||
|     SLASH = 585, | ||||
|     PERCENT = 586, | ||||
|     LEFT_ANGLE = 587, | ||||
|     RIGHT_ANGLE = 588, | ||||
|     VERTICAL_BAR = 589, | ||||
|     CARET = 590, | ||||
|     AMPERSAND = 591, | ||||
|     QUESTION = 592, | ||||
|     INVARIANT = 593, | ||||
|     HIGH_PRECISION = 594, | ||||
|     MEDIUM_PRECISION = 595, | ||||
|     LOW_PRECISION = 596, | ||||
|     PRECISION = 597, | ||||
|     PACKED = 598, | ||||
|     RESOURCE = 599, | ||||
|     SUPERP = 600, | ||||
|     FLOATCONSTANT = 601, | ||||
|     INTCONSTANT = 602, | ||||
|     UINTCONSTANT = 603, | ||||
|     BOOLCONSTANT = 604, | ||||
|     IDENTIFIER = 605, | ||||
|     TYPE_NAME = 606, | ||||
|     CENTROID = 607, | ||||
|     IN = 608, | ||||
|     OUT = 609, | ||||
|     INOUT = 610, | ||||
|     STRUCT = 611, | ||||
|     VOID = 612, | ||||
|     WHILE = 613, | ||||
|     BREAK = 614, | ||||
|     CONTINUE = 615, | ||||
|     DO = 616, | ||||
|     ELSE = 617, | ||||
|     FOR = 618, | ||||
|     IF = 619, | ||||
|     DISCARD = 620, | ||||
|     RETURN = 621, | ||||
|     SWITCH = 622, | ||||
|     CASE = 623, | ||||
|     DEFAULT = 624, | ||||
|     UNIFORM = 625, | ||||
|     SHARED = 626, | ||||
|     BUFFER = 627, | ||||
|     FLAT = 628, | ||||
|     SMOOTH = 629, | ||||
|     LAYOUT = 630, | ||||
|     DOUBLECONSTANT = 631, | ||||
|     INT16CONSTANT = 632, | ||||
|     UINT16CONSTANT = 633, | ||||
|     FLOAT16CONSTANT = 634, | ||||
|     INT32CONSTANT = 635, | ||||
|     UINT32CONSTANT = 636, | ||||
|     INT64CONSTANT = 637, | ||||
|     UINT64CONSTANT = 638, | ||||
|     SUBROUTINE = 639, | ||||
|     DEMOTE = 640, | ||||
|     PAYLOADNV = 641, | ||||
|     PAYLOADINNV = 642, | ||||
|     HITATTRNV = 643, | ||||
|     CALLDATANV = 644, | ||||
|     CALLDATAINNV = 645, | ||||
|     PATCH = 646, | ||||
|     SAMPLE = 647, | ||||
|     NONUNIFORM = 648, | ||||
|     COHERENT = 649, | ||||
|     VOLATILE = 650, | ||||
|     RESTRICT = 651, | ||||
|     READONLY = 652, | ||||
|     WRITEONLY = 653, | ||||
|     DEVICECOHERENT = 654, | ||||
|     QUEUEFAMILYCOHERENT = 655, | ||||
|     WORKGROUPCOHERENT = 656, | ||||
|     SUBGROUPCOHERENT = 657, | ||||
|     NONPRIVATE = 658, | ||||
|     NOPERSPECTIVE = 659, | ||||
|     EXPLICITINTERPAMD = 660, | ||||
|     PERVERTEXNV = 661, | ||||
|     PERPRIMITIVENV = 662, | ||||
|     PERVIEWNV = 663, | ||||
|     PERTASKNV = 664, | ||||
|     PRECISE = 665 | ||||
|   }; | ||||
| #endif | ||||
| 
 | ||||
| @ -230,7 +497,7 @@ union YYSTYPE | ||||
|         glslang::TArraySizes* typeParameters; | ||||
|     } interm; | ||||
| 
 | ||||
| #line 234 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909  */ | ||||
| #line 501 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909  */ | ||||
| }; | ||||
| 
 | ||||
| typedef union YYSTYPE YYSTYPE; | ||||
|  | ||||
| @ -496,6 +496,7 @@ void TIntermediate::mergeImplicitArraySizes(TType& type, const TType& unitType) | ||||
| //
 | ||||
| void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& symbol, const TIntermSymbol& unitSymbol, bool crossStage) | ||||
| { | ||||
| #ifndef GLSLANG_WEB | ||||
|     bool writeTypeComparison = false; | ||||
| 
 | ||||
|     // Types have to match
 | ||||
| @ -546,7 +547,6 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy | ||||
|         writeTypeComparison = true; | ||||
|     } | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
|     // Memory...
 | ||||
|     if (symbol.getQualifier().coherent          != unitSymbol.getQualifier().coherent || | ||||
|         symbol.getQualifier().devicecoherent    != unitSymbol.getQualifier().devicecoherent || | ||||
| @ -561,7 +561,6 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy | ||||
|         error(infoSink, "Memory qualifiers must match:"); | ||||
|         writeTypeComparison = true; | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     // Layouts...
 | ||||
|     // TODO: 4.4 enhanced layouts: Generalize to include offset/align: current spec
 | ||||
| @ -591,6 +590,7 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy | ||||
|     if (writeTypeComparison) | ||||
|         infoSink.info << "    " << symbol.getName() << ": \"" << symbol.getType().getCompleteString() << "\" versus \"" << | ||||
|                                                              unitSymbol.getType().getCompleteString() << "\"\n"; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| //
 | ||||
| @ -1095,7 +1095,7 @@ int TIntermediate::addUsedLocation(const TQualifier& qualifier, const TType& typ | ||||
|         } | ||||
| 
 | ||||
|         // combine location and component ranges
 | ||||
|         TIoRange range(locationRange, componentRange, type.getBasicType(), qualifier.hasIndex() ? qualifier.layoutIndex : 0); | ||||
|         TIoRange range(locationRange, componentRange, type.getBasicType(), qualifier.hasIndex() ? qualifier.getIndex() : 0); | ||||
| 
 | ||||
|         // check for collisions, except for vertex inputs on desktop targeting OpenGL
 | ||||
|         if (! (!isEsProfile() && language == EShLangVertex && qualifier.isPipeInput()) || spvVersion.vulkan > 0) | ||||
|  | ||||
| @ -147,6 +147,7 @@ struct TOffsetRange { | ||||
|     TRange offset; | ||||
| }; | ||||
| 
 | ||||
| #ifndef GLSLANG_WEB | ||||
| // Things that need to be tracked per xfb buffer.
 | ||||
| struct TXfbBuffer { | ||||
|     TXfbBuffer() : stride(TQualifier::layoutXfbStrideEnd), implicitStride(0), contains64BitType(false), | ||||
| @ -158,6 +159,7 @@ struct TXfbBuffer { | ||||
|     bool contains32BitType; | ||||
|     bool contains16BitType; | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| // Track a set of strings describing how the module was processed.
 | ||||
| // Using the form:
 | ||||
| @ -465,7 +467,23 @@ public: | ||||
|     bool usingStorageBuffer() const { return useStorageBuffer; } | ||||
|     void setDepthReplacing() { depthReplacing = true; } | ||||
|     bool isDepthReplacing() const { return depthReplacing; } | ||||
| 
 | ||||
|     bool setLocalSize(int dim, int size) | ||||
|     { | ||||
|         if (localSizeNotDefault[dim]) | ||||
|             return size == localSize[dim]; | ||||
|         localSizeNotDefault[dim] = true; | ||||
|         localSize[dim] = size; | ||||
|         return true; | ||||
|     } | ||||
|     unsigned int getLocalSize(int dim) const { return localSize[dim]; } | ||||
|     bool setLocalSizeSpecId(int dim, int id) | ||||
|     { | ||||
|         if (localSizeSpecId[dim] != TQualifier::layoutNotSet) | ||||
|             return id == localSizeSpecId[dim]; | ||||
|         localSizeSpecId[dim] = id; | ||||
|         return true; | ||||
|     } | ||||
|     int getLocalSizeSpecId(int dim) const { return localSizeSpecId[dim]; } | ||||
| #ifdef GLSLANG_WEB | ||||
|     void output(TInfoSink&, bool tree) { } | ||||
| 
 | ||||
| @ -492,23 +510,7 @@ public: | ||||
|     bool usingVariablePointers() const { return false; } | ||||
|     unsigned getXfbStride(int buffer) const { return 0; } | ||||
|     bool hasLayoutDerivativeModeNone() const { return false; } | ||||
|     bool setLocalSize(int dim, int size) | ||||
|     { | ||||
|         if (localSizeNotDefault[dim]) | ||||
|             return size == localSize[dim]; | ||||
|         localSizeNotDefault[dim] = true; | ||||
|         localSize[dim] = size; | ||||
|         return true; | ||||
|     } | ||||
|     unsigned int getLocalSize(int dim) const { return localSize[dim]; } | ||||
|     bool setLocalSizeSpecId(int dim, int id) | ||||
|     { | ||||
|         if (localSizeSpecId[dim] != TQualifier::layoutNotSet) | ||||
|             return id == localSizeSpecId[dim]; | ||||
|         localSizeSpecId[dim] = id; | ||||
|         return true; | ||||
|     } | ||||
|     int getLocalSizeSpecId(int dim) const { return localSizeSpecId[dim]; } | ||||
|     ComputeDerivativeMode getLayoutDerivativeModeNone() const { return LayoutDerivativeNone; } | ||||
| #else | ||||
|     void output(TInfoSink&, bool tree); | ||||
| 
 | ||||
| @ -756,7 +758,7 @@ public: | ||||
| 
 | ||||
|     void setBinaryDoubleOutput() { binaryDoubleOutput = true; } | ||||
|     bool getBinaryDoubleOutput() { return binaryDoubleOutput; } | ||||
| #endif | ||||
| #endif // GLSLANG_WEB
 | ||||
| 
 | ||||
| #ifdef ENABLE_HLSL | ||||
|     void setHlslFunctionality1() { hlslFunctionality1 = true; } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 John Kessenich
						John Kessenich