Exemplo n.º 1
0
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;
    } 
Exemplo n.º 2
0
/* 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;
    }
}
Exemplo n.º 3
0
/* 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;
}
Exemplo n.º 4
0
/* 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;
	}
}
Exemplo n.º 5
0
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
}