xf86-video-intel: 2 commits - src/sna/gen6_render.c src/sna/kgem.c src/sna/kgem_debug_gen3.c src/sna/kgem_debug_gen4.c src/sna/kgem_debug_gen5.c src/sna/kgem.h

Chris Wilson ickle at kemper.freedesktop.org
Wed Jan 11 04:49:21 PST 2012


 src/sna/gen6_render.c     |   44 ++++++++++++++++++++++++++++++++++++++++++--
 src/sna/kgem.c            |   46 +++++++++++++++++++++++++++++++---------------
 src/sna/kgem.h            |    1 +
 src/sna/kgem_debug_gen3.c |    2 +-
 src/sna/kgem_debug_gen4.c |    4 ++--
 src/sna/kgem_debug_gen5.c |    2 +-
 6 files changed, 78 insertions(+), 21 deletions(-)

New commits:
commit e94807759eb6cfb10bd2d372fa71cc64a730bc7c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jan 11 12:13:18 2012 +0000

    sna/gen6: Special case spans with no transform
    
    As the no transform is a special case of affine, we were attempting to
    deference the NULL transform in order to determine if it was a simple
    no-rotation matrix. As the operation is extremely simple, add a special
    case vertex program to speed it up.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 38d7f96..c7d4e7b 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2603,6 +2603,44 @@ gen6_emit_composite_spans_solid(struct sna *sna,
 }
 
 fastcall static void
