xserver-xorg-video-intel: Changes to 'ubuntu'
debian/changelog | 10
debian/patches/check-hosted-initialisation-succeeds.patch | 26
debian/patches/disable-unneeded-functions-when-hosted.patch | 261 ++
debian/patches/dont-copy-fbcon-if-hosted.patch | 26
debian/patches/fix-spelling-of-caching.patch | 180 +
debian/patches/more-modesetting-disablement-when-hosted.patch | 235 ++
debian/patches/series | 9
debian/patches/unwrap-legacy-modesetting-when-hosted.patch | 57
debian/patches/xmir.patch | 940 +---------
9 files changed, 949 insertions(+), 795 deletions(-)
New commits:
commit 55d225496e8a2f90d03cdf093e9c5bc6a5562f40
Author: Christopher James Halse Rogers <raof@ubuntu.com>
Date: Fri Sep 6 17:31:44 2013 +1000
Fix cacheline dirt corruption
diff --git a/debian/changelog b/debian/changelog
index 408b179..02ac4bd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+xserver-xorg-video-intel (2:2.21.14-4ubuntu4) saucy; urgency=low
+
+ * XMir: Make a conservative guess as to whether the Mir buffer will be used
+ for scanout, and take caching decisions appropriately. Fixes "cache dirt"
+ transient horizontal-line misrendering with Mir bypass (LP: #1218735)
+ * xmir.patch: Split monolithic concatenated patch out into a quilt patch
+ series.
+
+ -- Christopher James Halse Rogers <raof@ubuntu.com> Thu, 05 Sep 2013 15:56:49 +1000
+
xserver-xorg-video-intel (2:2.21.14-4ubuntu3) saucy; urgency=low
* Fix valgrind-enabling check
diff --git a/debian/patches/check-hosted-initialisation-succeeds.patch b/debian/patches/check-hosted-initialisation-succeeds.patch
new file mode 100644
index 0000000..829e3f4
--- /dev/null
+++ b/debian/patches/check-hosted-initialisation-succeeds.patch
@@ -0,0 +1,26 @@
+commit 394978867edf3746c285491db6be41abfe325d87
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Wed Aug 14 08:38:52 2013 +0100
+
+ sna: Check that we successfully install the required hosting midlayer
+
+ Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
+index c27deb6..83a5bba 100644
+--- a/src/sna/sna_driver.c
++++ b/src/sna/sna_driver.c
+@@ -430,6 +430,13 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+ goto cleanup;
+ }
+
++ /* Sanity check */
++ if (hosted() && (sna->flags & SNA_IS_HOSTED) == 0) {
++ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
++ "Failed to setup hosted device.\n");
++ goto cleanup;
++ }
++
+ preferred_depth = sna->info->gen < 030 ? 15 : 24;
+ if (!fb_supports_depth(fd, preferred_depth))
+ preferred_depth = 24;
diff --git a/debian/patches/disable-unneeded-functions-when-hosted.patch b/debian/patches/disable-unneeded-functions-when-hosted.patch
new file mode 100644
index 0000000..69198fd
--- /dev/null
+++ b/debian/patches/disable-unneeded-functions-when-hosted.patch
@@ -0,0 +1,261 @@
+commit b6b5c3f009585151eb772dfc2526843c7cee82b3
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Fri Aug 9 11:34:39 2013 +0100
+
+ intel: Disable incompatible features whilst hosted
+
+ Start adding the infrastructure to disable direct hardware access if X
+ is being run under a system compositor (aka "hosted").
+
+ Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+diff --git a/src/intel_device.c b/src/intel_device.c
+index c5f0a38..d9ff8bc 100644
+--- a/src/intel_device.c
++++ b/src/intel_device.c
+@@ -92,7 +92,7 @@ static int __intel_check_device(int fd)
+ if (drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp))
+ ret = FALSE;
+ }
+- if (ret) {
++ if (ret && !hosted()) {
+ struct drm_mode_card_res res;
+
+ memset(&res, 0, sizeof(res));
+@@ -199,6 +199,12 @@ int intel_open_device(int entity_num,
+ dev->open_count = 0;
+ dev->master_count = 0;
+
++ /* If hosted under a system compositor, just pretend to be master */
++ if (hosted()) {
++ dev->open_count++;
++ dev->master_count++;
++ }
++
+ xf86GetEntityPrivate(entity_num, intel_device_key)->ptr = dev;
+
+ return fd;
+@@ -222,6 +228,8 @@ int intel_get_device(ScrnInfoPtr scrn)
+ drmSetVersion sv;
+ int retry = 2000;
+
++ assert(!hosted());
++
+ /* Check that what we opened was a master or a
+ * master-capable FD, by setting the version of the
+ * interface we'll use to talk to it.
+@@ -267,6 +275,7 @@ int intel_get_master(ScrnInfoPtr scrn)
+ if (dev->master_count++ == 0) {
+ int retry = 2000;
+
++ assert(!hosted());
+ do {
+ ret = drmSetMaster(dev->fd);
+ if (ret == 0)
+@@ -288,6 +297,7 @@ int intel_put_master(ScrnInfoPtr scrn)
+ ret = 0;
+ assert(dev->master_count);
+ if (--dev->master_count == 0) {
++ assert(!hosted());
+ assert(drmSetMaster(dev->fd) == 0);
+ ret = drmDropMaster(dev->fd);
+ }
+@@ -317,6 +327,7 @@ void intel_put_device(ScrnInfoPtr scrn)
+ if (--dev->open_count)
+ return;
+
++ assert(!hosted());
+ intel_set_device(scrn, NULL);
+
+ drmClose(dev->fd);
+diff --git a/src/intel_driver.h b/src/intel_driver.h
+index 1e67eab..4768536 100644
+--- a/src/intel_driver.h
++++ b/src/intel_driver.h
+@@ -129,4 +129,6 @@ void intel_put_device(ScrnInfoPtr scrn);
+
+ void __intel_uxa_release_device(ScrnInfoPtr scrn);
+
++#define hosted() (0)
++
+ #endif /* INTEL_DRIVER_H */
+diff --git a/src/intel_module.c b/src/intel_module.c
+index 47e494c..42fa8d8 100644
+--- a/src/intel_module.c
++++ b/src/intel_module.c
+@@ -382,6 +382,9 @@ static Bool intel_driver_func(ScrnInfoPtr pScrn,
+ #else
+ (*flag) = HW_IO | HW_MMIO;
+ #endif
++ if (hosted())
++ (*flag) = HW_SKIP_CONSOLE;
++
+ return TRUE;
+ default:
+ /* Unknown or deprecated function */
+@@ -410,6 +413,9 @@ static enum accel_method { UXA, SNA } get_accel_method(void)
+ enum accel_method accel_method = DEFAULT_ACCEL_METHOD;
+ XF86ConfDevicePtr dev;
+
++ if (hosted())
++ return SNA;
++
+ dev = _xf86findDriver("intel", xf86configptr->conf_device_lst);
+ if (dev && dev->dev_option_lst) {
+ const char *s;
+@@ -493,7 +499,8 @@ static Bool intel_pci_probe(DriverPtr driver,
+ case PCI_CHIP_I810_DC100:
+ case PCI_CHIP_I810_E:
+ case PCI_CHIP_I815:
+- break;
++ if (!hosted())
++ break;
+ default:
+ return FALSE;
+ }
+diff --git a/src/sna/sna.h b/src/sna/sna.h
+index caf671f..7387088 100644
+--- a/src/sna/sna.h
++++ b/src/sna/sna.h
+@@ -229,6 +229,7 @@ struct sna {
+ #define SNA_TEAR_FREE 0x10
+ #define SNA_FORCE_SHADOW 0x20
+ #define SNA_FLUSH_GTT 0x40
++#define SNA_IS_HOSTED 0x80
+ #define SNA_REPROBE 0x80000000
+
+ unsigned cpu_features;
+diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
+index 5dcf47f..f86d93d 100644
+--- a/src/sna/sna_display.c
++++ b/src/sna/sna_display.c
+@@ -3151,11 +3151,22 @@ sna_crtc_config_notify(ScreenPtr screen)
+ sna_mode_update(to_sna_from_screen(screen));
+ }
+
++#if HAS_PIXMAP_SHARING
++#define sna_setup_provider(scrn) xf86ProviderSetup(scrn, NULL, "Intel")
++#else
++#define sna_setup_provider(scrn)
++#endif
++
+ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
+ {
+ struct sna_mode *mode = &sna->mode;
+ int i;
+
++ if (sna->flags & SNA_IS_HOSTED) {
++ sna_setup_provider(scrn);
++ return true;
++ }
++
+ mode->kmode = drmModeGetResources(sna->kgem.fd);
+ if (mode->kmode) {
+ xf86CrtcConfigInit(scrn, &sna_mode_funcs);
+@@ -3172,9 +3183,7 @@ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
+ if (!xf86IsEntityShared(scrn->entityList[0]))
+ sna_mode_compute_possible_clones(scrn);
+
+-#if HAS_PIXMAP_SHARING
+- xf86ProviderSetup(scrn, NULL, "Intel");
+-#endif
++ sna_setup_provider(scrn);
+ } else {
+ if (!sna_mode_fake_init(sna))
+ return false;
+@@ -3200,6 +3209,9 @@ sna_mode_close(struct sna *sna)
+ while (sna_mode_has_pending_events(sna))
+ sna_mode_wakeup(sna);
+
++ if (sna->flags & SNA_IS_HOSTED)
++ return;
++
+ for (i = 0; i < xf86_config->num_crtc; i++)
+ sna_crtc_disable_shadow(sna, to_sna_crtc(xf86_config->crtc[i]));
+ }
+diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
+index fc8773b..7f2c0ac 100644
+--- a/src/sna/sna_driver.c
++++ b/src/sna/sna_driver.c
+@@ -287,7 +287,7 @@ static bool has_pageflipping(struct sna *sna)
+ drm_i915_getparam_t gp;
+ int v;
+
+- if (sna->flags & SNA_NO_WAIT)
++ if (sna->flags & (SNA_IS_HOSTED | SNA_NO_WAIT))
+ return false;
+
+ v = 0;
+@@ -413,6 +413,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+ sna = to_sna(scrn);
+ sna->scrn = scrn;
+ sna->pEnt = pEnt;
++ sna->flags = 0;
+
+ scrn->displayWidth = 640; /* default it */
+
+@@ -425,7 +426,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+ fd = intel_get_device(scrn);
+ if (fd == -1) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+- "Failed to become DRM master.\n");
++ "Failed to claim DRM device.\n");
+ goto cleanup;
+ }
+
+@@ -484,7 +485,6 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+ if (xf86ReturnOptValBool(sna->Options, OPTION_TILING_FB, FALSE))
+ sna->tiling &= ~SNA_TILING_FB;
+
+- sna->flags = 0;
+ if (!xf86ReturnOptValBool(sna->Options, OPTION_SWAPBUFFERS_WAIT, TRUE))
+ sna->flags |= SNA_NO_WAIT;
+ if (xf86ReturnOptValBool(sna->Options, OPTION_TRIPLE_BUFFER, TRUE))
+@@ -629,6 +629,9 @@ sna_uevent_init(ScrnInfoPtr scrn)
+ Bool hotplug;
+ MessageType from = X_CONFIG;
+
++ if (sna->flags & SNA_IS_HOSTED)
++ return;
++
+ DBG(("%s\n", __FUNCTION__));
+
+ /* RandR will be disabled if Xinerama is active, and so generating
+@@ -895,7 +898,8 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL)
+ if (!miDCInitialize(screen, xf86GetPointerScreenFuncs()))
+ return FALSE;
+
+- if (xf86_cursors_init(screen, SNA_CURSOR_X, SNA_CURSOR_Y,
++ if ((sna->flags & SNA_IS_HOSTED) == 0 &&
++ xf86_cursors_init(screen, SNA_CURSOR_X, SNA_CURSOR_Y,
+ HARDWARE_CURSOR_TRUECOLOR_AT_8BPP |
+ HARDWARE_CURSOR_BIT_ORDER_MSBFIRST |
+ HARDWARE_CURSOR_INVERT_MASK |
+diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
+index a0b4db9..a68a173 100644
+--- a/src/sna/sna_video_overlay.c
++++ b/src/sna/sna_video_overlay.c
+@@ -683,6 +683,9 @@ void sna_video_overlay_setup(struct sna *sna, ScreenPtr screen)
+ struct sna_video *video;
+ XvPortPtr port;
+
++ if (sna->flags & SNA_IS_HOSTED)
++ return;
++
+ if (!sna_has_overlay(sna))
+ return;
+
+diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
+index 07e59bd..a8d50ab 100644
+--- a/src/sna/sna_video_sprite.c
++++ b/src/sna/sna_video_sprite.c
+@@ -456,6 +456,9 @@ void sna_video_sprite_setup(struct sna *sna, ScreenPtr screen)
+ struct sna_video *video;
+ XvPortPtr port;
+
++ if (sna->flags & SNA_IS_HOSTED)
++ return;
++
+ memset(&r, 0, sizeof(struct drm_mode_get_plane_res));
+ if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETPLANERESOURCES, &r))
+ return;
diff --git a/debian/patches/dont-copy-fbcon-if-hosted.patch b/debian/patches/dont-copy-fbcon-if-hosted.patch
new file mode 100644
index 0000000..3bec2a7
--- /dev/null
+++ b/debian/patches/dont-copy-fbcon-if-hosted.patch
@@ -0,0 +1,26 @@
+commit 7690346248fd8d3460cc07f018827ff55b85d19d
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Sat Aug 24 14:00:34 2013 +0100
+
+ sna: Don't copy fbcon if hosted
+
+ When hosted, we have no idea what the right initial contents should be
+ as we are independent of the CRTC and so the existing fb is irrelevant.
+ Plus, not actually being master will cause the attempt to read back the
+ bound framebuffer to fail...
+
+ Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
+index 83a5bba..e6c424a 100644
+--- a/src/sna/sna_driver.c
++++ b/src/sna/sna_driver.c
+@@ -259,7 +259,7 @@ static Bool sna_create_screen_resources(ScreenPtr screen)
+ screen->SetScreenPixmap(sna->front);
+
+ /* Only preserve the fbcon, not any subsequent server regens */
+- if (serverGeneration == 1)
++ if (serverGeneration == 1 && (sna->flags & SNA_IS_HOSTED) == 0)
+ sna_copy_fbcon(sna);
+
+ if (!sna_become_master(sna)) {
diff --git a/debian/patches/fix-spelling-of-caching.patch b/debian/patches/fix-spelling-of-caching.patch
new file mode 100644
index 0000000..00dba87
--- /dev/null
+++ b/debian/patches/fix-spelling-of-caching.patch
@@ -0,0 +1,180 @@
+commit 6bd897157b34e3b80dea68fa615d0fba08238486
+Author: Sedat Dilek <sedat.dilek@gmail.com>
+Date: Wed Aug 14 10:01:13 2013 +0200
+
+ Correct misspelled caching
+
+ Signed-off-by: Sedat Dilek <sedat.dilek@gmail.com>
+
+--- a/src/sna/kgem.c
++++ b/src/sna/kgem.c
+@@ -159,13 +159,13 @@
+ #define UNCACHED 0
+ #define SNOOPED 1
+
+-struct local_i915_gem_cacheing {
++struct local_i915_gem_caching {
+ uint32_t handle;
+- uint32_t cacheing;
++ uint32_t caching;
+ };
+
+-#define LOCAL_I915_GEM_SET_CACHEING 0x2f
+-#define LOCAL_IOCTL_I915_GEM_SET_CACHEING DRM_IOW(DRM_COMMAND_BASE + LOCAL_I915_GEM_SET_CACHEING, struct local_i915_gem_cacheing)
++#define LOCAL_I915_GEM_SET_CACHING 0x2f
++#define LOCAL_IOCTL_I915_GEM_SET_CACHING DRM_IOW(DRM_COMMAND_BASE + LOCAL_I915_GEM_SET_CACHING, struct local_i915_gem_caching)
+
+ struct kgem_buffer {
+ struct kgem_bo base;
+@@ -257,14 +257,14 @@
+ return ret == 0;
+ }
+
+-static bool gem_set_cacheing(int fd, uint32_t handle, int cacheing)
++static bool gem_set_caching(int fd, uint32_t handle, int caching)
+ {
+- struct local_i915_gem_cacheing arg;
++ struct local_i915_gem_caching arg;
+
+ VG_CLEAR(arg);
+ arg.handle = handle;
+- arg.cacheing = cacheing;
+- return drmIoctl(fd, LOCAL_IOCTL_I915_GEM_SET_CACHEING, &arg) == 0;
++ arg.caching = caching;
++ return drmIoctl(fd, LOCAL_IOCTL_I915_GEM_SET_CACHING, &arg) == 0;
+ }
+
+ static uint32_t gem_userptr(int fd, void *ptr, int size, int read_only)
+@@ -925,7 +925,7 @@
+ return has_llc;
+ }
+
+-static bool test_has_cacheing(struct kgem *kgem)
++static bool test_has_caching(struct kgem *kgem)
+ {
+ uint32_t handle;
+ bool ret;
+@@ -941,7 +941,7 @@
+ if (handle == 0)
+ return false;
+
+- ret = gem_set_cacheing(kgem->fd, handle, UNCACHED);
++ ret = gem_set_caching(kgem->fd, handle, UNCACHED);
+ gem_close(kgem->fd, handle);
+ return ret;
+ }
+@@ -1171,12 +1171,12 @@
+ kgem->has_llc));
+
+ kgem->has_wt = test_has_wt(kgem);
+- DBG(("%s: has write-through cacheing for scanouts? %d\n", __FUNCTION__,
++ DBG(("%s: has write-through caching for scanouts? %d\n", __FUNCTION__,
+ kgem->has_wt));
+
+- kgem->has_cacheing = test_has_cacheing(kgem);
++ kgem->has_caching = test_has_caching(kgem);
+ DBG(("%s: has set-cache-level? %d\n", __FUNCTION__,
+- kgem->has_cacheing));
++ kgem->has_caching));
+
+ kgem->has_userptr = test_has_userptr(kgem);
+ DBG(("%s: has userptr? %d\n", __FUNCTION__,
+@@ -1254,8 +1254,8 @@
+ kgem->next_request = __kgem_request_alloc(kgem);
+
+ DBG(("%s: cpu bo enabled %d: llc? %d, set-cache-level? %d, userptr? %d\n", __FUNCTION__,
+- !DBG_NO_CPU && (kgem->has_llc | kgem->has_userptr | kgem->has_cacheing),
+- kgem->has_llc, kgem->has_cacheing, kgem->has_userptr));
++ !DBG_NO_CPU && (kgem->has_llc | kgem->has_userptr | kgem->has_caching),
++ kgem->has_llc, kgem->has_caching, kgem->has_userptr));
+
+ VG_CLEAR(aperture);
+ aperture.aper_size = 0;
+@@ -1344,7 +1344,7 @@
+ if (kgem->max_copy_tile_size < 16*PAGE_SIZE)
+ kgem->max_copy_tile_size = 16*PAGE_SIZE;
+
+- if (kgem->has_llc | kgem->has_cacheing | kgem->has_userptr) {
++ if (kgem->has_llc | kgem->has_caching | kgem->has_userptr) {
+ if (kgem->large_object_size > kgem->max_cpu_size)
+ kgem->large_object_size = kgem->max_cpu_size;
+ } else
+@@ -1817,7 +1817,7 @@
+ bo->reusable = true;
+
+ if (kgem->has_llc &&
+- !gem_set_cacheing(kgem->fd, bo->handle, SNOOPED))
++ !gem_set_caching(kgem->fd, bo->handle, SNOOPED))
+ bo->reusable = false;
+ }
+
+@@ -1894,7 +1894,7 @@
+
+ DBG(("%s: num_pages=%d, flags=%x\n", __FUNCTION__, num_pages, flags));
+
+- if ((kgem->has_cacheing | kgem->has_userptr) == 0)
++ if ((kgem->has_caching | kgem->has_userptr) == 0)
+ return NULL;
+
+ if (list_is_empty(&kgem->snoop)) {
+@@ -4421,7 +4421,7 @@
+ return bo;
+ }
+
+- if (kgem->has_cacheing) {
++ if (kgem->has_caching) {
+ bo = kgem_create_linear(kgem, size, flags);
+ if (bo == NULL)
+ return NULL;
+@@ -4429,7 +4429,7 @@
+ assert(bo->tiling == I915_TILING_NONE);
+ assert_tiling(kgem, bo);
+
+- if (!gem_set_cacheing(kgem->fd, bo->handle, SNOOPED)) {
++ if (!gem_set_caching(kgem->fd, bo->handle, SNOOPED)) {
+ kgem_bo_destroy(kgem, bo);
+ return NULL;
+ }
+@@ -5494,7 +5494,7 @@
+ kgem_bo_free(kgem, &bo->base);
+ }
+
+- if (kgem->has_cacheing) {
++ if (kgem->has_caching) {
+ struct kgem_bo *old;
+
+ bo = buffer_alloc();
+@@ -5522,18 +5522,18 @@
+ assert(bo->mmapped == true);
+ assert(bo->need_io == false);
+
+- if (!gem_set_cacheing(kgem->fd, bo->base.handle, SNOOPED))
+- goto free_cacheing;
++ if (!gem_set_caching(kgem->fd, bo->base.handle, SNOOPED))
++ goto free_caching;
+
+ bo->base.snoop = true;
+
+ bo->mem = kgem_bo_map__cpu(kgem, &bo->base);
+ if (bo->mem == NULL)
+- goto free_cacheing;
++ goto free_caching;
+
+ return bo;
+
+-free_cacheing:
++free_caching:
+ bo->base.refcnt = 0; /* for valgrind */
+ kgem_bo_free(kgem, &bo->base);
+ }
+--- a/src/sna/kgem.h
++++ b/src/sna/kgem.h
+@@ -177,7 +177,7 @@
+ uint32_t has_semaphores :1;
+ uint32_t has_secure_batches :1;
+ uint32_t has_pinned_batches :1;
+- uint32_t has_cacheing :1;
++ uint32_t has_caching :1;
+ uint32_t has_llc :1;
+ uint32_t has_wt :1;
+ uint32_t has_no_reloc :1;
diff --git a/debian/patches/more-modesetting-disablement-when-hosted.patch b/debian/patches/more-modesetting-disablement-when-hosted.patch
new file mode 100644
index 0000000..797acd0
--- /dev/null
+++ b/debian/patches/more-modesetting-disablement-when-hosted.patch
@@ -0,0 +1,235 @@
+commit 097c2567939f2063749acf0bc768df7bb002d535
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Sun Aug 25 10:49:57 2013 +0100
+
+ sna: Add a few more checks for a hosted Xserver before walking CRTC lists
+
+ If we are hosted, we do not own the CRTC configuration, and deferencing
+ the private data structures believing them to be ours, only leads to
+ disaster.
+
+ Based on patches by Christopher James Halse Rogers.
+
+ Reported-by: Christopher James Halse Rogers <raof@ubuntu.com>
+ Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+diff --git a/src/sna/sna.h b/src/sna/sna.h
+index f4722d1..337ebc8 100644
+--- a/src/sna/sna.h
++++ b/src/sna/sna.h
+@@ -389,7 +389,7 @@ to_sna_from_kgem(struct kgem *kgem)
+ #define MAX(a,b) ((a) >= (b) ? (a) : (b))
+ #endif
+
+-extern xf86CrtcPtr sna_covering_crtc(ScrnInfoPtr scrn,
++extern xf86CrtcPtr sna_covering_crtc(struct sna *sna,
+ const BoxRec *box,
+ xf86CrtcPtr desired);
+
+diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
+index 3d42eb9..daffbc2 100644
+--- a/src/sna/sna_display.c
++++ b/src/sna/sna_display.c
+@@ -1004,6 +1004,7 @@ void sna_copy_fbcon(struct sna *sna)
+ return;
+
+ DBG(("%s\n", __FUNCTION__));
++ assert((sna->flags & SNA_IS_HOSTED) == 0);
+
+ priv = sna_pixmap(sna->front);
+ assert(priv && priv->gpu_bo);
+@@ -2736,6 +2737,7 @@ sna_mode_resize(ScrnInfoPtr scrn, int width, int height)
+ DBG(("%s (%d, %d) -> (%d, %d)\n", __FUNCTION__,
+ scrn->virtualX, scrn->virtualY,
+ width, height));
++ assert((sna->flags & SNA_IS_HOSTED) == 0);
+
+ if (scrn->virtualX == width && scrn->virtualY == height)
+ return TRUE;
+@@ -2873,6 +2875,7 @@ sna_page_flip(struct sna *sna,
+
+ DBG(("%s: handle %d attached\n", __FUNCTION__, bo->handle));
+ assert(bo->refcnt);
++ assert((sna->flags & SNA_IS_HOSTED) == 0);
+
+ kgem_bo_submit(&sna->kgem, bo);
+
+@@ -2979,6 +2982,8 @@ static bool sna_probe_initial_configuration(struct sna *sna)
+ int width, height;
+ int i, j;
+
++ assert((sna->flags & SNA_IS_HOSTED) == 0);
++
+ if (xf86ReturnOptValBool(sna->Options, OPTION_REPROBE, FALSE))
+ return false;
+
+@@ -3278,16 +3283,17 @@ static int sna_box_area(const BoxRec *box)
+ * with greater coverage
+ */
+ xf86CrtcPtr
+-sna_covering_crtc(ScrnInfoPtr scrn,
+- const BoxRec *box,
+- xf86CrtcPtr desired)
++sna_covering_crtc(struct sna *sna, const BoxRec *box, xf86CrtcPtr desired)
+ {
+- xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
++ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+ xf86CrtcPtr best_crtc;
+ int best_coverage, c;
+
++ if (sna->flags & SNA_IS_HOSTED)
++ return NULL;
++
+ /* If we do not own the VT, we do not own the CRTC either */
+- if (!scrn->vtSema)
++ if (!sna->scrn->vtSema)
+ return NULL;
+
+ DBG(("%s for box=(%d, %d), (%d, %d)\n",
+@@ -3616,6 +3622,9 @@ void sna_mode_update(struct sna *sna)
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+ int i;
+
++ if (sna->flags & SNA_IS_HOSTED)
++ return;
++
+ /* Validate CRTC attachments and force consistency upon the kernel */
+ for (i = 0; i < xf86_config->num_crtc; i++) {
+ xf86CrtcPtr crtc = xf86_config->crtc[i];
+@@ -3906,6 +3915,7 @@ void sna_mode_redisplay(struct sna *sna)
+ return;
+
+ DBG(("%s: posting shadow damage\n", __FUNCTION__));
++ assert((sna->flags & SNA_IS_HOSTED) == 0);
+ assert(sna->mode.shadow_active);
+
+ region = DamageRegion(sna->mode.shadow_damage);
+diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
+index 5f2811b..1eec740 100644
+--- a/src/sna/sna_dri.c
++++ b/src/sna/sna_dri.c
+@@ -781,7 +781,7 @@ __sna_dri_copy_region(struct sna *sna, DrawablePtr draw, RegionPtr region,
+
+ crtc = NULL;
+ if (sync && sna_pixmap_is_scanout(sna, pixmap))
+- crtc = sna_covering_crtc(sna->scrn, &clip.extents, NULL);
++ crtc = sna_covering_crtc(sna, &clip.extents, NULL);
+ sna_dri_select_mode(sna, dst_bo, src_bo, crtc != NULL);
+
+ sync = (crtc != NULL&&
+@@ -885,22 +885,22 @@ static inline int sna_wait_vblank(struct sna *sna, drmVBlank *vbl)
+ #if DRI2INFOREC_VERSION >= 4
+
+ static int
+-sna_dri_get_pipe(DrawablePtr pDraw)
++sna_dri_get_pipe(DrawablePtr draw)
+ {
+- ScrnInfoPtr pScrn = xf86ScreenToScrn(pDraw->pScreen);
++ struct sna *sna = to_sna_from_drawable(draw);
+ xf86CrtcPtr crtc;
+ BoxRec box;
+ int pipe;
+
+- if (pDraw->type == DRAWABLE_PIXMAP)
++ if (draw->type == DRAWABLE_PIXMAP)
+ return -1;
+
+- box.x1 = pDraw->x;
+- box.y1 = pDraw->y;
+- box.x2 = box.x1 + pDraw->width;
+- box.y2 = box.y1 + pDraw->height;
++ box.x1 = draw->x;
++ box.y1 = draw->y;
++ box.x2 = box.x1 + draw->width;
++ box.y2 = box.y1 + draw->height;
+
+- crtc = sna_covering_crtc(pScrn, &box, NULL);
++ crtc = sna_covering_crtc(sna, &box, NULL);
+
+ /* Make sure the CRTC is valid and this is the real front buffer */
+ pipe = -1;
+diff --git a/src/sna/sna_video.c b/src/sna/sna_video.c
+index cd9e3ee..2083a22 100644
+--- a/src/sna/sna_video.c
++++ b/src/sna/sna_video.c
+@@ -121,10 +121,9 @@ void sna_video_buffer_fini(struct sna_video *video)
+ }
+
+ bool
+-sna_video_clip_helper(ScrnInfoPtr scrn,
+- struct sna_video *video,
++sna_video_clip_helper(struct sna_video *video,
+ struct sna_video_frame *frame,
+- xf86CrtcPtr * crtc_ret,
++ xf86CrtcPtr *crtc_ret,
+ BoxPtr dst,
+ short src_x, short src_y,
+ short drw_x, short drw_y,
+@@ -152,7 +151,7 @@ sna_video_clip_helper(ScrnInfoPtr scrn,
+ * For overlay video, compute the relevant CRTC and
+ * clip video to that
+ */
+- crtc = sna_covering_crtc(scrn, dst, video->desired_crtc);
++ crtc = sna_covering_crtc(video->sna, dst, video->desired_crtc);
+
+ /* For textured video, we don't actually want to clip at all. */
+ if (crtc && !video->textured) {
+diff --git a/src/sna/sna_video.h b/src/sna/sna_video.h
+index 875f8cc..cbb3ea3 100644
+--- a/src/sna/sna_video.h
++++ b/src/sna/sna_video.h
+@@ -162,10 +162,9 @@ static inline int is_planar_fourcc(int id)
+ }
+
+ bool
+-sna_video_clip_helper(ScrnInfoPtr scrn,
+- struct sna_video *adaptor_priv,
++sna_video_clip_helper(struct sna_video *video,
+ struct sna_video_frame *frame,
+- xf86CrtcPtr * crtc_ret,
++ xf86CrtcPtr *crtc_ret,
+ BoxPtr dst,
+ short src_x, short src_y,
+ short drw_x, short drw_y,
+diff --git a/src/sna/sna_video_overlay.c b/src/sna/sna_video_overlay.c
+index 0b53e6e..766e048 100644
+--- a/src/sna/sna_video_overlay.c
++++ b/src/sna/sna_video_overlay.c
+@@ -524,8 +524,7 @@ sna_video_overlay_put_image(ClientPtr client,
+
+ sna_video_frame_init(video, format->id, width, height, &frame);
+
+- if (!sna_video_clip_helper(sna->scrn, video, &frame,
+- &crtc, &dstBox,
++ if (!sna_video_clip_helper(video, &frame, &crtc, &dstBox,
+ src_x, src_y, draw->x + drw_x, draw->y + drw_y,
+ src_w, src_h, drw_w, drw_h,
+ &clip))
+diff --git a/src/sna/sna_video_sprite.c b/src/sna/sna_video_sprite.c
+index 8b094c4..22b5e08 100644
+--- a/src/sna/sna_video_sprite.c
++++ b/src/sna/sna_video_sprite.c
+@@ -366,8 +366,7 @@ static int sna_video_sprite_put_image(ClientPtr client,
+
+ sna_video_frame_init(video, format->id, width, height, &frame);
+
+- if (!sna_video_clip_helper(sna->scrn, video, &frame,
+- &crtc, &dst_box,
++ if (!sna_video_clip_helper(video, &frame, &crtc, &dst_box,
+ src_x, src_y, draw->x + drw_x, draw->y + drw_y,
+ src_w, src_h, drw_w, drw_h,
+ &clip))
+diff --git a/src/sna/sna_video_textured.c b/src/sna/sna_video_textured.c
+index 7ec17d1..b7f4d4f 100644
+--- a/src/sna/sna_video_textured.c
++++ b/src/sna/sna_video_textured.c
+@@ -205,8 +205,7 @@ sna_video_textured_put_image(ClientPtr client,
+
+ sna_video_frame_init(video, format->id, width, height, &frame);
+
+- if (!sna_video_clip_helper(sna->scrn, video, &frame,
+- &crtc, &dstBox,
++ if (!sna_video_clip_helper(video, &frame, &crtc, &dstBox,
+ src_x, src_y, drw_x + draw->x, drw_y + draw->y,
+ src_w, src_h, drw_w, drw_h,
+ &clip))
diff --git a/debian/patches/series b/debian/patches/series
index f8966b4..e90dd88 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,4 +1,13 @@
Check-for-struct-sysinfo-as-well-as-sys-sysinfo.h.patch
Link-the-driver-against-pixman.patch
0001-sna-Make-sure-the-frontbuffer-exists-before-doing-pi.patch
+
+# XMir series
+
+disable-unneeded-functions-when-hosted.patch
+unwrap-legacy-modesetting-when-hosted.patch
+check-hosted-initialisation-succeeds.patch
+fix-spelling-of-caching.patch
+dont-copy-fbcon-if-hosted.patch
+more-modesetting-disablement-when-hosted.patch
xmir.patch
diff --git a/debian/patches/unwrap-legacy-modesetting-when-hosted.patch b/debian/patches/unwrap-legacy-modesetting-when-hosted.patch
new file mode 100644
index 0000000..c62639b
--- /dev/null
+++ b/debian/patches/unwrap-legacy-modesetting-when-hosted.patch
@@ -0,0 +1,57 @@
+commit 3d818c0a36919add462c05d01a64b297f693fa69
+Author: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Wed Aug 14 08:34:46 2013 +0100
+
+ sna: unwrap old modesetting API whilst hosted
+
+ If we are hosted, then we do not have our own modesetting backend and
+ calling it results in fireworks. So leave the old modesetting entry
+ points for the hosting midlayer to control.
+
+ Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
+index 7f2c0ac..c27deb6 100644
+--- a/src/sna/sna_driver.c
++++ b/src/sna/sna_driver.c
+@@ -1080,6 +1080,15 @@ static Bool sna_pm_event(SCRN_ARG_TYPE arg, pmEvent event, Bool undo)
+ return TRUE;
+ }
+
++static Bool sna_enter_vt__hosted(VT_FUNC_ARGS_DECL)
++{
++ return TRUE;
++}
++
++static void sna_leave_vt__hosted(VT_FUNC_ARGS_DECL)
++{
++}
++
+ Bool sna_init_scrn(ScrnInfoPtr scrn, int entity_num)
+ {
+ DBG(("%s: entity_num=%d\n", __FUNCTION__, entity_num));
+@@ -1110,13 +1119,18 @@ Bool sna_init_scrn(ScrnInfoPtr scrn, int entity_num)
+
+ scrn->PreInit = sna_pre_init;
+ scrn->ScreenInit = sna_screen_init;
+- scrn->SwitchMode = sna_switch_mode;
+- scrn->AdjustFrame = sna_adjust_frame;
+- scrn->EnterVT = sna_enter_vt;
+- scrn->LeaveVT = sna_leave_vt;
++ if (!hosted()) {
++ scrn->SwitchMode = sna_switch_mode;
++ scrn->AdjustFrame = sna_adjust_frame;
++ scrn->EnterVT = sna_enter_vt;
++ scrn->LeaveVT = sna_leave_vt;
++ scrn->ValidMode = sna_valid_mode;
++ scrn->PMEvent = sna_pm_event;
++ } else {
++ scrn->EnterVT = sna_enter_vt__hosted;
++ scrn->LeaveVT = sna_leave_vt__hosted;
++ }
+ scrn->FreeScreen = sna_free_screen;
+- scrn->ValidMode = sna_valid_mode;
+- scrn->PMEvent = sna_pm_event;
+
+ xf86SetEntitySharable(entity_num);
+ xf86SetEntityInstanceForScreen(scrn, entity_num,
diff --git a/debian/patches/xmir.patch b/debian/patches/xmir.patch
index 05155a6..9b8f7e3 100644
--- a/debian/patches/xmir.patch
+++ b/debian/patches/xmir.patch
@@ -1,348 +1,4 @@
-commit b6b5c3f009585151eb772dfc2526843c7cee82b3
-Author: Chris Wilson <chris@chris-wilson.co.uk>
-Date: Fri Aug 9 11:34:39 2013 +0100
-
- intel: Disable incompatible features whilst hosted
-
- Start adding the infrastructure to disable direct hardware access if X
- is being run under a system compositor (aka "hosted").
-
- Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-
-diff --git a/src/intel_device.c b/src/intel_device.c
-index c5f0a38..d9ff8bc 100644
---- a/src/intel_device.c
-+++ b/src/intel_device.c
-@@ -92,7 +92,7 @@ static int __intel_check_device(int fd)
- if (drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp))
- ret = FALSE;
- }
-- if (ret) {
-+ if (ret && !hosted()) {
- struct drm_mode_card_res res;
-
- memset(&res, 0, sizeof(res));
-@@ -199,6 +199,12 @@ int intel_open_device(int entity_num,
- dev->open_count = 0;
- dev->master_count = 0;
-
-+ /* If hosted under a system compositor, just pretend to be master */
-+ if (hosted()) {
-+ dev->open_count++;
-+ dev->master_count++;
-+ }
-+
- xf86GetEntityPrivate(entity_num, intel_device_key)->ptr = dev;
-
- return fd;
-@@ -222,6 +228,8 @@ int intel_get_device(ScrnInfoPtr scrn)
- drmSetVersion sv;
- int retry = 2000;
-
-+ assert(!hosted());
-+
- /* Check that what we opened was a master or a
- * master-capable FD, by setting the version of the
- * interface we'll use to talk to it.
-@@ -267,6 +275,7 @@ int intel_get_master(ScrnInfoPtr scrn)
- if (dev->master_count++ == 0) {
- int retry = 2000;
-
-+ assert(!hosted());
- do {
- ret = drmSetMaster(dev->fd);
- if (ret == 0)
-@@ -288,6 +297,7 @@ int intel_put_master(ScrnInfoPtr scrn)
- ret = 0;
- assert(dev->master_count);
- if (--dev->master_count == 0) {
-+ assert(!hosted());
- assert(drmSetMaster(dev->fd) == 0);
- ret = drmDropMaster(dev->fd);
- }
-@@ -317,6 +327,7 @@ void intel_put_device(ScrnInfoPtr scrn)
- if (--dev->open_count)
- return;
-
-+ assert(!hosted());
- intel_set_device(scrn, NULL);
-
- drmClose(dev->fd);
-diff --git a/src/intel_driver.h b/src/intel_driver.h
-index 1e67eab..4768536 100644
---- a/src/intel_driver.h
-+++ b/src/intel_driver.h
-@@ -129,4 +129,6 @@ void intel_put_device(ScrnInfoPtr scrn);
-
- void __intel_uxa_release_device(ScrnInfoPtr scrn);
-
-+#define hosted() (0)
-+
- #endif /* INTEL_DRIVER_H */
-diff --git a/src/intel_module.c b/src/intel_module.c
-index 47e494c..42fa8d8 100644
---- a/src/intel_module.c
-+++ b/src/intel_module.c
-@@ -382,6 +382,9 @@ static Bool intel_driver_func(ScrnInfoPtr pScrn,
- #else
- (*flag) = HW_IO | HW_MMIO;
- #endif
-+ if (hosted())
-+ (*flag) = HW_SKIP_CONSOLE;
-+
- return TRUE;
- default:
- /* Unknown or deprecated function */
-@@ -410,6 +413,9 @@ static enum accel_method { UXA, SNA } get_accel_method(void)
- enum accel_method accel_method = DEFAULT_ACCEL_METHOD;
- XF86ConfDevicePtr dev;
-
-+ if (hosted())
-+ return SNA;
-+
- dev = _xf86findDriver("intel", xf86configptr->conf_device_lst);
- if (dev && dev->dev_option_lst) {
- const char *s;
-@@ -493,7 +499,8 @@ static Bool intel_pci_probe(DriverPtr driver,
- case PCI_CHIP_I810_DC100:
- case PCI_CHIP_I810_E:
- case PCI_CHIP_I815:
-- break;
-+ if (!hosted())
-+ break;
- default:
- return FALSE;
- }
-diff --git a/src/sna/sna.h b/src/sna/sna.h
-index caf671f..7387088 100644
---- a/src/sna/sna.h
-+++ b/src/sna/sna.h
-@@ -229,6 +229,7 @@ struct sna {
Reply to: