Implement GL_EXT_maximal_reconvergence

This commit is contained in:
Jeff Bolz 2022-01-06 19:47:45 -06:00 committed by arcady-lunarg
parent 7eea61b5a3
commit 8066fa086b
16 changed files with 1452 additions and 1384 deletions

View file

@ -56,5 +56,6 @@ static const char* const E_SPV_KHR_fragment_shader_barycentric = "SPV_KHR_fragme
static const char* const E_SPV_AMD_shader_early_and_late_fragment_tests = "SPV_AMD_shader_early_and_late_fragment_tests"; static const char* const E_SPV_AMD_shader_early_and_late_fragment_tests = "SPV_AMD_shader_early_and_late_fragment_tests";
static const char* const E_SPV_KHR_ray_tracing_position_fetch = "SPV_KHR_ray_tracing_position_fetch"; static const char* const E_SPV_KHR_ray_tracing_position_fetch = "SPV_KHR_ray_tracing_position_fetch";
static const char* const E_SPV_KHR_cooperative_matrix = "SPV_KHR_cooperative_matrix"; static const char* const E_SPV_KHR_cooperative_matrix = "SPV_KHR_cooperative_matrix";
static const char* const E_SPV_KHR_maximal_reconvergence = "SPV_KHR_maximal_reconvergence";
#endif // #ifndef GLSLextKHR_H #endif // #ifndef GLSLextKHR_H

View file

