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

xserver-xorg-video-intel: Changes to 'debian-experimental'



 Makefile.am                                             |    6 
 NEWS                                                    |   51 -
 configure.ac                                            |   50 -
 debian/changelog                                        |    2 
 src/Makefile.am                                         |    4 
 src/backlight.c                                         |  492 ++++++++++
 src/backlight.h                                         |   56 +
 src/fd.c                                                |   69 +
 src/fd.h                                                |   33 
 src/intel_device.c                                      |  104 --
 src/intel_driver.h                                      |    2 
 src/intel_module.c                                      |    6 
 src/sna/fb/fbpointbits.h                                |   23 
 src/sna/gen2_render.c                                   |   70 -
 src/sna/gen3_render.c                                   |    5 
 src/sna/gen4_render.c                                   |    3 
 src/sna/gen5_render.c                                   |   28 
 src/sna/gen6_common.h                                   |   21 
 src/sna/gen6_render.c                                   |   39 
 src/sna/gen7_render.c                                   |    5 
 src/sna/gen8_render.c                                   |   14 
 src/sna/kgem.c                                          |   63 -
 src/sna/kgem.h                                          |    2 
 src/sna/sna.h                                           |   22 
 src/sna/sna_accel.c                                     |  345 ++++---
 src/sna/sna_blt.c                                       |  263 +++++
 src/sna/sna_composite.c                                 |   25 
 src/sna/sna_display.c                                   |  777 +++++++---------
 src/sna/sna_driver.c                                    |   26 
 src/sna/sna_glyphs.c                                    |   90 +
 src/sna/sna_io.c                                        |    4 
 src/sna/sna_reg.h                                       |    1 
 src/sna/sna_render.c                                    |   13 
 src/sna/sna_render.h                                    |    5 
 src/sna/sna_render_inline.h                             |   28 
 src/sna/sna_threads.c                                   |  142 +-
 src/sna/sna_tiling.c                                    |    6 
 src/sna/sna_transform.c                                 |   57 +
 src/sna/sna_trapezoids.c                                |   77 -
 src/sna/sna_trapezoids_boxes.c                          |  250 ++---
 src/sna/sna_trapezoids_imprecise.c                      |   82 +
 src/sna/sna_trapezoids_mono.c                           |    7 
 src/sna/sna_trapezoids_precise.c                        |   86 +
 src/sna/sna_video_sprite.c                              |   14 
 src/uxa/i830_reg.h                                      |   12 
 src/uxa/intel_batchbuffer.c                             |   16 
 src/uxa/intel_batchbuffer.h                             |    8 
 src/uxa/intel_display.c                                 |  238 ----
 src/uxa/intel_driver.c                                  |   77 -
 src/uxa/intel_uxa.c                                     |   24 
 src/uxa/intel_video.c                                   |    3 
 tools/.gitignore                                        |    2 
 tools/Makefile.am                                       |   29 
 tools/backlight_helper.c                                |   36 
 tools/org.x.xf86-video-intel.backlight-helper.policy.in |   19 
 tools/virtual.c                                         |  192 ++-
 56 files changed, 2699 insertions(+), 1425 deletions(-)

New commits:
commit 31df5ebb7b9c1fa85fce91a40086344a94d4522c
Author: Timo Aaltonen <tjaalton@ubuntu.com>
Date:   Fri Mar 28 10:40:49 2014 +0200

    bump the version

diff --git a/debian/changelog b/debian/changelog
index d3d5841..76e95df 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-xserver-xorg-video-intel (2:2.99.910-1) UNRELEASED; urgency=low
+xserver-xorg-video-intel (2:2.99.911-1) UNRELEASED; urgency=low
 
   * New upstream prerelease.
 

commit 582adf067c275a18f55bb43945348b84cb7eb3c4
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Wed Mar 19 14:57:25 2014 +0000

    2.99.911 snapshot

diff --git a/NEWS b/NEWS
index bcafafb..e209609 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,48 @@
+Snapshot 2.99.911 (2014-03-19)
+==============================
+Hans de Geode has been working on making the Xserver work without
+privileges under the supervision of systemd/logind. This necessitated a
+few new features for us: server fds (where we are passed which fd to use
+to talk to our device by the Xserver who may in turn receive it from
+logind or other host) and a small backlight helper so that we can continue
+to provide a RandR backlight property when running without root privileges.
+
+ * Flush when changing blend modes on Ironlake, or else single glyphs
+   are sometimes rendered incorrectly
+   Regression from 2.20.15
+   https://bugs.freedesktop.org/show_bug.cgi?id=74882
+
+ * Fix pixmap offsets for pixman fallbacks onto Composite redirected
+   windows
+   https://bugs.freedesktop.org/show_bug.cgi?id=73811
+
+ * Fix blending onto 8-bit destinations, typically used for generating
+   masks in complex Render operations, on gen2
+   https://bugs.freedesktop.org/show_bug.cgi?id=75818
+
+ * Handle failure to create DRI bo more carefully. For example on gen3,
+   the DDX supports pixmaps that are much, much larger than OpenGL can
+   use and do not support the tiling modes that we request for OpenGL.
+   https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1289049
+
+ * Fix a bookkeeping bug with proxy buffers that are marked active but
+   not actually inserted into a request (so they end up permanently
+   active and confuse everybody).
+   https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1289923
+
+ * Actually turn off displays with DPMS off for UXA.
+   Regression from 2.99.903, but requires
+
+   kernel commit c9976dcf55c8aaa7037427b239f15e5acfc01a3a
+   Author: Chris Wilson <chris@chris-wilson.co.uk>
+   Date:   Sun Sep 29 19:15:07 2013 +0100
+
+       drm/i915: Only apply DPMS to the encoder if enabled
+
+   instead for correct behaviour on Haswell.
+   https://code.google.com/p/chromium/issues/detail?id=341135
+
+
 Snapshot 2.99.910 (2014-02-10)
 ==============================
 Another latent bug exposed by recent changes merit another snapshot for
diff --git a/configure.ac b/configure.ac
index f68cdf4..7542898 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@
 # Initialize Autoconf
 AC_PREREQ([2.60])
 AC_INIT([xf86-video-intel],
-        [2.99.910],
+        [2.99.911],
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         [xf86-video-intel])
 AC_CONFIG_SRCDIR([Makefile.am])

