[Mesa-dev] [PATCH 15/18] anv/allocator: Add helpers for dealing with bucket sizes

Juan A. Suarez Romero jasuarez at igalia.com
Thu Apr 27 16:31:43 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 | 30 ++++++++++++++++++++----------
>  1 file changed, 20 insertions(+), 10 deletions(-)
> 
> diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c
> index e58734b..0e33d1e 100644
> --- a/src/intel/vulkan/anv_allocator.c
> +++ b/src/intel/vulkan/anv_allocator.c
> @@ -658,18 +658,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,
> @@ -724,10 +737,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);


More information about the mesa-dev mailing list