/* * Copy the back buffer to the front buffer. */ void i830CopyBuffer( const __DRIdrawablePrivate *dPriv ) { i830ContextPtr imesa; XF86DRIClipRectPtr pbox; int nbox, i, tmp; assert(dPriv); assert(dPriv->driContextPriv); assert(dPriv->driContextPriv->driverPrivate); imesa = (i830ContextPtr) dPriv->driContextPriv->driverPrivate; I830_FIREVERTICES( imesa ); LOCK_HARDWARE( imesa ); imesa->sarea->perf_boxes |= imesa->perf_boxes; imesa->perf_boxes = 0; pbox = dPriv->pClipRects; nbox = dPriv->numClipRects; for (i = 0 ; i < nbox ; ) { int nr = MIN2(i + I830_NR_SAREA_CLIPRECTS, dPriv->numClipRects); XF86DRIClipRectRec *b = (XF86DRIClipRectRec *)imesa->sarea->boxes; imesa->sarea->nbox = nr - i; for ( ; i < nr ; i++) *b++ = pbox[i]; drmCommandNone(imesa->driFd, DRM_I830_SWAP); } tmp = GET_ENQUEUE_AGE(imesa); UNLOCK_HARDWARE( imesa ); /* multiarb will suck the life out of the server without this throttle: */ if (GET_DISPATCH_AGE(imesa) < imesa->lastSwap) { i830WaitAge(imesa, imesa->lastSwap); } imesa->lastSwap = tmp; imesa->upload_cliprects = GL_TRUE; }
/* Flip the front & back buffes */ void i830PageFlip( const __DRIdrawablePrivate *dPriv ) { i830ContextPtr imesa; int tmp, ret; if (I830_DEBUG & DEBUG_IOCTL) fprintf(stderr, "%s\n", __FUNCTION__); assert(dPriv); assert(dPriv->driContextPriv); assert(dPriv->driContextPriv->driverPrivate); imesa = (i830ContextPtr) dPriv->driContextPriv->driverPrivate; I830_FIREVERTICES( imesa ); LOCK_HARDWARE( imesa ); imesa->sarea->perf_boxes |= imesa->perf_boxes; imesa->perf_boxes = 0; if (dPriv->pClipRects) { *(XF86DRIClipRectRec *)imesa->sarea->boxes = dPriv->pClipRects[0]; imesa->sarea->nbox = 1; } ret = drmCommandNone(imesa->driFd, DRM_I830_FLIP); if (ret) { fprintf(stderr, "%s: %d\n", __FUNCTION__, ret); UNLOCK_HARDWARE( imesa ); exit(1); } tmp = GET_ENQUEUE_AGE(imesa); UNLOCK_HARDWARE( imesa ); /* multiarb will suck the life out of the server without this throttle: */ if (GET_DISPATCH_AGE(imesa) < imesa->lastSwap) { i830WaitAge(imesa, imesa->lastSwap); } i830SetDrawBuffer( imesa->glCtx, imesa->glCtx->Color.DriverDrawBuffer ); imesa->upload_cliprects = GL_TRUE; imesa->lastSwap = tmp; }
/* * XXX implement when full-screen extension is done. */ void i810PageFlip( const __DRIdrawable *dPriv ) { i810ContextPtr imesa; int tmp, ret; assert(dPriv); assert(dPriv->driContextPriv); assert(dPriv->driContextPriv->driverPrivate); imesa = (i810ContextPtr) dPriv->driContextPriv->driverPrivate; I810_FIREVERTICES( imesa ); LOCK_HARDWARE( imesa ); if (dPriv->pClipRects) { memcpy(&(imesa->sarea->boxes[0]), &(dPriv->pClipRects[0]), sizeof(drm_clip_rect_t)); imesa->sarea->nbox = 1; } ret = drmCommandNone(imesa->driFd, DRM_I810_FLIP); if (ret) { fprintf(stderr, "%s: %d\n", __FUNCTION__, ret); UNLOCK_HARDWARE( imesa ); exit(1); } tmp = GET_ENQUEUE_AGE(imesa); UNLOCK_HARDWARE( imesa ); /* multiarb will suck the life out of the server without this throttle: */ if (GET_DISPATCH_AGE(imesa) < imesa->lastSwap) { i810WaitAge(imesa, imesa->lastSwap); } /* i810SetDrawBuffer( imesa->glCtx, imesa->glCtx->Color.DriverDrawBuffer );*/ i810DrawBuffer( imesa->glCtx, imesa->glCtx->Color.DrawBuffer[0] ); imesa->upload_cliprects = GL_TRUE; imesa->lastSwap = tmp; return; }