Permalink
Browse files

Extra safety when switching GPU backends, fix possible Vulkan shutdow…

…n issue. Should help #10005
  • Loading branch information...
hrydgard committed Oct 9, 2017
1 parent bb1f651 commit 3757070fe27d48690448d61ccb52231f9d2dab9d
Showing with 15 additions and 6 deletions.
  1. +1 −0 Common/Vulkan/VulkanMemory.cpp
  2. +11 −6 GPU/Vulkan/TextureCacheVulkan.cpp
  3. +3 −0 UI/GameSettingsScreen.cpp
@@ -143,6 +143,7 @@ void VulkanDeviceAllocator::Destroy() {
}
}
assert(slab.deviceMemory);
vulkan_->Delete().QueueDeleteDeviceMemory(slab.deviceMemory);
}
slabs_.clear();
@@ -135,13 +135,16 @@ TextureCacheVulkan::TextureCacheVulkan(Draw::DrawContext *draw, VulkanContext *v
TextureCacheVulkan::~TextureCacheVulkan() {
Clear(true);
allocator_->Destroy();
// We have to delete on queue, so this can free its queued deletions.
vulkan_->Delete().QueueCallback([](void *ptr) {
auto allocator = static_cast<VulkanDeviceAllocator *>(ptr);
delete allocator;
}, allocator_);
if (allocator_) {
allocator_->Destroy();
// We have to delete on queue, so this can free its queued deletions.
vulkan_->Delete().QueueCallback([](void *ptr) {
auto allocator = static_cast<VulkanDeviceAllocator *>(ptr);
delete allocator;
}, allocator_);
}
}
void TextureCacheVulkan::SetFramebufferManager(FramebufferManagerVulkan *fbManager) {
@@ -171,6 +174,8 @@ void TextureCacheVulkan::DeviceLost() {
void TextureCacheVulkan::DeviceRestore(VulkanContext *vulkan) {
vulkan_ = vulkan;
assert(!allocator_);
allocator_ = new VulkanDeviceAllocator(vulkan_, TEXCACHE_MIN_SLAB_SIZE, TEXCACHE_MAX_SLAB_SIZE);
samplerCache_.DeviceRestore(vulkan);
}
@@ -1083,6 +1083,9 @@ void GameSettingsScreen::CallbackRenderingBackend(bool yes) {
// If the user ends up deciding not to restart, set the config back to the current backend
// so it doesn't get switched by accident.
if (yes) {
// Extra save here to make sure the choice really gets saved even if there are shutdown bugs in
// the GPU backend code.
g_Config.Save();
System_SendMessage("graphics_restart", "");
} else {
g_Config.iGPUBackend = (int)GetGPUBackend();

0 comments on commit 3757070

Please sign in to comment.