+gen6_emit_composite_spans_identity(struct sna *sna,
+				   const struct sna_composite_spans_op *op,
+				   const BoxRec *box,
+				   float opacity)
+{
+	float *v;
+	union {
+		struct sna_coordinate p;
+		float f;
+	} dst;
+
+	float sx = op->base.src.scale[0];
+	float sy = op->base.src.scale[1];
+	int16_t tx = op->base.src.offset[0];
+	int16_t ty = op->base.src.offset[1];
+
+	v = sna->render.vertex_data + sna->render.vertex_used;
+	sna->render.vertex_used += 3*5;
+
+	dst.p.x = box->x2;
+	dst.p.y = box->y2;
+	v[0] = dst.f;
+	v[1] = (box->x2 + tx) * sx;
+	v[7] = v[2] = (box->y2 + ty) * sy;
+	v[13] = v[8] = v[3] = opacity;
+	v[9] = v[4] = 1;
+
+	dst.p.x = box->x1;
+	v[5] = dst.f;
+	v[11] = v[6] = (box->x1 + tx) * sx;
+
+	dst.p.y = box->y1;
+	v[10] = dst.f;
+	v[12] = (box->y1 + ty) * sy;
+	v[14] = 0;
+}
+
+fastcall static void
 gen6_emit_composite_spans_simple(struct sna *sna,
 				 const struct sna_composite_spans_op *op,
 				 const BoxRec *box,
@@ -2795,9 +2833,11 @@ gen6_render_composite_spans(struct sna *sna,
 	gen6_composite_alpha_gradient_init(sna, &tmp->base.mask);
 
 	tmp->prim_emit = gen6_emit_composite_spans_primitive;
-	if (tmp->base.src.is_solid)
+	if (tmp->base.src.is_solid) {
 		tmp->prim_emit = gen6_emit_composite_spans_solid;
-	else if (tmp->base.is_affine) {
+	} else if (tmp->base.src.transform == NULL) {
+		tmp->prim_emit = gen6_emit_composite_spans_identity;
+	} else if (tmp->base.is_affine) {
 		if (tmp->base.src.transform->matrix[0][1] == 0 &&
 		    tmp->base.src.transform->matrix[1][0] == 0) {
 			tmp->base.src.scale[0] /= tmp->base.src.transform->matrix[2][2];
commit 0a5313900ec9a7c499eb5051f3a5f078a9b0bbde
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jan 11 12:09:13 2012 +0000

    sna: Explicitly retire the bo following a serialisation point
    
    This is to keep the sanity checks in order, but conceptually should be
    useful as well.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index aa98cea..f7bf116 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -284,6 +284,20 @@ kgem_busy(struct kgem *kgem, int handle)
 	return busy.busy;
 }
 
+static void kgem_bo_retire(struct kgem *kgem, struct kgem_bo *bo)
+{
+	assert(!kgem_busy(kgem, bo->handle));
+
+	if (bo->domain == DOMAIN_GPU)
+		kgem_retire(kgem);
+
+	if (bo->exec == NULL) {
+		bo->rq = NULL;
+		list_del(&bo->request);
+		bo->needs_flush = bo->flush;
+	}
+}
+
 Bool kgem_bo_write(struct kgem *kgem, struct kgem_bo *bo,
 		   const void *data, int length)
 {
@@ -295,9 +309,7 @@ Bool kgem_bo_write(struct kgem *kgem, struct kgem_bo *bo,
 		return FALSE;
 
 	DBG(("%s: flush=%d, domain=%d\n", __FUNCTION__, bo->flush, bo->domain));
-	bo->needs_flush = bo->flush;
-	if (bo->domain == DOMAIN_GPU)
-		kgem_retire(kgem);
+	kgem_bo_retire(kgem, bo);
 	bo->domain = DOMAIN_NONE;
 	return TRUE;
 }
@@ -2556,7 +2568,8 @@ void *kgem_bo_map(struct kgem *kgem, struct kgem_bo *bo, int prot)
 {
 	void *ptr;
 
-	assert(bo->refcnt || bo->exec); /* allow for debugging purposes */
+	assert(bo->refcnt);
+	assert(bo->exec == NULL);
 	assert(!bo->purged);
 	assert(list_is_empty(&bo->list));
 
@@ -2595,15 +2608,23 @@ void *kgem_bo_map(struct kgem *kgem, struct kgem_bo *bo, int prot)
 		set_domain.write_domain = I915_GEM_DOMAIN_GTT;
 		drmIoctl(kgem->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain);
 
-		bo->needs_flush = bo->flush;
-		if (bo->domain == DOMAIN_GPU)
-			kgem_retire(kgem);
+		kgem_bo_retire(kgem, bo);
 		bo->domain = DOMAIN_GTT;
 	}
 
 	return ptr;
 }
 
+void *kgem_bo_map__debug(struct kgem *kgem, struct kgem_bo *bo)
+{
+	if (bo->map)
+		return bo->map;
+
+	kgem_trim_vma_cache(kgem, MAP_GTT, bo->bucket);
+	return bo->map = gem_mmap(kgem->fd, bo->handle, bo->size,
+				  PROT_READ | PROT_WRITE);
+}
+
 void *kgem_bo_map__cpu(struct kgem *kgem, struct kgem_bo *bo)
 {
 	struct drm_i915_gem_mmap mmap_arg;
@@ -2753,10 +2774,8 @@ void kgem_bo_sync__cpu(struct kgem *kgem, struct kgem_bo *bo)
 		set_domain.write_domain = I915_GEM_DOMAIN_CPU;
 
 		drmIoctl(kgem->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain);
-		assert(!kgem_busy(kgem, bo->handle));
-		bo->needs_flush = bo->flush;
-		if (bo->domain == DOMAIN_GPU)
-			kgem_retire(kgem);
+
+		kgem_bo_retire(kgem, bo);
 		bo->domain = DOMAIN_CPU;
 	}
 }
@@ -3208,10 +3227,7 @@ void kgem_buffer_read_sync(struct kgem *kgem, struct kgem_bo *_bo)
 		gem_read(kgem->fd,
 			 bo->base.handle, (char *)(bo+1)+offset,
 			 offset, length);
-		assert(!kgem_busy(kgem, bo->base.handle));
-		bo->base.needs_flush = bo->base.flush;
-		if (bo->base.domain == DOMAIN_GPU)
-			kgem_retire(kgem);
+		kgem_bo_retire(kgem, &bo->base);
 		bo->base.domain = DOMAIN_NONE;
 	} else
 		kgem_bo_sync__cpu(kgem, &bo->base);
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 1bc0d9b..d6fdfbc 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -344,6 +344,7 @@ uint32_t kgem_add_reloc(struct kgem *kgem,
 			uint32_t delta);
 
 void *kgem_bo_map(struct kgem *kgem, struct kgem_bo *bo, int prot);
+void *kgem_bo_map__debug(struct kgem *kgem, struct kgem_bo *bo);
 void *kgem_bo_map__cpu(struct kgem *kgem, struct kgem_bo *bo);
 void kgem_bo_sync__cpu(struct kgem *kgem, struct kgem_bo *bo);
 uint32_t kgem_bo_flink(struct kgem *kgem, struct kgem_bo *bo);
diff --git a/src/sna/kgem_debug_gen3.c b/src/sna/kgem_debug_gen3.c
index 213c69f..969b1d1 100644
--- a/src/sna/kgem_debug_gen3.c
+++ b/src/sna/kgem_debug_gen3.c
@@ -97,7 +97,7 @@ static void gen3_update_vertex_buffer_addr(struct kgem *kgem,
 			if (bo->handle == handle)
 				break;
 		assert(&bo->request != &kgem->next_request->buffers);
-		base = kgem_bo_map(kgem, bo, PROT_READ);
+		base = kgem_bo_map__debug(kgem, bo);
 	}
 	ptr = (char *)base + kgem->reloc[i].delta;
 
diff --git a/src/sna/kgem_debug_gen4.c b/src/sna/kgem_debug_gen4.c
index 0004ecf..53c350b 100644
--- a/src/sna/kgem_debug_gen4.c
+++ b/src/sna/kgem_debug_gen4.c
@@ -84,7 +84,7 @@ static void gen4_update_vertex_buffer(struct kgem *kgem, const uint32_t *data)
 			if (bo->handle == reloc)
 				break;
 		assert(&bo->request != &kgem->next_request->buffers);
-		base = kgem_bo_map(kgem, bo, PROT_READ);
+		base = kgem_bo_map__debug(kgem, bo);
 	}
 	ptr = (char *)base + kgem->reloc[i].delta;
 
@@ -405,7 +405,7 @@ get_reloc(struct kgem *kgem,
 				if (bo->handle == handle)
 					break;
 			assert(&bo->request != &kgem->next_request->buffers);
-			base = kgem_bo_map(kgem, bo, PROT_READ);
+			base = kgem_bo_map__debug(kgem, bo);
 			r->bo = bo;
 			r->base = base;
 		}
diff --git a/src/sna/kgem_debug_gen5.c b/src/sna/kgem_debug_gen5.c
index 7912cc9..f21220f 100644
--- a/src/sna/kgem_debug_gen5.c
+++ b/src/sna/kgem_debug_gen5.c
@@ -78,7 +78,7 @@ static void gen5_update_vertex_buffer(struct kgem *kgem, const uint32_t *data)
 		size = kgem->nbatch * sizeof(uint32_t);
 	} else {
 		bo = kgem_debug_get_bo_for_reloc_entry(kgem, reloc);
-		base = kgem_bo_map(kgem, bo, PROT_READ);
+		base = kgem_bo_map__debug(kgem, bo);
 		size = bo->size;
 	}
 	ptr = (char *)base + reloc->delta;


More information about the xorg-commit mailing list