summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-06-01 19:59:29 -0300
committerGravatar ameerj2021-07-22 21:51:34 -0400
commitd26271b0148e4c41d87199b3e42a5702d1a6be53 (patch)
tree4a21c8ae09b121e1ba52cbc4fd2d4c548894133d
parentemit_glasm_context_get_set: Remove unused variable (diff)
downloadyuzu-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.cpp18
-rw-r--r--src/video_core/renderer_vulkan/vk_swapchain.h6
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.