Extra safety when switching GPU backends, fix possible Vulkan shutdown issue. Should help #10005

This commit is contained in:
Henrik Rydgård 2017-10-09 12:17:54 +02:00
parent bb1f651182
commit 3757070fe2
3 changed files with 15 additions and 6 deletions

View File

@ -143,6 +143,7 @@ void VulkanDeviceAllocator::Destroy() {
}
}
assert(slab.deviceMemory);
vulkan_->Delete().QueueDeleteDeviceMemory(slab.deviceMemory);
}
slabs_.clear();

View File

@ -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);
}

View File

@ -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();