diff options
Diffstat (limited to 'x11-drivers/xf86-video-intel/files/xf86-video-intel-2.99.911-sna-pixmap-migration.patch')
-rw-r--r-- | x11-drivers/xf86-video-intel/files/xf86-video-intel-2.99.911-sna-pixmap-migration.patch | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/x11-drivers/xf86-video-intel/files/xf86-video-intel-2.99.911-sna-pixmap-migration.patch b/x11-drivers/xf86-video-intel/files/xf86-video-intel-2.99.911-sna-pixmap-migration.patch new file mode 100644 index 000000000000..a69e0a213270 --- /dev/null +++ b/x11-drivers/xf86-video-intel/files/xf86-video-intel-2.99.911-sna-pixmap-migration.patch @@ -0,0 +1,102 @@ +From 3310ee89c1f1a663de5f5b12b8125809a213996f Mon Sep 17 00:00:00 2001 +From: Chris Wilson <chris@chris-wilson.co.uk> +Date: Sat, 05 Apr 2014 11:18:31 +0000 +Subject: sna: Avoid discarding damage when applying WHOLE hint to pixmap migration + +Once again, we must be careful when promoting from a region to whole +pixmap migration that we do not discard required damage. + +Fixes regression from +commit 27ac9f574f65cbd535751c925e9b2e2d7c8a6b3a [2.99.911] +Author: Chris Wilson <chris@chris-wilson.co.uk> +Date: Thu Feb 27 08:33:52 2014 +0000 + + sna: Avoid promoting region-to-whole migration and discarding damage + +Reported-by: gedgon@gmail.com +Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=77063 +Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> +--- +diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c +index 0116d54..71ba34d 100644 +--- a/src/sna/sna_accel.c ++++ b/src/sna/sna_accel.c +@@ -2500,7 +2500,10 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable, + flags |= MOVE_INPLACE_HINT; + } + +- if (flags & MOVE_WHOLE_HINT && priv->gpu_damage == NULL) ++ if ((flags & (MOVE_WHOLE_HINT | MOVE_READ)) == (MOVE_WHOLE_HINT | MOVE_READ)) ++ return _sna_pixmap_move_to_cpu(pixmap, flags); ++ ++ if (flags & MOVE_WHOLE_HINT && priv->gpu_damage == NULL && priv->cpu_damage == NULL) + return _sna_pixmap_move_to_cpu(pixmap, flags); + + if (priv->gpu_damage == NULL && +@@ -2527,22 +2530,18 @@ sna_drawable_move_region_to_cpu(DrawablePtr drawable, + return _sna_pixmap_move_to_cpu(pixmap, flags); + } + +- if ((flags & MOVE_READ) == 0 && +- priv->gpu_damage && +- region_subsumes_damage(region, priv->gpu_damage)) { +- DBG(("%s: region [(%d, %d), (%d, %d)] subsumes damage [(%d,%d), (%d, %d)]\n", ++ if (flags & MOVE_WHOLE_HINT) { ++ DBG(("%s: region (%d, %d), (%d, %d) marked with WHOLE hint, pixmap %dx%d\n", + __FUNCTION__, + region->extents.x1, + region->extents.y1, + region->extents.x2, + region->extents.y2, +- priv->gpu_damage->extents.x1, +- priv->gpu_damage->extents.y1, +- priv->gpu_damage->extents.x2, +- priv->gpu_damage->extents.y2)); ++ pixmap->drawable.width, ++ pixmap->drawable.height)); + if (dx | dy) + RegionTranslate(region, -dx, -dy); +- return _sna_pixmap_move_to_cpu(pixmap, flags); ++ return _sna_pixmap_move_to_cpu(pixmap, flags | MOVE_READ); + } + + if (priv->move_to_gpu && !priv->move_to_gpu(sna, priv, MOVE_READ)) { +@@ -4471,17 +4470,19 @@ try_upload_tiled_x(PixmapPtr pixmap, RegionRec *region, + if (wedged(sna)) + return false; + +- DBG(("%s: bo? %d, can map? %d\n", __FUNCTION__, +- priv->gpu_bo != NULL, +- priv->gpu_bo ? kgem_bo_can_map__cpu(&sna->kgem, priv->gpu_bo, true) : 0)); +- + replaces = region->data == NULL && + w >= pixmap->drawable.width && + h >= pixmap->drawable.height; + ++ DBG(("%s: bo? %d, can map? %d, replaces? %d\n", __FUNCTION__, ++ priv->gpu_bo != NULL, ++ priv->gpu_bo ? kgem_bo_can_map__cpu(&sna->kgem, priv->gpu_bo, true) : 0, ++ replaces)); ++ + if (priv->gpu_bo && (replaces || priv->gpu_bo->proxy)) { + DBG(("%s: discarding cached upload proxy\n", __FUNCTION__)); + sna_pixmap_free_gpu(sna, priv); ++ replaces = true; /* Mark it all GPU damaged afterwards */ + } + assert(priv->gpu_bo == NULL || priv->gpu_bo->proxy == NULL); + +@@ -4616,8 +4617,11 @@ sna_put_zpixmap_blt(DrawablePtr drawable, GCPtr gc, RegionPtr region, + return true; + + hint = MOVE_WRITE; +- if (w == pixmap->drawable.width && h*stride > 4096) ++ if (w == pixmap->drawable.width && (h+1)*stride > 65536) { ++ DBG(("%s: large upload (%d bytes), marking WHOLE_HINT\n", ++ __FUNCTION__, h*stride)); + hint |= MOVE_WHOLE_HINT; ++ } + + if (!sna_drawable_move_region_to_cpu(&pixmap->drawable, region, hint)) + return false; +-- +cgit v0.9.0.2-2-gbebe |