mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-20 19:54:19 +01:00
[dxvk] Introduce DxvkGlobalPipelineBarrier
This commit is contained in:
parent
95f7aae3e6
commit
67d35ecc8d
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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:
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user