From 9e4389cbf574b29f82452bf09f3bbb48a6c428ed Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 20 Mar 2016 15:20:21 -0700 Subject: [PATCH] Vulkan: Defrag buffers when growing. --- Common/Vulkan/VulkanMemory.cpp | 14 ++++++++++++++ Common/Vulkan/VulkanMemory.h | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Common/Vulkan/VulkanMemory.cpp b/Common/Vulkan/VulkanMemory.cpp index 1a37cae127..129273821f 100644 --- a/Common/Vulkan/VulkanMemory.cpp +++ b/Common/Vulkan/VulkanMemory.cpp @@ -76,3 +76,17 @@ void VulkanPushBuffer::NextBuffer() { offset_ = 0; Map(device); } + +void VulkanPushBuffer::Defragment() { + if (buffers_.size() <= 1) { + return; + } + + // Okay, we have more than one. Destroy them all and start over with a larger one. + size_t newSize = size_ * buffers_.size(); + Destroy(ctx_); + + size_ = newSize; + bool res = AddBuffer(); + assert(res); +} diff --git a/Common/Vulkan/VulkanMemory.h b/Common/Vulkan/VulkanMemory.h index 72e767b3f6..c7cfc37720 100644 --- a/Common/Vulkan/VulkanMemory.h +++ b/Common/Vulkan/VulkanMemory.h @@ -14,8 +14,6 @@ // has completed. // // TODO: Make it possible to suballocate pushbuffers from a large DeviceMemory block. -// TODO: Make this auto-grow and shrink. Need to be careful about returning and using the new -// buffer handle on overflow. class VulkanPushBuffer { struct BufInfo { VkBuffer buffer; @@ -43,6 +41,7 @@ public: void Begin(VkDevice device) { buf_ = 0; offset_ = 0; + Defragment(); Map(device); } @@ -117,6 +116,7 @@ public: private: bool AddBuffer(); void NextBuffer(); + void Defragment(); VulkanContext *ctx_; std::vector buffers_;