Try fix RAII crash problems

This commit is contained in:
MrPurple666 2025-05-17 04:26:34 -03:00
parent d09899722d
commit d3510b1397
2 changed files with 33 additions and 42 deletions

View file

@ -110,27 +110,16 @@ try
, device_memory(device_memory_) , device_memory(device_memory_)
, gpu(gpu_) , gpu(gpu_)
, library(OpenLibrary(context.get())) , library(OpenLibrary(context.get()))
, , dld()
// Create raw Vulkan instance first // Initialize resources in the same order as they are declared in the header
instance(CreateInstance(*library, , instance(CreateInstance(*library,
dld, dld,
VK_API_VERSION_1_1, VK_API_VERSION_1_1,
render_window.GetWindowInfo().type, render_window.GetWindowInfo().type,
Settings::values.renderer_debug.GetValue())) Settings::values.renderer_debug.GetValue()))
, , debug_messenger(Settings::values.renderer_debug ? CreateDebugUtilsCallback(instance)
// 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{}) : vk::DebugUtilsMessenger{})
, managed_debug_messenger(Settings::values.renderer_debug , surface(CreateSurface(instance, render_window.GetWindowInfo()))
? 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)) , device(CreateDevice(instance, dld, *surface))
, memory_allocator(device) , memory_allocator(device)
, state_tracker() , state_tracker()
@ -172,22 +161,19 @@ try
scheduler, scheduler,
PresentFiltersForAppletCapture) PresentFiltersForAppletCapture)
, rasterizer(render_window, gpu, device_memory, device, memory_allocator, state_tracker, scheduler) , rasterizer(render_window, gpu, device_memory, device, memory_allocator, state_tracker, scheduler)
, applet_frame() { , 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)) {
if (Settings::values.renderer_force_max_clock.GetValue() && device.ShouldBoostClocks()) { if (Settings::values.renderer_force_max_clock.GetValue() && device.ShouldBoostClocks()) {
turbo_mode.emplace(instance, dld); turbo_mode.emplace(instance, dld);
scheduler.RegisterOnSubmit([this] { turbo_mode->QueueSubmitted(); }); 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(); Report();
} catch (const vk::Exception& exception) { } catch (const vk::Exception& exception) {
LOG_ERROR(Render_Vulkan, "Vulkan initialization failed with error: {}", exception.what()); LOG_ERROR(Render_Vulkan, "Vulkan initialization failed with error: {}", exception.what());

View file

@ -76,32 +76,37 @@ private:
std::shared_ptr<Common::DynamicLibrary> library; std::shared_ptr<Common::DynamicLibrary> library;
vk::InstanceDispatch dld; vk::InstanceDispatch dld;
// Keep original handles for compatibility with existing code // Order of member variables determines destruction order (reverse of declaration)
// Critical Vulkan resources should be declared in proper dependency order
// Base Vulkan instance, debugging, and surface
vk::Instance instance; vk::Instance instance;
// RAII wrapper for instance
ManagedInstance managed_instance;
vk::DebugUtilsMessenger debug_messenger; vk::DebugUtilsMessenger debug_messenger;
// RAII wrapper for debug messenger
ManagedDebugUtilsMessenger managed_debug_messenger;
vk::SurfaceKHR surface; vk::SurfaceKHR surface;
// RAII wrapper for surface
ManagedSurface managed_surface;
// Device and core resources
Device device; Device device;
MemoryAllocator memory_allocator; MemoryAllocator memory_allocator;
StateTracker state_tracker; StateTracker state_tracker;
Scheduler scheduler; Scheduler scheduler;
Swapchain swapchain; Swapchain swapchain;
PresentManager present_manager; PresentManager present_manager;
// Rendering components
BlitScreen blit_swapchain; BlitScreen blit_swapchain;
BlitScreen blit_capture; BlitScreen blit_capture;
BlitScreen blit_applet; BlitScreen blit_applet;
RasterizerVulkan rasterizer; RasterizerVulkan rasterizer;
std::optional<TurboMode> turbo_mode;
// Optional components
std::optional<TurboMode> turbo_mode;
Frame applet_frame; Frame applet_frame;
// RAII wrappers - must be destroyed before their raw handles
// so they are declared after to be destroyed first
ManagedInstance managed_instance;
ManagedDebugUtilsMessenger managed_debug_messenger;
ManagedSurface managed_surface;
}; };
} // namespace Vulkan } // namespace Vulkan