xf86-video-intel: 8 commits - src/intel_display.c src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/sna_damage.c src/sna/sna_damage.h src/sna/sna_dri.c src/sna/sna_glyphs.c src/sna/sna_render.c src/sna/sna_render.h src/sna/sna_trapezoids.c

Chris Wilson ickle at kemper.freedesktop.org
Wed Jul 13 13:12:30 PDT 2011


 src/intel_display.c      |    7 +++++
 src/sna/gen2_render.c    |   23 +++++++++++++++++++
 src/sna/gen3_render.c    |   55 ++++++++++++++++++++++++++++-------------------
 src/sna/gen4_render.c    |    3 +-
 src/sna/gen5_render.c    |    3 +-
 src/sna/gen6_render.c    |    3 +-
 src/sna/sna_damage.c     |   23 +++++++++++++++++++
 src/sna/sna_damage.h     |   17 +++++++++++++-
 src/sna/sna_dri.c        |   36 +++++++++++-------------------
 src/sna/sna_glyphs.c     |    4 ++-
 src/sna/sna_render.c     |   10 +++++---
 src/sna/sna_render.h     |    2 +
 src/sna/sna_trapezoids.c |    2 -
 13 files changed, 134 insertions(+), 54 deletions(-)

New commits:
commit 212fa9868767637e8f430485eeb522c99e63fd16
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jul 13 21:11:14 2011 +0100

    Disable adding normal RTF modes for an eDP
    
    This is causing a hard hang with 2.6.39+, we don't know why so play safe
    and disable for the time being.
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=38012
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_display.c b/src/intel_display.c
index e75819d..84c7c08 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -693,8 +693,13 @@ intel_crtc_init(ScrnInfoPtr scrn, struct intel_mode *mode, int num)
 static Bool
 is_panel(int type)
 {
+#if 0
+	/* XXX https://bugs.freedesktop.org/show_bug.cgi?id=38012 */
 	return (type == DRM_MODE_CONNECTOR_LVDS ||
-	       	type == DRM_MODE_CONNECTOR_eDP);
+		type == DRM_MODE_CONNECTOR_eDP);
+#else
+	return type == DRM_MODE_CONNECTOR_LVDS;
+#endif
 }
 
 static xf86OutputStatus
commit 7a695c9f6b919eba8785d62094526762ba2a0449
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jul 13 10:57:13 2011 +0100

    sna: Fast-path single span boxes
    
    These are very common when compositing unclipped trapezoids, and the
    majority of the overhead is in handling the arbitrary number of boxes
    and misses out on the constant folding the compiler can do if it is
    known we have just one box.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index e6d6fe3..021ce79 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1560,6 +1560,28 @@ static void gen2_emit_composite_spans_state(struct sna *sna,
 }
 
 static void
+gen2_render_composite_spans_box(struct sna *sna,
+				const struct sna_composite_spans_op *op,
+				const BoxRec *box, float opacity)
+{
+	DBG(("%s: nbox=%d, src=+(%d, %d), opacity=%f, dst=+(%d, %d), box=(%d, %d) x (%d, %d)\n",
+	     __FUNCTION__,
+	     op->base.src.offset[0], op->base.src.offset[1],
+	     opacity,
+	     op->base.dst.x, op->base.dst.y,
+	     box->x1, box->y1,
+	     box->x2 - box->x1,
+	     box->y2 - box->y1));
+
+	if (gen2_get_rectangles(sna, &op->base, 1) == 0) {
+		gen2_emit_composite_spans_state(sna, op);
+		gen2_get_rectangles(sna, &op->base, 1);
+	}
+
+	op->prim_emit(sna, op, box, opacity);
+}
+
+static void
 gen2_render_composite_spans_boxes(struct sna *sna,
 				  const struct sna_composite_spans_op *op,
 				  const BoxRec *box, int nbox,
@@ -1689,6 +1711,7 @@ gen2_render_composite_spans(struct sna *sna,
 		}
 	}
 
+	tmp->box   = gen2_render_composite_spans_box;
 	tmp->boxes = gen2_render_composite_spans_boxes;
 	tmp->done  = gen2_render_composite_spans_done;
 
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index fa72b91..916f7d8 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2561,6 +2561,28 @@ gen3_emit_composite_spans_primitive(struct sna *sna,
 }
 
 static void
+gen3_render_composite_spans_box(struct sna *sna,
+				const struct sna_composite_spans_op *op,
+				const BoxRec *box, float opacity)
+{
+	DBG(("%s: src=+(%d, %d), opacity=%f, dst=+(%d, %d), box=(%d, %d) x (%d, %d)\n",
+	     __FUNCTION__,
+	     op->base.src.offset[0], op->base.src.offset[1],
+	     opacity,
+	     op->base.dst.x, op->base.dst.y,
+	     box->x1, box->y1,
+	     box->x2 - box->x1,
+	     box->y2 - box->y1));
+
+	if (gen3_get_rectangles(sna, &op->base, 1) == 0) {
+		gen3_emit_composite_state(sna, &op->base);
+		gen3_get_rectangles(sna, &op->base, 1);
+	}
+
+	op->prim_emit(sna, op, box, opacity);
+}
+
+static void
 gen3_render_composite_spans_boxes(struct sna *sna,
 				  const struct sna_composite_spans_op *op,
 				  const BoxRec *box, int nbox,
@@ -2707,6 +2729,7 @@ gen3_render_composite_spans(struct sna *sna,
 	tmp->base.floats_per_vertex +=
 		tmp->base.mask.u.gen3.type == SHADER_OPACITY;
 
+	tmp->box   = gen3_render_composite_spans_box;
 	tmp->boxes = gen3_render_composite_spans_boxes;
 	tmp->done  = gen3_render_composite_spans_done;
 
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index 8330395..6188168 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -127,6 +127,8 @@ struct sna_composite_op {
 struct sna_composite_spans_op {
 	struct sna_composite_op base;
 
+	void (*box)(struct sna *sna, const struct sna_composite_spans_op *op,
+		    const BoxRec *box, float opacity);
 	void (*boxes)(struct sna *sna, const struct sna_composite_spans_op *op,
 		      const BoxRec *box, int nbox,
 		      float opacity);
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index c6645aa..67cb353 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -1253,7 +1253,7 @@ tor_blt_span(struct sna *sna,
 {
 	DBG(("%s: %d -> %d @ %d\n", __FUNCTION__, box->x1, box->x2, coverage));
 
-	op->boxes(sna, op, box, 1, AREA_TO_ALPHA(coverage));
+	op->box(sna, op, box, AREA_TO_ALPHA(coverage));
 	apply_damage_box(&op->base, box);
 }
 
commit 0190964906ad878d469d6021c10cde4e7f5799c3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jul 13 10:26:44 2011 +0100

    sna/damage: Avoid testing against a completey damaged region
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index e9e1cef..fa72b91 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2060,20 +2060,14 @@ gen3_composite_set_target(struct sna *sna,
 	op->dst.height = op->dst.pixmap->drawable.height;
 	priv = sna_pixmap(op->dst.pixmap);
 
-	op->dst.bo = NULL;
-	if (priv && priv->gpu_bo == NULL) {
-		op->dst.bo = priv->cpu_bo;
-		op->damage = &priv->cpu_damage;
-	}
-	if (op->dst.bo == NULL) {
-		priv = sna_pixmap_force_to_gpu(op->dst.pixmap);
-		if (priv == NULL)
-			return FALSE;
+	priv = sna_pixmap_force_to_gpu(op->dst.pixmap);
+	if (priv == NULL)
+		return FALSE;
 
-		op->dst.bo = priv->gpu_bo;
-		if (!priv->gpu_only)
-			op->damage = &priv->gpu_damage;
-	}
+	op->dst.bo = priv->gpu_bo;
+	if (!priv->gpu_only &&
+	    !sna_damage_is_all(&priv->gpu_damage, op->dst.width, op->dst.height))
+		op->damage = &priv->gpu_damage;
 
 	get_drawable_deltas(dst->pDrawable, op->dst.pixmap,
 			    &op->dst.x, &op->dst.y);
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index 15343ee..7555533 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1839,7 +1839,8 @@ gen4_composite_set_target(struct sna *sna,
 		return FALSE;
 
 	op->dst.bo = priv->gpu_bo;
-	if (!priv->gpu_only)
+	if (!priv->gpu_only &&
+	    !sna_damage_is_all(&priv->gpu_damage, op->dst.width, op->dst.height))
 		op->damage = &priv->gpu_damage;
 
 	get_drawable_deltas(dst->pDrawable, op->dst.pixmap,
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index de0d67a..b282666 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -1855,7 +1855,8 @@ gen5_composite_set_target(struct sna *sna,
 
 
 	op->dst.bo = priv->gpu_bo;
-	if (!priv->gpu_only)
+	if (!priv->gpu_only &&
+	    !sna_damage_is_all(&priv->gpu_damage, op->dst.width, op->dst.height))
 		op->damage = &priv->gpu_damage;
 
 	DBG(("%s: bo=%p, damage=%p\n", __FUNCTION__, op->dst.bo, op->damage));
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 0b6f995..7b22ea2 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2049,7 +2049,8 @@ gen6_composite_set_target(struct sna *sna,
 			return FALSE;
 
 		op->dst.bo = priv->gpu_bo;
-		if (!priv->gpu_only)
+		if (!priv->gpu_only &&
+		    !sna_damage_is_all(&priv->gpu_damage, op->dst.width, op->dst.height))
 			op->damage = &priv->gpu_damage;
 	}
 
diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c
index 63e8341..64b0c9e 100644
--- a/src/sna/sna_damage.c
+++ b/src/sna/sna_damage.c
@@ -134,6 +134,7 @@ static struct sna_damage *_sna_damage_create(void)
 	struct sna_damage *damage;
 
 	damage = malloc(sizeof(*damage));
+	damage->all = 0;
 	damage->n = 0;
 	damage->size = 16;
 	damage->elts = malloc(sizeof(*damage->elts) * damage->size);
@@ -454,16 +455,37 @@ struct sna_damage *_sna_damage_all(struct sna_damage *damage,
 		pixman_region_fini(&damage->region);
 		damage->n = 0;
 		damage->last_box = NULL;
+		damage->all = 1;
 	} else
 		damage = _sna_damage_create();
 
 	pixman_region_init_rect(&damage->region, 0, 0, width, height);
 	damage->extents = damage->region.extents;
 	damage->mode = ADD;
+	damage->all = 1;
 
 	return damage;
 }
 
+struct sna_damage *_sna_damage_is_all(struct sna_damage *damage,
+				      int width, int height)
+{
+	BoxRec box;
+
+	if (damage->mode == SUBTRACT)
+		__sna_damage_reduce(damage);
+
+	box.x1 = box.y1 = 0;
+	box.x2 = width;
+	box.y2 = height;
+	
+	if (pixman_region_contains_rectangle(&damage->region,
+					     &box) != PIXMAN_REGION_IN)
+		return damage;
+
+	return _sna_damage_all(damage, width, height);
+}
+
 static inline Bool sna_damage_maybe_contains_box(struct sna_damage *damage,
 						 const BoxRec *box)
 {
@@ -516,6 +538,7 @@ static struct sna_damage *__sna_damage_subtract(struct sna_damage *damage,
 		}
 	}
 
+	damage->all = 0;
 	damage->mode = SUBTRACT;
 	_sna_damage_create_elt(damage, SUBTRACT,
 			       REGION_RECTS(region),
diff --git a/src/sna/sna_damage.h b/src/sna/sna_damage.h
index c5dfa7f..5fb9aef 100644
--- a/src/sna/sna_damage.h
+++ b/src/sna/sna_damage.h
@@ -11,7 +11,7 @@ struct sna_damage_box;
 
 struct sna_damage {
 	BoxRec extents;
-	int n, size, mode;
+	int n, size, mode, all;
 	pixman_region16_t region;
 	struct sna_damage_elt *elts;
 	struct sna_damage_box *last_box;
@@ -34,6 +34,21 @@ static inline void sna_damage_add_box(struct sna_damage **damage,
 	*damage = _sna_damage_add_box(*damage, box);
 }
 
+struct sna_damage *_sna_damage_is_all(struct sna_damage *damage,
+				       int width, int height);
+static inline bool sna_damage_is_all(struct sna_damage **damage,
+				     int width, int height)
+{
+	if (*damage == NULL)
+		return false;
+
+	if ((*damage)->all)
+		return true;
+
+	*damage = _sna_damage_is_all(*damage, width, height);
+	return (*damage)->all;
+}
+
 struct sna_damage *_sna_damage_all(struct sna_damage *damage,
 				   int width, int height);
 static inline void sna_damage_all(struct sna_damage **damage,
commit b929717c89352d4b47dc2b9ce58e26fbbf327201
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jul 13 09:49:09 2011 +0100

    sna/gen3: Tune emit_spans_primitive_constant
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 7665cdc..e9e1cef 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2410,16 +2410,10 @@ gen3_emit_composite_spans_primitive_constant(struct sna *sna,
 	sna->render.vertex_used += 9;
 
 	v[0] = op->base.dst.x + box->x2;
-	v[1] = op->base.dst.y + box->y2;
-	v[2] = opacity;
-
-	v[3] = op->base.dst.x + box->x1;
-	v[4] = v[1];
-	v[5] = opacity;
-
-	v[6] = v[3];
+	v[6] = v[3] = op->base.dst.x + box->x1;
+	v[4] = v[1] = op->base.dst.y + box->y2;
 	v[7] = op->base.dst.y + box->y1;
-	v[8] = opacity;
+	v[8] = v[5] = v[2] = opacity;
 }
 
 static void
commit fbdbfaf38d4da5204750d91cf5a3f43307a6ac33
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jul 13 17:38:41 2011 +0100

    sna/glyphs: Discard GLYPH_PICTURE hint if the glyph doesn't fit into the cache
    
    If the glyph is too big to fit into the cache, than ideally we do want
    to keep an associated GPU bo around for future use. As it is too large
    to fit into the cache, it of reasonable size and there is little wastage
    in allocating indiviual GPU bo for each oversized glyph.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index 224154e..87a6719 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -305,8 +305,10 @@ glyph_cache(ScreenPtr screen,
 	int size, mask, pos, s;
 
 	if (glyph->info.width > GLYPH_MAX_SIZE ||
-	    glyph->info.height > GLYPH_MAX_SIZE)
+	    glyph->info.height > GLYPH_MAX_SIZE) {
+		((PixmapPtr)glyph_picture->pDrawable)->usage_hint = 0;
 		return FALSE;
+	}
 
 	for (size = GLYPH_MIN_SIZE; size <= GLYPH_MAX_SIZE; size *= 2)
 		if (glyph->info.width <= size && glyph->info.height <= size)
commit 12f52530db1727e2f835e55dc922e5efaf4d3a16
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Wed Jul 13 17:38:22 2011 +0100

    sna: Add some extra debugging to the texture upload fallback paths
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index 74a4ded..113f9ec 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -410,17 +410,21 @@ sna_render_pixmap_bo(struct sna *sna,
 		}
 
 		if (bo == NULL) {
-			DBG(("%s: uploading CPU box\n", __FUNCTION__));
+			DBG(("%s: uploading CPU box (%d, %d), (%d, %d)\n",
+			     __FUNCTION__, box.x1, box.y1, box.x2, box.y2));
 			bo = upload(sna, channel, pixmap, x,y, w,h, &box);
 		}
 	}
 
 	if (bo == NULL) {
 		priv = sna_pixmap_force_to_gpu(pixmap);
-		if (priv)
+		if (priv) {
 			bo = kgem_bo_reference(priv->gpu_bo);
-		else
+		} else {
+			DBG(("%s: failed to upload pixmap to gpu, uploading CPU box (%d, %d), (%d, %d) instead\n",
+			     __FUNCTION__, box.x1, box.y1, box.x2, box.y2));
 			bo = upload(sna, channel, pixmap, x,y, w,h, &box);
+		}
 	}
 
 	channel->bo = bo;
commit a861094c23b5f0df7b889bcc03904e32c4c2c6be
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jul 12 20:17:00 2011 +0100

    sna/dri: Fix a couple of typos
    
    Somehow these were lost in the rebasing.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index b3b029c..ec65642 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -1421,7 +1421,7 @@ blit:
 						   draw->depth,
 						   SNA_CREATE_FB))) {
 			DBG(("%s: new back buffer\n", __FUNCTION__));
-			set_pixmap(sna, front, pixamp);
+			set_pixmap(sna, front, pixmap);
 		}
 	} else if (info->type != DRI2_ASYNC_FLIP) {
 		/* A normal vsync'ed client is finishing, wait for it
@@ -1437,7 +1437,7 @@ blit:
 					   draw->depth,
 					   SNA_CREATE_FB))) {
 		DBG(("%s: new back buffer\n", __FUNCTION__));
-		set_pixmap(sna, front, pixamp);
+		set_pixmap(sna, front, pixmap);
 	}
 
 exchange:
commit c221d0356db57c10f5d29ca17fdf592724b35385
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Tue Jul 12 15:39:42 2011 +0100

    sna/dri: Remove the unused id/type members for Resource tracking
    
    ...and reduce it to a simple list.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 40c9875..b3b029c 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -93,12 +93,6 @@ struct sna_dri_private {
 	struct kgem_bo *bo;
 };
 
-struct sna_dri_resource {
-	XID id;
-	RESTYPE type;
-	struct list list;
-};
-
 struct sna_dri_frame_event {
 	struct sna *sna;
 	XID drawable_id;
@@ -541,10 +535,10 @@ sna_dri_get_pipe(DrawablePtr pDraw)
 
 static RESTYPE frame_event_client_type, frame_event_drawable_type;
 
-static struct sna_dri_resource *
+static struct list *
 get_resource(XID id, RESTYPE type)
 {
-	struct sna_dri_resource *resource;
+	struct list *resource;
 	void *ptr;
 
 	ptr = NULL;
@@ -563,22 +557,20 @@ get_resource(XID id, RESTYPE type)
 		return NULL;
 	}
 
-	resource->id = id;
-	resource->type = type;
-	list_init(&resource->list);
+	list_init(resource);
 	return resource;
 }
 
 static int
 sna_dri_frame_event_client_gone(void *data, XID id)
 {
-	struct sna_dri_resource *resource = data;
+	struct list *resource = data;
 
 	DBG(("%s(%ld)\n", __FUNCTION__, (long)id));
 
-	while (!list_is_empty(&resource->list)) {
+	while (!list_is_empty(resource)) {
 		struct sna_dri_frame_event *info =
-			list_first_entry(&resource->list,
+			list_first_entry(resource,
 					 struct sna_dri_frame_event,
 					 client_resource);
 
@@ -593,13 +585,13 @@ sna_dri_frame_event_client_gone(void *data, XID id)
 static int
 sna_dri_frame_event_drawable_gone(void *data, XID id)
 {
-	struct sna_dri_resource *resource = data;
+	struct list *resource = data;
 
 	DBG(("%s(%ld)\n", __FUNCTION__, (long)id));
 
-	while (!list_is_empty(&resource->list)) {
+	while (!list_is_empty(resource)) {
 		struct sna_dri_frame_event *info =
-			list_first_entry(&resource->list,
+			list_first_entry(resource,
 					 struct sna_dri_frame_event,
 					 drawable_resource);
 
@@ -646,7 +638,7 @@ get_client_id(ClientPtr client)
 static Bool
 sna_dri_add_frame_event(struct sna_dri_frame_event *info)
 {
-	struct sna_dri_resource *resource;
+	struct list *resource;
 
 	resource = get_resource(get_client_id(info->client),
 				frame_event_client_type);
@@ -655,7 +647,7 @@ sna_dri_add_frame_event(struct sna_dri_frame_event *info)
 		return FALSE;
 	}
 
-	list_add(&info->client_resource, &resource->list);
+	list_add(&info->client_resource, resource);
 
 	resource = get_resource(info->drawable_id, frame_event_drawable_type);
 	if (resource == NULL) {
@@ -664,7 +656,7 @@ sna_dri_add_frame_event(struct sna_dri_frame_event *info)
 		return FALSE;
 	}
 
-	list_add(&info->drawable_resource, &resource->list);
+	list_add(&info->drawable_resource, resource);
 
 	return TRUE;
 }


More information about the xorg-commit mailing list