OSDN Git Service

Include fences in the i915simple winsys interface.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Thu, 15 Nov 2007 17:07:50 +0000 (17:07 +0000)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Thu, 15 Nov 2007 17:07:50 +0000 (17:07 +0000)
src/mesa/drivers/dri/intel_winsys/intel_batchbuffer.c
src/mesa/drivers/dri/intel_winsys/intel_batchbuffer.h
src/mesa/drivers/dri/intel_winsys/intel_winsys.h
src/mesa/drivers/dri/intel_winsys/intel_winsys_i915.c
src/mesa/pipe/i915simple/i915_batch.h
src/mesa/pipe/i915simple/i915_context.h
src/mesa/pipe/i915simple/i915_flush.c
src/mesa/pipe/i915simple/i915_winsys.h

index 49e04d8..ed22397 100644 (file)
@@ -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
index 82feafa..2c943e6 100644 (file)
@@ -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);
 
index 89e63e0..f944cd2 100644 (file)
@@ -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
index 8e0eea4..7713d6e 100644 (file)
@@ -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:
index fb88cd6..99b03c3 100644 (file)
 
 #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 
index ee430eb..488682f 100644 (file)
@@ -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;
index 3c2069b..1044cb1 100644 (file)
@@ -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);
    }
 }
 
index 2c0f335..03457c1 100644 (file)
@@ -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