xf86-video-intel: src/intel_display.c

Chris Wilson ickle at kemper.freedesktop.org
Thu Sep 27 08:20:48 PDT 2012


 src/intel_display.c |   24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

New commits:
commit 88cfd23379950d1fe4e682519c48ef6e3091c2f3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Thu Sep 27 16:16:39 2012 +0100

    uxa: Update mode->fb_id after completing pageflips
    
    As intel_crtc_on() depends upon the current value for determining if the
    pipe is active, we can only change the value afterwards.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/intel_display.c b/src/intel_display.c
index ab73e24..b2a5904 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -705,7 +705,6 @@ intel_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix)
 	ScrnInfoPtr scrn = crtc->scrn;
 	intel_screen_private *intel = intel_get_screen_private(scrn);
 	dri_bo *bo;
-	int ret;
 
 	if (ppix == intel_crtc->scanout_pixmap)
 		return TRUE;
@@ -725,11 +724,10 @@ intel_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix)
 	}
 
 	intel_crtc->scanout_pixmap = ppix;
-	ret = drmModeAddFB(intel->drmSubFD, ppix->drawable.width,
+	return drmModeAddFB(intel->drmSubFD, ppix->drawable.width,
 			   ppix->drawable.height, ppix->drawable.depth,
 			   ppix->drawable.bitsPerPixel, ppix->devKind,
-			   bo->handle, &intel_crtc->scanout_fb_id);
-	return TRUE;
+			   bo->handle, &intel_crtc->scanout_fb_id) == 0;
 }
 #endif
 
@@ -1547,15 +1545,15 @@ intel_do_pageflip(intel_screen_private *intel,
 	struct intel_mode *mode = crtc->mode;
 	unsigned int pitch = scrn->displayWidth * intel->cpp;
 	struct intel_pageflip *flip;
-	int i, old_fb_id;
+	uint32_t new_fb_id;
+	int i;
 
 	/*
 	 * Create a new handle for the back buffer
 	 */
-	old_fb_id = mode->fb_id;
 	if (drmModeAddFB(mode->fd, scrn->virtualX, scrn->virtualY,
 			 scrn->depth, scrn->bitsPerPixel, pitch,
-			 new_front->handle, &mode->fb_id))
+			 new_front->handle, &new_fb_id))
 		goto error_out;
 
 	intel_glamor_flush(intel);
@@ -1598,7 +1596,7 @@ intel_do_pageflip(intel_screen_private *intel,
 
 		if (drmModePageFlip(mode->fd,
 				    crtc_id(crtc),
-				    mode->fb_id,
+				    new_fb_id,
 				    DRM_MODE_PAGE_FLIP_EVENT, flip)) {
 			xf86DrvMsg(scrn->scrnIndex, X_WARNING,
 				   "flip queue failed: %s\n", strerror(errno));
@@ -1607,12 +1605,16 @@ intel_do_pageflip(intel_screen_private *intel,
 		}
 	}
 
-	mode->old_fb_id = old_fb_id;
+	mode->old_fb_id = mode->fb_id;
+	mode->fb_id = new_fb_id;
 	return TRUE;
 
 error_undo:
-	drmModeRmFB(mode->fd, mode->fb_id);
-	mode->fb_id = old_fb_id;
+	drmModeRmFB(mode->fd, new_fb_id);
+	for (i = 0; i < config->num_crtc; i++) {
+		if (config->crtc[i]->enabled)
+			intel_crtc_apply(config->crtc[i]);
+	}
 
 error_out:
 	xf86DrvMsg(scrn->scrnIndex, X_WARNING, "Page flip failed: %s\n",


More information about the xorg-commit mailing list