diff --git a/src/video_core/renderer_vulkan/vk_blit_screen.cpp b/src/video_core/renderer_vulkan/vk_blit_screen.cpp index a2a9349630..bb7eb9bdaa 100644 --- a/src/video_core/renderer_vulkan/vk_blit_screen.cpp +++ b/src/video_core/renderer_vulkan/vk_blit_screen.cpp @@ -88,36 +88,26 @@ void BlitScreen::DrawToFrame(RasterizerVulkan& rasterizer, Frame* frame, bool resource_update_required = false; bool presentation_recreate_required = false; - // Recreate dynamic resources if the adapting filter changed if (!window_adapt || scaling_filter != filters.get_scaling_filter()) { resource_update_required = true; } - // Recreate dynamic resources if the image count changed - const size_t old_swapchain_image_count = - std::exchange(image_count, current_swapchain_image_count); - if (old_swapchain_image_count != current_swapchain_image_count) { + if (image_count != current_swapchain_image_count) { resource_update_required = true; + image_count = current_swapchain_image_count; } - // Recreate the presentation frame if the format or dimensions of the window changed - const VkFormat old_swapchain_view_format = - std::exchange(swapchain_view_format, current_swapchain_view_format); - if (old_swapchain_view_format != current_swapchain_view_format || + if (swapchain_view_format != current_swapchain_view_format || layout.width != frame->width || layout.height != frame->height) { resource_update_required = true; presentation_recreate_required = true; + swapchain_view_format = current_swapchain_view_format; } - // If we have a pending resource update, perform it if (resource_update_required) { - // Wait for idle to ensure no resources are in use WaitIdle(); - - // Update window adapt pass SetWindowAdaptPass(); - // Update frame format if needed if (presentation_recreate_required) { present_manager.RecreateFrame(frame, layout.width, layout.height, swapchain_view_format, window_adapt->GetRenderPass()); @@ -126,21 +116,21 @@ void BlitScreen::DrawToFrame(RasterizerVulkan& rasterizer, Frame* frame, image_index = 0; } - // Add additional layers if needed const VkExtent2D window_size{ .width = layout.screen.GetWidth(), .height = layout.screen.GetHeight(), }; - while (layers.size() < framebuffers.size()) { - layers.emplace_back(device, memory_allocator, scheduler, device_memory, image_count, - window_size, window_adapt->GetDescriptorSetLayout(), filters); + if (layers.size() != framebuffers.size()) { + layers.clear(); + for (size_t i = 0; i < framebuffers.size(); ++i) { + layers.emplace_back(device, memory_allocator, scheduler, device_memory, image_count, + window_size, window_adapt->GetDescriptorSetLayout(), filters); + } } - // Perform the draw window_adapt->Draw(rasterizer, scheduler, image_index, layers, framebuffers, layout, frame); - // Advance to next image if (++image_index >= image_count) { image_index = 0; } @@ -149,17 +139,20 @@ void BlitScreen::DrawToFrame(RasterizerVulkan& rasterizer, Frame* frame, vk::Framebuffer BlitScreen::CreateFramebuffer(const Layout::FramebufferLayout& layout, VkImageView image_view, VkFormat current_view_format) { - const bool format_updated = - std::exchange(swapchain_view_format, current_view_format) != current_view_format; + bool format_updated = swapchain_view_format != current_view_format; + swapchain_view_format = current_view_format; + if (!window_adapt || scaling_filter != filters.get_scaling_filter() || format_updated) { WaitIdle(); SetWindowAdaptPass(); image_index = 0; } + const VkExtent2D extent{ .width = layout.width, .height = layout.height, }; + return CreateFramebuffer(image_view, extent, window_adapt->GetRenderPass()); }