From 0d646ea3a860bf3b456e3270b368a1b76729a380 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= Date: Mon, 18 Sep 2006 08:41:22 +0000 Subject: [PATCH] Relax the requirement in pool_takedown in the intel batch buffer pool, that all allocated buffes should've been handed back before releasing the pool. This is to account for the case where whe app calls DestroyScreen() without first destroying all contexts. --- src/mesa/drivers/dri/i915/intel_batchbuffer.c | 6 ++++++ src/mesa/drivers/dri/i915/intel_batchpool.c | 2 +- src/mesa/drivers/dri/i915/intel_context.c | 10 ++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/mesa/drivers/dri/i915/intel_batchbuffer.c b/src/mesa/drivers/dri/i915/intel_batchbuffer.c index ff822d46bcc..ee96fd85797 100644 --- a/src/mesa/drivers/dri/i915/intel_batchbuffer.c +++ b/src/mesa/drivers/dri/i915/intel_batchbuffer.c @@ -140,6 +140,12 @@ intel_batchbuffer_alloc(struct intel_context *intel) void intel_batchbuffer_free(struct intel_batchbuffer *batch) { + if (batch->last_fence) { + driFenceFinish(batch->last_fence, + DRM_FENCE_TYPE_EXE | DRM_I915_FENCE_TYPE_RW, GL_FALSE); + driFenceUnReference(batch->last_fence); + batch->last_fence = NULL; + } if (batch->map) { driBOUnmap(batch->buffer); batch->map = NULL; diff --git a/src/mesa/drivers/dri/i915/intel_batchpool.c b/src/mesa/drivers/dri/i915/intel_batchpool.c index acce037a5cc..1011e2f5edf 100644 --- a/src/mesa/drivers/dri/i915/intel_batchpool.c +++ b/src/mesa/drivers/dri/i915/intel_batchpool.c @@ -361,7 +361,7 @@ pool_takedown(struct _DriBufferPool *pool) */ _glthread_LOCK_MUTEX(p->mutex); - while (p->numFree < p->numTot) { + while ((p->numFree < p->numTot) && p->numDelayed) { _glthread_UNLOCK_MUTEX(p->mutex); sched_yield(); pool_checkFree(p, GL_TRUE); diff --git a/src/mesa/drivers/dri/i915/intel_context.c b/src/mesa/drivers/dri/i915/intel_context.c index e83f26fdce1..a9e7c8db784 100644 --- a/src/mesa/drivers/dri/i915/intel_context.c +++ b/src/mesa/drivers/dri/i915/intel_context.c @@ -575,6 +575,16 @@ intelDestroyContext(__DRIcontextPrivate * driContextPriv) intel->Fallback = 0; /* don't call _swrast_Flush later */ intel_batchbuffer_free(intel->batch); + if (intel->last_swap_fence) { + driFenceFinish(intel->last_swap_fence, DRM_FENCE_TYPE_EXE, GL_TRUE); + driFenceUnReference(intel->last_swap_fence); + intel->last_swap_fence = NULL; + } + if (intel->first_swap_fence) { + driFenceFinish(intel->first_swap_fence, DRM_FENCE_TYPE_EXE, GL_TRUE); + driFenceUnReference(intel->first_swap_fence); + intel->first_swap_fence = NULL; + } if (release_texture_heaps) {