From 36c055c9b727a78aaaafb87c47eae2e83d65a4ad Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 14 Nov 2019 17:56:13 -0500 Subject: [PATCH] winsys/amdgpu: detect noop dependencies on the same ring correctly Reviewed-by: Pierre-Eric Pelloux-Prayer --- src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c index a577067edc0..47973d00d1d 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c @@ -1176,17 +1176,20 @@ static void add_fence_to_list(struct amdgpu_fence_list *fences, amdgpu_fence_reference(&fences->list[idx], (struct pipe_fence_handle*)fence); } -/* TODO: recognizing dependencies as no-ops doesn't take the parallel - * compute IB into account. The compute IB won't wait for these. - * Also, the scheduler can execute compute and SDMA IBs on any rings. - * Should we always insert dependencies? - */ static bool is_noop_fence_dependency(struct amdgpu_cs *acs, struct amdgpu_fence *fence) { struct amdgpu_cs_context *cs = acs->csc; - if (!amdgpu_fence_is_syncobj(fence) && + /* Detect no-op dependencies only when there is only 1 ring, + * because IBs on one ring are always executed one at a time. + * + * We always want no dependency between back-to-back gfx IBs, because + * we need the parallelism between IBs for good performance. + */ + if ((acs->ring_type == RING_GFX || + acs->ctx->ws->info.num_rings[acs->ring_type] == 1) && + !amdgpu_fence_is_syncobj(fence) && fence->ctx == acs->ctx && fence->fence.ip_type == cs->ib[IB_MAIN].ip_type && fence->fence.ip_instance == cs->ib[IB_MAIN].ip_instance && -- 2.30.2