commit 6802ee00e52515ca886b956f6c0a0e27d708fb31
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Wed Mar 19 10:25:05 2014 +0000

    sna: Assert after applying clipping that the draw rectangle is wholly contained
    
    Otherwise we ignore the purpose of applying the clip!
    
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 4f08e99..a192d06 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -12149,7 +12149,7 @@ sna_poly_fill_rect_tiled_blt(DrawablePtr drawable,
 
 		if (clip.data == NULL) {
 			const BoxRec *box = &clip.extents;
-			DBG(("%s: single clip box [(%d, %d), (%d, %d)]",
+			DBG(("%s: single clip box [(%d, %d), (%d, %d)]\n",
 			     __FUNCTION__, box->x1, box->y1, box->x2, box->y2));
 			while (n--) {
 				BoxRec r;
@@ -12162,10 +12162,6 @@ sna_poly_fill_rect_tiled_blt(DrawablePtr drawable,
 
 				DBG(("%s: rectangle [(%d, %d), (%d, %d)]\n",
 				     __FUNCTION__, r.x1, r.y1, r.x2, r.y2));
-				assert(r.x1 + dx >= 0);
-				assert(r.y1 + dy >= 0);
-				assert(r.x2 + dx <= pixmap->drawable.width);
-				assert(r.y2 + dy <= pixmap->drawable.height);
 
 				if (box_intersect(&r, box)) {
 					int height = r.y2 - r.y1;
@@ -12174,6 +12170,11 @@ sna_poly_fill_rect_tiled_blt(DrawablePtr drawable,
 					if (tile_y < 0)
 						tile_y += tile_height;
 
+					assert(r.x1 + dx >= 0);
+					assert(r.y1 + dy >= 0);
+					assert(r.x2 + dx <= pixmap->drawable.width);
+					assert(r.y2 + dy <= pixmap->drawable.height);
+
 					while (height) {
 						int width = r.x2 - r.x1;
 						int dst_x = r.x1, tile_x;
@@ -12234,14 +12235,15 @@ sna_poly_fill_rect_tiled_blt(DrawablePtr drawable,
 				     region.extents.y1,
 				     region.extents.x2,
 				     region.extents.y2));
+
+				region.data = NULL;
+				RegionIntersect(&region, &region, &clip);
+
 				assert(region.extents.x1 + dx >= 0);
 				assert(region.extents.y1 + dy >= 0);
 				assert(region.extents.x2 + dx <= pixmap->drawable.width);
 				assert(region.extents.y2 + dy <= pixmap->drawable.height);
 
-				region.data = NULL;
-				RegionIntersect(&region, &region, &clip);
-
 				nbox = RegionNumRects(&region);
 				box = RegionRects(&region);
 				DBG(("%s: split into %d boxes after clipping\n", __FUNCTION__, nbox));

commit 15be6b7c9a89bfdac923d2a27649f539c430366f
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Tue Mar 18 16:31:07 2014 +0000

    uxa: Implement minimal flushing for bdw+
    
    Based on the patch by Kenneth Graunke,
    "Several places (such as intel_cache_expire) call intel_emit_batch_flush,
    so it needs to work on Broadwell.  Sometimes the batch is empty, in
    which case current_batch may not yet be BLT_RING.
    
    The PIPE_CONTROL code has not been ported to work on Broadwell, so
    trying to do a render ring flush will hang the GPU.  It also doesn't
    make any sense to do a render ring flush, given that we never use the
    render ring for UXA on Broadwell."
    
    Cc: Kenneth Graunke <kenneth@whitecape.org>
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/src/uxa/intel_batchbuffer.c b/src/uxa/intel_batchbuffer.c
index 4aabe48..dedf7f8 100644
--- a/src/uxa/intel_batchbuffer.c
+++ b/src/uxa/intel_batchbuffer.c
@@ -183,16 +183,23 @@ void intel_batch_emit_flush(ScrnInfoPtr scrn)
 	int flags;
 
 	assert (!intel->in_batch_atomic);
-	assert (INTEL_INFO(intel)->gen < 0100);
 
 	/* Big hammer, look to the pipelined flushes in future. */
-	if ((INTEL_INFO(intel)->gen >= 060)) {
+	if ((INTEL_INFO(intel)->gen >= 0100)) {
+		/* Only BLT supported */
+		BEGIN_BATCH_BLT(4);
+		OUT_BATCH(MI_FLUSH_DW | 2);
+		OUT_BATCH(0); /* address low */
+		OUT_BATCH(0); /* address high */
+		OUT_BATCH(0); /* dword data */
+		ADVANCE_BATCH();
+	} else if ((INTEL_INFO(intel)->gen >= 060)) {
 		if (intel->current_batch == BLT_BATCH) {
 			BEGIN_BATCH_BLT(4);
 			OUT_BATCH(MI_FLUSH_DW | 2);
-			OUT_BATCH(0);
-			OUT_BATCH(0);
-			OUT_BATCH(0);
+			OUT_BATCH(0); /* address */
+			OUT_BATCH(0); /* qword low */
+			OUT_BATCH(0); /* qword high */
 			ADVANCE_BATCH();
 		} else  {
 			if ((INTEL_INFO(intel)->gen == 060)) {

commit 6446bf96f0cc01e730c240f7ed5c91f5d2292139
Author: Hans de Goede <hdegoede@redhat.com>
Date:   Tue Mar 18 15:16:30 2014 +0100

    intel: Don't close the fd on probe failure if it is server managed
    
    I hit this corner case when testing a single X server spanning both intel
    gfx + an usb display link adapter driven by xf86-video-modesetting.
    
    In this scenario the intel driver gets its platformProbe method called first,
    and if it then closes the server managed fd, the xf86-video-modesetting gets
    EBADFD errors.
    
    Signed-off-by: Hans de Goede <hdegoede@redhat.com>

diff --git a/src/intel_device.c b/src/intel_device.c
index e95936b..11118c2 100644
--- a/src/intel_device.c
+++ b/src/intel_device.c
@@ -339,7 +339,8 @@ int intel_open_device(int entity_num,
 	return fd;
 
 err_close:
-	close(fd);
+	if (master_count == 0) /* Don't close server-fds */
+		close(fd);
 err_path:
 	free(local_path);
 	return -1;

commit 4a6e09c6cdb13773bca5f6831f9f5164008699c9
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Tue Mar 18 15:52:19 2014 +0000

    uxa: Add support for server managed fds (via intel_device)
    
    Based on the patch by Hans de Goede, this removes the handling of
    drmOpen() and DRM_MASTER from within uxa and instead uses the common
    routines. This reduces the duplicate code from within uxa, and enables
    new features such as server managed fds.
    
    Cc: Hans de Goede <hdegoede@redhat.com>
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/src/intel_device.c b/src/intel_device.c
index c0e1582..e95936b 100644
--- a/src/intel_device.c
+++ b/src/intel_device.c
@@ -441,20 +441,6 @@ int intel_put_master(ScrnInfoPtr scrn)
 	return ret;
 }
 
-void __intel_uxa_release_device(ScrnInfoPtr scrn)
-{
-	struct intel_device *dev = intel_device(scrn);
-	if (dev && dev->open_count == 0) {
-		intel_set_device(scrn, NULL);
-
-		drmClose(dev->fd);
-		if (dev->render_node != dev->master_node)
-			free(dev->render_node);
-		free(dev->master_node);
-		free(dev);
-	}
-}
-
 void intel_put_device(ScrnInfoPtr scrn)
 {
 	struct intel_device *dev = intel_device(scrn);
diff --git a/src/intel_driver.h b/src/intel_driver.h
index b2cb1b9..182a30e 100644
--- a/src/intel_driver.h
+++ b/src/intel_driver.h
@@ -132,8 +132,6 @@ int intel_get_master(ScrnInfoPtr scrn);
 int intel_put_master(ScrnInfoPtr scrn);
 void intel_put_device(ScrnInfoPtr scrn);
 
-void __intel_uxa_release_device(ScrnInfoPtr scrn);
-
 #define hosted() (0)
 
 #endif /* INTEL_DRIVER_H */
diff --git a/src/uxa/intel_driver.c b/src/uxa/intel_driver.c
index 7ea3b63..0a4fe2a 100644
--- a/src/uxa/intel_driver.c
+++ b/src/uxa/intel_driver.c
@@ -247,62 +247,9 @@ static void intel_check_dri_option(ScrnInfoPtr scrn)
 static Bool intel_open_drm_master(ScrnInfoPtr scrn)
 {
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	struct pci_device *dev = intel->PciInfo;
-	drmSetVersion sv;
-	struct drm_i915_getparam gp;
-	int err, has_gem;
-	char busid[20];
 
-	snprintf(busid, sizeof(busid), "pci:%04x:%02x:%02x.%d",
-		 dev->domain, dev->bus, dev->dev, dev->func);
-
-	intel->drmSubFD = drmOpen(NULL, busid);
-	if (intel->drmSubFD == -1) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[drm] Failed to open DRM device for %s: %s\n",
-			   busid, strerror(errno));
-		return FALSE;
-	}
-
-	/* 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.
-	 * (see DRIOpenDRMMaster() in DRI1)
-	 */
-	sv.drm_di_major = 1;
-	sv.drm_di_minor = 1;
-	sv.drm_dd_major = -1;
-	sv.drm_dd_minor = -1;
-	err = drmSetInterfaceVersion(intel->drmSubFD, &sv);
-	if (err != 0) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[drm] failed to set drm interface version.\n");
-		drmClose(intel->drmSubFD);
-		intel->drmSubFD = -1;
-		return FALSE;
-	}
-
-	has_gem = FALSE;
-	gp.param = I915_PARAM_HAS_GEM;
-	gp.value = &has_gem;
-	(void)drmCommandWriteRead(intel->drmSubFD, DRM_I915_GETPARAM,
-				  &gp, sizeof(gp));
-	if (!has_gem) {
-		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "[drm] Failed to detect GEM.  Kernel 2.6.28 required.\n");
-		drmClose(intel->drmSubFD);
-		intel->drmSubFD = -1;
-		return FALSE;
-	}
-
-	return TRUE;
-}
-
-static void intel_close_drm_master(intel_screen_private *intel)
-{
-	if (intel && intel->drmSubFD > 0) {
-		drmClose(intel->drmSubFD);
-		intel->drmSubFD = -1;
-	}
+	intel->drmSubFD = intel_get_device(scrn);
+	return intel->drmSubFD != -1;
 }
 
 static int intel_init_bufmgr(intel_screen_private *intel)
@@ -1090,8 +1037,8 @@ static void I830FreeScreen(FREE_SCREEN_ARGS_DECL)
 
 	if (intel && !((uintptr_t)intel & 1)) {
 		intel_mode_fini(intel);
-		intel_close_drm_master(intel);
 		intel_bufmgr_fini(intel);
+		intel_put_device(scrn);
 
 		free(intel);
 		scrn->driverPrivate = NULL;
@@ -1102,14 +1049,12 @@ static void I830LeaveVT(VT_FUNC_ARGS_DECL)
 {
 	SCRN_INFO_PTR(arg);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	int ret;
 
 	xf86RotateFreeShadow(scrn);
 
 	xf86_hide_cursors(scrn);
 
-	ret = drmDropMaster(intel->drmSubFD);
-	if (ret)
+	if (intel_put_master(scrn))
 		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
 			   "drmDropMaster failed: %s\n", strerror(errno));
 }
@@ -1121,13 +1066,12 @@ static Bool I830EnterVT(VT_FUNC_ARGS_DECL)
 {
 	SCRN_INFO_PTR(arg);
 	intel_screen_private *intel = intel_get_screen_private(scrn);
-	int ret;
 
-	ret = drmSetMaster(intel->drmSubFD);
-	if (ret) {
+	if (intel_get_master(scrn)) {
 		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
 			   "drmSetMaster failed: %s\n",
 			   strerror(errno));
+		return FALSE;
 	}
 
 	if (!xf86SetDesiredModes(scrn))
@@ -1293,8 +1237,6 @@ static Bool I830PMEvent(SCRN_ARG_TYPE arg, pmEvent event, Bool undo)
 
 Bool intel_init_scrn(ScrnInfoPtr scrn)
 {
-	__intel_uxa_release_device(scrn);
-
 	scrn->PreInit = I830PreInit;
 	scrn->ScreenInit = I830ScreenInit;
 	scrn->SwitchMode = I830SwitchMode;

commit dc66e663a06f2ce7685eba1fdf9fad01786bcb4f
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Mon Mar 17 13:46:05 2014 +0000

    sna: Improve guard against loading palettes whilst headless
    
    Whilst hosted, which is very similar to being headless, we do not even
    have the kmode pointer and so checking kmode->count_crtcs is fatal.
    
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index de08cb9..6e2d118 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3513,7 +3513,16 @@ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
 		num_fake = 1;
 
 	mode->kmode = drmModeGetResources(sna->kgem.fd);
+	if (mode->kmode &&
+	    (mode->kmode->count_crtcs == 0 ||
+	     mode->kmode->count_connectors == 0)) {
+		drmModeFreeResources(mode->kmode);
+		mode->kmode = NULL;
+	}
 	if (mode->kmode) {
+		assert(mode->kmode->count_crtcs);
+		assert(mode->kmode->count_connectors);
+
 		xf86CrtcConfigInit(scrn, &sna_mode_funcs);
 		XF86_CRTC_CONFIG_PTR(scrn)->xf86_crtc_notify = sna_crtc_config_notify;
 
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index ef30149..5e1f440 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -1038,7 +1038,7 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL)
 	if (!miCreateDefColormap(screen))
 		return FALSE;
 
-	if (sna->mode.kmode->count_crtcs &&
+	if (sna->mode.kmode &&
 	    !xf86HandleColormaps(screen, 256, 8, sna_load_palette, NULL,
 				 CMAP_RELOAD_ON_MODE_SWITCH |
 				 CMAP_PALETTED_TRUECOLOR))

commit 28ebbe8fa902a1d3ee4ecbda5041de5e7b68ada7
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Mon Mar 17 07:56:39 2014 +0000

    sna: Fix logic inversion in use of imprecise transform conversion
    
    An accidental drop of the if (!is_translation) broke composite copies
    under a transform.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76244
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 41058c6..284f77e 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -2515,13 +2515,15 @@ fill:
 		return false;
 	}
 
-	if (sna_transform_is_imprecise_integer_translation(src->transform, src->filter,
-							   dst->polyMode == PolyModePrecise,
-							   &tx, &ty)) {
+	if (!sna_transform_is_imprecise_integer_translation(src->transform, src->filter,
+							    dst->polyMode == PolyModePrecise,
+							    &tx, &ty)) {
 		DBG(("%s: source transform is not an integer translation\n",
 		     __FUNCTION__));
 		return false;
 	}
+	DBG(("%s: converting transform to integer translation? (%d, %d)\n",
+	     __FUNCTION__, src->transform != NULL, tx, ty));
 	x += tx;
 	y += ty;
 
diff --git a/src/sna/sna_transform.c b/src/sna/sna_transform.c
index 57d1987..3b54df4 100644
--- a/src/sna/sna_transform.c
+++ b/src/sna/sna_transform.c
@@ -102,36 +102,49 @@ sna_transform_is_imprecise_integer_translation(const PictTransform *t,
 					       int16_t *tx, int16_t *ty)
 {
 	if (t == NULL) {
+		DBG(("%s: no transform\n", __FUNCTION__));
 		*tx = *ty = 0;
 		return true;
 	}
 
+	DBG(("%s: FilterNearest?=%d, precise?=%d, transform=[%f %f %f, %f %f %f, %f %f %f]\n",
+	     __FUNCTION__, filter==PictFilterNearest, precise,
+	     t->matrix[0][0]/65536., t->matrix[0][1]/65536., t->matrix[0][2]/65536.,
+	     t->matrix[1][0]/65536., t->matrix[1][1]/65536., t->matrix[1][2]/65536.,
+	     t->matrix[2][0]/65536., t->matrix[2][1]/65536., t->matrix[2][2]/65536.));
+
 	if (t->matrix[0][0] != IntToxFixed(1) ||
 	    t->matrix[0][1] != 0 ||
 	    t->matrix[1][0] != 0 ||
 	    t->matrix[1][1] != IntToxFixed(1) ||
 	    t->matrix[2][0] != 0 ||
 	    t->matrix[2][1] != 0 ||
-	    t->matrix[2][2] != IntToxFixed(1))
+	    t->matrix[2][2] != IntToxFixed(1)) {
+		DBG(("%s: not unity scaling\n", __FUNCTION__));
 		return false;
+	}
 
-	DBG(("%s: filter=%d, translation (%x, %x), precise? %d\n",
-	     __FUNCTION__, filter, t->matrix[0][2], t->matrix[1][2], precise));
 	if (filter != PictFilterNearest) {
 		if (precise) {
 			if (pixman_fixed_fraction(t->matrix[0][2]) ||
-			    pixman_fixed_fraction(t->matrix[1][2]))
+			    pixman_fixed_fraction(t->matrix[1][2])) {
+				DBG(("%s: precise, fractional translation\n", __FUNCTION__));
 				return false;
+			}
 		} else {
 			int f;
 
 			f = pixman_fixed_fraction(t->matrix[0][2]);
-			if (f < IntToxFixed(1)/4 || f > IntToxFixed(3)/4)
+			if (f < IntToxFixed(1)/4 || f > IntToxFixed(3)/4) {
+				DBG(("%s: imprecise, fractional translation X\n", __FUNCTION__));
 				return false;
+			}
 
 			f = pixman_fixed_fraction(t->matrix[1][2]);
-			if (f < IntToxFixed(1)/4 || f > IntToxFixed(3)/4)
+			if (f < IntToxFixed(1)/4 || f > IntToxFixed(3)/4) {
+				DBG(("%s: imprecise, fractional translation Y\n", __FUNCTION__));
 				return false;
+			}
 		}
 	}
 

commit 57e63221ec0fa304a02beed356549cadb28bcf19
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Mar 14 19:49:59 2014 +0000

    intel-virtual-output: Minor DBG fixes
    
    Improve the summary after failing to detect MIT-SHM, and fix a DBG
    
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/configure.ac b/configure.ac
index 7bf07ae..f68cdf4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -235,7 +235,9 @@ if test "x$tools" = "xyes"; then
       AC_CHECK_HEADERS([X11/extensions/XShm.h X11/extensions/shmproto.h X11/extensions/shmstr.h], [], [tools=no],
 		       [#include <X11/Xlibint.h>
 			#include <X11/Xproto.h>])
+fi
 
+if test "x$tools" = "xyes"; then
       tools_msg="$tools_msg intel-virtual-output"
 fi
 
diff --git a/tools/virtual.c b/tools/virtual.c
index c994574..5883950 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -1201,7 +1201,7 @@ err:
 					     (long)src->mode.id,
 					     src->mode.width,
 					     src->mode.height,
-					     dst->name (long)id,));
+					     dst->name, (long)id));
 					XRRAddOutputMode(dst->dpy, dst->rr_output, id);
 					dst->mode.id = id;
 				} else {

commit 8cc1f005c69786243ac69f6505087071787e6f87
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Mar 14 15:55:41 2014 +0000

    intel-virtual-output: Iterate over remote outputs in the same order as listed
    
    If we walk the output lists in the same order as they are listed by
    RandR, we are more likely to hit favourable priority sorting. E.g. the
    user is likely to setup the outputs in the same order as listed, meaning
    fewer CRTC transitions etc.
    
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index cf38315..c994574 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -2163,6 +2163,20 @@ static struct display *last_display(struct context *ctx)
 	return &ctx->display[ctx->ndisplay-1];
 }
 
+static void reverse_clone_list(struct display *display)
+{
+	struct clone *list = NULL;
+
+	while (display->clone) {
+		struct clone *clone = display->clone;
+		display->clone = clone->next;
+		clone->next = list;
+		list = clone;
+	}
+
+	display->clone = list;
+}
+
 static int last_display_add_clones__randr(struct context *ctx)
 {
 	struct display *display = last_display(ctx);
@@ -2236,6 +2250,8 @@ static int last_display_add_clones__randr(struct context *ctx)
 		XRRFreeOutputInfo(o);
 	}
 	XRRFreeScreenResources(res);
+
+	reverse_clone_list(display);
 	return 0;
 }
 
@@ -2309,6 +2325,8 @@ static int last_display_add_clones__xinerama(struct context *ctx)
 		ctx->active = clone;
 	}
 	XFree(xi);
+
+	reverse_clone_list(display);
 	return 0;
 }
 

commit a55bbe3b598616ef4464e50cb9364c8cdf0b513a
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Mar 14 15:47:20 2014 +0000

    intel-virtual-output: Disable panning before setting mode on CRTC
    
    For whatever reason, presumably to do with the switch between CRTCs, we
    need to disable the panning before setting the mode in order for our
    desired CRTC position to take effect.
    
    Reported-by: Jeff Katz <bugzilla@kraln.com>
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76146
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index 9e267be..cf38315 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -1252,6 +1252,10 @@ err:
 			     dst->x, dst->y, dst->mode.width, dst->mode.height,
 			     dst->rotation, (long)rr_crtc, dst->mode.id));
 
+			ret = XRRSetPanning(dst->dpy, res, rr_crtc, memset(&panning, 0, sizeof(panning)));
+			DBG(("%s-%s: XRRSetPanning %s\n", DisplayString(dst->dpy), dst->name, ret ? "failed" : "success"));
+			(void)ret;
+
 			ret = XRRSetCrtcConfig(dst->dpy, res, rr_crtc, CurrentTime,
 					       dst->x, dst->y, dst->mode.id, dst->rotation,
 					       &dst->rr_output, 1);
@@ -1259,10 +1263,6 @@ err:
 			if (ret)
 				goto err;
 
-			ret = XRRSetPanning(dst->dpy, res, rr_crtc, memset(&panning, 0, sizeof(panning)));
-			DBG(("%s-%s: XRRSetPanning %s\n", DisplayString(dst->dpy), dst->name, ret ? "failed" : "success"));
-			(void)ret;
-
 			if (EXTRA_DBG) {
 				XRRCrtcInfo *c;
 				XRRPanning *p;

commit 5079830bd5f01740c4cbf84888bdf7a93bb2868e
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Mar 14 14:34:48 2014 +0000

    intel-virtual-output: Mode names are freed with ScreenResources
    
    So we have to be careful not to continue to reference the strings after
    they may be freed.
    
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index 0dfd308..9e267be 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -1151,9 +1151,9 @@ static int context_update(struct context *ctx)
 			RRCrtc rr_crtc;
 			Status ret;
 
-			DBG(("%s: copying configuration from %s (mode=%ld: %s) to %s\n",
+			DBG(("%s: copying configuration from %s (mode=%ld: %dx%d) to %s\n",
 			     DisplayString(dst->dpy),
-			     src->name, (long)src->mode.id, src->mode.name,
+			     src->name, (long)src->mode.id, src->mode.width, src->mode.height,
 			     dst->name));
 
 			if (src->mode.id == 0) {
@@ -1188,15 +1188,20 @@ err:
 				/* XXX User names must be unique! */
 				m = src->mode;
 				m.nameLength = snprintf(buf, sizeof(buf),
-							"%s.%ld-%s", src->name, (long)src->mode.id, src->mode.name);
+							"%s.%ld-%dx%d", src->name,
+							(long)src->mode.id,
+							src->mode.width,
+							src->mode.height);
 				m.name = buf;
 
 				id = XRRCreateMode(dst->dpy, dst->window, &m);
 				if (id) {
-					DBG(("%s: adding mode %ld: %s to %s\n",
+					DBG(("%s: adding mode %ld: %dx%d to %s, new mode %ld\n",
 					     DisplayString(dst->dpy),
-					     (long)id, src->mode.name,
-					     dst->name));
+					     (long)src->mode.id,
+					     src->mode.width,
+					     src->mode.height,
+					     dst->name (long)id,));
 					XRRAddOutputMode(dst->dpy, dst->rr_output, id);
 					dst->mode.id = id;
 				} else {

commit c64d2572bafeacae25e9b58c8372ce91858c3832
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Mar 14 13:08:43 2014 +0000

    sna: Allow some leeway when deciding to discard common translations
    
    Under PictFilterNearest, we can ignore fractional translations (not all
    renderers discard those.) And if we are being approximate, we can loosen
    our tolerance as well.
    
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/src/sna/gen2_render.c b/src/sna/gen2_render.c
index 2ebfde6..e3931e3 100644
--- a/src/sna/gen2_render.c
+++ b/src/sna/gen2_render.c
@@ -1550,7 +1550,7 @@ gen2_composite_picture(struct sna *sna,
 	y += dy + picture->pDrawable->y;
 
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
diff --git a/src/sna/gen3_render.c b/src/sna/gen3_render.c
index 69f4668..bb98beb 100644
--- a/src/sna/gen3_render.c
+++ b/src/sna/gen3_render.c
@@ -2859,7 +2859,7 @@ static bool gen3_gradient_setup(struct sna *sna,
 	channel->card_format = MAPSURF_32BIT | MT_32BIT_ARGB8888;
 	channel->filter = PictFilterNearest;
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, PictFilterNearest, false, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		ox += dx;
@@ -3086,7 +3086,7 @@ gen3_composite_picture(struct sna *sna,
 	x += dx + picture->pDrawable->x;
 	y += dy + picture->pDrawable->y;
 
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
diff --git a/src/sna/gen4_render.c b/src/sna/gen4_render.c
index f377315..88db06e 100644
--- a/src/sna/gen4_render.c
+++ b/src/sna/gen4_render.c
@@ -1577,7 +1577,7 @@ gen4_composite_picture(struct sna *sna,
 	y += dy + picture->pDrawable->y;
 
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
diff --git a/src/sna/gen5_render.c b/src/sna/gen5_render.c
index e4db739..5508d49 100644
--- a/src/sna/gen5_render.c
+++ b/src/sna/gen5_render.c
@@ -1516,7 +1516,7 @@ gen5_composite_picture(struct sna *sna,
 	y += dy + picture->pDrawable->y;
 
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 577d1c0..f1f7946 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -1713,8 +1713,8 @@ gen6_composite_picture(struct sna *sna,
 	uint32_t color;
 	int16_t dx, dy;
 
-	DBG(("%s: (%d, %d)x(%d, %d), dst=(%d, %d)\n",
-	     __FUNCTION__, x, y, w, h, dst_x, dst_y));
+	DBG(("%s: (%d, %d)x(%d, %d), dst=(%d, %d), precise=%d\n",
+	     __FUNCTION__, x, y, w, h, dst_x, dst_y, precise));
 
 	channel->is_solid = false;
 	channel->card_format = -1;
@@ -1766,7 +1766,7 @@ gen6_composite_picture(struct sna *sna,
 	y += dy + picture->pDrawable->y;
 
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
@@ -1790,6 +1790,36 @@ gen6_composite_picture(struct sna *sna,
 						  x, y, w, h, dst_x, dst_y);
 	}
 
+	DBG(("%s: pixmap, repeat=%d, filter=%d, transform?=%d [affine? %d], format=%08x\n",
+	     __FUNCTION__,
+	     channel->repeat, channel->filter,
+	     channel->transform != NULL, channel->is_affine,
+	     channel->pict_format));
+	if (channel->transform) {
+#define f2d(x) (((double)(x))/65536.)
+		DBG(("%s: transform=[%f %f %f, %f %f %f, %f %f %f] (raw [%x %x %x, %x %x %x, %x %x %x])\n",
+		     __FUNCTION__,
+		     f2d(channel->transform->matrix[0][0]),
+		     f2d(channel->transform->matrix[0][1]),
+		     f2d(channel->transform->matrix[0][2]),
+		     f2d(channel->transform->matrix[1][0]),
+		     f2d(channel->transform->matrix[1][1]),
+		     f2d(channel->transform->matrix[1][2]),
+		     f2d(channel->transform->matrix[2][0]),
+		     f2d(channel->transform->matrix[2][1]),
+		     f2d(channel->transform->matrix[2][2]),
+		     channel->transform->matrix[0][0],
+		     channel->transform->matrix[0][1],
+		     channel->transform->matrix[0][2],
+		     channel->transform->matrix[1][0],
+		     channel->transform->matrix[1][1],
+		     channel->transform->matrix[1][2],
+		     channel->transform->matrix[2][0],
+		     channel->transform->matrix[2][1],
+		     channel->transform->matrix[2][2]));
+#undef f2d
+	}
+
 	return sna_render_pixmap_bo(sna, channel, pixmap,
 				    x, y, w, h, dst_x, dst_y);
 }
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 4f61661..6c1fe26 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -2029,7 +2029,7 @@ gen7_composite_picture(struct sna *sna,
 	y += dy + picture->pDrawable->y;
 
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
diff --git a/src/sna/gen8_render.c b/src/sna/gen8_render.c
index ddf376b..9e63483 100644
--- a/src/sna/gen8_render.c
+++ b/src/sna/gen8_render.c
@@ -1806,7 +1806,7 @@ gen8_composite_picture(struct sna *sna,
 	y += dy + picture->pDrawable->y;
 
 	channel->is_affine = sna_transform_is_affine(picture->transform);
-	if (sna_transform_is_integer_translation(picture->transform, &dx, &dy)) {
+	if (sna_transform_is_imprecise_integer_translation(picture->transform, picture->filter, precise, &dx, &dy)) {
 		DBG(("%s: integer translation (%d, %d), removing\n",
 		     __FUNCTION__, dx, dy));
 		x += dx;
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 4651632..f0ddda5 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -764,10 +764,13 @@ sna_get_transformed_coordinates_3d(int x, int y,
 				   float *x_out, float *y_out, float *z_out);
 
 bool sna_transform_is_affine(const PictTransform *t);
-bool sna_transform_is_integer_translation(const PictTransform *t,
-					  int16_t *tx, int16_t *ty);
 bool sna_transform_is_translation(const PictTransform *t,
 				  pixman_fixed_t *tx, pixman_fixed_t *ty);
+bool sna_transform_is_integer_translation(const PictTransform *t,
+					  int16_t *tx, int16_t *ty);
+bool sna_transform_is_imprecise_integer_translation(const PictTransform *t,
+					       int filter, bool precise,
+					       int16_t *tx, int16_t *ty);
 static inline bool
 sna_affine_transform_is_rotation(const PictTransform *t)
 {
diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index 302a00b..41058c6 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -2515,7 +2515,9 @@ fill:
 		return false;
 	}
 
-	if (!sna_transform_is_integer_translation(src->transform, &tx, &ty)) {
+	if (sna_transform_is_imprecise_integer_translation(src->transform, src->filter,
+							   dst->polyMode == PolyModePrecise,
+							   &tx, &ty)) {
 		DBG(("%s: source transform is not an integer translation\n",
 		     __FUNCTION__));
 		return false;
diff --git a/src/sna/sna_composite.c b/src/sna/sna_composite.c
index 74dfc9e..d34b517 100644
--- a/src/sna/sna_composite.c


Reply to: