diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2014-06-13 16:14:43 +0100 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2014-06-13 16:53:35 +0100 |
commit | 0a0b9dc3538ef731463fb321852b8802cd04e457 (patch) | |
tree | 32809b9048773936e08219541bc39a4498d1765a | |
parent | dd87aa8f85c4bafa105fd881a0cce45bda6143df (diff) |
sna: Refine decision whether to use the GPU or render inplace
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/sna/sna_glyphs.c | 6 | ||||
-rw-r--r-- | src/sna/sna_render_inline.h | 23 | ||||
-rw-r--r-- | src/sna/sna_trapezoids.c | 8 |
3 files changed, 28 insertions, 9 deletions
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); } @@ -110,6 +113,26 @@ too_small(struct sna_pixmap *priv) } 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) { struct sna_pixmap *priv = sna_pixmap_from_drawable(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; |