diff options
Diffstat (limited to 'xc/lib/GL/mesa/src/drv/mach64')
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mach64/mach64_context.h | 4 | ||||
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mach64/mach64_ioctl.c | 37 | ||||
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mach64/mach64_screen.c | 19 | ||||
-rw-r--r-- | xc/lib/GL/mesa/src/drv/mach64/mach64_screen.h | 1 |
4 files changed, 60 insertions, 1 deletions
diff --git a/xc/lib/GL/mesa/src/drv/mach64/mach64_context.h b/xc/lib/GL/mesa/src/drv/mach64/mach64_context.h index 97ef4356f..638870314 100644 --- a/xc/lib/GL/mesa/src/drv/mach64/mach64_context.h +++ b/xc/lib/GL/mesa/src/drv/mach64/mach64_context.h @@ -297,6 +297,10 @@ struct mach64_context { GLuint c_texsrc_card; GLuint c_vertexBuffers; #endif + + /* VBI + */ + GLuint vbl_seq; }; #define MACH64_CONTEXT(ctx) ((mach64ContextPtr)(ctx->DriverCtx)) diff --git a/xc/lib/GL/mesa/src/drv/mach64/mach64_ioctl.c b/xc/lib/GL/mesa/src/drv/mach64/mach64_ioctl.c index cfa71621a..1fbfbac45 100644 --- a/xc/lib/GL/mesa/src/drv/mach64/mach64_ioctl.c +++ b/xc/lib/GL/mesa/src/drv/mach64/mach64_ioctl.c @@ -260,6 +260,40 @@ static int mach64WaitForFrameCompletion( mach64ContextPtr mmesa ) return wait; } +static void mach64WaitForVBlank( mach64ContextPtr mmesa ) +{ + drmVBlank vbl; + int ret; + + if ( !mmesa->mach64Screen->irq ) + return; + + if ( getenv("LIBGL_SYNC_REFRESH") ) { + /* Wait until the next vertical blank */ + vbl.request.type = DRM_VBLANK_RELATIVE; + vbl.request.sequence = 1; + } else if ( getenv("LIBGL_THROTTLE_REFRESH") ) { + /* Wait for at least one vertical blank since the last call */ + vbl.request.type = DRM_VBLANK_ABSOLUTE; + vbl.request.sequence = mmesa->vbl_seq + 1; + } else { + return; + } + + UNLOCK_HARDWARE( mmesa ); + + if ((ret = drmWaitVBlank( mmesa->driFd, &vbl ))) { + fprintf(stderr, "%s: drmWaitVBlank returned %d, IRQs don't seem to be" + " working correctly.\nTry running with LIBGL_THROTTLE_REFRESH" + " and LIBL_SYNC_REFRESH unset.\n", __FUNCTION__, ret); + exit(1); + } + + mmesa->vbl_seq = vbl.reply.sequence; + + LOCK_HARDWARE( mmesa ); +} + /* Copy the back color buffer to the front color buffer. */ void mach64CopyBuffer( const __DRIdrawablePrivate *dPriv ) @@ -295,13 +329,14 @@ void mach64CopyBuffer( const __DRIdrawablePrivate *dPriv ) mmesa->hardwareWentIdle = 0; } - #if ENABLE_PERF_BOXES if ( mmesa->boxes ) { mach64PerformanceBoxesLocked( mmesa ); } #endif + mach64WaitForVBlank( mmesa ); + /* use front buffer cliprects */ nbox = dPriv->numClipRects; pbox = dPriv->pClipRects; diff --git a/xc/lib/GL/mesa/src/drv/mach64/mach64_screen.c b/xc/lib/GL/mesa/src/drv/mach64/mach64_screen.c index 4a9c3a233..2ed4b21ac 100644 --- a/xc/lib/GL/mesa/src/drv/mach64/mach64_screen.c +++ b/xc/lib/GL/mesa/src/drv/mach64/mach64_screen.c @@ -54,6 +54,22 @@ mach64CreateScreen( __DRIscreenPrivate *driScreen ) mach64Screen->IsPCI = serverInfo->IsPCI; + { + drmMach64GetParam gp; + int ret; + + gp.param = MACH64_PARAM_IRQ_NR; + gp.value = &mach64Screen->irq; + + ret = drmCommandWriteRead( driScreen->fd, DRM_MACH64_GETPARAM, + &gp, sizeof(gp)); + if (ret) { + fprintf(stderr, "DRM_MACH64_GETPARAM (MACH64_PARAM_IRQ_NR): %d\n", ret); + FREE( mach64Screen ); + return NULL; + } + } + mach64Screen->mmio.handle = serverInfo->regs; mach64Screen->mmio.size = serverInfo->regsSize; if ( drmMap( driScreen->fd, @@ -137,6 +153,9 @@ mach64DestroyScreen( __DRIscreenPrivate *driScreen ) { mach64ScreenRec *mach64Screen = (mach64ScreenRec *) driScreen->private; + if ( !mach64Screen ) + return; + if ( MACH64_DEBUG & DEBUG_VERBOSE_DRI ) fprintf( stderr, "mach64DestroyScreen\n" ); diff --git a/xc/lib/GL/mesa/src/drv/mach64/mach64_screen.h b/xc/lib/GL/mesa/src/drv/mach64/mach64_screen.h index fa453e0ba..ea0adb1c6 100644 --- a/xc/lib/GL/mesa/src/drv/mach64/mach64_screen.h +++ b/xc/lib/GL/mesa/src/drv/mach64/mach64_screen.h @@ -59,6 +59,7 @@ typedef struct { int IsPCI; int AGPMode; + unsigned int irq; /* IRQ number (0 means none) */ /* Shared Texture data */ int firstTexHeap, numTexHeaps; |