From 437456b47c222270da850362d027822ac3da17dc Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Wed, 21 Jun 2023 13:43:44 +0200 Subject: [PATCH] radv/amdgpu: use the array of IB buffers for the chained IB path For executing IB on the compute queue (ie. IB2 isn't supported), we will need to break chaining, this is a first step towards this. Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 53 +++++++------------ 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c index ac59fce2f14..92daf438d43 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c @@ -313,6 +313,8 @@ get_nop_packet(struct radv_amdgpu_cs *cs) static void radv_amdgpu_cs_add_old_ib_buffer(struct radv_amdgpu_cs *cs) { + unsigned cdw; + if (cs->num_old_ib_buffers == cs->max_num_old_ib_buffers) { unsigned max_num_old_ib_buffers = MAX2(1, cs->max_num_old_ib_buffers * 2); struct radv_amdgpu_ib *old_ib_buffers = @@ -325,8 +327,14 @@ radv_amdgpu_cs_add_old_ib_buffer(struct radv_amdgpu_cs *cs) cs->old_ib_buffers = old_ib_buffers; } + if (cs->use_ib) { + cdw = *cs->ib_size_ptr; + } else { + cdw = cs->base.cdw; + } + cs->old_ib_buffers[cs->num_old_ib_buffers].bo = cs->ib_buffer; - cs->old_ib_buffers[cs->num_old_ib_buffers++].cdw = cs->base.cdw; + cs->old_ib_buffers[cs->num_old_ib_buffers++].cdw = cdw; } static void @@ -436,14 +444,14 @@ radv_amdgpu_cs_finalize(struct radeon_cmdbuf *_cs) while (!cs->base.cdw || (cs->base.cdw & ib_pad_dw_mask)) radeon_emit_unchecked(&cs->base, nop_packet); } - - /* Append the current (last) IB to the array of old IB buffers. */ - radv_amdgpu_cs_add_old_ib_buffer(cs); - - /* Prevent freeing this BO twice. */ - cs->ib_buffer = NULL; } + /* Append the current (last) IB to the array of old IB buffers. */ + radv_amdgpu_cs_add_old_ib_buffer(cs); + + /* Prevent freeing this BO twice. */ + cs->ib_buffer = NULL; + cs->chained_to = NULL; assert(cs->base.cdw <= cs->base.max_dw + 4); @@ -711,19 +719,6 @@ radv_amdgpu_cs_execute_secondary(struct radeon_cmdbuf *_parent, struct radeon_cm memcpy(parent->base.buf + parent->base.cdw, mapped, 4 * ib->cdw); parent->base.cdw += ib->cdw; } - - /* When the parent and child can both use IBs, the current (last) - * IB is not part of old_ib_buffers, take care of that here. - */ - if (child->ib_buffer) { - if (parent->base.cdw + child->base.cdw > parent->base.max_dw) - radv_amdgpu_cs_grow(&parent->base, child->base.cdw); - - parent->base.reserved_dw = MAX2(parent->base.reserved_dw, parent->base.cdw + child->base.cdw); - - memcpy(parent->base.buf + parent->base.cdw, child->base.buf, 4 * child->base.cdw); - parent->base.cdw += child->base.cdw; - } } } @@ -977,12 +972,8 @@ radv_amdgpu_winsys_cs_submit_internal(struct radv_amdgpu_ctx *ctx, int queue_idx struct radv_amdgpu_cs *cs = radv_amdgpu_cs(preambles[i]); struct radv_amdgpu_cs_ib_info ib; - assert(cs->num_old_ib_buffers <= 1); - if (cs->use_ib) { - ib = cs->ib; - } else { - ib = radv_amdgpu_cs_ib_to_info(cs, cs->old_ib_buffers[0]); - } + assert(cs->num_old_ib_buffers == 1); + ib = radv_amdgpu_cs_ib_to_info(cs, cs->old_ib_buffers[0]); ibs[num_submitted_ibs++] = ib; ibs_per_ip[cs->hw_ip]++; @@ -1018,7 +1009,7 @@ radv_amdgpu_winsys_cs_submit_internal(struct radv_amdgpu_ctx *ctx, int queue_idx * Otherwise we must submit all IBs in the old_ib_buffers array. */ if (cs->use_ib) { - ib = cs->ib; + ib = radv_amdgpu_cs_ib_to_info(cs, cs->old_ib_buffers[0]); cs_idx++; } else { assert(cs_ib_idx < cs->num_old_ib_buffers); @@ -1046,12 +1037,8 @@ radv_amdgpu_winsys_cs_submit_internal(struct radv_amdgpu_ctx *ctx, int queue_idx struct radv_amdgpu_cs *cs = radv_amdgpu_cs(postamble_cs[i]); struct radv_amdgpu_cs_ib_info ib; - assert(cs->num_old_ib_buffers <= 1); - if (cs->use_ib) { - ib = cs->ib; - } else { - ib = radv_amdgpu_cs_ib_to_info(cs, cs->old_ib_buffers[0]); - } + assert(cs->num_old_ib_buffers == 1); + ib = radv_amdgpu_cs_ib_to_info(cs, cs->old_ib_buffers[0]); ibs[num_submitted_ibs++] = ib; ibs_per_ip[cs->hw_ip]++;