diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-02-01 01:33:52 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2012-02-01 09:19:03 +0000 |
commit | 55c7088f54655609fbb00106679a566b46ee8dba (patch) | |
tree | 1701c531b069b3e3fcfe6c7894b4e9b87e2f13f1 | |
parent | c8fc2cde53ef7aa011ec7c47e7fc5486de0651f5 (diff) |
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 <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/sna_accel.c | 79 | ||||
-rw-r--r-- | 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; } |