From 66b00380a251b14b7622edadb5e7c9344d0f1d5b Mon Sep 17 00:00:00 2001 From: Jakob Bornecrantz Date: Wed, 5 Aug 2009 23:56:08 +0100 Subject: i915g: Switch to mapping the batch buffer instead of using subdata --- .../winsys/drm/intel/gem/intel_be_batchbuffer.c | 36 +++++++++++++++------- 1 file changed, 25 insertions(+), 11 deletions(-) (limited to 'src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c') 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 d5e63c3bae..ef4d39348a 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) { -- cgit v1.2.3 From b6c9401f138720adaebde90ec7b1805eae441fc7 Mon Sep 17 00:00:00 2001 From: Jakob Bornecrantz Date: Thu, 6 Aug 2009 00:28:15 +0100 Subject: i915g: Always run in sync with the HW --- src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c') 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 ef4d39348a..39032e5ae2 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c +++ b/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c @@ -121,6 +121,10 @@ intel_be_batchbuffer_flush(struct intel_be_batchbuffer *batch, debug_printf("\t%08x: %08x\n", i*4, *ptr); } + drm_intel_bo_unmap(batch->bo); + } else { + /* TODO figgure out why the gpu hangs if we don't run sync */ + drm_intel_bo_map(batch->bo, FALSE); drm_intel_bo_unmap(batch->bo); } -- cgit v1.2.3 From 738e02c3c813ca290ec5e7596c5870adde3a3808 Mon Sep 17 00:00:00 2001 From: Jakob Bornecrantz Date: Sat, 8 Aug 2009 03:19:01 +0200 Subject: i915g: Don't try to free a mapped buffer at shutdown --- src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c | 1 - 1 file changed, 1 deletion(-) (limited to 'src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c') 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 39032e5ae2..66cb7fb946 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c +++ b/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c @@ -152,6 +152,5 @@ intel_be_batchbuffer_free(struct intel_be_batchbuffer *batch) if (batch->bo) drm_intel_bo_unreference(batch->bo); - free(batch->base.map); free(batch); } -- cgit v1.2.3 From 164d8e87010f245efbc8eced9625db5c22928742 Mon Sep 17 00:00:00 2001 From: Jakob Bornecrantz Date: Sat, 8 Aug 2009 17:20:46 +0200 Subject: i915g: Reduce max relocs --- src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c') 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 66cb7fb946..c4a79586e6 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c +++ b/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c @@ -21,7 +21,7 @@ intel_be_batchbuffer_alloc(struct intel_be_context *intel) batch->base.size = 0; batch->base.actual_size = intel->device->max_batch_size; batch->base.relocs = 0; - batch->base.max_relocs = 500;/*INTEL_DEFAULT_RELOCS;*/ + batch->base.max_relocs = 100;/*INTEL_DEFAULT_RELOCS;*/ batch->intel = intel; batch->device = intel->device; -- cgit v1.2.3