xf86-video-intel: 9 commits - src/sna/gen2_render.c src/sna/gen3_render.c src/sna/gen4_render.c src/sna/gen5_render.c src/sna/gen6_render.c src/sna/gen7_render.c src/sna/kgem.c src/sna/sna_accel.c
Chris Wilson
ickle at kemper.freedesktop.org
Sat Oct 29 02:34:42 PDT 2011
src/sna/gen2_render.c | 3
src/sna/gen3_render.c | 3
src/sna/gen4_render.c | 3
src/sna/gen5_render.c | 3
src/sna/gen6_render.c | 3
src/sna/gen7_render.c | 3
src/sna/kgem.c | 13 ++
src/sna/sna_accel.c | 321 +++++++++++++++++++++++++++++++++-----------------
8 files changed, 239 insertions(+), 113 deletions(-)
New commits:
commit 719626ef7918d5cd69d13f983b8b615aefe215d6
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Sat Oct 29 10:26:08 2011 +0100
sna: Increment clip box when short-circuiting the iteration
Reported-by: nkalkhof at web.de
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi
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 fead5a1..3c1a65e 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1968,10 +1968,12 @@ no_damage_clipped:
if (y + 1 <= c->y1)
break;
- if (X2 <= c->x1)
- continue;
if (X1 >= c->x2)
break;
+ if (X2 <= c->x1) {
+ c++;
+ continue;
+ }
b->x1 = c->x1;
b->x2 = c->x2;
@@ -1981,6 +1983,8 @@ no_damage_clipped:
b->x1 = X1;
if (b->x2 > X2)
b->x2 = X2;
+ if (b->x2 <= b->x1)
+ continue;
b->x1 += dx;
b->x2 += dx;
@@ -2073,10 +2077,12 @@ damage_clipped:
if (y + 1 <= c->y1)
break;
- if (X2 <= c->x1)
- continue;
if (X1 >= c->x2)
break;
+ if (X2 <= c->x1) {
+ c++;
+ continue;
+ }
b->x1 = c->x1;
b->x2 = c->x2;
@@ -2086,6 +2092,8 @@ damage_clipped:
b->x1 = X1;
if (b->x2 > X2)
b->x2 = X2;
+ if (b->x2 <= b->x1)
+ continue;
b->x1 += dx;
b->x2 += dx;
commit 32a9e0352a1e28509580d84bfc5377d8fae913c4
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Oct 28 23:14:24 2011 +0100
sna: Retire and search inactive again before creating new buffer
Attempt to retire an active buffer into the inactive cache before giving
up and creating a new buffer.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index e8df7d9..4827fb8 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1270,6 +1270,13 @@ struct kgem_bo *kgem_create_linear(struct kgem *kgem, int size)
if (bo)
return kgem_bo_reference(bo);
+ if (!list_is_empty(&kgem->requests)) {
+ kgem_retire(kgem);
+ bo = search_linear_cache(kgem, size, false);
+ if (bo)
+ return kgem_bo_reference(bo);
+ }
+
handle = gem_create(kgem->fd, size);
if (handle == 0)
return NULL;
@@ -1541,6 +1548,12 @@ next_bo:
continue;
}
+ if (flags & CREATE_INACTIVE && !list_is_empty(&kgem->requests)) {
+ kgem_retire(kgem);
+ flags &= ~CREATE_INACTIVE;
+ goto skip_active_search;
+ }
+
handle = gem_create(kgem->fd, size);
if (handle == 0)
return NULL;
commit 15266e1b9500f6b348661c60d1982bde911f2d0e
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Oct 28 18:00:56 2011 +0100
sna: Don't flush the render caches if in the process of writing again
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 9e85176..e76876c 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1375,7 +1375,8 @@ gen2_render_composite(struct sna *sna,
NULL))
kgem_submit(&sna->kgem);
- if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
+ if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) ||
+ (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo))) {
if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) {
kgem_emit_flush(&sna->kgem);
} else {
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 2b70b85..118b906 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2479,7 +2479,8 @@ gen3_render_composite(struct sna *sna,
NULL))
kgem_submit(&sna->kgem);
- if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo)) {
+ if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) ||
+ (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo))) {
if (tmp->src.bo == tmp->dst.bo || tmp->mask.bo == tmp->dst.bo) {
kgem_emit_flush(&sna->kgem);
} else {
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index e4a40fc..425967b 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -2058,7 +2058,8 @@ gen4_render_composite(struct sna *sna,
NULL))
kgem_submit(&sna->kgem);
- if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
+ if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) ||
+ (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo)))
kgem_emit_flush(&sna->kgem);
gen4_bind_surfaces(sna, tmp);
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index a177d32..6d4fbd9 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -2078,7 +2078,8 @@ gen5_render_composite(struct sna *sna,
tmp->dst.bo, tmp->src.bo, tmp->mask.bo, NULL))
kgem_submit(&sna->kgem);
- if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
+ if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) ||
+ (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo)))
kgem_emit_flush(&sna->kgem);
gen5_bind_surfaces(sna, tmp);
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 0dde625..1abb54f 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -2248,7 +2248,8 @@ gen6_render_composite(struct sna *sna,
NULL))
kgem_submit(&sna->kgem);
- if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
+ if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) ||
+ (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo)))
kgem_emit_flush(&sna->kgem);
gen6_emit_composite_state(sna, tmp);
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index b9f23ee..7eb323f 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2388,7 +2388,8 @@ gen7_render_composite(struct sna *sna,
NULL))
kgem_submit(&sna->kgem);
- if (kgem_bo_is_dirty(tmp->src.bo) || kgem_bo_is_dirty(tmp->mask.bo))
+ if ((tmp->src.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->src.bo)) ||
+ (tmp->mask.bo && tmp->mask.bo != tmp->dst.bo && kgem_bo_is_dirty(tmp->mask.bo)))
kgem_emit_flush(&sna->kgem);
gen7_emit_composite_state(sna, tmp);
commit d3c7ee921172d4898ebdc6e944812a02426008e9
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Oct 28 16:44:16 2011 +0100
sna: Faster unclipped rectilinear segments
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 4b1e536..fead5a1 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3332,51 +3332,95 @@ sna_poly_segment_blt(DrawablePtr drawable,
if (!clipped) {
dx += drawable->x;
dy += drawable->y;
- do {
- int x, y, width, height;
+ if (dx|dy) {
+ do {
+ int nbox = n;
+ if (nbox > ARRAY_SIZE(boxes))
+ nbox = ARRAY_SIZE(boxes);
+ n -= nbox;
+ do {
+ if (seg->x1 < seg->x2) {
+ b->x1 = seg->x1;
+ b->x2 = seg->x2;
+ } else {
+ b->x1 = seg->x2;
+ b->x2 = seg->x1;
+ }
+ b->x2++;
- if (seg->x1 < seg->x2) {
- x = seg->x1;
- width = seg->x2;
- } else {
- x = seg->x2;
- width = seg->x1;
- }
- width -= x - 1;
+ if (seg->y1 < seg->y2) {
+ b->y1 = seg->y1;
+ b->y2 = seg->y2;
+ } else {
+ b->y1 = seg->y2;
+ b->y2 = seg->y1;
+ }
+ b->y2++;
- if (seg->y1 < seg->y2) {
- y = seg->y1;
- height = seg->y2;
- } else {
- y = seg->y2;
- height = seg->y1;
- }
- height -= y - 1;
-
- /* don't paint last pixel */
- if (gc->capStyle == CapNotLast) {
- if (width == 1)
- height--;
- else
- width--;
- }
+ /* don't paint last pixel */
+ if (gc->capStyle == CapNotLast) {
+ if (seg->x1 == seg->x2)
+ b->y2--;
+ else
+ b->x2--;
+ }
- DBG(("%s: [%d] (%d, %d)x(%d, %d) + (%d, %d)\n", __FUNCTION__, n,
- x, y, width, height, dx, dy));
+ b->x1 += dx;
+ b->x2 += dx;
+ b->y1 += dy;
+ b->y2 += dy;
+ b++;
+ seg++;
+ } while (--nbox);
- b->x1 = x + dx;
- b->x2 = b->x1 + width;
- b->y1 = y + dy;
- b->y2 = b->y1 + height;
- if (++b == last_box) {
- fill.boxes(sna, &fill, boxes, last_box-boxes);
+ fill.boxes(sna, &fill, boxes, b-boxes);
if (damage)
- sna_damage_add_boxes(damage, boxes, last_box-boxes, 0, 0);
+ sna_damage_add_boxes(damage, boxes, b-boxes, 0, 0);
b = boxes;
- }
+ } while (n);
+ } else {
+ do {
+ int nbox = n;
+ if (nbox > ARRAY_SIZE(boxes))
+ nbox = ARRAY_SIZE(boxes);
+ n -= nbox;
+ do {
+ if (seg->x1 < seg->x2) {
+ b->x1 = seg->x1;
+ b->x2 = seg->x2;
+ } else {
+ b->x1 = seg->x2;
+ b->x2 = seg->x1;
+ }
+ b->x2++;
- seg++;
- } while (--n);
+ if (seg->y1 < seg->y2) {
+ b->y1 = seg->y1;
+ b->y2 = seg->y2;
+ } else {
+ b->y1 = seg->y2;
+ b->y2 = seg->y1;
+ }
+ b->y2++;
+
+ /* don't paint last pixel */
+ if (gc->capStyle == CapNotLast) {
+ if (seg->x1 == seg->x2)
+ b->y2--;
+ else
+ b->x2--;
+ }
+
+ b++;
+ seg++;
+ } while (--nbox);
+
+ fill.boxes(sna, &fill, boxes, b-boxes);
+ if (damage)
+ sna_damage_add_boxes(damage, boxes, b-boxes, 0, 0);
+ b = boxes;
+ } while (n);
+ }
} else {
RegionRec clip;
commit 3cd909cfe9e7d7e97a1d51513a049e312fd9ddae
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Oct 28 15:48:49 2011 +0100
sna: Call miZeroArcLine where appropriate for GPU paths
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 96f0e05..4b1e536 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4683,13 +4683,18 @@ sna_poly_arc(DrawablePtr drawable, GCPtr gc, int n, xArc *arc)
if (USE_SPANS && arc_to_spans(gc, n) && can_fill_spans(drawable, gc) &&
sna_drawable_use_gpu_bo(drawable, ®ion.extents)) {
DBG(("%s: converting arcs into spans\n", __FUNCTION__));
- miPolyArc(drawable, gc, n, arc);
+ /* XXX still around 10x slower for x11perf -ellipse */
+ if (gc->lineWidth == 0)
+ miZeroPolyArc(drawable, gc, n, arc);
+ else
+ miPolyArc(drawable, gc, n, arc);
return;
}
fallback:
DBG(("%s -- fallback\n", __FUNCTION__));
if (gc->lineWidth) {
+ DBG(("%s -- miPolyArc\n", __FUNCTION__));
miPolyArc(drawable, gc, n, arc);
return;
}
commit 9921c98df070032e082570f0663f6d3ad0cccd56
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Oct 28 14:09:11 2011 +0100
sna: Faster unclipped PolyFillRect
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 9f00fd6..96f0e05 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -4765,17 +4765,41 @@ sna_poly_fill_rect_blt(DrawablePtr drawable,
dy += drawable->y;
sna_damage_add_rectangles(damage, rect, n, dx, dy);
- do {
- b->x1 = rect->x + dx;
- b->y1 = rect->y + dy;
- b->x2 = b->x1 + rect->width;
- b->y2 = b->y1 + rect->height;
- rect++;
- if (++b == last_box) {
- fill.boxes(sna, &fill, boxes, last_box-boxes);
+ if (dx|dy) {
+ do {
+ int nbox = n;
+ if (nbox > ARRAY_SIZE(boxes))
+ nbox = ARRAY_SIZE(boxes);
+ n -= nbox;
+ do {
+ b->x1 = rect->x + dx;
+ b->y1 = rect->y + dy;
+ b->x2 = b->x1 + rect->width;
+ b->y2 = b->y1 + rect->height;
+ b++;
+ rect++;
+ } while (--nbox);
+ fill.boxes(sna, &fill, boxes, b-boxes);
b = boxes;
- }
- } while (--n);
+ } while (n);
+ } else {
+ do {
+ int nbox = n;
+ if (nbox > ARRAY_SIZE(boxes))
+ nbox = ARRAY_SIZE(boxes);
+ n -= nbox;
+ do {
+ b->x1 = rect->x;
+ b->y1 = rect->y;
+ b->x2 = b->x1 + rect->width;
+ b->y2 = b->y1 + rect->height;
+ b++;
+ rect++;
+ } while (--nbox);
+ fill.boxes(sna, &fill, boxes, b-boxes);
+ b = boxes;
+ } while (n);
+ }
} else {
RegionRec clip;
commit c1718f96f520874c1fb2af0eb975c7f548762d34
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Oct 28 14:01:24 2011 +0100
sna: Faster unclipped PolyPoint
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 61fe190..9f00fd6 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2387,26 +2387,25 @@ sna_poly_point_blt(DrawablePtr drawable,
sna_damage_add_points(damage, pt, n, last.x, last.y);
do {
- b->x1 = pt->x;
- b->y1 = pt->y;
- pt++;
+ int nbox = n;
+ if (nbox > ARRAY_SIZE(box))
+ nbox = ARRAY_SIZE(box);
+ n -= nbox;
+ do {
+ *(DDXPointRec *)b = *pt++;
- b->x1 += last.x;
- b->y1 += last.y;
- if (mode == CoordModePrevious) {
- last.x = b->x1;
- last.y = b->y1;
- }
+ b->x1 += last.x;
+ b->y1 += last.y;
+ if (mode == CoordModePrevious)
+ last = *(DDXPointRec *)b;
- b->x2 = b->x1 + 1;
- b->y2 = b->y1 + 1;
- if (++b == last_box) {
- fill.boxes(sna, &fill, box, last_box - box);
- b = box;
- }
- } while (--n);
- if (b != box)
+ b->x2 = b->x1 + 1;
+ b->y2 = b->y1 + 1;
+ b++;
+ } while (--nbox);
fill.boxes(sna, &fill, box, b - box);
+ b = box;
+ } while (n);
} else {
while (n--) {
int x, y;
@@ -4846,9 +4845,9 @@ sna_poly_fill_rect_blt(DrawablePtr drawable,
}
RegionUninit(&clip);
+ if (b != boxes)
+ fill.boxes(sna, &fill, boxes, b-boxes);
}
- if (b != boxes)
- fill.boxes(sna, &fill, boxes, b-boxes);
done:
fill.done(sna, &fill);
return TRUE;
commit a4762ed891a50238abddf6c762a053db5c34b87f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Oct 28 13:39:17 2011 +0100
sna: Call directly into tiled rects for tiled spans.
As we already know the extents and that this is a candidate for
GPU-acceleration, we can skip over those steps and emit the tiled rects.
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 2a9f2a4..61fe190 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -2182,8 +2182,12 @@ reduce_damage(DrawablePtr drawable,
return damage;
}
-static void
-sna_poly_fill_rect(DrawablePtr draw, GCPtr gc, int n, xRectangle *rect);
+static Bool
+sna_poly_fill_rect_tiled(DrawablePtr drawable,
+ struct kgem_bo *bo,
+ struct sna_damage **damage,
+ GCPtr gc, int n, xRectangle *rect,
+ const BoxRec *extents, unsigned clipped);
static bool
can_fill_spans(DrawablePtr drawable, GCPtr gc)
@@ -2253,26 +2257,36 @@ sna_fill_spans(DrawablePtr drawable, GCPtr gc, int n,
®ion.extents, flags & 2))
return;
} else if (gc->fillStyle == FillTiled) {
- xRectangle *rect;
- int i;
-
/* Try converting these to a set of rectangles instead */
- DBG(("%s: converting to rectagnles\n", __FUNCTION__));
- rect = malloc (n * sizeof (xRectangle));
- if (rect == NULL)
- return;
+ if (sna_drawable_use_gpu_bo(drawable, ®ion.extents)) {
+ struct sna_pixmap *priv = sna_pixmap_from_drawable(drawable);
+ xRectangle *rect;
+ int i;
- for (i = 0; i < n; i++) {
- rect[i].x = pt[i].x;
- rect[i].width = width[i];
- rect[i].y = pt[i].y;
- rect[i].height = 1;
- }
+ DBG(("%s: converting to rectagnles\n", __FUNCTION__));
- sna_poly_fill_rect(drawable, gc, n, rect);
- free (rect);
- return;
+ rect = malloc (n * sizeof (xRectangle));
+ if (rect == NULL)
+ return;
+
+ for (i = 0; i < n; i++) {
+ rect[i].x = pt[i].x;
+ rect[i].width = width[i];
+ rect[i].y = pt[i].y;
+ rect[i].height = 1;
+ }
+
+ i = sna_poly_fill_rect_tiled(drawable,
+ priv->gpu_bo,
+ priv->gpu_only ? NULL : reduce_damage(drawable, &priv->gpu_damage, ®ion.extents),
+ gc, n, rect,
+ ®ion.extents, flags & 2);
+ free (rect);
+
+ if (i)
+ return;
+ }
}
fallback:
commit a02069df2ddc259d65ad468834f7968d283b713f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Fri Oct 28 11:30:37 2011 +0100
sna: Faster unclipped spans
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 31f4013..2a9f2a4 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1837,24 +1837,38 @@ no_damage_translate:
dx += drawable->x;
dy += drawable->y;
no_damage:
- {
- unsigned offset = dx|dy;
+ if (dx|dy) {
do {
- *(DDXPointRec *)b = *pt++;
- if (offset) {
+ int nbox = n;
+ if (nbox > last_box - box)
+ nbox = last_box - box;
+ n -= nbox;
+ do {
+ *(DDXPointRec *)b = *pt++;
b->x1 += dx;
b->y1 += dy;
- }
- b->x2 = b->x1 + (int)*width++;
- b->y2 = b->y1 + 1;
-
- if (++b == last_box) {
- fill.boxes(sna, &fill, box, last_box - box);
- b = box;
- }
- } while (--n);
- if (b != box)
+ b->x2 = b->x1 + (int)*width++;
+ b->y2 = b->y1 + 1;
+ b++;
+ } while (--nbox);
fill.boxes(sna, &fill, box, b - box);
+ b = box;
+ } while (n);
+ } else {
+ do {
+ int nbox = n;
+ if (nbox > last_box - box)
+ nbox = last_box - box;
+ n -= nbox;
+ do {
+ *(DDXPointRec *)b = *pt++;
+ b->x2 = b->x1 + (int)*width++;
+ b->y2 = b->y1 + 1;
+ b++;
+ } while (--nbox);
+ fill.boxes(sna, &fill, box, b - box);
+ b = box;
+ } while (n);
}
goto done;
@@ -2192,9 +2206,8 @@ sna_fill_spans(DrawablePtr drawable, GCPtr gc, int n,
RegionRec region;
unsigned flags;
- DBG(("%s(n=%d, pt[0]=(%d, %d)\n",
- __FUNCTION__, n, pt[0].x, pt[0].y));
-
+ DBG(("%s(n=%d, pt[0]=(%d, %d)+%d, sorted=%d\n",
+ __FUNCTION__, n, pt[0].x, pt[0].y, width[0], sorted));
flags = sna_spans_extents(drawable, gc, n, pt, width, ®ion.extents);
if (flags == 0)
More information about the xorg-commit
mailing list