[dxvk] Introduce DxvkGlobalPipelineBarrier

This commit is contained in:
Philip Rebohle 2022-07-04 14:00:24 +02:00
parent 95f7aae3e6
commit 67d35ecc8d
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
4 changed files with 63 additions and 12 deletions

View File

@ -13,14 +13,22 @@ namespace dxvk {
DxvkGraphicsPipelineShaders shaders,
DxvkBindingLayoutObjects* layout)
: m_vkd(pipeMgr->m_device->vkd()), m_pipeMgr(pipeMgr),
m_shaders(std::move(shaders)), m_bindings(layout) {
m_shaders(std::move(shaders)), m_bindings(layout),
m_barrier(layout->getGlobalBarrier()) {
m_vsIn = m_shaders.vs != nullptr ? m_shaders.vs->info().inputMask : 0;
m_fsOut = m_shaders.fs != nullptr ? m_shaders.fs->info().outputMask : 0;
if (m_shaders.gs != nullptr && m_shaders.gs->flags().test(DxvkShaderFlag::HasTransformFeedback))
if (m_shaders.gs != nullptr && m_shaders.gs->flags().test(DxvkShaderFlag::HasTransformFeedback)) {
m_flags.set(DxvkGraphicsPipelineFlag::HasTransformFeedback);
m_barrier.stages |= VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
| VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT;
m_barrier.access |= VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT
| VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT
| VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT;
}
if (layout->getAccessFlags() & VK_ACCESS_SHADER_WRITE_BIT)
if (m_barrier.access & VK_ACCESS_SHADER_WRITE_BIT)
m_flags.set(DxvkGraphicsPipelineFlag::HasStorageDescriptors);
m_common.msSampleShadingEnable = m_shaders.fs != nullptr && m_shaders.fs->flags().test(DxvkShaderFlag::HasSampleRateShading);
@ -48,6 +56,19 @@ namespace dxvk {
}
DxvkGlobalPipelineBarrier DxvkGraphicsPipeline::getGlobalBarrier(
const DxvkGraphicsPipelineStateInfo& state) const {
DxvkGlobalPipelineBarrier barrier = m_barrier;
if (state.il.bindingCount()) {
barrier.stages |= VK_PIPELINE_STAGE_VERTEX_INPUT_BIT;
barrier.access |= VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT;
}
return barrier;
}
VkPipeline DxvkGraphicsPipeline::getPipelineHandle(
const DxvkGraphicsPipelineStateInfo& state) {
DxvkGraphicsPipelineInstance* instance = this->findInstance(state);

View File

@ -185,7 +185,20 @@ namespace dxvk {
*/
Rc<DxvkShader> getShader(
VkShaderStageFlagBits stage) const;
/**
* \brief Queries global resource barrier
*
* Returns the stages that can access resources in this
* pipeline with the given pipeline state, as well as
* the ways in which resources are accessed. This does
* not include render targets. The barrier is meant to
* be executed after the render pass.
* \returns Global barrier
*/
DxvkGlobalPipelineBarrier getGlobalBarrier(
const DxvkGraphicsPipelineStateInfo& state) const;
/**
* \brief Pipeline handle
*
@ -218,6 +231,7 @@ namespace dxvk {
uint32_t m_vsIn = 0;
uint32_t m_fsOut = 0;
DxvkGlobalPipelineBarrier m_barrier;
DxvkGraphicsPipelineFlags m_flags;
DxvkGraphicsCommonPipelineStateInfo m_common;

View File

@ -323,15 +323,18 @@ namespace dxvk {
}
VkAccessFlags DxvkBindingLayoutObjects::getAccessFlags() const {
VkAccessFlags flags = 0;
DxvkGlobalPipelineBarrier DxvkBindingLayoutObjects::getGlobalBarrier() const {
DxvkGlobalPipelineBarrier barrier = { };
for (uint32_t i = 0; i < DxvkDescriptorSets::SetCount; i++) {
for (uint32_t j = 0; j < m_layout.getBindingCount(i); j++)
flags |= m_layout.getBinding(i, j).access;
for (uint32_t j = 0; j < m_layout.getBindingCount(i); j++) {
const auto& binding = m_layout.getBinding(i, j);
barrier.stages |= util::pipelineStages(binding.stages);
barrier.access |= binding.access;
}
}
return flags;
return barrier;
}
}

View File

@ -356,6 +356,17 @@ namespace dxvk {
uint32_t binding;
};
/**
* \brief Global resource barrier
*
* Stores the way any resources will be
* accessed by this pipeline.
*/
struct DxvkGlobalPipelineBarrier {
VkPipelineStageFlags stages;
VkAccessFlags access;
};
/**
* \brief Pipeline and descriptor set layouts for a given binding layout
*
@ -435,12 +446,14 @@ namespace dxvk {
}
/**
* \brief Queries accumulated resource access flags
* \brief Queries global resource barrier
*
* Can be used to determine whether the pipeline
* reads or writes any resources.
* reads or writes any resources, and which shader
* stages it uses.
* \returns Global barrier
*/
VkAccessFlags getAccessFlags() const;
DxvkGlobalPipelineBarrier getGlobalBarrier() const;
private: