On Thu, Jan 18, 2018 at 3:04 AM, Dave Airlie <airl...@gmail.com> wrote:
> From: Dave Airlie <airl...@redhat.com>
>
> This just moves some calcs from the emission to the binding.
>
> Probably won't affect much, just reduced some time spent in binding
>
> v2: Precalculate size as well, to avoid accessing ->buffer
> at all in the hw writes. (Bas)
> ---
>  src/amd/vulkan/radv_cmd_buffer.c | 19 ++++++++++---------
>  src/amd/vulkan/radv_private.h    |  2 ++
>  2 files changed, 12 insertions(+), 9 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_cmd_buffer.c 
> b/src/amd/vulkan/radv_cmd_buffer.c
> index 172f95e7c99..ab81ed457f7 100644
> --- a/src/amd/vulkan/radv_cmd_buffer.c
> +++ b/src/amd/vulkan/radv_cmd_buffer.c
> @@ -1871,19 +1871,17 @@ radv_cmd_buffer_update_vertex_descriptors(struct 
> radv_cmd_buffer *cmd_buffer, bo
>                         uint32_t *desc = &((uint32_t *)vb_ptr)[i * 4];
>                         uint32_t offset;
>                         int vb = velems->binding[i];
> -                       struct radv_buffer *buffer = 
> cmd_buffer->vertex_bindings[vb].buffer;
>                         uint32_t stride = 
> cmd_buffer->state.pipeline->binding_stride[vb];
> -
> -                       va = radv_buffer_get_va(buffer->bo);
> -
> +                       VkDeviceSize size = 
> cmd_buffer->vertex_bindings[vb].size;
> +                       va = cmd_buffer->vertex_bindings[vb].va;
>                         offset = cmd_buffer->vertex_bindings[vb].offset + 
> velems->offset[i];
> -                       va += offset + buffer->offset;
> +                       va += velems->offset[i];
>                         desc[0] = va;
>                         desc[1] = S_008F04_BASE_ADDRESS_HI(va >> 32) | 
> S_008F04_STRIDE(stride);
>                         if 
> (cmd_buffer->device->physical_device->rad_info.chip_class <= CIK && stride)
> -                               desc[2] = (buffer->size - offset - 
> velems->format_size[i]) / stride + 1;
> +                               desc[2] = (size - offset - 
> velems->format_size[i]) / stride + 1;
>                         else
> -                               desc[2] = buffer->size - offset;
> +                               desc[2] = size - offset;
>                         desc[3] = velems->rsrc_word3[i];
>                 }
>
> @@ -2372,15 +2370,18 @@ void radv_CmdBindVertexBuffers(
>         assert(firstBinding + bindingCount <= MAX_VBS);
>         for (uint32_t i = 0; i < bindingCount; i++) {
>                 uint32_t idx = firstBinding + i;
> +               struct radv_buffer *buffer = 
> radv_buffer_from_handle(pBuffers[i]);
>
>                 if (!changed &&
> -                   (vb[idx].buffer != radv_buffer_from_handle(pBuffers[i]) ||
> +                   (vb[idx].buffer != buffer ||

We can remove buffer entirely, and just compare va and size here?

>                      vb[idx].offset != pOffsets[i])) {
>                         changed = true;
>                 }
>
> -               vb[idx].buffer = radv_buffer_from_handle(pBuffers[i]);
> +               vb[idx].buffer = buffer;
>                 vb[idx].offset = pOffsets[i];
> +               vb[idx].va = radv_buffer_get_va(buffer->bo) + buffer->offset 
> + pOffsets[i];
> +               vb[idx].size = buffer->size;
>
>                 radv_cs_add_buffer(cmd_buffer->device->ws, cmd_buffer->cs,
>                                    vb[idx].buffer->bo, 8);
> diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
> index d51a669b383..e3f69fa7766 100644
> --- a/src/amd/vulkan/radv_private.h
> +++ b/src/amd/vulkan/radv_private.h
> @@ -797,6 +797,8 @@ enum radv_cmd_flush_bits {
>  struct radv_vertex_binding {
>         struct radv_buffer *                          buffer;
>         VkDeviceSize                                 offset;
> +       VkDeviceSize                                 size;
> +       uint64_t va;
>  };
>
>  struct radv_viewport_state {
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to