xf86-video-intel: 3 commits - src/sna/sna_display.c src/sna/sna_dri.c src/sna/sna_driver.c

Chris Wilson ickle at kemper.freedesktop.org
Sun Mar 3 01:32:56 PST 2013


 src/sna/sna_display.c |   26 +++++++++-----------------
 src/sna/sna_dri.c     |    3 ++-
 src/sna/sna_driver.c  |   46 +++++++++++++++++++++++++++++++++++++++++-----
 3 files changed, 52 insertions(+), 23 deletions(-)

New commits:
commit ef5edbf61686388126e62ce360a66dd8652b2493
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Mar 3 09:29:53 2013 +0000

    sna: Probe for kernel support of framebuffer formats
    
    References: https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/1135403
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index b11575b..8e32c5f 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -438,6 +438,37 @@ static Bool sna_option_cast_to_bool(struct sna *sna, int id, Bool val)
 	return val;
 }
 
+static Bool fb_supports_depth(int fd, int depth)
+{
+	struct drm_i915_gem_create create;
+	struct drm_mode_fb_cmd fb;
+	struct drm_gem_close close;
+	Bool ret;
+
+	VG_CLEAR(create);
+	create.handle = 0;
+	create.size = 4096;
+	if (drmIoctl(fd, DRM_IOCTL_I915_GEM_CREATE, &create))
+		return FALSE;
+
+	VG_CLEAR(fb);
+	fb.width = 64;
+	fb.height = 16;
+	fb.pitch = 256;
+	fb.bpp = depth <= 8 ? 8 : depth <= 16 ? 16 : 32;
+	fb.depth = depth;
+	fb.handle = create.handle;
+
+	ret = drmIoctl(fd, DRM_IOCTL_MODE_ADDFB, &fb) == 0;
+	drmModeRmFB(fd, fb.fb_id);
+
+	VG_CLEAR(close);
+	close.handle = create.handle;
+	(void)drmIoctl(fd, DRM_IOCTL_GEM_CLOSE, &close);
+
+	return ret;
+}
+
 /**
  * This is called before ScreenInit to do any require probing of screen
  * configuration.
@@ -502,6 +533,10 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 
 	sna->PciInfo = xf86GetPciInfoForEntity(sna->pEnt->index);
 
+	scrn->monitor = scrn->confScreen->monitor;
+	scrn->progClock = TRUE;
+	scrn->rgbBits = 8;
+
 	fd = sna_open_drm_master(scrn);
 	if (fd == -1) {
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
@@ -509,13 +544,13 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 		return FALSE;
 	}
 
-	scrn->monitor = scrn->confScreen->monitor;
-	scrn->progClock = TRUE;
-	scrn->rgbBits = 8;
 
 	flags24 = Support32bppFb | PreferConvert24to32 | SupportConvert24to32;
 
 	preferred_depth = sna->info->gen < 040 ? 15 : 24;
+	if (!fb_supports_depth(fd, preferred_depth))
+		preferred_depth = 24;
+
 	if (!xf86SetDepthBpp(scrn, preferred_depth, 0, 0, flags24))
 		return FALSE;
 
@@ -525,10 +560,11 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int flags)
 	case 16:
 	case 24:
 	case 30:
-		break;
+		if (fb_supports_depth(fd, scrn->depth))
+			break;
 	default:
 		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
-			   "Given depth (%d) is not supported by Intel driver\n",
+			   "Given depth (%d) is not supported by the Intel driver and this chipset.\n",
 			   scrn->depth);
 		return FALSE;
 	}
commit cd313a8d5d1363929bebac83f81e347b4a9e70f1
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Mar 2 22:52:15 2013 +0000

    sna/dri: Guard against failed batch submission
    
    Avoid dereferencing a NULL bo if we do not submit a batch for the copy
    operation.
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=61708
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_dri.c b/src/sna/sna_dri.c
index d30c3a4..e3bca1b 100644
--- a/src/sna/sna_dri.c
+++ b/src/sna/sna_dri.c
@@ -725,7 +725,8 @@ sna_dri_copy_to_front(struct sna *sna, DrawablePtr draw, RegionPtr region,
 		if (flush) { /* STAT! */
 			struct kgem_request *rq = sna->kgem.next_request;
 			kgem_submit(&sna->kgem);
