From c409dbcae3607e6f83f50a28d9bbb51f5ad51be4 Mon Sep 17 00:00:00 2001
From: Michel Dänzer <michel@tungstengraphics.com>
Date: Thu, 29 Mar 2007 09:42:37 +0200
Subject: r300: Page flipping fixes.

Mostly making sure the page flipping state is respected when necessary.
---
 src/mesa/drivers/dri/r300/r300_ioctl.c     | 2 +-
 src/mesa/drivers/dri/r300/radeon_context.c | 2 ++
 src/mesa/drivers/dri/r300/radeon_lock.c    | 3 ++-
 src/mesa/drivers/dri/r300/radeon_lock.h    | 1 +
 src/mesa/drivers/dri/r300/radeon_state.c   | 3 ++-
 5 files changed, 8 insertions(+), 3 deletions(-)

(limited to 'src')

diff --git a/src/mesa/drivers/dri/r300/r300_ioctl.c b/src/mesa/drivers/dri/r300/r300_ioctl.c
index 90ac9881e8..c4dc97b8d4 100644
--- a/src/mesa/drivers/dri/r300/r300_ioctl.c
+++ b/src/mesa/drivers/dri/r300/r300_ioctl.c
@@ -370,7 +370,7 @@ static void r300Clear(GLcontext * ctx, GLbitfield mask)
 		_swrast_Clear(ctx, mask);
 	}
 
-	swapped = r300->radeon.doPageFlip && (r300->radeon.sarea->pfCurrentPage == 1);
+	swapped = r300->radeon.sarea->pfCurrentPage == 1;
 
 	/* Make sure it fits there. */
 	r300EnsureCmdBufSpace(r300, 421*3, __FUNCTION__);
diff --git a/src/mesa/drivers/dri/r300/radeon_context.c b/src/mesa/drivers/dri/r300/radeon_context.c
index ef1f25dd41..9b3f890507 100644
--- a/src/mesa/drivers/dri/r300/radeon_context.c
+++ b/src/mesa/drivers/dri/r300/radeon_context.c
@@ -293,6 +293,8 @@ GLboolean radeonMakeCurrent(__DRIcontextPrivate * driContextPriv,
 				    driverPrivate);
 
 		_mesa_update_state(radeon->glCtx);		
+
+		radeonUpdatePageFlipping(radeon);
 	} else {
 		if (RADEON_DEBUG & DEBUG_DRI)
 			fprintf(stderr, "%s ctx is null\n", __FUNCTION__);
diff --git a/src/mesa/drivers/dri/r300/radeon_lock.c b/src/mesa/drivers/dri/r300/radeon_lock.c
index ec501c3dc0..84181e2e99 100644
--- a/src/mesa/drivers/dri/r300/radeon_lock.c
+++ b/src/mesa/drivers/dri/r300/radeon_lock.c
@@ -50,13 +50,14 @@ int prevLockLine = 0;
 
 /* Turn on/off page flipping according to the flags in the sarea:
  */
-static void radeonUpdatePageFlipping(radeonContextPtr radeon)
+void radeonUpdatePageFlipping(radeonContextPtr radeon)
 {
 	int use_back;
 
 	radeon->doPageFlip = radeon->sarea->pfState;
         if (radeon->glCtx->WinSysDrawBuffer) {
            driFlipRenderbuffers(radeon->glCtx->WinSysDrawBuffer, radeon->sarea->pfCurrentPage);
+           r300UpdateDrawBuffer(radeon->glCtx);
         }
 
 	use_back = (radeon->glCtx->DrawBuffer->_ColorDrawBufferMask[0] == BUFFER_BIT_BACK_LEFT);
diff --git a/src/mesa/drivers/dri/r300/radeon_lock.h b/src/mesa/drivers/dri/r300/radeon_lock.h
index 632329fde1..b11ddf0895 100644
--- a/src/mesa/drivers/dri/r300/radeon_lock.h
+++ b/src/mesa/drivers/dri/r300/radeon_lock.h
@@ -41,6 +41,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "radeon_context.h"
 
 extern void radeonGetLock(radeonContextPtr radeon, GLuint flags);
+extern void radeonUpdatePageFlipping(radeonContextPtr radeon);
 
 /* Turn DEBUG_LOCKING on to find locking conflicts.
  */
diff --git a/src/mesa/drivers/dri/r300/radeon_state.c b/src/mesa/drivers/dri/r300/radeon_state.c
index 902e9583a6..82bfd951b9 100644
--- a/src/mesa/drivers/dri/r300/radeon_state.c
+++ b/src/mesa/drivers/dri/r300/radeon_state.c
@@ -154,7 +154,8 @@ void radeonSetCliprects(radeonContextPtr radeon)
 
 	if (draw_fb->_ColorDrawBufferMask[0] == BUFFER_BIT_BACK_LEFT) {
 		/* Can't ignore 2d windows if we are page flipping. */
-		if (drawable->numBackClipRects == 0 || radeon->doPageFlip) {
+		if (drawable->numBackClipRects == 0 || radeon->doPageFlip ||
+		    radeon->sarea->pfCurrentPage == 1) {
 			radeon->numClipRects = drawable->numClipRects;
 			radeon->pClipRects = drawable->pClipRects;
 		} else {
-- 
cgit v1.2.3