#include "dxvk_device.h" #include "dxvk_pipemanager.h" namespace dxvk { size_t DxvkPipelineKeyHash::operator () (const DxvkComputePipelineKey& key) const { std::hash hash; return hash(key.cs.ptr()); } size_t DxvkPipelineKeyHash::operator () (const DxvkGraphicsPipelineKey& key) const { DxvkHashState state; std::hash hash; state.add(hash(key.vs.ptr())); state.add(hash(key.tcs.ptr())); state.add(hash(key.tes.ptr())); state.add(hash(key.gs.ptr())); state.add(hash(key.fs.ptr())); return state; } bool DxvkPipelineKeyEq::operator () ( const DxvkComputePipelineKey& a, const DxvkComputePipelineKey& b) const { return a.cs == b.cs; } bool DxvkPipelineKeyEq::operator () ( const DxvkGraphicsPipelineKey& a, const DxvkGraphicsPipelineKey& 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) : m_device (device), m_cache (new DxvkPipelineCache(device->vkd())) { } DxvkPipelineManager::~DxvkPipelineManager() { } Rc DxvkPipelineManager::createComputePipeline( const Rc& cs) { if (cs == nullptr) return nullptr; std::lock_guard lock(m_mutex); DxvkComputePipelineKey key; key.cs = cs; auto pair = m_computePipelines.find(key); if (pair != m_computePipelines.end()) return pair->second; const Rc pipeline = new DxvkComputePipeline(this, cs); m_computePipelines.insert(std::make_pair(key, pipeline)); return pipeline; } Rc DxvkPipelineManager::createGraphicsPipeline( const Rc& vs, const Rc& tcs, const Rc& tes, const Rc& gs, const Rc& fs) { if (vs == nullptr) return nullptr; std::lock_guard lock(m_mutex); DxvkGraphicsPipelineKey key; key.vs = vs; key.tcs = tcs; key.tes = tes; key.gs = gs; key.fs = fs; auto pair = m_graphicsPipelines.find(key); if (pair != m_graphicsPipelines.end()) return pair->second; Rc pipeline = new DxvkGraphicsPipeline( this, vs, tcs, tes, gs, fs); m_graphicsPipelines.insert(std::make_pair(key, pipeline)); return pipeline; } DxvkPipelineCount DxvkPipelineManager::getPipelineCount() const { DxvkPipelineCount result; result.numComputePipelines = m_numComputePipelines.load(); result.numGraphicsPipelines = m_numGraphicsPipelines.load(); return result; } }