xserver-xorg-video-intel: Changes to 'ubuntu'
debian/changelog | 5 +
debian/patches/series | 3
debian/patches/sna-fall-back-to-proc-cpuinfo.patch | 85 +++++++++++++++++
debian/patches/sna-fix-typo-in-computing-box.patch | 77 ++++++++++++++++
debian/patches/sna-note-that-borderClip-region.patch | 90 +++++++++++++++++++
5 files changed, 260 insertions(+)
New commits:
commit 0f0f30ba9741cc6ba0d3f0d614fd759eb831961c
Author: Robert Hooker <sarvatt@ubuntu.com>
Date: Fri Jul 19 13:38:13 2013 -0400
Cherry-pick 3 SNA fixes needed for 2.21.12.
diff --git a/debian/changelog b/debian/changelog
index 25a3735..b25ec80 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,9 +1,14 @@
xserver-xorg-video-intel (2:2.21.12-1ubuntu1) UNRELEASED; urgency=low
+ [ Maarten Lankhorst ]
* Merge from unreleased debian git (LP: #1198409, #1173557, #1199746, #1200766)
Remaining changes:
- Use SNA by default.
+ [ Robert Hooker ]
+ * Cherry-pick 3 commits from upstream git to fix SNA regressions in 2.21.12
+ (34c9b759f, 7f76a2bf3, a764a6e69b)
+
-- Maarten Lankhorst <maarten.lankhorst@ubuntu.com> Thu, 18 Jul 2013 13:51:58 +0200
xserver-xorg-video-intel (2:2.21.12-1) UNRELEASED; urgency=low
diff --git a/debian/patches/series b/debian/patches/series
index 9ed72bb..2c1177d 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1,4 @@
# empty for now
+sna-note-that-borderClip-region.patch
+sna-fix-typo-in-computing-box.patch
+sna-fall-back-to-proc-cpuinfo.patch
diff --git a/debian/patches/sna-fall-back-to-proc-cpuinfo.patch b/debian/patches/sna-fall-back-to-proc-cpuinfo.patch
new file mode 100644
index 0000000..0af1a3b
--- /dev/null
+++ b/debian/patches/sna-fall-back-to-proc-cpuinfo.patch
@@ -0,0 +1,85 @@
+From 7f76a2bf319f59d463a1f96974b03d7c651847dd Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Wed, 17 Jul 2013 09:22:17 +0000
+Subject: sna: Fall back to /proc/cpuinfo parsing if cpuid cache size probe fails
+
+Older hardware does not support cache size probing via cpuid4, so we
+need to implement the older algorithm which requires a table based
+lookup. (And in hindsight, why I thought cache probing via cpuid to be
+quite hairy.) For the moment, just use the value found in /proc/cpuinfo.
+
+Reported-by: Oscar Dario Trujillo Tejada <oscardt19@gmail.com>
+Reported-by: Ferry Toth <ftoth@telfort.nl>
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+---
+diff --git a/src/sna/kgem.c b/src/sna/kgem.c
+index 605e049..0054cdf 100644
+--- a/src/sna/kgem.c
++++ b/src/sna/kgem.c
+@@ -698,7 +698,7 @@ total_ram_size(void)
+ }
+
+ static unsigned
+-cpu_cache_size(void)
++cpu_cache_size__cpuid4(void)
+ {
+ /* Deterministic Cache Parmaeters (Function 04h)":
+ * When EAX is initialized to a value of 4, the CPUID instruction
+@@ -740,6 +740,39 @@ cpu_cache_size(void)
+ return llc_size;
+ }
+
++static unsigned
++cpu_cache_size(void)
++{
++ unsigned size;
++ FILE *file;
++
++ size = cpu_cache_size__cpuid4();
++ if (size)
++ return size;
++
++ file = fopen("/proc/cpuinfo", "r");
++ if (file) {
++ size_t len = 0;
++ char *line = NULL;
++ while (getline(&line, &len, file) != -1) {
++ int kb;
++ if (sscanf(line, "cache size : %d KB", &kb) == 1) {
++ /* Paranoid check against gargantuan caches */
++ if (kb <= 1<<20)
++ size = kb * 1024;
++ break;
++ }
++ }
++ free(line);
++ fclose(file);
++ }
++
++ if (size == 0)
++ size = 64 * 1024;
++
++ return size;
++}
++
+ static int gem_param(struct kgem *kgem, int name)
+ {
+ drm_i915_getparam_t gp;
+@@ -1242,6 +1275,7 @@ void kgem_init(struct kgem *kgem, int fd, struct pci_device *dev, unsigned gen)
+ kgem->buffer_size = kgem->half_cpu_cache_pages << 12;
+ DBG(("%s: buffer size=%d [%d KiB]\n", __FUNCTION__,
+ kgem->buffer_size, kgem->buffer_size / 1024));
++ assert(kgem->buffer_size);
+
+ kgem->max_object_size = 3 * (kgem->aperture_high >> 12) << 10;
+ kgem->max_gpu_size = kgem->max_object_size;
+@@ -5616,6 +5650,7 @@ struct kgem_bo *kgem_create_buffer(struct kgem *kgem,
+ alloc = ALIGN(size, kgem->buffer_size);
+ if (alloc > MAX_CACHE_SIZE)
+ alloc = PAGE_ALIGN(size);
++ assert(alloc);
+
+ if (alloc > kgem->aperture_mappable / 4)
+ flags &= ~KGEM_BUFFER_INPLACE;
+--
+cgit v0.9.0.2-2-gbebe
diff --git a/debian/patches/sna-fix-typo-in-computing-box.patch b/debian/patches/sna-fix-typo-in-computing-box.patch
new file mode 100644
index 0000000..f5214f8
--- /dev/null
+++ b/debian/patches/sna-fix-typo-in-computing-box.patch
@@ -0,0 +1,77 @@
+From a764a6e69b23f644957cf3e4e98868464f458758 Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Wed, 17 Jul 2013 09:51:56 +0000
+Subject: sna: Fix typo in computing box intersection
+
+Comparing y2 against y1 for the intersection was a silly typo,
+especially as the routine for computing the intersection already
+existed.
+
+Fixes regression in commit 34c9b759fbab8d548108e954d55de38c6f5bec31
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Tue Jul 16 19:39:37 2013 +0100
+
+ sna: Note that borderClip region may be more than a singular box
+
+Reported-by: Clemens Eisserer <linuxhippy@gmail.com>
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=66991
+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 994e993..77233cd 100644
+--- a/src/sna/sna_accel.c
++++ b/src/sna/sna_accel.c
+@@ -5524,44 +5524,18 @@ sna_do_copy(DrawablePtr src, DrawablePtr dst, GCPtr gc,
+ * VT is inactive, make sure the region isn't empty
+ */
+ assert(!w->winSize.data);
+-
+- if (region.extents.x1 < w->winSize.extents.x1)
+- region.extents.x1 = w->winSize.extents.x1;
+- if (region.extents.y1 < w->winSize.extents.y1)
+- region.extents.y1 = w->winSize.extents.y1;
+-
+- if (region.extents.x2 > w->winSize.extents.x2)
+- region.extents.x2 = w->winSize.extents.x2;
+- if (region.extents.y2 > w->winSize.extents.y1)
+- region.extents.y2 = w->winSize.extents.y2;
+-
+- if (w->borderClip.data == NULL) {
+- if (region.extents.x1 < w->borderClip.extents.x1)
+- region.extents.x1 = w->borderClip.extents.x1;
+- if (region.extents.y1 < w->borderClip.extents.y1)
+- region.extents.y1 = w->borderClip.extents.y1;
+-
+- if (region.extents.x2 > w->borderClip.extents.x2)
+- region.extents.x2 = w->borderClip.extents.x2;
+- if (region.extents.y2 > w->borderClip.extents.y1)
+- region.extents.y2 = w->borderClip.extents.y2;
+- } else
++ box_intersect(®ion.extents, &w->winSize.extents);
++ if (w->borderClip.data == NULL)
++ box_intersect(®ion.extents, &w->borderClip.extents);
++ else
+ clip = &w->borderClip;
+ } else {
+ WindowPtr w = (WindowPtr)src;
+
+ DBG(("%s: window clip\n", __FUNCTION__));
+- if (w->clipList.data == NULL) {
+- if (region.extents.x1 < w->clipList.extents.x1)
+- region.extents.x1 = w->clipList.extents.x1;
+- if (region.extents.y1 < w->clipList.extents.y1)
+- region.extents.y1 = w->clipList.extents.y1;
+-
+- if (region.extents.x2 > w->clipList.extents.x2)
+- region.extents.x2 = w->clipList.extents.x2;
+- if (region.extents.y2 > w->clipList.extents.y1)
+- region.extents.y2 = w->clipList.extents.y2;
+- } else
++ if (w->clipList.data == NULL)
++ box_intersect(®ion.extents, &w->clipList.extents);
++ else
+ clip = &w->clipList;
+ }
+ if (clip == NULL) {
+--
+cgit v0.9.0.2-2-gbebe
diff --git a/debian/patches/sna-note-that-borderClip-region.patch b/debian/patches/sna-note-that-borderClip-region.patch
new file mode 100644
index 0000000..3bf3f35
--- /dev/null
+++ b/debian/patches/sna-note-that-borderClip-region.patch
@@ -0,0 +1,90 @@
+From 34c9b759fbab8d548108e954d55de38c6f5bec31 Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Tue, 16 Jul 2013 18:39:37 +0000
+Subject: sna: Note that borderClip region may be more than a singular box
+
+If the child is obscured, then borderClip will contain a list of valid
+boxes rather a singular extents. I thought this was covered by the
+clipList, but I was wrong.
+
+Reported-by: Jesse Barnes <jbarnes@virtuousgeek.org>
+Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=66970
+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 fa28b6d..994e993 100644
+--- a/src/sna/sna_accel.c
++++ b/src/sna/sna_accel.c
+@@ -5523,32 +5523,46 @@ sna_do_copy(DrawablePtr src, DrawablePtr dst, GCPtr gc,
+ * XFree86 DDX empties the border clip when the
+ * VT is inactive, make sure the region isn't empty
+ */
+- if (w->parent || RegionNil(&w->borderClip)) {
+- int16_t v;
+-
+- v = max(w->borderClip.extents.x1,
+- w->winSize.extents.x1);
+- if (region.extents.x1 < v)
+- region.extents.x1 = v;
+-
+- v = max(w->borderClip.extents.y1,
+- w->winSize.extents.y1);
+- if (region.extents.y1 < v)
+- region.extents.y1 = v;
+-
+- v = min(w->borderClip.extents.x2,
+- w->winSize.extents.x2);
+- if (region.extents.x2 > v)
+- region.extents.x2 = v;
+-
+- v = min(w->borderClip.extents.y2,
+- w->winSize.extents.y2);
+- if (region.extents.y2 > v)
+- region.extents.y2 = v;
+- }
++ assert(!w->winSize.data);
++
++ if (region.extents.x1 < w->winSize.extents.x1)
++ region.extents.x1 = w->winSize.extents.x1;
++ if (region.extents.y1 < w->winSize.extents.y1)
++ region.extents.y1 = w->winSize.extents.y1;
++
++ if (region.extents.x2 > w->winSize.extents.x2)
++ region.extents.x2 = w->winSize.extents.x2;
++ if (region.extents.y2 > w->winSize.extents.y1)
++ region.extents.y2 = w->winSize.extents.y2;
++
++ if (w->borderClip.data == NULL) {
++ if (region.extents.x1 < w->borderClip.extents.x1)
++ region.extents.x1 = w->borderClip.extents.x1;
++ if (region.extents.y1 < w->borderClip.extents.y1)
++ region.extents.y1 = w->borderClip.extents.y1;
++
++ if (region.extents.x2 > w->borderClip.extents.x2)
++ region.extents.x2 = w->borderClip.extents.x2;
++ if (region.extents.y2 > w->borderClip.extents.y1)
++ region.extents.y2 = w->borderClip.extents.y2;
++ } else
++ clip = &w->borderClip;
+ } else {
++ WindowPtr w = (WindowPtr)src;
++
+ DBG(("%s: window clip\n", __FUNCTION__));
+- clip = &((WindowPtr)src)->clipList;
++ if (w->clipList.data == NULL) {
++ if (region.extents.x1 < w->clipList.extents.x1)
++ region.extents.x1 = w->clipList.extents.x1;
++ if (region.extents.y1 < w->clipList.extents.y1)
++ region.extents.y1 = w->clipList.extents.y1;
++
++ if (region.extents.x2 > w->clipList.extents.x2)
++ region.extents.x2 = w->clipList.extents.x2;
++ if (region.extents.y2 > w->clipList.extents.y1)
++ region.extents.y2 = w->clipList.extents.y2;
++ } else
++ clip = &w->clipList;
+ }
+ if (clip == NULL) {
+ DBG(("%s: fast source clip against extents\n", __FUNCTION__));
+--
+cgit v0.9.0.2-2-gbebe
Reply to: