diff --git a/src/dxvk/dxvk_compute.h b/src/dxvk/dxvk_compute.h index dcbd24c2..f1aab2d0 100644 --- a/src/dxvk/dxvk_compute.h +++ b/src/dxvk/dxvk_compute.h @@ -20,6 +20,14 @@ namespace dxvk { */ struct DxvkComputePipelineShaders { Rc cs; + + bool eq(const DxvkComputePipelineShaders& other) const { + return cs == other.cs; + } + + size_t hash() const { + return DxvkShader::getHash(cs); + } }; diff --git a/src/dxvk/dxvk_graphics.h b/src/dxvk/dxvk_graphics.h index 6310a069..81c232d0 100644 --- a/src/dxvk/dxvk_graphics.h +++ b/src/dxvk/dxvk_graphics.h @@ -37,6 +37,22 @@ namespace dxvk { Rc tes; Rc gs; Rc fs; + + bool eq(const DxvkGraphicsPipelineShaders& other) const { + return vs == other.vs && tcs == other.tcs + && tes == other.tes && gs == other.gs + && fs == other.fs; + } + + size_t hash() const { + DxvkHashState state; + state.add(DxvkShader::getHash(vs)); + state.add(DxvkShader::getHash(tcs)); + state.add(DxvkShader::getHash(tes)); + state.add(DxvkShader::getHash(gs)); + state.add(DxvkShader::getHash(fs)); + return state; + } }; @@ -208,7 +224,7 @@ namespace dxvk { DxvkGraphicsPipelineShaders shaders); ~DxvkGraphicsPipeline(); - + /** * \brief Shaders used by the pipeline * \returns Shaders used by the pipeline diff --git a/src/dxvk/dxvk_pipemanager.cpp b/src/dxvk/dxvk_pipemanager.cpp index b1ddecae..2e29202e 100644 --- a/src/dxvk/dxvk_pipemanager.cpp +++ b/src/dxvk/dxvk_pipemanager.cpp @@ -4,44 +4,6 @@ namespace dxvk { - size_t DxvkPipelineKeyHash::operator () (const DxvkComputePipelineShaders& key) const { - std::hash hash; - return hash(key.cs.ptr()); - } - - - size_t DxvkPipelineKeyHash::operator () (const DxvkGraphicsPipelineShaders& key) const { - DxvkHashState state; - state.add(getShaderHash(key.vs)); - state.add(getShaderHash(key.tcs)); - state.add(getShaderHash(key.tes)); - state.add(getShaderHash(key.gs)); - state.add(getShaderHash(key.fs)); - return state; - } - - - size_t DxvkPipelineKeyHash::getShaderHash(const Rc& shader) { - return shader != nullptr ? shader->getHash() : 0; - } - - - bool DxvkPipelineKeyEq::operator () ( - const DxvkComputePipelineShaders& a, - const DxvkComputePipelineShaders& b) const { - return a.cs == b.cs; - } - - - bool DxvkPipelineKeyEq::operator () ( - const DxvkGraphicsPipelineShaders& a, - const DxvkGraphicsPipelineShaders& b) const { - return a.vs == b.vs && a.tcs == b.tcs - && a.tes == b.tes && a.gs == b.gs - && a.fs == b.fs; - } - - DxvkPipelineManager::DxvkPipelineManager( const DxvkDevice* device, DxvkRenderPassPool* passManager) diff --git a/src/dxvk/dxvk_pipemanager.h b/src/dxvk/dxvk_pipemanager.h index 5820c766..858928ca 100644 --- a/src/dxvk/dxvk_pipemanager.h +++ b/src/dxvk/dxvk_pipemanager.h @@ -23,19 +23,6 @@ namespace dxvk { }; - struct DxvkPipelineKeyHash { - size_t operator () (const DxvkComputePipelineShaders& key) const; - size_t operator () (const DxvkGraphicsPipelineShaders& key) const; - static size_t getShaderHash(const Rc& shader); - }; - - - struct DxvkPipelineKeyEq { - bool operator () (const DxvkComputePipelineShaders& a, const DxvkComputePipelineShaders& b) const; - bool operator () (const DxvkGraphicsPipelineShaders& a, const DxvkGraphicsPipelineShaders& b) const; - }; - - /** * \brief Pipeline manager * @@ -117,14 +104,12 @@ namespace dxvk { std::unordered_map< DxvkComputePipelineShaders, DxvkComputePipeline, - DxvkPipelineKeyHash, - DxvkPipelineKeyEq> m_computePipelines; + DxvkHash, DxvkEq> m_computePipelines; std::unordered_map< DxvkGraphicsPipelineShaders, DxvkGraphicsPipeline, - DxvkPipelineKeyHash, - DxvkPipelineKeyEq> m_graphicsPipelines; + DxvkHash, DxvkEq> m_graphicsPipelines; }; diff --git a/src/dxvk/dxvk_shader.h b/src/dxvk/dxvk_shader.h index ec159999..50526a80 100644 --- a/src/dxvk/dxvk_shader.h +++ b/src/dxvk/dxvk_shader.h @@ -253,6 +253,18 @@ namespace dxvk { std::string debugName() const { return m_key.toString(); } + + /** + * \brief Get lookup hash for a shader + * + * Convenience method that returns \c 0 for a null + * pointer, and the shader's lookup hash otherwise. + * \param [in] shader The shader + * \returns The shader's lookup hash, or 0 + */ + static size_t getHash(const Rc& shader) { + return shader != nullptr ? shader->getHash() : 0; + } private: @@ -271,7 +283,7 @@ namespace dxvk { size_t m_o1IdxOffset = 0; size_t m_o1LocOffset = 0; - + };