Parcourir la source

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.
tags/mesa_6_5_2
Michel Dänzer il y a 19 ans
Parent
révision
24bb3b3998

+ 19
- 14
src/mesa/drivers/dri/common/vblank.c Voir le fichier

@@ -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.

+ 2
- 1
src/mesa/drivers/dri/common/vblank.h Voir le fichier

@@ -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 );


+ 2
- 1
src/mesa/drivers/dri/i915/intel_context.c Voir le fichier

@@ -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 );

+ 2
- 1
src/mesa/drivers/dri/mach64/mach64_context.c Voir le fichier

@@ -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;

+ 2
- 1
src/mesa/drivers/dri/mga/mga_xmesa.c Voir le fichier

@@ -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);

+ 2
- 1
src/mesa/drivers/dri/r128/r128_context.c Voir le fichier

@@ -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,

+ 2
- 1
src/mesa/drivers/dri/r200/r200_context.c Voir le fichier

@@ -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 );

+ 2
- 1
src/mesa/drivers/dri/r300/radeon_context.c Voir le fichier

@@ -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);

+ 2
- 1
src/mesa/drivers/dri/radeon/radeon_context.c Voir le fichier

@@ -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 );

+ 2
- 1
src/mesa/drivers/dri/unichrome/via_context.c Voir le fichier

@@ -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;

Chargement…
Annuler
Enregistrer