diff --git a/src/gallium/drivers/nouveau/nouveau_fence.c b/src/gallium/drivers/nouveau/nouveau_fence.c index a830f8133d7..f317d0451d4 100644 --- a/src/gallium/drivers/nouveau/nouveau_fence.c +++ b/src/gallium/drivers/nouveau/nouveau_fence.c @@ -108,6 +108,21 @@ nouveau_fence_del(struct nouveau_fence *fence) FREE(fence); } +void +nouveau_fence_cleanup(struct nouveau_screen *screen) +{ + struct nouveau_fence *fence, *next; + + for (fence = screen->fence.head; fence; fence = next) { + next = fence->next; + nouveau_fence_trigger_work(fence); + nouveau_fence_ref(NULL, &fence); + } + screen->fence.head = NULL; + screen->fence.tail = NULL; + nouveau_fence_ref(NULL, &screen->fence.current); +} + void nouveau_fence_update(struct nouveau_screen *screen, bool flushed) { diff --git a/src/gallium/drivers/nouveau/nouveau_fence.h b/src/gallium/drivers/nouveau/nouveau_fence.h index e14572bce8f..72a5496cb19 100644 --- a/src/gallium/drivers/nouveau/nouveau_fence.h +++ b/src/gallium/drivers/nouveau/nouveau_fence.h @@ -33,6 +33,7 @@ void nouveau_fence_emit(struct nouveau_fence *); void nouveau_fence_del(struct nouveau_fence *); bool nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **); +void nouveau_fence_cleanup(struct nouveau_screen *); bool nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *); void nouveau_fence_update(struct nouveau_screen *, bool flushed); void nouveau_fence_next(struct nouveau_screen *); diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c index 5718d9d51c1..8db9fded5cb 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c @@ -495,17 +495,7 @@ nv30_screen_destroy(struct pipe_screen *pscreen) if (!nouveau_drm_screen_unref(&screen->base)) return; - if (screen->base.fence.current) { - struct nouveau_fence *current = NULL; - - /* nouveau_fence_wait will create a new current fence, so wait on the - * _current_ one, and remove both. - */ - nouveau_fence_ref(screen->base.fence.current, ¤t); - nouveau_fence_wait(current, NULL); - nouveau_fence_ref(NULL, ¤t); - nouveau_fence_ref(NULL, &screen->base.fence.current); - } + nouveau_fence_cleanup(&screen->base); nouveau_bo_ref(NULL, &screen->notify); diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c index 71152a29589..a54cb652b8d 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c @@ -555,17 +555,8 @@ nv50_screen_destroy(struct pipe_screen *pscreen) if (!nouveau_drm_screen_unref(&screen->base)) return; - if (screen->base.fence.current) { - struct nouveau_fence *current = NULL; + nouveau_fence_cleanup(&screen->base); - /* nouveau_fence_wait will create a new current fence, so wait on the - * _current_ one, and remove both. - */ - nouveau_fence_ref(screen->base.fence.current, ¤t); - nouveau_fence_wait(current, NULL); - nouveau_fence_ref(NULL, ¤t); - nouveau_fence_ref(NULL, &screen->base.fence.current); - } if (screen->base.pushbuf) screen->base.pushbuf->user_priv = NULL; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c index c2bff918d8e..bdaa2289a85 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c @@ -673,17 +673,8 @@ nvc0_screen_destroy(struct pipe_screen *pscreen) if (!nouveau_drm_screen_unref(&screen->base)) return; - if (screen->base.fence.current) { - struct nouveau_fence *current = NULL; + nouveau_fence_cleanup(&screen->base); - /* nouveau_fence_wait will create a new current fence, so wait on the - * _current_ one, and remove both. - */ - nouveau_fence_ref(screen->base.fence.current, ¤t); - nouveau_fence_wait(current, NULL); - nouveau_fence_ref(NULL, ¤t); - nouveau_fence_ref(NULL, &screen->base.fence.current); - } if (screen->base.pushbuf) screen->base.pushbuf->user_priv = NULL;