From bb4a2ac62f59fd0cd2f597207bbfa93e07f7525b Mon Sep 17 00:00:00 2001 From: Robert Stepinski Date: Thu, 17 Oct 2019 17:22:46 -0400 Subject: Enable spriv-opt on spirv (#1076) * Add spirv-tools module and set ENABLE_OPT to be true * Add spirv-headers dependency * Build spirv-opt into glslang project * Add optimization pass * Add generated spirv-opt files Modify solution to avoid obj file conflicts * Add optimization pass to SPIR-V generation * Don't pass additional optimizer options to glslang * Build spirv-opt in Linux --- source/slang-glslang/slang-glslang.cpp | 121 ++++ source/slang-glslang/slang-glslang.h | 3 + source/slang-glslang/slang-glslang.vcxproj | 191 +++++- source/slang-glslang/slang-glslang.vcxproj.filters | 674 ++++++++++++++++++--- source/slang/slang-compiler.cpp | 4 + 5 files changed, 912 insertions(+), 81 deletions(-) (limited to 'source') diff --git a/source/slang-glslang/slang-glslang.cpp b/source/slang-glslang/slang-glslang.cpp index 25b46bafe..6b2af69b7 100644 --- a/source/slang-glslang/slang-glslang.cpp +++ b/source/slang-glslang/slang-glslang.cpp @@ -16,6 +16,9 @@ #include "../../slang.h" +#include "spirv-tools/optimizer.hpp" +#include "spirv-tools/libspirv.h" + #if 0 #include #include @@ -86,6 +89,119 @@ static void dumpDiagnostics( dump(log.c_str(), log.length(), request->diagnosticFunc, request->diagnosticUserData, stderr); } +// Apply the SPIRV-Tools optimizer to generated SPIR-V based on the desired optimization level +// TODO: add flag for optimizing SPIR-V size as well +static void glslang_optimizeSPIRV(std::vector& spirv, unsigned optimizationLevel, unsigned debugInfoType) +{ + spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2; + + spvtools::Optimizer optimizer(target_env); + optimizer.SetMessageConsumer( + [](spv_message_level_t level, const char *source, const spv_position_t &position, const char *message) { + auto &out = std::cerr; + switch (level) + { + case SPV_MSG_FATAL: + case SPV_MSG_INTERNAL_ERROR: + case SPV_MSG_ERROR: + out << "error: "; + break; + case SPV_MSG_WARNING: + out << "warning: "; + break; + case SPV_MSG_INFO: + case SPV_MSG_DEBUG: + out << "info: "; + break; + default: + break; + } + if (source) + { + out << source << ":"; + } + out << position.line << ":" << position.column << ":" << position.index << ":"; + if (message) + { + out << " " << message; + } + out << std::endl; + }); + + // If debug info is being generated, propagate + // line information into all SPIR-V instructions. This avoids loss of + // information when instructions are deleted or moved. Later, remove + // redundant information to minimize final SPRIR-V size. + if (debugInfoType != SLANG_DEBUG_INFO_LEVEL_NONE) + { + optimizer.RegisterPass(spvtools::CreatePropagateLineInfoPass()); + } + + // TODO confirm which passes we want to invoke for each level + switch (optimizationLevel) + { + case SLANG_OPTIMIZATION_LEVEL_NONE: + // Don't register any passes if our optimization level is none + break; + case SLANG_OPTIMIZATION_LEVEL_DEFAULT: + // Use a minimal set of performance settings + optimizer.RegisterPass(spvtools::CreateInlineExhaustivePass()); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); + optimizer.RegisterPass(spvtools::CreatePrivateToLocalPass()); + optimizer.RegisterPass(spvtools::CreateScalarReplacementPass(100)); + optimizer.RegisterPass(spvtools::CreateLocalAccessChainConvertPass()); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); + break; + case SLANG_OPTIMIZATION_LEVEL_HIGH: + case SLANG_OPTIMIZATION_LEVEL_MAXIMAL: + // Use the same passes when specifying the "-O" flag in spirv-opt + optimizer.RegisterPass(spvtools::CreateWrapOpKillPass()); + optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass()); + optimizer.RegisterPass(spvtools::CreateMergeReturnPass()); + optimizer.RegisterPass(spvtools::CreateInlineExhaustivePass()); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); + optimizer.RegisterPass(spvtools::CreatePrivateToLocalPass()); + optimizer.RegisterPass(spvtools::CreateLocalSingleBlockLoadStoreElimPass()); + optimizer.RegisterPass(spvtools::CreateLocalSingleStoreElimPass()); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); + optimizer.RegisterPass(spvtools::CreateScalarReplacementPass()); + optimizer.RegisterPass(spvtools::CreateLocalAccessChainConvertPass()); + optimizer.RegisterPass(spvtools::CreateLocalSingleBlockLoadStoreElimPass()); + optimizer.RegisterPass(spvtools::CreateLocalSingleStoreElimPass()); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); + optimizer.RegisterPass(spvtools::CreateLocalMultiStoreElimPass()); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); + optimizer.RegisterPass(spvtools::CreateCCPPass()); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); + optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass()); + optimizer.RegisterPass(spvtools::CreateCombineAccessChainsPass()); + optimizer.RegisterPass(spvtools::CreateSimplificationPass()); + optimizer.RegisterPass(spvtools::CreateVectorDCEPass()); + optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass()); + optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass()); + optimizer.RegisterPass(spvtools::CreateSimplificationPass()); + optimizer.RegisterPass(spvtools::CreateIfConversionPass()); + optimizer.RegisterPass(spvtools::CreateCopyPropagateArraysPass()); + optimizer.RegisterPass(spvtools::CreateReduceLoadSizePass()); + optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); + optimizer.RegisterPass(spvtools::CreateBlockMergePass()); + optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass()); + optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass()); + optimizer.RegisterPass(spvtools::CreateBlockMergePass()); + optimizer.RegisterPass(spvtools::CreateSimplificationPass()); + break; + } + + if (debugInfoType != SLANG_DEBUG_INFO_LEVEL_NONE) + { + optimizer.RegisterPass(spvtools::CreateRedundantLineInfoElimPass()); + } + + spvtools::OptimizerOptions spvOptOptions; + spvOptOptions.set_run_validator(false); // Don't run the validator by default + optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions); +} + static int glslang_compileGLSLToSPIRV(glslang_CompileRequest* request) { EShLanguage glslangStage; @@ -167,6 +283,11 @@ static int glslang_compileGLSLToSPIRV(glslang_CompileRequest* request) spv::SpvBuildLogger logger; glslang::GlslangToSpv(*stageIntermediate, spirv, &logger); + if (request->optimizationLevel != SLANG_OPTIMIZATION_LEVEL_NONE) + { + glslang_optimizeSPIRV(spirv, request->optimizationLevel, request->debugInfoType); + } + dumpDiagnostics(request, logger.getAllMessages()); dump(spirv.data(), spirv.size() * sizeof(unsigned int), request->outputFunc, request->outputUserData, stdout); diff --git a/source/slang-glslang/slang-glslang.h b/source/slang-glslang/slang-glslang.h index 22014de72..16b8fb871 100644 --- a/source/slang-glslang/slang-glslang.h +++ b/source/slang-glslang/slang-glslang.h @@ -28,6 +28,9 @@ struct glslang_CompileRequest int slangStage; unsigned action; + + unsigned optimizationLevel; + unsigned debugInfoType; }; typedef int (*glslang_CompileFunc)(glslang_CompileRequest* request); diff --git a/source/slang-glslang/slang-glslang.vcxproj b/source/slang-glslang/slang-glslang.vcxproj index eb53fc311..5a6508f1d 100644 --- a/source/slang-glslang/slang-glslang.vcxproj +++ b/source/slang-glslang/slang-glslang.vcxproj @@ -97,11 +97,12 @@ NotUsing Level3 - _DEBUG;ENABLE_OPT=0;AMD_EXTENSIONS;NV_EXTENSIONS;%(PreprocessorDefinitions) - ..\..\external\glslang;%(AdditionalIncludeDirectories) + _DEBUG;ENABLE_OPT=1;AMD_EXTENSIONS;NV_EXTENSIONS;%(PreprocessorDefinitions) + ..\..\external\glslang;..\..\external\spirv-tools;..\..\external\spirv-tools\include;..\..\external\spirv-headers\include;..\..\external\spirv-tools\build;..\..\external\spirv-tools-generated;%(AdditionalIncludeDirectories) EditAndContinue Disabled MultiThreadedDebug + $(IntDir)/%(RelativeDir)/$(Configuration)/ Windows @@ -113,11 +114,12 @@ NotUsing Level3 - _DEBUG;ENABLE_OPT=0;AMD_EXTENSIONS;NV_EXTENSIONS;%(PreprocessorDefinitions) - ..\..\external\glslang;%(AdditionalIncludeDirectories) + _DEBUG;ENABLE_OPT=1;AMD_EXTENSIONS;NV_EXTENSIONS;%(PreprocessorDefinitions) + ..\..\external\glslang;..\..\external\spirv-tools;..\..\external\spirv-tools\include;..\..\external\spirv-headers\include;..\..\external\spirv-tools\build;..\..\external\spirv-tools-generated;%(AdditionalIncludeDirectories) EditAndContinue Disabled MultiThreadedDebug + $(IntDir)/%(RelativeDir)/$(Configuration)/ Windows @@ -129,14 +131,15 @@ NotUsing Level3 - NDEBUG;ENABLE_OPT=0;AMD_EXTENSIONS;NV_EXTENSIONS;%(PreprocessorDefinitions) - ..\..\external\glslang;%(AdditionalIncludeDirectories) + NDEBUG;ENABLE_OPT=1;AMD_EXTENSIONS;NV_EXTENSIONS;%(PreprocessorDefinitions) + ..\..\external\glslang;..\..\external\spirv-tools;..\..\external\spirv-tools\include;..\..\external\spirv-headers\include;..\..\external\spirv-tools\build;..\..\external\spirv-tools-generated;%(AdditionalIncludeDirectories) Full true true false true MultiThreaded + $(IntDir)/%(RelativeDir)/$(Configuration)/ Windows @@ -149,14 +152,15 @@ NotUsing Level3 - NDEBUG;ENABLE_OPT=0;AMD_EXTENSIONS;NV_EXTENSIONS;%(PreprocessorDefinitions) - ..\..\external\glslang;%(AdditionalIncludeDirectories) + NDEBUG;ENABLE_OPT=1;AMD_EXTENSIONS;NV_EXTENSIONS;%(PreprocessorDefinitions) + ..\..\external\glslang;..\..\external\spirv-tools;..\..\external\spirv-tools\include;..\..\external\spirv-headers\include;..\..\external\spirv-tools\build;..\..\external\spirv-tools-generated;%(AdditionalIncludeDirectories) Full true true false true MultiThreaded + $(IntDir)/%(RelativeDir)/$(Configuration)/ Windows @@ -252,6 +256,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/slang-glslang/slang-glslang.vcxproj.filters b/source/slang-glslang/slang-glslang.vcxproj.filters index 482728c71..a922440de 100644 --- a/source/slang-glslang/slang-glslang.vcxproj.filters +++ b/source/slang-glslang/slang-glslang.vcxproj.filters @@ -1,4 +1,4 @@ - + @@ -7,6 +7,21 @@ {E9C7FDCE-D52A-8D73-7EB0-C5296AF258F6} + + {0f17aa89-8c4d-488f-9577-c32b50f9b081} + + + {79d3e53a-e1bb-41a8-9a8c-65ed15905fce} + + + {cbc707d5-9925-4cfc-a98f-24edb5d66cfa} + + + {525e4d11-95f7-4087-af42-3148dd340ae1} + + + {b2f07a8e-0eda-425b-b3d1-bf3e95a84878} + @@ -134,137 +149,650 @@ - + Source Files - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools - - Source Files + + Source Files\spirv-tools\opt - - Source Files + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\opt + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\val + + + Source Files\spirv-tools\util + + + Source Files\spirv-tools\util + + + Source Files\spirv-tools\util + + + Source Files\spirv-tools\util - Source Files + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang - Source Files + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang - Source Files + Source Files\glslang + + + Source Files\glslang - Source Files + Source Files\glslang - Source Files + Source Files\glslang + + + Source Files\glslang - Source Files + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang - Source Files + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang - Source Files + Source Files\glslang + + + Source Files\glslang - Source Files + Source Files\glslang - Source Files + Source Files\glslang - Source Files + Source Files\glslang - Source Files + Source Files\glslang - Source Files + Source Files\glslang - Source Files + Source Files\glslang - Source Files + Source Files\glslang - - Source Files + + Source Files\glslang - - Source Files + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang + + + Source Files\glslang \ No newline at end of file diff --git a/source/slang/slang-compiler.cpp b/source/slang/slang-compiler.cpp index c8cc947f4..ecd34ccd3 100644 --- a/source/slang/slang-compiler.cpp +++ b/source/slang/slang-compiler.cpp @@ -1098,6 +1098,7 @@ SlangResult dissassembleDXILUsingDXC( { Session* session = slangCompileRequest->getSession(); auto sink = slangCompileRequest->getSink(); + auto linkage = slangCompileRequest->getLinkage(); auto glslang_compile = (glslang_CompileFunc)session->getSharedLibraryFunc(Session::SharedLibraryFuncType::Glslang_Compile, sink); if (!glslang_compile) @@ -1115,6 +1116,9 @@ SlangResult dissassembleDXILUsingDXC( request.diagnosticFunc = diagnosticOutputFunc; request.diagnosticUserData = &diagnosticOutput; + request.optimizationLevel = (unsigned)linkage->optimizationLevel; + request.debugInfoType = (unsigned)linkage->debugInfoLevel; + int err = glslang_compile(&request); if (err) -- cgit v1.2.3