xf86-video-intel: 3 commits - src/sna/blt.c src/sna/sna_accel.c src/sna/sna_damage.c src/sna/sna_display.c src/sna/sna.h

Chris Wilson ickle at kemper.freedesktop.org
Thu Jun 14 09:11:46 PDT 2012


 src/sna/blt.c         |  170 ++++++++++++++++++++++++++++++++++++++++++++++++++
 src/sna/sna.h         |   12 ++-
 src/sna/sna_accel.c   |    8 --
 src/sna/sna_damage.c  |   15 +++-
 src/sna/sna_display.c |  157 ++++++++++++++++------------------------------
 5 files changed, 249 insertions(+), 113 deletions(-)

New commits:
commit b415ca05c2e1c4f09f85d8769d39e5369661ed3a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jun 14 17:06:19 2012 +0100

    sna: Reset damage extents after reduction goes to zero
    
    If the reduction of the damage clears all of the boxes, we need to reset
    the -infinite extents so that we continue to accumulate further damage.
    
    Reported-by: Zdenek Kabelac <zdenek.kabelac at gmail.com>
    References: https://bugs.freedesktop.org/show_bug.cgi?id=50744
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_damage.c b/src/sna/sna_damage.c
index 6149be7..bdd6a5e 100644
--- a/src/sna/sna_damage.c
+++ b/src/sna/sna_damage.c
@@ -164,6 +164,12 @@ reset_embedded_box(struct sna_damage *damage)
 	list_init(&damage->embedded_box.list);
 }
 
+static void reset_extents(struct sna_damage *damage)
+{
+	damage->extents.x1 = damage->extents.y1 = MAXSHORT;
+	damage->extents.x2 = damage->extents.y2 = MINSHORT;
+}
+
 static struct sna_damage *_sna_damage_create(void)
 {
 	struct sna_damage *damage;
@@ -179,8 +185,7 @@ static struct sna_damage *_sna_damage_create(void)
 	reset_embedded_box(damage);
 	damage->mode = DAMAGE_ADD;
 	pixman_region_init(&damage->region);
-	damage->extents.x1 = damage->extents.y1 = MAXSHORT;
-	damage->extents.x2 = damage->extents.y2 = MINSHORT;
+	reset_extents(damage);
 
 	return damage;
 }
@@ -498,6 +503,7 @@ static void __sna_damage_reduce(struct sna_damage *damage)
 		pixman_region_fini(region);
 		pixman_region_init_rects(region, boxes, nboxes);
 
+		assert(!pixman_region_not_empty(region));
 		assert(damage->extents.x1 == region->extents.x1 &&
 		       damage->extents.y1 == region->extents.y1 &&
 		       damage->extents.x2 == region->extents.x2 &&
@@ -513,7 +519,10 @@ static void __sna_damage_reduce(struct sna_damage *damage)
 		       damage->extents.y1 <= region->extents.y1 &&
 		       damage->extents.x2 >= region->extents.x2 &&
 		       damage->extents.y2 >= region->extents.y2);
-		damage->extents = region->extents;
+		if (pixman_region_not_empty(region))
+			damage->extents = region->extents;
+		else
+			reset_extents(damage);
 	}
 
 	free(free_boxes);
commit 0df7c488640d3590d2a88dc353b72167b6644eaa
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jun 14 16:09:38 2012 +0100

    sna: Supporting overlapping copies for fallback blits
    
    Reported-by: Zdenek Kabelac <zkabelac at redhat.com>
    References: https://bugs.freedesktop.org/show_bug.cgi?id=50393
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/blt.c b/src/sna/blt.c
index 494b413..99bdece 100644
--- a/src/sna/blt.c
+++ b/src/sna/blt.c
@@ -217,6 +217,176 @@ memcpy_blt(const void *src, void *dst, int bpp,
 }
 
 void
+memmove_blt(const void *src, void *dst, int bpp,
+	    int32_t src_stride, int32_t dst_stride,
+	    int16_t src_x, int16_t src_y,
+	    int16_t dst_x, int16_t dst_y,
+	    uint16_t width, uint16_t height)
+{
+	const uint8_t *src_bytes;
+	uint8_t *dst_bytes;
+	int byte_width;
+
+	assert(src);
+	assert(dst);
+	assert(width && height);
+	assert(bpp >= 8);
+
+	DBG(("%s: src=(%d, %d), dst=(%d, %d), size=%dx%d, pitch=%d/%d\n",
+	     __FUNCTION__, src_x, src_y, dst_x, dst_y, width, height, src_stride, dst_stride));
+
+	bpp /= 8;
+
+	src_bytes = (const uint8_t *)src + src_stride * src_y + src_x * bpp;
+	dst_bytes = (uint8_t *)dst + dst_stride * dst_y + dst_x * bpp;
+
+	byte_width = width * bpp;
+	if (byte_width == src_stride && byte_width == dst_stride) {
+		byte_width *= height;
+		height = 1;
+	}
+
+	switch (byte_width) {
+	case 1:
+		do {
+			*dst_bytes = *src_bytes;
+			src_bytes += src_stride;
+			dst_bytes += dst_stride;
+		} while (--height);
+		break;
+
+	case 2:
+		do {
+			*(uint16_t *)dst_bytes = *(const uint16_t *)src_bytes;
+			src_bytes += src_stride;
+			dst_bytes += dst_stride;
+		} while (--height);
+		break;
+
+	case 4:
+		do {
+			*(uint32_t *)dst_bytes = *(const uint32_t *)src_bytes;
+			src_bytes += src_stride;
+			dst_bytes += dst_stride;
+		} while (--height);
+		break;
+
+	case 8:
+		do {
+			*(uint64_t *)dst_bytes = *(const uint64_t *)src_bytes;
+			src_bytes += src_stride;
+			dst_bytes += dst_stride;
+		} while (--height);
+		break;
+
+	default:
+		if (src_stride == dst_stride) {
+			if (dst_bytes < src_bytes + byte_width &&
+			    src_bytes < dst_bytes + byte_width) {
+				do {
+					memmove(dst_bytes, src_bytes, byte_width);
+					src_bytes += src_stride;
+					dst_bytes += src_stride;
+				} while (--height);
+			} else {
+				do {
+					memcpy(dst_bytes, src_bytes, byte_width);
+					src_bytes += src_stride;
+					dst_bytes += src_stride;
+				} while (--height);
+			}
+		} else do {
+			memmove(dst_bytes, src_bytes, byte_width);
+			src_bytes += src_stride;
+			dst_bytes += dst_stride;
+		} while (--height);
+		break;
+	}
+}
+
+void
+memmove_blt__box(const void *src, void *dst,
+		 int bpp, int32_t stride,
+		 const BoxRec *box)
+{
+	const uint8_t *src_bytes;
+	uint8_t *dst_bytes;
+	int width, height;
+
+	assert(src);
+	assert(dst);
+	assert(bpp >= 8);
+	assert(box->x2 > box->x1);
+	assert(box->y2 > box->y1);
+
+	DBG(("%s: box=(%d, %d), (%d, %d), pitch=%d, bpp=%d\n",
+	     __FUNCTION__, box->x1, box->y1, box->x2, box->y2, stride, bpp));
+
+	bpp /= 8;
+	width = box->y1 * stride + box->x1 * bpp;
+	src_bytes = (const uint8_t *)src + width;
+	dst_bytes = (uint8_t *)dst + width;
+
+	width = (box->x2 - box->x1) * bpp;
+	height = (box->y2 - box->y1);
+	if (width == stride) {
+		width *= height;
+		height = 1;
+	}
+
+	switch (width) {
+	case 1:
+		do {
+			*dst_bytes = *src_bytes;
+			src_bytes += stride;
+			dst_bytes += stride;
+		} while (--height);
+		break;
+
+	case 2:
+		do {
+			*(uint16_t *)dst_bytes = *(const uint16_t *)src_bytes;
+			src_bytes += stride;
+			dst_bytes += stride;
+		} while (--height);
+		break;
+
+	case 4:
+		do {
+			*(uint32_t *)dst_bytes = *(const uint32_t *)src_bytes;
+			src_bytes += stride;
+			dst_bytes += stride;
+		} while (--height);
+		break;
+
+	case 8:
+		do {
+			*(uint64_t *)dst_bytes = *(const uint64_t *)src_bytes;
+			src_bytes += stride;
+			dst_bytes += stride;
+		} while (--height);
+		break;
+
+	default:
+		if (dst_bytes < src_bytes + width &&
+		    src_bytes < dst_bytes + width) {
+			do {
+				memmove(dst_bytes, src_bytes, width);
+				src_bytes += stride;
+				dst_bytes += stride;
+			} while (--height);
+		} else {
+			do {
+				memcpy(dst_bytes, src_bytes, width);
+				src_bytes += stride;
+				dst_bytes += stride;
+			} while (--height);
+		}
+		break;
+	}
+}
+
+void
 memcpy_xor(const void *src, void *dst, int bpp,
 	   int32_t src_stride, int32_t dst_stride,
 	   int16_t src_x, int16_t src_y,
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 634692c..ce06e4d 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -671,6 +671,16 @@ memcpy_blt(const void *src, void *dst, int bpp,
 	   int16_t src_x, int16_t src_y,
 	   int16_t dst_x, int16_t dst_y,
 	   uint16_t width, uint16_t height);
+void
+memmove_blt(const void *src, void *dst, int bpp,
+	    int32_t src_stride, int32_t dst_stride,
+	    int16_t src_x, int16_t src_y,
+	    int16_t dst_x, int16_t dst_y,
+	    uint16_t width, uint16_t height);
+void
+memmove_blt__box(const void *src, void *dst,
+		 int bpp, int32_t stride,
+		 const BoxRec *box);
 
 void
 memcpy_xor(const void *src, void *dst, int bpp,
diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 6c48db8..a44cdb1 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -3498,12 +3498,8 @@ fallback:
 				 dy * stride + dx * bpp / 8);
 
 			do {
-				memcpy_blt(src_bits, dst_bits, bpp,
-					   stride, stride,
-					   box->x1, box->y1,
-					   box->x1, box->y1,
-					   box->x2 - box->x1,
-					   box->y2 - box->y1);
+				memmove_blt__box(src_bits, dst_bits,
+						 bpp, stride, box);
 				box++;
 			} while (--n);
 		} else {
commit d5b273b20b7d917d08af120815c28b1618d3342c
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Jun 14 15:35:24 2012 +0100

    sna: Explicitly disable the CRTC so that xserver/kernel agree after VT switch
    
    References: https://bugs.freedesktop.org/show_bug.cgi?id=50772
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna.h b/src/sna/sna.h
index 9453c20..634692c 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -316,8 +316,6 @@ extern int sna_page_flip(struct sna *sna,
 			 int ref_crtc_hw_id,
 			 uint32_t *old_fb);
 
-extern PixmapPtr sna_set_screen_pixmap(struct sna *sna, PixmapPtr pixmap);
-
 constant static inline struct sna *
 to_sna(ScrnInfoPtr scrn)
 {
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index a51abb5..a198b5c 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -95,8 +95,10 @@ struct sna_output {
 	struct list link;
 };
 
-static void
-sna_output_dpms(xf86OutputPtr output, int mode);
+static inline struct sna_crtc *to_sna_crtc(xf86CrtcPtr crtc)
+{
+	return crtc->driver_private;
+}
 
 #define BACKLIGHT_CLASS "/sys/class/backlight"
 
@@ -132,24 +134,23 @@ crtc_id(struct sna_crtc *crtc)
 
 int sna_crtc_id(xf86CrtcPtr crtc)
 {
-	return crtc_id(crtc->driver_private);
+	return to_sna_crtc(crtc)->id;
 }
 
 int sna_crtc_on(xf86CrtcPtr crtc)
 {
-	struct sna_crtc *sna_crtc = crtc->driver_private;
-	return sna_crtc->active;
+	return to_sna_crtc(crtc)->active;
 }
 
 int sna_crtc_to_pipe(xf86CrtcPtr crtc)
 {
-	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 	return sna_crtc->pipe;
 }
 
 int sna_crtc_to_plane(xf86CrtcPtr crtc)
 {
-	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 	return sna_crtc->plane;
 }
 
@@ -399,7 +400,7 @@ bool sna_crtc_is_bound(struct sna *sna, xf86CrtcPtr crtc)
 	struct drm_mode_crtc mode;
 
 	VG_CLEAR(mode);
-	mode.crtc_id = crtc_id(crtc->driver_private);
+	mode.crtc_id = to_sna_crtc(crtc)->id;
 	if (drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_GETCRTC, &mode))
 		return false;
 
@@ -412,7 +413,7 @@ static Bool
 sna_crtc_apply(xf86CrtcPtr crtc)
 {
 	struct sna *sna = to_sna(crtc->scrn);
-	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
 	struct sna_mode *mode = &sna->mode;
 	struct drm_mode_crtc arg;
@@ -459,10 +460,10 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 		   "switch to mode %dx%d on crtc %d (pipe %d)\n",
 		   sna_crtc->kmode.hdisplay,
 		   sna_crtc->kmode.vdisplay,
-		   crtc_id(sna_crtc), sna_crtc->pipe);
+		   sna_crtc->id, sna_crtc->pipe);
 
 	DBG(("%s: applying crtc [%d] mode=%dx%d@%d, fb=%d%s update to %d outputs\n",
-	     __FUNCTION__, crtc_id(sna_crtc),
+	     __FUNCTION__, sna_crtc->id,
 	     sna_crtc->kmode.hdisplay,
 	     sna_crtc->kmode.vdisplay,
 	     sna_crtc->kmode.clock,
@@ -493,65 +494,30 @@ sna_crtc_apply(xf86CrtcPtr crtc)
 }
 
 static void
-sna_crtc_restore(ScrnInfoPtr scrn)
+sna_crtc_disable(xf86CrtcPtr crtc)
 {
-	struct sna *sna = to_sna(scrn);
-	xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-	struct kgem_bo *bo;
-	int i;
-
-	DBG(("%s (fb_pixmap=%ld, front=%ld)\n", __FUNCTION__,
-	     (long)sna->mode.fb_pixmap,
-	     (long)sna->front->drawable.serialNumber));
-
-	if (sna->mode.fb_pixmap == sna->front->drawable.serialNumber)
-		return;
-
-	bo = sna_pixmap_pin(sna->front);
-	if (!bo)
-		return;
-
-	DBG(("%s: create fb %dx%d@%d/%d\n",
-	     __FUNCTION__,
-	     sna->front->drawable.width,
-	     sna->front->drawable.height,
-	     sna->front->drawable.depth,
-	     sna->front->drawable.bitsPerPixel));
-
-	sna_mode_remove_fb(sna);
-	sna->mode.fb_id = get_fb(sna, bo,
-				 sna->front->drawable.width,
-				 sna->front->drawable.height);
-	if (sna->mode.fb_id == 0)
-		return;
+	struct sna *sna = to_sna(crtc->scrn);
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
+	struct drm_mode_crtc arg;
 
-	DBG(("%s: handle %d attached to fb %d\n",
-	     __FUNCTION__, bo->handle, sna->mode.fb_id));
+	DBG(("%s: disabling crtc [%d]\n", __FUNCTION__, sna_crtc->id));
 
-	for (i = 0; i < xf86_config->num_crtc; i++) {
-		xf86CrtcPtr crtc = xf86_config->crtc[i];
-		if (crtc->enabled)
-			sna_crtc_apply(crtc);
-	}
-	sna_mode_update(sna);
-
-	kgem_bo_retire(&sna->kgem, bo);
-	scrn->displayWidth = bo->pitch / sna->mode.cpp;
-	sna->mode.fb_pixmap = sna->front->drawable.serialNumber;
+	VG_CLEAR(arg);
+	arg.crtc_id = sna_crtc->id;
+	arg.fb_id = 0;
+	arg.mode_valid = 0;
+	(void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_SETCRTC, &arg);
+	sna_crtc->active = false;
 }
 
 static void
 sna_crtc_dpms(xf86CrtcPtr crtc, int mode)
 {
-	struct sna_crtc *sna_crtc = crtc->driver_private;
-
 	DBG(("%s(pipe %d, dpms mode -> %d):= active=%d\n",
-	     __FUNCTION__, sna_crtc->pipe, mode, mode == DPMSModeOn));
+	     __FUNCTION__, to_sna_crtc(crtc)->pipe, mode, mode == DPMSModeOn));
 
