diff options
| author | 2021-06-01 19:59:29 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:34 -0400 | |
| commit | d26271b0148e4c41d87199b3e42a5702d1a6be53 (patch) | |
| tree | 4a21c8ae09b121e1ba52cbc4fd2d4c548894133d | |
| parent | emit_glasm_context_get_set: Remove unused variable (diff) | |
| download | yuzu-d26271b0148e4c41d87199b3e42a5702d1a6be53.tar.gz yuzu-d26271b0148e4c41d87199b3e42a5702d1a6be53.tar.xz yuzu-d26271b0148e4c41d87199b3e42a5702d1a6be53.zip | |
vk_swapchain: Avoid recreating the swapchain on each frame
Recreate only when requested (or sRGB is changed) instead of tracking
the frontend's size. That size is still used as a hint.
| -rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 18 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_swapchain.h | 6 |
2 files changed, 9 insertions, 15 deletions
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index d50647ba7..54c41bcaf 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp | |||
| @@ -97,19 +97,14 @@ RendererVulkan::RendererVulkan(Core::TelemetrySession& telemetry_session_, | |||
| 97 | Core::Frontend::EmuWindow& emu_window, | 97 | Core::Frontend::EmuWindow& emu_window, |
| 98 | Core::Memory::Memory& cpu_memory_, Tegra::GPU& gpu_, | 98 | Core::Memory::Memory& cpu_memory_, Tegra::GPU& gpu_, |
| 99 | std::unique_ptr<Core::Frontend::GraphicsContext> context_) try | 99 | std::unique_ptr<Core::Frontend::GraphicsContext> context_) try |
| 100 | : RendererBase(emu_window, std::move(context_)), | 100 | : RendererBase(emu_window, std::move(context_)), telemetry_session(telemetry_session_), |
| 101 | telemetry_session(telemetry_session_), | 101 | cpu_memory(cpu_memory_), gpu(gpu_), library(OpenLibrary()), |
| 102 | cpu_memory(cpu_memory_), | ||
| 103 | gpu(gpu_), | ||
| 104 | library(OpenLibrary()), | ||
| 105 | instance(CreateInstance(library, dld, VK_API_VERSION_1_1, render_window.GetWindowInfo().type, | 102 | instance(CreateInstance(library, dld, VK_API_VERSION_1_1, render_window.GetWindowInfo().type, |
| 106 | true, Settings::values.renderer_debug.GetValue())), | 103 | true, Settings::values.renderer_debug.GetValue())), |
| 107 | debug_callback(Settings::values.renderer_debug ? CreateDebugCallback(instance) : nullptr), | 104 | debug_callback(Settings::values.renderer_debug ? CreateDebugCallback(instance) : nullptr), |
| 108 | surface(CreateSurface(instance, render_window)), | 105 | surface(CreateSurface(instance, render_window)), |
| 109 | device(CreateDevice(instance, dld, *surface)), | 106 | device(CreateDevice(instance, dld, *surface)), memory_allocator(device, false), |
| 110 | memory_allocator(device, false), | 107 | state_tracker(gpu), scheduler(device, state_tracker), |
| 111 | state_tracker(gpu), | ||
| 112 | scheduler(device, state_tracker), | ||
| 113 | swapchain(*surface, device, scheduler, render_window.GetFramebufferLayout().width, | 108 | swapchain(*surface, device, scheduler, render_window.GetFramebufferLayout().width, |
| 114 | render_window.GetFramebufferLayout().height, false), | 109 | render_window.GetFramebufferLayout().height, false), |
| 115 | blit_screen(cpu_memory, render_window, device, memory_allocator, swapchain, scheduler, | 110 | blit_screen(cpu_memory, render_window, device, memory_allocator, swapchain, scheduler, |
| @@ -139,17 +134,16 @@ void RendererVulkan::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) { | |||
| 139 | rasterizer.AccelerateDisplay(*framebuffer, framebuffer_addr, framebuffer->stride); | 134 | rasterizer.AccelerateDisplay(*framebuffer, framebuffer_addr, framebuffer->stride); |
| 140 | const bool is_srgb = use_accelerated && screen_info.is_srgb; | 135 | const bool is_srgb = use_accelerated && screen_info.is_srgb; |
| 141 | 136 | ||
| 142 | const Layout::FramebufferLayout layout = render_window.GetFramebufferLayout(); | ||
| 143 | bool has_been_recreated = false; | 137 | bool has_been_recreated = false; |
| 144 | const auto recreate_swapchain = [&] { | 138 | const auto recreate_swapchain = [&] { |
| 145 | if (!has_been_recreated) { | 139 | if (!has_been_recreated) { |
| 146 | has_been_recreated = true; | 140 | has_been_recreated = true; |
| 147 | scheduler.WaitWorker(); | 141 | scheduler.WaitWorker(); |
| 148 | } | 142 | } |
| 143 | const Layout::FramebufferLayout layout = render_window.GetFramebufferLayout(); | ||
| 149 | swapchain.Create(layout.width, layout.height, is_srgb); | 144 | swapchain.Create(layout.width, layout.height, is_srgb); |
| 150 | }; | 145 | }; |
| 151 | if (swapchain.NeedsRecreate() || | 146 | if (swapchain.NeedsRecreate() || swapchain.HasColorSpaceChanged(is_srgb)) { |
| 152 | swapchain.HasDifferentLayout(layout.width, layout.height, is_srgb)) { | ||
| 153 | recreate_swapchain(); | 147 | recreate_swapchain(); |
| 154 | } | 148 | } |
| 155 | bool needs_recreate; | 149 | bool needs_recreate; |
diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index b38fd9dc2..df6da3d93 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h | |||
| @@ -33,9 +33,9 @@ public: | |||
| 33 | /// Presents the rendered image to the swapchain. | 33 | /// Presents the rendered image to the swapchain. |
| 34 | void Present(VkSemaphore render_semaphore); | 34 | void Present(VkSemaphore render_semaphore); |
| 35 | 35 | ||
| 36 | /// Returns true when the framebuffer layout has changed. | 36 | /// Returns true when the color space has changed. |
| 37 | bool HasDifferentLayout(u32 width, u32 height, bool is_srgb) const { | 37 | bool HasColorSpaceChanged(bool is_srgb) const { |
| 38 | return extent.width != width || extent.height != height || current_srgb != is_srgb; | 38 | return current_srgb != is_srgb; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | /// Returns true when the image has to be recreated. | 41 | /// Returns true when the image has to be recreated. |