mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 22:08:26 +02:00
Make driDrawableInitVBlank() initialize the sequence number.
This prevents the first wait for vertical blank from timing out when the X server has been running for a long time.
This commit is contained in:
parent
1d914fe465
commit
24bb3b3998
10 changed files with 37 additions and 23 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue