From da84f0b642a65614c2618121869d5cd45ad986f5 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 1 Sep 2005 20:10:17 +0000 Subject: [PATCH] fix page flipping breakage --- src/mesa/drivers/dri/r200/r200_ioctl.c | 9 ++++- src/mesa/drivers/dri/r200/r200_lock.c | 59 ++---------------------------- src/mesa/drivers/dri/radeon/radeon_ioctl.c | 7 ++++ src/mesa/drivers/dri/radeon/radeon_lock.c | 44 ++++------------------ 4 files changed, 27 insertions(+), 92 deletions(-) diff --git a/src/mesa/drivers/dri/r200/r200_ioctl.c b/src/mesa/drivers/dri/r200/r200_ioctl.c index bf2d091..e45a59f 100644 --- a/src/mesa/drivers/dri/r200/r200_ioctl.c +++ b/src/mesa/drivers/dri/r200/r200_ioctl.c @@ -49,9 +49,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "r200_sanity.h" #include "radeon_reg.h" +#include "drirenderbuffer.h" #include "vblank.h" - #define R200_TIMEOUT 512 #define R200_IDLE_RETRY 16 @@ -573,6 +573,13 @@ void r200PageFlip( const __DRIdrawablePrivate *dPriv ) rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= R200_COLOR_TILE_ENABLE; } #else + /* Get ready for drawing next frame. Update the renderbuffers' + * flippedOffset/Pitch fields so we draw into the right place. + */ + driFlipRenderbuffers(rmesa->glCtx->WinSysDrawBuffer, + rmesa->sarea->pfCurrentPage); + + r200UpdateDrawBuffer(rmesa->glCtx); #endif } diff --git a/src/mesa/drivers/dri/r200/r200_lock.c b/src/mesa/drivers/dri/r200/r200_lock.c index 2edf5b6..1279cd7 100644 --- a/src/mesa/drivers/dri/r200/r200_lock.c +++ b/src/mesa/drivers/dri/r200/r200_lock.c @@ -32,15 +32,16 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * Authors: * Keith Whitwell */ -#include #include "r200_context.h" #include "r200_lock.h" #include "r200_tex.h" #include "r200_state.h" #include "r200_ioctl.h" + #include "drirenderbuffer.h" + #if DEBUG_LOCKING char *prevLockFile = NULL; int prevLockLine = 0; @@ -51,62 +52,10 @@ int prevLockLine = 0; static void r200UpdatePageFlipping( r200ContextPtr rmesa ) { -#if 000 - int use_back; rmesa->doPageFlip = rmesa->sarea->pfState; - - use_back = (rmesa->glCtx->DrawBuffer->_ColorDrawBufferMask[0] == BUFFER_BIT_BACK_LEFT); - use_back ^= (rmesa->sarea->pfCurrentPage == 1); - - if (use_back) { - rmesa->state.color.drawOffset = rmesa->r200Screen->backOffset; - rmesa->state.color.drawPitch = rmesa->r200Screen->backPitch; - } else { - rmesa->state.color.drawOffset = rmesa->r200Screen->frontOffset; - rmesa->state.color.drawPitch = rmesa->r200Screen->frontPitch; + if (!rmesa->doPageFlip) { + driFlipRenderbuffers(rmesa->glCtx->WinSysDrawBuffer, GL_FALSE); } - - R200_STATECHANGE( rmesa, ctx ); - rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = rmesa->state.color.drawOffset - + rmesa->r200Screen->fbLocation; - rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = rmesa->state.color.drawPitch; -#else - if (rmesa->doPageFlip != rmesa->sarea->pfState - || rmesa->sarea->pfState) { - /* If page flipping is on, or we're turning it on/off now we need - * to update the flipped buffer info. - */ - struct gl_framebuffer *fb = rmesa->glCtx->WinSysDrawBuffer; - driRenderbuffer *front_drb - = (driRenderbuffer *) fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer; - driRenderbuffer *back_drb - = (driRenderbuffer *) fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer; - - if (rmesa->sarea->pfState && rmesa->sarea->pfCurrentPage == 1) { - /* flipped buffers */ - front_drb->flippedOffset = back_drb->offset; - front_drb->flippedPitch = back_drb->pitch; - back_drb->flippedOffset = front_drb->offset; - back_drb->flippedPitch = front_drb->pitch; - } - else { - /* unflipped buffers */ - front_drb->flippedOffset = front_drb->offset; - front_drb->flippedPitch = front_drb->pitch; - if (back_drb) { - /* back buffer is non-existant when single buffered */ - back_drb->flippedOffset = back_drb->offset; - back_drb->flippedPitch = back_drb->pitch; - } - } - - /* update local state */ - rmesa->doPageFlip = rmesa->sarea->pfState; - - /* set hw.ctx.cmd state here */ - r200UpdateDrawBuffer(rmesa->glCtx); - } -#endif } diff --git a/src/mesa/drivers/dri/radeon/radeon_ioctl.c b/src/mesa/drivers/dri/radeon/radeon_ioctl.c index 92f6760..3d66d3e 100644 --- a/src/mesa/drivers/dri/radeon/radeon_ioctl.c +++ b/src/mesa/drivers/dri/radeon/radeon_ioctl.c @@ -52,6 +52,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define STANDALONE_MMIO #include "radeon_macros.h" /* for INREG() */ +#include "drirenderbuffer.h" #include "vblank.h" #define RADEON_TIMEOUT 512 @@ -999,6 +1000,12 @@ void radeonPageFlip( const __DRIdrawablePrivate *dPriv ) rmesa->swap_count++; (void) (*dri_interface->getUST)( & rmesa->swap_ust ); + /* Get ready for drawing next frame. Update the renderbuffers' + * flippedOffset/Pitch fields so we draw into the right place. + */ + driFlipRenderbuffers(rmesa->glCtx->WinSysDrawBuffer, + rmesa->sarea->pfCurrentPage); + radeonUpdateDrawBuffer(rmesa->glCtx); } diff --git a/src/mesa/drivers/dri/radeon/radeon_lock.c b/src/mesa/drivers/dri/radeon/radeon_lock.c index 2fc5bc7..c342b11 100644 --- a/src/mesa/drivers/dri/radeon/radeon_lock.c +++ b/src/mesa/drivers/dri/radeon/radeon_lock.c @@ -40,8 +40,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "radeon_tex.h" #include "radeon_state.h" #include "radeon_ioctl.h" + #include "drirenderbuffer.h" + #if DEBUG_LOCKING char *prevLockFile = NULL; int prevLockLine = 0; @@ -52,40 +54,9 @@ int prevLockLine = 0; static void radeonUpdatePageFlipping( radeonContextPtr rmesa ) { - if (rmesa->doPageFlip != rmesa->sarea->pfState - || rmesa->sarea->pfState) { - /* If page flipping is on, re we're turning it on/off now we need - * to update the flipped buffer info. - */ - struct gl_framebuffer *fb = rmesa->glCtx->WinSysDrawBuffer; - driRenderbuffer *front_drb - = (driRenderbuffer *) fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer; - driRenderbuffer *back_drb - = (driRenderbuffer *) fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer; - - if (rmesa->sarea->pfState && rmesa->sarea->pfCurrentPage == 1) { - /* flipped buffers */ - front_drb->flippedOffset = back_drb->offset; - front_drb->flippedPitch = back_drb->pitch; - back_drb->flippedOffset = front_drb->offset; - back_drb->flippedPitch = front_drb->pitch; - } - else { - /* unflipped buffers */ - front_drb->flippedOffset = front_drb->offset; - front_drb->flippedPitch = front_drb->pitch; - if (back_drb) { - /* back buffer is non-existant when single buffered */ - back_drb->flippedOffset = back_drb->offset; - back_drb->flippedPitch = back_drb->pitch; - } - } - - /* update local state */ - rmesa->doPageFlip = rmesa->sarea->pfState; - - /* set hw.ctx.cmd state here */ - radeonUpdateDrawBuffer(rmesa->glCtx); + rmesa->doPageFlip = rmesa->sarea->pfState; + if (!rmesa->doPageFlip) { + driFlipRenderbuffers(rmesa->glCtx->WinSysDrawBuffer, GL_FALSE); } } @@ -117,7 +88,6 @@ void radeonGetLock( radeonContextPtr rmesa, GLuint flags ) */ DRI_VALIDATE_DRAWABLE_INFO( sPriv, dPriv ); - if ( rmesa->lastStamp != dPriv->lastStamp ) { radeonUpdatePageFlipping( rmesa ); if (rmesa->glCtx->DrawBuffer->_ColorDrawBufferMask[0] == BUFFER_BIT_BACK_LEFT) @@ -132,7 +102,9 @@ void radeonGetLock( radeonContextPtr rmesa, GLuint flags ) if (rmesa->sarea->tiling_enabled) { rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= RADEON_COLOR_TILE_ENABLE; } - else rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] &= ~RADEON_COLOR_TILE_ENABLE; + else { + rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] &= ~RADEON_COLOR_TILE_ENABLE; + } if ( sarea->ctx_owner != rmesa->dri.hwContext ) { int i; -- 2.7.4