diff options
-rw-r--r-- | src/sna/sna.h | 2 | ||||
-rw-r--r-- | src/sna/sna_accel.c | 77 |
2 files changed, 47 insertions, 32 deletions
diff --git a/src/sna/sna.h b/src/sna/sna.h index c47a8ab2..e2d1ef84 100644 --- a/src/sna/sna.h +++ b/src/sna/sna.h @@ -486,7 +486,7 @@ sna_pixmap_undo_cow(struct sna *sna, struct sna_pixmap *priv, unsigned flags); #define __MOVE_FORCE 0x40 #define __MOVE_DRI 0x80 -bool +struct sna_pixmap * sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int flags); struct sna_pixmap *sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags); diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c index c92d4c65..e3adc60d 100644 --- a/src/sna/sna_accel.c +++ b/src/sna/sna_accel.c @@ -2831,21 +2831,55 @@ sna_pixmap_mark_active(struct sna *sna, struct sna_pixmap *priv) return priv; } -bool +inline static struct sna_pixmap * +__sna_pixmap_for_gpu(struct sna *sna, PixmapPtr pixmap, unsigned flags) +{ + struct sna_pixmap *priv; + + if ((flags & __MOVE_FORCE) == 0 && wedged(sna)) + return NULL; + + priv = sna_pixmap(pixmap); + if (priv == NULL) { + DBG(("%s: not attached\n", __FUNCTION__)); + if ((flags & __MOVE_DRI) == 0) + return NULL; + + DBG(("%s: forcing the creation on the GPU\n", __FUNCTION__)); + + priv = sna_pixmap_attach(pixmap); + if (priv == NULL) + return NULL; + + sna_damage_all(&priv->cpu_damage, + pixmap->drawable.width, + pixmap->drawable.height); + + assert(priv->gpu_bo == NULL); + assert(priv->gpu_damage == NULL); + } + + return priv; +} + +struct sna_pixmap * sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int flags) { struct sna *sna = to_sna_from_pixmap(pixmap); - struct sna_pixmap *priv = sna_pixmap(pixmap); + struct sna_pixmap *priv; RegionRec i, r; DBG(("%s: pixmap=%ld box=(%d, %d), (%d, %d), flags=%x\n", __FUNCTION__, pixmap->drawable.serialNumber, box->x1, box->y1, box->x2, box->y2, flags)); + priv = __sna_pixmap_for_gpu(sna, pixmap, flags); + if (priv == NULL) + return NULL; + assert(box->x2 > box->x1 && box->y2 > box->y1); assert_pixmap_damage(pixmap); assert_pixmap_contains_box(pixmap, box); - assert(!wedged(sna)); assert(priv->gpu_damage == NULL || priv->gpu_bo); if (priv->cow && (flags & MOVE_WRITE || priv->cpu_damage)) { @@ -2863,7 +2897,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl } if (!sna_pixmap_undo_cow(sna, priv, cow)) - return false; + return NULL; if (priv->gpu_bo == NULL) sna_damage_destroy(&priv->gpu_damage); @@ -2921,7 +2955,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl } if (priv->gpu_bo == NULL) - return false; + return NULL; DBG(("%s: created gpu bo\n", __FUNCTION__)); } @@ -2978,7 +3012,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl box, n); } if (!ok) - return false; + return NULL; } } @@ -3012,7 +3046,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl box, 1); } if (!ok) - return false; + return NULL; sna_damage_subtract(&priv->cpu_damage, &r); } else if (sna_damage_intersect(priv->cpu_damage, &r, &i)) { @@ -3043,7 +3077,7 @@ sna_pixmap_move_area_to_gpu(PixmapPtr pixmap, const BoxRec *box, unsigned int fl box, n); } if (!ok) - return false; + return NULL; sna_damage_subtract(&priv->cpu_damage, &r); RegionUninit(&i); @@ -3071,7 +3105,7 @@ done: } assert(!priv->gpu_bo->proxy || (flags & MOVE_WRITE) == 0); - return sna_pixmap_mark_active(sna, priv) != NULL; + return sna_pixmap_mark_active(sna, priv); } struct kgem_bo * @@ -3549,29 +3583,10 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags) pixmap->usage_hint, flags)); - if ((flags & __MOVE_FORCE) == 0 && wedged(sna)) + priv = __sna_pixmap_for_gpu(sna, pixmap, flags); + if (priv == NULL) return NULL; - priv = sna_pixmap(pixmap); - if (priv == NULL) { - DBG(("%s: not attached\n", __FUNCTION__)); - if ((flags & __MOVE_DRI) == 0) - return NULL; - - DBG(("%s: forcing the creation on the GPU\n", __FUNCTION__)); - - priv = sna_pixmap_attach(pixmap); - if (priv == NULL) - return NULL; - - sna_damage_all(&priv->cpu_damage, - pixmap->drawable.width, - pixmap->drawable.height); - - assert(priv->gpu_bo == NULL); - assert(priv->gpu_damage == NULL); - } - assert(priv->gpu_damage == NULL || priv->gpu_bo); if ((flags & MOVE_READ) == 0 && UNDO) { @@ -3583,7 +3598,7 @@ sna_pixmap_move_to_gpu(PixmapPtr pixmap, unsigned flags) if (priv->cow && (flags & MOVE_WRITE || priv->cpu_damage)) { if (!sna_pixmap_undo_cow(sna, priv, flags & MOVE_READ)) - return false; + return NULL; if (priv->gpu_bo == NULL) sna_damage_destroy(&priv->gpu_damage); |