summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2012-01-15 14:52:33 -0800
committerBen Widawsky <ben@bwidawsk.net>2012-06-29 11:24:52 -0700
commita635a5ac3bb72b8ac13f020b610b71d97499a1fb (patch)
tree17b193480faf676807fb9c1fb7ff2aaa1f69f238
parentc157e9485e6a96fa359f8236f43475bc2095e1e2 (diff)
context: libdrm wrappers
This wraps libdrm functionality to exec with contexts. This patch shouldn't be applied until libdrm for contexts is updated. Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
-rw-r--r--lib/intel_batchbuffer.c40
-rw-r--r--lib/intel_batchbuffer.h2
2 files changed, 38 insertions, 4 deletions
diff --git a/lib/intel_batchbuffer.c b/lib/intel_batchbuffer.c
index 3fcc578..bcbdf61 100644
--- a/lib/intel_batchbuffer.c
+++ b/lib/intel_batchbuffer.c
@@ -75,13 +75,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;
if (used == 0)
- return;
+ return 0;
if (IS_GEN5(batch->devid)) {
/* emit gen5 w/a without batch space checks - we reserve that
@@ -100,7 +100,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;
do_or_die(drm_intel_bo_subdata(batch->bo, 0, used, batch->buffer));
@@ -112,6 +122,28 @@ intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring)
}
void
+intel_batchbuffer_flush_with_context(struct intel_batchbuffer *batch,
+ drm_intel_context *context)
+{
+ 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_gem_bo_context_exec(batch->bo, 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 7ea1368..ba0934c 100644
--- a/lib/intel_batchbuffer.h
+++ b/lib/intel_batchbuffer.h
@@ -25,6 +25,8 @@ 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,
+ drm_intel_context *context);
void intel_batchbuffer_reset(struct intel_batchbuffer *batch);