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 <jirislaby@gmail.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2013-10-10 00:15:55 +01:00
parent b16999da21
commit 97d809c26b
9 changed files with 58 additions and 35 deletions

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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));

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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));

View File

@ -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,