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>
This commit is contained in:
parent
c8fc2cde53
commit
55c7088f54
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue