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

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



 NEWS                       |   30 ++
 configure.ac               |    2 
 man/intel.man              |    5 
 src/intel.h                |   14 -
 src/intel_display.c        |   64 ++++
 src/intel_dri.c            |    7 
 src/intel_driver.c         |   97 ++++++-
 src/intel_glamor.c         |    2 
 src/intel_module.c         |   62 ++++
 src/intel_uxa.c            |   86 ++++++
 src/intel_video.c          |    5 
 src/sna/fb/fb.h            |   18 -
 src/sna/fb/fbblt.c         |   15 -
 src/sna/fb/fbpoint.c       |   60 ++--
 src/sna/fb/fbpointbits.h   |   58 +++-
 src/sna/gen6_render.c      |   68 +++-
 src/sna/gen7_render.c      |   78 +++--
 src/sna/kgem.c             |  162 ++++++++++-
 src/sna/kgem.h             |   10 
 src/sna/sna.h              |   21 +
 src/sna/sna_accel.c        |  614 ++++++++++++++++++++++++++++++++++++++-------
 src/sna/sna_composite.c    |   19 -
 src/sna/sna_damage.c       |   20 +
 src/sna/sna_display.c      |  218 ++++++++++++---
 src/sna/sna_dri.c          |   27 +
 src/sna/sna_driver.c       |   80 +++--
 src/sna/sna_glyphs.c       |    6 
 src/sna/sna_tiling.c       |    1 
 src/sna/sna_video.c        |    5 
 src/sna/sna_video_sprite.c |   13 
 30 files changed, 1501 insertions(+), 366 deletions(-)

New commits:
commit 0659711dfa9c9fc52adeaba766049887d5b6f040
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Sat Sep 8 20:01:32 2012 +0100

    2.20.7 release
    
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/NEWS b/NEWS
index 1291b51..82cf4a4 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,29 @@
+Release 2.20.7 (2012-09-08)
+===========================
+Continuing the flurry of releases, this week saw the release of
+xorg-1.13 bringing with it the first steps towards hotpluggable gpu
+support and the ability to offload DRI rendering onto other GPUs. In
+light of that advance, this release includes the support code by Dave
+Airlie to integrate PRIME into xf86-video-intel and make those new
+features available.
+
+Aside from landing PRIME, a few other bugs were fixed since 2.20.5:
+
+ * Fix framebuffer leak on server regeneration
+
+ * Fix texture cache flushing on IvyBridge and Kwin with plastique
+   https://bugs.freedesktop.org/show_bug.cgi?id=54488
+
+ * Redirect large solid fills on SandyBridge+. By large I mean greater
+   than 8192 or 16384 pixels on SandyBridge and IvyBridge respectively.
+   https://bugs.freedesktop.org/show_bug.cgi?id=54134
+
+ * Fix up backlight option handling in the manpage and uxa.
+   https://bugs.freedesktop.org/show_bug.cgi?id=54397
+
+ * Unbreak ZaphodHeads.
+   https://bugs.freedesktop.org/show_bug.cgi?id=52438
+
 Release 2.20.6 (2012-09-02)
 ===========================
 A serious bug that caused a crash on SandyBridge and IvyBridge when
diff --git a/configure.ac b/configure.ac
index c401a61..f94f140 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@
 # Initialize Autoconf
 AC_PREREQ([2.60])
 AC_INIT([xf86-video-intel],
-        [2.20.6],
+        [2.20.7],
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         [xf86-video-intel])
 AC_CONFIG_SRCDIR([Makefile.am])

commit 2c8e48f8149499040342836491333402fd05b762
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Sep 7 23:00:47 2012 +0100

    sna: Remember that LineDoubleDash involves updating the GC between segments
    
    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 9881050..7574847 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -5088,6 +5088,13 @@ struct sna_fill_spans {
 };
 
 static void
