From 55f49e6b7ea945df9ffe85d184b86bcdbfb98e8d Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 24 Apr 2017 02:17:43 -0700 Subject: [PATCH] anv/allocator: Add support for "back" allocations to state_pool Reviewed-by: Juan A. Suarez Romero --- 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 cd300122395..b7cf1136bbd 100644 --- a/src/intel/vulkan/anv_allocator.c +++ b/src/intel/vulkan/anv_allocator.c @@ -644,6 +644,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; @@ -727,6 +728,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) { @@ -736,8 +757,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 81a026451a1..30517576d79 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, -- 2.30.2