sna: Pass render hints for migration based on source location
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 10 Mar 2014 16:39:50 +0000 (16:39 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 10 Mar 2014 22:12:22 +0000 (22:12 +0000)
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
src/sna/sna_composite.c
src/sna/sna_glyphs.c
src/sna/sna_render_inline.h
src/sna/sna_trapezoids.c
src/sna/sna_trapezoids_boxes.c

index d5c229c..74dfc9e 100644 (file)
@@ -676,7 +676,8 @@ sna_composite(CARD8 op,
        }
 
        if (use_cpu(pixmap, priv, op, width, height) &&
-           !picture_is_gpu(sna, src) && !picture_is_gpu(sna, mask)) {
+           !picture_is_gpu(sna, src, PREFER_GPU_RENDER) &&
+           !picture_is_gpu(sna, mask, PREFER_GPU_RENDER)) {
                DBG(("%s: fallback, dst pixmap=%ld is too small (or completely damaged)\n",
                     __FUNCTION__, pixmap->drawable.serialNumber));
                goto fallback;
index eca0df0..8b44f1f 100644 (file)
@@ -1915,7 +1915,7 @@ sna_glyphs(CARD8 op,
        }
 
        if ((too_small(priv) || DAMAGE_IS_ALL(priv->cpu_damage)) &&
-           !picture_is_gpu(sna, src)) {
+           !picture_is_gpu(sna, src, 0)) {
                DBG(("%s: fallback -- too small (%dx%d)\n",
                     __FUNCTION__, dst->pDrawable->width, dst->pDrawable->height));
                goto fallback;
@@ -2244,7 +2244,7 @@ sna_glyphs__shared(CARD8 op,
        }
 
        if ((too_small(priv) || DAMAGE_IS_ALL(priv->cpu_damage)) &&
-           !picture_is_gpu(sna, src)) {
+           !picture_is_gpu(sna, src, 0)) {
                DBG(("%s: fallback -- too small (%dx%d)\n",
                     __FUNCTION__, dst->pDrawable->width, dst->pDrawable->height));
                goto fallback;
index 3f74341..e292949 100644 (file)
@@ -117,11 +117,33 @@ unattached(DrawablePtr drawable)
 }
 
 static inline bool
-picture_is_gpu(struct sna *sna, PicturePtr picture)
+picture_is_gpu(struct sna *sna, PicturePtr picture, unsigned flags)
 {
-       if (!picture || !picture->pDrawable)
+       if (!picture)
                return false;
-       return is_gpu(sna, picture->pDrawable, PREFER_GPU_RENDER);
+
+       if (!picture->pDrawable) {
+               switch (flags) {
+               case PREFER_GPU_RENDER:
+                       switch (picture->pSourcePict->type) {
+                       case SourcePictTypeSolidFill:
+                       case SourcePictTypeLinear:
+                               return false;
+                       default:
+                               return true;
+                       }
+               case PREFER_GPU_SPANS:
+                       return true;
+               default:
+                       return false;
+               }
+       } else {
+               if (picture->repeat &&
+                   (picture->pDrawable->width | picture->pDrawable->height) == 1)
+                       return flags == PREFER_GPU_SPANS;
+       }
+
+       return is_gpu(sna, picture->pDrawable, flags);
 }
 
 static inline bool
index c42053d..4ad61bf 100644 (file)
@@ -318,7 +318,7 @@ trapezoids_fallback(struct sna *sna,
                DBG(("%s: mask (%dx%d) depth=%d, format=%08x\n",
                     __FUNCTION__, width, height, depth, format));
                if (is_gpu(sna, dst->pDrawable, PREFER_GPU_RENDER) ||
-                   picture_is_gpu(sna, src)) {
+                   picture_is_gpu(sna, src, PREFER_GPU_RENDER)) {
                        int num_threads;
 
                        scratch = sna_pixmap_create_upload(screen,
@@ -487,7 +487,7 @@ trapezoid_spans_maybe_inplace(struct sna *sna,
 
        case PICT_x8r8g8b8:
        case PICT_a8r8g8b8:
-               if (picture_is_gpu(sna, src))
+               if (picture_is_gpu(sna, src, 0))
                        return false;
 
                switch (op) {
@@ -596,11 +596,11 @@ sna_composite_trapezoids(CARD8 op,
 
        if (FORCE_FALLBACK == 0 &&
            (too_small(priv) || DAMAGE_IS_ALL(priv->cpu_damage)) &&
-           !picture_is_gpu(sna, src) && untransformed(src)) {
+           !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",
                     __FUNCTION__, dst->pDrawable->width, dst->pDrawable->height,
                     too_small(priv), (int)DAMAGE_IS_ALL(priv->cpu_damage),
-                    !picture_is_gpu(sna, src), untransformed(src)));
+                    !picture_is_gpu(sna, src, 0), untransformed(src)));
 
 force_fallback:
                force_fallback = true;
index 2a476dc..898efb5 100644 (file)
@@ -1057,7 +1057,7 @@ composite_unaligned_boxes_inplace(struct sna *sna,
 {
        if (!force_fallback &&
            (is_gpu(sna, dst->pDrawable, PREFER_GPU_SPANS) ||
-            picture_is_gpu(sna, src))) {
+            picture_is_gpu(sna, src, PREFER_GPU_SPANS))) {
                DBG(("%s: fallback -- not forcing\n", __FUNCTION__));
                return false;
        }