Add-support-for-SPV_NVX_raytracing

This commit is contained in:
Chao Chen 2018-09-19 11:42:24 -07:00
parent 3c3669904c
commit b50c02ef53
50 changed files with 5970 additions and 4184 deletions

View file

@ -5058,6 +5058,27 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
#endif
#ifdef NV_EXTENSIONS
// Builtins for GL_NV_raytracing
if (profile != EEsProfile && version >= 460) {
stageBuiltins[EShLangRayGenNV].append(
"void traceNVX(accelerationStructureNVX,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
"\n");
stageBuiltins[EShLangIntersectNV].append(
"bool reportIntersectionNVX(float, uint);"
"\n");
stageBuiltins[EShLangAnyHitNV].append(
"void ignoreIntersectionNVX();"
"void terminateRayNVX();"
"\n");
stageBuiltins[EShLangClosestHitNV].append(
"void traceNVX(accelerationStructureNVX,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
"\n");
stageBuiltins[EShLangMissNV].append(
"void traceNVX(accelerationStructureNVX,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
"\n");
}
//E_SPV_NV_compute_shader_derivatives
stageBuiltins[EShLangCompute].append(derivatives);
@ -5930,7 +5951,8 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
stageBuiltins[EShLangFragment].append(
"in vec3 gl_BaryCoordNV;"
"in vec3 gl_BaryCoordNoPerspNV;"
);
);
#endif
} else {
// ES profile
@ -5973,12 +5995,13 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
"highp float gl_FragDepthEXT;" // GL_EXT_frag_depth
);
#ifdef NV_EXTENSIONS
if (version >= 320)
if (version >= 320)
stageBuiltins[EShLangFragment].append(
"in vec3 gl_BaryCoordNV;"
"in vec3 gl_BaryCoordNoPerspNV;"
);
);
#endif
}
stageBuiltins[EShLangFragment].append("\n");
@ -6072,6 +6095,94 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
#endif
}
#ifdef NV_EXTENSIONS
// GL_NV_raytracing
if (profile != EEsProfile && version >= 460) {
const char *constRayFlags =
"const uint gl_RayFlagsNoneNVX = 0U;"
"const uint gl_RayFlagsOpaqueNVX = 1U;"
"const uint gl_RayFlagsNoOpaqueNVX = 2U;"
"const uint gl_RayFlagsTerminateOnFirstHitNVX = 4U;"
"const uint gl_RayFlagsSkipClosestHitShaderNVX = 8U;"
"const uint gl_RayFlagsCullBackFacingTrianglesNVX = 16U;"
"const uint gl_RayFlagsCullFrontFacingTrianglesNVX = 32U;"
"const uint gl_RayFlagsCullOpaqueNVX = 64U;"
"const uint gl_RayFlagsCullNoOpaqueNVX = 128U;"
"\n";
const char *rayGenDecls =
"in uvec2 gl_LaunchIDNVX;"
"in uvec2 gl_LaunchSizeNVX;"
"\n";
const char *intersectDecls =
"in uvec2 gl_LaunchIDNVX;"
"in uvec2 gl_LaunchSizeNVX;"
"in int gl_PrimitiveID;"
"in int gl_InstanceID;"
"in int gl_InstanceCustomIndexNVX;"
"in vec3 gl_WorldRayOriginNVX;"
"in vec3 gl_WorldRayDirectionNVX;"
"in vec3 gl_ObjectRayOriginNVX;"
"in vec3 gl_ObjectRayDirectionNVX;"
"in float gl_RayTminNVX;"
"in float gl_RayTmaxNVX;"
"in mat4x3 gl_ObjectToWorldNVX;"
"in mat4x3 gl_WorldToObjectNVX;"
"\n";
const char *hitDecls =
"in uvec2 gl_LaunchIDNVX;"
"in uvec2 gl_LaunchSizeNVX;"
"in int gl_PrimitiveID;"
"in int gl_InstanceID;"
"in int gl_InstanceCustomIndexNVX;"
"in vec3 gl_WorldRayOriginNVX;"
"in vec3 gl_WorldRayDirectionNVX;"
"in vec3 gl_ObjectRayOriginNVX;"
"in vec3 gl_ObjectRayDirectionNVX;"
"in float gl_RayTminNVX;"
"in float gl_RayTmaxNVX;"
"in float gl_HitTNVX;"
"in uint gl_HitKindNVX;"
"in mat4x3 gl_ObjectToWorldNVX;"
"in mat4x3 gl_WorldToObjectNVX;"
"\n";
const char *missDecls =
"in uvec2 gl_LaunchIDNVX;"
"in uvec2 gl_LaunchSizeNVX;"
"in vec3 gl_WorldRayOriginNVX;"
"in vec3 gl_WorldRayDirectionNVX;"
"in vec3 gl_ObjectRayOriginNVX;"
"in vec3 gl_ObjectRayDirectionNVX;"
"in float gl_RayTminNVX;"
"in float gl_RayTmaxNVX;"
"\n";
stageBuiltins[EShLangRayGenNV].append(rayGenDecls);
stageBuiltins[EShLangRayGenNV].append(constRayFlags);
stageBuiltins[EShLangIntersectNV].append(intersectDecls);
stageBuiltins[EShLangAnyHitNV].append(hitDecls);
stageBuiltins[EShLangClosestHitNV].append(hitDecls);
stageBuiltins[EShLangClosestHitNV].append(constRayFlags);
stageBuiltins[EShLangMissNV].append(missDecls);
stageBuiltins[EShLangMissNV].append(constRayFlags);
}
if ((profile != EEsProfile && version >= 140)) {
const char *deviceIndex =
"in highp int gl_DeviceIndex;" // GL_EXT_device_group
"\n";
stageBuiltins[EShLangRayGenNV].append(deviceIndex);
stageBuiltins[EShLangIntersectNV].append(deviceIndex);
stageBuiltins[EShLangAnyHitNV].append(deviceIndex);
stageBuiltins[EShLangClosestHitNV].append(deviceIndex);
stageBuiltins[EShLangMissNV].append(deviceIndex);
}
#endif
if (version >= 300 /* both ES and non-ES */) {
stageBuiltins[EShLangFragment].append(
"flat in highp uint gl_ViewID_OVR;" // GL_OVR_multiview, GL_OVR_multiview2
@ -8468,8 +8579,48 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
symbolTable.setFunctionExtensions("subgroupMemoryBarrierShared", 1, &E_GL_KHR_shader_subgroup_basic);
}
break;
#ifdef NV_EXTENSIONS
case EShLangRayGenNV:
case EShLangIntersectNV:
case EShLangAnyHitNV:
case EShLangClosestHitNV:
case EShLangMissNV:
if (profile != EEsProfile && version >= 460) {
symbolTable.setVariableExtensions("gl_LaunchIDNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_LaunchSizeNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_PrimitiveID", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_InstanceID", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_InstanceCustomIndexNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_WorldRayOriginNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_WorldRayDirectionNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_ObjectRayOriginNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_ObjectRayDirectionNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_RayTminNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_RayTmaxNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_HitTNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_HitKindNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_ObjectToWorldNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_WorldToObjectNVX", 1, &E_GL_NVX_raytracing);
symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
BuiltInVariable("gl_LaunchIDNVX", EbvLaunchIdNV, symbolTable);
BuiltInVariable("gl_LaunchSizeNVX", EbvLaunchSizeNV, symbolTable);
BuiltInVariable("gl_PrimitiveID", EbvPrimitiveId, symbolTable);
BuiltInVariable("gl_InstanceID", EbvInstanceId, symbolTable);
BuiltInVariable("gl_InstanceCustomIndexNVX",EbvInstanceCustomIndexNV,symbolTable);
BuiltInVariable("gl_WorldRayOriginNVX", EbvWorldRayOriginNV, symbolTable);
BuiltInVariable("gl_WorldRayDirectionNVX", EbvWorldRayDirectionNV, symbolTable);
BuiltInVariable("gl_ObjectRayOriginNVX", EbvObjectRayOriginNV, symbolTable);
BuiltInVariable("gl_ObjectRayDirectionNVX", EbvObjectRayDirectionNV, symbolTable);
BuiltInVariable("gl_RayTminNVX", EbvRayTminNV, symbolTable);
BuiltInVariable("gl_RayTmaxNVX", EbvRayTmaxNV, symbolTable);
BuiltInVariable("gl_HitTNVX", EbvHitTNV, symbolTable);
BuiltInVariable("gl_HitKindNVX", EbvHitKindNV, symbolTable);
BuiltInVariable("gl_ObjectToWorldNVX", EbvObjectToWorldNV, symbolTable);
BuiltInVariable("gl_WorldToObjectNVX", EbvWorldToObjectNV, symbolTable);
BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
}
break;
case EShLangMeshNV:
if (profile != EEsProfile && version >= 450) {
// Per-vertex builtins
@ -9200,6 +9351,22 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
break;
#ifdef NV_EXTENSIONS
case EShLangRayGenNV:
case EShLangClosestHitNV:
case EShLangMissNV:
if (profile != EEsProfile && version >= 460)
symbolTable.relateToOperator("traceNVX", EOpTraceNV);
break;
case EShLangIntersectNV:
if (profile != EEsProfile && version >= 460)
symbolTable.relateToOperator("reportIntersectionNVX", EOpReportIntersectionNV);
break;
case EShLangAnyHitNV:
if (profile != EEsProfile && version >= 460) {
symbolTable.relateToOperator("ignoreIntersectionNVX", EOpIgnoreIntersectionNV);
symbolTable.relateToOperator("terminateRayNVX", EOpTerminateRayNV);
}
break;
case EShLangMeshNV:
if (profile != EEsProfile && version >= 450) {
symbolTable.relateToOperator("writePackedPrimitiveIndices4x8NV", EOpWritePackedPrimitiveIndices4x8NV);

View file

@ -460,6 +460,9 @@ bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const
return false;
case EbtAtomicUint:
case EbtSampler:
#ifdef NV_EXTENSIONS
case EbtAccStructNV:
#endif
// opaque types can be passed to functions
if (op == EOpFunction)
break;

View file

@ -153,6 +153,12 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op,
if (node->getQualifier().readonly)
message = "can't modify a readonly buffer";
break;
#ifdef NV_EXTENSIONS
case EvqHitAttrNV:
if (language != EShLangIntersectNV)
message = "cannot modify hitAttributeNVX in this stage";
break;
#endif
default:
//
@ -168,6 +174,11 @@ bool TParseContextBase::lValueErrorCheck(const TSourceLoc& loc, const char* op,
case EbtVoid:
message = "can't modify void";
break;
#ifdef NV_EXTENSIONS
case EbtAccStructNV:
message = "can't modify accelerationStructureNVX";
break;
#endif
default:
break;
}

View file

@ -2962,6 +2962,20 @@ void TParseContext::atomicUintCheck(const TSourceLoc& loc, const TType& type, co
else if (type.getBasicType() == EbtAtomicUint && type.getQualifier().storage != EvqUniform)
error(loc, "atomic_uints can only be used in uniform variables or function parameters:", type.getBasicTypeString().c_str(), identifier.c_str());
}
#ifdef NV_EXTENSIONS
void TParseContext::accStructNVCheck(const TSourceLoc& loc, const TType& type, const TString& identifier)
{
if (type.getQualifier().storage == EvqUniform)
return;
if (type.getBasicType() == EbtStruct && containsFieldWithBasicType(type, EbtAccStructNV))
error(loc, "non-uniform struct contains an accelerationStructureNVX:", type.getBasicTypeString().c_str(), identifier.c_str());
else if (type.getBasicType() == EbtAccStructNV && type.getQualifier().storage != EvqUniform)
error(loc, "accelerationStructureNVX can only be used in uniform variables or function parameters:",
type.getBasicTypeString().c_str(), identifier.c_str());
}
#endif
void TParseContext::transparentOpaqueCheck(const TSourceLoc& loc, const TType& type, const TString& identifier)
{
@ -4696,6 +4710,15 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
publicType.qualifier.layoutViewportRelative = true;
return;
}
} else {
if (language == EShLangRayGenNV || language == EShLangIntersectNV ||
language == EShLangAnyHitNV || language == EShLangClosestHitNV ||
language == EShLangMissNV || language == EShLangCallableNV) {
if (id == "shaderrecordnvx") {
publicType.qualifier.layoutShaderRecordNV = true;
return;
}
}
}
if (language == EShLangCompute) {
if (id.compare(0, 17, "derivative_group_") == 0) {
@ -5076,6 +5099,8 @@ void TParseContext::mergeObjectLayoutQualifiers(TQualifier& dst, const TQualifie
dst.layoutViewportRelative = true;
if (src.layoutSecondaryViewportRelativeOffset != -2048)
dst.layoutSecondaryViewportRelativeOffset = src.layoutSecondaryViewportRelativeOffset;
if (src.layoutShaderRecordNV)
dst.layoutShaderRecordNV = true;
if (src.pervertexNV)
dst.pervertexNV = true;
#endif
@ -5143,6 +5168,10 @@ void TParseContext::layoutObjectCheck(const TSourceLoc& loc, const TSymbol& symb
error(loc, "cannot specify on a variable declaration", "align", "");
if (qualifier.layoutPushConstant)
error(loc, "can only specify on a uniform block", "push_constant", "");
#ifdef NV_EXTENSIONS
if (qualifier.layoutShaderRecordNV)
error(loc, "can only specify on a buffer block", "shaderRecordNVX", "");
#endif
}
break;
default:
@ -5216,6 +5245,12 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type)
if (type.getBasicType() == EbtBlock)
error(loc, "cannot apply to uniform or buffer block", "location", "");
break;
#ifdef NV_EXTENSIONS
case EvqPayloadNV:
case EvqPayloadInNV:
case EvqHitAttrNV:
break;
#endif
default:
error(loc, "can only apply to uniform, buffer, in, or out storage qualifiers", "location", "");
break;
@ -5299,7 +5334,10 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type)
if (spvVersion.spv > 0) {
if (qualifier.isUniformOrBuffer()) {
if (type.getBasicType() == EbtBlock && !qualifier.layoutPushConstant &&
!qualifier.layoutAttachment)
#ifdef NV_EXTENSIONS
!qualifier.layoutShaderRecordNV &&
#endif
!qualifier.layoutAttachment)
error(loc, "uniform/buffer blocks require layout(binding=X)", "binding", "");
else if (spvVersion.vulkan > 0 && type.getBasicType() == EbtSampler)
error(loc, "sampler/texture/image requires layout(binding=X)", "binding", "");
@ -5351,6 +5389,11 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type)
if (qualifier.layoutPushConstant && type.getBasicType() != EbtBlock)
error(loc, "can only be used with a block", "push_constant", "");
#ifdef NV_EXTENSIONS
if (qualifier.layoutShaderRecordNV && type.getBasicType() != EbtBlock)
error(loc, "can only be used with a block", "shaderRecordNVX", "");
#endif
// input attachment
if (type.isSubpass()) {
if (! qualifier.hasAttachment())
@ -5486,6 +5529,16 @@ void TParseContext::layoutQualifierCheck(const TSourceLoc& loc, const TQualifier
if (qualifier.hasSet())
error(loc, "cannot be used with push_constant", "set", "");
}
#ifdef NV_EXTENSIONS
if (qualifier.layoutShaderRecordNV) {
if (qualifier.storage != EvqBuffer)
error(loc, "can only be used with a buffer", "shaderRecordNVX", "");
if (qualifier.hasBinding())
error(loc, "cannot be used with shaderRecordNVX", "binding", "");
if (qualifier.hasSet())
error(loc, "cannot be used with shaderRecordNVX", "set", "");
}
#endif
}
// For places that can't have shader-level layout qualifiers
@ -5915,6 +5968,9 @@ TIntermNode* TParseContext::declareVariable(const TSourceLoc& loc, TString& iden
samplerCheck(loc, type, identifier, initializer);
atomicUintCheck(loc, type, identifier);
transparentOpaqueCheck(loc, type, identifier);
#ifdef NV_EXTENSIONS
accStructNVCheck(loc, type, identifier);
#endif
if (type.getQualifier().storage != EvqUniform && type.getQualifier().storage != EvqBuffer) {
if (type.containsBasicType(EbtFloat16))
@ -6613,7 +6669,11 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con
// Special case for "push_constant uniform", which has a default of std430,
// contrary to normal uniform defaults, and can't have a default tracked for it.
if (currentBlockQualifier.layoutPushConstant && !currentBlockQualifier.hasPacking())
if ((currentBlockQualifier.layoutPushConstant && !currentBlockQualifier.hasPacking())
#ifdef NV_EXTENSIONS
|| (currentBlockQualifier.layoutShaderRecordNV && !currentBlockQualifier.hasPacking())
#endif
)
currentBlockQualifier.layoutPacking = ElpStd430;
#ifdef NV_EXTENSIONS
@ -6835,6 +6895,22 @@ void TParseContext::blockStageIoCheck(const TSourceLoc& loc, const TQualifier& q
}
#endif
break;
#ifdef NV_EXTENSIONS
case EvqPayloadNV:
profileRequires(loc, ~EEsProfile, 450, E_GL_NVX_raytracing, "rayPayloadNVX block");
requireStage(loc, (EShLanguageMask)(EShLangRayGenNVMask | EShLangAnyHitNVMask | EShLangClosestHitNVMask | EShLangMissNVMask),
"rayPayloadNVX block");
break;
case EvqPayloadInNV:
profileRequires(loc, ~EEsProfile, 450, E_GL_NVX_raytracing, "rayPayloadInNVX block");
requireStage(loc, (EShLanguageMask)(EShLangAnyHitNVMask | EShLangClosestHitNVMask | EShLangMissNVMask),
"rayPayloadInNVX block");
break;
case EvqHitAttrNV:
profileRequires(loc, ~EEsProfile, 450, E_GL_NVX_raytracing, "hitAttributeNVX block");
requireStage(loc, (EShLanguageMask)(EShLangIntersectNVMask | EShLangAnyHitNVMask | EShLangClosestHitNVMask), "hitAttributeNVX block");
break;
#endif
default:
error(loc, "only uniform, buffer, in, or out blocks are supported", blockName->c_str(), "");
break;
@ -6872,6 +6948,8 @@ void TParseContext::blockQualifierCheck(const TSourceLoc& loc, const TQualifier&
if (qualifier.layoutPushConstant)
intermediate.addPushConstantCount();
#ifdef NV_EXTENSIONS
if (qualifier.layoutShaderRecordNV)
intermediate.addShaderRecordNVCount();
if (qualifier.perTaskNV)
intermediate.addTaskNVCount();
#endif
@ -7357,6 +7435,10 @@ void TParseContext::updateStandaloneQualifierDefaults(const TSourceLoc& loc, con
error(loc, "cannot declare a default, can only be used on a block", "push_constant", "");
if (qualifier.hasSpecConstantId())
error(loc, "cannot declare a default, can only be used on a scalar", "constant_id", "");
#ifdef NV_EXTENSIONS
if (qualifier.layoutShaderRecordNV)
error(loc, "cannot declare a default, can only be used on a block", "shaderRecordNVX", "");
#endif
}
//

View file

@ -348,6 +348,9 @@ public:
void boolCheck(const TSourceLoc&, const TPublicType&);
void samplerCheck(const TSourceLoc&, const TType&, const TString& identifier, TIntermTyped* initializer);
void atomicUintCheck(const TSourceLoc&, const TType&, const TString& identifier);
#ifdef NV_EXTENSIONS
void accStructNVCheck(const TSourceLoc & loc, const TType & type, const TString & identifier);
#endif
void transparentOpaqueCheck(const TSourceLoc&, const TType&, const TString& identifier);
void memberQualifierCheck(glslang::TPublicType&);
void globalQualifierFixCheck(const TSourceLoc&, TQualifier&);

View file

@ -701,6 +701,10 @@ void TScanContext::fillInKeywordMap()
(*KeywordMap)["superp"] = SUPERP;
#ifdef NV_EXTENSIONS
(*KeywordMap)["rayPayloadNVX"] = PAYLOADNV;
(*KeywordMap)["rayPayloadInNVX"] = PAYLOADINNV;
(*KeywordMap)["hitAttributeNVX"] = HITATTRNV;
(*KeywordMap)["accelerationStructureNVX"] = ACCSTRUCTNV;
(*KeywordMap)["perprimitiveNV"] = PERPRIMITIVENV;
(*KeywordMap)["perviewNV"] = PERVIEWNV;
(*KeywordMap)["taskNV"] = PERTASKNV;
@ -944,6 +948,18 @@ int TScanContext::tokenizeIdentifier()
return identifierOrType();
return keyword;
#ifdef NV_EXTENSIONS
case PAYLOADNV:
case PAYLOADINNV:
case HITATTRNV:
case ACCSTRUCTNV:
if (parseContext.symbolTable.atBuiltInLevel() ||
(parseContext.profile != EEsProfile && parseContext.version >= 460
&& parseContext.extensionTurnedOn(E_GL_NVX_raytracing)))
return keyword;
return identifierOrType();
#endif
case ATOMIC_UINT:
if ((parseContext.profile == EEsProfile && parseContext.version >= 310) ||
parseContext.extensionTurnedOn(E_GL_ARB_shader_atomic_counters))

View file

@ -348,6 +348,19 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable, TS
infoSink, commonTable, symbolTables);
#ifdef NV_EXTENSIONS
// check for ray tracing stages
if (profile != EEsProfile && version >= 450) {
InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangRayGenNV, source,
infoSink, commonTable, symbolTables);
InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangIntersectNV, source,
infoSink, commonTable, symbolTables);
InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangAnyHitNV, source,
infoSink, commonTable, symbolTables);
InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangClosestHitNV, source,
infoSink, commonTable, symbolTables);
InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangMissNV, source,
infoSink, commonTable, symbolTables);
}
// check for mesh
if (profile != EEsProfile && version >= 450)
InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangMeshNV, source,
@ -583,6 +596,17 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo
}
break;
#ifdef NV_EXTENSIONS
case EShLangRayGenNV:
case EShLangIntersectNV:
case EShLangAnyHitNV:
case EShLangClosestHitNV:
case EShLangCallableNV:
if (profile == EEsProfile || version < 460) {
correct = false;
infoSink.info.message(EPrefixError, "#version: raytracing shaders require non-es profile with version 460 or above");
version = 460;
}
break;
case EShLangMeshNV:
case EShLangTaskNV:
if ((profile == EEsProfile) ||

View file

@ -72,6 +72,9 @@ void TType::buildMangledName(TString& mangledName) const
case EbtUint64: mangledName += "u64"; break;
case EbtBool: mangledName += 'b'; break;
case EbtAtomicUint: mangledName += "au"; break;
#ifdef NV_EXTENSIONS
case EbtAccStructNV: mangledName += "asnv"; break;
#endif
case EbtSampler:
switch (sampler.type) {
#ifdef AMD_EXTENSIONS

View file

@ -235,6 +235,7 @@ void TParseVersions::initializeExtensionBehavior()
extensionBehavior[E_GL_NV_conservative_raster_underestimation] = EBhDisable;
extensionBehavior[E_GL_NV_shader_noperspective_interpolation] = EBhDisable;
extensionBehavior[E_GL_NV_shader_subgroup_partitioned] = EBhDisable;
extensionBehavior[E_GL_NVX_raytracing] = EBhDisable;
extensionBehavior[E_GL_NV_fragment_shader_barycentric] = EBhDisable;
extensionBehavior[E_GL_NV_compute_shader_derivatives] = EBhDisable;
extensionBehavior[E_GL_NV_shader_texture_footprint] = EBhDisable;
@ -409,6 +410,7 @@ void TParseVersions::getPreamble(std::string& preamble)
"#define GL_NV_shader_atomic_int64 1\n"
"#define GL_NV_conservative_raster_underestimation 1\n"
"#define GL_NV_shader_subgroup_partitioned 1\n"
"#define GL_NVX_raytracing 1\n"
"#define GL_NV_fragment_shader_barycentric 1\n"
"#define GL_NV_compute_shader_derivatives 1\n"
"#define GL_NV_shader_texture_footprint 1\n"
@ -501,6 +503,12 @@ const char* StageName(EShLanguage stage)
case EShLangFragment: return "fragment";
case EShLangCompute: return "compute";
#ifdef NV_EXTENSIONS
case EShLangRayGenNV: return "ray-generation";
case EShLangIntersectNV: return "intersection";
case EShLangAnyHitNV: return "any-hit";
case EShLangClosestHitNV: return "closest-hit";
case EShLangMissNV: return "miss";
case EShLangCallableNV: return "callable";
case EShLangMeshNV: return "mesh";
case EShLangTaskNV: return "task";
#endif

View file

@ -207,6 +207,7 @@ const char* const E_GL_NV_shader_atomic_int64 = "GL_NV_shader_
const char* const E_GL_NV_conservative_raster_underestimation = "GL_NV_conservative_raster_underestimation";
const char* const E_GL_NV_shader_noperspective_interpolation = "GL_NV_shader_noperspective_interpolation";
const char* const E_GL_NV_shader_subgroup_partitioned = "GL_NV_shader_subgroup_partitioned";
const char* const E_GL_NVX_raytracing = "GL_NVX_raytracing";
const char* const E_GL_NV_fragment_shader_barycentric = "GL_NV_fragment_shader_barycentric";
const char* const E_GL_NV_compute_shader_derivatives = "GL_NV_compute_shader_derivatives";
const char* const E_GL_NV_shader_texture_footprint = "GL_NV_shader_texture_footprint";

View file

@ -140,7 +140,7 @@ extern int yylex(YYSTYPE*, TParseContext&);
%token <lex> U8VEC2 U8VEC3 U8VEC4
%token <lex> VEC2 VEC3 VEC4
%token <lex> MAT2 MAT3 MAT4 CENTROID IN OUT INOUT
%token <lex> UNIFORM PATCH SAMPLE BUFFER SHARED NONUNIFORM
%token <lex> UNIFORM PATCH SAMPLE BUFFER SHARED NONUNIFORM PAYLOADNV PAYLOADINNV HITATTRNV
%token <lex> COHERENT VOLATILE RESTRICT READONLY WRITEONLY DEVICECOHERENT QUEUEFAMILYCOHERENT WORKGROUPCOHERENT SUBGROUPCOHERENT NONPRIVATE
%token <lex> DVEC2 DVEC3 DVEC4 DMAT2 DMAT3 DMAT4
%token <lex> F16VEC2 F16VEC3 F16VEC4 F16MAT2 F16MAT3 F16MAT4
@ -164,6 +164,7 @@ extern int yylex(YYSTYPE*, TParseContext&);
%token <lex> F64MAT3X2 F64MAT3X3 F64MAT3X4
%token <lex> F64MAT4X2 F64MAT4X3 F64MAT4X4
%token <lex> ATOMIC_UINT
%token <lex> ACCSTRUCTNV
// combined image/sampler
%token <lex> SAMPLER1D SAMPLER2D SAMPLER3D SAMPLERCUBE SAMPLER1DSHADOW SAMPLER2DSHADOW
@ -1339,6 +1340,36 @@ storage_qualifier
$$.init($1.loc);
$$.qualifier.storage = EvqBuffer;
}
| HITATTRNV {
#ifdef NV_EXTENSIONS
parseContext.globalCheck($1.loc, "hitAttributeNVX");
parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangIntersectNVMask | EShLangClosestHitNVMask
| EShLangAnyHitNVMask), "hitAttributeNVX");
parseContext.profileRequires($1.loc, ECoreProfile, 450, E_GL_NVX_raytracing, "hitAttributeNVX");
$$.init($1.loc);
$$.qualifier.storage = EvqHitAttrNV;
#endif
}
| PAYLOADNV {
#ifdef NV_EXTENSIONS
parseContext.globalCheck($1.loc, "rayPayloadNVX");
parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangRayGenNVMask | EShLangClosestHitNVMask |
EShLangAnyHitNVMask | EShLangMissNVMask), "rayPayloadNVX");
parseContext.profileRequires($1.loc, ECoreProfile, 450, E_GL_NVX_raytracing, "rayPayloadNVX");
$$.init($1.loc);
$$.qualifier.storage = EvqPayloadNV;
#endif
}
| PAYLOADINNV {
#ifdef NV_EXTENSIONS
parseContext.globalCheck($1.loc, "rayPayloadInNVX");
parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangClosestHitNVMask |
EShLangAnyHitNVMask | EShLangMissNVMask), "rayPayloadInNVX");
parseContext.profileRequires($1.loc, ECoreProfile, 450, E_GL_NVX_raytracing, "rayPayloadInNVX");
$$.init($1.loc);
$$.qualifier.storage = EvqPayloadInNV;
#endif
}
| SHARED {
parseContext.globalCheck($1.loc, "shared");
parseContext.profileRequires($1.loc, ECoreProfile | ECompatibilityProfile, 430, E_GL_ARB_compute_shader, "shared");
@ -2177,6 +2208,12 @@ type_specifier_nonarray
$$.basicType = EbtDouble;
$$.setMatrix(4, 4);
}
| ACCSTRUCTNV {
#ifdef NV_EXTENSIONS
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtAccStructNV;
#endif
}
| ATOMIC_UINT {
parseContext.vulkanRemoved($1.loc, "atomic counter types");
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());

File diff suppressed because it is too large Load diff

View file

@ -125,323 +125,327 @@ extern int yydebug;
BUFFER = 335,
SHARED = 336,
NONUNIFORM = 337,
COHERENT = 338,
VOLATILE = 339,
RESTRICT = 340,
READONLY = 341,
WRITEONLY = 342,
DEVICECOHERENT = 343,
QUEUEFAMILYCOHERENT = 344,
WORKGROUPCOHERENT = 345,
SUBGROUPCOHERENT = 346,
NONPRIVATE = 347,
DVEC2 = 348,
DVEC3 = 349,
DVEC4 = 350,
DMAT2 = 351,
DMAT3 = 352,
DMAT4 = 353,
F16VEC2 = 354,
F16VEC3 = 355,
F16VEC4 = 356,
F16MAT2 = 357,
F16MAT3 = 358,
F16MAT4 = 359,
F32VEC2 = 360,
F32VEC3 = 361,
F32VEC4 = 362,
F32MAT2 = 363,
F32MAT3 = 364,
F32MAT4 = 365,
F64VEC2 = 366,
F64VEC3 = 367,
F64VEC4 = 368,
F64MAT2 = 369,
F64MAT3 = 370,
F64MAT4 = 371,
NOPERSPECTIVE = 372,
FLAT = 373,
SMOOTH = 374,
LAYOUT = 375,
EXPLICITINTERPAMD = 376,
PERVERTEXNV = 377,
PERPRIMITIVENV = 378,
PERVIEWNV = 379,
PERTASKNV = 380,
MAT2X2 = 381,
MAT2X3 = 382,
MAT2X4 = 383,
MAT3X2 = 384,
MAT3X3 = 385,
MAT3X4 = 386,
MAT4X2 = 387,
MAT4X3 = 388,
MAT4X4 = 389,
DMAT2X2 = 390,
DMAT2X3 = 391,
DMAT2X4 = 392,
DMAT3X2 = 393,
DMAT3X3 = 394,
DMAT3X4 = 395,
DMAT4X2 = 396,
DMAT4X3 = 397,
DMAT4X4 = 398,
F16MAT2X2 = 399,
F16MAT2X3 = 400,
F16MAT2X4 = 401,
F16MAT3X2 = 402,
F16MAT3X3 = 403,
F16MAT3X4 = 404,
F16MAT4X2 = 405,
F16MAT4X3 = 406,
F16MAT4X4 = 407,
F32MAT2X2 = 408,
F32MAT2X3 = 409,
F32MAT2X4 = 410,
F32MAT3X2 = 411,
F32MAT3X3 = 412,
F32MAT3X4 = 413,
F32MAT4X2 = 414,
F32MAT4X3 = 415,
F32MAT4X4 = 416,
F64MAT2X2 = 417,
F64MAT2X3 = 418,
F64MAT2X4 = 419,
F64MAT3X2 = 420,
F64MAT3X3 = 421,
F64MAT3X4 = 422,
F64MAT4X2 = 423,
F64MAT4X3 = 424,
F64MAT4X4 = 425,
ATOMIC_UINT = 426,
SAMPLER1D = 427,
SAMPLER2D = 428,
SAMPLER3D = 429,
SAMPLERCUBE = 430,
SAMPLER1DSHADOW = 431,
SAMPLER2DSHADOW = 432,
SAMPLERCUBESHADOW = 433,
SAMPLER1DARRAY = 434,
SAMPLER2DARRAY = 435,
SAMPLER1DARRAYSHADOW = 436,
SAMPLER2DARRAYSHADOW = 437,
ISAMPLER1D = 438,
ISAMPLER2D = 439,
ISAMPLER3D = 440,
ISAMPLERCUBE = 441,
ISAMPLER1DARRAY = 442,
ISAMPLER2DARRAY = 443,
USAMPLER1D = 444,
USAMPLER2D = 445,
USAMPLER3D = 446,
USAMPLERCUBE = 447,
USAMPLER1DARRAY = 448,
USAMPLER2DARRAY = 449,
SAMPLER2DRECT = 450,
SAMPLER2DRECTSHADOW = 451,
ISAMPLER2DRECT = 452,
USAMPLER2DRECT = 453,
SAMPLERBUFFER = 454,
ISAMPLERBUFFER = 455,
USAMPLERBUFFER = 456,
SAMPLERCUBEARRAY = 457,
SAMPLERCUBEARRAYSHADOW = 458,
ISAMPLERCUBEARRAY = 459,
USAMPLERCUBEARRAY = 460,
SAMPLER2DMS = 461,
ISAMPLER2DMS = 462,
USAMPLER2DMS = 463,
SAMPLER2DMSARRAY = 464,
ISAMPLER2DMSARRAY = 465,
USAMPLER2DMSARRAY = 466,
SAMPLEREXTERNALOES = 467,
F16SAMPLER1D = 468,
F16SAMPLER2D = 469,
F16SAMPLER3D = 470,
F16SAMPLER2DRECT = 471,
F16SAMPLERCUBE = 472,
F16SAMPLER1DARRAY = 473,
F16SAMPLER2DARRAY = 474,
F16SAMPLERCUBEARRAY = 475,
F16SAMPLERBUFFER = 476,
F16SAMPLER2DMS = 477,
F16SAMPLER2DMSARRAY = 478,
F16SAMPLER1DSHADOW = 479,
F16SAMPLER2DSHADOW = 480,
F16SAMPLER1DARRAYSHADOW = 481,
F16SAMPLER2DARRAYSHADOW = 482,
F16SAMPLER2DRECTSHADOW = 483,
F16SAMPLERCUBESHADOW = 484,
F16SAMPLERCUBEARRAYSHADOW = 485,
SAMPLER = 486,
SAMPLERSHADOW = 487,
TEXTURE1D = 488,
TEXTURE2D = 489,
TEXTURE3D = 490,
TEXTURECUBE = 491,
TEXTURE1DARRAY = 492,
TEXTURE2DARRAY = 493,
ITEXTURE1D = 494,
ITEXTURE2D = 495,
ITEXTURE3D = 496,
ITEXTURECUBE = 497,
ITEXTURE1DARRAY = 498,
ITEXTURE2DARRAY = 499,
UTEXTURE1D = 500,
UTEXTURE2D = 501,
UTEXTURE3D = 502,
UTEXTURECUBE = 503,
UTEXTURE1DARRAY = 504,
UTEXTURE2DARRAY = 505,
TEXTURE2DRECT = 506,
ITEXTURE2DRECT = 507,
UTEXTURE2DRECT = 508,
TEXTUREBUFFER = 509,
ITEXTUREBUFFER = 510,
UTEXTUREBUFFER = 511,
TEXTURECUBEARRAY = 512,
ITEXTURECUBEARRAY = 513,
UTEXTURECUBEARRAY = 514,
TEXTURE2DMS = 515,
ITEXTURE2DMS = 516,
UTEXTURE2DMS = 517,
TEXTURE2DMSARRAY = 518,
ITEXTURE2DMSARRAY = 519,
UTEXTURE2DMSARRAY = 520,
F16TEXTURE1D = 521,
F16TEXTURE2D = 522,
F16TEXTURE3D = 523,
F16TEXTURE2DRECT = 524,
F16TEXTURECUBE = 525,
F16TEXTURE1DARRAY = 526,
F16TEXTURE2DARRAY = 527,
F16TEXTURECUBEARRAY = 528,
F16TEXTUREBUFFER = 529,
F16TEXTURE2DMS = 530,
F16TEXTURE2DMSARRAY = 531,
SUBPASSINPUT = 532,
SUBPASSINPUTMS = 533,
ISUBPASSINPUT = 534,
ISUBPASSINPUTMS = 535,
USUBPASSINPUT = 536,
USUBPASSINPUTMS = 537,
F16SUBPASSINPUT = 538,
F16SUBPASSINPUTMS = 539,
IMAGE1D = 540,
IIMAGE1D = 541,
UIMAGE1D = 542,
IMAGE2D = 543,
IIMAGE2D = 544,
UIMAGE2D = 545,
IMAGE3D = 546,
IIMAGE3D = 547,
UIMAGE3D = 548,
IMAGE2DRECT = 549,
IIMAGE2DRECT = 550,
UIMAGE2DRECT = 551,
IMAGECUBE = 552,
IIMAGECUBE = 553,
UIMAGECUBE = 554,
IMAGEBUFFER = 555,
IIMAGEBUFFER = 556,
UIMAGEBUFFER = 557,
IMAGE1DARRAY = 558,
IIMAGE1DARRAY = 559,
UIMAGE1DARRAY = 560,
IMAGE2DARRAY = 561,
IIMAGE2DARRAY = 562,
UIMAGE2DARRAY = 563,
IMAGECUBEARRAY = 564,
IIMAGECUBEARRAY = 565,
UIMAGECUBEARRAY = 566,
IMAGE2DMS = 567,
IIMAGE2DMS = 568,
UIMAGE2DMS = 569,
IMAGE2DMSARRAY = 570,
IIMAGE2DMSARRAY = 571,
UIMAGE2DMSARRAY = 572,
F16IMAGE1D = 573,
F16IMAGE2D = 574,
F16IMAGE3D = 575,
F16IMAGE2DRECT = 576,
F16IMAGECUBE = 577,
F16IMAGE1DARRAY = 578,
F16IMAGE2DARRAY = 579,
F16IMAGECUBEARRAY = 580,
F16IMAGEBUFFER = 581,
F16IMAGE2DMS = 582,
F16IMAGE2DMSARRAY = 583,
STRUCT = 584,
VOID = 585,
WHILE = 586,
IDENTIFIER = 587,
TYPE_NAME = 588,
FLOATCONSTANT = 589,
DOUBLECONSTANT = 590,
INT16CONSTANT = 591,
UINT16CONSTANT = 592,
INT32CONSTANT = 593,
UINT32CONSTANT = 594,
INTCONSTANT = 595,
UINTCONSTANT = 596,
INT64CONSTANT = 597,
UINT64CONSTANT = 598,
BOOLCONSTANT = 599,
FLOAT16CONSTANT = 600,
LEFT_OP = 601,
RIGHT_OP = 602,
INC_OP = 603,
DEC_OP = 604,
LE_OP = 605,
GE_OP = 606,
EQ_OP = 607,
NE_OP = 608,
AND_OP = 609,
OR_OP = 610,
XOR_OP = 611,
MUL_ASSIGN = 612,
DIV_ASSIGN = 613,
ADD_ASSIGN = 614,
MOD_ASSIGN = 615,
LEFT_ASSIGN = 616,
RIGHT_ASSIGN = 617,
AND_ASSIGN = 618,
XOR_ASSIGN = 619,
OR_ASSIGN = 620,
SUB_ASSIGN = 621,
LEFT_PAREN = 622,
RIGHT_PAREN = 623,
LEFT_BRACKET = 624,
RIGHT_BRACKET = 625,
LEFT_BRACE = 626,
RIGHT_BRACE = 627,
DOT = 628,
COMMA = 629,
COLON = 630,
EQUAL = 631,
SEMICOLON = 632,
BANG = 633,
DASH = 634,
TILDE = 635,
PLUS = 636,
STAR = 637,
SLASH = 638,
PERCENT = 639,
LEFT_ANGLE = 640,
RIGHT_ANGLE = 641,
VERTICAL_BAR = 642,
CARET = 643,
AMPERSAND = 644,
QUESTION = 645,
INVARIANT = 646,
PRECISE = 647,
HIGH_PRECISION = 648,
MEDIUM_PRECISION = 649,
LOW_PRECISION = 650,
PRECISION = 651,
PACKED = 652,
RESOURCE = 653,
SUPERP = 654
PAYLOADNV = 338,
PAYLOADINNV = 339,
HITATTRNV = 340,
COHERENT = 341,
VOLATILE = 342,
RESTRICT = 343,
READONLY = 344,
WRITEONLY = 345,
DEVICECOHERENT = 346,
QUEUEFAMILYCOHERENT = 347,
WORKGROUPCOHERENT = 348,
SUBGROUPCOHERENT = 349,
NONPRIVATE = 350,
DVEC2 = 351,
DVEC3 = 352,
DVEC4 = 353,
DMAT2 = 354,
DMAT3 = 355,
DMAT4 = 356,
F16VEC2 = 357,
F16VEC3 = 358,
F16VEC4 = 359,
F16MAT2 = 360,
F16MAT3 = 361,
F16MAT4 = 362,
F32VEC2 = 363,
F32VEC3 = 364,
F32VEC4 = 365,
F32MAT2 = 366,
F32MAT3 = 367,
F32MAT4 = 368,
F64VEC2 = 369,
F64VEC3 = 370,
F64VEC4 = 371,
F64MAT2 = 372,
F64MAT3 = 373,
F64MAT4 = 374,
NOPERSPECTIVE = 375,
FLAT = 376,
SMOOTH = 377,
LAYOUT = 378,
EXPLICITINTERPAMD = 379,
PERVERTEXNV = 380,
PERPRIMITIVENV = 381,
PERVIEWNV = 382,
PERTASKNV = 383,
MAT2X2 = 384,
MAT2X3 = 385,
MAT2X4 = 386,
MAT3X2 = 387,
MAT3X3 = 388,
MAT3X4 = 389,
MAT4X2 = 390,
MAT4X3 = 391,
MAT4X4 = 392,
DMAT2X2 = 393,
DMAT2X3 = 394,
DMAT2X4 = 395,
DMAT3X2 = 396,
DMAT3X3 = 397,
DMAT3X4 = 398,
DMAT4X2 = 399,
DMAT4X3 = 400,
DMAT4X4 = 401,
F16MAT2X2 = 402,
F16MAT2X3 = 403,
F16MAT2X4 = 404,
F16MAT3X2 = 405,
F16MAT3X3 = 406,
F16MAT3X4 = 407,
F16MAT4X2 = 408,
F16MAT4X3 = 409,
F16MAT4X4 = 410,
F32MAT2X2 = 411,
F32MAT2X3 = 412,
F32MAT2X4 = 413,
F32MAT3X2 = 414,
F32MAT3X3 = 415,
F32MAT3X4 = 416,
F32MAT4X2 = 417,
F32MAT4X3 = 418,
F32MAT4X4 = 419,
F64MAT2X2 = 420,
F64MAT2X3 = 421,
F64MAT2X4 = 422,
F64MAT3X2 = 423,
F64MAT3X3 = 424,
F64MAT3X4 = 425,
F64MAT4X2 = 426,
F64MAT4X3 = 427,
F64MAT4X4 = 428,
ATOMIC_UINT = 429,
ACCSTRUCTNV = 430,
SAMPLER1D = 431,
SAMPLER2D = 432,
SAMPLER3D = 433,
SAMPLERCUBE = 434,
SAMPLER1DSHADOW = 435,
SAMPLER2DSHADOW = 436,
SAMPLERCUBESHADOW = 437,
SAMPLER1DARRAY = 438,
SAMPLER2DARRAY = 439,
SAMPLER1DARRAYSHADOW = 440,
SAMPLER2DARRAYSHADOW = 441,
ISAMPLER1D = 442,
ISAMPLER2D = 443,
ISAMPLER3D = 444,
ISAMPLERCUBE = 445,
ISAMPLER1DARRAY = 446,
ISAMPLER2DARRAY = 447,
USAMPLER1D = 448,
USAMPLER2D = 449,
USAMPLER3D = 450,
USAMPLERCUBE = 451,
USAMPLER1DARRAY = 452,
USAMPLER2DARRAY = 453,
SAMPLER2DRECT = 454,
SAMPLER2DRECTSHADOW = 455,
ISAMPLER2DRECT = 456,
USAMPLER2DRECT = 457,
SAMPLERBUFFER = 458,
ISAMPLERBUFFER = 459,
USAMPLERBUFFER = 460,
SAMPLERCUBEARRAY = 461,
SAMPLERCUBEARRAYSHADOW = 462,
ISAMPLERCUBEARRAY = 463,
USAMPLERCUBEARRAY = 464,
SAMPLER2DMS = 465,
ISAMPLER2DMS = 466,
USAMPLER2DMS = 467,
SAMPLER2DMSARRAY = 468,
ISAMPLER2DMSARRAY = 469,
USAMPLER2DMSARRAY = 470,
SAMPLEREXTERNALOES = 471,
F16SAMPLER1D = 472,
F16SAMPLER2D = 473,
F16SAMPLER3D = 474,
F16SAMPLER2DRECT = 475,
F16SAMPLERCUBE = 476,
F16SAMPLER1DARRAY = 477,
F16SAMPLER2DARRAY = 478,
F16SAMPLERCUBEARRAY = 479,
F16SAMPLERBUFFER = 480,
F16SAMPLER2DMS = 481,
F16SAMPLER2DMSARRAY = 482,
F16SAMPLER1DSHADOW = 483,
F16SAMPLER2DSHADOW = 484,
F16SAMPLER1DARRAYSHADOW = 485,
F16SAMPLER2DARRAYSHADOW = 486,
F16SAMPLER2DRECTSHADOW = 487,
F16SAMPLERCUBESHADOW = 488,
F16SAMPLERCUBEARRAYSHADOW = 489,
SAMPLER = 490,
SAMPLERSHADOW = 491,
TEXTURE1D = 492,
TEXTURE2D = 493,
TEXTURE3D = 494,
TEXTURECUBE = 495,
TEXTURE1DARRAY = 496,
TEXTURE2DARRAY = 497,
ITEXTURE1D = 498,
ITEXTURE2D = 499,
ITEXTURE3D = 500,
ITEXTURECUBE = 501,
ITEXTURE1DARRAY = 502,
ITEXTURE2DARRAY = 503,
UTEXTURE1D = 504,
UTEXTURE2D = 505,
UTEXTURE3D = 506,
UTEXTURECUBE = 507,
UTEXTURE1DARRAY = 508,
UTEXTURE2DARRAY = 509,
TEXTURE2DRECT = 510,
ITEXTURE2DRECT = 511,
UTEXTURE2DRECT = 512,
TEXTUREBUFFER = 513,
ITEXTUREBUFFER = 514,
UTEXTUREBUFFER = 515,
TEXTURECUBEARRAY = 516,
ITEXTURECUBEARRAY = 517,
UTEXTURECUBEARRAY = 518,
TEXTURE2DMS = 519,
ITEXTURE2DMS = 520,
UTEXTURE2DMS = 521,
TEXTURE2DMSARRAY = 522,
ITEXTURE2DMSARRAY = 523,
UTEXTURE2DMSARRAY = 524,
F16TEXTURE1D = 525,
F16TEXTURE2D = 526,
F16TEXTURE3D = 527,
F16TEXTURE2DRECT = 528,
F16TEXTURECUBE = 529,
F16TEXTURE1DARRAY = 530,
F16TEXTURE2DARRAY = 531,
F16TEXTURECUBEARRAY = 532,
F16TEXTUREBUFFER = 533,
F16TEXTURE2DMS = 534,
F16TEXTURE2DMSARRAY = 535,
SUBPASSINPUT = 536,
SUBPASSINPUTMS = 537,
ISUBPASSINPUT = 538,
ISUBPASSINPUTMS = 539,
USUBPASSINPUT = 540,
USUBPASSINPUTMS = 541,
F16SUBPASSINPUT = 542,
F16SUBPASSINPUTMS = 543,
IMAGE1D = 544,
IIMAGE1D = 545,
UIMAGE1D = 546,
IMAGE2D = 547,
IIMAGE2D = 548,
UIMAGE2D = 549,
IMAGE3D = 550,
IIMAGE3D = 551,
UIMAGE3D = 552,
IMAGE2DRECT = 553,
IIMAGE2DRECT = 554,
UIMAGE2DRECT = 555,
IMAGECUBE = 556,
IIMAGECUBE = 557,
UIMAGECUBE = 558,
IMAGEBUFFER = 559,
IIMAGEBUFFER = 560,
UIMAGEBUFFER = 561,
IMAGE1DARRAY = 562,
IIMAGE1DARRAY = 563,
UIMAGE1DARRAY = 564,
IMAGE2DARRAY = 565,
IIMAGE2DARRAY = 566,
UIMAGE2DARRAY = 567,
IMAGECUBEARRAY = 568,
IIMAGECUBEARRAY = 569,
UIMAGECUBEARRAY = 570,
IMAGE2DMS = 571,
IIMAGE2DMS = 572,
UIMAGE2DMS = 573,
IMAGE2DMSARRAY = 574,
IIMAGE2DMSARRAY = 575,
UIMAGE2DMSARRAY = 576,
F16IMAGE1D = 577,
F16IMAGE2D = 578,
F16IMAGE3D = 579,
F16IMAGE2DRECT = 580,
F16IMAGECUBE = 581,
F16IMAGE1DARRAY = 582,
F16IMAGE2DARRAY = 583,
F16IMAGECUBEARRAY = 584,
F16IMAGEBUFFER = 585,
F16IMAGE2DMS = 586,
F16IMAGE2DMSARRAY = 587,
STRUCT = 588,
VOID = 589,
WHILE = 590,
IDENTIFIER = 591,
TYPE_NAME = 592,
FLOATCONSTANT = 593,
DOUBLECONSTANT = 594,
INT16CONSTANT = 595,
UINT16CONSTANT = 596,
INT32CONSTANT = 597,
UINT32CONSTANT = 598,
INTCONSTANT = 599,
UINTCONSTANT = 600,
INT64CONSTANT = 601,
UINT64CONSTANT = 602,
BOOLCONSTANT = 603,
FLOAT16CONSTANT = 604,
LEFT_OP = 605,
RIGHT_OP = 606,
INC_OP = 607,
DEC_OP = 608,
LE_OP = 609,
GE_OP = 610,
EQ_OP = 611,
NE_OP = 612,
AND_OP = 613,
OR_OP = 614,
XOR_OP = 615,
MUL_ASSIGN = 616,
DIV_ASSIGN = 617,
ADD_ASSIGN = 618,
MOD_ASSIGN = 619,
LEFT_ASSIGN = 620,
RIGHT_ASSIGN = 621,
AND_ASSIGN = 622,
XOR_ASSIGN = 623,
OR_ASSIGN = 624,
SUB_ASSIGN = 625,
LEFT_PAREN = 626,
RIGHT_PAREN = 627,
LEFT_BRACKET = 628,
RIGHT_BRACKET = 629,
LEFT_BRACE = 630,
RIGHT_BRACE = 631,
DOT = 632,
COMMA = 633,
COLON = 634,
EQUAL = 635,
SEMICOLON = 636,
BANG = 637,
DASH = 638,
TILDE = 639,
PLUS = 640,
STAR = 641,
SLASH = 642,
PERCENT = 643,
LEFT_ANGLE = 644,
RIGHT_ANGLE = 645,
VERTICAL_BAR = 646,
CARET = 647,
AMPERSAND = 648,
QUESTION = 649,
INVARIANT = 650,
PRECISE = 651,
HIGH_PRECISION = 652,
MEDIUM_PRECISION = 653,
LOW_PRECISION = 654,
PRECISION = 655,
PACKED = 656,
RESOURCE = 657,
SUPERP = 658
};
#endif
@ -485,7 +489,7 @@ union YYSTYPE
};
} interm;
#line 489 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909 */
#line 493 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909 */
};
typedef union YYSTYPE YYSTYPE;

View file

@ -1049,6 +1049,10 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break;
#ifdef NV_EXTENSIONS
case EOpTraceNV: out.debug << "traceNVX"; break;
case EOpReportIntersectionNV: out.debug << "reportIntersectionNVX"; break;
case EOpIgnoreIntersectionNV: out.debug << "ignoreIntersectionNVX"; break;
case EOpTerminateRayNV: out.debug << "terminateRayNVX"; break;
case EOpWritePackedPrimitiveIndices4x8NV: out.debug << "writePackedPrimitiveIndices4x8NV"; break;
#endif

View file

@ -279,6 +279,9 @@ void TIntermediate::mergeTrees(TInfoSink& infoSink, TIntermediate& unit)
}
// Getting this far means we have two existing trees to merge...
#ifdef NV_EXTENSIONS
numShaderRecordNVBlocks += unit.numShaderRecordNVBlocks;
#endif
#ifdef NV_EXTENSIONS
numTaskNVBlocks += unit.numTaskNVBlocks;
@ -710,6 +713,15 @@ void TIntermediate::finalCheck(TInfoSink& infoSink, bool keepUncalled)
break;
#ifdef NV_EXTENSIONS
case EShLangRayGenNV:
case EShLangIntersectNV:
case EShLangAnyHitNV:
case EShLangClosestHitNV:
case EShLangMissNV:
case EShLangCallableNV:
if (numShaderRecordNVBlocks > 1)
error(infoSink, "Only one shaderRecordNVX buffer block is allowed per stage");
break;
case EShLangMeshNV:
if (outputPrimitive == ElgNone)
error(infoSink, "At least one shader must specify an output layout primitive");

View file

@ -236,6 +236,7 @@ public:
#ifdef NV_EXTENSIONS
layoutOverrideCoverage(false),
geoPassthroughEXT(false),
numShaderRecordNVBlocks(0),
computeDerivativeMode(LayoutDerivativeNone),
primitives(TQualifier::layoutNotSet),
numTaskNVBlocks(0),
@ -430,6 +431,7 @@ public:
int getNumErrors() const { return numErrors; }
void addPushConstantCount() { ++numPushConstants; }
#ifdef NV_EXTENSIONS
void addShaderRecordNVCount() { ++numShaderRecordNVBlocks; }
void addTaskNVCount() { ++numTaskNVBlocks; }
#endif
@ -753,6 +755,7 @@ protected:
#ifdef NV_EXTENSIONS
bool layoutOverrideCoverage;
bool geoPassthroughEXT;
int numShaderRecordNVBlocks;
ComputeDerivativeMode computeDerivativeMode;
int primitives;
int numTaskNVBlocks;