From 5f0886dae29429f498fb10a12d5dc8de6bd798fc Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 8 Nov 2011 00:02:18 +0000 Subject: sna/trapezoids: Use ints for the offsets to accommodate multiplication Although the original precison need only 16-bits to store the offsets, after projecting on to the sample grid we need a few more bits of precision and so need a larger integer type to avoid overflow and render glitches. Reported-by: Clemens Eisserer Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=42680 Signed-off-by: Chris Wilson --- src/sna/kgem.c | 5 ++++- src/sna/sna_trapezoids.c | 47 +++++++++++++++++++++++++---------------------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/sna/kgem.c b/src/sna/kgem.c index 7274a8c6..bdfefa83 100644 --- a/src/sna/kgem.c +++ b/src/sna/kgem.c @@ -2017,9 +2017,12 @@ struct kgem_bo *kgem_create_buffer(struct kgem *kgem, continue; } - if (bo->base.refcnt == 1 && bo->base.exec == NULL) + if (bo->base.refcnt == 1 && bo->base.exec == NULL) { + DBG(("%s: discarding unfinished buffer? used=%d, total=%d\n", + __FUNCTION__, bo->used, bo->alloc)); /* no users, so reset */ bo->used = 0; + } if (bo->used + size <= bo->alloc) { DBG(("%s: reusing partial buffer? used=%d + size=%d, total=%d\n", diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c index 573841e7..a85f58e6 100644 --- a/src/sna/sna_trapezoids.c +++ b/src/sna/sna_trapezoids.c @@ -2716,8 +2716,7 @@ trapezoid_span_converter(CARD8 op, PicturePtr src, PicturePtr dst, BoxRec extents; pixman_region16_t clip; int16_t dst_x, dst_y; - int16_t dx, dy; - int n; + int dx, dy, n; if (NO_SCAN_CONVERTER) return false; @@ -2848,15 +2847,15 @@ tor_blt_mask(struct sna *sna, h = box->y2 - box->y1; w = box->x2 - box->x1; if (w == 1) { - while (h--) { + do { *ptr = coverage; ptr += stride; - } + } while (--h); } else { - while (h--) { + do { memset(ptr, coverage, w); ptr += stride; - } + } while (--h); } } @@ -2883,9 +2882,8 @@ trapezoid_mask_converter(CARD8 op, PicturePtr src, PicturePtr dst, PicturePtr mask; BoxRec extents; int16_t dst_x, dst_y; - int16_t dx, dy; - int error; - int n; + int dx, dy; + int error, n; if (NO_SCAN_CONVERTER) return false; @@ -2897,9 +2895,15 @@ trapezoid_mask_converter(CARD8 op, PicturePtr src, PicturePtr dst, } if (maskFormat == NULL && ntrap > 1) { - DBG(("%s: fallback -- individual rasterisation requested\n", + DBG(("%s: individual rasterisation requested\n", __FUNCTION__)); - return false; + do { + /* XXX unwind errors? */ + if (!trapezoid_mask_converter(op, src, dst, NULL, + src_x, src_y, 1, traps++)) + return false; + } while (--ntrap); + return true; } miTrapezoidBounds(ntrap, traps, &extents); @@ -2931,8 +2935,8 @@ trapezoid_mask_converter(CARD8 op, PicturePtr src, PicturePtr dst, dy = -extents.y1 * FAST_SAMPLES_Y; extents.x1 = extents.y1 = 0; - DBG(("%s: mask (%dx%d)\n", - __FUNCTION__, extents.x2, extents.y2)); + DBG(("%s: mask (%dx%d), dx=(%d, %d)\n", + __FUNCTION__, extents.x2, extents.y2, dx, dy)); scratch = sna_pixmap_create_upload(screen, extents.x2, extents.y2, 8); if (!scratch) return true; @@ -3065,6 +3069,8 @@ sna_composite_trapezoids(CARD8 op, } } + DBG(("%s: rectlinear? %d, pixel-aligned? %d\n", + __FUNCTION__, rectilinear, pixel_aligned)); if (rectilinear) { if (pixel_aligned) { if (composite_aligned_boxes(op, src, dst, @@ -3195,7 +3201,7 @@ trap_span_converter(PicturePtr dst, PicturePtr src; xRenderColor white; pixman_region16_t *clip; - int16_t dx, dy; + int dx, dy; int n, error; if (NO_SCAN_CONVERTER) @@ -3321,8 +3327,7 @@ trap_mask_converter(PicturePtr picture, struct sna_pixmap *priv; BoxRec extents; span_func_t span; - int16_t dx, dy; - int n; + int dx, dy, n; if (NO_SCAN_CONVERTER) return false; @@ -3701,8 +3706,7 @@ triangles_span_converter(CARD8 op, PicturePtr src, PicturePtr dst, BoxRec extents; pixman_region16_t clip; int16_t dst_x, dst_y; - int16_t dx, dy; - int n; + int dx, dy, n; if (NO_SCAN_CONVERTER) return false; @@ -3827,9 +3831,8 @@ triangles_mask_converter(CARD8 op, PicturePtr src, PicturePtr dst, PicturePtr mask; BoxRec extents; int16_t dst_x, dst_y; - int16_t dx, dy; - int error; - int n; + int dx, dy; + int error, n; if (NO_SCAN_CONVERTER) return false; @@ -4057,7 +4060,7 @@ tristrip_span_converter(CARD8 op, PicturePtr src, PicturePtr dst, pixman_region16_t clip; xPointFixed p[4]; int16_t dst_x, dst_y; - int16_t dx, dy; + int dx, dy; int cw, ccw, n; if (NO_SCAN_CONVERTER) -- cgit v1.2.3