This commit is contained in:
Kravickas 2026-03-20 12:43:41 +01:00 committed by GitHub
parent a858f9c96c
commit 2bb20e4650
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -247,13 +247,11 @@ 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 ||
static_cast<bool>(dst_mask &
(vk::AccessFlagBits2::eTransferWrite |
vk::AccessFlagBits2::eShaderWrite |
vk::AccessFlagBits2::eColorAttachmentWrite |
vk::AccessFlagBits2::eDepthStencilAttachmentWrite |
vk::AccessFlagBits2::eMemoryWrite))) {
constexpr auto write_flags = vk::AccessFlagBits2::eTransferWrite |
vk::AccessFlagBits2::eShaderWrite |
vk::AccessFlagBits2::eMemoryWrite;
const bool is_write = static_cast<bool>(state.access_mask & write_flags);
if (state.layout != dst_layout || state.access_mask != dst_mask || is_write) {
barriers.emplace_back(vk::ImageMemoryBarrier2{
.srcStageMask = state.pl_stage,
.srcAccessMask = state.access_mask,
@ -283,11 +281,10 @@ Image::Barriers Image::GetBarriers(vk::ImageLayout dst_layout, vk::AccessFlags2
subresource_states.clear();
}
} else { // Full resource transition
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);
constexpr auto write_flags = vk::AccessFlagBits2::eTransferWrite |
vk::AccessFlagBits2::eShaderWrite |
vk::AccessFlagBits2::eMemoryWrite;
const bool is_write = static_cast<bool>(last_state.access_mask & write_flags);
if (last_state.layout == dst_layout && last_state.access_mask == dst_mask && !is_write) {
return {};
}
@ -385,6 +382,8 @@ void Image::Upload(std::span<const vk::BufferImageCopy> upload_copies, vk::Buffe
.bufferMemoryBarrierCount = 1,
.pBufferMemoryBarriers = &post_barrier,
});
Transit(vk::ImageLayout::eGeneral,
vk::AccessFlagBits2::eShaderRead | vk::AccessFlagBits2::eTransferRead, {});
flags &= ~ImageFlagBits::Dirty;
}
@ -655,8 +654,6 @@ void Image::CopyImageWithBuffer(Image& src_image, vk::Buffer buffer, u64 offset)
cmdbuf.copyBufferToImage(buffer, GetImage(), vk::ImageLayout::eTransferDstOptimal,
buffer_copies);
// Match CopyImage: transition to general so shaders can sample the result.
Transit(vk::ImageLayout::eGeneral,
vk::AccessFlagBits2::eShaderRead | vk::AccessFlagBits2::eTransferRead, {});
}
@ -698,6 +695,8 @@ void Image::CopyMip(Image& src_image, u32 mip, u32 slice) {
const auto cmdbuf = scheduler->CommandBuffer();
cmdbuf.copyImage(src_image.GetImage(), src_image.backing->state.layout, GetImage(),
backing->state.layout, image_copy);
Transit(vk::ImageLayout::eGeneral,
vk::AccessFlagBits2::eShaderRead | vk::AccessFlagBits2::eTransferRead, {});
}
void Image::Resolve(Image& src_image, const VideoCore::SubresourceRange& mrt0_range,