-	if (mode != DPMSModeOff)
-		sna_crtc_restore(crtc->scrn);
-	else
-		sna_crtc->active = false;
+	if (mode == DPMSModeOff)
+		sna_crtc_disable(crtc);
 }
 
 static struct kgem_bo *sna_create_bo_for_fbcon(struct sna *sna,
@@ -604,7 +570,7 @@ void sna_copy_fbcon(struct sna *sna)
 	VG_CLEAR(fbcon);
 	fbcon.fb_id = 0;
 	for (i = 0; i < xf86_config->num_crtc; i++) {
-		struct sna_crtc *crtc = xf86_config->crtc[i]->driver_private;
+		struct sna_crtc *crtc = to_sna_crtc(xf86_config->crtc[i]);
 		struct drm_mode_crtc mode;
 
 		VG_CLEAR(mode);
@@ -704,7 +670,7 @@ sna_crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 {
 	ScrnInfoPtr scrn = crtc->scrn;
 	struct sna *sna = to_sna(scrn);
-	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 	struct sna_mode *sna_mode = &sna->mode;
 	int saved_x, saved_y;
 	Rotation saved_rotation;
@@ -779,10 +745,10 @@ static void
 sna_crtc_hide_cursor(xf86CrtcPtr crtc)
 {
 	struct sna *sna = to_sna(crtc->scrn);
-	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 	struct drm_mode_cursor arg;
 
-	__DBG(("%s: CRTC:%d\n", __FUNCTION__, crtc_id(sna_crtc)));
+	__DBG(("%s: CRTC:%d\n", __FUNCTION__, sna_crtc->id));
 
 	VG_CLEAR(arg);
 	arg.flags = DRM_MODE_CURSOR_BO;
@@ -790,17 +756,17 @@ sna_crtc_hide_cursor(xf86CrtcPtr crtc)
 	arg.width = arg.height = 64;
 	arg.handle = 0;
 
-	drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
+	(void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
 }
 
 static void
 sna_crtc_show_cursor(xf86CrtcPtr crtc)
 {
 	struct sna *sna = to_sna(crtc->scrn);
-	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 	struct drm_mode_cursor arg;
 
-	__DBG(("%s: CRTC:%d\n", __FUNCTION__, crtc_id(sna_crtc)));
+	__DBG(("%s: CRTC:%d\n", __FUNCTION__, sna_crtc->id));
 
 	VG_CLEAR(arg);
 	arg.flags = DRM_MODE_CURSOR_BO;
@@ -808,24 +774,24 @@ sna_crtc_show_cursor(xf86CrtcPtr crtc)
 	arg.width = arg.height = 64;
 	arg.handle = sna_crtc->cursor;
 
-	drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
+	(void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
 }
 
 static void
 sna_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg)
 {
 	__DBG(("%s: CRTC:%d (bg=%x, fg=%x)\n", __FUNCTION__,
-	       crtc_id(crtc->driver_private), bg, fg));
+	       to_sna_crtc(crtc)->id, bg, fg));
 }
 
 static void
 sna_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
 {
 	struct sna *sna = to_sna(crtc->scrn);
-	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 	struct drm_mode_cursor arg;
 
-	__DBG(("%s: CRTC:%d (%d, %d)\n", __FUNCTION__, crtc_id(sna_crtc), x, y));
+	__DBG(("%s: CRTC:%d (%d, %d)\n", __FUNCTION__, sna_crtc->id, x, y));
 
 	VG_CLEAR(arg);
 	arg.flags = DRM_MODE_CURSOR_MOVE;
@@ -834,17 +800,17 @@ sna_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
 	arg.y = y;
 	arg.handle = sna_crtc->cursor;
 
-	drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
+	(void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
 }
 
 static void
 sna_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
 {
 	struct sna *sna = to_sna(crtc->scrn);
-	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 	struct drm_i915_gem_pwrite pwrite;
 
-	__DBG(("%s: CRTC:%d\n", __FUNCTION__, crtc_id(sna_crtc)));
+	__DBG(("%s: CRTC:%d\n", __FUNCTION__, sna_crtc->id));
 
 	VG_CLEAR(pwrite);
 	pwrite.handle = sna_crtc->cursor;
@@ -859,7 +825,7 @@ sna_crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height)
 {
 	ScrnInfoPtr scrn = crtc->scrn;
 	struct sna *sna = to_sna(scrn);
-	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 	PixmapPtr shadow;
 	struct kgem_bo *bo;
 
@@ -897,7 +863,7 @@ sna_crtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height)
 static void
 sna_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr pixmap, void *data)
 {
-	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 
 	/* We may have not called shadow_create() on the data yet and
 	 * be cleaning up a NULL shadow_pixmap.
@@ -918,9 +884,9 @@ sna_crtc_gamma_set(xf86CrtcPtr crtc,
 		       CARD16 *red, CARD16 *green, CARD16 *blue, int size)
 {
 	struct sna *sna = to_sna(crtc->scrn);
-	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 
-	drmModeCrtcSetGamma(sna->kgem.fd, crtc_id(sna_crtc),
+	drmModeCrtcSetGamma(sna->kgem.fd, sna_crtc->id,
 			    size, red, green, blue);
 }
 
@@ -928,7 +894,7 @@ static void
 sna_crtc_destroy(xf86CrtcPtr crtc)
 {
 	struct sna *sna = to_sna(crtc->scrn);
-	struct sna_crtc *sna_crtc = crtc->driver_private;
+	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 
 	sna_crtc_hide_cursor(crtc);
 	gem_close(sna->kgem.fd, sna_crtc->cursor);
@@ -1014,9 +980,12 @@ sna_crtc_init(ScrnInfoPtr scrn, struct sna_mode *mode, int num)
 	VG_CLEAR(get_pipe);
 	get_pipe.pipe = 0;
 	get_pipe.crtc_id = sna_crtc->id;
-	drmIoctl(sna->kgem.fd,
-		 DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID,
-		 &get_pipe);
+	if (drmIoctl(sna->kgem.fd,
+		     DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID,
+		     &get_pipe)) {
+		free(sna_crtc);
+		return;
+	}
 	sna_crtc->pipe = get_pipe.pipe;
 	sna_crtc->plane = sna_crtc_find_plane(sna, sna_crtc->pipe);
 
@@ -1904,18 +1873,18 @@ static int do_page_flip(struct sna *sna, void *data, int ref_crtc_hw_id)
 		evdata |= crtc->pipe == ref_crtc_hw_id;
 
 		DBG(("%s: crtc %d [ref? %d] --> fb %d\n",
-		     __FUNCTION__, crtc_id(crtc),
+		     __FUNCTION__, crtc->id,
 		     crtc->pipe == ref_crtc_hw_id,
 		     sna->mode.fb_id));
 		if (drmModePageFlip(sna->kgem.fd,
-				    crtc_id(crtc),
+				    crtc->id,
 				    sna->mode.fb_id,
 				    DRM_MODE_PAGE_FLIP_EVENT,
 				    (void*)evdata)) {
 			int err = errno;
 			DBG(("%s: flip [fb=%d] on crtc %d [%d] failed - %d\n",
 			     __FUNCTION__, sna->mode.fb_id,
-			     i, crtc_id(crtc), err));
+			     i, crtc->id, err));
 			xf86DrvMsg(sna->scrn->scrnIndex, X_WARNING,
 				   "flip queue failed: %s\n", strerror(err));
 			continue;
@@ -1927,22 +1896,6 @@ static int do_page_flip(struct sna *sna, void *data, int ref_crtc_hw_id)
 	return count;
 }
 
-PixmapPtr sna_set_screen_pixmap(struct sna *sna, PixmapPtr pixmap)
-{
-	PixmapPtr old = sna->front;
-	ScrnInfoPtr scrn = sna->scrn;
-
-	assert(sna->front != pixmap);
-
-	sna->front = pixmap;
-	pixmap->refcnt++;
-
-	sna_redirect_screen_pixmap(scrn, old, pixmap);
-	scrn->displayWidth = sna_pixmap_get_bo(pixmap)->pitch / sna->mode.cpp;
-
-	return old;
-}
-
 int
 sna_page_flip(struct sna *sna,
 	      struct kgem_bo *bo,
@@ -2334,7 +2287,7 @@ void sna_mode_update(struct sna *sna)
 	/* Validate CRTC attachments */
 	for (i = 0; i < xf86_config->num_crtc; i++) {
 		xf86CrtcPtr crtc = xf86_config->crtc[i];
-		struct sna_crtc *sna_crtc = crtc->driver_private;
+		struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 		if (crtc->enabled)
 			sna_crtc->active = sna_crtc_is_bound(sna, crtc);
 		else


More information about the xorg-commit mailing list