From 54f285901d0f30a25e5ca7f68c7f66dea4fa38f9 Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Fri, 7 May 2021 15:01:18 +0200 Subject: [PATCH] nouveau/fence: rework nouveau_fence_emit so we can call it on emitted fences Signed-off-by: Karol Herbst Reviewed-by: Emma Anholt Part-of: --- src/gallium/drivers/nouveau/nouveau_fence.c | 10 ++++------ src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c | 4 ++-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/nouveau/nouveau_fence.c b/src/gallium/drivers/nouveau/nouveau_fence.c index 117bce3b5c8..a0789739fa3 100644 --- a/src/gallium/drivers/nouveau/nouveau_fence.c +++ b/src/gallium/drivers/nouveau/nouveau_fence.c @@ -60,7 +60,9 @@ nouveau_fence_emit(struct nouveau_fence *fence) { struct nouveau_screen *screen = fence->screen; - assert(fence->state == NOUVEAU_FENCE_STATE_AVAILABLE); + assert(fence->state != NOUVEAU_FENCE_STATE_EMITTING); + if (fence->state >= NOUVEAU_FENCE_STATE_EMITTED) + return; /* set this now, so that if fence.emit triggers a flush we don't recurse */ fence->state = NOUVEAU_FENCE_STATE_EMITTING; @@ -190,11 +192,7 @@ nouveau_fence_kick(struct nouveau_fence *fence) if (fence->state < NOUVEAU_FENCE_STATE_EMITTED) { PUSH_SPACE(screen->pushbuf, 8); - /* The space allocation might trigger a flush, which could emit the - * current fence. So check again. - */ - if (fence->state < NOUVEAU_FENCE_STATE_EMITTED) - nouveau_fence_emit(fence); + nouveau_fence_emit(fence); } if (fence->state < NOUVEAU_FENCE_STATE_FLUSHED) diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c b/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c index d2c011fc1da..e1738508798 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c @@ -420,7 +420,7 @@ nvc0_hw_get_query_result_resource(struct nvc0_context *nvc0, /* If the fence guarding this query has not been emitted, that makes a lot * of the following logic more complicated. */ - if (hq->is64bit && hq->fence->state < NOUVEAU_FENCE_STATE_EMITTED) + if (hq->is64bit) nouveau_fence_emit(hq->fence); /* We either need to compute a 32- or 64-bit difference between 2 values, @@ -642,7 +642,7 @@ nvc0_hw_query_fifo_wait(struct nvc0_context *nvc0, struct nvc0_query *q) unsigned offset = hq->offset; /* ensure the query's fence has been emitted */ - if (hq->is64bit && hq->fence->state < NOUVEAU_FENCE_STATE_EMITTED) + if (hq->is64bit) nouveau_fence_emit(hq->fence); PUSH_SPACE(push, 5);