Commit 95e2d4ec by Sahil Parmar

Add ES 320 support and additional error checks for SPV_NV_mesh_shader

- Add ES 320 support - Error out use of perprimitiveNV for non mesh/fragment shaders - Error out use of mesh/task shaders w/o use of NV_mesh_shader - Error out use of NV_mesh_shader for non task/mesh shaders - Error out use of perviewNV for non mesh shaders - Error out use of taskNV for non mesh/task shaders - Add test case for mesh shader with ES 320 profile
parent a8453d4b
#version 450 #version 320 es
#define MAX_VER 81 #define MAX_VER 81
#define MAX_PRIM 32 #define MAX_PRIM 32
...@@ -36,8 +36,8 @@ layout(location=20) out myblock2 { ...@@ -36,8 +36,8 @@ layout(location=20) out myblock2 {
void main() void main()
{ {
uint iid = gl_LocalInvocationID.x; int iid = int(gl_LocalInvocationID.x);
uint gid = gl_WorkGroupID.x; int gid = int(gl_WorkGroupID.x);
blk[iid].f = 11.0; blk[iid].f = 11.0;
blk[iid+1].fArr[gid] = blk[iid].f; blk[iid+1].fArr[gid] = blk[iid].f;
......
...@@ -4878,7 +4878,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV ...@@ -4878,7 +4878,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
"void barrier();" "void barrier();"
); );
#ifdef NV_EXTENSIONS #ifdef NV_EXTENSIONS
if ((profile != EEsProfile && version >= 450) || esBarrier) { if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
stageBuiltins[EShLangMeshNV].append( stageBuiltins[EShLangMeshNV].append(
"void barrier();" "void barrier();"
); );
...@@ -4903,7 +4903,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV ...@@ -4903,7 +4903,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
); );
} }
#ifdef NV_EXTENSIONS #ifdef NV_EXTENSIONS
if (profile != EEsProfile && version >= 450) { if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
stageBuiltins[EShLangMeshNV].append( stageBuiltins[EShLangMeshNV].append(
"void memoryBarrierShared();" "void memoryBarrierShared();"
"void groupMemoryBarrier();" "void groupMemoryBarrier();"
...@@ -5094,7 +5094,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV ...@@ -5094,7 +5094,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
} }
// Builtins for GL_NV_mesh_shader // Builtins for GL_NV_mesh_shader
if (profile != EEsProfile && version >= 450) { if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
stageBuiltins[EShLangMeshNV].append( stageBuiltins[EShLangMeshNV].append(
"void writePackedPrimitiveIndices4x8NV(uint, uint);" "void writePackedPrimitiveIndices4x8NV(uint, uint);"
"\n"); "\n");
...@@ -5287,7 +5287,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV ...@@ -5287,7 +5287,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
// //
//============================================================================ //============================================================================
if (profile != EEsProfile && version >= 450) { if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
// per-vertex attributes // per-vertex attributes
stageBuiltins[EShLangMeshNV].append( stageBuiltins[EShLangMeshNV].append(
"out gl_MeshPerVertexNV {" "out gl_MeshPerVertexNV {"
...@@ -5328,17 +5328,8 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV ...@@ -5328,17 +5328,8 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
"in highp uvec3 gl_GlobalInvocationID;" "in highp uvec3 gl_GlobalInvocationID;"
"in highp uint gl_LocalInvocationIndex;" "in highp uint gl_LocalInvocationIndex;"
"in highp int gl_DeviceIndex;" // GL_EXT_device_group
"in int gl_DrawIDARB;" // GL_ARB_shader_draw_parameters
"\n"); "\n");
if (version >= 460) {
stageBuiltins[EShLangMeshNV].append(
"in int gl_DrawID;"
);
}
stageBuiltins[EShLangTaskNV].append( stageBuiltins[EShLangTaskNV].append(
"out uint gl_TaskCountNV;" "out uint gl_TaskCountNV;"
...@@ -5350,15 +5341,28 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV ...@@ -5350,15 +5341,28 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
"in highp uvec3 gl_GlobalInvocationID;" "in highp uvec3 gl_GlobalInvocationID;"
"in highp uint gl_LocalInvocationIndex;" "in highp uint gl_LocalInvocationIndex;"
"\n");
}
if (profile != EEsProfile && version >= 450) {
stageBuiltins[EShLangMeshNV].append(
"in highp int gl_DeviceIndex;" // GL_EXT_device_group "in highp int gl_DeviceIndex;" // GL_EXT_device_group
"in int gl_DrawIDARB;" // GL_ARB_shader_draw_parameters "in int gl_DrawIDARB;" // GL_ARB_shader_draw_parameters
"\n");
stageBuiltins[EShLangTaskNV].append(
"in highp int gl_DeviceIndex;" // GL_EXT_device_group
"in int gl_DrawIDARB;" // GL_ARB_shader_draw_parameters
"\n"); "\n");
if (version >= 460) { if (version >= 460) {
stageBuiltins[EShLangMeshNV].append(
"in int gl_DrawID;"
"\n");
stageBuiltins[EShLangTaskNV].append( stageBuiltins[EShLangTaskNV].append(
"in int gl_DrawID;" "in int gl_DrawID;"
); "\n");
} }
} }
#endif #endif
...@@ -7658,7 +7662,7 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf ...@@ -7658,7 +7662,7 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf
#ifdef NV_EXTENSIONS #ifdef NV_EXTENSIONS
// SPV_NV_mesh_shader // SPV_NV_mesh_shader
if (profile != EEsProfile && version >= 450) { if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
snprintf(builtInConstant, maxSize, "const int gl_MaxMeshOutputVerticesNV = %d;", resources.maxMeshOutputVerticesNV); snprintf(builtInConstant, maxSize, "const int gl_MaxMeshOutputVerticesNV = %d;", resources.maxMeshOutputVerticesNV);
s.append(builtInConstant); s.append(builtInConstant);
...@@ -8633,7 +8637,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion ...@@ -8633,7 +8637,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
} }
break; break;
case EShLangMeshNV: case EShLangMeshNV:
if (profile != EEsProfile && version >= 450) { if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
// Per-vertex builtins // Per-vertex builtins
BuiltInVariable("gl_MeshVerticesNV", "gl_Position", EbvPosition, symbolTable); BuiltInVariable("gl_MeshVerticesNV", "gl_Position", EbvPosition, symbolTable);
BuiltInVariable("gl_MeshVerticesNV", "gl_PointSize", EbvPointSize, symbolTable); BuiltInVariable("gl_MeshVerticesNV", "gl_PointSize", EbvPointSize, symbolTable);
...@@ -8681,7 +8685,9 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion ...@@ -8681,7 +8685,9 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
symbolTable.setFunctionExtensions("barrier", 1, &E_GL_NV_mesh_shader); symbolTable.setFunctionExtensions("barrier", 1, &E_GL_NV_mesh_shader);
symbolTable.setFunctionExtensions("memoryBarrierShared", 1, &E_GL_NV_mesh_shader); symbolTable.setFunctionExtensions("memoryBarrierShared", 1, &E_GL_NV_mesh_shader);
symbolTable.setFunctionExtensions("groupMemoryBarrier", 1, &E_GL_NV_mesh_shader); symbolTable.setFunctionExtensions("groupMemoryBarrier", 1, &E_GL_NV_mesh_shader);
}
if (profile != EEsProfile && version >= 450) {
// GL_EXT_device_group // GL_EXT_device_group
symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group); symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable); BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
...@@ -8743,7 +8749,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion ...@@ -8743,7 +8749,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
break; break;
case EShLangTaskNV: case EShLangTaskNV:
if (profile != EEsProfile && version >= 450) { if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
symbolTable.setVariableExtensions("gl_TaskCountNV", 1, &E_GL_NV_mesh_shader); symbolTable.setVariableExtensions("gl_TaskCountNV", 1, &E_GL_NV_mesh_shader);
symbolTable.setVariableExtensions("gl_WorkGroupSize", 1, &E_GL_NV_mesh_shader); symbolTable.setVariableExtensions("gl_WorkGroupSize", 1, &E_GL_NV_mesh_shader);
symbolTable.setVariableExtensions("gl_WorkGroupID", 1, &E_GL_NV_mesh_shader); symbolTable.setVariableExtensions("gl_WorkGroupID", 1, &E_GL_NV_mesh_shader);
...@@ -8763,7 +8769,9 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion ...@@ -8763,7 +8769,9 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
symbolTable.setFunctionExtensions("barrier", 1, &E_GL_NV_mesh_shader); symbolTable.setFunctionExtensions("barrier", 1, &E_GL_NV_mesh_shader);
symbolTable.setFunctionExtensions("memoryBarrierShared", 1, &E_GL_NV_mesh_shader); symbolTable.setFunctionExtensions("memoryBarrierShared", 1, &E_GL_NV_mesh_shader);
symbolTable.setFunctionExtensions("groupMemoryBarrier", 1, &E_GL_NV_mesh_shader); symbolTable.setFunctionExtensions("groupMemoryBarrier", 1, &E_GL_NV_mesh_shader);
}
if (profile != EEsProfile && version >= 450) {
// GL_EXT_device_group // GL_EXT_device_group
symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group); symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable); BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
...@@ -9379,12 +9387,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion ...@@ -9379,12 +9387,12 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
} }
break; break;
case EShLangMeshNV: case EShLangMeshNV:
if (profile != EEsProfile && version >= 450) { if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
symbolTable.relateToOperator("writePackedPrimitiveIndices4x8NV", EOpWritePackedPrimitiveIndices4x8NV); symbolTable.relateToOperator("writePackedPrimitiveIndices4x8NV", EOpWritePackedPrimitiveIndices4x8NV);
} }
// fall through // fall through
case EShLangTaskNV: case EShLangTaskNV:
if (profile != EEsProfile && version >= 450) { if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
symbolTable.relateToOperator("memoryBarrierShared", EOpMemoryBarrierShared); symbolTable.relateToOperator("memoryBarrierShared", EOpMemoryBarrierShared);
symbolTable.relateToOperator("groupMemoryBarrier", EOpGroupMemoryBarrier); symbolTable.relateToOperator("groupMemoryBarrier", EOpGroupMemoryBarrier);
} }
......
...@@ -612,7 +612,7 @@ int TParseContext::getIoArrayImplicitSize(bool isPerPrimitive) const ...@@ -612,7 +612,7 @@ int TParseContext::getIoArrayImplicitSize(bool isPerPrimitive) const
return 3; //Number of vertices for Fragment shader is always three. return 3; //Number of vertices for Fragment shader is always three.
else if (language == EShLangMeshNV) { else if (language == EShLangMeshNV) {
if (isPerPrimitive) { if (isPerPrimitive) {
return intermediate.getPrimitives() != TQualifier::layoutNotSet ? intermediate.getPrimitives() : 0; return intermediate.getPrimitives() != TQualifier::layoutNotSet ? intermediate.getPrimitives() : 0;
} else { } else {
return intermediate.getVertices() != TQualifier::layoutNotSet ? intermediate.getVertices() : 0; return intermediate.getVertices() != TQualifier::layoutNotSet ? intermediate.getVertices() : 0;
} }
...@@ -3600,6 +3600,13 @@ void TParseContext::arraySizesCheck(const TSourceLoc& loc, const TQualifier& qua ...@@ -3600,6 +3600,13 @@ void TParseContext::arraySizesCheck(const TSourceLoc& loc, const TQualifier& qua
extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader)) extensionsTurnedOn(Num_AEP_tessellation_shader, AEP_tessellation_shader))
return; return;
break; break;
#ifdef NV_EXTENSIONS
case EShLangMeshNV:
if (qualifier.storage == EvqVaryingOut)
if ((profile == EEsProfile && version >= 320) ||
extensionTurnedOn(E_GL_NV_mesh_shader))
return;
#endif
default: default:
break; break;
} }
...@@ -4460,6 +4467,12 @@ void TParseContext::finish() ...@@ -4460,6 +4467,12 @@ void TParseContext::finish()
if (profile != EEsProfile && version < 430) if (profile != EEsProfile && version < 430)
requireExtensions(getCurrentLoc(), 1, &E_GL_ARB_compute_shader, "compute shaders"); requireExtensions(getCurrentLoc(), 1, &E_GL_ARB_compute_shader, "compute shaders");
break; break;
#ifdef NV_EXTENSIONS
case EShLangTaskNV:
case EShLangMeshNV:
requireExtensions(getCurrentLoc(), 1, &E_GL_NV_mesh_shader, "mesh shaders");
break;
#endif
default: default:
break; break;
} }
...@@ -4963,12 +4976,14 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi ...@@ -4963,12 +4976,14 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
#ifdef NV_EXTENSIONS #ifdef NV_EXTENSIONS
case EShLangMeshNV: case EShLangMeshNV:
if (id == "max_vertices") { if (id == "max_vertices") {
requireExtensions(loc, 1, &E_GL_NV_mesh_shader, "max_vertices");
publicType.shaderQualifiers.vertices = value; publicType.shaderQualifiers.vertices = value;
if (value > resources.maxMeshOutputVerticesNV) if (value > resources.maxMeshOutputVerticesNV)
error(loc, "too large, must be less than gl_MaxMeshOutputVerticesNV", "max_vertices", ""); error(loc, "too large, must be less than gl_MaxMeshOutputVerticesNV", "max_vertices", "");
return; return;
} }
if (id == "max_primitives") { if (id == "max_primitives") {
requireExtensions(loc, 1, &E_GL_NV_mesh_shader, "max_primitives");
publicType.shaderQualifiers.primitives = value; publicType.shaderQualifiers.primitives = value;
if (value > resources.maxMeshOutputPrimitivesNV) if (value > resources.maxMeshOutputPrimitivesNV)
error(loc, "too large, must be less than gl_MaxMeshOutputPrimitivesNV", "max_primitives", ""); error(loc, "too large, must be less than gl_MaxMeshOutputPrimitivesNV", "max_primitives", "");
...@@ -4983,7 +4998,7 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi ...@@ -4983,7 +4998,7 @@ void TParseContext::setLayoutQualifier(const TSourceLoc& loc, TPublicType& publi
if (id.compare(0, 11, "local_size_") == 0) { if (id.compare(0, 11, "local_size_") == 0) {
#ifdef NV_EXTENSIONS #ifdef NV_EXTENSIONS
if (language == EShLangMeshNV || language == EShLangTaskNV) { if (language == EShLangMeshNV || language == EShLangTaskNV) {
profileRequires(loc, ~EEsProfile, 450, E_GL_NV_mesh_shader, "gl_WorkGroupSize"); requireExtensions(loc, 1, &E_GL_NV_mesh_shader, "gl_WorkGroupSize");
} }
else else
#endif #endif
......
...@@ -1591,8 +1591,9 @@ int TScanContext::tokenizeIdentifier() ...@@ -1591,8 +1591,9 @@ int TScanContext::tokenizeIdentifier()
case PERPRIMITIVENV: case PERPRIMITIVENV:
case PERVIEWNV: case PERVIEWNV:
case PERTASKNV: case PERTASKNV:
if (parseContext.profile != EEsProfile && if ((parseContext.profile != EEsProfile && parseContext.version >= 450) ||
(parseContext.version >= 450 || parseContext.extensionTurnedOn(E_GL_NV_mesh_shader))) (parseContext.profile == EEsProfile && parseContext.version >= 320) ||
parseContext.extensionTurnedOn(E_GL_NV_mesh_shader))
return keyword; return keyword;
return identifierOrType(); return identifierOrType();
#endif #endif
......
...@@ -361,13 +361,16 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable, TS ...@@ -361,13 +361,16 @@ bool InitializeSymbolTables(TInfoSink& infoSink, TSymbolTable** commonTable, TS
InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangMissNV, source, InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangMissNV, source,
infoSink, commonTable, symbolTables); infoSink, commonTable, symbolTables);
} }
// check for mesh // check for mesh
if (profile != EEsProfile && version >= 450) if ((profile != EEsProfile && version >= 450) ||
(profile == EEsProfile && version >= 320))
InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangMeshNV, source, InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangMeshNV, source,
infoSink, commonTable, symbolTables); infoSink, commonTable, symbolTables);
// check for task // check for task
if (profile != EEsProfile && version >= 450) if ((profile != EEsProfile && version >= 450) ||
(profile == EEsProfile && version >= 320))
InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangTaskNV, source, InitializeStageSymbolTable(*builtInParseables, version, profile, spvVersion, EShLangTaskNV, source,
infoSink, commonTable, symbolTables); infoSink, commonTable, symbolTables);
#endif #endif
...@@ -609,11 +612,11 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo ...@@ -609,11 +612,11 @@ bool DeduceVersionProfile(TInfoSink& infoSink, EShLanguage stage, bool versionNo
break; break;
case EShLangMeshNV: case EShLangMeshNV:
case EShLangTaskNV: case EShLangTaskNV:
if ((profile == EEsProfile) || if ((profile == EEsProfile && version < 320) ||
(profile != EEsProfile && version < 450)) { (profile != EEsProfile && version < 450)) {
correct = false; correct = false;
infoSink.info.message(EPrefixError, "#version: mesh/task shaders require non-es profile with version 450 or above"); infoSink.info.message(EPrefixError, "#version: mesh/task shaders require es profile with version 320 or above, or non-es profile with version 450 or above");
version = 450; version = profile == EEsProfile ? 320 : 450;
} }
#endif #endif
default: default:
......
...@@ -834,6 +834,23 @@ void TParseVersions::updateExtensionBehavior(const char* extension, TExtensionBe ...@@ -834,6 +834,23 @@ void TParseVersions::updateExtensionBehavior(const char* extension, TExtensionBe
} }
} }
#ifdef NV_EXTENSIONS
// Validate if extension name is used with correct shader stage.
bool TParseVersions::validateExtensionName(const TSourceLoc& loc, const char * const extension)
{
int lNumErrors = getNumErrors();
// GL_NV_mesh_shader extension is only allowed in task/mesh shaders
if (strcmp(extension, "GL_NV_mesh_shader") == 0)
requireStage(loc, (EShLanguageMask)(EShLangTaskNVMask | EShLangMeshNVMask),
"#extension GL_NV_mesh_shader");
if (getNumErrors() > lNumErrors)
return false;
return true;
}
#endif
// Call for any operation needing full GLSL integer data-type support. // Call for any operation needing full GLSL integer data-type support.
void TParseVersions::fullIntegerCheck(const TSourceLoc& loc, const char* op) void TParseVersions::fullIntegerCheck(const TSourceLoc& loc, const char* op)
{ {
......
...@@ -1158,7 +1158,9 @@ interpolation_qualifier ...@@ -1158,7 +1158,9 @@ interpolation_qualifier
| PERPRIMITIVENV { | PERPRIMITIVENV {
#ifdef NV_EXTENSIONS #ifdef NV_EXTENSIONS
parseContext.globalCheck($1.loc, "perprimitiveNV"); parseContext.globalCheck($1.loc, "perprimitiveNV");
parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangFragmentMask | EShLangMeshNVMask), "perprimitiveNV");
parseContext.profileRequires($1.loc, ECoreProfile, 450, E_GL_NV_mesh_shader, "perprimitiveNV"); parseContext.profileRequires($1.loc, ECoreProfile, 450, E_GL_NV_mesh_shader, "perprimitiveNV");
parseContext.profileRequires($1.loc, EEsProfile, 320, E_GL_NV_mesh_shader, "perprimitiveNV");
$$.init($1.loc); $$.init($1.loc);
$$.qualifier.perPrimitiveNV = true; $$.qualifier.perPrimitiveNV = true;
#endif #endif
...@@ -1166,7 +1168,9 @@ interpolation_qualifier ...@@ -1166,7 +1168,9 @@ interpolation_qualifier
| PERVIEWNV { | PERVIEWNV {
#ifdef NV_EXTENSIONS #ifdef NV_EXTENSIONS
parseContext.globalCheck($1.loc, "perviewNV"); parseContext.globalCheck($1.loc, "perviewNV");
parseContext.requireStage($1.loc, EShLangMeshNV, "perviewNV");
parseContext.profileRequires($1.loc, ECoreProfile, 450, E_GL_NV_mesh_shader, "perviewNV"); parseContext.profileRequires($1.loc, ECoreProfile, 450, E_GL_NV_mesh_shader, "perviewNV");
parseContext.profileRequires($1.loc, EEsProfile, 320, E_GL_NV_mesh_shader, "perviewNV");
$$.init($1.loc); $$.init($1.loc);
$$.qualifier.perViewNV = true; $$.qualifier.perViewNV = true;
#endif #endif
...@@ -1174,7 +1178,9 @@ interpolation_qualifier ...@@ -1174,7 +1178,9 @@ interpolation_qualifier
| PERTASKNV { | PERTASKNV {
#ifdef NV_EXTENSIONS #ifdef NV_EXTENSIONS
parseContext.globalCheck($1.loc, "taskNV"); parseContext.globalCheck($1.loc, "taskNV");
parseContext.requireStage($1.loc, (EShLanguageMask)(EShLangTaskNVMask | EShLangMeshNVMask), "taskNV");
parseContext.profileRequires($1.loc, ECoreProfile, 450, E_GL_NV_mesh_shader, "taskNV"); parseContext.profileRequires($1.loc, ECoreProfile, 450, E_GL_NV_mesh_shader, "taskNV");
parseContext.profileRequires($1.loc, EEsProfile, 320, E_GL_NV_mesh_shader, "taskNV");
$$.init($1.loc); $$.init($1.loc);
$$.qualifier.perTaskNV = true; $$.qualifier.perTaskNV = true;
#endif #endif
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -103,6 +103,9 @@ public: ...@@ -103,6 +103,9 @@ public:
virtual void requireSpv(const TSourceLoc&, const char* op); virtual void requireSpv(const TSourceLoc&, const char* op);
virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[], const char* featureDesc); virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[], const char* featureDesc);
virtual void updateExtensionBehavior(const char* const extension, TExtensionBehavior); virtual void updateExtensionBehavior(const char* const extension, TExtensionBehavior);
#ifdef NV_EXTENSIONS
virtual bool validateExtensionName(const TSourceLoc&, const char* const extension);
#endif
virtual void C_DECL error(const TSourceLoc&, const char* szReason, const char* szToken, virtual void C_DECL error(const TSourceLoc&, const char* szReason, const char* szToken,
const char* szExtraInfoFormat, ...) = 0; const char* szExtraInfoFormat, ...) = 0;
......
...@@ -874,6 +874,11 @@ int TPpContext::CPPextension(TPpToken* ppToken) ...@@ -874,6 +874,11 @@ int TPpContext::CPPextension(TPpToken* ppToken)
return token; return token;
} }
#ifdef NV_EXTENSIONS
if (!parseContext.validateExtensionName(ppToken->loc, extensionName))
return token;
#endif
parseContext.updateExtensionBehavior(line, extensionName, ppToken->name); parseContext.updateExtensionBehavior(line, extensionName, ppToken->name);
parseContext.notifyExtensionDirective(line, extensionName, ppToken->name); parseContext.notifyExtensionDirective(line, extensionName, ppToken->name);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment