Vulkan: Defrag buffers when growing.

This commit is contained in:
Unknown W. Brackets 2016-03-20 15:20:21 -07:00
parent f2513ffcd6
commit 9e4389cbf5
2 changed files with 16 additions and 2 deletions

View File

@ -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);
}

View File

@ -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<BufInfo> buffers_;