diff options
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp index 6ca51b1e..65150c48 100644 --- a/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp @@ -39,7 +39,7 @@ #if !DILIGENT_NO_HLSL -# include "SPIRVUtils.hpp" +# include "spirv-tools/optimizer.hpp" #endif namespace Diligent @@ -129,12 +129,25 @@ RenderPassDesc PipelineStateVkImpl::GetImplicitRenderPassDesc( return RPDesc; } -#if DILIGENT_NO_HLSL static std::vector<uint32_t> StripReflection(const std::vector<uint32_t>& OriginalSPIRV) { +#if DILIGENT_NO_HLSL return OriginalSPIRV; -} +#else + std::vector<uint32_t> StrippedSPIRV; + spvtools::Optimizer SpirvOptimizer(SPV_ENV_VULKAN_1_0); + // Decorations defined in SPV_GOOGLE_hlsl_functionality1 are the only instructions + // removed by strip-reflect-info pass. SPIRV offsets become INVALID after this operation. + SpirvOptimizer.RegisterPass(spvtools::CreateStripReflectInfoPass()); + auto res = SpirvOptimizer.Run(OriginalSPIRV.data(), OriginalSPIRV.size(), &StrippedSPIRV); + if (!res) + { + // Optimized SPIRV may be invalid + StrippedSPIRV.clear(); + } + return StrippedSPIRV; #endif +} PipelineStateVkImpl::PipelineStateVkImpl(IReferenceCounters* pRefCounters, RenderDeviceVkImpl* pDeviceVk, |
