From dec60d33b2570cf2bdce72a00a1539ee93133f91 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Fri, 16 Nov 2007 17:36:35 +0000 Subject: [PATCH] Proper fence reference counting. --- .../dri/intel_winsys/intel_winsys_i915.c | 30 +++++++++---------- src/mesa/pipe/i915simple/i915_batch.h | 2 +- src/mesa/pipe/i915simple/i915_context.c | 2 ++ src/mesa/pipe/i915simple/i915_winsys.h | 9 +++++- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/mesa/drivers/dri/intel_winsys/intel_winsys_i915.c b/src/mesa/drivers/dri/intel_winsys/intel_winsys_i915.c index 7713d6e48d0..eea8c0be181 100644 --- a/src/mesa/drivers/dri/intel_winsys/intel_winsys_i915.c +++ b/src/mesa/drivers/dri/intel_winsys/intel_winsys_i915.c @@ -111,12 +111,19 @@ static void intel_i915_batch_reloc( struct i915_winsys *sws, -static struct pipe_fence * -intel_i915_batch_flush( struct i915_winsys *sws ) +static void +intel_i915_batch_flush( struct i915_winsys *sws, + struct pipe_fence **fence ) { struct intel_context *intel = intel_i915_winsys(sws)->intel; - - return pipe_fo(intel_batchbuffer_flush( intel->batch )); + struct pipe_fence *tmp_fence; + + tmp_fence = pipe_fo(intel_batchbuffer_flush( intel->batch )); + + /* this also increases the fence reference count, which is not done inside + * intel_batchbuffer_flush call above + */ + sws->fence_reference(sws, fence, tmp_fence); } @@ -143,14 +150,10 @@ intel_i915_fence_is_signalled( struct i915_winsys *sws, struct pipe_fence *fence ) { struct _DriFenceObject *dri_fence = dri_fo(fence); - int ret = 1; - if (fence) { - driFenceReference(dri_fence); - ret = driFenceSignaled(dri_fence, + if (fence) + return driFenceSignaled(dri_fence, DRM_FENCE_TYPE_EXE | DRM_I915_FENCE_TYPE_RW); - driFenceUnReference(dri_fence); - } - return ret; + return 1; } @@ -159,13 +162,10 @@ intel_i915_fence_wait( struct i915_winsys *sws, struct pipe_fence *fence ) { struct _DriFenceObject *dri_fence = dri_fo(fence); - if (fence) { - driFenceReference(dri_fence); + if (fence) driFenceFinish(dri_fence, DRM_FENCE_TYPE_EXE | DRM_I915_FENCE_TYPE_RW, GL_FALSE); - driFenceUnReference(dri_fence); - } return 1; } diff --git a/src/mesa/pipe/i915simple/i915_batch.h b/src/mesa/pipe/i915simple/i915_batch.h index 99b03c37db1..603d193f626 100644 --- a/src/mesa/pipe/i915simple/i915_batch.h +++ b/src/mesa/pipe/i915simple/i915_batch.h @@ -46,7 +46,7 @@ #define FLUSH_BATCH() do { \ if (0) i915_dump_batchbuffer( i915 ); \ - i915->last_fence = i915->winsys->batch_flush( i915->winsys ); \ + i915->winsys->batch_flush( i915->winsys, &i915->last_fence ); \ i915->batch_start = NULL; \ i915->hardware_dirty = ~0; \ } while (0) diff --git a/src/mesa/pipe/i915simple/i915_context.c b/src/mesa/pipe/i915simple/i915_context.c index e43274dc667..f5d770ce0df 100644 --- a/src/mesa/pipe/i915simple/i915_context.c +++ b/src/mesa/pipe/i915simple/i915_context.c @@ -175,6 +175,8 @@ static void i915_destroy( struct pipe_context *pipe ) draw_destroy( i915->draw ); + i915->winsys->fence_reference( i915->winsys, &i915->last_fence, NULL ); + free( i915 ); } diff --git a/src/mesa/pipe/i915simple/i915_winsys.h b/src/mesa/pipe/i915simple/i915_winsys.h index 03457c1d61c..386ed745d37 100644 --- a/src/mesa/pipe/i915simple/i915_winsys.h +++ b/src/mesa/pipe/i915simple/i915_winsys.h @@ -98,7 +98,14 @@ struct i915_winsys { unsigned access_flags, unsigned delta ); - struct pipe_fence *(*batch_flush)( struct i915_winsys *sws ); + /** + * Flush the batch buffer. + * + * Fence argument must point to NULL or to a previous fence, and the caller + * must call fence_reference when done with the fence. + */ + void (*batch_flush)( struct i915_winsys *sws, + struct pipe_fence **fence ); /* Fence -- 2.30.2