diff --git a/.pick_status.json b/.pick_status.json index 066f8ab468b..00426436423 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -54,7 +54,7 @@ "description": "radv/amdgpu: fix chaining CS with external IBs on compute queue", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c index 24b662a18fb..f77dfcba673 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c @@ -527,6 +527,17 @@ radv_amdgpu_cs_reset(struct radeon_cmdbuf *_cs) cs->annotations = NULL; } +static bool +radv_amdgpu_cs_has_external_ib(const struct radv_amdgpu_cs *cs) +{ + for (unsigned i = 0; i < cs->num_ib_buffers; i++) { + if (cs->ib_buffers[i].is_external) + return true; + } + + return false; +} + static void radv_amdgpu_cs_unchain(struct radeon_cmdbuf *cs) { @@ -563,6 +574,12 @@ radv_amdgpu_cs_chain(struct radeon_cmdbuf *cs, struct radeon_cmdbuf *next_cs, bo if (!acs->use_ib) return false; + /* Do not chain if the next CS has external IBs because it will chain to newly created IB instead + * of the first one. + */ + if (radv_amdgpu_cs_has_external_ib(next_acs)) + return false; + assert(cs->cdw <= cs->max_dw + 4); acs->chained_to = next_acs; @@ -952,17 +969,6 @@ radv_assign_last_submit(struct radv_amdgpu_ctx *ctx, struct radv_amdgpu_cs_reque radv_amdgpu_request_to_fence(ctx, &ctx->last_submission[request->ip_type][request->ring], request); } -static bool -radv_amdgpu_cs_has_external_ib(const struct radv_amdgpu_cs *cs) -{ - for (unsigned i = 0; i < cs->num_ib_buffers; i++) { - if (cs->ib_buffers[i].is_external) - return true; - } - - return false; -} - static unsigned radv_amdgpu_get_num_ibs_per_cs(const struct radv_amdgpu_cs *cs) {