From 0a0b9dc3538ef731463fb321852b8802cd04e457 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 13 Jun 2014 16:14:43 +0100 Subject: sna: Refine decision whether to use the GPU or render inplace Signed-off-by: Chris Wilson --- src/sna/sna_glyphs.c | 6 ++---- src/sna/sna_render_inline.h | 23 +++++++++++++++++++++++ src/sna/sna_trapezoids.c | 8 +++----- 3 files changed, 28 insertions(+), 9 deletions(-) (limited to 'src/sna') diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c index 5d8dd782..e8d92b82 100644 --- a/src/sna/sna_glyphs.c +++ b/src/sna/sna_glyphs.c @@ -1948,8 +1948,7 @@ sna_glyphs(CARD8 op, goto fallback; } - if ((too_small(priv) || DAMAGE_IS_ALL(priv->cpu_damage)) && - !picture_is_gpu(sna, src, 0)) { + if (!is_gpu_dst(priv) && !picture_is_gpu(sna, src, 0)) { DBG(("%s: fallback -- too small (%dx%d)\n", __FUNCTION__, dst->pDrawable->width, dst->pDrawable->height)); goto fallback; @@ -2278,8 +2277,7 @@ sna_glyphs__shared(CARD8 op, goto fallback; } - if ((too_small(priv) || DAMAGE_IS_ALL(priv->cpu_damage)) && - !picture_is_gpu(sna, src, 0)) { + if (!is_gpu_dst(priv) && !picture_is_gpu(sna, src, 0)) { DBG(("%s: fallback -- too small (%dx%d)\n", __FUNCTION__, dst->pDrawable->width, dst->pDrawable->height)); goto fallback; diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h index e292949c..50a19c84 100644 --- a/src/sna/sna_render_inline.h +++ b/src/sna/sna_render_inline.h @@ -92,6 +92,9 @@ is_gpu(struct sna *sna, DrawablePtr drawable, unsigned prefer) if (priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo)) return true; + if (DAMAGE_IS_ALL(priv->cpu_damage)) + return false; + return priv->gpu_bo && kgem_bo_is_busy(priv->gpu_bo); } @@ -109,6 +112,26 @@ too_small(struct sna_pixmap *priv) return (priv->create & KGEM_CAN_CREATE_GPU) == 0; } +static inline bool +is_gpu_dst(struct sna_pixmap *priv) +{ + assert(priv); + + if (too_small(priv)) + return false; + + if (priv->gpu_bo && kgem_bo_is_busy(priv->gpu_bo)) + return true; + + if (priv->cpu_bo && kgem_bo_is_busy(priv->cpu_bo)) + return true; + + if (DAMAGE_IS_ALL(priv->cpu_damage)) + return false; + + return priv->gpu_damage == NULL && priv->cpu; +} + static inline bool unattached(DrawablePtr drawable) { diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c index c11a1417..789be9cf 100644 --- a/src/sna/sna_trapezoids.c +++ b/src/sna/sna_trapezoids.c @@ -595,12 +595,10 @@ sna_composite_trapezoids(CARD8 op, } if (FORCE_FALLBACK == 0 && - (too_small(priv) || DAMAGE_IS_ALL(priv->cpu_damage)) && - !picture_is_gpu(sna, src, 0) && untransformed(src)) { - DBG(("%s: force fallbacks -- (too small, %dx%d? %d || all-cpu? %d) && (src-is-cpu? %d && untransformed? %d)\n", + !is_gpu_dst(priv) && !picture_is_gpu(sna, src, 0) && untransformed(src)) { + DBG(("%s: force fallbacks -- (!gpu dst, %dx%d? %d) && (src-is-cpu? %d && untransformed? %d)\n", __FUNCTION__, dst->pDrawable->width, dst->pDrawable->height, - too_small(priv), (int)DAMAGE_IS_ALL(priv->cpu_damage), - !picture_is_gpu(sna, src, 0), untransformed(src))); + !is_gpu_dst(priv), !picture_is_gpu(sna, src, 0), untransformed(src))); force_fallback: force_fallback = true; -- cgit v1.2.3