1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-15 07:29:17 +01:00

[dxvk] Simplified state-based pipeline lookup

This commit is contained in:
Philip Rebohle 2018-01-10 21:28:20 +01:00
parent 9c90c1ac00
commit ed642a57a7
2 changed files with 21 additions and 35 deletions

View File

@ -22,17 +22,13 @@ namespace dxvk {
} }
size_t DxvkGraphicsPipelineStateHash::operator () ( bool DxvkGraphicsPipelineStateInfo::operator == (const DxvkGraphicsPipelineStateInfo& other) const {
const DxvkGraphicsPipelineStateInfo& state) const { return std::memcmp(this, &other, sizeof(DxvkGraphicsPipelineStateInfo)) == 0;
// TODO implement hash
return 0;
} }
size_t DxvkGraphicsPipelineStateEq::operator () ( bool DxvkGraphicsPipelineStateInfo::operator != (const DxvkGraphicsPipelineStateInfo& other) const {
const DxvkGraphicsPipelineStateInfo& a, return std::memcmp(this, &other, sizeof(DxvkGraphicsPipelineStateInfo)) != 0;
const DxvkGraphicsPipelineStateInfo& b) const {
return std::memcmp(&a, &b, sizeof(DxvkGraphicsPipelineStateInfo)) == 0;
} }
@ -72,12 +68,13 @@ namespace dxvk {
const DxvkGraphicsPipelineStateInfo& state) { const DxvkGraphicsPipelineStateInfo& state) {
std::lock_guard<std::mutex> lock(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);
auto pair = m_pipelines.find(state); for (const PipelineStruct& pair : m_pipelines) {
if (pair != m_pipelines.end()) if (pair.stateVector == state)
return pair->second; return pair.pipeline;
}
VkPipeline pipeline = this->compilePipeline(state); VkPipeline pipeline = this->compilePipeline(state);
m_pipelines.insert(std::make_pair(state, pipeline)); m_pipelines.push_back({ state, pipeline });
return pipeline; return pipeline;
} }
@ -227,10 +224,8 @@ namespace dxvk {
void DxvkGraphicsPipeline::destroyPipelines() { void DxvkGraphicsPipeline::destroyPipelines() {
for (const auto& pair : m_pipelines) { for (const PipelineStruct& pair : m_pipelines)
m_vkd->vkDestroyPipeline( m_vkd->vkDestroyPipeline(m_vkd->device(), pair.pipeline, nullptr);
m_vkd->device(), pair.second, nullptr);
}
} }
} }

View File

@ -28,6 +28,9 @@ namespace dxvk {
DxvkGraphicsPipelineStateInfo& operator = ( DxvkGraphicsPipelineStateInfo& operator = (
const DxvkGraphicsPipelineStateInfo& other); const DxvkGraphicsPipelineStateInfo& other);
bool operator == (const DxvkGraphicsPipelineStateInfo& other) const;
bool operator != (const DxvkGraphicsPipelineStateInfo& other) const;
DxvkBindingState bsBindingState; DxvkBindingState bsBindingState;
VkPrimitiveTopology iaPrimitiveTopology; 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 * \brief Graphics pipeline
* *
@ -126,6 +117,11 @@ namespace dxvk {
private: private:
struct PipelineStruct {
DxvkGraphicsPipelineStateInfo stateVector;
VkPipeline pipeline;
};
Rc<vk::DeviceFn> m_vkd; Rc<vk::DeviceFn> m_vkd;
Rc<DxvkBindingLayout> m_layout; Rc<DxvkBindingLayout> m_layout;
@ -135,13 +131,8 @@ namespace dxvk {
Rc<DxvkShaderModule> m_gs; Rc<DxvkShaderModule> m_gs;
Rc<DxvkShaderModule> m_fs; Rc<DxvkShaderModule> m_fs;
std::mutex m_mutex; std::mutex m_mutex;
std::vector<PipelineStruct> m_pipelines;
std::unordered_map<
DxvkGraphicsPipelineStateInfo,
VkPipeline,
DxvkGraphicsPipelineStateHash,
DxvkGraphicsPipelineStateEq> m_pipelines;
VkPipeline compilePipeline( VkPipeline compilePipeline(
const DxvkGraphicsPipelineStateInfo& state) const; const DxvkGraphicsPipelineStateInfo& state) const;