This prevents the first wait for vertical blank from timing out when the X server has been running for a long time.tags/mesa_6_5_2
@@ -208,20 +208,6 @@ GLuint driGetDefaultVBlankFlags( const driOptionCache *optionCache ) | |||
} | |||
/****************************************************************************/ | |||
/** | |||
* Sets the default swap interval when the drawable is first bound to a | |||
* direct rendering context. | |||
*/ | |||
void driDrawableInitVBlank( __DRIdrawablePrivate *priv, GLuint flags ) | |||
{ | |||
if ( priv->pdraw->swap_interval == (unsigned)-1 ) { | |||
priv->pdraw->swap_interval = (flags & VBLANK_FLAG_THROTTLE) != 0 ? 1 : 0; | |||
} | |||
} | |||
/****************************************************************************/ | |||
/** | |||
* Wrapper to call \c drmWaitVBlank. The main purpose of this function is to | |||
@@ -260,6 +246,25 @@ static int do_wait( drmVBlank * vbl, GLuint * vbl_seq, int fd ) | |||
} | |||
/****************************************************************************/ | |||
/** | |||
* Sets the default swap interval when the drawable is first bound to a | |||
* direct rendering context. | |||
*/ | |||
void driDrawableInitVBlank( __DRIdrawablePrivate *priv, GLuint flags, | |||
GLuint *vbl_seq ) | |||
{ | |||
if ( priv->pdraw->swap_interval == (unsigned)-1 ) { | |||
/* Get current vertical blank sequence */ | |||
drmVBlank vbl = { .request={ .type = DRM_VBLANK_RELATIVE, .sequence = 0 } }; | |||
do_wait( &vbl, vbl_seq, priv->driScreenPriv->fd ); | |||
priv->pdraw->swap_interval = (flags & VBLANK_FLAG_THROTTLE) != 0 ? 1 : 0; | |||
} | |||
} | |||
/****************************************************************************/ | |||
/** | |||
* Waits for the vertical blank for use with glXSwapBuffers. |
@@ -47,7 +47,8 @@ extern int driGetMSC32( __DRIscreenPrivate * priv, int64_t * count ); | |||
extern int driWaitForMSC32( __DRIdrawablePrivate *priv, | |||
int64_t target_msc, int64_t divisor, int64_t remainder, int64_t * msc ); | |||
extern GLuint driGetDefaultVBlankFlags( const driOptionCache *optionCache ); | |||
extern void driDrawableInitVBlank ( __DRIdrawablePrivate *priv, GLuint flags ); | |||
extern void driDrawableInitVBlank ( __DRIdrawablePrivate *priv, GLuint flags, | |||
GLuint *vbl_seq ); | |||
extern int driWaitForVBlank( const __DRIdrawablePrivate *priv, | |||
GLuint * vbl_seq, GLuint flags, GLboolean * missed_deadline ); | |||
@@ -596,7 +596,8 @@ GLboolean intelMakeCurrent(__DRIcontextPrivate *driContextPriv, | |||
if ( intel->driDrawable != driDrawPriv ) { | |||
/* Shouldn't the readbuffer be stored also? */ | |||
driDrawableInitVBlank( driDrawPriv, intel->vblank_flags ); | |||
driDrawableInitVBlank( driDrawPriv, intel->vblank_flags, | |||
&intel->vbl_seq ); | |||
intel->driDrawable = driDrawPriv; | |||
intelWindowMoved( intel ); |
@@ -308,7 +308,8 @@ mach64MakeCurrent( __DRIcontextPrivate *driContextPriv, | |||
} | |||
driDrawableInitVBlank( driDrawPriv, newMach64Ctx->vblank_flags ); | |||
driDrawableInitVBlank( driDrawPriv, newMach64Ctx->vblank_flags, | |||
&newMach64Ctx->vbl_seq ); | |||
if ( newMach64Ctx->driDrawable != driDrawPriv ) { | |||
newMach64Ctx->driDrawable = driDrawPriv; |
@@ -878,7 +878,8 @@ mgaMakeCurrent(__DRIcontextPrivate *driContextPriv, | |||
mgaContextPtr mmesa = (mgaContextPtr) driContextPriv->driverPrivate; | |||
if (mmesa->driDrawable != driDrawPriv) { | |||
driDrawableInitVBlank( driDrawPriv, mmesa->vblank_flags ); | |||
driDrawableInitVBlank( driDrawPriv, mmesa->vblank_flags, | |||
&mmesa->vbl_seq ); | |||
mmesa->driDrawable = driDrawPriv; | |||
mmesa->dirty = ~0; | |||
mmesa->dirty_cliprects = (MGA_FRONT|MGA_BACK); |
@@ -345,7 +345,8 @@ r128MakeCurrent( __DRIcontextPrivate *driContextPriv, | |||
newR128Ctx->dirty = R128_UPLOAD_ALL; | |||
} | |||
driDrawableInitVBlank( driDrawPriv, newR128Ctx->vblank_flags ); | |||
driDrawableInitVBlank( driDrawPriv, newR128Ctx->vblank_flags, | |||
&newR128Ctx->vbl_seq ); | |||
newR128Ctx->driDrawable = driDrawPriv; | |||
_mesa_make_current( newR128Ctx->glCtx, |
@@ -694,7 +694,8 @@ r200MakeCurrent( __DRIcontextPrivate *driContextPriv, | |||
fprintf(stderr, "%s ctx %p\n", __FUNCTION__, (void *)newCtx->glCtx); | |||
if ( newCtx->dri.drawable != driDrawPriv ) { | |||
driDrawableInitVBlank( driDrawPriv, newCtx->vblank_flags ); | |||
driDrawableInitVBlank( driDrawPriv, newCtx->vblank_flags, | |||
&newCtx->vbl_seq ); | |||
newCtx->dri.drawable = driDrawPriv; | |||
r200UpdateWindow( newCtx->glCtx ); | |||
r200UpdateViewportOffset( newCtx->glCtx ); |
@@ -285,7 +285,8 @@ GLboolean radeonMakeCurrent(__DRIcontextPrivate * driContextPriv, | |||
if (radeon->dri.drawable != driDrawPriv) { | |||
driDrawableInitVBlank(driDrawPriv, | |||
radeon->vblank_flags); | |||
radeon->vblank_flags, | |||
&radeon->vbl_seq); | |||
radeon->dri.drawable = driDrawPriv; | |||
r300UpdateWindow(radeon->glCtx); |
@@ -620,7 +620,8 @@ radeonMakeCurrent( __DRIcontextPrivate *driContextPriv, | |||
if ( newCtx->dri.drawable != driDrawPriv ) { | |||
/* XXX we may need to validate the drawable here!!! */ | |||
driDrawableInitVBlank( driDrawPriv, newCtx->vblank_flags ); | |||
driDrawableInitVBlank( driDrawPriv, newCtx->vblank_flags, | |||
&newCtx->vbl_seq ); | |||
newCtx->dri.drawable = driDrawPriv; | |||
radeonUpdateWindow( newCtx->glCtx ); | |||
radeonUpdateViewportOffset( newCtx->glCtx ); |
@@ -815,7 +815,8 @@ viaMakeCurrent(__DRIcontextPrivate *driContextPriv, | |||
readBuffer = (GLframebuffer *)driReadPriv->driverPrivate; | |||
if ( vmesa->driDrawable != driDrawPriv ) { | |||
driDrawableInitVBlank( driDrawPriv, vmesa->vblank_flags ); | |||
driDrawableInitVBlank( driDrawPriv, vmesa->vblank_flags, | |||
&vmesa->vbl_seq ); | |||
vmesa->driDrawable = driDrawPriv; | |||
if ( ! calculate_buffer_parameters( vmesa, drawBuffer ) ) { | |||
return GL_FALSE; |