renderer_vulkan: proper barriers
This commit is contained in:
parent
729d02d699
commit
cb07778008
|
@ -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++,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue