1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-27 04:54:15 +01:00

[dxvk] Check whether pipeline has potentially hazardous stores

This commit is contained in:
Philip Rebohle 2025-02-19 19:07:43 +01:00 committed by Philip Rebohle
parent 6f7a468174
commit 1d8fb818fc
4 changed files with 25 additions and 4 deletions

View File

@ -965,9 +965,13 @@ namespace dxvk {
m_flags.set(DxvkGraphicsPipelineFlag::HasRasterizerDiscard); m_flags.set(DxvkGraphicsPipelineFlag::HasRasterizerDiscard);
} }
if (m_barrier.access & VK_ACCESS_SHADER_WRITE_BIT) if (m_barrier.access & VK_ACCESS_SHADER_WRITE_BIT) {
m_flags.set(DxvkGraphicsPipelineFlag::HasStorageDescriptors); m_flags.set(DxvkGraphicsPipelineFlag::HasStorageDescriptors);
if (layout->layout().getHazardousSetMask())
m_flags.set(DxvkGraphicsPipelineFlag::UnrollMergedDraws);
}
if (m_shaders.fs != nullptr) { if (m_shaders.fs != nullptr) {
if (m_shaders.fs->flags().test(DxvkShaderFlag::HasSampleRateShading)) if (m_shaders.fs->flags().test(DxvkShaderFlag::HasSampleRateShading))
m_flags.set(DxvkGraphicsPipelineFlag::HasSampleRateShading); m_flags.set(DxvkGraphicsPipelineFlag::HasSampleRateShading);

View File

@ -31,6 +31,7 @@ namespace dxvk {
HasStorageDescriptors, HasStorageDescriptors,
HasSampleRateShading, HasSampleRateShading,
HasSampleMaskExport, HasSampleMaskExport,
UnrollMergedDraws,
}; };
using DxvkGraphicsPipelineFlags = Flags<DxvkGraphicsPipelineFlag>; using DxvkGraphicsPipelineFlags = Flags<DxvkGraphicsPipelineFlag>;
@ -660,4 +661,4 @@ namespace dxvk {
}; };
} }

View File

@ -205,7 +205,7 @@ namespace dxvk {
DxvkBindingLayout::DxvkBindingLayout(VkShaderStageFlags stages) DxvkBindingLayout::DxvkBindingLayout(VkShaderStageFlags stages)
: m_pushConst { 0, 0, 0 }, m_pushConstStages(0), m_stages(stages) { : m_pushConst { 0, 0, 0 }, m_pushConstStages(0), m_stages(stages), m_hazards(0u) {
} }
@ -236,6 +236,9 @@ namespace dxvk {
void DxvkBindingLayout::addBinding(const DxvkBindingInfo& binding) { void DxvkBindingLayout::addBinding(const DxvkBindingInfo& binding) {
uint32_t set = binding.computeSetIndex(); uint32_t set = binding.computeSetIndex();
m_bindings[set].addBinding(binding); m_bindings[set].addBinding(binding);
if ((binding.access & VK_ACCESS_2_SHADER_WRITE_BIT) && binding.accessOp == DxvkAccessOp::None)
m_hazards |= 1u << set;
} }
@ -260,6 +263,8 @@ namespace dxvk {
addPushConstantRange(layout.m_pushConst); addPushConstantRange(layout.m_pushConst);
m_pushConstStages |= layout.m_pushConstStages; m_pushConstStages |= layout.m_pushConstStages;
m_hazards |= layout.m_hazards;
} }
@ -400,4 +405,4 @@ namespace dxvk {
return barrier; return barrier;
} }
} }

View File

@ -337,6 +337,16 @@ namespace dxvk {
return m_stages; return m_stages;
} }
/**
* \brief Queries hazardous sets
*
* \returns Mask of sets with storage descriptors
* that are not accessed in an order-invariant way.
*/
uint32_t getHazardousSetMask() const {
return m_hazards;
}
/** /**
* \brief Queries defined descriptor set layouts * \brief Queries defined descriptor set layouts
* *
@ -394,6 +404,7 @@ namespace dxvk {
VkPushConstantRange m_pushConst; VkPushConstantRange m_pushConst;
VkShaderStageFlags m_pushConstStages; VkShaderStageFlags m_pushConstStages;
VkShaderStageFlags m_stages; VkShaderStageFlags m_stages;
uint32_t m_hazards;
}; };