add optimizerAllowExpandedIDBound to SpvOptions

This option increases the max_id_bound in the optimizer to 0x3FFFFFFF, and then runs a
compact-id pass if the final result has a max_id greater than the standard limit of 0x3FFFFF.
This commit is contained in:
Malcolm Bechard 2024-07-30 16:06:37 -04:00 committed by arcady-lunarg
parent 7e896697dc
commit 8590f62c14
3 changed files with 13 additions and 0 deletions

View File

@ -53,6 +53,7 @@ struct SpvOptions {
bool emitNonSemanticShaderDebugInfo {false}; bool emitNonSemanticShaderDebugInfo {false};
bool emitNonSemanticShaderDebugSource{ false }; bool emitNonSemanticShaderDebugSource{ false };
bool compileOnly{false}; bool compileOnly{false};
bool optimizerAllowExpandedIDBound{false};
}; };
void GetSpirvVersion(std::string&); void GetSpirvVersion(std::string&);

View File

@ -219,9 +219,20 @@ void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector
optimizer.RegisterPass(spvtools::CreateCFGCleanupPass()); optimizer.RegisterPass(spvtools::CreateCFGCleanupPass());
spvtools::OptimizerOptions spvOptOptions; spvtools::OptimizerOptions spvOptOptions;
if (options->optimizerAllowExpandedIDBound)
spvOptOptions.set_max_id_bound(0x3FFFFFFF);
optimizer.SetTargetEnv(MapToSpirvToolsEnv(intermediate.getSpv(), logger)); optimizer.SetTargetEnv(MapToSpirvToolsEnv(intermediate.getSpv(), logger));
spvOptOptions.set_run_validator(false); // The validator may run as a separate step later on spvOptOptions.set_run_validator(false); // The validator may run as a separate step later on
optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions); optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions);
if (options->optimizerAllowExpandedIDBound) {
if (spirv.size() > 3 && spirv[3] > kDefaultMaxIdBound) {
spvtools::Optimizer optimizer2(target_env);
optimizer2.SetMessageConsumer(OptimizerMesssageConsumer);
optimizer2.RegisterPass(spvtools::CreateCompactIdsPass());
optimizer2.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions);
}
}
} }
bool SpirvToolsAnalyzeDeadOutputStores(spv_target_env target_env, std::vector<unsigned int>& spirv, bool SpirvToolsAnalyzeDeadOutputStores(spv_target_env target_env, std::vector<unsigned int>& spirv,

View File

@ -237,6 +237,7 @@ typedef struct glslang_spv_options_s {
bool emit_nonsemantic_shader_debug_info; bool emit_nonsemantic_shader_debug_info;
bool emit_nonsemantic_shader_debug_source; bool emit_nonsemantic_shader_debug_source;
bool compile_only; bool compile_only;
bool optimize_allow_expanded_id_bound;
} glslang_spv_options_t; } glslang_spv_options_t;
#ifdef __cplusplus #ifdef __cplusplus