debian/changelog                               |   14 
 debian/patches/fix-preinit-cleanup-paths.patch |   94 +++
 debian/patches/series                          |    2 
 debian/patches/xmir.patch                      |  714 +++++++++++++++----------
 4 files changed, 554 insertions(+), 270 deletions(-)

New commits:
commit bfc1b6badcc5010cabfed0509894853895364aa5
Author: Christopher James Halse Rogers <r...@ubuntu.com>
Date:   Thu Aug 15 11:50:39 2013 +1000

    Update XMir patch following ickle's branch

diff --git a/debian/changelog b/debian/changelog
index 6a74bb1..cfbca0c 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+xserver-xorg-video-intel (2:2.21.12-1ubuntu3) saucy; urgency=low
+
+  * fix-preinit-cleanup-paths.patch: Upstream cherrypick to fix leaks in
+    sna_pre_init failure paths. Prerequisite for new XMir patch.
+  * xmir.patch: Update to follow upstream developments
+
+ -- Christopher James Halse Rogers <r...@ubuntu.com>  Thu, 15 Aug 2013 
11:46:10 +1000
+
 xserver-xorg-video-intel (2:2.21.12-1ubuntu2) saucy; urgency=low
 
   * Fix crash in sna_adjust_frame under XMir (LP: #1212065)
diff --git a/debian/patches/fix-preinit-cleanup-paths.patch 
b/debian/patches/fix-preinit-cleanup-paths.patch
new file mode 100644
index 0000000..72065a5
--- /dev/null
+++ b/debian/patches/fix-preinit-cleanup-paths.patch
@@ -0,0 +1,94 @@
+commit d7465ece29c9ae665a5a9f5bdac764a19062786e
+Author: Chris Wilson <ch...@chris-wilson.co.uk>
+Date:   Mon Jul 29 21:55:29 2013 +0100
+
+    sna: Cleanup along all error paths in sna_pre_init()
+    
+    Only one out of a dozen error paths actually freed the locally allocated
+    memory, oops.
+    
+    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 9c338bb..16dbc91 100644
+--- a/src/sna/sna_driver.c
++++ b/src/sna/sna_driver.c
+@@ -276,15 +276,6 @@ cleanup_front:
+       return FALSE;
+ }
+ 
+-static void PreInitCleanup(ScrnInfoPtr scrn)
+-{
+-      if (!scrn || !scrn->driverPrivate)
+-              return;
+-
+-      free(scrn->driverPrivate);
+-      scrn->driverPrivate = NULL;
+-}
+-
+ static void sna_selftest(void)
+ {
+       sna_damage_selftest();
+@@ -434,7 +425,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+       if (fd == -1) {
+               xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+                          "Failed to become DRM master.\n");
+-              return FALSE;
++              goto cleanup;
+       }
+ 
+       preferred_depth = sna->info->gen < 030 ? 15 : 24;
+@@ -444,7 +435,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+       if (!xf86SetDepthBpp(scrn, preferred_depth, 0, 0,
+                            Support32bppFb |
+                            SupportConvert24to32 | PreferConvert24to32))
+-              return FALSE;
++              goto cleanup;
+ 
+       switch (scrn->depth) {
+       case 8:
+@@ -458,18 +449,18 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+               xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+                          "Given depth (%d) is not supported by the Intel 
driver and this chipset.\n",
+                          scrn->depth);
+-              return FALSE;
++              goto cleanup;
+       }
+       xf86PrintDepthBpp(scrn);
+ 
+       if (!xf86SetWeight(scrn, defaultWeight, defaultWeight))
+-              return FALSE;
++              goto cleanup;
+       if (!xf86SetDefaultVisual(scrn, -1))
+-              return FALSE;
++              goto cleanup;
+ 
+       sna->Options = intel_options_get(scrn);
+       if (sna->Options == NULL)
+-              return FALSE;
++              goto cleanup;
+ 
+       sna_setup_capabilities(scrn, fd);
+ 
+@@ -523,8 +514,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+       if (!sna_mode_pre_init(scrn, sna)) {
+               xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+                          "No outputs and no modes.\n");
+-              PreInitCleanup(scrn);
+-              return FALSE;
++              goto cleanup;
+       }
+       scrn->currentMode = scrn->modes;
+ 
+@@ -536,6 +526,11 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+               sna->dri_available = !!xf86LoadSubModule(scrn, "dri2");
+ 
+       return TRUE;
++
++cleanup:
++      scrn->driverPrivate = (void *)((uintptr_t)sna->info | 1);
++      free(sna);
++      return FALSE;
+ }
+ 
+ static void
diff --git a/debian/patches/series b/debian/patches/series
index c72571f..765b2c3 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -2,4 +2,6 @@
 sna-note-that-borderClip-region.patch
 sna-fix-typo-in-computing-box.patch
 sna-fall-back-to-proc-cpuinfo.patch
+
+fix-preinit-cleanup-paths.patch
 xmir.patch
diff --git a/debian/patches/xmir.patch b/debian/patches/xmir.patch
index 467de7b..454882e 100644
--- a/debian/patches/xmir.patch
+++ b/debian/patches/xmir.patch
@@ -1,80 +1,33 @@
-commit ea3344d571ff728f5cb84c6920635e552090ec7c
+commit b6b5c3f009585151eb772dfc2526843c7cee82b3
 Author: Chris Wilson <ch...@chris-wilson.co.uk>
-Date:   Wed Jul 24 01:44:30 2013 +0100
+Date:   Fri Aug 9 11:34:39 2013 +0100
 
-    sna: Preliminary patch for XMir
+    intel: Disable incompatible features whilst hosted
     
-    For the intrepid explorer, who is desperate to encounter all the bugs we
-    fixed long ago. /o\
+    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>
 
-Index: xf86-video-intel/src/Makefile.am
-===================================================================
---- xf86-video-intel.orig/src/Makefile.am      2013-08-14 14:01:04.235601828 
+1000
-+++ xf86-video-intel/src/Makefile.am   2013-08-14 14:01:04.231601828 +1000
-@@ -46,6 +46,7 @@
-       intel_device.c \
-       intel_options.c \
-       intel_module.c \
-+      intel_xmir.h \
-       compat-api.h \
-       $(NULL)
- 
-Index: xf86-video-intel/src/intel_device.c
-===================================================================
---- xf86-video-intel.orig/src/intel_device.c   2013-08-14 14:01:04.235601828 
+1000
-+++ xf86-video-intel/src/intel_device.c        2013-08-14 14:01:04.231601828 
+1000
-@@ -92,7 +92,7 @@
+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 && !xorgMir) {
++      if (ret && !hosted()) {
                struct drm_mode_card_res res;
  
                memset(&res, 0, sizeof(res));
-@@ -121,10 +121,34 @@
-       return fd;
- }
- 
-+static int __intel_open_xmir(const struct pci_device *pci,
-+                           char **path)
-+{
-+      char id[20];
-+      int fd;
-+
-+      snprintf(id, sizeof(id),
-+               "pci:%04x:%02x:%02x.%d",
-+               pci->domain, pci->bus, pci->dev, pci->func);
-+      fd = xmir_get_drm_fd(id);
-+      if (fd == -1)
-+              return -1;
-+
-+      if (*path == NULL) /* XXX Fix Xmir - it knows both the fd and path */
-+              *path = drmGetDeviceNameFromFd(fd);
-+      if (*path == NULL)
-+              fd = -1;
-+
-+      return fd;
-+}
-+
- static int __intel_open_device(const struct pci_device *pci, char **path)
- {
-       int fd;
- 
-+      if (xorgMir)
-+              return __intel_open_xmir(pci, path);
-+
-       if (*path == NULL) {
-               char id[20];
-               int ret;
-@@ -199,6 +223,12 @@
+@@ -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 (xorgMir) {
++      if (hosted()) {
 +              dev->open_count++;
 +              dev->master_count++;
 +      }
@@ -82,80 +35,401 @@ Index: xf86-video-intel/src/intel_device.c
        xf86GetEntityPrivate(entity_num, intel_device_key)->ptr = dev;
  
        return fd;
-@@ -222,6 +252,8 @@
+@@ -222,6 +228,8 @@ int intel_get_device(ScrnInfoPtr scrn)
                drmSetVersion sv;
                int retry = 2000;
  
-+              assert(!xorgMir);
++              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 +299,7 @@
+@@ -267,6 +275,7 @@ int intel_get_master(ScrnInfoPtr scrn)
        if (dev->master_count++ == 0) {
                int retry = 2000;
  
-+              assert(!xorgMir);
++              assert(!hosted());
                do {
                        ret = drmSetMaster(dev->fd);
                        if (ret == 0)
-@@ -288,6 +321,7 @@
+@@ -288,6 +297,7 @@ int intel_put_master(ScrnInfoPtr scrn)
        ret = 0;
        assert(dev->master_count);
        if (--dev->master_count == 0) {
-+              assert(!xorgMir);
++              assert(!hosted());
                assert(drmSetMaster(dev->fd) == 0);
                ret = drmDropMaster(dev->fd);
        }
-@@ -317,6 +351,7 @@
+@@ -317,6 +327,7 @@ void intel_put_device(ScrnInfoPtr scrn)
        if (--dev->open_count)
                return;
  
-+      assert(!xorgMir);
++      assert(!hosted());
        intel_set_device(scrn, NULL);
  
        drmClose(dev->fd);
-Index: xf86-video-intel/src/intel_driver.h
-===================================================================
---- xf86-video-intel.orig/src/intel_driver.h   2013-08-14 14:01:04.235601828 
+1000
-+++ xf86-video-intel/src/intel_driver.h        2013-08-14 14:01:04.231601828 
+1000
-@@ -1,6 +1,8 @@
- #ifndef INTEL_DRIVER_H
- #define INTEL_DRIVER_H
- 
-+#include "intel_xmir.h"
-+
- #define INTEL_VERSION 4000
- #define INTEL_NAME "intel"
- #define INTEL_DRIVER_NAME "intel"
-Index: xf86-video-intel/src/intel_module.c
-===================================================================
---- xf86-video-intel.orig/src/intel_module.c   2013-08-14 14:01:04.235601828 
+1000
-+++ xf86-video-intel/src/intel_module.c        2013-08-14 14:01:04.231601828 
+1000
-@@ -422,6 +422,9 @@
+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 (xorgMir)
++              if (hosted())
 +                      (*flag) = HW_SKIP_CONSOLE;
 +
                return TRUE;
        default:
                /* Unknown or deprecated function */
-@@ -533,7 +536,8 @@
+@@ -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 (!xorgMir)
++                      if (!hosted())
 +                              break;
                default:
                        return FALSE;
                }
-Index: xf86-video-intel/src/intel_xmir.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ xf86-video-intel/src/intel_xmir.h  2013-08-14 14:01:04.231601828 +1000
+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;
+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,
+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;
+commit 96e2b3c6ee7aad96612a2efad97656a764e197f4
+Author: Chris Wilson <ch...@chris-wilson.co.uk>
+Date:   Wed Jul 24 01:44:30 2013 +0100
+
+    sna: Preliminary patch for XMir
+    
+    For the intrepid explorer, who is desperate to encounter all the bugs we
+    fixed long ago. /o\
+    
+    Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
+
+diff --git a/src/Makefile.am b/src/Makefile.am
+index b0781ca..126bde2 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -59,6 +59,7 @@ intel_drv_la_SOURCES = \
+       intel_driver.h \
+       intel_options.c \
+       intel_module.c \
++      intel_xmir.h \
+       compat-api.h \
+       $(NULL)
+ 
+diff --git a/src/intel_device.c b/src/intel_device.c
+index d9ff8bc..706b156 100644
+--- a/src/intel_device.c
++++ b/src/intel_device.c
+@@ -121,10 +121,34 @@ static int fd_set_cloexec(int fd)
+       return fd;
+ }
+ 
++static int __intel_open_xmir(const struct pci_device *pci,
++                           char **path)
++{
++      char id[20];
++      int fd;
++
++      snprintf(id, sizeof(id),
++               "pci:%04x:%02x:%02x.%d",
++               pci->domain, pci->bus, pci->dev, pci->func);
++      fd = xmir_get_drm_fd(id);
++      if (fd == -1)
++              return -1;
++
++      if (*path == NULL) /* XXX Fix Xmir - it knows both the fd and path */
++              *path = drmGetDeviceNameFromFd(fd);
++      if (*path == NULL)
++              fd = -1;
++
++      return fd;
++}
++
+ static int __intel_open_device(const struct pci_device *pci, char **path)
+ {
+       int fd;
+ 
++      if (xorgMir)
++              return __intel_open_xmir(pci, path);
++
+       if (*path == NULL) {
+               char id[20];
+               int ret;
+diff --git a/src/intel_driver.h b/src/intel_driver.h
+index 4768536..d5caa4f 100644
+--- a/src/intel_driver.h
++++ b/src/intel_driver.h
+@@ -1,6 +1,8 @@
+ #ifndef INTEL_DRIVER_H
+ #define INTEL_DRIVER_H
+ 
++#include "intel_xmir.h"
++
+ #define INTEL_VERSION 4000
+ #define INTEL_NAME "intel"
+ #define INTEL_DRIVER_NAME "intel"
+@@ -129,6 +131,6 @@ void intel_put_device(ScrnInfoPtr scrn);
+ 
+ void __intel_uxa_release_device(ScrnInfoPtr scrn);
+ 
+-#define hosted() (0)
++#define hosted() (xorgMir)
+ 
+ #endif /* INTEL_DRIVER_H */
+diff --git a/src/intel_xmir.h b/src/intel_xmir.h
+new file mode 100644
+index 0000000..2e3c85a
+--- /dev/null
++++ b/src/intel_xmir.h
 @@ -0,0 +1,15 @@
 +#ifndef INTEL_XMIR_H
 +#define INTEL_XMIR_H
@@ -172,11 +446,11 @@ Index: xf86-video-intel/src/intel_xmir.h
 +#endif
 +
 +#endif /* INTEL_XMIR_H */
-Index: xf86-video-intel/src/sna/Makefile.am
-===================================================================
---- xf86-video-intel.orig/src/sna/Makefile.am  2013-08-14 14:01:04.235601828 
+1000
-+++ xf86-video-intel/src/sna/Makefile.am       2013-08-14 14:01:04.231601828 
+1000
-@@ -73,6 +73,7 @@
+diff --git a/src/sna/Makefile.am b/src/sna/Makefile.am
+index 5d5417e..1c5dda0 100644
+--- a/src/sna/Makefile.am
++++ b/src/sna/Makefile.am
+@@ -75,6 +75,7 @@ libsna_la_SOURCES = \
        sna_video_overlay.c \
        sna_video_sprite.c \
        sna_video_textured.c \
@@ -184,19 +458,11 @@ Index: xf86-video-intel/src/sna/Makefile.am
        gen2_render.c \
        gen2_render.h \
        gen3_render.c \
-Index: xf86-video-intel/src/sna/sna.h
-===================================================================
---- xf86-video-intel.orig/src/sna/sna.h        2013-08-14 14:01:04.235601828 
+1000
-+++ xf86-video-intel/src/sna/sna.h     2013-08-14 14:01:04.231601828 +1000
-@@ -218,6 +218,7 @@
- #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;
-@@ -271,6 +272,7 @@
+diff --git a/src/sna/sna.h b/src/sna/sna.h
+index fe84074..d9ebd75 100644
+--- a/src/sna/sna.h
++++ b/src/sna/sna.h
+@@ -283,6 +283,7 @@ struct sna {
        EntityInfoPtr pEnt;
        struct pci_device *PciInfo;
        const struct intel_device_info *info;
@@ -204,7 +470,25 @@ Index: xf86-video-intel/src/sna/sna.h
  
        ScreenBlockHandlerProcPtr BlockHandler;
        ScreenWakeupHandlerProcPtr WakeupHandler;
-@@ -912,4 +914,18 @@
+@@ -420,6 +421,17 @@ CARD32 sna_render_format_for_depth(int depth);
+ 
+ void sna_debug_flush(struct sna *sna);
+ 
++static inline void
++get_window_deltas(PixmapPtr pixmap, int16_t *x, int16_t *y)
++{
++#ifdef COMPOSITE
++      *x = -pixmap->screen_x;
++      *y = -pixmap->screen_y;
++#else
++      *x = *y = 0;
++#endif
++}
++
+ static inline bool
+ get_drawable_deltas(DrawablePtr drawable, PixmapPtr pixmap, int16_t *x, 
int16_t *y)
+ {
+@@ -930,4 +942,18 @@ void sna_image_composite(pixman_op_t        op,
                         uint16_t           width,
                         uint16_t           height);
  
@@ -223,59 +507,11 @@ Index: xf86-video-intel/src/sna/sna.h
 +#endif
 +
  #endif /* _SNA_H */
-Index: xf86-video-intel/src/sna/sna_display.c
-===================================================================
---- xf86-video-intel.orig/src/sna/sna_display.c        2013-08-14 
14:01:04.235601828 +1000
-+++ xf86-video-intel/src/sna/sna_display.c     2013-08-14 14:01:13.183602136 
+1000
-@@ -1488,6 +1488,9 @@
-       xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
-       xf86CrtcPtr crtc;
- 
-+      if (sna->flags & SNA_IS_HOSTED)
-+              return;
-+
-       if ((unsigned)config->compat_output >= config->num_output)
-               return;
- 
-@@ -3128,11 +3131,22 @@
-       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);
-@@ -3149,9 +3163,7 @@
-               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;
-Index: xf86-video-intel/src/sna/sna_dri.c
-===================================================================
---- xf86-video-intel.orig/src/sna/sna_dri.c    2013-08-14 14:01:04.235601828 
+1000
-+++ xf86-video-intel/src/sna/sna_dri.c 2013-08-14 14:01:04.231601828 +1000
-@@ -2399,6 +2399,13 @@
+diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
+index 1569251..d0db3de 100644
+--- a/src/sna/sna_dri.c
++++ b/src/sna/sna_dri.c
+@@ -2272,6 +2272,13 @@ out_complete:
  }
  #endif
  
@@ -289,7 +525,7 @@ Index: xf86-video-intel/src/sna/sna_dri.c
  static bool has_i830_dri(void)
  {
        return access(DRI_DRIVER_PATH "/i830_dri.so", R_OK) == 0;
-@@ -2474,6 +2481,13 @@
+@@ -2347,6 +2354,13 @@ bool sna_dri_open(struct sna *sna, ScreenPtr screen)
        info.ReuseBufferNotify = NULL;
  #endif
  
@@ -303,41 +539,26 @@ Index: xf86-video-intel/src/sna/sna_dri.c
  #if USE_ASYNC_SWAP
        info.version = 10;
        info.AsyncSwap = sna_dri_async_swap;
-Index: xf86-video-intel/src/sna/sna_driver.c
-===================================================================
---- xf86-video-intel.orig/src/sna/sna_driver.c 2013-08-14 14:01:04.235601828 
+1000
-+++ xf86-video-intel/src/sna/sna_driver.c      2013-08-14 14:01:04.231601828 
+1000
-@@ -295,7 +295,7 @@
-       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;
-@@ -421,6 +421,7 @@
-       sna = to_sna(scrn);
-       sna->scrn = scrn;
-       sna->pEnt = pEnt;
-+      sna->flags = 0;
- 
-       scrn->displayWidth = 640;       /* default it */
+diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
+index 83a5bba..6fe49c9 100644
+--- a/src/sna/sna_driver.c
++++ b/src/sna/sna_driver.c
+@@ -430,6 +430,9 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+               goto cleanup;
+       }
  
-@@ -433,13 +434,21 @@
-       fd = intel_get_device(scrn);
-       if (fd == -1) {
++      if (!sna_xmir_create(sna))
++              return FALSE;
++
+       /* Sanity check */
+       if (hosted() && (sna->flags & SNA_IS_HOSTED) == 0) {
                xf86DrvMsg(scrn->scrnIndex, X_ERROR,
--                         "Failed to become DRM master.\n");
-+                         "Failed to claim DRM device.\n");
-               return FALSE;
+@@ -437,9 +440,14 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
+               goto cleanup;
        }
  
 -      preferred_depth = sna->info->gen < 030 ? 15 : 24;
 -      if (!fb_supports_depth(fd, preferred_depth))
-+      if (!sna_xmir_create(sna))
-+              return FALSE;
-+
 +      if (sna->xmir) {
 +              /* XXX query depth from xmir */
                preferred_depth = 24;
@@ -349,7 +570,7 @@ Index: xf86-video-intel/src/sna/sna_driver.c
  
        if (!xf86SetDepthBpp(scrn, preferred_depth, 0, 0,
                             Support32bppFb |
-@@ -475,6 +484,9 @@
+@@ -475,6 +483,9 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
  
        intel_detect_chipset(scrn, sna->pEnt, sna->PciInfo);
  
@@ -359,15 +580,7 @@ Index: xf86-video-intel/src/sna/sna_driver.c
        kgem_init(&sna->kgem, fd, sna->PciInfo, sna->info->gen);
        if (xf86ReturnOptValBool(sna->Options, OPTION_ACCEL_DISABLE, FALSE) ||
            !sna_option_cast_to_bool(sna, OPTION_ACCEL_METHOD, TRUE)) {
-@@ -492,7 +504,6 @@
-       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))
-@@ -555,6 +566,8 @@
+@@ -558,6 +569,8 @@ sna_block_handler(BLOCKHANDLER_ARGS_DECL)
  
        if (*tv == NULL || ((*tv)->tv_usec | (*tv)->tv_sec))
                sna_accel_block_handler(sna, tv);
@@ -376,17 +589,7 @@ Index: xf86-video-intel/src/sna/sna_driver.c
  }
  
  static void
-@@ -633,6 +646,9 @@
-       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
-@@ -885,6 +901,8 @@
+@@ -898,6 +911,8 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL)
                return FALSE;
        }
  
@@ -395,49 +598,12 @@ Index: xf86-video-intel/src/sna/sna_driver.c
        xf86SetBlackWhitePixels(screen);
  
        xf86SetBackingStore(screen);
-@@ -892,7 +910,8 @@
-       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 |
-Index: xf86-video-intel/src/sna/sna_video_overlay.c
-===================================================================
---- xf86-video-intel.orig/src/sna/sna_video_overlay.c  2013-08-14 
14:01:04.235601828 +1000
-+++ xf86-video-intel/src/sna/sna_video_overlay.c       2013-08-14 
14:01:04.231601828 +1000
-@@ -683,6 +683,9 @@
-       struct sna_video *video;
-       XvPortPtr port;
- 
-+      if (sna->flags & SNA_IS_HOSTED)
-+              return;
-+
-       if (!sna_has_overlay(sna))
-               return;
- 
-Index: xf86-video-intel/src/sna/sna_video_sprite.c
-===================================================================
---- xf86-video-intel.orig/src/sna/sna_video_sprite.c   2013-08-14 
14:01:04.235601828 +1000
-+++ xf86-video-intel/src/sna/sna_video_sprite.c        2013-08-14 
14:01:04.231601828 +1000
-@@ -456,6 +456,9 @@
-       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;
-Index: xf86-video-intel/src/sna/sna_xmir.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ xf86-video-intel/src/sna/sna_xmir.c        2013-08-14 14:01:04.231601828 
+1000
-@@ -0,0 +1,165 @@
+diff --git a/src/sna/sna_xmir.c b/src/sna/sna_xmir.c
+new file mode 100644
+index 0000000..a7c882d
+--- /dev/null
++++ b/src/sna/sna_xmir.c
+@@ -0,0 +1,163 @@
 +/***************************************************************************
 +
 + Copyright 2013 Intel Corporation.  All Rights Reserved.
@@ -489,7 +655,7 @@ Index: xf86-video-intel/src/sna/sna_xmir.c
 +
 +#define FORCE_FULL_REDRAW 0
 +
-+static bool
++static void
 +sna_xmir_copy_to_mir(WindowPtr win, RegionPtr region)
 +{
 +      PixmapPtr src = get_window_pixmap(win);
@@ -497,20 +663,23 @@ Index: xf86-video-intel/src/sna/sna_xmir.c
 +      struct sna_pixmap *priv;
 +      struct kgem_bo *bo;
 +      BoxRec box, *boxes;
++      int16_t sx, sy;
 +      int nbox;
-+      bool ret;
++
++      if (wedged(sna)) /* XXX need pitch/size for CPU copy fallback */
++              return;
 +
 +      priv = sna_pixmap_force_to_gpu(src, MOVE_READ);
 +      if (priv == NULL)
-+              return false;
++              return;
 +
-+      /* XXX size and pitch are bogus */
++      /* XXX size and pitch are bogus, but only used for sanity checks */


-- 
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/e1v9slo-0000fx...@vasks.debian.org

Reply via email to