summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2015-10-12 17:15:32 -0400
committerIlia Mirkin <[email protected]>2015-10-12 17:21:29 -0400
commitbf97f8d467ad1d485c2327da3f4fe1f9e1dc7379 (patch)
tree1f1582221e6a00560146cccf8c10cba2a7b07dc1
parenteeb444bc995c25224ce661c49dd5df6266e370d1 (diff)
nouveau: avoid double-emitting fence
The act of ensuring that there is space can cause a flush to happen, which will emit the current screen fence. If that is the fence we're trying to wait on, then it will have been emitted as a result of doing the PUSH_SPACE. Don't attempt to emit it a second time. Signed-off-by: Ilia Mirkin <[email protected]> Fixes: 8053c9208f (nouveau: avoid emitting new fences unnecessarily) Cc: [email protected]
-rw-r--r--src/gallium/drivers/nouveau/nouveau_fence.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/gallium/drivers/nouveau/nouveau_fence.c b/src/gallium/drivers/nouveau/nouveau_fence.c
index 18b15920185..21cf2b9ae5e 100644
--- a/src/gallium/drivers/nouveau/nouveau_fence.c
+++ b/src/gallium/drivers/nouveau/nouveau_fence.c
@@ -192,7 +192,11 @@ nouveau_fence_wait(struct nouveau_fence *fence)
if (fence->state < NOUVEAU_FENCE_STATE_EMITTED) {
PUSH_SPACE(screen->pushbuf, 8);
- nouveau_fence_emit(fence);
+ /* 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);
}
if (fence->state < NOUVEAU_FENCE_STATE_FLUSHED)