diff options
Diffstat (limited to 'src/sna/gen7_render.c')
-rw-r--r-- | src/sna/gen7_render.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c index ff046315..e2486c65 100644 --- a/src/sna/gen7_render.c +++ b/src/sna/gen7_render.c @@ -2036,6 +2036,7 @@ gen7_render_video(struct sna *sna, kgem_set_mode(&sna->kgem, KGEM_RENDER); if (!kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)) { kgem_submit(&sna->kgem); + assert(kgem_check_bo(&sna->kgem, tmp.dst.bo, frame->bo, NULL)); _kgem_set_mode(&sna->kgem, KGEM_RENDER); } @@ -2662,6 +2663,10 @@ gen7_render_composite(struct sna *sna, tmp->dst.bo, tmp->src.bo, tmp->mask.bo, NULL)) { kgem_submit(&sna->kgem); + if (!kgem_check_bo(&sna->kgem, + tmp->dst.bo, tmp->src.bo, tmp->mask.bo, + NULL)) + goto cleanup_mask; _kgem_set_mode(&sna->kgem, KGEM_RENDER); } @@ -2669,6 +2674,9 @@ gen7_render_composite(struct sna *sna, gen7_align_vertex(sna, tmp); return TRUE; +cleanup_mask: + if (tmp->mask.bo) + kgem_bo_destroy(&sna->kgem, tmp->mask.bo); cleanup_src: if (tmp->src.bo) kgem_bo_destroy(&sna->kgem, tmp->src.bo); @@ -3065,6 +3073,10 @@ gen7_render_composite_spans(struct sna *sna, tmp->base.dst.bo, tmp->base.src.bo, NULL)) { kgem_submit(&sna->kgem); + if (!kgem_check_bo(&sna->kgem, + tmp->base.dst.bo, tmp->base.src.bo, + NULL)) + goto cleanup_src; _kgem_set_mode(&sna->kgem, KGEM_RENDER); } @@ -3072,6 +3084,9 @@ gen7_render_composite_spans(struct sna *sna, gen7_align_vertex(sna, &tmp->base); return TRUE; +cleanup_src: + if (tmp->base.src.bo) + kgem_bo_destroy(&sna->kgem, tmp->base.src.bo); cleanup_dst: if (tmp->base.redirect.real_bo) kgem_bo_destroy(&sna->kgem, tmp->base.dst.bo); @@ -3252,6 +3267,8 @@ fallback: kgem_set_mode(&sna->kgem, KGEM_RENDER); if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) { kgem_submit(&sna->kgem); + if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) + goto fallback; _kgem_set_mode(&sna->kgem, KGEM_RENDER); } @@ -3412,6 +3429,8 @@ fallback: kgem_set_mode(&sna->kgem, KGEM_RENDER); if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) { kgem_submit(&sna->kgem); + if (!kgem_check_bo(&sna->kgem, dst_bo, src_bo, NULL)) + goto fallback; _kgem_set_mode(&sna->kgem, KGEM_RENDER); } @@ -3564,8 +3583,10 @@ gen7_render_fill_boxes(struct sna *sna, tmp.u.gen7.nr_inputs = 1; tmp.u.gen7.ve_id = 1; - if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) + if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) { kgem_submit(&sna->kgem); + assert(kgem_check_bo(&sna->kgem, dst_bo, NULL)); + } gen7_emit_fill_state(sna, &tmp); gen7_align_vertex(sna, &tmp); @@ -3761,8 +3782,10 @@ gen7_render_fill(struct sna *sna, uint8_t alu, op->base.u.gen7.nr_inputs = 1; op->base.u.gen7.ve_id = 1; - if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) + if (!kgem_check_bo(&sna->kgem, dst_bo, NULL)) { kgem_submit(&sna->kgem); + assert(kgem_check_bo(&sna->kgem, dst_bo, NULL)); + } gen7_emit_fill_state(sna, &op->base); gen7_align_vertex(sna, &op->base); @@ -3852,8 +3875,10 @@ gen7_render_fill_one(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo, tmp.u.gen7.nr_inputs = 1; tmp.u.gen7.ve_id = 1; - if (!kgem_check_bo(&sna->kgem, bo, NULL)) + if (!kgem_check_bo(&sna->kgem, bo, NULL)) { _kgem_submit(&sna->kgem); + assert(kgem_check_bo(&sna->kgem, bo, NULL)); + } gen7_emit_fill_state(sna, &tmp); gen7_align_vertex(sna, &tmp); @@ -3949,8 +3974,10 @@ gen7_render_clear(struct sna *sna, PixmapPtr dst, struct kgem_bo *bo) tmp.u.gen7.nr_inputs = 1; tmp.u.gen7.ve_id = 1; - if (!kgem_check_bo(&sna->kgem, bo, NULL)) + if (!kgem_check_bo(&sna->kgem, bo, NULL)) { _kgem_submit(&sna->kgem); + assert(kgem_check_bo(&sna->kgem, bo, NULL)); + } gen7_emit_fill_state(sna, &tmp); gen7_align_vertex(sna, &tmp); |