summaryrefslogtreecommitdiff
path: root/xc/lib/GL/mesa/src/drv/mach64
diff options
context:
space:
mode:
Diffstat (limited to 'xc/lib/GL/mesa/src/drv/mach64')
-rw-r--r--xc/lib/GL/mesa/src/drv/mach64/mach64_context.h4
-rw-r--r--xc/lib/GL/mesa/src/drv/mach64/mach64_ioctl.c37
-rw-r--r--xc/lib/GL/mesa/src/drv/mach64/mach64_screen.c19
-rw-r--r--xc/lib/GL/mesa/src/drv/mach64/mach64_screen.h1
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;