summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-03-10 16:39:50 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2014-03-10 22:12:22 +0000
commit6ed8570f6aa01fdd4edc3df7585f01083b4a9778 (patch)
tree9c7ddd2b632caae907c0642a1359b9cf573d619a
parent955b5de4ba103fb115ec0b45f9b59eb2628ca3dd (diff)
sna: Pass render hints for migration based on source location
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_composite.c3
-rw-r--r--src/sna/sna_glyphs.c4
-rw-r--r--src/sna/sna_render_inline.h28
-rw-r--r--src/sna/sna_trapezoids.c8
-rw-r--r--src/sna/sna_trapezoids_boxes.c2
5 files changed, 34 insertions, 11 deletions
diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index d5c229c5..74dfc9ed 100644
--- a/src/sna/sna_composite.c
+++ b/src/sna/sna_composite.c
@@ -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;
diff --git a/src/sna/sna_glyphs.c b/src/sna/sna_glyphs.c
index eca0df0e..8b44f1f3 100644
--- a/src/sna/sna_glyphs.c
+++ b/src/sna/sna_glyphs.c
@@ -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;
diff --git a/src/sna/sna_render_inline.h b/src/sna/sna_render_inline.h
index 3f74341f..e292949c 100644
--- a/src/sna/sna_render_inline.h
+++ b/src/sna/sna_render_inline.h
@@ -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
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index c42053dd..4ad61bf9 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -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;
diff --git a/src/sna/sna_trapezoids_boxes.c b/src/sna/sna_trapezoids_boxes.c
index 2a476dc0..898efb5e 100644
--- a/src/sna/sna_trapezoids_boxes.c
+++ b/src/sna/sna_trapezoids_boxes.c
@@ -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;
}