mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-02 12:18:09 +02:00
Include fences in the i915simple winsys interface.
This commit is contained in:
parent
193c85ec7a
commit
90dd0cb822
8 changed files with 96 additions and 31 deletions
|
|
@ -307,20 +307,6 @@ intel_batchbuffer_flush(struct intel_batchbuffer *batch)
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
intel_batchbuffer_finish(struct intel_batchbuffer *batch)
|
||||
{
|
||||
struct _DriFenceObject *fence = intel_batchbuffer_flush(batch);
|
||||
if (fence) {
|
||||
driFenceReference(fence);
|
||||
driFenceFinish(fence,
|
||||
DRM_FENCE_TYPE_EXE | DRM_I915_FENCE_TYPE_RW,
|
||||
GL_FALSE);
|
||||
driFenceUnReference(fence);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* This is the only way buffers get added to the validate list.
|
||||
*/
|
||||
boolean
|
||||
|
|
|
|||
|
|
@ -72,8 +72,6 @@ struct intel_batchbuffer *intel_batchbuffer_alloc(struct intel_context *intel);
|
|||
void intel_batchbuffer_free(struct intel_batchbuffer *batch);
|
||||
|
||||
|
||||
void intel_batchbuffer_finish(struct intel_batchbuffer *batch);
|
||||
|
||||
struct _DriFenceObject *intel_batchbuffer_flush(struct intel_batchbuffer
|
||||
*batch);
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,9 @@ struct intel_context;
|
|||
struct pipe_context;
|
||||
struct pipe_winsys;
|
||||
struct pipe_buffer_handle;
|
||||
struct pipe_fence;
|
||||
struct _DriBufferObject;
|
||||
struct _DriFenceObject;
|
||||
|
||||
struct pipe_winsys *
|
||||
intel_create_pipe_winsys( int fd );
|
||||
|
|
@ -66,5 +68,20 @@ pipe_bo( struct _DriBufferObject *bo )
|
|||
}
|
||||
|
||||
|
||||
/* Turn the pipe opaque buffer pointer into a dri_bufmgr opaque
|
||||
* buffer pointer...
|
||||
*/
|
||||
static INLINE struct _DriFenceObject *
|
||||
dri_fo( struct pipe_fence *bo )
|
||||
{
|
||||
return (struct _DriFenceObject *)bo;
|
||||
}
|
||||
|
||||
static INLINE struct pipe_fence *
|
||||
pipe_fo( struct _DriFenceObject *bo )
|
||||
{
|
||||
return (struct pipe_fence *)bo;
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -111,19 +111,62 @@ static void intel_i915_batch_reloc( struct i915_winsys *sws,
|
|||
|
||||
|
||||
|
||||
static void intel_i915_batch_flush( struct i915_winsys *sws )
|
||||
static struct pipe_fence *
|
||||
intel_i915_batch_flush( struct i915_winsys *sws )
|
||||
{
|
||||
struct intel_context *intel = intel_i915_winsys(sws)->intel;
|
||||
|
||||
intel_batchbuffer_flush( intel->batch );
|
||||
// if (0) intel_i915_batch_wait_idle( sws );
|
||||
return pipe_fo(intel_batchbuffer_flush( intel->batch ));
|
||||
}
|
||||
|
||||
|
||||
static void intel_i915_batch_finish( struct i915_winsys *sws )
|
||||
static void
|
||||
intel_i915_fence_reference( struct i915_winsys *sws,
|
||||
struct pipe_fence **dst_fence,
|
||||
struct pipe_fence *src_fence )
|
||||
{
|
||||
struct intel_context *intel = intel_i915_winsys(sws)->intel;
|
||||
intel_batchbuffer_finish( intel->batch );
|
||||
struct _DriFenceObject **dri_dst_fence = (struct _DriFenceObject **)dst_fence;
|
||||
struct _DriFenceObject *dri_src_fence = (struct _DriFenceObject *)dst_fence;
|
||||
|
||||
if(dri_src_fence)
|
||||
driFenceReference(dri_src_fence);
|
||||
|
||||
if(*dri_dst_fence)
|
||||
driFenceUnReference(*dri_dst_fence);
|
||||
|
||||
*dri_dst_fence = dri_src_fence;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
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,
|
||||
DRM_FENCE_TYPE_EXE | DRM_I915_FENCE_TYPE_RW);
|
||||
driFenceUnReference(dri_fence);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
intel_i915_fence_wait( struct i915_winsys *sws,
|
||||
struct pipe_fence *fence )
|
||||
{
|
||||
struct _DriFenceObject *dri_fence = dri_fo(fence);
|
||||
if (fence) {
|
||||
driFenceReference(dri_fence);
|
||||
driFenceFinish(dri_fence,
|
||||
DRM_FENCE_TYPE_EXE | DRM_I915_FENCE_TYPE_RW,
|
||||
GL_FALSE);
|
||||
driFenceUnReference(dri_fence);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -143,7 +186,10 @@ intel_create_i915simple( struct intel_context *intel,
|
|||
iws->winsys.batch_dword = intel_i915_batch_dword;
|
||||
iws->winsys.batch_reloc = intel_i915_batch_reloc;
|
||||
iws->winsys.batch_flush = intel_i915_batch_flush;
|
||||
iws->winsys.batch_finish = intel_i915_batch_finish;
|
||||
iws->winsys.fence_reference = intel_i915_fence_reference;
|
||||
iws->winsys.fence_is_signalled = intel_i915_fence_is_signalled;
|
||||
iws->winsys.fence_wait = intel_i915_fence_wait;
|
||||
|
||||
iws->intel = intel;
|
||||
|
||||
/* Create the i915simple context:
|
||||
|
|
|
|||
|
|
@ -44,11 +44,11 @@
|
|||
|
||||
#define ADVANCE_BATCH()
|
||||
|
||||
#define FLUSH_BATCH() do { \
|
||||
if (0) i915_dump_batchbuffer( i915 ); \
|
||||
i915->winsys->batch_flush( i915->winsys ); \
|
||||
i915->batch_start = NULL; \
|
||||
i915->hardware_dirty = ~0; \
|
||||
#define FLUSH_BATCH() do { \
|
||||
if (0) i915_dump_batchbuffer( i915 ); \
|
||||
i915->last_fence = i915->winsys->batch_flush( i915->winsys ); \
|
||||
i915->batch_start = NULL; \
|
||||
i915->hardware_dirty = ~0; \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@
|
|||
|
||||
|
||||
|
||||
struct pipe_fence;
|
||||
struct i915_cache_context;
|
||||
|
||||
/* Use to calculate differences between state emitted to hardware and
|
||||
|
|
@ -184,6 +185,8 @@ struct i915_context
|
|||
unsigned dirty;
|
||||
|
||||
unsigned *batch_start;
|
||||
|
||||
struct pipe_fence *last_fence;
|
||||
|
||||
/** Vertex buffer */
|
||||
struct pipe_buffer_handle *vbo;
|
||||
|
|
|
|||
|
|
@ -69,7 +69,8 @@ static void i915_flush( struct pipe_context *pipe,
|
|||
FLUSH_BATCH();
|
||||
|
||||
if (flags & PIPE_FLUSH_WAIT) {
|
||||
i915->winsys->batch_finish(i915->winsys);
|
||||
if( i915->last_fence )
|
||||
i915->winsys->fence_wait(i915->winsys, i915->last_fence);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@
|
|||
|
||||
struct pipe_buffer_handle;
|
||||
struct pipe_winsys;
|
||||
struct pipe_fence;
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -97,8 +98,21 @@ struct i915_winsys {
|
|||
unsigned access_flags,
|
||||
unsigned delta );
|
||||
|
||||
void (*batch_flush)( struct i915_winsys *sws );
|
||||
void (*batch_finish)( struct i915_winsys *sws );
|
||||
struct pipe_fence *(*batch_flush)( struct i915_winsys *sws );
|
||||
|
||||
|
||||
/* Fence
|
||||
*/
|
||||
void (*fence_reference)( struct i915_winsys *sws,
|
||||
struct pipe_fence **dst_fence,
|
||||
struct pipe_fence *src_fence );
|
||||
|
||||
int (*fence_is_signalled)( struct i915_winsys *sws,
|
||||
struct pipe_fence *fence );
|
||||
|
||||
int (*fence_wait)( struct i915_winsys *sws,
|
||||
struct pipe_fence *fence );
|
||||
|
||||
};
|
||||
|
||||
#define I915_BUFFER_ACCESS_WRITE 0x1
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue