From: Jason Ekstrand Date: Wed, 23 Sep 2015 21:20:04 +0000 (-0700) Subject: anv/allocator: Do a better job of centering bi-directional block pools X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=429665823d6f9ed401d9a74cd77877619d0ff782;p=mesa.git anv/allocator: Do a better job of centering bi-directional block pools --- diff --git a/src/vulkan/anv_allocator.c b/src/vulkan/anv_allocator.c index 57b42eb4202..cbd2b6d0f51 100644 --- a/src/vulkan/anv_allocator.c +++ b/src/vulkan/anv_allocator.c @@ -388,6 +388,9 @@ anv_block_pool_grow(struct anv_block_pool *pool, struct anv_block_state *state) */ center_bo_offset = 0; } else { + /* Try to "center" the allocation based on how much is currently in + * use on each side of the center line. + */ center_bo_offset = ((uint64_t)size * back_used) / total_used; /* Align down to a multiple of both the block size and page size */ @@ -396,6 +399,14 @@ anv_block_pool_grow(struct anv_block_pool *pool, struct anv_block_state *state) center_bo_offset &= ~(granularity - 1); assert(center_bo_offset >= back_used); + + /* Make sure we don't shrink the back end of the pool */ + if (center_bo_offset < pool->back_state.end) + center_bo_offset = pool->back_state.end; + + /* Make sure that we don't shrink the front end of the pool */ + if (size - center_bo_offset < pool->state.end) + center_bo_offset = size - pool->state.end; } assert(center_bo_offset % pool->block_size == 0); @@ -403,7 +414,7 @@ anv_block_pool_grow(struct anv_block_pool *pool, struct anv_block_state *state) /* Assert that we only ever grow the pool */ assert(center_bo_offset >= pool->back_state.end); - assert(size - center_bo_offset >= pool->back_state.end); + assert(size - center_bo_offset >= pool->state.end); cleanup = anv_vector_add(&pool->mmap_cleanups); if (!cleanup)