[Intel-gfx] [PATCH 22/25] context: libdrm wrappers

Ben Widawsky ben at bwidawsk.net
Mon Jun 4 23:43:02 CEST 2012


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

Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
---
 lib/drmtest.c           |   16 ++++++++++++++++
 lib/drmtest.h           |    2 ++
 lib/intel_batchbuffer.c |   40 ++++++++++++++++++++++++++++++++++++----
 lib/intel_batchbuffer.h |    2 ++
 4 files changed, 56 insertions(+), 4 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index ebc396f..eb429b5 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -294,6 +294,22 @@ uint32_t gem_create(int fd, int size)
 	return create.handle;
 }
 
+uint32_t gem_context_create(int fd)
+{
+	struct drm_i915_gem_context_create create;
+	do_ioctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create);
+	assert(create.ctx_id);
+
+	return create.ctx_id;
+}
+
+void gem_context_destroy(int fd, uint32_t ctx_id)
+{
+	struct drm_i915_gem_context_destroy destroy;
+	destroy.ctx_id = ctx_id;
+	do_ioctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_DESTROY, &destroy);
+}
+
 void *gem_mmap(int fd, uint32_t handle, int size, int prot)
 {
 	struct drm_i915_gem_mmap_gtt mmap_arg;
diff --git a/lib/drmtest.h b/lib/drmtest.h
index f4462a2..170b420 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -50,6 +50,8 @@ void gem_set_domain(int fd, uint32_t handle,
 		    uint32_t read_domains, uint32_t write_domain);
 void gem_sync(int fd, uint32_t handle);
 uint32_t gem_create(int fd, int size);
+uint32_t gem_context_create(int fd);
+void gem_context_destroy(int fd, uint32_t ctx_id);
 void *gem_mmap(int fd, uint32_t handle, int size, int prot);
 uint64_t gem_aperture_size(int fd);
 uint64_t gem_mappable_aperture_size(void);
diff --git a/lib/intel_batchbuffer.c b/lib/intel_batchbuffer.c
index 325066e..d9d49b6 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)) {
 		BEGIN_BATCH(2);
@@ -99,7 +99,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));
 
@@ -111,6 +121,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 4dffda7..97224b5 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);
 
-- 
1.7.10.2




More information about the Intel-gfx mailing list