-			bo = kgem_bo_reference(rq->bo);
+			if (rq->bo)
+				bo = kgem_bo_reference(rq->bo);
 		}
 	}
 
commit e4df4e03b147694c65196651f5c13e7199f74579
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sat Mar 2 22:46:57 2013 +0000

    sna: Eliminate a few used-once local variables
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 714b65c..60c9467 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -1345,7 +1345,6 @@ void sna_mode_adjust_frame(struct sna *sna, int x, int y)
 static void
 sna_crtc_hide_cursor(xf86CrtcPtr crtc)
 {
-	struct sna *sna = to_sna(crtc->scrn);
 	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 	struct drm_mode_cursor arg;
 
@@ -1357,13 +1356,12 @@ sna_crtc_hide_cursor(xf86CrtcPtr crtc)
 	arg.width = arg.height = 64;
 	arg.handle = 0;
 
-	(void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
+	(void)drmIoctl(to_sna(crtc->scrn)->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 = to_sna_crtc(crtc);
 	struct drm_mode_cursor arg;
 
@@ -1375,7 +1373,7 @@ sna_crtc_show_cursor(xf86CrtcPtr crtc)
 	arg.width = arg.height = 64;
 	arg.handle = sna_crtc->cursor;
 
-	(void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
+	(void)drmIoctl(to_sna(crtc->scrn)->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
 }
 
 static void
@@ -1388,7 +1386,6 @@ sna_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int 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 = to_sna_crtc(crtc);
 	struct drm_mode_cursor arg;
 
@@ -1401,45 +1398,40 @@ sna_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
 	arg.y = y;
 	arg.handle = sna_crtc->cursor;
 
-	(void)drmIoctl(sna->kgem.fd, DRM_IOCTL_MODE_CURSOR, &arg);
+	(void)drmIoctl(to_sna(crtc->scrn)->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 = to_sna_crtc(crtc);
 	struct drm_i915_gem_pwrite pwrite;
 
-	__DBG(("%s: CRTC:%d\n", __FUNCTION__, sna_crtc->id));
+	__DBG(("%s: CRTC:%d\n", __FUNCTION__, to_sna_crtc(crtc)->id));
 
 	VG_CLEAR(pwrite);
-	pwrite.handle = sna_crtc->cursor;
+	pwrite.handle = to_sna_crtc(crtc)->cursor;
 	pwrite.offset = 0;
 	pwrite.size = 64*64*4;
 	pwrite.data_ptr = (uintptr_t)image;
-	(void)drmIoctl(sna->kgem.fd, DRM_IOCTL_I915_GEM_PWRITE, &pwrite);
+	(void)drmIoctl(to_sna(crtc->scrn)->kgem.fd, DRM_IOCTL_I915_GEM_PWRITE, &pwrite);
 }
 
 static void
 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 = to_sna_crtc(crtc);
-
-	drmModeCrtcSetGamma(sna->kgem.fd, sna_crtc->id,
+	drmModeCrtcSetGamma(to_sna(crtc->scrn)->kgem.fd,
+			    to_sna_crtc(crtc)->id,
 			    size, red, green, blue);
 }
 
 static void
 sna_crtc_destroy(xf86CrtcPtr crtc)
 {
-	struct sna *sna = to_sna(crtc->scrn);
 	struct sna_crtc *sna_crtc = to_sna_crtc(crtc);
 
 	sna_crtc_hide_cursor(crtc);
-	gem_close(sna->kgem.fd, sna_crtc->cursor);
+	gem_close(to_sna(crtc->scrn)->kgem.fd, sna_crtc->cursor);
 
 	list_del(&sna_crtc->link);
 	free(sna_crtc);


More information about the xorg-commit mailing list