diff --git a/src/broadcom/vulkan/v3dv_queue.c b/src/broadcom/vulkan/v3dv_queue.c index 9f14c7629c4..6c001f6e8b8 100644 --- a/src/broadcom/vulkan/v3dv_queue.c +++ b/src/broadcom/vulkan/v3dv_queue.c @@ -866,13 +866,16 @@ handle_csd_indirect_cpu_job(struct v3dv_queue *queue, submit.bo_handle_count = 1; submit.bo_handles = (uintptr_t)(void *)&bo->handle; - csd_job->csd.submit.bo_handle_count = csd_job->bo_count; uint32_t *bo_handles = (uint32_t *) malloc(sizeof(uint32_t) * csd_job->bo_count); uint32_t bo_idx = 0; set_foreach (csd_job->bos, entry) { - struct v3dv_bo *bo = (struct v3dv_bo *)entry->key; - bo_handles[bo_idx++] = bo->handle; + struct v3dv_bo *csd_bo = (struct v3dv_bo *)entry->key; + /* dedup against cpu_job bo */ + if (csd_bo->handle == bo->handle) + continue; + bo_handles[bo_idx++] = csd_bo->handle; } + csd_job->csd.submit.bo_handle_count = bo_idx; csd_job->csd.submit.bo_handles = (uintptr_t)(void *)bo_handles; struct drm_v3d_indirect_csd indirect = {0};