diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index b4f679fa2..97e92a189 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -3555,7 +3555,7 @@ namespace dxvk { m_flags.clr(DxvkContextFlag::CpDirtyPipeline); m_state.cp.state.bsBindingMask.clear(); - m_state.cp.pipeline = m_common->pipelineManager().createComputePipeline(m_state.cp.shaders); + m_state.cp.pipeline = lookupComputePipeline(m_state.cp.shaders); if (m_state.cp.pipeline != nullptr && m_state.cp.pipeline->layout()->pushConstRange().size) @@ -3601,7 +3601,7 @@ namespace dxvk { m_flags.clr(DxvkContextFlag::GpDirtyPipeline); m_state.gp.state.bsBindingMask.clear(); - m_state.gp.pipeline = m_common->pipelineManager().createGraphicsPipeline(m_state.gp.shaders); + m_state.gp.pipeline = lookupGraphicsPipeline(m_state.gp.shaders); m_state.gp.flags = DxvkGraphicsPipelineFlags(); if (m_state.gp.pipeline != nullptr) { @@ -4465,4 +4465,26 @@ namespace dxvk { } } + + DxvkGraphicsPipeline* DxvkContext::lookupGraphicsPipeline( + const DxvkGraphicsPipelineShaders& shaders) { + auto idx = shaders.hash() % m_gpLookupCache.size(); + + if (unlikely(!m_gpLookupCache[idx] || !shaders.eq(m_gpLookupCache[idx]->shaders()))) + m_gpLookupCache[idx] = m_common->pipelineManager().createGraphicsPipeline(shaders); + + return m_gpLookupCache[idx]; + } + + + DxvkComputePipeline* DxvkContext::lookupComputePipeline( + const DxvkComputePipelineShaders& shaders) { + auto idx = shaders.hash() % m_cpLookupCache.size(); + + if (unlikely(!m_cpLookupCache[idx] || !shaders.eq(m_cpLookupCache[idx]->shaders()))) + m_cpLookupCache[idx] = m_common->pipelineManager().createComputePipeline(shaders); + + return m_cpLookupCache[idx]; + } + } \ No newline at end of file diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index f54f53210..b591f8027 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -1031,6 +1031,9 @@ namespace dxvk { std::array m_descInfos; std::array m_descOffsets; + std::array m_gpLookupCache = { }; + std::array m_cpLookupCache = { }; + std::unordered_map< DxvkBufferSliceHandle, DxvkGpuQueryHandle, @@ -1180,6 +1183,12 @@ namespace dxvk { void trackDrawBuffer(); + DxvkGraphicsPipeline* lookupGraphicsPipeline( + const DxvkGraphicsPipelineShaders& shaders); + + DxvkComputePipeline* lookupComputePipeline( + const DxvkComputePipelineShaders& shaders); + }; } \ No newline at end of file