summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorLeo Lam <leolino.lam@gmail.com>2017-10-11 11:31:16 +0200
committerGitHub <noreply@github.com>2017-10-11 11:31:16 +0200
commit8163fa1acc11041becfa7befbe0b447501d7923e (patch)
tree03f97866a4036838f9709ef4e2ae30dcf4406815 /Source/Core
parent1c14881cc18b1b58d046507e5194e24bff513cc7 (diff)
parent8f56219ea8112fb3b9d33cf5eaf639d42726d69d (diff)
Merge pull request #6100 from leoetlino/vulkan-shutdown
Vulkan: Fix crash when Core initialisation fails
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/VideoBackends/Vulkan/main.cpp56
1 files changed, 15 insertions, 41 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/main.cpp b/Source/Core/VideoBackends/Vulkan/main.cpp
index f507d6cf05..cb67ee8997 100644
--- a/Source/Core/VideoBackends/Vulkan/main.cpp
+++ b/Source/Core/VideoBackends/Vulkan/main.cpp
@@ -194,9 +194,7 @@ bool VideoBackend::Initialize(void* window_handle)
if (!swap_chain)
{
PanicAlert("Failed to create Vulkan swap chain.");
- g_vulkan_context.reset();
- ShutdownShared();
- UnloadVulkanLibrary();
+ Shutdown();
return false;
}
}
@@ -206,10 +204,7 @@ bool VideoBackend::Initialize(void* window_handle)
if (!g_command_buffer_mgr->Initialize())
{
PanicAlert("Failed to create Vulkan command buffers");
- g_command_buffer_mgr.reset();
- g_vulkan_context.reset();
- ShutdownShared();
- UnloadVulkanLibrary();
+ Shutdown();
return false;
}
@@ -227,15 +222,7 @@ bool VideoBackend::Initialize(void* window_handle)
!Renderer::GetInstance()->Initialize())
{
PanicAlert("Failed to initialize Vulkan classes.");
- g_renderer.reset();
- StateTracker::DestroyInstance();
- g_framebuffer_manager.reset();
- g_shader_cache.reset();
- g_object_cache.reset();
- g_command_buffer_mgr.reset();
- g_vulkan_context.reset();
- ShutdownShared();
- UnloadVulkanLibrary();
+ Shutdown();
return false;
}
@@ -247,19 +234,7 @@ bool VideoBackend::Initialize(void* window_handle)
!PerfQuery::GetInstance()->Initialize())
{
PanicAlert("Failed to initialize Vulkan classes.");
- g_perf_query.reset();
- g_texture_cache.reset();
- g_vertex_manager.reset();
- g_renderer.reset();
- StateTracker::DestroyInstance();
- g_framebuffer_manager.reset();
- g_shader_cache->Shutdown();
- g_shader_cache.reset();
- g_object_cache.reset();
- g_command_buffer_mgr.reset();
- g_vulkan_context.reset();
- ShutdownShared();
- UnloadVulkanLibrary();
+ Shutdown();
return false;
}
@@ -287,34 +262,33 @@ void VideoBackend::Video_Prepare()
void VideoBackend::Shutdown()
{
- g_command_buffer_mgr->WaitForGPUIdle();
+ if (g_command_buffer_mgr)
+ g_command_buffer_mgr->WaitForGPUIdle();
+ g_perf_query.reset();
+ g_texture_cache.reset();
+ g_vertex_manager.reset();
+ g_renderer.reset();
+ StateTracker::DestroyInstance();
+ g_framebuffer_manager.reset();
+ if (g_shader_cache)
+ g_shader_cache->Shutdown();
g_shader_cache.reset();
g_object_cache.reset();
g_command_buffer_mgr.reset();
g_vulkan_context.reset();
-
- UnloadVulkanLibrary();
-
ShutdownShared();
+ UnloadVulkanLibrary();
}
void VideoBackend::Video_Cleanup()
{
g_command_buffer_mgr->WaitForGPUIdle();
- g_shader_cache->Shutdown();
// Save all cached pipelines out to disk for next time.
if (g_ActiveConfig.bShaderCache)
g_shader_cache->SavePipelineCache();
- g_perf_query.reset();
- g_texture_cache.reset();
- g_vertex_manager.reset();
- g_framebuffer_manager.reset();
- StateTracker::DestroyInstance();
- g_renderer.reset();
-
CleanupShared();
}
}