summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrChat <arkolbed@gmail.com>2018-03-03 20:50:51 -0600
committerDrChat <arkolbed@gmail.com>2018-03-03 20:50:51 -0600
commitd0e5856608a884fb2f79910683f7df69431075bc (patch)
tree6b51b37df24a1f435084f8f8d81a168d95aaefe5
parent9774c931810cc41ec1df863463f05fab618df282 (diff)
[Vulkan] Free texture base region as well
-rw-r--r--src/xenia/gpu/vulkan/texture_cache.cc13
-rw-r--r--src/xenia/gpu/vulkan/texture_cache.h6
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;