xf86-video-intel: 6 commits - src/sna/sna_accel.c src/sna/sna_composite.c src/sna/sna_dri.c src/sna/sna.h src/sna/sna_trapezoids.c

Chris Wilson ickle at kemper.freedesktop.org
Thu Jan 17 05:19:01 PST 2013


 src/sna/sna.h            |    1 
 src/sna/sna_accel.c      |  115 +++++++++++++++--------------------------------
 src/sna/sna_composite.c  |    2 
 src/sna/sna_dri.c        |    2 
 src/sna/sna_trapezoids.c |    3 -
 5 files changed, 40 insertions(+), 83 deletions(-)

New commits:
commit 1ee00c408d8142cfaf4202393c2364c9ae73cb6e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jan 17 13:09:47 2013 +0000

    sna/trapezoids: Fix horizontal offset for inplace operation
    
    Remember that for an inplace operation we are not dealing with an a8
    mask, but rather a x8r8g8b8 surface and so need to step accordingly.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 266983e..2a51598 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -5193,7 +5193,7 @@ trapezoid_span_inplace__x8r8g8b8(CARD8 op,
 			struct inplace inplace;
 
 			inplace.ptr = pixmap->devPrivate.ptr;
-			inplace.ptr += dst_y * pixmap->devKind + dst_x;
+			inplace.ptr += dst_y * pixmap->devKind + dst_x * 4;
 			inplace.stride = pixmap->devKind;
 			inplace.color = color;
 
commit 0d749f93ea52161e59da1adca1a22e96ba293551
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jan 17 12:28:18 2013 +0000

    sna: Drop the MOVE_WHOLE_HINT for PutImage
    
    It is not as clearly beneficial as for GetImage, as for example toolkits
    may only push the shadows around a window.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index e485248..1e6289d 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3403,8 +3403,6 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 		    int x, int y, int w, int  h, char *bits, int stride)
 {
 	PixmapPtr pixmap = get_drawable_pixmap(drawable);
-	struct sna *sna = to_sna_from_pixmap(pixmap);
-	struct sna_pixmap *priv = sna_pixmap(pixmap);
 	BoxRec *box;
 	int16_t dx, dy;
 	int n;
@@ -3414,21 +3412,12 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 	if (gc->alu != GXcopy)
 		return false;
 
-	if (priv) {
-		unsigned flags = MOVE_WRITE;
-		if (w == pixmap->drawable.width) {
-			flags |= MOVE_WHOLE_HINT;
-			if (h != pixmap->drawable.height)
-				flags |= MOVE_READ;
-		}
+	if (drawable->depth < 8)
+		return false;
 
-		if (!sna_drawable_move_region_to_cpu(&pixmap->drawable,
-						     region, flags))
-			return false;
-	} else {
-		if (drawable->depth < 8)
-			return false;
-	}
+	if (!sna_drawable_move_region_to_cpu(&pixmap->drawable,
+					     region, MOVE_WRITE))
+		return false;
 
 	get_drawable_deltas(drawable, pixmap, &dx, &dy);
 	x += dx + drawable->x;
commit dc643ef753bcfb69685f1eb10828d0c8f830c30e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jan 17 12:27:55 2013 +0000

    sna: Apply read-only synchronization hints for move-to-cpu
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 0294170..e485248 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1607,7 +1607,8 @@ skip_inplace_map:
 
 	if (priv->mapped) {
 		assert(!priv->shm);
-		pixmap->devPrivate.ptr = NULL;
+		pixmap->devPrivate.ptr = PTR(priv->ptr);
+		pixmap->devKind = priv->stride;
 		priv->mapped = false;
 	}
 
@@ -1637,7 +1638,8 @@ skip_inplace_map:
 				priv->clear = false;
 			}
 
-			kgem_bo_sync__cpu_full(&sna->kgem, priv->gpu_bo, flags & MOVE_WRITE);
+			kgem_bo_sync__cpu_full(&sna->kgem,
+					       priv->gpu_bo, flags & MOVE_WRITE);
 			assert_pixmap_damage(pixmap);
 			DBG(("%s: operate inplace (CPU)\n", __FUNCTION__));
 			return true;
@@ -1729,11 +1731,11 @@ skip_inplace_map:
 
 done:
 	if (flags & MOVE_WRITE) {
+		assert(DAMAGE_IS_ALL(priv->cpu_damage));
 		priv->source_count = SOURCE_BIAS;
 		assert(priv->gpu_bo == NULL || priv->gpu_bo->proxy == NULL);
 		if (priv->gpu_bo && priv->gpu_bo->domain != DOMAIN_GPU) {
 			DBG(("%s: discarding inactive GPU bo\n", __FUNCTION__));
-			assert(DAMAGE_IS_ALL(priv->cpu_damage));
 			sna_pixmap_free_gpu(sna, priv);
 		}
 	}
@@ -1741,7 +1743,8 @@ done:
 	if (priv->cpu_bo) {
 		if ((flags & MOVE_ASYNC_HINT) == 0) {
 			DBG(("%s: syncing CPU bo\n", __FUNCTION__));
-			kgem_bo_sync__cpu(&sna->kgem, priv->cpu_bo);
+			kgem_bo_sync__cpu_full(&sna->kgem,
+					       priv->cpu_bo, flags & MOVE_WRITE);
 		}
 		if (flags & MOVE_WRITE) {
 			DBG(("%s: discarding GPU bo in favour of CPU bo\n", __FUNCTION__));
@@ -2263,7 +2266,8 @@ out:
 	}
 	if ((flags & MOVE_ASYNC_HINT) == 0 && priv->cpu_bo) {
 		DBG(("%s: syncing cpu bo\n", __FUNCTION__));
-		kgem_bo_sync__cpu(&sna->kgem, priv->cpu_bo);
+		kgem_bo_sync__cpu_full(&sna->kgem,
+				       priv->cpu_bo, flags & MOVE_WRITE);
 		assert(!kgem_bo_is_busy(priv->cpu_bo));
 	}
 	priv->cpu = (flags & MOVE_ASYNC_HINT) == 0;
commit 18035a21e147788bea03ab2175ca03ae951701ce
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jan 17 11:52:10 2013 +0000

    sna: Remove the confusion of the pixmap->undamaged
    
    This was to track a pixmap that had been used for migration (i.e had in
    the past been used for mixed rendering). It is no longer used so remove
    it.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 112af35..8304f42 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -130,7 +130,6 @@ struct sna_pixmap {
 	uint8_t mapped :1;
 	uint8_t shm :1;
 	uint8_t clear :1;
-	uint8_t undamaged :1;
 	uint8_t header :1;
 	uint8_t cpu :1;
 };
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 70dedd1..0294170 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -530,7 +530,6 @@ static inline uint32_t default_tiling(PixmapPtr pixmap,
 		DBG(("%s: entire source is damaged, using Y-tiling\n",
 		     __FUNCTION__));
 		sna_damage_destroy(&priv->gpu_damage);
-		priv->undamaged = false;
 
 		return I915_TILING_Y;
 	}
@@ -1532,7 +1531,6 @@ _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int flags)
 				       pixmap->drawable.width,
 				       pixmap->drawable.height);
 			sna_damage_destroy(&priv->cpu_damage);
-			priv->undamaged = false;
 			priv->clear = false;
 			priv->cpu = false;
 			list_del(&priv->list);
@@ -1547,6 +1545,7 @@ _sna_pixmap_move_to_cpu(PixmapPtr pixmap, unsigned int flags)
 
 skip_inplace_map:
 		sna_damage_destroy(&priv->gpu_damage);
+		priv->clear = false;
 		if (priv->cpu_bo && !priv->cpu_bo->flush &&
 		    __kgem_bo_is_busy(&sna->kgem, priv->cpu_bo)) {
 			DBG(("%s: discarding busy CPU bo\n", __FUNCTION__));
@@ -1554,7 +1553,6 @@ skip_inplace_map:
 			assert(priv->gpu_bo == NULL || priv->gpu_damage == NULL);
 
 			sna_damage_destroy(&priv->cpu_damage);
-			priv->undamaged = false;
 
 			sna_pixmap_free_gpu(sna, priv);
 			sna_pixmap_free_cpu(sna, priv);
@@ -1596,7 +1594,6 @@ skip_inplace_map:
 				sna_damage_destroy(&priv->cpu_damage);
 				sna_pixmap_free_cpu(sna, priv);
 				list_del(&priv->list);
-				priv->undamaged = false;
 				priv->clear = false;
 			}
 
@@ -1637,7 +1634,6 @@ skip_inplace_map:
 				sna_damage_destroy(&priv->cpu_damage);
 				sna_pixmap_free_cpu(sna, priv);
 				list_del(&priv->list);
-				priv->undamaged = false;
 				priv->clear = false;
 			}
 
@@ -1648,7 +1644,8 @@ skip_inplace_map:
 		}
 	}
 
-	if (priv->clear && priv->cpu_bo && !priv->cpu_bo->flush &&
+	if (((flags & MOVE_READ) == 0 || priv->clear) &&
+	    priv->cpu_bo && !priv->cpu_bo->flush &&
 	    __kgem_bo_is_busy(&sna->kgem, priv->cpu_bo)) {
 		assert(!priv->shm);
 		sna_pixmap_free_cpu(sna, priv);
@@ -1685,7 +1682,7 @@ skip_inplace_map:
 			       pixmap->drawable.width,
 			       pixmap->drawable.height);
 		sna_pixmap_free_gpu(sna, priv);
-		priv->undamaged = false;
+		assert(priv->gpu_damage == NULL);
 		priv->clear = false;
 	}
 
@@ -1715,7 +1712,6 @@ skip_inplace_map:
 
 		__sna_damage_destroy(DAMAGE_PTR(priv->gpu_damage));
 		priv->gpu_damage = NULL;
-		priv->undamaged = true;
 	}
 
 	if (flags & MOVE_WRITE || priv->create & KGEM_CAN_CREATE_LARGE) {
@@ -1724,7 +1720,6 @@ skip_inplace_map:
 			       pixmap->drawable.width,
 			       pixmap->drawable.height);
 		sna_pixmap_free_gpu(sna, priv);
-		priv->undamaged = false;
 
 		if (priv->flush) {
 			assert(!priv->shm);
@@ -1740,7 +1735,6 @@ done:
 			DBG(("%s: discarding inactive GPU bo\n", __FUNCTION__));
 			assert(DAMAGE_IS_ALL(priv->cpu_damage));
 			sna_pixmap_free_gpu(sna, priv);
-			priv->undamaged = false;
 		}
 	}
 
@@ -1752,7 +1746,6 @@ done:
 		if (flags & MOVE_WRITE) {
 			DBG(("%s: discarding GPU bo in favour of CPU bo\n", __FUNCTION__));
 			sna_pixmap_free_gpu(sna, priv);
-			priv->undamaged = false;
 		}
 	}
 	priv->cpu = (flags & MOVE_ASYNC_HINT) == 0;
@@ -1892,7 +1885,6 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 		     __FUNCTION__, pixmap->drawable.serialNumber));
 
 		sna_damage_destroy(&priv->gpu_damage);
-		priv->undamaged = false;
 
 		if (flags & MOVE_WRITE)
 			sna_pixmap_free_gpu(sna, priv);
@@ -1953,7 +1945,6 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 					DBG(("%s: replaced entire pixmap, destroying CPU shadow\n",
 					     __FUNCTION__));
 					sna_damage_destroy(&priv->cpu_damage);
-					priv->undamaged = false;
 					list_del(&priv->list);
 				} else
 					sna_damage_subtract(&priv->cpu_damage,
@@ -1992,7 +1983,6 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 			sna_damage_all(&priv->gpu_damage,
 				       pixmap->drawable.width,
 				       pixmap->drawable.height);
-			priv->undamaged = false;
 			sna_pixmap_free_cpu(sna, priv);
 		}
 	}
