diff options
Diffstat (limited to 'src/intel')
-rw-r--r-- | src/intel/vulkan/anv_allocator.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c index 66c68affc97..fb283cc25d3 100644 --- a/src/intel/vulkan/anv_allocator.c +++ b/src/intel/vulkan/anv_allocator.c @@ -671,18 +671,31 @@ anv_fixed_size_state_pool_alloc_new(struct anv_fixed_size_state_pool *pool, } } -static struct anv_state -anv_state_pool_alloc_no_vg(struct anv_state_pool *pool, - uint32_t size, uint32_t align) +static uint32_t +anv_state_pool_get_bucket(uint32_t size) { - unsigned size_log2 = ilog2_round_up(size < align ? align : size); + unsigned size_log2 = ilog2_round_up(size); assert(size_log2 <= ANV_MAX_STATE_SIZE_LOG2); if (size_log2 < ANV_MIN_STATE_SIZE_LOG2) size_log2 = ANV_MIN_STATE_SIZE_LOG2; - unsigned bucket = size_log2 - ANV_MIN_STATE_SIZE_LOG2; + return size_log2 - ANV_MIN_STATE_SIZE_LOG2; +} + +static uint32_t +anv_state_pool_get_bucket_size(uint32_t bucket) +{ + uint32_t size_log2 = bucket + ANV_MIN_STATE_SIZE_LOG2; + return 1 << size_log2; +} + +static struct anv_state +anv_state_pool_alloc_no_vg(struct anv_state_pool *pool, + uint32_t size, uint32_t align) +{ + uint32_t bucket = anv_state_pool_get_bucket(MAX2(size, align)); struct anv_state state; - state.alloc_size = 1 << size_log2; + state.alloc_size = anv_state_pool_get_bucket_size(bucket); /* Try free list first. */ if (anv_free_list_pop(&pool->buckets[bucket].free_list, @@ -737,10 +750,7 @@ static void anv_state_pool_free_no_vg(struct anv_state_pool *pool, struct anv_state state) { assert(util_is_power_of_two(state.alloc_size)); - unsigned size_log2 = ilog2_round_up(state.alloc_size); - assert(size_log2 >= ANV_MIN_STATE_SIZE_LOG2 && - size_log2 <= ANV_MAX_STATE_SIZE_LOG2); - unsigned bucket = size_log2 - ANV_MIN_STATE_SIZE_LOG2; + unsigned bucket = anv_state_pool_get_bucket(state.alloc_size); if (state.offset < 0) { assert(state.alloc_size == pool->block_size); |