sna: Check for loss of state after setting up a fill BLT op

If we install a BLT fill operation early in the drawing sequence (i.e.
before calling a mi routine), we may lose our state to delayed
initialisation of sources and so need to subsequently recheck.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2013-11-04 16:45:00 +00:00
parent fcd081ca77
commit a0d1de962a
2 changed files with 43 additions and 6 deletions

View File

@ -156,6 +156,7 @@ static bool sna_blt_fill_init(struct sna *sna,
blt->pixel = pixel;
blt->bpp = bpp;
blt->alu = alu;
kgem_set_mode(kgem, KGEM_BLT, bo);
if (!kgem_check_batch(kgem, 14) ||
@ -233,11 +234,14 @@ noinline static void sna_blt_fill_begin(struct sna *sna,
struct kgem *kgem = &sna->kgem;
uint32_t *b;
_kgem_submit(kgem);
_kgem_set_mode(kgem, KGEM_BLT);
if (kgem->nreloc) {
_kgem_submit(kgem);
_kgem_set_mode(kgem, KGEM_BLT);
assert(kgem->nbatch == 0);
}
assert(kgem->nbatch == 0);
b = kgem->batch;
assert(kgem->mode == KGEM_BLT);
b = kgem->batch + kgem->nbatch;
if (sna->kgem.gen >= 0100) {
b[0] = XY_SETUP_MONO_PATTERN_SL_BLT | 8;
if (blt->bpp == 32)
@ -255,7 +259,7 @@ noinline static void sna_blt_fill_begin(struct sna *sna,
b[7] = blt->pixel;
b[9] = 0;
b[9] = 0;
kgem->nbatch = 10;
kgem->nbatch += 10;
} else {
b[0] = XY_SETUP_MONO_PATTERN_SL_BLT | 7;
if (blt->bpp == 32)
@ -272,7 +276,7 @@ noinline static void sna_blt_fill_begin(struct sna *sna,
b[6] = blt->pixel;
b[7] = 0;
b[8] = 0;
kgem->nbatch = 9;
kgem->nbatch += 9;
}
}
@ -1067,6 +1071,7 @@ static void blt_composite_fill_boxes_no_offset__thread(struct sna *sna,
DBG(("%s: %08x x %d\n", __FUNCTION__, blt->pixel, nbox));
sna_vertex_lock(&sna->render);
assert(kgem->mode == KGEM_BLT);
if (!kgem_check_batch(kgem, 3)) {
sna_vertex_wait__locked(&sna->render);
sna_blt_fill_begin(sna, blt);
@ -1177,6 +1182,7 @@ static void blt_composite_fill_boxes__thread(struct sna *sna,
DBG(("%s: %08x x %d\n", __FUNCTION__, blt->pixel, nbox));
sna_vertex_lock(&sna->render);
assert(kgem->mode == KGEM_BLT);
if (!kgem_check_batch(kgem, 3)) {
sna_vertex_wait__locked(&sna->render);
sna_blt_fill_begin(sna, blt);
@ -2730,6 +2736,16 @@ static void sna_blt_fill_op_blt(struct sna *sna,
int16_t x, int16_t y,
int16_t width, int16_t height)
{
if (sna->blt_state.fill_bo != op->base.u.blt.bo[0]->unique_id) {
const struct sna_blt_state *blt = &op->base.u.blt;
sna_blt_fill_begin(sna, blt);
sna->blt_state.fill_bo = blt->bo[0]->unique_id;
sna->blt_state.fill_pixel = blt->pixel;
sna->blt_state.fill_alu = blt->alu;
}
sna_blt_fill_one(sna, &op->base.u.blt, x, y, width, height);
}
@ -2737,6 +2753,16 @@ fastcall static void sna_blt_fill_op_box(struct sna *sna,
const struct sna_fill_op *op,
const BoxRec *box)
{
if (sna->blt_state.fill_bo != op->base.u.blt.bo[0]->unique_id) {
const struct sna_blt_state *blt = &op->base.u.blt;
sna_blt_fill_begin(sna, blt);
sna->blt_state.fill_bo = blt->bo[0]->unique_id;
sna->blt_state.fill_pixel = blt->pixel;
sna->blt_state.fill_alu = blt->alu;
}
_sna_blt_fill_box(sna, &op->base.u.blt, box);
}
@ -2745,6 +2771,16 @@ fastcall static void sna_blt_fill_op_boxes(struct sna *sna,
const BoxRec *box,
int nbox)
{
if (sna->blt_state.fill_bo != op->base.u.blt.bo[0]->unique_id) {
const struct sna_blt_state *blt = &op->base.u.blt;
sna_blt_fill_begin(sna, blt);
sna->blt_state.fill_bo = blt->bo[0]->unique_id;
sna->blt_state.fill_pixel = blt->pixel;
sna->blt_state.fill_alu = blt->alu;
}
_sna_blt_fill_boxes(sna, &op->base.u.blt, box, nbox);
}

View File

@ -113,6 +113,7 @@ struct sna_composite_op {
uint32_t inplace :1;
uint32_t overwrites:1;
uint32_t bpp : 6;
uint32_t alu : 4;
uint32_t cmd;
uint32_t br13;