--- src/intel/vulkan/anv_allocator.c | 32 ++++++++++++++++++-------------- src/intel/vulkan/anv_private.h | 2 +- 2 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c index 5f0458afd77..2171a97970b 100644 --- a/src/intel/vulkan/anv_allocator.c +++ b/src/intel/vulkan/anv_allocator.c @@ -877,7 +877,7 @@ anv_state_pool_init(struct anv_state_pool *pool, assert(util_is_power_of_two_or_zero(block_size)); pool->block_size = block_size; - pool->back_alloc_free_list = ANV_FREE_LIST_EMPTY; + pool->back_alloc_free_list = ANV_FREE_LIST2_EMPTY; for (unsigned i = 0; i < ANV_STATE_BUCKETS; i++) { pool->buckets[i].free_list = ANV_FREE_LIST2_EMPTY; pool->buckets[i].block.next = 0; @@ -1077,22 +1077,27 @@ anv_state_pool_alloc(struct anv_state_pool *pool, uint32_t size, uint32_t align) struct anv_state anv_state_pool_alloc_back(struct anv_state_pool *pool) { - struct anv_state state; - state.alloc_size = pool->block_size; + struct anv_state *state; + uint32_t 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); + state = anv_state_table_pop(&pool->back_alloc_free_list, &pool->table); + if (state) { + assert(state->offset < 0); goto done; } - state.offset = anv_block_pool_alloc_back(&pool->block_pool, - pool->block_size); + int32_t offset; + offset = anv_block_pool_alloc_back(&pool->block_pool, + pool->block_size); + uint32_t idx = anv_state_table_add(&pool->table, 1); + state = anv_state_table_get(&pool->table, idx); + state->offset = offset; + state->alloc_size = alloc_size; + state->map = pool->block_pool.map + state->offset; done: - state.map = pool->block_pool.map + state.offset; - VG(VALGRIND_MEMPOOL_ALLOC(pool, state.map, state.alloc_size)); - return state; + VG(VALGRIND_MEMPOOL_ALLOC(pool, state->map, state->alloc_size)); + return *state; } static void @@ -1103,9 +1108,8 @@ anv_state_pool_free_no_vg(struct anv_state_pool *pool, struct anv_state state) 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, - state.alloc_size, 1); + anv_state_table_push(&pool->back_alloc_free_list, + &pool->table, state.idx, 1); } else { anv_state_table_push(&pool->buckets[bucket].free_list, &pool->table, state.idx, 1); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index f7b3ec5f6a4..d068a4be5d8 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -737,7 +737,7 @@ struct anv_state_pool { uint32_t block_size; /** Free list for "back" allocations */ - union anv_free_list back_alloc_free_list; + union anv_free_list2 back_alloc_free_list; struct anv_fixed_size_state_pool buckets[ANV_STATE_BUCKETS]; }; -- 2.17.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev