From dc59a6b2eeea0c7b7b20c84f594a9f7ce6b99bdd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timur=20Krist=C3=B3f?= Date: Sun, 9 Apr 2023 03:16:33 +0200 Subject: [PATCH] radv/amdgpu: Respect maximum number of submitted IBs per IP type. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit In a gang submit, the maximum number of IBs is per IP type, and is different for each queue. Let's respect that. Signed-off-by: Timur Kristóf Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c index 37cb7dc..2eeb4b2 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c @@ -874,6 +874,7 @@ radv_amdgpu_winsys_cs_submit_internal( goto fail; /* Configure the CS request. */ + const uint8_t *max_ib_per_ip = ws->info.max_submitted_ibs; struct radv_amdgpu_cs_ib_info ibs[RADV_MAX_IBS_PER_SUBMIT]; struct radv_amdgpu_cs_request request = { .ip_type = last_cs->hw_ip, @@ -894,6 +895,7 @@ radv_amdgpu_winsys_cs_submit_internal( const unsigned preamble_count = cs_idx ? continue_preamble_count : initial_preamble_count; const unsigned ib_per_submit = RADV_MAX_IBS_PER_SUBMIT - preamble_count - postamble_count; unsigned num_submitted_ibs = 0; + unsigned ibs_per_ip[AMD_NUM_IP_TYPES] = {0}; /* Copy preambles to the submission. */ for (unsigned i = 0; i < preamble_count; ++i) { @@ -901,6 +903,7 @@ radv_amdgpu_winsys_cs_submit_internal( struct radv_amdgpu_cs *cs = radv_amdgpu_cs(preambles[i]); assert(cs->num_old_ib_buffers <= 1); ibs[num_submitted_ibs++] = cs->ib; + ibs_per_ip[cs->hw_ip]++; } for (unsigned i = 0; i < ib_per_submit && cs_idx < cs_count; ++i) { @@ -910,7 +913,8 @@ radv_amdgpu_winsys_cs_submit_internal( if (cs_ib_idx == 0) { /* Make sure the whole CS fits into the same submission. */ unsigned cs_num_ib = cs->use_ib ? 1 : cs->num_old_ib_buffers; - if (i + cs_num_ib > ib_per_submit) + if (i + cs_num_ib > ib_per_submit || + ibs_per_ip[cs->hw_ip] + cs_num_ib > max_ib_per_ip[cs->hw_ip]) break; if (cs->hw_ip != request.ip_type) { @@ -922,7 +926,8 @@ radv_amdgpu_winsys_cs_submit_internal( struct radv_amdgpu_cs *next_cs = radv_amdgpu_cs(cs_array[cs_idx + 1]); assert(next_cs->hw_ip == request.ip_type); unsigned next_cs_num_ib = next_cs->use_ib ? 1 : next_cs->num_old_ib_buffers; - if (i + cs_num_ib + next_cs_num_ib > ib_per_submit) + if (i + cs_num_ib + next_cs_num_ib > ib_per_submit || + ibs_per_ip[next_cs->hw_ip] + next_cs_num_ib > max_ib_per_ip[next_cs->hw_ip]) break; } } @@ -948,6 +953,7 @@ radv_amdgpu_winsys_cs_submit_internal( ib.flags |= AMDGPU_IB_FLAG_PREEMPT; ibs[num_submitted_ibs++] = ib; + ibs_per_ip[cs->hw_ip]++; } assert(num_submitted_ibs > preamble_count); @@ -958,6 +964,7 @@ radv_amdgpu_winsys_cs_submit_internal( struct radv_amdgpu_cs *cs = radv_amdgpu_cs(postamble_cs[i]); assert(cs->num_old_ib_buffers <= 1); ibs[num_submitted_ibs++] = cs->ib; + ibs_per_ip[cs->hw_ip]++; } /* Submit the CS. */ -- 2.7.4