renderer_vulkan: proper barriers

This commit is contained in:
psucien 2024-06-06 23:22:10 +02:00
parent 729d02d699
commit cb07778008
3 changed files with 16 additions and 5 deletions

View File

@ -379,7 +379,7 @@ void GraphicsPipeline::BindResources(Core::MemoryManager* memory, StreamBuffer&
const auto tsharp = stage.ReadUd<AmdGpu::Image>(image.sgpr_base, image.dword_offset); const auto tsharp = stage.ReadUd<AmdGpu::Image>(image.sgpr_base, image.dword_offset);
const auto& image_view = texture_cache.FindImageView(tsharp); const auto& image_view = texture_cache.FindImageView(tsharp);
image_infos.emplace_back(VK_NULL_HANDLE, *image_view.image_view, image_infos.emplace_back(VK_NULL_HANDLE, *image_view.image_view,
vk::ImageLayout::eGeneral); vk::ImageLayout::eShaderReadOnlyOptimal);
set_writes.push_back({ set_writes.push_back({
.dstSet = VK_NULL_HANDLE, .dstSet = VK_NULL_HANDLE,
.dstBinding = binding++, .dstBinding = binding++,

View File

@ -214,10 +214,11 @@ void Image::Transit(vk::ImageLayout dst_layout, vk::Flags<vk::AccessFlagBits> ds
}}; }};
// Adjust pipieline stage // Adjust pipieline stage
vk::PipelineStageFlagBits dst_pl_stage = (dst_mask == vk::AccessFlagBits::eTransferRead || vk::PipelineStageFlags dst_pl_stage =
dst_mask == vk::AccessFlagBits::eTransferWrite) (dst_mask == vk::AccessFlagBits::eTransferRead ||
? vk::PipelineStageFlagBits::eTransfer dst_mask == vk::AccessFlagBits::eTransferWrite)
: vk::PipelineStageFlagBits::eAllGraphics; ? vk::PipelineStageFlagBits::eTransfer
: vk::PipelineStageFlagBits::eAllGraphics | vk::PipelineStageFlagBits::eComputeShader;
const auto cmdbuf = scheduler->CommandBuffer(); const auto cmdbuf = scheduler->CommandBuffer();
cmdbuf.pipelineBarrier(pl_stage, dst_pl_stage, vk::DependencyFlagBits::eByRegion, {}, {}, cmdbuf.pipelineBarrier(pl_stage, dst_pl_stage, vk::DependencyFlagBits::eByRegion, {}, {},
barrier); barrier);

View File

@ -163,6 +163,12 @@ ImageView& TextureCache::RegisterImageView(Image& image, const ImageViewInfo& vi
ImageView& TextureCache::FindImageView(const AmdGpu::Image& desc) { ImageView& TextureCache::FindImageView(const AmdGpu::Image& desc) {
Image& image = FindImage(ImageInfo{desc}, desc.Address()); Image& image = FindImage(ImageInfo{desc}, desc.Address());
if (image.info.is_storage) {
image.Transit(vk::ImageLayout::eGeneral, vk::AccessFlagBits::eShaderWrite);
} else {
image.Transit(vk::ImageLayout::eShaderReadOnlyOptimal, vk::AccessFlagBits::eShaderRead);
}
const ImageViewInfo view_info{desc}; const ImageViewInfo view_info{desc};
return RegisterImageView(image, view_info); return RegisterImageView(image, view_info);
} }
@ -172,6 +178,10 @@ ImageView& TextureCache::RenderTarget(const AmdGpu::Liverpool::ColorBuffer& buff
const ImageInfo info{buffer, hint}; const ImageInfo info{buffer, hint};
auto& image = FindImage(info, buffer.Address()); auto& image = FindImage(info, buffer.Address());
image.Transit(vk::ImageLayout::eColorAttachmentOptimal,
vk::AccessFlagBits::eColorAttachmentWrite |
vk::AccessFlagBits::eColorAttachmentRead);
ImageViewInfo view_info; ImageViewInfo view_info;
view_info.format = info.pixel_format; view_info.format = info.pixel_format;
return RegisterImageView(image, view_info); return RegisterImageView(image, view_info);