sna: Pass a BoxRec to the fill op
For many of the core drawing routines, passing a BoxRec for the fill is more convenient since they already have one generated by the clip intersection. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
98bca2dbb9
commit
7e7759db4c
|
|
@ -2038,6 +2038,24 @@ gen2_render_fill_blt(struct sna *sna,
|
|||
VERTEX(y);
|
||||
}
|
||||
|
||||
fastcall static void
|
||||
gen2_render_fill_box(struct sna *sna,
|
||||
const struct sna_fill_op *op,
|
||||
const BoxRec *box)
|
||||
{
|
||||
if (!gen2_get_rectangles(sna, &op->base, 1)) {
|
||||
gen2_emit_fill_state(sna, &op->base);
|
||||
gen2_get_rectangles(sna, &op->base, 1);
|
||||
}
|
||||
|
||||
VERTEX(box->x2);
|
||||
VERTEX(box->y2);
|
||||
VERTEX(box->x1);
|
||||
VERTEX(box->y2);
|
||||
VERTEX(box->x1);
|
||||
VERTEX(box->y1);
|
||||
}
|
||||
|
||||
static void
|
||||
gen2_render_fill_done(struct sna *sna, const struct sna_fill_op *op)
|
||||
{
|
||||
|
|
@ -2096,6 +2114,7 @@ gen2_render_fill(struct sna *sna, uint8_t alu,
|
|||
}
|
||||
|
||||
tmp->blt = gen2_render_fill_blt;
|
||||
tmp->box = gen2_render_fill_box;
|
||||
tmp->done = gen2_render_fill_done;
|
||||
|
||||
gen2_emit_fill_state(sna, &tmp->base);
|
||||
|
|
|
|||
|
|
@ -3793,6 +3793,24 @@ gen3_render_fill_blt(struct sna *sna,
|
|||
OUT_VERTEX(y);
|
||||
}
|
||||
|
||||
fastcall static void
|
||||
gen3_render_fill_box(struct sna *sna,
|
||||
const struct sna_fill_op *op,
|
||||
const BoxRec *box)
|
||||
{
|
||||
if (!gen3_get_rectangles(sna, &op->base, 1)) {
|
||||
gen3_emit_composite_state(sna, &op->base);
|
||||
gen3_get_rectangles(sna, &op->base, 1);
|
||||
}
|
||||
|
||||
OUT_VERTEX(box->x2);
|
||||
OUT_VERTEX(box->y2);
|
||||
OUT_VERTEX(box->x1);
|
||||
OUT_VERTEX(box->y2);
|
||||
OUT_VERTEX(box->x1);
|
||||
OUT_VERTEX(box->y1);
|
||||
}
|
||||
|
||||
static void
|
||||
gen3_render_fill_done(struct sna *sna, const struct sna_fill_op *op)
|
||||
{
|
||||
|
|
@ -3852,6 +3870,7 @@ gen3_render_fill(struct sna *sna, uint8_t alu,
|
|||
kgem_submit(&sna->kgem);
|
||||
|
||||
tmp->blt = gen3_render_fill_blt;
|
||||
tmp->box = gen3_render_fill_box;
|
||||
tmp->done = gen3_render_fill_done;
|
||||
|
||||
gen3_emit_composite_state(sna, &tmp->base);
|
||||
|
|
|
|||
|
|
@ -2503,6 +2503,16 @@ gen4_render_fill_blt(struct sna *sna, const struct sna_fill_op *op,
|
|||
gen4_render_fill_rectangle(sna, &op->base, x, y, w, h);
|
||||
}
|
||||
|
||||
fastcall static void
|
||||
gen4_render_fill_box(struct sna *sna,
|
||||
const struct sna_fill_op *op,
|
||||
const BoxRec *box)
|
||||
{
|
||||
gen4_render_fill_rectangle(sna, &op->base,
|
||||
box->x1, box->y1,
|
||||
box->x2-box->x1, box->y2-box->y1);
|
||||
}
|
||||
|
||||
static void
|
||||
gen4_render_fill_done(struct sna *sna, const struct sna_fill_op *op)
|
||||
{
|
||||
|
|
@ -2568,6 +2578,7 @@ gen4_render_fill(struct sna *sna, uint8_t alu,
|
|||
gen4_align_vertex(sna, &op->base);
|
||||
|
||||
op->blt = gen4_render_fill_blt;
|
||||
op->box = gen4_render_fill_box;
|
||||
op->done = gen4_render_fill_done;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2504,6 +2504,32 @@ gen5_render_fill_blt(struct sna *sna,
|
|||
OUT_VERTEX_F(0);
|
||||
}
|
||||
|
||||
fastcall static void
|
||||
gen5_render_fill_box(struct sna *sna,
|
||||
const struct sna_fill_op *op,
|
||||
const BoxRec *box)
|
||||
{
|
||||
DBG(("%s: (%d, %d),(%d, %d)\n", __FUNCTION__,
|
||||
box->x1, box->y1, box->x2, box->y2));
|
||||
|
||||
if (!gen5_get_rectangles(sna, &op->base, 1)) {
|
||||
gen5_fill_bind_surfaces(sna, &op->base);
|
||||
gen5_get_rectangles(sna, &op->base, 1);
|
||||
}
|
||||
|
||||
OUT_VERTEX(box->x2, box->y2);
|
||||
OUT_VERTEX_F(1);
|
||||
OUT_VERTEX_F(1);
|
||||
|
||||
OUT_VERTEX(box->x1, box->y2);
|
||||
OUT_VERTEX_F(0);
|
||||
OUT_VERTEX_F(1);
|
||||
|
||||
OUT_VERTEX(box->x1, box->y1);
|
||||
OUT_VERTEX_F(0);
|
||||
OUT_VERTEX_F(0);
|
||||
}
|
||||
|
||||
static void
|
||||
gen5_render_fill_done(struct sna *sna,
|
||||
const struct sna_fill_op *op)
|
||||
|
|
@ -2567,6 +2593,7 @@ gen5_render_fill(struct sna *sna, uint8_t alu,
|
|||
gen5_align_vertex(sna, &op->base);
|
||||
|
||||
op->blt = gen5_render_fill_blt;
|
||||
op->box = gen5_render_fill_box;
|
||||
op->done = gen5_render_fill_done;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2720,6 +2720,32 @@ gen6_render_fill_blt(struct sna *sna,
|
|||
OUT_VERTEX_F(0);
|
||||
}
|
||||
|
||||
fastcall static void
|
||||
gen6_render_fill_box(struct sna *sna,
|
||||
const struct sna_fill_op *op,
|
||||
const BoxRec *box)
|
||||
{
|
||||
DBG(("%s: (%d, %d),(%d, %d)\n", __FUNCTION__,
|
||||
box->x1, box->y1, box->x2, box->y2));
|
||||
|
||||
if (!gen6_get_rectangles(sna, &op->base, 1)) {
|
||||
gen6_emit_fill_state(sna, &op->base);
|
||||
gen6_get_rectangles(sna, &op->base, 1);
|
||||
}
|
||||
|
||||
OUT_VERTEX(box->x2, box->y2);
|
||||
OUT_VERTEX_F(1);
|
||||
OUT_VERTEX_F(1);
|
||||
|
||||
OUT_VERTEX(box->x1, box->y2);
|
||||
OUT_VERTEX_F(0);
|
||||
OUT_VERTEX_F(1);
|
||||
|
||||
OUT_VERTEX(box->x1, box->y1);
|
||||
OUT_VERTEX_F(0);
|
||||
OUT_VERTEX_F(0);
|
||||
}
|
||||
|
||||
static void
|
||||
gen6_render_fill_done(struct sna *sna, const struct sna_fill_op *op)
|
||||
{
|
||||
|
|
@ -2791,6 +2817,7 @@ gen6_render_fill(struct sna *sna, uint8_t alu,
|
|||
gen6_align_vertex(sna, &op->base);
|
||||
|
||||
op->blt = gen6_render_fill_blt;
|
||||
op->box = gen6_render_fill_box;
|
||||
op->done = gen6_render_fill_done;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2870,6 +2870,32 @@ gen7_render_fill_blt(struct sna *sna,
|
|||
OUT_VERTEX_F(0);
|
||||
}
|
||||
|
||||
fastcall static void
|
||||
gen7_render_fill_box(struct sna *sna,
|
||||
const struct sna_fill_op *op,
|
||||
const BoxRec *box)
|
||||
{
|
||||
DBG(("%s: (%d, %d),(%d, %d)\n", __FUNCTION__,
|
||||
box->x1, box->y1, box->x2, box->y2));
|
||||
|
||||
if (!gen7_get_rectangles(sna, &op->base, 1)) {
|
||||
gen7_emit_fill_state(sna, &op->base);
|
||||
gen7_get_rectangles(sna, &op->base, 1);
|
||||
}
|
||||
|
||||
OUT_VERTEX(box->x2, box->y2);
|
||||
OUT_VERTEX_F(1);
|
||||
OUT_VERTEX_F(1);
|
||||
|
||||
OUT_VERTEX(box->x1, box->y2);
|
||||
OUT_VERTEX_F(0);
|
||||
OUT_VERTEX_F(1);
|
||||
|
||||
OUT_VERTEX(box->x1, box->y1);
|
||||
OUT_VERTEX_F(0);
|
||||
OUT_VERTEX_F(0);
|
||||
}
|
||||
|
||||
static void
|
||||
gen7_render_fill_done(struct sna *sna, const struct sna_fill_op *op)
|
||||
{
|
||||
|
|
@ -2941,6 +2967,7 @@ gen7_render_fill(struct sna *sna, uint8_t alu,
|
|||
gen7_align_vertex(sna, &op->base);
|
||||
|
||||
op->blt = gen7_render_fill_blt;
|
||||
op->box = gen7_render_fill_box;
|
||||
op->done = gen7_render_fill_done;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2298,9 +2298,7 @@ sna_poly_line_blt(DrawablePtr drawable,
|
|||
DBG(("%s: blt (%d, %d), (%d, %d)\n",
|
||||
__FUNCTION__,
|
||||
r.x1, r.y1, r.x2, r.y2));
|
||||
fill.blt(sna, &fill,
|
||||
r.x1, r.y1,
|
||||
r.x2-r.x1, r.y2-r.y1);
|
||||
fill.box(sna, &fill, &r);
|
||||
if (damage) {
|
||||
assert_pixmap_contains_box(pixmap, &r);
|
||||
sna_damage_add_box(damage, &r);
|
||||
|
|
@ -2361,9 +2359,7 @@ sna_poly_line_blt(DrawablePtr drawable,
|
|||
DBG(("%s: blt (%d, %d), (%d, %d)\n",
|
||||
__FUNCTION__,
|
||||
r.x1, r.y1, r.x2, r.y2));
|
||||
fill.blt(sna, &fill,
|
||||
r.x1, r.y1,
|
||||
r.x2-r.x1, r.y2-r.y1);
|
||||
fill.box(sna, &fill, &r);
|
||||
if (damage) {
|
||||
assert_pixmap_contains_box(pixmap, &r);
|
||||
sna_damage_add_box(damage, &r);
|
||||
|
|
@ -2681,9 +2677,7 @@ sna_poly_segment_blt(DrawablePtr drawable,
|
|||
r.x2 += dx;
|
||||
r.y1 += dy;
|
||||
r.y2 += dy;
|
||||
fill.blt(sna, &fill,
|
||||
r.x1, r.y1,
|
||||
r.x2-r.x1, r.y2-r.y1);
|
||||
fill.box(sna, &fill, &r);
|
||||
if (damage) {
|
||||
assert_pixmap_contains_box(pixmap, &r);
|
||||
sna_damage_add_box(damage, &r);
|
||||
|
|
@ -3047,9 +3041,7 @@ sna_poly_fill_rect_blt(DrawablePtr drawable,
|
|||
r.x2 += dx;
|
||||
r.y1 += dy;
|
||||
r.y2 += dy;
|
||||
fill.blt(sna, &fill,
|
||||
r.x1, r.y1,
|
||||
r.x2-r.x1, r.y2-r.y1);
|
||||
fill.box(sna, &fill, &r);
|
||||
if (damage) {
|
||||
assert_pixmap_contains_box(pixmap, &r);
|
||||
sna_damage_add_box(damage, &r);
|
||||
|
|
@ -3078,9 +3070,7 @@ sna_poly_fill_rect_blt(DrawablePtr drawable,
|
|||
box->x2 += dx;
|
||||
box->y1 += dy;
|
||||
box->y2 += dy;
|
||||
fill.blt(sna, &fill,
|
||||
box->x1, box->y1,
|
||||
box->x2-box->x1, box->y2-box->y1);
|
||||
fill.box(sna, &fill, box);
|
||||
if (damage) {
|
||||
assert_pixmap_contains_box(pixmap, box);
|
||||
sna_damage_add_box(damage, box);
|
||||
|
|
@ -3155,9 +3145,7 @@ sna_poly_fill_rect_tiled(DrawablePtr drawable,
|
|||
r.x2 += dx;
|
||||
r.y1 += dy;
|
||||
r.y2 += dy;
|
||||
fill.blt(sna, &fill,
|
||||
r.x1, r.y1,
|
||||
r.x2-r.x1, r.y2-r.y1);
|
||||
fill.box(sna, &fill, &r);
|
||||
if (damage) {
|
||||
assert_pixmap_contains_box(pixmap, &r);
|
||||
sna_damage_add_box(damage, &r);
|
||||
|
|
@ -3186,10 +3174,7 @@ sna_poly_fill_rect_tiled(DrawablePtr drawable,
|
|||
box->x2 += dx;
|
||||
box->y1 += dy;
|
||||
box->y2 += dy;
|
||||
fill.blt(sna, &fill,
|
||||
box->x1, box->y1,
|
||||
box->x2-box->x1,
|
||||
box->y2-box->y1);
|
||||
fill.box(sna, &fill, box);
|
||||
if (damage) {
|
||||
assert_pixmap_contains_box(pixmap, box);
|
||||
sna_damage_add_box(damage, box);
|
||||
|
|
|
|||
|
|
@ -1272,6 +1272,32 @@ static void sna_blt_fill_op_blt(struct sna *sna,
|
|||
sna_blt_fill_one(sna, &op->base.u.blt, x, y, width, height);
|
||||
}
|
||||
|
||||
fastcall static void sna_blt_fill_op_box(struct sna *sna,
|
||||
const struct sna_fill_op *op,
|
||||
const BoxRec *box)
|
||||
{
|
||||
struct kgem *kgem = &sna->kgem;
|
||||
uint32_t *b;
|
||||
|
||||
DBG(("%s: (%d, %d), (%d, %d): %08x\n", __FUNCTION__,
|
||||
box->x1, box->y1, box->x2, box->y2,
|
||||
op->base.u.blt.pixel));
|
||||
|
||||
assert(box->x1 >= 0);
|
||||
assert(box->y1 >= 0);
|
||||
assert(box->y2 * op->base.u.blt.bo[0]->pitch <= op->base.u.blt.bo[0]->size);
|
||||
|
||||
if (!kgem_check_batch(kgem, 3))
|
||||
sna_blt_fill_begin(sna, &op->base.u.blt);
|
||||
|
||||
b = kgem->batch + kgem->nbatch;
|
||||
kgem->nbatch += 3;
|
||||
|
||||
b[0] = op->base.u.blt.cmd;
|
||||
b[1] = box->y1 << 16 | box->x1;
|
||||
b[2] = box->y2 << 16 | box->x2;
|
||||
}
|
||||
|
||||
static void sna_blt_fill_op_done(struct sna *sna,
|
||||
const struct sna_fill_op *fill)
|
||||
{
|
||||
|
|
@ -1300,6 +1326,7 @@ bool sna_blt_fill(struct sna *sna, uint8_t alu,
|
|||
return FALSE;
|
||||
|
||||
fill->blt = sna_blt_fill_op_blt;
|
||||
fill->box = sna_blt_fill_op_box;
|
||||
fill->done = sna_blt_fill_op_done;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -157,6 +157,9 @@ struct sna_fill_op {
|
|||
|
||||
void (*blt)(struct sna *sna, const struct sna_fill_op *op,
|
||||
int16_t x, int16_t y, int16_t w, int16_t h);
|
||||
fastcall void (*box)(struct sna *sna,
|
||||
const struct sna_fill_op *op,
|
||||
const BoxRec *box);
|
||||
void (*done)(struct sna *sna, const struct sna_fill_op *op);
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue