Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com>

On 2018-05-07 17:30:48, Scott D Phillips wrote:
> Soft pinning lets us satisfy the binding table address
> requirements without using both sides of a growing state_pool.
> 
> If you do use both sides of a state pool, then you need to read
> the state pool's center_bo_offset (with the device mutex held) to
> know the final offset of relocations that target the state pool
> bo.
> 
> By having a separate pool for binding tables that only grows in
> the forward direction, the center_bo_offset is always 0 and
> relocations don't need an update pass to adjust relocations with
> the mutex held.
> 
> v2: - don't introduce a separate state flag for separate binding tables 
> (Jason)
>     - replace bo and map accessors with a single binding_table_pool accessor 
> (Jason)
> ---
>  src/intel/vulkan/anv_batch_chain.c | 25 +++++++++++++++----------
>  src/intel/vulkan/anv_device.c      | 14 +++++++++++++-
>  src/intel/vulkan/anv_private.h     | 24 ++++++++++++++++++++++++
>  3 files changed, 52 insertions(+), 11 deletions(-)
> 
> diff --git a/src/intel/vulkan/anv_batch_chain.c 
> b/src/intel/vulkan/anv_batch_chain.c
> index 09514c7b84a..53b24551088 100644
> --- a/src/intel/vulkan/anv_batch_chain.c
> +++ b/src/intel/vulkan/anv_batch_chain.c
> @@ -452,7 +452,7 @@ 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_pool.block_pool.bo,
> +      .bo = &anv_binding_table_pool(cmd_buffer->device)->block_pool.bo,
>        .offset = bt_block->offset,
>     };
>  }
> @@ -619,7 +619,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_state_pool *state_pool = 
> &cmd_buffer->device->surface_state_pool;
> +   struct anv_device *device = cmd_buffer->device;
> +   struct anv_state_pool *state_pool = &device->surface_state_pool;
>     struct anv_state *bt_block = u_vector_head(&cmd_buffer->bt_block_states);
>     struct anv_state state;
>  
> @@ -629,12 +630,18 @@ 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 = state_pool->block_pool.map + bt_block->offset + state.offset;
> +   state.map = anv_binding_table_pool(device)->block_pool.map +
> +      bt_block->offset + state.offset;
>  
>     cmd_buffer->bt_next += state.alloc_size;
>  
> -   assert(bt_block->offset < 0);
> -   *state_offset = -bt_block->offset;
> +   if (device->instance->physicalDevice.use_softpin) {
> +      *state_offset = device->surface_state_pool.block_pool.start_address -
> +         device->binding_table_pool.block_pool.start_address - 
> bt_block->offset;
> +   } else {
> +      assert(bt_block->offset < 0);
> +      *state_offset = -bt_block->offset;
> +   }
>  
>     return state;
>  }
> @@ -658,15 +665,13 @@ 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_state_pool *state_pool = 
> &cmd_buffer->device->surface_state_pool;
> -
>     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);
>     }
>  
> -   *bt_block = anv_state_pool_alloc_back(state_pool);
> +   *bt_block = anv_binding_table_pool_alloc(cmd_buffer->device);
>     cmd_buffer->bt_next = 0;
>  
>     return VK_SUCCESS;
> @@ -740,7 +745,7 @@ anv_cmd_buffer_fini_batch_bo_chain(struct anv_cmd_buffer 
> *cmd_buffer)
>  {
>     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);
> +      anv_binding_table_pool_free(cmd_buffer->device, *bt_block);
>     u_vector_finish(&cmd_buffer->bt_block_states);
>  
>     anv_reloc_list_finish(&cmd_buffer->surface_relocs, 
> &cmd_buffer->pool->alloc);
> @@ -772,7 +777,7 @@ anv_cmd_buffer_reset_batch_bo_chain(struct anv_cmd_buffer 
> *cmd_buffer)
>  
>     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);
> +      anv_binding_table_pool_free(cmd_buffer->device, *bt_block);
>     }
>     assert(u_vector_length(&cmd_buffer->bt_block_states) == 1);
>     cmd_buffer->bt_next = 0;
> diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
> index 0eafdf79696..afb5b2a4f5d 100644
> --- a/src/intel/vulkan/anv_device.c
> +++ b/src/intel/vulkan/anv_device.c
> @@ -1641,9 +1641,18 @@ VkResult anv_CreateDevice(
>     if (result != VK_SUCCESS)
>        goto fail_instruction_state_pool;
>  
> +   if (physical_device->use_softpin) {
> +      result = anv_state_pool_init(&device->binding_table_pool, device,
> +                                   BINDING_TABLE_POOL_MIN_ADDRESS,
> +                                   4096,
> +                                   bo_flags);
> +      if (result != VK_SUCCESS)
> +         goto fail_surface_state_pool;
> +   }
> +
>     result = anv_bo_init_new(&device->workaround_bo, device, 1024);
>     if (result != VK_SUCCESS)
> -      goto fail_surface_state_pool;
> +      goto fail_binding_table_pool;
>  
>     anv_device_init_trivial_batch(device);
>  
> @@ -1694,6 +1703,9 @@ VkResult anv_CreateDevice(
>     anv_scratch_pool_finish(device, &device->scratch_pool);
>     anv_gem_munmap(device->workaround_bo.map, device->workaround_bo.size);
>     anv_gem_close(device, device->workaround_bo.gem_handle);
> + fail_binding_table_pool:
> +   if (physical_device->use_softpin)
> +      anv_state_pool_finish(&device->binding_table_pool);
>   fail_surface_state_pool:
>     anv_state_pool_finish(&device->surface_state_pool);
>   fail_instruction_state_pool:
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
> index e1c05c33a08..36e4589abc6 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -969,6 +969,7 @@ struct anv_device {
>  
>      struct anv_state_pool                       dynamic_state_pool;
>      struct anv_state_pool                       instruction_state_pool;
> +    struct anv_state_pool                       binding_table_pool;
>      struct anv_state_pool                       surface_state_pool;
>  
>      struct anv_bo                               workaround_bo;
> @@ -991,6 +992,29 @@ struct anv_device {
>      bool                                        lost;
>  };
>  
> +static inline struct anv_state_pool *
> +anv_binding_table_pool(struct anv_device *device)
> +{
> +   if (device->instance->physicalDevice.use_softpin)
> +      return &device->binding_table_pool;
> +   else
> +      return &device->surface_state_pool;
> +}
> +
> +static inline struct anv_state
> +anv_binding_table_pool_alloc(struct anv_device *device) {
> +   if (device->instance->physicalDevice.use_softpin)
> +      return anv_state_pool_alloc(&device->binding_table_pool,
> +                                  device->binding_table_pool.block_size, 0);
> +   else
> +      return anv_state_pool_alloc_back(&device->surface_state_pool);
> +}
> +
> +static inline void
> +anv_binding_table_pool_free(struct anv_device *device, struct anv_state 
> state) {
> +   anv_state_pool_free(anv_binding_table_pool(device), state);
> +}
> +
>  static void inline
>  anv_state_flush(struct anv_device *device, struct anv_state state)
>  {
> -- 
> 2.14.3
> 
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to