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