From ed642a57a72fb9fc194dc65d6a742b2271212b2a Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 10 Jan 2018 21:28:20 +0100 Subject: [PATCH] [dxvk] Simplified state-based pipeline lookup --- src/dxvk/dxvk_graphics.cpp | 27 +++++++++++---------------- src/dxvk/dxvk_graphics.h | 29 ++++++++++------------------- 2 files changed, 21 insertions(+), 35 deletions(-) diff --git a/src/dxvk/dxvk_graphics.cpp b/src/dxvk/dxvk_graphics.cpp index 729e3047..4af16692 100644 --- a/src/dxvk/dxvk_graphics.cpp +++ b/src/dxvk/dxvk_graphics.cpp @@ -22,17 +22,13 @@ namespace dxvk { } - size_t DxvkGraphicsPipelineStateHash::operator () ( - const DxvkGraphicsPipelineStateInfo& state) const { - // TODO implement hash - return 0; + bool DxvkGraphicsPipelineStateInfo::operator == (const DxvkGraphicsPipelineStateInfo& other) const { + return std::memcmp(this, &other, sizeof(DxvkGraphicsPipelineStateInfo)) == 0; } - size_t DxvkGraphicsPipelineStateEq::operator () ( - const DxvkGraphicsPipelineStateInfo& a, - const DxvkGraphicsPipelineStateInfo& b) const { - return std::memcmp(&a, &b, sizeof(DxvkGraphicsPipelineStateInfo)) == 0; + bool DxvkGraphicsPipelineStateInfo::operator != (const DxvkGraphicsPipelineStateInfo& other) const { + return std::memcmp(this, &other, sizeof(DxvkGraphicsPipelineStateInfo)) != 0; } @@ -72,12 +68,13 @@ namespace dxvk { const DxvkGraphicsPipelineStateInfo& state) { std::lock_guard lock(m_mutex); - auto pair = m_pipelines.find(state); - if (pair != m_pipelines.end()) - return pair->second; + for (const PipelineStruct& pair : m_pipelines) { + if (pair.stateVector == state) + return pair.pipeline; + } VkPipeline pipeline = this->compilePipeline(state); - m_pipelines.insert(std::make_pair(state, pipeline)); + m_pipelines.push_back({ state, pipeline }); return pipeline; } @@ -227,10 +224,8 @@ namespace dxvk { void DxvkGraphicsPipeline::destroyPipelines() { - for (const auto& pair : m_pipelines) { - m_vkd->vkDestroyPipeline( - m_vkd->device(), pair.second, nullptr); - } + for (const PipelineStruct& pair : m_pipelines) + m_vkd->vkDestroyPipeline(m_vkd->device(), pair.pipeline, nullptr); } } \ No newline at end of file diff --git a/src/dxvk/dxvk_graphics.h b/src/dxvk/dxvk_graphics.h index da9ce6ef..42158272 100644 --- a/src/dxvk/dxvk_graphics.h +++ b/src/dxvk/dxvk_graphics.h @@ -28,6 +28,9 @@ namespace dxvk { DxvkGraphicsPipelineStateInfo& operator = ( const DxvkGraphicsPipelineStateInfo& other); + bool operator == (const DxvkGraphicsPipelineStateInfo& other) const; + bool operator != (const DxvkGraphicsPipelineStateInfo& other) const; + DxvkBindingState bsBindingState; VkPrimitiveTopology iaPrimitiveTopology; @@ -73,18 +76,6 @@ namespace dxvk { }; - struct DxvkGraphicsPipelineStateHash { - size_t operator () (const DxvkGraphicsPipelineStateInfo& state) const; - }; - - - struct DxvkGraphicsPipelineStateEq { - size_t operator () ( - const DxvkGraphicsPipelineStateInfo& a, - const DxvkGraphicsPipelineStateInfo& b) const; - }; - - /** * \brief Graphics pipeline * @@ -126,6 +117,11 @@ namespace dxvk { private: + struct PipelineStruct { + DxvkGraphicsPipelineStateInfo stateVector; + VkPipeline pipeline; + }; + Rc m_vkd; Rc m_layout; @@ -135,13 +131,8 @@ namespace dxvk { Rc m_gs; Rc m_fs; - std::mutex m_mutex; - - std::unordered_map< - DxvkGraphicsPipelineStateInfo, - VkPipeline, - DxvkGraphicsPipelineStateHash, - DxvkGraphicsPipelineStateEq> m_pipelines; + std::mutex m_mutex; + std::vector m_pipelines; VkPipeline compilePipeline( const DxvkGraphicsPipelineStateInfo& state) const;