[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-video-intel: Changes to 'ubuntu'



 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 <raof@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 <raof@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 <chris@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 <chris@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 <chris@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 <chris@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 <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,
+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;
+commit 96e2b3c6ee7aad96612a2efad97656a764e197f4
+Author: Chris Wilson <chris@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 <chris@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 */


Reply to: