sna: Pass render hints for migration based on source location

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2014-03-10 16:39:50 +00:00
parent 955b5de4ba
commit 6ed8570f6a
5 changed files with 34 additions and 11 deletions

View 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;

View 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;

View 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

View 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;

View 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;
}