From 55c7088f54655609fbb00106679a566b46ee8dba Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Wed, 1 Feb 2012 01:33:52 +0000 Subject: [PATCH] sna: Add debugging code to verify damage extents of fallback paths After using the CPU, upload the damage and read back the pixels from the GPU bo and verify that the two are equivalent. Signed-off-by: Chris Wilson --- src/sna/sna_accel.c | 79 ++++++++++++++++++++++++++++++++++++++++++-- src/sna/sna_damage.c | 4 +-- 2 files changed, 79 insertions(+), 4 deletions(-) diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 40748ec4..71d3f06b 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -80,12 +80,68 @@ #define ACCEL_POLY_FILL_ARC 1 #define ACCEL_POLY_TEXT8 1 #define ACCEL_POLY_TEXT16 1 +#define ACCEL_POLY_GLYPH 1 #define ACCEL_IMAGE_TEXT8 1 #define ACCEL_IMAGE_TEXT16 1 #define ACCEL_IMAGE_GLYPH 1 -#define ACCEL_POLY_GLYPH 1 #define ACCEL_PUSH_PIXELS 1 +#if 0 +static void __sna_fallback_flush(DrawablePtr d) +{ + PixmapPtr pixmap = get_drawable_pixmap(d); + struct sna *sna = to_sna_from_pixmap(pixmap); + struct sna_pixmap *priv; + BoxRec box; + PixmapPtr tmp; + int i, j; + char *src, *dst; + + DBG(("%s: uploading CPU damage...\n", __FUNCTION__)); + priv = sna_pixmap_move_to_gpu(pixmap, MOVE_READ); + if (priv == NULL) + return; + + DBG(("%s: downloading GPU damage...\n", __FUNCTION__)); + if (!sna_pixmap_move_to_cpu(pixmap, MOVE_READ)) + return; + + box.x1 = box.y1 = 0; + box.x2 = pixmap->drawable.width; + box.y2 = pixmap->drawable.height; + + tmp = fbCreatePixmap(pixmap->drawable.pScreen, + pixmap->drawable.width, + pixmap->drawable.height, + pixmap->drawable.depth, + 0); + + DBG(("%s: comparing with direct read...\n", __FUNCTION__)); + sna_read_boxes(sna, + priv->gpu_bo, 0, 0, + tmp, 0, 0, + &box, 1); + + src = pixmap->devPrivate.ptr; + dst = tmp->devPrivate.ptr; + for (i = 0; i < tmp->drawable.height; i++) { + if (memcmp(src, dst, tmp->drawable.width * tmp->drawable.bitsPerPixel >> 3)) { + for (j = 0; src[j] == dst[j]; j++) + ; + ErrorF("mismatch at (%d, %d)\n", + 8*j / tmp->drawable.bitsPerPixel, i); + abort(); + } + src += pixmap->devKind; + dst += tmp->devKind; + } + fbDestroyPixmap(tmp); +} +#define FALLBACK_FLUSH(d) __sna_fallback_flush(d) +#else +#define FALLBACK_FLUSH(d) +#endif + static int sna_font_key; static const uint8_t copy_ROP[] = { @@ -1453,8 +1509,9 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable, } done: - if (flags & MOVE_WRITE && !DAMAGE_IS_ALL(priv->cpu_damage)) { + if (flags & MOVE_WRITE) { DBG(("%s: applying cpu damage\n", __FUNCTION__)); + assert(!DAMAGE_IS_ALL(priv->cpu_damage)); assert_pixmap_contains_box(pixmap, RegionExtents(region)); sna_damage_add(&priv->cpu_damage, region); if (priv->gpu_bo && @@ -2982,6 +3039,7 @@ fallback: DBG(("%s: fbPutImage(%d, %d, %d, %d)\n", __FUNCTION__, x, y, w, h)); fbPutImage(drawable, gc, depth, x, y, w, h, left, format, bits); + FALLBACK_FLUSH(drawable); out: RegionUninit(®ion); } @@ -3694,6 +3752,7 @@ sna_copy_area(DrawablePtr src, DrawablePtr dst, GCPtr gc, src_x, src_y, width, height, dst_x, dst_y); + FALLBACK_FLUSH(dst); out: RegionUninit(®ion); return ret; @@ -4625,6 +4684,7 @@ fallback: DBG(("%s: fbFillSpans\n", __FUNCTION__)); fbFillSpans(drawable, gc, n, pt, width, sorted); + FALLBACK_FLUSH(drawable); out: RegionUninit(®ion); } @@ -4663,6 +4723,7 @@ fallback: DBG(("%s: fbSetSpans\n", __FUNCTION__)); fbSetSpans(drawable, gc, src, pt, width, n, sorted); + FALLBACK_FLUSH(drawable); out: RegionUninit(®ion); } @@ -5137,6 +5198,7 @@ fallback: DBG(("%s: fbCopyPlane(%d, %d, %d, %d, %d,%d) %x\n", __FUNCTION__, src_x, src_y, w, h, dst_x, dst_y, (unsigned)bit)); ret = fbCopyPlane(src, dst, gc, src_x, src_y, w, h, dst_x, dst_y, bit); + FALLBACK_FLUSH(dst); out: RegionUninit(®ion); return ret; @@ -5336,6 +5398,7 @@ fallback: DBG(("%s: fbPolyPoint\n", __FUNCTION__)); fbPolyPoint(drawable, gc, mode, n, pt); + FALLBACK_FLUSH(drawable); out: RegionUninit(®ion); } @@ -6389,6 +6452,7 @@ fallback: DBG(("%s: fbPolyLine\n", __FUNCTION__)); fbPolyLine(drawable, gc, mode, n, pt); + FALLBACK_FLUSH(drawable); gc->ops = (GCOps *)&sna_gc_ops; out: @@ -7301,6 +7365,7 @@ fallback: DBG(("%s: fbPolySegment\n", __FUNCTION__)); fbPolySegment(drawable, gc, n, seg); + FALLBACK_FLUSH(drawable); gc->ops = (GCOps *)&sna_gc_ops; out: @@ -7850,6 +7915,7 @@ fallback: DBG(("%s: fbPolyRectangle\n", __FUNCTION__)); fbPolyRectangle(drawable, gc, n, r); + FALLBACK_FLUSH(drawable); out: RegionUninit(®ion); } @@ -8027,6 +8093,7 @@ fallback: DBG(("%s -- fbPolyArc\n", __FUNCTION__)); fbPolyArc(drawable, gc, n, arc); + FALLBACK_FLUSH(drawable); gc->ops = (GCOps *)&sna_gc_ops; out: @@ -9792,6 +9859,7 @@ fallback: } } while (--n); } + FALLBACK_FLUSH(draw); out: RegionUninit(®ion); } @@ -10332,6 +10400,7 @@ force_fallback: DBG(("%s: fallback -- fbPolyGlyphBlt\n", __FUNCTION__)); fbPolyGlyphBlt(drawable, gc, x, y, n, info, FONTGLYPHS(gc->font)); + FALLBACK_FLUSH(drawable); } out: RegionUninit(®ion); @@ -10420,6 +10489,7 @@ force_fallback: DBG(("%s: fallback -- fbPolyGlyphBlt\n", __FUNCTION__)); fbPolyGlyphBlt(drawable, gc, x, y, n, info, FONTGLYPHS(gc->font)); + FALLBACK_FLUSH(drawable); } out: RegionUninit(®ion); @@ -10517,6 +10587,7 @@ force_fallback: DBG(("%s: fallback -- fbImageGlyphBlt\n", __FUNCTION__)); fbImageGlyphBlt(drawable, gc, x, y, n, info, FONTGLYPHS(gc->font)); + FALLBACK_FLUSH(drawable); } out: RegionUninit(®ion); @@ -10607,6 +10678,7 @@ force_fallback: DBG(("%s: fallback -- fbImageGlyphBlt\n", __FUNCTION__)); fbImageGlyphBlt(drawable, gc, x, y, n, info, FONTGLYPHS(gc->font)); + FALLBACK_FLUSH(drawable); } out: RegionUninit(®ion); @@ -10869,6 +10941,7 @@ fallback: DBG(("%s: fallback -- fbImageGlyphBlt\n", __FUNCTION__)); fbImageGlyphBlt(drawable, gc, x, y, n, info, base); + FALLBACK_FLUSH(drawable); out: RegionUninit(®ion); @@ -10943,6 +11016,7 @@ fallback: DBG(("%s: fallback -- fbPolyGlyphBlt\n", __FUNCTION__)); fbPolyGlyphBlt(drawable, gc, x, y, n, info, base); + FALLBACK_FLUSH(drawable); out: RegionUninit(®ion); @@ -11123,6 +11197,7 @@ sna_push_pixels(GCPtr gc, PixmapPtr bitmap, DrawablePtr drawable, DBG(("%s: fallback, fbPushPixels(%d, %d, %d %d)\n", __FUNCTION__, w, h, x, y)); fbPushPixels(gc, bitmap, drawable, w, h, x, y); + FALLBACK_FLUSH(drawable); out: RegionUninit(®ion); } diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c index ab825aa5..f52ecace 100644 --- a/src/sna/sna_damage.c +++ b/src/sna/sna_damage.c @@ -514,8 +514,7 @@ static void __sna_damage_reduce(struct sna_damage *damage) damage->extents = region->extents; } - if (free_boxes) - free(boxes); + free(free_boxes); done: damage->mode = DAMAGE_ADD; @@ -1048,6 +1047,7 @@ static struct sna_damage *__sna_damage_subtract(struct sna_damage *damage, &damage->region, region); damage->extents = damage->region.extents; + assert(pixman_region_not_empty(&damage->region)); return damage; }