[Mesa-dev] [PATCH 10/18] anv: Allocate binding table blocks through the state pool

Juan A. Suarez Romero jasuarez at igalia.com
Wed May 3 15:06:58 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_batch_chain.c | 47 +++++++++++++++++---------------------
>  src/intel/vulkan/anv_private.h     |  2 +-
>  2 files changed, 22 insertions(+), 27 deletions(-)
> 
> diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c
> index 28193c5..3714d05 100644
> --- a/src/intel/vulkan/anv_batch_chain.c
> +++ b/src/intel/vulkan/anv_batch_chain.c
> @@ -453,9 +453,10 @@ anv_cmd_buffer_current_batch_bo(struct anv_cmd_buffer *cmd_buffer)
>  struct anv_address
>  anv_cmd_buffer_surface_base_address(struct anv_cmd_buffer *cmd_buffer)
>  {
> +   struct anv_state *bt_block = u_vector_head(&cmd_buffer->bt_block_states);
>     return (struct anv_address) {
>        .bo = &cmd_buffer->device->surface_state_block_pool.bo,
> -      .offset = *(int32_t *)u_vector_head(&cmd_buffer->bt_blocks),
> +      .offset = bt_block->offset,
>     };
>  }
>  
> @@ -621,10 +622,8 @@ struct anv_state
>  anv_cmd_buffer_alloc_binding_table(struct anv_cmd_buffer *cmd_buffer,
>                                     uint32_t entries, uint32_t *state_offset)
>  {
> -   struct anv_block_pool *block_pool =
> -       &cmd_buffer->device->surface_state_block_pool;
>     struct anv_state_pool *state_pool = &cmd_buffer->device->surface_state_pool;
> -   int32_t *bt_block = u_vector_head(&cmd_buffer->bt_blocks);
> +   struct anv_state *bt_block = u_vector_head(&cmd_buffer->bt_block_states);
>     struct anv_state state;
>  
>     state.alloc_size = align_u32(entries * 4, 32);
> @@ -633,12 +632,12 @@ anv_cmd_buffer_alloc_binding_table(struct anv_cmd_buffer *cmd_buffer,
>        return (struct anv_state) { 0 };
>  
>     state.offset = cmd_buffer->bt_next;
> -   state.map = block_pool->map + *bt_block + state.offset;
> +   state.map = state_pool->block_pool->map + bt_block->offset + state.offset;
>  
>     cmd_buffer->bt_next += state.alloc_size;
>  
> -   assert(*bt_block < 0);
> -   *state_offset = -(*bt_block);
> +   assert(bt_block->offset < 0);
> +   *state_offset = -bt_block->offset;
>  
>     return state;
>  }
> @@ -662,17 +661,15 @@ anv_cmd_buffer_alloc_dynamic_state(struct anv_cmd_buffer *cmd_buffer,
>  VkResult
>  anv_cmd_buffer_new_binding_table_block(struct anv_cmd_buffer *cmd_buffer)
>  {
> -   struct anv_block_pool *block_pool =
> -       &cmd_buffer->device->surface_state_block_pool;
>     struct anv_state_pool *state_pool = &cmd_buffer->device->surface_state_pool;
>  
> -   int32_t *offset = u_vector_add(&cmd_buffer->bt_blocks);
> -   if (offset == NULL) {
> +   struct anv_state *bt_block = u_vector_add(&cmd_buffer->bt_block_states);
> +   if (bt_block == NULL) {
>        anv_batch_set_error(&cmd_buffer->batch, VK_ERROR_OUT_OF_HOST_MEMORY);
>        return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
>     }
>  
> -   *offset = anv_block_pool_alloc_back(block_pool, state_pool->block_size);
> +   *bt_block = anv_state_pool_alloc_back(state_pool);
>     cmd_buffer->bt_next = 0;
>  
>     return VK_SUCCESS;
> @@ -712,8 +709,9 @@ anv_cmd_buffer_init_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer)
>  
>     *(struct anv_batch_bo **)u_vector_add(&cmd_buffer->seen_bbos) = batch_bo;
>  
> -   success = u_vector_init(&cmd_buffer->bt_blocks, sizeof(int32_t),
> -                             8 * sizeof(int32_t));
> +   success = u_vector_init(&cmd_buffer->bt_block_states,
> +                           sizeof(struct anv_state),
> +                           8 * sizeof(struct anv_state));
>     if (!success)
>        goto fail_seen_bbos;
>  
> @@ -730,7 +728,7 @@ anv_cmd_buffer_init_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer)
>     return VK_SUCCESS;
>  
>   fail_bt_blocks:
> -   u_vector_finish(&cmd_buffer->bt_blocks);
> +   u_vector_finish(&cmd_buffer->bt_block_states);
>   fail_seen_bbos:
>     u_vector_finish(&cmd_buffer->seen_bbos);
>   fail_batch_bo:
> @@ -742,12 +740,10 @@ anv_cmd_buffer_init_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer)
>  void
>  anv_cmd_buffer_fini_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer)
>  {
> -   int32_t *bt_block;
> -   u_vector_foreach(bt_block, &cmd_buffer->bt_blocks) {
> -      anv_block_pool_free(&cmd_buffer->device->surface_state_block_pool,
> -                          *bt_block);
> -   }
> -   u_vector_finish(&cmd_buffer->bt_blocks);
> +   struct anv_state *bt_block;
> +   u_vector_foreach(bt_block, &cmd_buffer->bt_block_states)
> +      anv_state_pool_free(&cmd_buffer->device->surface_state_pool, *bt_block);
> +   u_vector_finish(&cmd_buffer->bt_block_states);
>  
>     anv_reloc_list_finish(&cmd_buffer->surface_relocs, &cmd_buffer->pool->alloc);
>  
> @@ -776,12 +772,11 @@ anv_cmd_buffer_reset_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer)
>                        &cmd_buffer->batch,
>                        GEN8_MI_BATCH_BUFFER_START_length * 4);
>  
> -   while (u_vector_length(&cmd_buffer->bt_blocks) > 1) {
> -      int32_t *bt_block = u_vector_remove(&cmd_buffer->bt_blocks);
> -      anv_block_pool_free(&cmd_buffer->device->surface_state_block_pool,
> -                          *bt_block);
> +   while (u_vector_length(&cmd_buffer->bt_block_states) > 1) {
> +      struct anv_state *bt_block = u_vector_remove(&cmd_buffer->bt_block_states);
> +      anv_state_pool_free(&cmd_buffer->device->surface_state_pool, *bt_block);
>     }
> -   assert(u_vector_length(&cmd_buffer->bt_blocks) == 1);
> +   assert(u_vector_length(&cmd_buffer->bt_block_states) == 1);
>     cmd_buffer->bt_next = 0;
>  
>     cmd_buffer->surface_relocs.num_relocs = 0;
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
> index e96e795..76dc08a 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -1578,7 +1578,7 @@ struct anv_cmd_buffer {
>      *
>      * initialized by anv_cmd_buffer_init_batch_bo_chain()
>      */
> -   struct u_vector                            bt_blocks;
> +   struct u_vector                              bt_block_states;
>     uint32_t                                     bt_next;
>  
>     struct anv_reloc_list                        surface_relocs;


More information about the mesa-dev mailing list