From 51c87f9acaa0c4eaaea581092088e1d524396f35 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 25 Oct 2013 11:23:21 +0100 Subject: [PATCH] sna/io: Propagate failure to XOR uploads Similar to the handling required for the normal upload paths. Signed-off-by: Chris Wilson --- src/sna/sna.h | 12 +++++----- src/sna/sna_blt.c | 24 ++++++++++---------- src/sna/sna_io.c | 56 ++++++++++++++++++++++++++++------------------- 3 files changed, 52 insertions(+), 40 deletions(-) diff --git a/src/sna/sna.h b/src/sna/sna.h index 304f7123..0796a372 100644 --- a/src/sna/sna.h +++ b/src/sna/sna.h @@ -884,7 +884,7 @@ bool sna_write_boxes(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, const void *src, int stride, int16_t src_dx, int16_t src_dy, const BoxRec *box, int n); -void sna_write_boxes__xor(struct sna *sna, PixmapPtr dst, +bool sna_write_boxes__xor(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, const void *src, int stride, int16_t src_dx, int16_t src_dy, const BoxRec *box, int nbox, @@ -894,11 +894,11 @@ bool sna_replace(struct sna *sna, PixmapPtr pixmap, struct kgem_bo **bo, const void *src, int stride); -struct kgem_bo *sna_replace__xor(struct sna *sna, - PixmapPtr pixmap, - struct kgem_bo *bo, - const void *src, int stride, - uint32_t and, uint32_t or); +bool sna_replace__xor(struct sna *sna, + PixmapPtr pixmap, + struct kgem_bo **bo, + const void *src, int stride, + uint32_t and, uint32_t or); bool sna_compute_composite_extents(BoxPtr extents, diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c index fdcc4198..0dd57936 100644 --- a/src/sna/sna_blt.c +++ b/src/sna/sna_blt.c @@ -1709,6 +1709,7 @@ blt_put_composite(struct sna *sna, data += (src_x - dst_x) * bpp / 8; data += (src_y - dst_y) * pitch; + assert(op->dst.bo == dst_priv->gpu_bo); sna_replace(sna, op->dst.pixmap, &dst_priv->gpu_bo, data, pitch); } else { @@ -1750,6 +1751,7 @@ fastcall static void blt_put_composite_box(struct sna *sna, data += (box->y1 + op->u.blt.sy) * pitch; data += (box->x1 + op->u.blt.sx) * bpp; + assert(op->dst.bo == dst_priv->gpu_bo); sna_replace(sna, op->dst.pixmap, &dst_priv->gpu_bo, data, pitch); } else { @@ -1788,6 +1790,7 @@ static void blt_put_composite_boxes(struct sna *sna, data += (box->y1 + op->u.blt.sy) * pitch; data += (box->x1 + op->u.blt.sx) * bpp; + assert(op->dst.bo == dst_priv->gpu_bo); sna_replace(sna, op->dst.pixmap, &dst_priv->gpu_bo, data, pitch); } else { @@ -1829,10 +1832,9 @@ blt_put_composite_with_alpha(struct sna *sna, data += (src_x - dst_x) * bpp; data += (src_y - dst_y) * pitch; - dst_priv->gpu_bo = - sna_replace__xor(sna, op->dst.pixmap, dst_priv->gpu_bo, - data, pitch, - 0xffffffff, op->u.blt.pixel); + assert(op->dst.bo == dst_priv->gpu_bo); + sna_replace__xor(sna, op->dst.pixmap, &dst_priv->gpu_bo, + data, pitch, 0xffffffff, op->u.blt.pixel); } else { BoxRec box; @@ -1871,10 +1873,9 @@ blt_put_composite_box_with_alpha(struct sna *sna, data += (box->y1 + op->u.blt.sy) * pitch; data += (box->x1 + op->u.blt.sx) * bpp; - dst_priv->gpu_bo = - sna_replace__xor(sna, op->dst.pixmap, op->dst.bo, - data, pitch, - 0xffffffff, op->u.blt.pixel); + assert(op->dst.bo == dst_priv->gpu_bo); + sna_replace__xor(sna, op->dst.pixmap, &dst_priv->gpu_bo, + data, pitch, 0xffffffff, op->u.blt.pixel); } else { sna_write_boxes__xor(sna, op->dst.pixmap, op->dst.bo, op->dst.x, op->dst.y, @@ -1909,10 +1910,9 @@ blt_put_composite_boxes_with_alpha(struct sna *sna, data += (box->y1 + op->u.blt.sy) * pitch; data += (box->x1 + op->u.blt.sx) * bpp; - dst_priv->gpu_bo = - sna_replace__xor(sna, op->dst.pixmap, op->dst.bo, - data, pitch, - 0xffffffff, op->u.blt.pixel); + assert(dst_priv->gpu_bo == op->dst.bo); + sna_replace__xor(sna, op->dst.pixmap, &dst_priv->gpu_bo, + data, pitch, 0xffffffff, op->u.blt.pixel); } else { sna_write_boxes__xor(sna, op->dst.pixmap, op->dst.bo, op->dst.x, op->dst.y, diff --git a/src/sna/sna_io.c b/src/sna/sna_io.c index 578442de..78951ca4 100644 --- a/src/sna/sna_io.c +++ b/src/sna/sna_io.c @@ -1032,7 +1032,7 @@ fallback: box, nbox); } -static void +static bool write_boxes_inplace__xor(struct kgem *kgem, const void *src, int stride, int bpp, int16_t src_dx, int16_t src_dy, struct kgem_bo *bo, int16_t dst_dx, int16_t dst_dy, @@ -1047,11 +1047,11 @@ write_boxes_inplace__xor(struct kgem *kgem, dst = kgem_bo_map(kgem, bo); if (dst == NULL) - return; + return false; sigtrap_assert(); if (sigtrap_get()) - return; + return false; do { DBG(("%s: (%d, %d) -> (%d, %d) x (%d, %d) [bpp=%d, src_pitch=%d, dst_pitch=%d]\n", __FUNCTION__, @@ -1082,6 +1082,7 @@ write_boxes_inplace__xor(struct kgem *kgem, } while (--n); sigtrap_put(); + return true; } static bool upload_inplace__xor(struct kgem *kgem, @@ -1098,7 +1099,7 @@ static bool upload_inplace__xor(struct kgem *kgem, return __upload_inplace(kgem, bo, box, n, bpp); } -void sna_write_boxes__xor(struct sna *sna, PixmapPtr dst, +bool sna_write_boxes__xor(struct sna *sna, PixmapPtr dst, struct kgem_bo *dst_bo, int16_t dst_dx, int16_t dst_dy, const void *src, int stride, int16_t src_dx, int16_t src_dy, const BoxRec *box, int nbox, @@ -1116,12 +1117,11 @@ void sna_write_boxes__xor(struct sna *sna, PixmapPtr dst, if (upload_inplace__xor(kgem, dst_bo, box, nbox, dst->drawable.bitsPerPixel)) { fallback: - write_boxes_inplace__xor(kgem, - src, stride, dst->drawable.bitsPerPixel, src_dx, src_dy, - dst_bo, dst_dx, dst_dy, - box, nbox, - and, or); - return; + return write_boxes_inplace__xor(kgem, + src, stride, dst->drawable.bitsPerPixel, src_dx, src_dy, + dst_bo, dst_dx, dst_dy, + box, nbox, + and, or); } can_blt = kgem_bo_can_blt(kgem, dst_bo) && @@ -1294,7 +1294,7 @@ tile: goto tile; } - return; + return true; } cmd = XY_SRC_COPY_BLT_CMD; @@ -1410,6 +1410,7 @@ tile: } while (nbox); sna->blt_state.fill_bo = 0; + return true; } static bool @@ -1564,12 +1565,14 @@ err: return false; } -struct kgem_bo *sna_replace__xor(struct sna *sna, - PixmapPtr pixmap, - struct kgem_bo *bo, - const void *src, int stride, - uint32_t and, uint32_t or) +bool +sna_replace__xor(struct sna *sna, + PixmapPtr pixmap, + struct kgem_bo **_bo, + const void *src, int stride, + uint32_t and, uint32_t or) { + struct kgem_bo *bo = *_bo; struct kgem *kgem = &sna->kgem; void *dst; @@ -1615,12 +1618,21 @@ struct kgem_bo *sna_replace__xor(struct sna *sna, box.x2 = pixmap->drawable.width; box.y2 = pixmap->drawable.height; - sna_write_boxes__xor(sna, pixmap, - bo, 0, 0, - src, stride, 0, 0, - &box, 1, - and, or); + if (!sna_write_boxes__xor(sna, pixmap, + bo, 0, 0, + src, stride, 0, 0, + &box, 1, + and, or)) + goto err; } - return bo; + if (bo != *_bo) + kgem_bo_destroy(kgem, *_bo); + *_bo = bo; + return true; + +err: + if (bo != *_bo) + kgem_bo_destroy(kgem, bo); + return false; }