@@ -2071,7 +2061,6 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 					       box, n);
 		}
 		sna_damage_destroy(&priv->gpu_damage);
-		priv->undamaged = true;
 	}
 
 	if (priv->gpu_damage &&
@@ -2183,7 +2172,6 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 				}
 
 				sna_damage_destroy(&priv->gpu_damage);
-				priv->undamaged = true;
 			} else if (DAMAGE_IS_ALL(priv->gpu_damage) ||
 				   sna_damage_contains_box__no_reduce(priv->gpu_damage,
 								      &r->extents)) {
@@ -2208,7 +2196,6 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 						       box, n);
 
 				sna_damage_subtract(&priv->gpu_damage, r);
-				priv->undamaged = true;
 			} else {
 				RegionRec need;
 
@@ -2235,7 +2222,6 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable,
 							       box, n);
 
 					sna_damage_subtract(&priv->gpu_damage, r);
-					priv->undamaged = true;
 					RegionUninit(&need);
 				}
 			}
@@ -2259,7 +2245,6 @@ done:
 				     __FUNCTION__));
 				sna_pixmap_free_gpu(sna, priv);
 			}
-			priv->undamaged = false;
 		}
 		if (priv->flush) {
 			assert(!priv->shm);
@@ -2410,7 +2395,6 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 			      pixmap->drawable.width,
 			      pixmap->drawable.height)) {
 		sna_damage_destroy(&priv->cpu_damage);
-		priv->undamaged = false;
 		list_del(&priv->list);
 		goto done;
 	}
@@ -2422,7 +2406,6 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 	assert_pixmap_damage(pixmap);
 
 	if (priv->cpu_damage == NULL) {
-		priv->undamaged = false;
 		list_del(&priv->list);
 		return sna_pixmap_move_to_gpu(pixmap, flags);
 	}
@@ -2504,7 +2487,6 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 
 		sna_damage_destroy(&priv->cpu_damage);
 		list_del(&priv->list);
-		priv->undamaged = true;
 	} else if (DAMAGE_IS_ALL(priv->cpu_damage) ||
 		   sna_damage_contains_box__no_reduce(priv->cpu_damage, box)) {
 		bool ok = false;
@@ -2537,7 +2519,6 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 			return false;
 
 		sna_damage_subtract(&priv->cpu_damage, &r);
-		priv->undamaged = true;
 	} else if (sna_damage_intersect(priv->cpu_damage, &r, &i)) {
 		int n = REGION_NUM_RECTS(&i);
 		bool ok;
@@ -2573,7 +2554,6 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl
 			return false;
 
 		sna_damage_subtract(&priv->cpu_damage, &r);
-		priv->undamaged = true;
 		RegionUninit(&i);
 	}
 
@@ -2594,7 +2574,6 @@ done:
 			sna_damage_all(&priv->gpu_damage,
 				       pixmap->drawable.width,
 				       pixmap->drawable.height);
-			priv->undamaged = false;
 		}
 	}
 
@@ -2731,7 +2710,6 @@ sna_drawable_use_bo(DrawablePtr drawable, unsigned flags, const BoxRec *box,
 			sna_damage_subtract(&priv->cpu_damage, &region);
 			if (priv->cpu_damage == NULL) {
 				list_del(&priv->list);
-				priv->undamaged = false;
 				priv->cpu = false;
 			}
 		}
@@ -2824,7 +2802,6 @@ done:
 			      pixmap->drawable.height)) {
 		sna_damage_destroy(&priv->cpu_damage);
 		list_del(&priv->list);
-		priv->undamaged = false;
 		*damage = NULL;
 	} else
 		*damage = &priv->gpu_damage;
@@ -3049,7 +3026,6 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 		DBG(("%s: already all-damaged\n", __FUNCTION__));
 		sna_damage_destroy(&priv->cpu_damage);
 		list_del(&priv->list);
-		priv->undamaged = false;
 		assert(priv->cpu == false || IS_CPU_MAP(priv->gpu_bo->map));
 		goto active;
 	}
@@ -3182,7 +3158,6 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags)
 
 	__sna_damage_destroy(DAMAGE_PTR(priv->cpu_damage));
 	priv->cpu_damage = NULL;
-	priv->undamaged = true;
 
 	if (priv->shm) {
 		assert(!priv->flush);
@@ -3207,10 +3182,8 @@ done:
 	sna_damage_reduce_all(&priv->gpu_damage,
 			      pixmap->drawable.width,
 			      pixmap->drawable.height);
-	if (DAMAGE_IS_ALL(priv->gpu_damage)) {
-		priv->undamaged = false;
+	if (DAMAGE_IS_ALL(priv->gpu_damage))
 		sna_pixmap_free_cpu(sna, priv);
-	}
 
 active:
 	if (flags & MOVE_WRITE)
@@ -3428,8 +3401,6 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 	PixmapPtr pixmap = get_drawable_pixmap(drawable);
 	struct sna *sna = to_sna_from_pixmap(pixmap);
 	struct sna_pixmap *priv = sna_pixmap(pixmap);
-	char *dst_bits;
-	int dst_stride;
 	BoxRec *box;
 	int16_t dx, dy;
 	int n;
@@ -3461,9 +3432,6 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 
 	DBG(("%s: upload(%d, %d, %d, %d)\n", __FUNCTION__, x, y, w, h));
 
-	dst_stride = pixmap->devKind;
-	dst_bits = pixmap->devPrivate.ptr;
-
 	/* Region is pre-clipped and translated into pixmap space */
 	box = REGION_RECTS(region);
 	n = REGION_NUM_RECTS(region);
@@ -3487,9 +3455,9 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 		assert(box->x2 - x <= w);
 		assert(box->y2 - y <= h);
 
-		memcpy_blt(bits, dst_bits,
+		memcpy_blt(bits, pixmap->devPrivate.ptr,
 			   pixmap->drawable.bitsPerPixel,
-			   stride, dst_stride,
+			   stride, pixmap->devKind,
 			   box->x1 - x, box->y1 - y,
 			   box->x1, box->y1,
 			   box->x2 - box->x1, box->y2 - box->y1);
@@ -4545,7 +4513,6 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc,
 						       dst_pixmap->drawable.width,
 						       dst_pixmap->drawable.height);
 					list_del(&dst_priv->list);
-					dst_priv->undamaged = false;
 				} else
 					sna_damage_add(&dst_priv->gpu_damage,
 						       region);
@@ -9340,7 +9307,6 @@ sna_poly_fill_rect_blt(DrawablePtr drawable,
 							       pixmap->drawable.height);
 						sna_damage_destroy(&priv->cpu_damage);
 						list_del(&priv->list);
-						priv->undamaged = false;
 						priv->clear = true;
 						priv->clear_color = gc->alu == GXcopy ? pixel : 0;
 
@@ -11801,7 +11767,6 @@ sna_poly_fill_rect(DrawablePtr draw, GCPtr gc, int n, xRectangle *rect)
 				sna_damage_all(&priv->gpu_damage,
 					       pixmap->drawable.width,
 					       pixmap->drawable.height);
-				priv->undamaged = false;
 			}
 		}
 		if (priv->cpu_damage == NULL) {
diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index fd5acf9..7898b2c 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -849,7 +849,6 @@ sna_composite_rectangles(CARD8		 op,
 				sna_damage_all(&priv->gpu_damage,
 					       pixmap->drawable.width,
 					       pixmap->drawable.height);
-				priv->undamaged = false;
 			}
 		}
 		if (priv->cpu_damage == NULL) {
@@ -887,7 +886,6 @@ sna_composite_rectangles(CARD8		 op,
 				       pixmap->drawable.height);
 			sna_damage_destroy(damage == &priv->gpu_damage ?
 					   &priv->cpu_damage : &priv->gpu_damage);
-			priv->undamaged = false;
 		}
 
 		if (op <= PictOpSrc && bo == priv->gpu_bo) {
diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index 35457ac..e972537 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -457,7 +457,6 @@ damage_all:
 						   pixmap->drawable.width,
 						   pixmap->drawable.height);
 		sna_damage_destroy(&priv->cpu_damage);
-		priv->undamaged = false;
 	} else {
 		sna_damage_subtract(&priv->cpu_damage, region);
 		if (priv->cpu_damage == NULL)
@@ -493,7 +492,6 @@ static void set_bo(PixmapPtr pixmap, struct kgem_bo *bo)
 	sna_damage_destroy(&priv->cpu_damage);
 	list_del(&priv->list);
 	priv->cpu = false;
-	priv->undamaged = false;
 
 	assert(bo->refcnt);
 	if (priv->gpu_bo != bo) {
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index 95e7d4f..266983e 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -5988,7 +5988,6 @@ static void mark_damaged(PixmapPtr pixmap, struct sna_pixmap *priv,
 			       pixmap->drawable.width,
 			       pixmap->drawable.height);
 		list_del(&priv->list);
-		priv->undamaged = false;
 	} else {
 		sna_damage_add_box(&priv->gpu_damage, box);
 		sna_damage_subtract_box(&priv->cpu_damage, box);
commit 46141d277f326ae78f7b0e927a500e0eb1987f1b
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jan 17 10:16:24 2013 +0000

    sna: Consider fill style for XPolyRectangle
    
    The rectangle outline is not always solid...
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 8c7daa2..70dedd1 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -8481,6 +8481,7 @@ sna_poly_rectangle_extents(DrawablePtr drawable, GCPtr gc,
 	Box32Rec box;
 	int extra = gc->lineWidth >> 1;
 	bool clipped;
+	bool zero = false;
 
 	if (n == 0)
 		return 0;
@@ -8489,9 +8490,13 @@ sna_poly_rectangle_extents(DrawablePtr drawable, GCPtr gc,
 	box.y1 = r->y;
 	box.x2 = box.x1 + r->width;
 	box.y2 = box.y1 + r->height;
+	zero |= (r->width | r->height) == 0;
 
-	while (--n)
-		box32_add_rect(&box, ++r);
+	while (--n) {
+		r++;
+		zero |= (r->width | r->height) == 0;
+		box32_add_rect(&box, r);
+	}
 
 	box.x2++;
 	box.y2++;
@@ -8501,13 +8506,15 @@ sna_poly_rectangle_extents(DrawablePtr drawable, GCPtr gc,
 		box.x2 += extra;
 		box.y1 -= extra;
 		box.y2 += extra;
-	}
+		zero = !zero;
+	} else
+		zero = true;
 
 	clipped = box32_trim_and_translate(&box, drawable, gc);
 	if (!box32_to_box16(&box, out))
 		return 0;
 
-	return 1 | clipped << 1;
+	return 1 | clipped << 1 | zero << 2;
 }
 
 static bool
@@ -8546,7 +8553,7 @@ zero:
 		xRectangle rr = *r++;
 
 		if ((rr.width | rr.height) == 0)
-			continue;
+			continue; /* XXX -> PolyLine */
 
 		DBG(("%s - zero : r[%d] = (%d, %d) x (%d, %d)\n", __FUNCTION__,
 		     n, rr.x, rr.y, rr.width, rr.height));
@@ -8615,7 +8622,7 @@ zero_clipped:
 				     n, rr.x, rr.y, rr.width, rr.height));
 
 				if ((rr.width | rr.height) == 0)
-					continue;
+					continue; /* XXX -> PolyLine */
 
 				rr.x += drawable->x;
 				rr.y += drawable->y;
@@ -8679,7 +8686,7 @@ zero_clipped:
 				     n, rr.x, rr.y, rr.width, rr.height));
 
 				if ((rr.width | rr.height) == 0)
-					continue;
+					continue; /* XXX -> PolyLine */
 
 				rr.x += drawable->x;
 				rr.y += drawable->y;
@@ -8759,7 +8766,7 @@ wide_clipped:
 				int count;
 
 				if ((rr.width | rr.height) == 0)
-					continue;
+					continue; /* XXX -> PolyLine */
 
 				rr.x += drawable->x;
 				rr.y += drawable->y;
@@ -8924,7 +8931,7 @@ wide:
 			xRectangle rr = *r++;
 
 			if ((rr.width | rr.height) == 0)
-				continue;
+				continue; /* XXX -> PolyLine */
 
 			rr.x += dx;
 			rr.y += dy;
@@ -9022,8 +9029,9 @@ sna_poly_rectangle(DrawablePtr drawable, GCPtr gc, int n, xRectangle *r)
 		goto fallback;
 	}
 
-	DBG(("%s: line=%d [%d], join=%d [%d], mask=%lu [%d]\n",
+	DBG(("%s: fill=_%d [%d], line=%d [%d], join=%d [%d], mask=%lu [%d]\n",
 	     __FUNCTION__,
+	     gc->fillStyle, gc->fillStyle == FillSolid,
 	     gc->lineStyle, gc->lineStyle == LineSolid,
 	     gc->joinStyle, gc->joinStyle == JoinMiter,
 	     gc->planemask, PM_IS_SOLID(drawable, gc->planemask)));
@@ -9031,7 +9039,7 @@ sna_poly_rectangle(DrawablePtr drawable, GCPtr gc, int n, xRectangle *r)
 	if (!PM_IS_SOLID(drawable, gc->planemask))
 		goto fallback;
 
-	if (gc->lineStyle == LineSolid && gc->joinStyle == JoinMiter) {
+	if (flags & 4 && gc->fillStyle == FillSolid && gc->lineStyle == LineSolid && gc->joinStyle == JoinMiter) {
 		DBG(("%s: trying blt solid fill [%08lx] paths\n",
 		     __FUNCTION__, gc->fgPixel));
 		if ((bo = sna_drawable_use_bo(drawable, PREFER_GPU,
commit d5c8d38afaba04281157bafe212e93f010ae00f5
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jan 17 10:10:54 2013 +0000

    sna: Refactor to remove a goto from sna_put_zpixmap_blt()
    
    The complexity of the function has been moved to move-to-cpu so we can
    take further advantage of the simplified logic in put_zpixmap to clean
    up the code by removing an unwanted goto.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 4bb50cd..8c7daa2 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3428,7 +3428,6 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 	PixmapPtr pixmap = get_drawable_pixmap(drawable);
 	struct sna *sna = to_sna_from_pixmap(pixmap);
 	struct sna_pixmap *priv = sna_pixmap(pixmap);
-	unsigned flags;
 	char *dst_bits;
 	int dst_stride;
 	BoxRec *box;
@@ -3440,24 +3439,22 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region,
 	if (gc->alu != GXcopy)
 		return false;
 
-	if (!priv) {
+	if (priv) {
+		unsigned flags = MOVE_WRITE;
+		if (w == pixmap->drawable.width) {
+			flags |= MOVE_WHOLE_HINT;
+			if (h != pixmap->drawable.height)
+				flags |= MOVE_READ;
+		}
+
+		if (!sna_drawable_move_region_to_cpu(&pixmap->drawable,
+						     region, flags))
+			return false;
+	} else {
 		if (drawable->depth < 8)
 			return false;
-
-		goto blt;
-	}
-
-	flags = MOVE_WRITE;
-	if (w == pixmap->drawable.width) {
-		flags |= MOVE_WHOLE_HINT;
-		if (h != pixmap->drawable.height)
-			flags |= MOVE_READ;
 	}
 
-	if (!sna_drawable_move_region_to_cpu(&pixmap->drawable, region, flags))
-		return false;
-
-blt:
 	get_drawable_deltas(drawable, pixmap, &dx, &dy);
 	x += dx + drawable->x;
 	y += dy + drawable->y;


More information about the xorg-commit mailing list