Mesa (master): radeon: DRI1 page flipping fixes.

Michel Dänzer daenzer at kemper.freedesktop.org
Sun Aug 30 10:54:30 UTC 2009


Module: Mesa
Branch: master
Commit: 8282235277eb3ff4179feca49aa308273dd42fd3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8282235277eb3ff4179feca49aa308273dd42fd3

Author: Michel Dänzer <daenzer at vmware.com>
Date:   Sun Aug 30 12:37:12 2009 +0200

radeon: DRI1 page flipping fixes.

---

 src/mesa/drivers/dri/radeon/radeon_common.c |   33 ++++++++++----------------
 1 files changed, 13 insertions(+), 20 deletions(-)

diff --git a/src/mesa/drivers/dri/radeon/radeon_common.c b/src/mesa/drivers/dri/radeon/radeon_common.c
index 042871c..6b8a86d 100644
--- a/src/mesa/drivers/dri/radeon/radeon_common.c
+++ b/src/mesa/drivers/dri/radeon/radeon_common.c
@@ -178,7 +178,8 @@ void radeon_get_cliprects(radeonContextPtr radeon,
 		*x_off = 0;
 		*y_off = 0;
 	} else if (radeon->front_cliprects ||
-		   rfb->pf_active || dPriv->numBackClipRects == 0) {
+		   rfb->pf_active || rfb->pf_current_page == 1 ||
+		   dPriv->numBackClipRects == 0) {
 		*cliprects = dPriv->pClipRects;
 		*num_cliprects = dPriv->numClipRects;
 		*x_off = dPriv->x;
@@ -589,8 +590,7 @@ static int radeonScheduleSwap(__DRIdrawablePrivate *dPriv, GLboolean *missed_tar
 
 	if (!dPriv->numClipRects) {
 		UNLOCK_HARDWARE(rmesa);
-		usleep(10000);	/* throttle invisible client 10ms */
-		return 0;
+		return -1;
 	}
 
 	radeonWaitForFrameCompletion(rmesa);
@@ -605,8 +605,6 @@ static GLboolean radeonPageFlip( __DRIdrawablePrivate *dPriv )
 {
 	radeonContextPtr radeon;
 	GLint ret;
-	__DRIscreenPrivate *psp;
-	struct radeon_renderbuffer *rrb;
 	struct radeon_framebuffer *rfb;
 
 	assert(dPriv);
@@ -615,12 +613,14 @@ static GLboolean radeonPageFlip( __DRIdrawablePrivate *dPriv )
 
 	radeon = (radeonContextPtr) dPriv->driContextPriv->driverPrivate;
 	rfb = dPriv->driverPrivate;
-	rrb = (void *)rfb->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
-
-	psp = dPriv->driScreenPriv;
 
 	LOCK_HARDWARE(radeon);
 
+	if (!rfb->pf_active) {
+		UNLOCK_HARDWARE(radeon);
+		return GL_FALSE;
+	}
+
 	if ( RADEON_DEBUG & DEBUG_IOCTL ) {
 		fprintf(stderr, "%s: pfCurrentPage: %d %d\n", __FUNCTION__,
 			radeon->sarea->pfCurrentPage, radeon->sarea->pfState);
@@ -639,12 +639,7 @@ static GLboolean radeonPageFlip( __DRIdrawablePrivate *dPriv )
 		return GL_FALSE;
 	}
 
-	if (!rfb->pf_active)
-		return GL_FALSE;
-
-	rfb->pf_current_page = radeon->sarea->pfCurrentPage;
-	radeon_flip_renderbuffers(rfb);
-	radeon_draw_buffer(radeon->glCtx, &rfb->base);
+	radeonUpdatePageFlipping(radeon);
 
 	return GL_TRUE;
 }
@@ -666,15 +661,13 @@ void radeonSwapBuffers(__DRIdrawablePrivate * dPriv)
 		ctx = radeon->glCtx;
 
 		if (ctx->Visual.doubleBufferMode) {
-			GLboolean missed_target;
 			struct radeon_framebuffer *rfb = dPriv->driverPrivate;
+			GLboolean missed_target;
 			_mesa_notifySwapBuffers(ctx);/* flush pending rendering comands */
 
-			radeonScheduleSwap(dPriv, &missed_target);
-
-			if (rfb->pf_active) {
-				radeonPageFlip(dPriv);
-			} else {
+			if (radeonScheduleSwap(dPriv, &missed_target) < 0) {
+				usleep(10000); /* throttle invisible client 10ms */
+                        } else if (!radeonPageFlip(dPriv)) {
 				radeonCopyBuffer(dPriv, NULL);
 			}
 




More information about the mesa-commit mailing list