+sna_poly_point__cpu(DrawablePtr drawable, GCPtr gc,
+		    int mode, int n, DDXPointPtr pt)
+{
+	fbPolyPoint(drawable, gc, mode, n, pt, -1);
+}
+
+static void
 sna_poly_point__fill(DrawablePtr drawable, GCPtr gc,
 		     int mode, int n, DDXPointPtr pt)
 {
@@ -5123,6 +5130,52 @@ sna_poly_point__fill(DrawablePtr drawable, GCPtr gc,
 }
 
 static void
+sna_poly_point__gpu(DrawablePtr drawable, GCPtr gc,
+		     int mode, int n, DDXPointPtr pt)
+{
+	struct sna_fill_spans *data = sna_gc(gc)->priv;
+	struct sna_fill_op fill;
+	BoxRec box[512];
+	DDXPointRec last;
+
+	if (!sna_fill_init_blt(&fill,
+			       data->sna, data->pixmap,
+			       data->bo, gc->alu, gc->fgPixel))
+		return;
+
+	DBG(("%s: count=%d\n", __FUNCTION__, n));
+
+	last.x = drawable->x;
+	last.y = drawable->y;
+	while (n) {
+		BoxRec *b = box;
+		unsigned nbox = n;
+		if (nbox > ARRAY_SIZE(box))
+			nbox = ARRAY_SIZE(box);
+		n -= nbox;
+		do {
+			*(DDXPointRec *)b = *pt++;
+
+			b->x1 += last.x;
+			b->y1 += last.y;
+			if (mode == CoordModePrevious)
+				last = *(DDXPointRec *)b;
+
+			if (RegionContainsPoint(&data->region,
+						b->x1, b->y1, NULL)) {
+				b->x1 += data->dx;
+				b->y1 += data->dy;
+				b->x2 = b->x1 + 1;
+				b->y2 = b->y1 + 1;
+				b++;
+			}
+		} while (--nbox);
+		fill.boxes(data->sna, &fill, box, b - box);
+	}
+	fill.done(data->sna, &fill);
+}
+
+static void
 sna_poly_point__fill_clip_extents(DrawablePtr drawable, GCPtr gc,
 				  int mode, int n, DDXPointPtr pt)
 {
@@ -9275,45 +9328,64 @@ sna_poly_arc(DrawablePtr drawable, GCPtr gc, int n, xArc *arc)
 		get_drawable_deltas(drawable, data.pixmap, &data.dx, &data.dy);
 
 		if (gc_is_solid(gc, &color)) {
-			struct sna_fill_op fill;
+			sna_gc(gc)->priv = &data;
 
-			if (!sna_fill_init_blt(&fill,
-					       data.sna, data.pixmap,
-					       data.bo, gc->alu, color))
-				goto fallback;
+			assert(gc->miTranslate);
+			if (gc->lineStyle == LineSolid) {
+				struct sna_fill_op fill;
 
-			data.op = &fill;
-			sna_gc(gc)->priv = &data;
+				if (!sna_fill_init_blt(&fill,
+						       data.sna, data.pixmap,
+						       data.bo, gc->alu, color))
+					goto fallback;
 
-			if ((data.flags & 2) == 0) {
-				if (data.dx | data.dy)
-					sna_gc_ops__tmp.FillSpans = sna_fill_spans__fill_offset;
+				if ((data.flags & 2) == 0) {
+					if (data.dx | data.dy)
+						sna_gc_ops__tmp.FillSpans = sna_fill_spans__fill_offset;
+					else
+						sna_gc_ops__tmp.FillSpans = sna_fill_spans__fill;
+					sna_gc_ops__tmp.PolyPoint = sna_poly_point__fill;
+				} else {
+					region_maybe_clip(&data.region,
+							  gc->pCompositeClip);
+					if (!RegionNotEmpty(&data.region))
+						return;
+
+					if (region_is_singular(&data.region)) {
+						sna_gc_ops__tmp.FillSpans = sna_fill_spans__fill_clip_extents;
+						sna_gc_ops__tmp.PolyPoint = sna_poly_point__fill_clip_extents;
+					} else {
+						sna_gc_ops__tmp.FillSpans = sna_fill_spans__fill_clip_boxes;
+						sna_gc_ops__tmp.PolyPoint = sna_poly_point__fill_clip_boxes;
+					}
+				}
+
+				data.op = &fill;
+				gc->ops = &sna_gc_ops__tmp;
+				if (gc->lineWidth == 0)
+					miZeroPolyArc(drawable, gc, n, arc);
 				else
-					sna_gc_ops__tmp.FillSpans = sna_fill_spans__fill;
-				sna_gc_ops__tmp.PolyPoint = sna_poly_point__fill;
+					miPolyArc(drawable, gc, n, arc);
+				gc->ops = (GCOps *)&sna_gc_ops;
+
+				fill.done(data.sna, &fill);
 			} else {
 				region_maybe_clip(&data.region,
 						  gc->pCompositeClip);
 				if (!RegionNotEmpty(&data.region))
 					return;
 
-				if (region_is_singular(&data.region)) {
-					sna_gc_ops__tmp.FillSpans = sna_fill_spans__fill_clip_extents;
-					sna_gc_ops__tmp.PolyPoint = sna_poly_point__fill_clip_extents;
-				} else {
-					sna_gc_ops__tmp.FillSpans = sna_fill_spans__fill_clip_boxes;
-					sna_gc_ops__tmp.PolyPoint = sna_poly_point__fill_clip_boxes;
-				}
+				sna_gc_ops__tmp.FillSpans = sna_fill_spans__gpu;
+				sna_gc_ops__tmp.PolyPoint = sna_poly_point__gpu;
+
+				gc->ops = &sna_gc_ops__tmp;
+				if (gc->lineWidth == 0)
+					miZeroPolyArc(drawable, gc, n, arc);
+				else
+					miPolyArc(drawable, gc, n, arc);
+				gc->ops = (GCOps *)&sna_gc_ops;
 			}
-			assert(gc->miTranslate);
-			gc->ops = &sna_gc_ops__tmp;
-			if (gc->lineWidth == 0)
-				miZeroPolyArc(drawable, gc, n, arc);
-			else
-				miPolyArc(drawable, gc, n, arc);
-			gc->ops = (GCOps *)&sna_gc_ops;
 
-			fill.done(data.sna, &fill);
 			if (data.damage) {
 				if (data.dx | data.dy)
 					pixman_region_translate(&data.region, data.dx, data.dy);
@@ -13431,7 +13503,7 @@ static const GCOps sna_gc_ops__cpu = {
 	fbPutImage,
 	fbCopyArea,
 	fbCopyPlane,
-	fbPolyPoint,
+	sna_poly_point__cpu,
 	fbPolyLine,
 	fbPolySegment,
 	miPolyRectangle,

commit ed7b8db24921dc0bb6ea59dacf35ea41a61d59bf
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Sep 7 22:12:17 2012 +0100

    sna: Pass the hints down to the PolyPoint fallback
    
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/src/sna/fb/fb.h b/src/sna/fb/fb.h
index 215aec9..adefaa1 100644
--- a/src/sna/fb/fb.h
+++ b/src/sna/fb/fb.h
@@ -515,7 +515,9 @@ extern RegionPtr
 fbBitmapToRegion(PixmapPtr pixmap);
 
 extern void
-fbPolyPoint(DrawablePtr drawable, GCPtr gc, int mode, int n, xPoint *pt);
+fbPolyPoint(DrawablePtr drawable, GCPtr gc,
+	    int mode, int n, xPoint *pt,
+	    unsigned flags);
 
 extern void
 fbPushImage(DrawablePtr drawable, GCPtr gc,
diff --git a/src/sna/fb/fbpoint.c b/src/sna/fb/fbpoint.c
index e3974fc..3df79a2 100644
--- a/src/sna/fb/fbpoint.c
+++ b/src/sna/fb/fbpoint.c
@@ -25,21 +25,27 @@
 #include <micoord.h>
 
 #define DOTS	    fbDots8
+#define DOTS__SIMPLE fbDots8__simple
 #define BITS	    BYTE
 #include "fbpointbits.h"
 #undef BITS
+#undef DOTS__SIMPLE
 #undef DOTS
 
 #define DOTS	    fbDots16
+#define DOTS__SIMPLE fbDots16__simple
 #define BITS	    CARD16
 #include "fbpointbits.h"
 #undef BITS
+#undef DOTS__SIMPLE
 #undef DOTS
 
 #define DOTS	    fbDots32
+#define DOTS__SIMPLE fbDots32__simple
 #define BITS	    CARD32
 #include "fbpointbits.h"
 #undef BITS
+#undef DOTS__SIMPLE
 #undef DOTS
 
 static void
@@ -74,7 +80,7 @@ fbDots(FbBits *dstOrig, FbStride dstStride, int dstBpp,
 
 void
 fbPolyPoint(DrawablePtr drawable, GCPtr gc,
-	    int mode, int n, xPoint *pt)
+	    int mode, int n, xPoint *pt, unsigned flags)
 {
 	FbBits *dst;
 	FbStride dstStride;
@@ -97,16 +103,30 @@ fbPolyPoint(DrawablePtr drawable, GCPtr gc,
 
 	fbGetDrawable(drawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
 	dots = fbDots;
-	switch (dstBpp) {
-	case 8:
-		dots = fbDots8;
-		break;
-	case 16:
-		dots = fbDots16;
-		break;
-	case 32:
-		dots = fbDots32;
-		break;
+	if ((flags & 2) == 0 && fb_gc(gc)->and == 0) {
+		switch (dstBpp) {
+		case 8:
+			dots = fbDots8__simple;
+			break;
+		case 16:
+			dots = fbDots16__simple;
+			break;
+		case 32:
+			dots = fbDots32__simple;
+			break;
+		}
+	} else {
+		switch (dstBpp) {
+		case 8:
+			dots = fbDots8;
+			break;
+		case 16:
+			dots = fbDots16;
+			break;
+		case 32:
+			dots = fbDots32;
+			break;
+		}
 	}
 	dots(dst, dstStride, dstBpp, gc->pCompositeClip, pt, n,
 	     drawable->x, drawable->y, dstXoff, dstYoff,
diff --git a/src/sna/fb/fbpointbits.h b/src/sna/fb/fbpointbits.h
index 2d71c1d..60bf488 100644
--- a/src/sna/fb/fbpointbits.h
+++ b/src/sna/fb/fbpointbits.h
@@ -106,5 +106,43 @@ DOTS(FbBits * dst,
 	}
 }
 
+static void
+DOTS__SIMPLE(FbBits * dst,
+	     FbStride dstStride,
+	     int dstBpp,
+	     RegionPtr region,
+	     xPoint * ptsOrig,
+	     int npt, int xorg, int yorg, int xoff, int yoff,
+	     FbBits and, FbBits xor)
+{
+	uint32_t *pts = (uint32_t *) ptsOrig;
+	BITS *bits = (BITS *) dst, *p;
+	BITS bxor = (BITS) xor;
+	FbStride bitsStride = dstStride * (sizeof(FbBits) / sizeof(BITS));
+
+	bits += bitsStride * (yorg + yoff) + (xorg + xoff);
+	while (npt >= 2) {
+		union {
+			uint32_t pt32[2];
+			uint64_t pt64;
+		} pt;
+		pt.pt64 = *(uint64_t *)pts;
+
+		p = bits + intToY(pt.pt32[0]) * bitsStride + intToX(pt.pt32[0]);
+		WRITE(p, bxor);
+
+		p = bits + intToY(pt.pt32[1]) * bitsStride + intToX(pt.pt32[1]);
+		WRITE(p, bxor);
+
+		pts += 2;
+		npt -= 2;
+	}
+	if (npt) {
+		uint32_t pt = *pts;
+		p = bits + intToY(pt) * bitsStride + intToX(pt);
+		WRITE(p, bxor);
+	}
+}
+
 #undef RROP
 #undef isClipped
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 792d007..9881050 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -6696,7 +6696,7 @@ fallback:
 		goto out_gc;
 
 	DBG(("%s: fbPolyPoint\n", __FUNCTION__));
-	fbPolyPoint(drawable, gc, mode, n, pt);
+	fbPolyPoint(drawable, gc, mode, n, pt, flags);
 	FALLBACK_FLUSH(drawable);
 out_gc:
 	sna_gc_move_to_gpu(gc);

commit 6c9df48fa8f1ac93103ce771ae28f47faa321619
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Sep 7 22:05:19 2012 +0100

    sna: Fix PolyPoint fallback through a complex clip
    
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/src/sna/fb/fbpoint.c b/src/sna/fb/fbpoint.c
index d3f796e..e3974fc 100644
--- a/src/sna/fb/fbpoint.c
+++ b/src/sna/fb/fbpoint.c
@@ -26,26 +26,19 @@
 
 #define DOTS	    fbDots8
 #define BITS	    BYTE
-#define BITS2	    CARD16
-#define BITS4	    CARD32
 #include "fbpointbits.h"
 #undef BITS
-#undef BITS2
-#undef BITS4
 #undef DOTS
 
 #define DOTS	    fbDots16
 #define BITS	    CARD16
-#define BITS2	    CARD32
 #include "fbpointbits.h"
 #undef BITS
-#undef BITS2
 #undef DOTS
 
 #define DOTS	    fbDots32
 #define BITS	    CARD32
 #include "fbpointbits.h"
-#undef ARC
 #undef BITS
 #undef DOTS
 
@@ -93,16 +86,16 @@ fbPolyPoint(DrawablePtr drawable, GCPtr gc,
 		     int xorg, int yorg,
 		     int xoff, int yoff,
 		     FbBits and, FbBits xor);
-	FbBits and, xor;
 
-	DBG(("%s x %d\n", __FUNCTION__, n));
+	DBG(("%s x %d, clip=[(%d, %d), (%d, %d)]x%d\n", __FUNCTION__, n,
+	     gc->pCompositeClip->extents.x1, gc->pCompositeClip->extents.y1,
+	     gc->pCompositeClip->extents.x2, gc->pCompositeClip->extents.y2,
+	     RegionNumRects(gc->pCompositeClip)));
 
 	if (mode == CoordModePrevious)
 		fbFixCoordModePrevious(n, pt);
 
 	fbGetDrawable(drawable, dst, dstStride, dstBpp, dstXoff, dstYoff);
-	and = fb_gc(gc)->and;
-	xor = fb_gc(gc)->xor;
 	dots = fbDots;
 	switch (dstBpp) {
 	case 8:
@@ -116,5 +109,6 @@ fbPolyPoint(DrawablePtr drawable, GCPtr gc,
 		break;
 	}
 	dots(dst, dstStride, dstBpp, gc->pCompositeClip, pt, n,
-	     drawable->x, drawable->y, dstXoff, dstYoff, and, xor);
+	     drawable->x, drawable->y, dstXoff, dstYoff,
+	     fb_gc(gc)->and, fb_gc(gc)->xor);
 }
diff --git a/src/sna/fb/fbpointbits.h b/src/sna/fb/fbpointbits.h
index 40a25c6..2d71c1d 100644
--- a/src/sna/fb/fbpointbits.h
+++ b/src/sna/fb/fbpointbits.h
@@ -38,14 +38,13 @@ DOTS(FbBits * dst,
 	BITS band = (BITS) and;
 	FbStride bitsStride = dstStride * (sizeof(FbBits) / sizeof(BITS));
 
-	bits += bitsStride * (yorg + yoff) + (xorg + xoff);
-
 	if (region->data == NULL) {
 		INT32 ul = coordToInt(region->extents.x1 - xorg,
 				      region->extents.y1 - yorg);
 		INT32 lr = coordToInt(region->extents.x2 - xorg - 1,
 				      region->extents.y2 - yorg - 1);
 
+		bits += bitsStride * (yorg + yoff) + (xorg + xoff);
 		if (and == 0) {
 			while (npt >= 2) {
 				union {
@@ -82,23 +81,24 @@ DOTS(FbBits * dst,
 			}
 		}
 	} else {
+		bits += bitsStride * yoff + xoff;
 		if (and == 0) {
 			while (npt--) {
 				uint32_t pt = *pts++;
-				if (RegionContainsPoint(region,
-							intToX(pt), intToY(pt),
-							NULL)) {
-					BITS *point = bits + intToY(pt) * bitsStride + intToX(pt);
+				int x = intToX(pt) + xorg;
+				int y = intToY(pt) + yorg;
+				if (RegionContainsPoint(region, x, y, NULL)) {
+					BITS *point = bits + y * bitsStride + x;
 					WRITE(point, bxor);
 				}
 			}
 		} else {
 			while (npt--) {
 				uint32_t pt = *pts++;
-				if (RegionContainsPoint(region,
-							intToX(pt), intToY(pt),
-							NULL)) {
-					BITS *point = bits + intToY(pt) * bitsStride + intToX(pt);
+				int x = intToX(pt) + xorg;
+				int y = intToY(pt) + yorg;
+				if (RegionContainsPoint(region, x, y, NULL)) {
+					BITS *point = bits + y * bitsStride + x;
 					RROP(point, band, bxor);
 				}
 			}

commit 7d76eb155ed78343abfa15b7c8af87fc3d4211e4
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Sep 7 18:06:25 2012 +0100

    sna: First scan for a backlight associated with the device
    
    The goal is to find the right interface in a multi-GPU system.
    
    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 beafb3b..be5d983 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -318,8 +318,84 @@ has_user_backlight_override(xf86OutputPtr output)
 	return str;
 }
 
-static void
-sna_output_backlight_init(xf86OutputPtr output)
+static char *
+has_device_backlight(xf86OutputPtr output, int *best_type)
+{
+	struct sna_output *sna_output = output->driver_private;
+	struct sna *sna = to_sna(output->scrn);
+	struct pci_device *pci = sna->PciInfo;
+	char path[1024];
+	char *best_iface = NULL;
+	DIR *dir;
+	struct dirent *de;
+
+	snprintf(path, sizeof(path),
+		 "/sys/bus/pci/devices/%04x:%02x:%02x.%d/backlight",
+		 pci->domain, pci->bus, pci->dev, pci->func);
+
+	DBG(("%s: scanning %s\n", __FUNCTION__, path));
+	dir = opendir(path);
+	if (dir == NULL)
+		return NULL;
+
+	while ((de = readdir(dir))) {
+		char buf[100];
+		int fd, v;
+
+		if (*de->d_name == '.')
+			continue;
+
+		DBG(("%s: %s\n", __FUNCTION__, de->d_name));
+		snprintf(path, sizeof(path), "%s/%s/type",
+			 BACKLIGHT_CLASS, de->d_name);
+
+		v = -1;
+		fd = open(path, O_RDONLY);
+		if (fd >= 0) {
+			v = read(fd, buf, sizeof(buf)-1);
+			close(fd);
+		}
+		if (v > 0) {
+			while (v > 0 && isspace(buf[v-1]))
+				v--;
+			buf[v] = '\0';
+
+			if (strcmp(buf, "raw") == 0)
+				v = RAW;
+			else if (strcmp(buf, "platform") == 0)
+				v = PLATFORM;
+			else if (strcmp(buf, "firmware") == 0)
+				v = FIRMWARE;
+			else
+				v = INT_MAX;
+		} else
+			v = INT_MAX;
+
+		if (v < *best_type) {
+			char *copy;
+			int max;
+
+			sna_output->backlight_iface = de->d_name;
+			max = sna_output_backlight_get_max(output);
+			sna_output->backlight_iface = NULL;
+			if (max <= 0)
+				continue;
+
+			copy = strdup(de->d_name);
+			if (copy) {
+				free(best_iface);
+				best_iface = copy;
+				*best_type = v;
+			}
+		}
+	}
+	closedir(dir);
+
+	return best_iface;
+}
+
+static char *
+has_backlight(xf86OutputPtr output, int *best_type)
 {
 	static const char *known_interfaces[] = {
 		"gmux_backlight",
@@ -335,21 +411,14 @@ sna_output_backlight_init(xf86OutputPtr output)
 		"acpi_video0",
 		"intel_backlight",
 	};
-	MessageType from = X_PROBED;
 	struct sna_output *sna_output = output->driver_private;
-	char *best_iface;
-	int best_type;
+	char *best_iface = NULL;
 	DIR *dir;
 	struct dirent *de;
 
-	best_type = INT_MAX;
-	best_iface = has_user_backlight_override(output);
-	if (best_iface)
-		goto skip;
-
 	dir = opendir(BACKLIGHT_CLASS);
 	if (dir == NULL)
-		return;
+		return NULL;
 
 	while ((de = readdir(dir))) {
 		char path[1024];
@@ -394,7 +463,7 @@ sna_output_backlight_init(xf86OutputPtr output)
 			v += i;
 		}
 
-		if (v < best_type) {
+		if (v < *best_type) {
 			char *copy;
 			int max;
 
@@ -410,16 +479,39 @@ sna_output_backlight_init(xf86OutputPtr output)
 			if (copy) {
 				free(best_iface);
 				best_iface = copy;
-				best_type = v;
+				*best_type = v;
 			}
 		}
 	}
 	closedir(dir);
 
-	if (!best_iface)
-		return;
+	return best_iface;
+}
+
+static void
+sna_output_backlight_init(xf86OutputPtr output)
+{
+	struct sna_output *sna_output = output->driver_private;
+	MessageType from = X_PROBED;
+	char *best_iface;
+	int best_type;
 
-skip:
+	best_type = INT_MAX;
+	best_iface = has_user_backlight_override(output);
+	if (best_iface)
+		goto done;
+
+	best_iface = has_device_backlight(output, &best_type);
+	if (best_iface)
+		goto done;
+
+	best_iface = has_backlight(output, &best_type);
+	if (best_iface)
+		goto done;
+
+	return;
+
+done:
 	sna_output->backlight_iface = best_iface;
 	sna_output->backlight_max = sna_output_backlight_get_max(output);
 	sna_output->backlight_active_level = sna_output_backlight_get(output);
@@ -435,7 +527,6 @@ skip:
 		   sna_output->backlight_iface, best_iface);
 }
 
-
 static void
 mode_from_kmode(ScrnInfoPtr scrn,
 		drmModeModeInfoPtr kmode,

commit 2de7d2d8150d648815feb74a3ae2239b908b971e
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Sep 7 16:56:33 2012 +0100

    sna/prime: Fixup attaching the randr14 scanout pixmap
    
    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 6baa37c..792d007 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1020,7 +1020,11 @@ sna_set_shared_pixmap_backing(PixmapPtr pixmap, void *fd_handle)
 	struct sna_pixmap *priv;
 	struct kgem_bo *bo;
 
-	DBG(("%s: pixmap=%ld\n", __FUNCTION__, pixmap->drawable.serialNumber));
+	DBG(("%s: pixmap=%ld, size=%dx%d, depth=%d/%d, stride=%d\n",
+	     __FUNCTION__, pixmap->drawable.serialNumber,
+	     pixmap->drawable.width, pixmap->drawable.height,
+	     pixmap->drawable.depth, pixmap->drawable.bitsPerPixel,
+	     pixmap->devKind));
 
 	priv = sna_pixmap(pixmap);
 	if (priv == NULL)
@@ -13691,6 +13695,9 @@ static struct sna_pixmap *sna_accel_scanout(struct sna *sna)
 	if (sna->vblank_interval == 0)
 		return NULL;
 
+	if (sna->front == NULL)
+		return NULL;
+
 	priv = sna_pixmap(sna->front);
 	return priv && priv->gpu_bo ? priv : NULL;
 }
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index ff24ed3..beafb3b 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -569,7 +569,6 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 	arg.crtc_id = sna_crtc->id;
 	arg.fb_id = fb_id(sna_crtc->bo);
 	if (sna_crtc->transform) {
-		assert(sna_crtc->shadow);
 		arg.x = 0;
 		arg.y = 0;
 	} else {
@@ -714,6 +713,9 @@ static void update_flush_interval(struct sna *sna)
 			continue;
 		}
 
+		DBG(("%s: CRTC:%d (pipe %d) vrefresh=%d\n",
+		     __FUNCTION__,i, to_sna_crtc(crtc)->pipe,
+		     xf86ModeVRefresh(&crtc->mode)));
 		max_vrefresh = max(max_vrefresh, xf86ModeVRefresh(&crtc->mode));
 	}
 
@@ -942,7 +944,21 @@ static struct kgem_bo *sna_crtc_attach(xf86CrtcPtr crtc)
 	struct kgem_bo *bo;
 
 	sna_crtc->transform = false;
-	if (use_shadow(sna, crtc)) {
+	if (sna_crtc->scanout_pixmap) {
+		DBG(("%s: attaching to scanout pixmap\n", __FUNCTION__));
+
+		bo = sna_pixmap_pin(sna_crtc->scanout_pixmap, PIN_SCANOUT);
+		if (bo == NULL)
+			return NULL;
+
+		if (!get_fb(sna, bo,
+			    sna_crtc->scanout_pixmap->drawable.width,
+			    sna_crtc->scanout_pixmap->drawable.height))
+			return NULL;
+
+		sna_crtc->transform = true;
+		return kgem_bo_reference(bo);
+	} else if (use_shadow(sna, crtc)) {
 		if (!sna_crtc_enable_shadow(sna, sna_crtc))
 			return NULL;
 
@@ -963,22 +979,6 @@ static struct kgem_bo *sna_crtc_attach(xf86CrtcPtr crtc)
 
 		sna_crtc->transform = true;
 		return bo;
-	} else if (sna_crtc->scanout_pixmap) {
-		DBG(("%s: attaching to scanout pixmap\n", __FUNCTION__));
-		if (!sna_crtc_enable_shadow(sna, sna_crtc))
-			return NULL;
-
-		bo = sna_pixmap_pin(sna_crtc->scanout_pixmap, PIN_SCANOUT);
-		if (bo == NULL)
-			return NULL;
-
-		if (!get_fb(sna, bo,
-			    sna_crtc->scanout_pixmap->drawable.width,
-			    sna_crtc->scanout_pixmap->drawable.height))
-			return NULL;
-
-		sna_crtc->transform = true;
-		return kgem_bo_reference(bo);
 	} else if (sna->flags & SNA_TEAR_FREE) {
 		DBG(("%s: tear-free updates requested\n", __FUNCTION__));
 

commit 448808d8a4e78afa7fe90e318d6d7afdbff66190
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Sep 7 14:31:52 2012 +0100

    prime: Allocate a GPU_SCREEN when not primary to fulfil the output sink role
    
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/src/intel_module.c b/src/intel_module.c
index a5d071b..b4f0ad2 100644
--- a/src/intel_module.c
+++ b/src/intel_module.c
@@ -538,14 +538,22 @@ intel_platform_probe(DriverPtr driver,
 {
 	ScrnInfoPtr scrn = NULL;
 	char *path = xf86_get_platform_device_attrib(dev, ODEV_ATTRIB_PATH);
+	unsigned scrn_flags = 0;
 
 	if (!dev->pdev)
 		return FALSE;
+
+	/* Allow ourselves to act as a slaved output if not primary */
+	if (flags & PLATFORM_PROBE_GPU_SCREEN) {
+		flags &= ~PLATFORM_PROBE_GPU_SCREEN;
+		scrn_flags |= XF86_ALLOCATE_GPU_SCREEN;
+	}
+
 	/* if we get any flags we don't understand fail to probe for now */
 	if (flags)
 		return FALSE;
 
-	scrn = xf86AllocateScreen(driver, 0);
+	scrn = xf86AllocateScreen(driver, scrn_flags);
 	if (scrn == NULL)
 		return FALSE;
 

commit 3dce661ef3df5558fe9c9d85324ab3395a37b7ea
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Sep 7 13:48:12 2012 +0100

    sna: And remember to update the ScreenPixmap after resize
    
    Fixes the regression from the previous commit
    
    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 f69ca97..ff24ed3 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -2178,19 +2178,6 @@ sna_visit_set_window_pixmap(WindowPtr window, pointer data)
     return WT_DONTWALKCHILDREN;
 }
 
-static void
-sna_redirect_screen_pixmap(ScrnInfoPtr scrn, PixmapPtr old, PixmapPtr new)
-{
-	ScreenPtr screen = scrn->pScreen;
-	struct sna_visit_set_pixmap_window visit;
-
-	visit.old = old;
-	visit.new = new;
-	TraverseTree(screen->root, sna_visit_set_window_pixmap, &visit);
-
-	screen->SetScreenPixmap(new);
-}
-
 static void copy_front(struct sna *sna, PixmapPtr old, PixmapPtr new)
 {
 	struct sna_pixmap *old_priv, *new_priv;
@@ -2263,6 +2250,7 @@ sna_crtc_resize(ScrnInfoPtr scrn, int width, int height)
 {
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
 	struct sna *sna = to_sna(scrn);
+	ScreenPtr screen = scrn->pScreen;
 	PixmapPtr old_front, new_front;
 	int i;
 
@@ -2274,16 +2262,15 @@ sna_crtc_resize(ScrnInfoPtr scrn, int width, int height)
 		return TRUE;
 
 	assert(sna->front);
-	assert(scrn->pScreen->GetScreenPixmap(scrn->pScreen) == sna->front);
+	assert(screen->GetScreenPixmap(screen) == sna->front);
 
 	DBG(("%s: creating new framebuffer %dx%d\n",
 	     __FUNCTION__, width, height));
 
 	old_front = sna->front;
-	new_front = scrn->pScreen->CreatePixmap(scrn->pScreen,
-						width, height,
-						scrn->depth,
-						SNA_CREATE_FB);
+	new_front = screen->CreatePixmap(screen,
+					 width, height, scrn->depth,
+					 SNA_CREATE_FB);
 	if (!new_front)
 		return FALSE;
 
@@ -2312,13 +2299,18 @@ sna_crtc_resize(ScrnInfoPtr scrn, int width, int height)
 			sna_crtc_disable(crtc);
 	}
 
-	if (scrn->pScreen->root) {
-		sna_redirect_screen_pixmap(scrn, old_front, sna->front);
-		assert(scrn->pScreen->GetScreenPixmap(scrn->pScreen) == sna->front);
-		assert(scrn->pScreen->GetWindowPixmap(scrn->pScreen->root) == sna->front);
+	if (screen->root) {
+		struct sna_visit_set_pixmap_window visit;
+
+		visit.old = old_front;
+		visit.new = sna->front;
+		TraverseTree(screen->root, sna_visit_set_window_pixmap, &visit);
+		assert(screen->GetWindowPixmap(screen->root) == sna->front);
 	}
+	screen->SetScreenPixmap(sna->front);
+	assert(screen->GetScreenPixmap(screen) == sna->front);
 
-	scrn->pScreen->DestroyPixmap(old_front);
+	screen->DestroyPixmap(old_front);
 
 	return TRUE;
 }

commit 0c39c363d7235d03f27337c731c0ffe3369bf713
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Sep 7 13:07:52 2012 +0100

    sna: Protect sna_crtc_resize() against early invocation with no RootWindow
    
    If the outputs are resized very early on, in CreateScreenResources, then
    we will not yet have created a RootWindow and so trying to change its
    pixmap is a futile effort.
    
    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 bde296d..f69ca97 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -2266,24 +2266,24 @@ sna_crtc_resize(ScrnInfoPtr scrn, int width, int height)
 	PixmapPtr old_front, new_front;
 	int i;
 
-	DBG(("%s (%d, %d) -> (%d, %d)\n",
-	     __FUNCTION__,
+	DBG(("%s (%d, %d) -> (%d, %d)\n", __FUNCTION__,
 	     scrn->virtualX, scrn->virtualY,
 	     width, height));


Reply to: