Mesa (master): i915g: Switch to mapping the batch buffer instead of using subdata

Jakob Bornecrantz wallbraker at kemper.freedesktop.org
Wed Aug 5 22:47:50 UTC 2009


Module: Mesa
Branch: master
Commit: 66b00380a251b14b7622edadb5e7c9344d0f1d5b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=66b00380a251b14b7622edadb5e7c9344d0f1d5b

Author: Jakob Bornecrantz <jakob at vmware.com>
Date:   Wed Aug  5 23:56:08 2009 +0100

i915g: Switch to mapping the batch buffer instead of using subdata

---

 .../winsys/drm/intel/gem/intel_be_batchbuffer.c    |   36 ++++++++++++++------
 src/gallium/winsys/drm/intel/gem/intel_be_device.c |    1 +
 src/gallium/winsys/drm/intel/gem/intel_be_device.h |    1 +
 3 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c b/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c
index d5e63c3..ef4d393 100644
--- a/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c
+++ b/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c
@@ -23,10 +23,8 @@ intel_be_batchbuffer_alloc(struct intel_be_context *intel)
 	batch->base.relocs = 0;
 	batch->base.max_relocs = 500;/*INTEL_DEFAULT_RELOCS;*/
 
-	batch->base.map = malloc(batch->base.actual_size);
-	memset(batch->base.map, 0, batch->base.actual_size);
-
-	batch->base.ptr = batch->base.map;
+	batch->intel = intel;
+	batch->device = intel->device;
 
 	intel_be_batchbuffer_reset(batch);
 
@@ -41,16 +39,17 @@ intel_be_batchbuffer_reset(struct intel_be_batchbuffer *batch)
 
 	if (batch->bo)
 		drm_intel_bo_unreference(batch->bo);
+	batch->bo = drm_intel_bo_alloc(dev->pools.gem,
+	                               "gallium3d_batch_buffer",
+	                               batch->base.actual_size,
+	                               4096);
+	drm_intel_bo_map(batch->bo, TRUE);
+	batch->base.map = batch->bo->virtual;
 
 	memset(batch->base.map, 0, batch->base.actual_size);
 	batch->base.ptr = batch->base.map;
 	batch->base.size = batch->base.actual_size - BATCH_RESERVED;
-
 	batch->base.relocs = 0;
-
-	batch->bo = drm_intel_bo_alloc(dev->pools.gem,
-	                               "gallium3d_batch_buffer",
-	                               batch->base.actual_size, 0);
 }
 
 int
@@ -88,6 +87,7 @@ intel_be_batchbuffer_flush(struct intel_be_batchbuffer *batch,
 	struct i915_batchbuffer *i915 = &batch->base;
 	unsigned used = 0;
 	int ret = 0;
+	int i;
 
 	assert(i915_batchbuffer_space(i915) >= 0);
 
@@ -105,11 +105,25 @@ intel_be_batchbuffer_flush(struct intel_be_batchbuffer *batch,
 
 	used = batch->base.ptr - batch->base.map;
 
-	drm_intel_bo_subdata(batch->bo, 0, used, batch->base.map);
-	ret = drm_intel_bo_exec(batch->bo, used, NULL, 0, 0);
+	drm_intel_bo_unmap(batch->bo);
 
+	/* Do the sending to HW */
+	ret = drm_intel_bo_exec(batch->bo, used, NULL, 0, 0);
 	assert(ret == 0);
 
+	if (batch->device->dump_cmd) {
+		unsigned *ptr;
+		drm_intel_bo_map(batch->bo, FALSE);
+		ptr = (unsigned*)batch->bo->virtual;
+
+		debug_printf("%s:\n", __func__);
+		for (i = 0; i < used / 4; i++, ptr++) {
+			debug_printf("\t%08x:    %08x\n", i*4, *ptr);
+		}
+
+		drm_intel_bo_unmap(batch->bo);
+	}
+
 	intel_be_batchbuffer_reset(batch);
 
 	if (fence) {
diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_device.c b/src/gallium/winsys/drm/intel/gem/intel_be_device.c
index c7e8827..512bd41 100644
--- a/src/gallium/winsys/drm/intel/gem/intel_be_device.c
+++ b/src/gallium/winsys/drm/intel/gem/intel_be_device.c
@@ -340,6 +340,7 @@ intel_be_init_device(struct intel_be_device *dev, int fd, unsigned id)
 	dev->pools.gem = drm_intel_bufmgr_gem_init(dev->fd, dev->max_batch_size);
 
 	dev->softpipe = debug_get_bool_option("INTEL_SOFTPIPE", FALSE);
+	dev->dump_cmd = debug_get_bool_option("INTEL_DUMP_CMD", FALSE);
 
 	return true;
 }
diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_device.h b/src/gallium/winsys/drm/intel/gem/intel_be_device.h
index 3f3f2a7..c397048 100644
--- a/src/gallium/winsys/drm/intel/gem/intel_be_device.h
+++ b/src/gallium/winsys/drm/intel/gem/intel_be_device.h
@@ -19,6 +19,7 @@ struct intel_be_device
 	struct pipe_winsys base;
 
 	boolean softpipe;
+	boolean dump_cmd;
 
 	int fd; /**< Drm file discriptor */
 




More information about the mesa-commit mailing list