Write after write sync hazard (#4142)

* WAW barrier

* clang
This commit is contained in:
Kravickas 2026-03-18 22:09:19 +01:00 committed by GitHub
parent ec1719e4d3
commit 78411c4b8a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -239,7 +239,13 @@ Image::Barriers Image::GetBarriers(vk::ImageLayout dst_layout, vk::AccessFlags2
ASSERT(subres_idx < subresource_states.size());
auto& state = subresource_states[subres_idx];
if (state.layout != dst_layout || state.access_mask != dst_mask) {
if (state.layout != dst_layout || state.access_mask != dst_mask ||
static_cast<bool>(dst_mask &
(vk::AccessFlagBits2::eTransferWrite |
vk::AccessFlagBits2::eShaderWrite |
vk::AccessFlagBits2::eColorAttachmentWrite |
vk::AccessFlagBits2::eDepthStencilAttachmentWrite |
vk::AccessFlagBits2::eMemoryWrite))) {
barriers.emplace_back(vk::ImageMemoryBarrier2{
.srcStageMask = state.pl_stage,
.srcAccessMask = state.access_mask,
@ -269,7 +275,12 @@ Image::Barriers Image::GetBarriers(vk::ImageLayout dst_layout, vk::AccessFlags2
subresource_states.clear();
}
} else { // Full resource transition
if (last_state.layout == dst_layout && last_state.access_mask == dst_mask) {
constexpr auto write_flags =
vk::AccessFlagBits2::eTransferWrite | vk::AccessFlagBits2::eShaderWrite |
vk::AccessFlagBits2::eColorAttachmentWrite |
vk::AccessFlagBits2::eDepthStencilAttachmentWrite | vk::AccessFlagBits2::eMemoryWrite;
const bool is_write = static_cast<bool>(dst_mask & write_flags);
if (last_state.layout == dst_layout && last_state.access_mask == dst_mask && !is_write) {
return {};
}