aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan/renderer_vulkan.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/renderer_vulkan/renderer_vulkan.cpp')
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.cpp48
1 files changed, 31 insertions, 17 deletions
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
index f5b73d63ef..30f5ff7a75 100644
--- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp
+++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
@@ -110,16 +110,27 @@ try
, device_memory(device_memory_)
, gpu(gpu_)
, library(OpenLibrary(context.get()))
- , dld()
- // Initialize resources in the same order as they are declared in the header
- , instance(CreateInstance(*library,
- dld,
- VK_API_VERSION_1_1,
- render_window.GetWindowInfo().type,
- Settings::values.renderer_debug.GetValue()))
- , debug_messenger(Settings::values.renderer_debug ? CreateDebugUtilsCallback(instance)
- : vk::DebugUtilsMessenger{})
- , surface(CreateSurface(instance, render_window.GetWindowInfo()))
+ ,
+ // Create raw Vulkan instance first
+ instance(CreateInstance(*library,
+ dld,
+ VK_API_VERSION_1_1,
+ render_window.GetWindowInfo().type,
+ Settings::values.renderer_debug.GetValue()))
+ ,
+ // Now create RAII wrappers for the resources in the correct order
+ managed_instance(MakeManagedInstance(instance, dld))
+ ,
+ // Create debug messenger if debug is enabled
+ debug_messenger(Settings::values.renderer_debug ? CreateDebugUtilsCallback(instance)
+ : vk::DebugUtilsMessenger{})
+ , managed_debug_messenger(Settings::values.renderer_debug
+ ? MakeManagedDebugUtilsMessenger(debug_messenger, instance, dld)
+ : ManagedDebugUtilsMessenger{})
+ ,
+ // Create surface
+ surface(CreateSurface(instance, render_window.GetWindowInfo()))
+ , managed_surface(MakeManagedSurface(surface, instance, dld))
, device(CreateDevice(instance, dld, *surface))
, memory_allocator(device)
, state_tracker()
@@ -161,19 +172,22 @@ try
scheduler,
PresentFiltersForAppletCapture)
, rasterizer(render_window, gpu, device_memory, device, memory_allocator, state_tracker, scheduler)
- , turbo_mode()
- , applet_frame()
- , managed_instance(MakeManagedInstance(instance, dld))
- , managed_debug_messenger(Settings::values.renderer_debug
- ? MakeManagedDebugUtilsMessenger(debug_messenger, instance, dld)
- : ManagedDebugUtilsMessenger{})
- , managed_surface(MakeManagedSurface(surface, instance, dld)) {
+ , applet_frame() {
if (Settings::values.renderer_force_max_clock.GetValue() && device.ShouldBoostClocks()) {
turbo_mode.emplace(instance, dld);
scheduler.RegisterOnSubmit([this] { turbo_mode->QueueSubmitted(); });
}
+#ifndef ANDROID
+ // Release ownership from the old instance and surface
+ instance.release();
+ surface.release();
+ if (Settings::values.renderer_debug) {
+ debug_messenger.release();
+ }
+#endif
+
Report();
} catch (const vk::Exception& exception) {
LOG_ERROR(Render_Vulkan, "Vulkan initialization failed with error: {}", exception.what());