diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 438698498..c715d680e 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -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()); diff --git a/src/video_core/renderer_vulkan/vk_scheduler.h b/src/video_core/renderer_vulkan/vk_scheduler.h index ff636f936..fd6152f4e 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.h +++ b/src/video_core/renderer_vulkan/vk_scheduler.h @@ -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 data{}; + alignas(std::max_align_t) std::array data{}; }; private: diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index e8a80b3c5..585fad4c1 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h @@ -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); diff --git a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp index e71a3ddb8..1c8a0375c 100644 --- a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp @@ -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); }); }