From 97d809c26bec2c0120f2dc0bcfd840379bd996fa Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 10 Oct 2013 00:15:55 +0100 Subject: sna: Pass usage hint down to render fill routines For the scanlines emitted for rendering Core drawing primitives, it is preferable to use the BLT engine, so pass those hints down. Reported-by: Jiri Slaby Signed-off-by: Chris Wilson --- src/sna/gen2_render.c | 2 +- src/sna/gen3_render.c | 2 +- src/sna/gen4_render.c | 2 +- src/sna/gen5_render.c | 2 +- src/sna/gen6_render.c | 15 ++++++++++----- src/sna/gen7_render.c | 15 ++++++++++----- src/sna/sna_accel.c | 48 +++++++++++++++++++++++++++++------------------- src/sna/sna_render.c | 2 +- src/sna/sna_render.h | 5 ++++- 9 files changed, 58 insertions(+), 35 deletions(-) (limited to 'src') diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c index 9ae8352a..2ee534db 100644 --- a/src/sna/gen2_render.c +++ b/src/sna/gen2_render.c @@ -2943,7 +2943,7 @@ gen2_render_fill_op_done(struct sna *sna, const struct sna_fill_op *op) static bool gen2_render_fill(struct sna *sna, uint8_t alu, PixmapPtr dst, struct kgem_bo *dst_bo, - uint32_t color, + uint32_t color, unsigned flags, struct sna_fill_op *tmp) { #if NO_FILL diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c index 2445b91a..cec35f45 100644 --- a/src/sna/gen3_render.c +++ b/src/sna/gen3_render.c @@ -6045,7 +6045,7 @@ gen3_render_fill_op_done(struct sna *sna, const struct sna_fill_op *op) static bool gen3_render_fill(struct sna *sna, uint8_t alu, PixmapPtr dst, struct kgem_bo *dst_bo, - uint32_t color, + uint32_t color, unsigned flags, struct sna_fill_op *tmp) { #if NO_FILL diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c index 48a8852d..fe138737 100644 --- a/src/sna/gen4_render.c +++ b/src/sna/gen4_render.c @@ -2716,7 +2716,7 @@ gen4_render_fill_op_done(struct sna *sna, const struct sna_fill_op *op) static bool gen4_render_fill(struct sna *sna, uint8_t alu, PixmapPtr dst, struct kgem_bo *dst_bo, - uint32_t color, + uint32_t color, unsigned flags, struct sna_fill_op *op) { if (sna_blt_fill(sna, alu, diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c index ca41a9a8..a0ef9b6e 100644 --- a/src/sna/gen5_render.c +++ b/src/sna/gen5_render.c @@ -2802,7 +2802,7 @@ gen5_render_fill_op_done(struct sna *sna, static bool gen5_render_fill(struct sna *sna, uint8_t alu, PixmapPtr dst, struct kgem_bo *dst_bo, - uint32_t color, + uint32_t color, unsigned flags, struct sna_fill_op *op) { DBG(("%s(alu=%d, color=%08x)\n", __FUNCTION__, alu, color)); diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c index 401041c2..3773c27e 100644 --- a/src/sna/gen6_render.c +++ b/src/sna/gen6_render.c @@ -3110,11 +3110,15 @@ gen6_emit_fill_state(struct sna *sna, const struct sna_composite_op *op) } static inline bool prefer_blt_fill(struct sna *sna, - struct kgem_bo *bo) + struct kgem_bo *bo, + unsigned flags) { if (PREFER_RENDER) return PREFER_RENDER < 0; + if (flags & (FILL_POINTS | FILL_SPANS)) + return true; + if (untiled_tlb_miss(bo)) return true; @@ -3154,7 +3158,8 @@ gen6_render_fill_boxes(struct sna *sna, return false; } - if (prefer_blt_fill(sna, dst_bo) || !gen6_check_dst_format(format)) { + if (prefer_blt_fill(sna, dst_bo, FILL_BOXES) || + !gen6_check_dst_format(format)) { uint8_t alu = GXinvalid; if (op <= PictOpSrc) { @@ -3365,12 +3370,12 @@ gen6_render_op_fill_done(struct sna *sna, const struct sna_fill_op *op) static bool gen6_render_fill(struct sna *sna, uint8_t alu, PixmapPtr dst, struct kgem_bo *dst_bo, - uint32_t color, + uint32_t color, unsigned flags, struct sna_fill_op *op) { DBG(("%s: (alu=%d, color=%x)\n", __FUNCTION__, alu, color)); - if (prefer_blt_fill(sna, dst_bo) && + if (prefer_blt_fill(sna, dst_bo, flags) && sna_blt_fill(sna, alu, dst_bo, dst->drawable.bitsPerPixel, color, @@ -3454,7 +3459,7 @@ gen6_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo, int16_t *v; /* Prefer to use the BLT if already engaged */ - if (prefer_blt_fill(sna, bo) && + if (prefer_blt_fill(sna, bo, FILL_BOXES) && gen6_render_fill_one_try_blt(sna, dst, bo, color, x1, y1, x2, y2, alu)) return true; diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c index e17fc949..37eb8dd9 100644 --- a/src/sna/gen7_render.c +++ b/src/sna/gen7_render.c @@ -3346,8 +3346,12 @@ gen7_emit_fill_state(struct sna *sna, const struct sna_composite_op *op) } static inline bool prefer_blt_fill(struct sna *sna, - struct kgem_bo *bo) + struct kgem_bo *bo, + unsigned flags) { + if (flags & (FILL_POINTS | FILL_SPANS)) + return true; + if (untiled_tlb_miss(bo)) return true; @@ -3387,7 +3391,8 @@ gen7_render_fill_boxes(struct sna *sna, return false; } - if (prefer_blt_fill(sna, dst_bo) || !gen7_check_dst_format(format)) { + if (prefer_blt_fill(sna, dst_bo, FILL_BOXES) || + !gen7_check_dst_format(format)) { uint8_t alu = GXinvalid; if (op <= PictOpSrc) { @@ -3593,12 +3598,12 @@ gen7_render_fill_op_done(struct sna *sna, const struct sna_fill_op *op) static bool gen7_render_fill(struct sna *sna, uint8_t alu, PixmapPtr dst, struct kgem_bo *dst_bo, - uint32_t color, + uint32_t color, unsigned flags, struct sna_fill_op *op) { DBG(("%s: (alu=%d, color=%x)\n", __FUNCTION__, alu, color)); - if (prefer_blt_fill(sna, dst_bo) && + if (prefer_blt_fill(sna, dst_bo, flags) && sna_blt_fill(sna, alu, dst_bo, dst->drawable.bitsPerPixel, color, @@ -3680,7 +3685,7 @@ gen7_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo, int16_t *v; /* Prefer to use the BLT if already engaged */ - if (prefer_blt_fill(sna, bo) && + if (prefer_blt_fill(sna, bo, FILL_BOXES) && gen7_render_fill_one_try_blt(sna, dst, bo, color, x1, y1, x2, y2, alu)) return true; diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index 7891a5f6..21bda10c 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -422,9 +422,10 @@ sna_fill_init_blt(struct sna_fill_op *fill, PixmapPtr pixmap, struct kgem_bo *bo, uint8_t alu, - uint32_t pixel) + uint32_t pixel, + unsigned flags) { - return sna->render.fill(sna, alu, pixmap, bo, pixel, fill); + return sna->render.fill(sna, alu, pixmap, bo, pixel, flags, fill); } static bool @@ -5418,7 +5419,8 @@ sna_copy_boxes(DrawablePtr src, DrawablePtr dst, GCPtr gc, if (!sna_fill_init_blt(&fill, sna, dst_pixmap, bo, - alu, src_priv->clear_color)) { + alu, src_priv->clear_color, + FILL_BOXES)) { DBG(("%s: unsupported fill\n", __FUNCTION__)); goto fallback; @@ -6140,7 +6142,8 @@ sna_poly_point__gpu(DrawablePtr drawable, GCPtr gc, if (!sna_fill_init_blt(&fill, data->sna, data->pixmap, - data->bo, gc->alu, gc->fgPixel)) + data->bo, gc->alu, gc->fgPixel, + FILL_POINTS)) return; DBG(("%s: count=%d\n", __FUNCTION__, n)); @@ -6541,7 +6544,7 @@ sna_fill_spans_blt(DrawablePtr drawable, DBG(("%s: alu=%d, fg=%08lx, damge=%p, clipped?=%d\n", __FUNCTION__, gc->alu, gc->fgPixel, damage, clipped)); - if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel)) + if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel, FILL_SPANS)) return false; get_drawable_deltas(drawable, pixmap, &dx, &dy); @@ -7625,7 +7628,7 @@ sna_poly_point_blt(DrawablePtr drawable, DBG(("%s: alu=%d, pixel=%08lx, clipped?=%d\n", __FUNCTION__, gc->alu, gc->fgPixel, clipped)); - if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel)) + if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel, FILL_POINTS)) return false; get_drawable_deltas(drawable, pixmap, &dx, &dy); @@ -7841,7 +7844,7 @@ sna_poly_zero_line_blt(DrawablePtr drawable, DBG(("%s: alu=%d, pixel=%lx, n=%d, clipped=%d, damage=%p\n", __FUNCTION__, gc->alu, gc->fgPixel, _n, clipped, damage)); - if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel)) + if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel, FILL_SPANS)) return false; get_drawable_deltas(drawable, pixmap, &dx, &dy); @@ -8212,7 +8215,7 @@ sna_poly_line_blt(DrawablePtr drawable, DBG(("%s: alu=%d, fg=%08x\n", __FUNCTION__, gc->alu, (unsigned)pixel)); - if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel)) + if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel, FILL_BOXES)) return false; get_drawable_deltas(drawable, pixmap, &dx, &dy); @@ -8709,7 +8712,8 @@ spans_fallback: if (gc->lineStyle == LineSolid) { if (!sna_fill_init_blt(&fill, data.sna, data.pixmap, - data.bo, gc->alu, color)) + data.bo, gc->alu, color, + FILL_POINTS | FILL_SPANS)) goto fallback; data.op = &fill; @@ -8768,7 +8772,8 @@ spans_fallback: DBG(("%s: miZeroLine (solid dash)\n", __FUNCTION__)); if (!sna_fill_init_blt(&fill, data.sna, data.pixmap, - data.bo, gc->alu, color)) + data.bo, gc->alu, color, + FILL_POINTS | FILL_SPANS)) goto fallback; gc->ops = &sna_gc_ops__tmp; @@ -8778,7 +8783,8 @@ spans_fallback: if (sna_fill_init_blt(&fill, data.sna, data.pixmap, data.bo, gc->alu, - gc->bgPixel)) { + gc->bgPixel, + FILL_POINTS | FILL_SPANS)) { miZeroDashLine(drawable, gc, mode, n, pt); fill.done(data.sna, &fill); } @@ -8911,7 +8917,7 @@ sna_poly_segment_blt(DrawablePtr drawable, DBG(("%s: n=%d, alu=%d, fg=%08lx, clipped=%d\n", __FUNCTION__, n, gc->alu, gc->fgPixel, clipped)); - if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel)) + if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel, FILL_SPANS)) return false; get_drawable_deltas(drawable, pixmap, &dx, &dy); @@ -9065,7 +9071,7 @@ sna_poly_zero_segment_blt(DrawablePtr drawable, DBG(("%s: alu=%d, pixel=%lx, n=%d, clipped=%d, damage=%p\n", __FUNCTION__, gc->alu, gc->fgPixel, _n, clipped, damage)); - if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel)) + if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel, FILL_BOXES)) return false; get_drawable_deltas(drawable, pixmap, &dx, &dy); @@ -9628,7 +9634,8 @@ spans_fallback: if (!sna_fill_init_blt(&fill, data.sna, data.pixmap, - data.bo, gc->alu, color)) + data.bo, gc->alu, color, + FILL_POINTS | FILL_SPANS)) goto fallback; data.op = &fill; @@ -9773,7 +9780,7 @@ sna_poly_rectangle_blt(DrawablePtr drawable, DBG(("%s: n=%d, alu=%d, width=%d, fg=%08lx, damge=%p, clipped?=%d\n", __FUNCTION__, n, gc->alu, gc->lineWidth, gc->fgPixel, damage, clipped)); - if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel)) + if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, gc->fgPixel, FILL_BOXES)) return false; get_drawable_deltas(drawable, pixmap, &dx, &dy); @@ -10428,7 +10435,8 @@ sna_poly_arc(DrawablePtr drawable, GCPtr gc, int n, xArc *arc) if (!sna_fill_init_blt(&fill, data.sna, data.pixmap, - data.bo, gc->alu, color)) + data.bo, gc->alu, color, + FILL_POINTS | FILL_SPANS)) goto fallback; if ((data.flags & 2) == 0) { @@ -10595,7 +10603,7 @@ sna_poly_fill_rect_blt(DrawablePtr drawable, return success; } - if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel)) { + if (!sna_fill_init_blt(&fill, sna, pixmap, bo, gc->alu, pixel, FILL_BOXES)) { DBG(("%s: unsupported blt\n", __FUNCTION__)); return false; } @@ -10804,7 +10812,8 @@ sna_poly_fill_polygon(DrawablePtr draw, GCPtr gc, if (!sna_fill_init_blt(&fill, data.sna, data.pixmap, - data.bo, gc->alu, color)) + data.bo, gc->alu, color, + FILL_SPANS)) goto fallback; data.op = &fill; @@ -13252,7 +13261,8 @@ sna_poly_fill_arc(DrawablePtr draw, GCPtr gc, int n, xArc *arc) if (!sna_fill_init_blt(&fill, data.sna, data.pixmap, - data.bo, gc->alu, color)) + data.bo, gc->alu, color, + FILL_SPANS)) goto fallback; data.op = &fill; diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c index f584ee4d..6f13c214 100644 --- a/src/sna/sna_render.c +++ b/src/sna/sna_render.c @@ -203,7 +203,7 @@ no_render_fill_boxes(struct sna *sna, static bool no_render_fill(struct sna *sna, uint8_t alu, PixmapPtr dst, struct kgem_bo *dst_bo, - uint32_t color, + uint32_t color, unsigned flags, struct sna_fill_op *tmp) { DBG(("%s (alu=%d, color=%08x)\n", __FUNCTION__, alu, color)); diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h index 7f4b8e66..0262523b 100644 --- a/src/sna/sna_render.h +++ b/src/sna/sna_render.h @@ -255,8 +255,11 @@ struct sna_render { const BoxRec *box, int n); bool (*fill)(struct sna *sna, uint8_t alu, PixmapPtr dst, struct kgem_bo *dst_bo, - uint32_t color, + uint32_t color, unsigned flags, struct sna_fill_op *tmp); +#define FILL_BOXES 0x1 +#define FILL_POINTS 0x2 +#define FILL_SPANS 0x4 bool (*fill_one)(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo, uint32_t color, int16_t x1, int16_t y1, int16_t x2, int16_t y2, -- cgit v1.2.3