[Mesa-dev] [PATCH 09/18] anv/allocator: Add support for "back" allocations to state_pool
Juan A. Suarez Romero
jasuarez at igalia.com
Wed May 3 14:49:00 UTC 2017
Reviewed-by: Juan A. Suarez Romero <jasuarez at igalia.com>
On Wed, 2017-04-26 at 07:35 -0700, Jason Ekstrand wrote:
> ---
> src/intel/vulkan/anv_allocator.c | 31 +++++++++++++++++++++++++++++--
> src/intel/vulkan/anv_private.h | 4 ++++
> 2 files changed, 33 insertions(+), 2 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c
> index b576101..835bcfa 100644
> --- a/src/intel/vulkan/anv_allocator.c
> +++ b/src/intel/vulkan/anv_allocator.c
> @@ -639,6 +639,7 @@ anv_state_pool_init(struct anv_state_pool *pool,
> pool->block_pool = block_pool;
> assert(util_is_power_of_two(block_size));
> pool->block_size = block_size;
> + pool->back_alloc_free_list = ANV_FREE_LIST_EMPTY;
> for (unsigned i = 0; i < ANV_STATE_BUCKETS; i++) {
> pool->buckets[i].free_list = ANV_FREE_LIST_EMPTY;
> pool->buckets[i].block.next = 0;
> @@ -722,6 +723,26 @@ anv_state_pool_alloc(struct anv_state_pool *pool, uint32_t size, uint32_t align)
> return state;
> }
>
> +struct anv_state
> +anv_state_pool_alloc_back(struct anv_state_pool *pool)
> +{
> + struct anv_state state;
> + state.alloc_size = pool->block_size;
> +
> + if (anv_free_list_pop(&pool->back_alloc_free_list,
> + &pool->block_pool->map, &state.offset)) {
> + assert(state.offset < 0);
> + goto done;
> + }
> +
> + state.offset = anv_block_pool_alloc_back(pool->block_pool, pool->block_size);
> +
> +done:
> + state.map = pool->block_pool->map + state.offset;
> + VG(VALGRIND_MEMPOOL_ALLOC(pool, state.map, state.alloc_size));
> + return state;
> +}
> +
> static void
> anv_state_pool_free_no_vg(struct anv_state_pool *pool, struct anv_state state)
> {
> @@ -731,8 +752,14 @@ anv_state_pool_free_no_vg(struct anv_state_pool *pool, struct anv_state state)
> size_log2 <= ANV_MAX_STATE_SIZE_LOG2);
> unsigned bucket = size_log2 - ANV_MIN_STATE_SIZE_LOG2;
>
> - anv_free_list_push(&pool->buckets[bucket].free_list,
> - pool->block_pool->map, state.offset);
> + if (state.offset < 0) {
> + assert(state.alloc_size == pool->block_size);
> + anv_free_list_push(&pool->back_alloc_free_list,
> + pool->block_pool->map, state.offset);
> + } else {
> + anv_free_list_push(&pool->buckets[bucket].free_list,
> + pool->block_pool->map, state.offset);
> + }
> }
>
> void
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
> index 10657c1..e96e795 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -506,6 +506,9 @@ struct anv_state_pool {
> /* The size of blocks which will be allocated from the block pool */
> uint32_t block_size;
>
> + /** Free list for "back" allocations */
> + union anv_free_list back_alloc_free_list;
> +
> struct anv_fixed_size_state_pool buckets[ANV_STATE_BUCKETS];
> };
>
> @@ -571,6 +574,7 @@ void anv_state_pool_init(struct anv_state_pool *pool,
> void anv_state_pool_finish(struct anv_state_pool *pool);
> struct anv_state anv_state_pool_alloc(struct anv_state_pool *pool,
> uint32_t state_size, uint32_t alignment);
> +struct anv_state anv_state_pool_alloc_back(struct anv_state_pool *pool);
> void anv_state_pool_free(struct anv_state_pool *pool, struct anv_state state);
> void anv_state_stream_init(struct anv_state_stream *stream,
> struct anv_state_pool *state_pool,
More information about the mesa-dev
mailing list