From: Dave Airlie <airl...@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; 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@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev