[Mesa-dev] [PATCH 2/2] radv/winsys: skip padded empty buffers in chain. (v2)

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Thu Jan 18 12:15:57 UTC 2018


On Thu, Jan 18, 2018 at 3:04 AM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> When chaining buffers if we see an empty one (just padded)
> skip over it.
>
> v2: set empty_padded on init/reset, and unset on grow,
> then check once (Bas).
> ---
>  src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 24 +++++++++++++++++++-----
>  1 file changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
> index 5632b1d4ee2..9768f36f113 100644
> --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
> +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
> @@ -57,6 +57,7 @@ struct radv_amdgpu_cs {
>         unsigned                    *ib_size_ptr;
>         bool                        failed;
>         bool                        is_chained;
> +       bool                        empty_padded;
>
>         int                         buffer_hash_table[1024];
>         unsigned                    hw_ip;
> @@ -182,6 +183,7 @@ static void radv_amdgpu_init_cs(struct radv_amdgpu_cs *cs,
>                 cs->buffer_hash_table[i] = -1;
>
>         cs->hw_ip = ring_to_hw_ip(ring_type);
> +       cs->empty_padded = true;
>  }
>
>  static struct radeon_winsys_cs *
> @@ -316,7 +318,7 @@ static void radv_amdgpu_cs_grow(struct radeon_winsys_cs *_cs, size_t min_size)
>         cs->base.buf = (uint32_t *)cs->ib_mapped;
>         cs->base.cdw = 0;
>         cs->base.max_dw = ib_size / 4 - 4;
> -
> +       cs->empty_padded = false;
>  }
>
>  static bool radv_amdgpu_cs_finalize(struct radeon_winsys_cs *_cs)
> @@ -324,6 +326,9 @@ static bool radv_amdgpu_cs_finalize(struct radeon_winsys_cs *_cs)
>         struct radv_amdgpu_cs *cs = radv_amdgpu_cs(_cs);
>
>         if (cs->ws->use_ib_bos) {
> +
> +               if (cs->empty_padded && cs->base.cdw == 0)
> +                       cs->empty_padded = true;

This is pretty much a noop, you'll want

if (cs->base.cdw != 0)
    cs->empty_padded = false;

(optionally with cs->empty_padded &&, but that doesn't really change stuff)

With that,

Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

>                 while (!cs->base.cdw || (cs->base.cdw & 7) != 0)
>                         cs->base.buf[cs->base.cdw++] = 0xffff1000;
>
> @@ -340,6 +345,7 @@ static void radv_amdgpu_cs_reset(struct radeon_winsys_cs *_cs)
>         struct radv_amdgpu_cs *cs = radv_amdgpu_cs(_cs);
>         cs->base.cdw = 0;
>         cs->failed = false;
> +       cs->empty_padded = true;
>
>         for (unsigned i = 0; i < cs->num_buffers; ++i) {
>                 unsigned hash = ((uintptr_t)cs->handles[i] >> 6) &
> @@ -687,17 +693,25 @@ static int radv_amdgpu_winsys_cs_submit_chained(struct radeon_winsys_ctx *_ctx,
>         amdgpu_bo_list_handle bo_list;
>         struct amdgpu_cs_request request = {0};
>         struct amdgpu_cs_ib_info ibs[2];
> -
> +       int skip_count = 0;
>         for (unsigned i = cs_count; i--;) {
>                 struct radv_amdgpu_cs *cs = radv_amdgpu_cs(cs_array[i]);
> -
> +               int next_idx = 1;
>                 if (cs->is_chained) {
>                         *cs->ib_size_ptr -= 4;
>                         cs->is_chained = false;
>                 }
>
> -               if (i + 1 < cs_count) {
> -                       struct radv_amdgpu_cs *next = radv_amdgpu_cs(cs_array[i + 1]);
> +               if (cs->empty_padded)
> +                       skip_count++;
> +               else {
> +                       next_idx += skip_count;
> +                       skip_count = 0;
> +               }
> +
> +               if (i + next_idx < cs_count) {
> +                       struct radv_amdgpu_cs *next = radv_amdgpu_cs(cs_array[i + next_idx]);
> +
>                         assert(cs->base.cdw + 4 <= cs->base.max_dw);
>
>                         cs->is_chained = true;
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list