From d0e5856608a884fb2f79910683f7df69431075bc Mon Sep 17 00:00:00 2001 From: DrChat Date: Sat, 3 Mar 2018 20:50:51 -0600 Subject: [PATCH] [Vulkan] Free texture base region as well --- src/xenia/gpu/vulkan/texture_cache.cc | 13 ++++++++++--- src/xenia/gpu/vulkan/texture_cache.h | 6 ++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/xenia/gpu/vulkan/texture_cache.cc b/src/xenia/gpu/vulkan/texture_cache.cc index c97eccd78..84fe7670a 100644 --- a/src/xenia/gpu/vulkan/texture_cache.cc +++ b/src/xenia/gpu/vulkan/texture_cache.cc @@ -379,12 +379,19 @@ bool TextureCache::FreeTexture(Texture* texture) { for (auto region_it = texture->regions.begin(); region_it != texture->regions.end(); ++region_it) { TextureRegion* region = region_it->get(); - for (auto view_it = region->views.begin(); view_it != region->views.end(); - ++view_it) { - vkDestroyImageView(*device_, (*view_it)->view, nullptr); + for (auto& view : region->views) { + vkDestroyImageView(*device_, view->view, nullptr); } vmaDestroyImage(mem_allocator_, region->image, region->allocation); } + texture->regions.clear(); + + // Free the base region (which is not part of regions) + for (auto& view : texture->base_region->views) { + vkDestroyImageView(*device_, view->view, nullptr); + } + vmaDestroyImage(mem_allocator_, texture->base_region->image, + texture->base_region->allocation); if (texture->access_watch_handle) { memory_->CancelAccessWatch(texture->access_watch_handle); diff --git a/src/xenia/gpu/vulkan/texture_cache.h b/src/xenia/gpu/vulkan/texture_cache.h index 3a7b01501..c19a58f3e 100644 --- a/src/xenia/gpu/vulkan/texture_cache.h +++ b/src/xenia/gpu/vulkan/texture_cache.h @@ -80,10 +80,8 @@ class TextureCache { std::vector> regions; - // Non-owning; base region is also in the (owning) regions vector. - TextureRegion* base_region; - - VkFramebuffer framebuffer; // Blit target frame buffer. + TextureRegion* base_region; // Base region representing the entire image. + VkFramebuffer framebuffer; // Blit target frame buffer. uintptr_t access_watch_handle; bool pending_invalidation;