mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-14 00:48:44 +01:00
[dxvk] Store and create pipeline layout objects in pipeline manager
This should help avoid a lot of duplication.
This commit is contained in:
parent
79ecd4e94a
commit
ec5ea71174
@ -12,9 +12,10 @@ namespace dxvk {
|
|||||||
|
|
||||||
DxvkComputePipeline::DxvkComputePipeline(
|
DxvkComputePipeline::DxvkComputePipeline(
|
||||||
DxvkPipelineManager* pipeMgr,
|
DxvkPipelineManager* pipeMgr,
|
||||||
DxvkComputePipelineShaders shaders)
|
DxvkComputePipelineShaders shaders,
|
||||||
|
DxvkBindingLayoutObjects* layout)
|
||||||
: m_vkd(pipeMgr->m_device->vkd()), m_pipeMgr(pipeMgr),
|
: m_vkd(pipeMgr->m_device->vkd()), m_pipeMgr(pipeMgr),
|
||||||
m_shaders(std::move(shaders)) {
|
m_shaders(std::move(shaders)), m_bindings(layout) {
|
||||||
m_shaders.cs->defineResourceSlots(m_slotMapping);
|
m_shaders.cs->defineResourceSlots(m_slotMapping);
|
||||||
|
|
||||||
m_slotMapping.makeDescriptorsDynamic(
|
m_slotMapping.makeDescriptorsDynamic(
|
||||||
|
@ -91,7 +91,8 @@ namespace dxvk {
|
|||||||
|
|
||||||
DxvkComputePipeline(
|
DxvkComputePipeline(
|
||||||
DxvkPipelineManager* pipeMgr,
|
DxvkPipelineManager* pipeMgr,
|
||||||
DxvkComputePipelineShaders shaders);
|
DxvkComputePipelineShaders shaders,
|
||||||
|
DxvkBindingLayoutObjects* layout);
|
||||||
|
|
||||||
~DxvkComputePipeline();
|
~DxvkComputePipeline();
|
||||||
|
|
||||||
@ -114,6 +115,18 @@ namespace dxvk {
|
|||||||
DxvkPipelineLayout* layout() const {
|
DxvkPipelineLayout* layout() const {
|
||||||
return m_layout.ptr();
|
return m_layout.ptr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Pipeline layout
|
||||||
|
*
|
||||||
|
* Stores the pipeline layout and the descriptor set
|
||||||
|
* layouts, as well as information on the resource
|
||||||
|
* slots used by the pipeline.
|
||||||
|
* \returns Pipeline layout
|
||||||
|
*/
|
||||||
|
DxvkBindingLayoutObjects* getBindings() const {
|
||||||
|
return m_bindings;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Retrieves pipeline handle
|
* \brief Retrieves pipeline handle
|
||||||
@ -142,6 +155,7 @@ namespace dxvk {
|
|||||||
DxvkComputePipelineShaders m_shaders;
|
DxvkComputePipelineShaders m_shaders;
|
||||||
DxvkDescriptorSlotMapping m_slotMapping;
|
DxvkDescriptorSlotMapping m_slotMapping;
|
||||||
|
|
||||||
|
DxvkBindingLayoutObjects* m_bindings;
|
||||||
Rc<DxvkPipelineLayout> m_layout;
|
Rc<DxvkPipelineLayout> m_layout;
|
||||||
|
|
||||||
alignas(CACHE_LINE_SIZE)
|
alignas(CACHE_LINE_SIZE)
|
||||||
|
@ -10,9 +10,10 @@ namespace dxvk {
|
|||||||
|
|
||||||
DxvkGraphicsPipeline::DxvkGraphicsPipeline(
|
DxvkGraphicsPipeline::DxvkGraphicsPipeline(
|
||||||
DxvkPipelineManager* pipeMgr,
|
DxvkPipelineManager* pipeMgr,
|
||||||
DxvkGraphicsPipelineShaders shaders)
|
DxvkGraphicsPipelineShaders shaders,
|
||||||
|
DxvkBindingLayoutObjects* layout)
|
||||||
: m_vkd(pipeMgr->m_device->vkd()), m_pipeMgr(pipeMgr),
|
: m_vkd(pipeMgr->m_device->vkd()), m_pipeMgr(pipeMgr),
|
||||||
m_shaders(std::move(shaders)) {
|
m_shaders(std::move(shaders)), m_bindings(layout) {
|
||||||
if (m_shaders.vs != nullptr) m_shaders.vs ->defineResourceSlots(m_slotMapping);
|
if (m_shaders.vs != nullptr) m_shaders.vs ->defineResourceSlots(m_slotMapping);
|
||||||
if (m_shaders.tcs != nullptr) m_shaders.tcs->defineResourceSlots(m_slotMapping);
|
if (m_shaders.tcs != nullptr) m_shaders.tcs->defineResourceSlots(m_slotMapping);
|
||||||
if (m_shaders.tes != nullptr) m_shaders.tes->defineResourceSlots(m_slotMapping);
|
if (m_shaders.tes != nullptr) m_shaders.tes->defineResourceSlots(m_slotMapping);
|
||||||
|
@ -149,7 +149,8 @@ namespace dxvk {
|
|||||||
|
|
||||||
DxvkGraphicsPipeline(
|
DxvkGraphicsPipeline(
|
||||||
DxvkPipelineManager* pipeMgr,
|
DxvkPipelineManager* pipeMgr,
|
||||||
DxvkGraphicsPipelineShaders shaders);
|
DxvkGraphicsPipelineShaders shaders,
|
||||||
|
DxvkBindingLayoutObjects* layout);
|
||||||
|
|
||||||
~DxvkGraphicsPipeline();
|
~DxvkGraphicsPipeline();
|
||||||
|
|
||||||
@ -181,6 +182,18 @@ namespace dxvk {
|
|||||||
return m_layout.ptr();
|
return m_layout.ptr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Pipeline layout
|
||||||
|
*
|
||||||
|
* Stores the pipeline layout and the descriptor set
|
||||||
|
* layout, as well as information on the resource
|
||||||
|
* slots used by the pipeline.
|
||||||
|
* \returns Pipeline layout
|
||||||
|
*/
|
||||||
|
DxvkBindingLayoutObjects* getBindings() const {
|
||||||
|
return m_bindings;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Queries shader for a given stage
|
* \brief Queries shader for a given stage
|
||||||
*
|
*
|
||||||
@ -225,6 +238,7 @@ namespace dxvk {
|
|||||||
DxvkGraphicsPipelineShaders m_shaders;
|
DxvkGraphicsPipelineShaders m_shaders;
|
||||||
DxvkDescriptorSlotMapping m_slotMapping;
|
DxvkDescriptorSlotMapping m_slotMapping;
|
||||||
|
|
||||||
|
DxvkBindingLayoutObjects* m_bindings;
|
||||||
Rc<DxvkPipelineLayout> m_layout;
|
Rc<DxvkPipelineLayout> m_layout;
|
||||||
|
|
||||||
uint32_t m_vsIn = 0;
|
uint32_t m_vsIn = 0;
|
||||||
|
@ -31,11 +31,13 @@ namespace dxvk {
|
|||||||
auto pair = m_computePipelines.find(shaders);
|
auto pair = m_computePipelines.find(shaders);
|
||||||
if (pair != m_computePipelines.end())
|
if (pair != m_computePipelines.end())
|
||||||
return &pair->second;
|
return &pair->second;
|
||||||
|
|
||||||
|
auto layout = createPipelineLayout(shaders.cs->getBindings());
|
||||||
|
|
||||||
auto iter = m_computePipelines.emplace(
|
auto iter = m_computePipelines.emplace(
|
||||||
std::piecewise_construct,
|
std::piecewise_construct,
|
||||||
std::tuple(shaders),
|
std::tuple(shaders),
|
||||||
std::tuple(this, shaders));
|
std::tuple(this, shaders, layout));
|
||||||
return &iter.first->second;
|
return &iter.first->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,11 +52,28 @@ namespace dxvk {
|
|||||||
auto pair = m_graphicsPipelines.find(shaders);
|
auto pair = m_graphicsPipelines.find(shaders);
|
||||||
if (pair != m_graphicsPipelines.end())
|
if (pair != m_graphicsPipelines.end())
|
||||||
return &pair->second;
|
return &pair->second;
|
||||||
|
|
||||||
|
DxvkBindingLayout mergedLayout;
|
||||||
|
mergedLayout.merge(shaders.vs->getBindings());
|
||||||
|
|
||||||
|
if (shaders.tcs != nullptr)
|
||||||
|
mergedLayout.merge(shaders.tcs->getBindings());
|
||||||
|
|
||||||
|
if (shaders.tes != nullptr)
|
||||||
|
mergedLayout.merge(shaders.tes->getBindings());
|
||||||
|
|
||||||
|
if (shaders.gs != nullptr)
|
||||||
|
mergedLayout.merge(shaders.gs->getBindings());
|
||||||
|
|
||||||
|
if (shaders.fs != nullptr)
|
||||||
|
mergedLayout.merge(shaders.fs->getBindings());
|
||||||
|
|
||||||
|
auto layout = createPipelineLayout(mergedLayout);
|
||||||
|
|
||||||
auto iter = m_graphicsPipelines.emplace(
|
auto iter = m_graphicsPipelines.emplace(
|
||||||
std::piecewise_construct,
|
std::piecewise_construct,
|
||||||
std::tuple(shaders),
|
std::tuple(shaders),
|
||||||
std::tuple(this, shaders));
|
std::tuple(this, shaders, layout));
|
||||||
return &iter.first->second;
|
return &iter.first->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,5 +103,38 @@ namespace dxvk {
|
|||||||
if (m_stateCache != nullptr)
|
if (m_stateCache != nullptr)
|
||||||
m_stateCache->stopWorkerThreads();
|
m_stateCache->stopWorkerThreads();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DxvkBindingSetLayout* DxvkPipelineManager::createDescriptorSetLayout(
|
||||||
|
const DxvkBindingSetLayoutKey& key) {
|
||||||
|
auto pair = m_descriptorSetLayouts.find(key);
|
||||||
|
if (pair != m_descriptorSetLayouts.end())
|
||||||
|
return &pair->second;
|
||||||
|
|
||||||
|
auto iter = m_descriptorSetLayouts.emplace(
|
||||||
|
std::piecewise_construct,
|
||||||
|
std::tuple(key),
|
||||||
|
std::tuple(m_device, key));
|
||||||
|
return &iter.first->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DxvkBindingLayoutObjects* DxvkPipelineManager::createPipelineLayout(
|
||||||
|
const DxvkBindingLayout& layout) {
|
||||||
|
auto pair = m_pipelineLayouts.find(layout);
|
||||||
|
if (pair != m_pipelineLayouts.end())
|
||||||
|
return &pair->second;
|
||||||
|
|
||||||
|
std::array<const DxvkBindingSetLayout*, DxvkDescriptorSets::SetCount> setLayouts = { };
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < setLayouts.size(); i++)
|
||||||
|
setLayouts[i] = createDescriptorSetLayout(layout.getBindingList(i));
|
||||||
|
|
||||||
|
auto iter = m_pipelineLayouts.emplace(
|
||||||
|
std::piecewise_construct,
|
||||||
|
std::tuple(layout),
|
||||||
|
std::tuple(m_device, layout, setLayouts.data()));
|
||||||
|
return &iter.first->second;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -106,6 +106,16 @@ namespace dxvk {
|
|||||||
|
|
||||||
dxvk::mutex m_mutex;
|
dxvk::mutex m_mutex;
|
||||||
|
|
||||||
|
std::unordered_map<
|
||||||
|
DxvkBindingSetLayoutKey,
|
||||||
|
DxvkBindingSetLayout,
|
||||||
|
DxvkHash, DxvkEq> m_descriptorSetLayouts;
|
||||||
|
|
||||||
|
std::unordered_map<
|
||||||
|
DxvkBindingLayout,
|
||||||
|
DxvkBindingLayoutObjects,
|
||||||
|
DxvkHash, DxvkEq> m_pipelineLayouts;
|
||||||
|
|
||||||
std::unordered_map<
|
std::unordered_map<
|
||||||
DxvkComputePipelineShaders,
|
DxvkComputePipelineShaders,
|
||||||
DxvkComputePipeline,
|
DxvkComputePipeline,
|
||||||
@ -115,7 +125,13 @@ namespace dxvk {
|
|||||||
DxvkGraphicsPipelineShaders,
|
DxvkGraphicsPipelineShaders,
|
||||||
DxvkGraphicsPipeline,
|
DxvkGraphicsPipeline,
|
||||||
DxvkHash, DxvkEq> m_graphicsPipelines;
|
DxvkHash, DxvkEq> m_graphicsPipelines;
|
||||||
|
|
||||||
|
DxvkBindingSetLayout* createDescriptorSetLayout(
|
||||||
|
const DxvkBindingSetLayoutKey& key);
|
||||||
|
|
||||||
|
DxvkBindingLayoutObjects* createPipelineLayout(
|
||||||
|
const DxvkBindingLayout& layout);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user