diff options
author | Ilia Mirkin <[email protected]> | 2013-11-29 18:49:44 -0500 |
---|---|---|
committer | Maarten Lankhorst <[email protected]> | 2013-12-04 16:38:50 +0100 |
commit | ce6dd69697ae62d9336bbd4f5808bc4d75cdcc04 (patch) | |
tree | fb487fc434de9c7913237e33d458cc24a41fc2cb | |
parent | f50a45452a4fd4f7cece8fe37c394edac0808136 (diff) |
nouveau: avoid leaking fences while waiting
This fixes a memory leak in some situations. Also avoids emitting an
extra fence if the kick handler does the call to nouveau_fence_next
itself.
Signed-off-by: Ilia Mirkin <[email protected]>
Cc: "9.2 10.0" <[email protected]>
-rw-r--r-- | src/gallium/drivers/nouveau/nouveau_fence.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/src/gallium/drivers/nouveau/nouveau_fence.c b/src/gallium/drivers/nouveau/nouveau_fence.c index dea146ce65f..c6867104adb 100644 --- a/src/gallium/drivers/nouveau/nouveau_fence.c +++ b/src/gallium/drivers/nouveau/nouveau_fence.c @@ -189,16 +189,15 @@ nouveau_fence_wait(struct nouveau_fence *fence) /* wtf, someone is waiting on a fence in flush_notify handler? */ assert(fence->state != NOUVEAU_FENCE_STATE_EMITTING); - if (fence->state < NOUVEAU_FENCE_STATE_EMITTED) { + if (fence->state < NOUVEAU_FENCE_STATE_EMITTED) nouveau_fence_emit(fence); - if (fence == screen->fence.current) - nouveau_fence_new(screen, &screen->fence.current, FALSE); - } - if (fence->state < NOUVEAU_FENCE_STATE_FLUSHED) { + if (fence->state < NOUVEAU_FENCE_STATE_FLUSHED) if (nouveau_pushbuf_kick(screen->pushbuf, screen->pushbuf->channel)) return FALSE; - } + + if (fence == screen->fence.current) + nouveau_fence_next(screen); do { nouveau_fence_update(screen, FALSE); |