xf86-video-intel: src/sna/sna_accel.c
Chris Wilson
ickle at kemper.freedesktop.org
Wed Jan 29 03:24:33 PST 2014
src/sna/sna_accel.c | 50 ++++++++++++++++++++++++--------------------------
1 file changed, 24 insertions(+), 26 deletions(-)
New commits:
commit 001dd080e15157961188c96718669dd1b4d6b939
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date: Wed Jan 29 11:15:45 2014 +0000
sna: Do not use color corrected pixel values for comparing against gc
Dashed zero-width lines devolve into two passes (first to draw the
foreground dashes, and then to draw the gaps). The code was using the
pixel value to decide which phase was being drawn -- however the color
on the gc is not always bit exact (e.g. alpha channel) with the pixel
value. As a result, we would oft miss drawing anything when rendering
into the scanout.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1059152
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 b1744ae..36ad9b3 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -6457,6 +6457,7 @@ struct sna_fill_spans {
PixmapPtr pixmap;
RegionRec region;
unsigned flags;
+ uint32_t phase;
struct kgem_bo *bo;
struct sna_damage **damage;
int16_t dx, dy;
@@ -6630,9 +6631,7 @@ sna_poly_point__dash(DrawablePtr drawable, GCPtr gc,
int mode, int n, DDXPointPtr pt)
{
struct sna_fill_spans *data = sna_gc(gc)->priv;
- struct sna_fill_op *op = data->op;
-
- if (op->base.u.blt.pixel == gc->fgPixel)
+ if (data->phase == gc->fgPixel)
sna_poly_point__fill(drawable, gc, mode, n, pt);
}
@@ -6641,9 +6640,7 @@ sna_poly_point__dash_clip_extents(DrawablePtr drawable, GCPtr gc,
int mode, int n, DDXPointPtr pt)
{
struct sna_fill_spans *data = sna_gc(gc)->priv;
- struct sna_fill_op *op = data->op;
-
- if (op->base.u.blt.pixel == gc->fgPixel)
+ if (data->phase == gc->fgPixel)
sna_poly_point__fill_clip_extents(drawable, gc, mode, n, pt);
}
@@ -6652,9 +6649,7 @@ sna_poly_point__dash_clip_boxes(DrawablePtr drawable, GCPtr gc,
int mode, int n, DDXPointPtr pt)
{
struct sna_fill_spans *data = sna_gc(gc)->priv;
- struct sna_fill_op *op = data->op;
-
- if (op->base.u.blt.pixel == gc->fgPixel)
+ if (data->phase == gc->fgPixel)
sna_poly_point__fill_clip_boxes(drawable, gc, mode, n, pt);
}
@@ -6707,9 +6702,7 @@ sna_fill_spans__dash(DrawablePtr drawable,
DDXPointPtr pt, int *width, int sorted)
{
struct sna_fill_spans *data = sna_gc(gc)->priv;
- struct sna_fill_op *op = data->op;
-
- if (op->base.u.blt.pixel == gc->fgPixel)
+ if (data->phase == gc->fgPixel)
sna_fill_spans__fill(drawable, gc, n, pt, width, sorted);
}
@@ -6750,9 +6743,7 @@ sna_fill_spans__dash_offset(DrawablePtr drawable,
DDXPointPtr pt, int *width, int sorted)
{
struct sna_fill_spans *data = sna_gc(gc)->priv;
- struct sna_fill_op *op = data->op;
-
- if (op->base.u.blt.pixel == gc->fgPixel)
+ if (data->phase == gc->fgPixel)
sna_fill_spans__fill_offset(drawable, gc, n, pt, width, sorted);
}
@@ -6805,9 +6796,7 @@ sna_fill_spans__dash_clip_extents(DrawablePtr drawable,
DDXPointPtr pt, int *width, int sorted)
{
struct sna_fill_spans *data = sna_gc(gc)->priv;
- struct sna_fill_op *op = data->op;
-
- if (op->base.u.blt.pixel == gc->fgPixel)
+ if (data->phase == gc->fgPixel)
sna_fill_spans__fill_clip_extents(drawable, gc, n, pt, width, sorted);
}
@@ -6889,9 +6878,7 @@ sna_fill_spans__dash_clip_boxes(DrawablePtr drawable,
DDXPointPtr pt, int *width, int sorted)
{
struct sna_fill_spans *data = sna_gc(gc)->priv;
- struct sna_fill_op *op = data->op;
-
- if (op->base.u.blt.pixel == gc->fgPixel)
+ if (data->phase == gc->fgPixel)
sna_fill_spans__fill_clip_boxes(drawable, gc, n, pt, width, sorted);
}
@@ -9206,7 +9193,11 @@ spans_fallback:
}
assert(gc->miTranslate);
- DBG(("%s: miZeroLine (solid dash)\n", __FUNCTION__));
+ DBG(("%s: miZeroLine (solid dash, clipped? %d (complex? %d)), fg pass [%08x]\n",
+ __FUNCTION__,
+ !!(data.flags & 2), data.flags & 2 && !region_is_singular(&data.region),
+ gc->fgPixel));
+
if (!sna_fill_init_blt(&fill,
data.sna, data.pixmap,
data.bo, gc->alu, color,
@@ -9214,14 +9205,21 @@ spans_fallback:
goto fallback;
gc->ops = &sna_gc_ops__tmp;
+ data.phase = gc->fgPixel;
miZeroDashLine(drawable, gc, mode, n, pt);
fill.done(data.sna, &fill);
+ DBG(("%s: miZeroLine (solid dash, clipped? %d (complex? %d)), bg pass [%08x]\n",
+ __FUNCTION__,
+ !!(data.flags & 2), data.flags & 2 && !region_is_singular(&data.region),
+ gc->bgPixel));
+
if (sna_fill_init_blt(&fill,
- data.sna, data.pixmap,
- data.bo, gc->alu,
- gc->bgPixel,
- FILL_POINTS | FILL_SPANS)) {
+ data.sna, data.pixmap,
+ data.bo, gc->alu,
+ gc->bgPixel,
+ FILL_POINTS | FILL_SPANS)) {
+ data.phase = gc->bgPixel;
miZeroDashLine(drawable, gc, mode, n, pt);
fill.done(data.sna, &fill);
}
More information about the xorg-commit
mailing list