summaryrefslogtreecommitdiff
path: root/src/sna
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-06-13 16:14:43 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2014-06-13 16:53:35 +0100
commit0a0b9dc3538ef731463fb321852b8802cd04e457 (patch)
tree32809b9048773936e08219541bc39a4498d1765a /src/sna
parentdd87aa8f85c4bafa105fd881a0cce45bda6143df (diff)
sna: Refine decision whether to use the GPU or render inplace
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/sna')
-rw-r--r--src/sna/sna_glyphs.c6
-rw-r--r--src/sna/sna_render_inline.h23
-rw-r--r--src/sna/sna_trapezoids.c8
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;