From 44df9517cd0ef98997423f65df1dccb792e7d7ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 21 Dec 2023 03:09:13 -0500 Subject: [PATCH] winsys/amdgpu: don't use amdgpu_fence::ctx for fence dependencies The only remaining use of ctx is amdgpu_fence_is_syncobj. Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 5 ++++- src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 2 ++ src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c index 7dac24528f5..af5a9fa002d 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c @@ -1366,7 +1366,7 @@ static void amdgpu_cs_submit_ib(void *job, void *gdata, int thread_index) struct amdgpu_fence *prev_fence = (struct amdgpu_fence*)queue->fences[prev_seq_no % AMDGPU_FENCE_RING_SIZE]; - if (prev_fence && (ws->info.ip[acs->ip_type].num_queues > 1 || prev_fence->ctx != acs->ctx)) + if (prev_fence && (ws->info.ip[acs->ip_type].num_queues > 1 || queue->last_ctx != acs->ctx)) add_seq_no_to_list(ws, &seq_no_dependencies, acs->queue_index, prev_seq_no); /* Since the kernel driver doesn't synchronize execution between different @@ -1424,6 +1424,9 @@ static void amdgpu_cs_submit_ib(void *job, void *gdata, int thread_index) amdgpu_fence_reference(&queue->fences[next_seq_no % AMDGPU_FENCE_RING_SIZE], cs->fence); queue->latest_seq_no = next_seq_no; ((struct amdgpu_fence*)cs->fence)->queue_seq_no = next_seq_no; + + /* Update the last used context in the queue. */ + amdgpu_ctx_reference(&queue->last_ctx, acs->ctx); simple_mtx_unlock(&ws->bo_fence_lock); struct drm_amdgpu_bo_list_entry *bo_list = NULL; diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c index 8d3ef782a25..5673ecf228b 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c @@ -75,6 +75,8 @@ static void do_winsys_deinit(struct amdgpu_winsys *ws) for (unsigned i = 0; i < ARRAY_SIZE(ws->queues); i++) { for (unsigned j = 0; j < ARRAY_SIZE(ws->queues[i].fences); j++) amdgpu_fence_reference(&ws->queues[i].fences[j], NULL); + + amdgpu_ctx_reference(&ws->queues[i].last_ctx, NULL); } if (util_queue_is_initialized(&ws->cs_queue)) diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h index 70564e41bbc..f1abe14dc8c 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h @@ -117,6 +117,9 @@ struct amdgpu_queue { * never become idle in certain very unlucky scenarios and running out of memory. */ uint_seq_no latest_seq_no; + + /* The last context using this queue. */ + struct amdgpu_ctx *last_ctx; }; /* This is part of every BO. */