This wraps libdrm functionality to create, destroy, and exec with
contexts. This patch shouldn't be applied until libdrm for contexts is
updated.

Cc: Daniel Vetter <[email protected]>
Signed-off-by: Ben Widawsky <[email protected]>
---
 lib/intel_batchbuffer.c |   40 +++++++++++++++++++++++++++++++++++-----
 lib/intel_batchbuffer.h |    2 ++
 2 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/lib/intel_batchbuffer.c b/lib/intel_batchbuffer.c
index 518435c..2344d53 100644
--- a/lib/intel_batchbuffer.c
+++ b/lib/intel_batchbuffer.c
@@ -74,14 +74,13 @@ intel_batchbuffer_free(struct intel_batchbuffer *batch)
 
 #define CMD_POLY_STIPPLE_OFFSET       0x7906
 
-void
-intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring)
+static unsigned int
+flush_on_ring_common(struct intel_batchbuffer *batch, int ring)
 {
        unsigned int used = batch->ptr - batch->buffer;
-       int ret;
 
        if (used == 0)
-               return;
+               return 0;
 
        if (IS_GEN5(batch->devid)) {
                BEGIN_BATCH(2);
@@ -99,7 +98,17 @@ intel_batchbuffer_flush_on_ring(struct intel_batchbuffer 
*batch, int ring)
        /* Mark the end of the buffer. */
        *(uint32_t *)(batch->ptr) = MI_BATCH_BUFFER_END; /* noop */
        batch->ptr += 4;
-       used = batch->ptr - batch->buffer;
+       return batch->ptr - batch->buffer;
+}
+
+void
+intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring)
+{
+       int ret;
+       unsigned int used = flush_on_ring_common(batch, ring);
+
+       if (used == 0)
+               return;
 
        ret = drm_intel_bo_subdata(batch->bo, 0, used, batch->buffer);
        assert(ret == 0);
@@ -113,6 +122,27 @@ intel_batchbuffer_flush_on_ring(struct intel_batchbuffer 
*batch, int ring)
 }
 
 void
+intel_batchbuffer_flush_with_context(struct intel_batchbuffer *batch)
+{
+       int ret;
+       unsigned int used = flush_on_ring_common(batch, I915_EXEC_RENDER);
+
+       if (used == 0)
+               return;
+
+       ret = drm_intel_bo_subdata(batch->bo, 0, used, batch->buffer);
+       assert(ret == 0);
+
+       batch->ptr = NULL;
+
+       ret = drm_intel_bo_context_exec(batch->bo, batch->context, used,
+                                       I915_EXEC_RENDER);
+       assert(ret == 0);
+
+       intel_batchbuffer_reset(batch);
+}
+
+void
 intel_batchbuffer_flush(struct intel_batchbuffer *batch)
 {
        int ring = 0;
diff --git a/lib/intel_batchbuffer.h b/lib/intel_batchbuffer.h
index 4dffda7..006fdd1 100644
--- a/lib/intel_batchbuffer.h
+++ b/lib/intel_batchbuffer.h
@@ -12,6 +12,7 @@ struct intel_batchbuffer {
        uint32_t devid;
 
        drm_intel_bo *bo;
+       drm_intel_context *context;
 
        uint8_t buffer[BATCH_SZ];
        uint8_t *ptr;
@@ -25,6 +26,7 @@ void intel_batchbuffer_free(struct intel_batchbuffer *batch);
 
 void intel_batchbuffer_flush(struct intel_batchbuffer *batch);
 void intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int 
ring);
+void intel_batchbuffer_flush_with_context(struct intel_batchbuffer *batch);
 
 void intel_batchbuffer_reset(struct intel_batchbuffer *batch);
 
-- 
1.7.8.3

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to