Proper fence reference counting.

This commit is contained in:
José Fonseca 2007-11-16 17:36:35 +00:00
parent 34a00276c7
commit dec60d33b2
4 changed files with 26 additions and 17 deletions

View file

@ -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;
}

View file

@ -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)

View file

@ -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 );
}

View file

@ -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