@ -1635,6 +1635,10 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion,
builder.addExtension(spv::E_SPV_KHR_subgroup_uniform_control_flow); builder.addExtension(spv::E_SPV_KHR_subgroup_uniform_control_flow);
builder.addExecutionMode(shaderEntry, spv::ExecutionModeSubgroupUniformControlFlowKHR); builder.addExecutionMode(shaderEntry, spv::ExecutionModeSubgroupUniformControlFlowKHR);
} }
if (glslangIntermediate->getMaximalReconvergence()) {
builder.addExtension(spv::E_SPV_KHR_maximal_reconvergence);
builder.addExecutionMode(shaderEntry, spv::ExecutionModeMaximallyReconvergesKHR);
}
unsigned int mode; unsigned int mode;
switch (glslangIntermediate->getStage()) { switch (glslangIntermediate->getStage()) {

View file

@ -198,6 +198,7 @@ const char* ExecutionModeString(int mode)
case ExecutionModeStencilRefGreaterBackAMD: return "StencilRefGreaterBackAMD"; case ExecutionModeStencilRefGreaterBackAMD: return "StencilRefGreaterBackAMD";
case ExecutionModeStencilRefReplacingEXT: return "StencilRefReplacingEXT"; case ExecutionModeStencilRefReplacingEXT: return "StencilRefReplacingEXT";
case ExecutionModeSubgroupUniformControlFlowKHR: return "SubgroupUniformControlFlow"; case ExecutionModeSubgroupUniformControlFlowKHR: return "SubgroupUniformControlFlow";
case ExecutionModeMaximallyReconvergesKHR: return "MaximallyReconverges";
case ExecutionModeOutputLinesNV: return "OutputLinesNV"; case ExecutionModeOutputLinesNV: return "OutputLinesNV";
case ExecutionModeOutputPrimitivesNV: return "OutputPrimitivesNV"; case ExecutionModeOutputPrimitivesNV: return "OutputPrimitivesNV";

View file

@ -198,6 +198,7 @@ enum ExecutionMode {
ExecutionModeNoGlobalOffsetINTEL = 5895, ExecutionModeNoGlobalOffsetINTEL = 5895,
ExecutionModeNumSIMDWorkitemsINTEL = 5896, ExecutionModeNumSIMDWorkitemsINTEL = 5896,
ExecutionModeSchedulerTargetFmaxMhzINTEL = 5903, ExecutionModeSchedulerTargetFmaxMhzINTEL = 5903,
ExecutionModeMaximallyReconvergesKHR = 6023,
ExecutionModeStreamingInterfaceINTEL = 6154, ExecutionModeStreamingInterfaceINTEL = 6154,
ExecutionModeNamedBarrierCountINTEL = 6417, ExecutionModeNamedBarrierCountINTEL = 6417,
ExecutionModeMax = 0x7fffffff, ExecutionModeMax = 0x7fffffff,

View file

@ -0,0 +1,22 @@
spv.maximalReconvergence.vert
WARNING: 0:5: '' : attribute with arguments not recognized, skipping
// Module Version 10000
// Generated by (magic number): 8000b
// Id's are bound by 6
Capability Shader
Extension "SPV_KHR_maximal_reconvergence"
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main"
ExecutionMode 4 MaximallyReconverges
Source GLSL 460
SourceExtension "GL_EXT_maximal_reconvergence"
Name 4 "main"
2: TypeVoid
3: TypeFunction 2
4(main): 2 Function None 3
5: Label
Return
FunctionEnd

View file

@ -0,0 +1,7 @@
#version 460
#extension GL_EXT_maximal_reconvergence : enable
[[random(4)]] void main() [[maximal_reconvergence]]
{
}

View file

@ -258,6 +258,7 @@ void TParseVersions::initializeExtensionBehavior()
extensionBehavior[E_GL_EXT_shader_16bit_storage] = EBhDisable; extensionBehavior[E_GL_EXT_shader_16bit_storage] = EBhDisable;
extensionBehavior[E_GL_EXT_shader_8bit_storage] = EBhDisable; extensionBehavior[E_GL_EXT_shader_8bit_storage] = EBhDisable;
extensionBehavior[E_GL_EXT_subgroup_uniform_control_flow] = EBhDisable; extensionBehavior[E_GL_EXT_subgroup_uniform_control_flow] = EBhDisable;
extensionBehavior[E_GL_EXT_maximal_reconvergence] = EBhDisable;
extensionBehavior[E_GL_EXT_fragment_shader_barycentric] = EBhDisable; extensionBehavior[E_GL_EXT_fragment_shader_barycentric] = EBhDisable;
@ -446,6 +447,7 @@ void TParseVersions::getPreamble(std::string& preamble)
if (version >= 310) { if (version >= 310) {
preamble += "#define GL_EXT_null_initializer 1\n"; preamble += "#define GL_EXT_null_initializer 1\n";
preamble += "#define GL_EXT_subgroup_uniform_control_flow 1\n"; preamble += "#define GL_EXT_subgroup_uniform_control_flow 1\n";
preamble += "#define GL_EXT_maximal_reconvergence 1\n";
} }
} else { // !isEsProfile() } else { // !isEsProfile()
@ -599,6 +601,7 @@ void TParseVersions::getPreamble(std::string& preamble)
if (version >= 140) { if (version >= 140) {
preamble += "#define GL_EXT_null_initializer 1\n"; preamble += "#define GL_EXT_null_initializer 1\n";
preamble += "#define GL_EXT_subgroup_uniform_control_flow 1\n"; preamble += "#define GL_EXT_subgroup_uniform_control_flow 1\n";
preamble += "#define GL_EXT_maximal_reconvergence 1\n";
} }
if (version >= 130) { if (version >= 130) {
preamble +="#define GL_FRAGMENT_PRECISION_HIGH 1\n"; preamble +="#define GL_FRAGMENT_PRECISION_HIGH 1\n";

View file

@ -217,6 +217,7 @@ const char* const E_GL_EXT_mesh_shader = "GL_EXT_mesh_shade
const char* const E_GL_EXT_opacity_micromap = "GL_EXT_opacity_micromap"; const char* const E_GL_EXT_opacity_micromap = "GL_EXT_opacity_micromap";
const char* const E_GL_EXT_draw_instanced = "GL_EXT_draw_instanced"; const char* const E_GL_EXT_draw_instanced = "GL_EXT_draw_instanced";
const char* const E_GL_EXT_texture_array = "GL_EXT_texture_array"; const char* const E_GL_EXT_texture_array = "GL_EXT_texture_array";
const char* const E_GL_EXT_maximal_reconvergence = "GL_EXT_maximal_reconvergence";
// Arrays of extensions for the above viewportEXTs duplications // Arrays of extensions for the above viewportEXTs duplications

View file

@ -125,6 +125,8 @@ TAttributeType TParseContext::attributeFromName(const TString& name) const
return EatSubgroupUniformControlFlow; return EatSubgroupUniformControlFlow;
else if (name == "export") else if (name == "export")
return EatExport; return EatExport;
else if (name == "maximal_reconvergence")
return EatMaximalReconvergence;
else else
return EatNone; return EatNone;
} }
@ -360,6 +362,10 @@ void TParseContext::handleFunctionAttributes(const TSourceLoc& loc, const TAttri
requireExtensions(loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute"); requireExtensions(loc, 1, &E_GL_EXT_subgroup_uniform_control_flow, "attribute");
intermediate.setSubgroupUniformControlFlow(); intermediate.setSubgroupUniformControlFlow();
break; break;
case EatMaximalReconvergence:
requireExtensions(loc, 1, &E_GL_EXT_maximal_reconvergence, "attribute");
intermediate.setMaximalReconvergence();
break;
default: default:
warn(loc, "attribute does not apply to a function", "", ""); warn(loc, "attribute does not apply to a function", "", "");
break; break;

View file

@ -121,6 +121,7 @@ namespace glslang {
EatNonReadable, EatNonReadable,
EatSubgroupUniformControlFlow, EatSubgroupUniformControlFlow,
EatExport, EatExport,
EatMaximalReconvergence,
}; };
class TIntermAggregate; class TIntermAggregate;

View file

@ -964,18 +964,24 @@ function_prototype
$$.function = $1; $$.function = $1;
if (parseContext.compileOnly) $$.function->setExport(); if (parseContext.compileOnly) $$.function->setExport();
$$.loc = $2.loc; $$.loc = $2.loc;
const char * extensions[2] = { E_GL_EXT_subgroup_uniform_control_flow, E_GL_EXT_maximal_reconvergence };
parseContext.requireExtensions($2.loc, 2, extensions, "attribute");
parseContext.handleFunctionAttributes($2.loc, *$3); parseContext.handleFunctionAttributes($2.loc, *$3);
} }
| attribute function_declarator RIGHT_PAREN { | attribute function_declarator RIGHT_PAREN {
$$.function = $2; $$.function = $2;
if (parseContext.compileOnly) $$.function->setExport(); if (parseContext.compileOnly) $$.function->setExport();
$$.loc = $3.loc; $$.loc = $3.loc;
const char * extensions[2] = { E_GL_EXT_subgroup_uniform_control_flow, E_GL_EXT_maximal_reconvergence };
parseContext.requireExtensions($3.loc, 2, extensions, "attribute");
parseContext.handleFunctionAttributes($3.loc, *$1); parseContext.handleFunctionAttributes($3.loc, *$1);
} }
| attribute function_declarator RIGHT_PAREN attribute { | attribute function_declarator RIGHT_PAREN attribute {
$$.function = $2; $$.function = $2;
if (parseContext.compileOnly) $$.function->setExport(); if (parseContext.compileOnly) $$.function->setExport();
$$.loc = $3.loc; $$.loc = $3.loc;
const char * extensions[2] = { E_GL_EXT_subgroup_uniform_control_flow, E_GL_EXT_maximal_reconvergence };
parseContext.requireExtensions($3.loc, 2, extensions, "attribute");
parseContext.handleFunctionAttributes($3.loc, *$1); parseContext.handleFunctionAttributes($3.loc, *$1);
parseContext.handleFunctionAttributes($3.loc, *$4); parseContext.handleFunctionAttributes($3.loc, *$4);
} }

File diff suppressed because it is too large Load diff

View file

@ -1512,6 +1512,9 @@ void TIntermediate::output(TInfoSink& infoSink, bool tree)
if (getSubgroupUniformControlFlow()) if (getSubgroupUniformControlFlow())
infoSink.debug << "subgroup_uniform_control_flow\n"; infoSink.debug << "subgroup_uniform_control_flow\n";
if (getMaximalReconvergence())
infoSink.debug << "maximal_reconvergence\n";
switch (language) { switch (language) {
case EShLangVertex: case EShLangVertex:
break; break;

View file

@ -345,6 +345,7 @@ public:
needToLegalize(false), needToLegalize(false),
binaryDoubleOutput(false), binaryDoubleOutput(false),
subgroupUniformControlFlow(false), subgroupUniformControlFlow(false),
maximalReconvergence(false),
usePhysicalStorageBuffer(false), usePhysicalStorageBuffer(false),
spirvRequirement(nullptr), spirvRequirement(nullptr),
spirvExecutionMode(nullptr), spirvExecutionMode(nullptr),
@ -963,6 +964,9 @@ public:
void setSubgroupUniformControlFlow() { subgroupUniformControlFlow = true; } void setSubgroupUniformControlFlow() { subgroupUniformControlFlow = true; }
bool getSubgroupUniformControlFlow() const { return subgroupUniformControlFlow; } bool getSubgroupUniformControlFlow() const { return subgroupUniformControlFlow; }
void setMaximalReconvergence() { maximalReconvergence = true; }
bool getMaximalReconvergence() const { return maximalReconvergence; }
// GL_EXT_spirv_intrinsics // GL_EXT_spirv_intrinsics
void insertSpirvRequirement(const TSpirvRequirement* spirvReq); void insertSpirvRequirement(const TSpirvRequirement* spirvReq);
bool hasSpirvRequirement() const { return spirvRequirement != nullptr; } bool hasSpirvRequirement() const { return spirvRequirement != nullptr; }
@ -1226,6 +1230,7 @@ protected:
bool needToLegalize; bool needToLegalize;
bool binaryDoubleOutput; bool binaryDoubleOutput;
bool subgroupUniformControlFlow; bool subgroupUniformControlFlow;
bool maximalReconvergence;
bool usePhysicalStorageBuffer; bool usePhysicalStorageBuffer;
TSpirvRequirement* spirvRequirement; TSpirvRequirement* spirvRequirement;

View file

@ -436,6 +436,7 @@ INSTANTIATE_TEST_SUITE_P(
"spv.matFun.vert", "spv.matFun.vert",
"spv.matrix.frag", "spv.matrix.frag",
"spv.matrix2.frag", "spv.matrix2.frag",
"spv.maximalReconvergence.vert",
"spv.memoryQualifier.frag", "spv.memoryQualifier.frag",
"spv.merge-unreachable.frag", "spv.merge-unreachable.frag",
"spv.multiStruct.comp", "spv.multiStruct.comp",

View file

@ -5,14 +5,14 @@
"site" : "github", "site" : "github",
"subrepo" : "KhronosGroup/SPIRV-Tools", "subrepo" : "KhronosGroup/SPIRV-Tools",
"subdir" : "External/spirv-tools", "subdir" : "External/spirv-tools",
"commit": "f0cc85efdbbe3a46eae90e0f915dc1509836d0fc" "commit": "de3d5acc04fd203e3e5120a00f168465ecb2e4e4"
}, },
{ {
"name" : "spirv-tools/external/spirv-headers", "name" : "spirv-tools/external/spirv-headers",
"site" : "github", "site" : "github",
"subrepo" : "KhronosGroup/SPIRV-Headers", "subrepo" : "KhronosGroup/SPIRV-Headers",
"subdir" : "External/spirv-tools/external/spirv-headers", "subdir" : "External/spirv-tools/external/spirv-headers",
"commit" : "1c6bb2743599e6eb6f37b2969acc0aef812e32e3" "commit" : "ae6a8b39717523d96683bc0d20b541944e28072f"
}, },
{ {
"name": "googletest", "name": "googletest",