renderer_vulkan: Proper barriers on renderpass clear

This commit is contained in:
GPUCode
2023-01-07 23:12:56 +02:00
parent 11061f36e6
commit 4ee36e05b6
4 changed files with 24 additions and 19 deletions

View File

@@ -907,16 +907,11 @@ void RendererVulkan::SwapBuffers() {
const auto& layout = render_window.GetFramebufferLayout();
PrepareRendertarget();
const auto RecreateSwapchain = [&] {
scheduler.Finish();
swapchain.Create();
};
do {
if (swapchain.NeedsRecreation()) {
RecreateSwapchain();
scheduler.Finish();
swapchain.Create();
}
scheduler.WaitWorker();
swapchain.AcquireNextImage();
} while (swapchain.NeedsRecreation());

View File

@@ -179,7 +179,7 @@ private:
std::size_t recorded_counts = 0;
std::size_t command_offset = 0;
bool submit = false;
alignas(std::max_align_t) std::array<u8, 0x80000> data{};
alignas(std::max_align_t) std::array<u8, 0x8000> data{};
};
private:

View File

@@ -15,7 +15,7 @@ class Scheduler;
class RenderpassCache;
class Swapchain {
static constexpr u32 PREFERRED_IMAGE_COUNT = 8;
static constexpr u32 PREFERRED_IMAGE_COUNT = 9;
public:
Swapchain(const Instance& instance, Scheduler& scheduler, RenderpassCache& renderpass_cache);

View File

@@ -493,6 +493,16 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
const bool is_color = surface.type != VideoCore::SurfaceType::Depth &&
surface.type != VideoCore::SurfaceType::DepthStencil;
const vk::AccessFlags access_flag =
is_color ? vk::AccessFlagBits::eColorAttachmentRead |
vk::AccessFlagBits::eColorAttachmentWrite
: vk::AccessFlagBits::eDepthStencilAttachmentRead |
vk::AccessFlagBits::eDepthStencilAttachmentWrite;
const vk::PipelineStageFlags pipeline_flags =
is_color ? vk::PipelineStageFlagBits::eColorAttachmentOutput
: vk::PipelineStageFlagBits::eNone;
const vk::RenderPass clear_renderpass =
is_color ? renderpass_cache.GetRenderpass(surface.pixel_format,
VideoCore::PixelFormat::Invalid, true)
@@ -535,10 +545,10 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
.src_image = surface.alloc.image,
};
scheduler.Record([params, level = clear.texture_level](vk::CommandBuffer cmdbuf) {
scheduler.Record([params, access_flag, pipeline_flags](vk::CommandBuffer cmdbuf) {
const vk::ImageMemoryBarrier pre_barrier = {
.srcAccessMask = params.src_access,
.dstAccessMask = vk::AccessFlagBits::eTransferWrite,
.dstAccessMask = access_flag,
.oldLayout = vk::ImageLayout::eGeneral,
.newLayout = vk::ImageLayout::eGeneral,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
@@ -546,23 +556,23 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
.image = params.src_image,
.subresourceRange{
.aspectMask = params.aspect,
.baseMipLevel = level,
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = VK_REMAINING_ARRAY_LAYERS,
},
};
cmdbuf.pipelineBarrier(params.pipeline_flags, vk::PipelineStageFlagBits::eTransfer,
vk::DependencyFlagBits::eByRegion, {}, {}, pre_barrier);
cmdbuf.pipelineBarrier(params.pipeline_flags, pipeline_flags,
vk::DependencyFlagBits::eByRegion, {}, {}, pre_barrier);
});
renderpass_cache.EnterRenderpass(clear_info);
renderpass_cache.ExitRenderpass();
scheduler.Record([params, level = clear.texture_level](vk::CommandBuffer cmdbuf) {
scheduler.Record([params, access_flag, pipeline_flags](vk::CommandBuffer cmdbuf) {
const vk::ImageMemoryBarrier post_barrier = {
.srcAccessMask = vk::AccessFlagBits::eTransferWrite,
.srcAccessMask = access_flag,
.dstAccessMask = params.src_access,
.oldLayout = vk::ImageLayout::eGeneral,
.newLayout = vk::ImageLayout::eGeneral,
@@ -571,15 +581,15 @@ void TextureRuntime::ClearTextureWithRenderpass(Surface& surface,
.image = params.src_image,
.subresourceRange{
.aspectMask = params.aspect,
.baseMipLevel = level,
.baseMipLevel = 0,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = VK_REMAINING_ARRAY_LAYERS,
},
};
cmdbuf.pipelineBarrier(vk::PipelineStageFlagBits::eTransfer, params.pipeline_flags,
vk::DependencyFlagBits::eByRegion, {}, {}, post_barrier);
cmdbuf.pipelineBarrier(pipeline_flags, params.pipeline_flags,
vk::DependencyFlagBits::eByRegion, {}, {}, post_barrier);
});
}