From 7811c03c3b72e7de7d221d24b2b0616cb1cd8207 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 6 Apr 2018 21:36:27 -0700 Subject: [PATCH] Vulkan: Report old allocations when enabled. --- Common/Vulkan/VulkanMemory.cpp | 34 ++++++++++++++++++++++++++++++++++ Common/Vulkan/VulkanMemory.h | 1 + 2 files changed, 35 insertions(+) diff --git a/Common/Vulkan/VulkanMemory.cpp b/Common/Vulkan/VulkanMemory.cpp index 4df48e5b04..33ed1ac6fa 100644 --- a/Common/Vulkan/VulkanMemory.cpp +++ b/Common/Vulkan/VulkanMemory.cpp @@ -433,10 +433,44 @@ bool VulkanDeviceAllocator::AllocateSlab(VkDeviceSize minBytes) { return true; } +void VulkanDeviceAllocator::ReportOldUsage() { + float now = time_now(); + static const float OLD_AGE = 10.0f; + for (size_t i = 0; i < slabs_.size(); ++i) { + const auto &slab = slabs_[i]; + + bool hasOldAllocs = false; + for (auto it : slab.tags) { + const auto info = it.second; + float touchedAge = now - info.touched; + if (touchedAge >= OLD_AGE) { + hasOldAllocs = true; + break; + } + } + + if (hasOldAllocs) { + NOTICE_LOG(G3D, "Slab %d usage:", i); + for (auto it : slab.tags) { + const auto info = it.second; + + float createAge = now - info.created; + float touchedAge = now - info.touched; + NOTICE_LOG(G3D, " * %s (created %fs ago, used %fs ago)", info.tag.c_str(), createAge, touchedAge); + } + NOTICE_LOG(G3D, ""); + } + } +} + void VulkanDeviceAllocator::Decimate() { assert(!destroyed_); bool foundFree = false; + if (TRACK_TOUCH) { + ReportOldUsage(); + } + for (size_t i = 0; i < slabs_.size(); ++i) { // Go backwards. This way, we keep the largest free slab. // We do this here (instead of the for) since size_t is unsigned. diff --git a/Common/Vulkan/VulkanMemory.h b/Common/Vulkan/VulkanMemory.h index e560a2ff10..05d892cd1b 100644 --- a/Common/Vulkan/VulkanMemory.h +++ b/Common/Vulkan/VulkanMemory.h @@ -205,6 +205,7 @@ private: void Decimate(); void DoTouch(VkDeviceMemory deviceMemory, size_t offset); void ExecuteFree(FreeInfo *userdata); + void ReportOldUsage(); VulkanContext *const vulkan_; std::vector slabs_;