Commit 24155b13 by Shahbaz Youssefi Committed by Angle LUCI CQ

Vulkan: Free DynamicBuffer buffers after dip in allocation size

In a pattern like this: - allocate 100 bytes - allocate 200 bytes - allocate 50 bytes - allocate 100000000 bytes - allocate 100 bytes - allocate 200 bytes - allocate 50 bytes The DynamicBuffer class switches to making 100MB allocations even if that allocation was a one-off. A small future allocation would then tie up 100MB in memory for future allocations. Another 100MB is also left tied up in the free list. With this change, if an allocation is made that's less than a quarter of the DynamicBuffer's current allocation size, it's taken as a sign that the previous large allocation was a one-off and the size is moved back to the DynamicBuffer's original initial size. Bug: b/187757166 Change-Id: I0c6f00eec7c81298f9dc41a41cc308510ce76623 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2971004Reviewed-by: 's avatarCharlie Lao <cclao@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
parent 69562546
...@@ -2092,11 +2092,12 @@ angle::Result DynamicBuffer::allocateWithAlignment(ContextVk *contextVk, ...@@ -2092,11 +2092,12 @@ angle::Result DynamicBuffer::allocateWithAlignment(ContextVk *contextVk,
ASSERT(!mBuffer); ASSERT(!mBuffer);
} }
if (sizeToAllocate > mSize) const size_t sizeIgnoringHistory = std::max(mInitialSize, sizeToAllocate);
if (sizeToAllocate > mSize || sizeIgnoringHistory < mSize / 4)
{ {
mSize = std::max(mInitialSize, sizeToAllocate); mSize = sizeIgnoringHistory;
// Clear the free list since the free buffers are now too small. // Clear the free list since the free buffers are now either too small or too big.
ReleaseBufferListToRenderer(contextVk->getRenderer(), &mBufferFreeList); ReleaseBufferListToRenderer(contextVk->getRenderer(), &mBufferFreeList);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment