1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
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
|