mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2025-07-21 01:45:47 +00:00
Try fix RAII crash problems
This commit is contained in:
parent
d09899722d
commit
d3510b1397
2 changed files with 33 additions and 42 deletions
|
@ -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
|
: vk::DebugUtilsMessenger{})
|
||||||
managed_instance(MakeManagedInstance(instance, dld))
|
, surface(CreateSurface(instance, render_window.GetWindowInfo()))
|
||||||
,
|
|
||||||
// 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))
|
, 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());
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue