diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c index d0e75564dfc..94d21ad83b0 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c @@ -524,6 +524,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].bo) + return true; + } + + return false; +} + static void radv_amdgpu_cs_unchain(struct radeon_cmdbuf *cs) { @@ -560,6 +571,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; @@ -949,17 +966,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].bo) - return true; - } - - return false; -} - static unsigned radv_amdgpu_get_num_ibs_per_cs(const struct radv_amdgpu_cs *cs) {