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: