static void savage_BCI_swap(savageContextPtr imesa) { int nbox = imesa->sarea->nbox; drm_clip_rect_t *pbox = imesa->sarea->boxes; int i; volatile uint32_t *bciptr; if (nbox > SAVAGE_NR_SAREA_CLIPRECTS) nbox = SAVAGE_NR_SAREA_CLIPRECTS; savageDMAFlush (imesa); if(imesa->IsFullScreen) { /* full screen*/ unsigned int tmp0; tmp0 = imesa->savageScreen->frontOffset; imesa->savageScreen->frontOffset = imesa->savageScreen->backOffset; imesa->savageScreen->backOffset = tmp0; if(imesa->toggle == TARGET_BACK) imesa->toggle = TARGET_FRONT; else imesa->toggle = TARGET_BACK; driFlipRenderbuffers(imesa->glCtx->DrawBuffer, imesa->toggle != TARGET_FRONT); imesa->regs.s4.destCtrl.ni.offset = imesa->savageScreen->backOffset>>11; imesa->dirty |= SAVAGE_UPLOAD_GLOBAL; bciptr = SAVAGE_GET_BCI_POINTER(imesa,3); *(bciptr) = 0x960100B0; *(bciptr) = (imesa->savageScreen->frontOffset); *(bciptr) = 0xA0000000; }
/* Turn on/off page flipping according to the flags in the sarea: */ void radeonUpdatePageFlipping(radeonContextPtr rmesa) { int use_back; rmesa->doPageFlip = rmesa->sarea->pfState; if (rmesa->glCtx->WinSysDrawBuffer) { driFlipRenderbuffers(rmesa->glCtx->WinSysDrawBuffer, rmesa->sarea->pfCurrentPage); r300UpdateDrawBuffer(rmesa->glCtx); } use_back = rmesa->glCtx->DrawBuffer ? (rmesa->glCtx->DrawBuffer->_ColorDrawBufferIndexes[0] == BUFFER_BACK_LEFT) : 1; use_back ^= (rmesa->sarea->pfCurrentPage == 1); if (use_back) { rmesa->state.color.drawOffset = rmesa->radeonScreen->backOffset; rmesa->state.color.drawPitch = rmesa->radeonScreen->backPitch; } else { rmesa->state.color.drawOffset = rmesa->radeonScreen->frontOffset; rmesa->state.color.drawPitch = rmesa->radeonScreen->frontPitch; } }
/* Turn on/off page flipping according to the flags in the sarea: */ static void r128UpdatePageFlipping( r128ContextPtr rmesa ) { rmesa->doPageFlip = rmesa->sarea->pfAllowPageFlip; if (rmesa->glCtx->WinSysDrawBuffer) { driFlipRenderbuffers(rmesa->glCtx->WinSysDrawBuffer, rmesa->sarea->pfCurrentPage); } rmesa->new_state |= R128_NEW_WINDOW; }
/* Turn on/off page flipping according to the flags in the sarea: */ static void radeonUpdatePageFlipping(radeonContextPtr radeon) { int use_back; radeon->doPageFlip = radeon->sarea->pfState; if (!radeon->doPageFlip) { driFlipRenderbuffers(radeon->glCtx->WinSysDrawBuffer, GL_FALSE); } use_back = (radeon->glCtx->DrawBuffer->_ColorDrawBufferMask[0] == BUFFER_BIT_BACK_LEFT); use_back ^= (radeon->sarea->pfCurrentPage == 1); if (use_back) { radeon->state.color.drawOffset = radeon->radeonScreen->backOffset; radeon->state.color.drawPitch = radeon->radeonScreen->backPitch; } else { radeon->state.color.drawOffset = radeon->radeonScreen->frontOffset; radeon->state.color.drawPitch = radeon->radeonScreen->frontPitch; } }
void r128PageFlip( const __DRIdrawablePrivate *dPriv ) { r128ContextPtr rmesa; GLint ret; GLboolean missed_target; assert(dPriv); assert(dPriv->driContextPriv); assert(dPriv->driContextPriv->driverPrivate); rmesa = (r128ContextPtr) dPriv->driContextPriv->driverPrivate; if ( R128_DEBUG & DEBUG_VERBOSE_API ) { fprintf( stderr, "\n%s( %p ): page=%d\n\n", __FUNCTION__, (void *)rmesa->glCtx, rmesa->sarea->pfCurrentPage ); } FLUSH_BATCH( rmesa ); LOCK_HARDWARE( rmesa ); /* Throttle the frame rate -- only allow one pending swap buffers * request at a time. */ if ( !r128WaitForFrameCompletion( rmesa ) ) { rmesa->hardwareWentIdle = 1; } else { rmesa->hardwareWentIdle = 0; } UNLOCK_HARDWARE( rmesa ); driWaitForVBlank( dPriv, &rmesa->vbl_seq, rmesa->vblank_flags, &missed_target ); LOCK_HARDWARE( rmesa ); /* The kernel will have been initialized to perform page flipping * on a swapbuffers ioctl. */ ret = drmCommandNone( rmesa->driFd, DRM_R128_FLIP ); UNLOCK_HARDWARE( rmesa ); if ( ret ) { fprintf( stderr, "DRM_R128_FLIP: return = %d\n", ret ); exit( 1 ); } /* 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); rmesa->new_state |= R128_NEW_WINDOW; /* FIXME: Do we need this anymore? */ rmesa->new_state |= R128_NEW_CONTEXT; rmesa->dirty |= (R128_UPLOAD_CONTEXT | R128_UPLOAD_MASKS | R128_UPLOAD_CLIPRECTS); #if ENABLE_PERF_BOXES /* Log the performance counters if necessary */ r128PerformanceCounters( rmesa ); #endif }