MCPcopy Create free account
hub / github.com/KhronosGroup/glslang / SpirvToolsTransform

Function SpirvToolsTransform

SPIRV/SpvTools.cpp:185–245  ·  view source on GitHub ↗

Apply the SPIRV-Tools optimizer to generated SPIR-V. HLSL SPIR-V is legalized in the process.

Source from the content-addressed store, hash-verified

183
184// Apply the SPIRV-Tools optimizer to generated SPIR-V. HLSL SPIR-V is legalized in the process.
185void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
186 spv::SpvBuildLogger* logger, const SpvOptions* options)
187{
188 spv_target_env target_env = MapToSpirvToolsEnv(intermediate.getSpv(), logger);
189
190 spvtools::Optimizer optimizer(target_env);
191 optimizer.SetMessageConsumer(OptimizerMesssageConsumer);
192
193 // If debug (specifically source line info) is being generated, propagate
194 // line information into all SPIR-V instructions. This avoids loss of
195 // information when instructions are deleted or moved. Later, remove
196 // redundant information to minimize final SPRIR-V size.
197 if (options->stripDebugInfo) {
198 optimizer.RegisterPass(spvtools::CreateStripDebugInfoPass());
199 }
200 optimizer.RegisterPass(spvtools::CreateWrapOpKillPass());
201 optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass());
202 optimizer.RegisterPass(spvtools::CreateMergeReturnPass());
203 optimizer.RegisterPass(spvtools::CreateInlineExhaustivePass());
204 optimizer.RegisterPass(spvtools::CreateEliminateDeadFunctionsPass());
205 optimizer.RegisterPass(spvtools::CreateScalarReplacementPass());
206 optimizer.RegisterPass(spvtools::CreateLocalAccessChainConvertPass());
207 optimizer.RegisterPass(spvtools::CreateLocalSingleBlockLoadStoreElimPass());
208 optimizer.RegisterPass(spvtools::CreateLocalSingleStoreElimPass());
209 optimizer.RegisterPass(spvtools::CreateSimplificationPass());
210 optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
211 optimizer.RegisterPass(spvtools::CreateVectorDCEPass());
212 optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass());
213 optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
214 optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass());
215 optimizer.RegisterPass(spvtools::CreateBlockMergePass());
216 optimizer.RegisterPass(spvtools::CreateLocalMultiStoreElimPass());
217 optimizer.RegisterPass(spvtools::CreateIfConversionPass());
218 optimizer.RegisterPass(spvtools::CreateSimplificationPass());
219 optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
220 optimizer.RegisterPass(spvtools::CreateVectorDCEPass());
221 optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass());
222 optimizer.RegisterPass(spvtools::CreateInterpolateFixupPass());
223 if (options->optimizeSize) {
224 optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass());
225 optimizer.RegisterPass(spvtools::CreateEliminateDeadInputComponentsSafePass());
226 }
227 optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass());
228 optimizer.RegisterPass(spvtools::CreateCFGCleanupPass());
229
230 spvtools::OptimizerOptions spvOptOptions;
231 if (options->optimizerAllowExpandedIDBound)
232 spvOptOptions.set_max_id_bound(0x3FFFFFFF);
233 optimizer.SetTargetEnv(MapToSpirvToolsEnv(intermediate.getSpv(), logger));
234 spvOptOptions.set_run_validator(false); // The validator may run as a separate step later on
235 optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions);
236
237 if (options->optimizerAllowExpandedIDBound) {
238 if (spirv.size() > 3 && spirv[3] > kDefaultMaxIdBound) {
239 spvtools::Optimizer optimizer2(target_env);
240 optimizer2.SetMessageConsumer(OptimizerMesssageConsumer);
241 optimizer2.RegisterPass(spvtools::CreateCompactIdsPass());
242 optimizer2.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions);

Callers 1

GlslangToSpvFunction · 0.85

Calls 3

MapToSpirvToolsEnvFunction · 0.85
dataMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected