diff options
| author | DrChat <arkolbed@gmail.com> | 2018-03-03 20:50:51 -0600 |
|---|---|---|
| committer | DrChat <arkolbed@gmail.com> | 2018-03-03 20:50:51 -0600 |
| commit | d0e5856608a884fb2f79910683f7df69431075bc (patch) | |
| tree | 6b51b37df24a1f435084f8f8d81a168d95aaefe5 | |
| parent | 9774c931810cc41ec1df863463f05fab618df282 (diff) | |
[Vulkan] Free texture base region as well
| -rw-r--r-- | src/xenia/gpu/vulkan/texture_cache.cc | 13 | ||||
| -rw-r--r-- | 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<std::unique_ptr<TextureRegion>> 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; |
