anv/allocator: Add helpers for dealing with bucket sizes
Reviewed-by: Juan A. Suarez Romero <jasuarez@igalia.com>
This commit is contained in:
@@ -671,18 +671,31 @@ anv_fixed_size_state_pool_alloc_new(struct anv_fixed_size_state_pool *pool,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t
|
||||||
|
anv_state_pool_get_bucket(uint32_t 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;
|
||||||
|
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
|
static struct anv_state
|
||||||
anv_state_pool_alloc_no_vg(struct anv_state_pool *pool,
|
anv_state_pool_alloc_no_vg(struct anv_state_pool *pool,
|
||||||
uint32_t size, uint32_t align)
|
uint32_t size, uint32_t align)
|
||||||
{
|
{
|
||||||
unsigned size_log2 = ilog2_round_up(size < align ? align : size);
|
uint32_t bucket = anv_state_pool_get_bucket(MAX2(size, align));
|
||||||
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;
|
|
||||||
|
|
||||||
struct anv_state state;
|
struct anv_state state;
|
||||||
state.alloc_size = 1 << size_log2;
|
state.alloc_size = anv_state_pool_get_bucket_size(bucket);
|
||||||
|
|
||||||
/* Try free list first. */
|
/* Try free list first. */
|
||||||
if (anv_free_list_pop(&pool->buckets[bucket].free_list,
|
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)
|
anv_state_pool_free_no_vg(struct anv_state_pool *pool, struct anv_state state)
|
||||||
{
|
{
|
||||||
assert(util_is_power_of_two(state.alloc_size));
|
assert(util_is_power_of_two(state.alloc_size));
|
||||||
unsigned size_log2 = ilog2_round_up(state.alloc_size);
|
unsigned bucket = anv_state_pool_get_bucket(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;
|
|
||||||
|
|
||||||
if (state.offset < 0) {
|
if (state.offset < 0) {
|
||||||
assert(state.alloc_size == pool->block_size);
|
assert(state.alloc_size == pool->block_size);
|
||||||
|
Reference in New Issue
Block a user