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 <r...@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 <r...@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 <ch...@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 <ch...@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 <ch...@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 <ch...@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 <ch...@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 <ch...@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.di...@gmail.com> +Date: Wed Aug 14 10:01:13 2013 +0200 + + Correct misspelled caching + + Signed-off-by: Sedat Dilek <sedat.di...@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 <ch...@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 <r...@ubuntu.com> + Signed-off-by: Chris Wilson <ch...@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 <ch...@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 <ch...@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 <ch...@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 <ch...@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 { -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1vjba7-0000qd...@vasks.debian.org