More vblank cleanups.
authorMichel Dänzer <michel@tungstengraphics.com>
Tue, 30 Oct 2007 12:16:50 +0000 (13:16 +0100)
committerMichel Dänzer <michel@tungstengraphics.com>
Tue, 30 Oct 2007 12:16:50 +0000 (13:16 +0100)
* Fix crash at context creation in most drivers supporting vblank.
* Don't pass vblank sequence or flags to functions that get passed the drawable
  private already.
* Attempt to initialize vblank related drawable private fields just once
  per drawable. May need more work in some drivers.

26 files changed:
src/mesa/drivers/dri/common/vblank.c
src/mesa/drivers/dri/common/vblank.h
src/mesa/drivers/dri/i915/intel_blit.c
src/mesa/drivers/dri/i915/intel_buffers.c
src/mesa/drivers/dri/i965/intel_blit.c
src/mesa/drivers/dri/i965/intel_blit.h
src/mesa/drivers/dri/i965/intel_buffers.c
src/mesa/drivers/dri/i965/intel_context.c
src/mesa/drivers/dri/mach64/mach64_context.c
src/mesa/drivers/dri/mach64/mach64_ioctl.c
src/mesa/drivers/dri/mga/mga_xmesa.c
src/mesa/drivers/dri/mga/mgaioctl.c
src/mesa/drivers/dri/mga/mgaioctl.h
src/mesa/drivers/dri/nouveau/nouveau_context.c
src/mesa/drivers/dri/r128/r128_context.c
src/mesa/drivers/dri/r128/r128_ioctl.c
src/mesa/drivers/dri/r200/r200_context.c
src/mesa/drivers/dri/r200/r200_ioctl.c
src/mesa/drivers/dri/r300/radeon_context.c
src/mesa/drivers/dri/r300/radeon_ioctl.c
src/mesa/drivers/dri/radeon/radeon_context.c
src/mesa/drivers/dri/radeon/radeon_context.h
src/mesa/drivers/dri/radeon/radeon_ioctl.c
src/mesa/drivers/dri/radeon/radeon_ioctl.h
src/mesa/drivers/dri/unichrome/via_context.c
src/mesa/drivers/dri/unichrome/via_ioctl.c

index 059644046329fcd936025e604e314a2425d719f3..8f8d94853ea9945002cdf33a0cf26bdbe87d7235 100644 (file)
@@ -299,6 +299,23 @@ static int do_wait( drmVBlank * vbl, GLuint * vbl_seq, int fd )
 }
 
 
+/****************************************************************************/
+/**
+ * Returns the default swap interval of the given drawable.
+ */
+
+static unsigned
+driGetDefaultVBlankInterval( const  __DRIdrawablePrivate *priv )
+{
+   if ( (priv->vblFlags & (VBLANK_FLAG_THROTTLE | VBLANK_FLAG_SYNC)) != 0 ) {
+      return 1;
+   }
+   else {
+      return 0;
+   }
+}
+
+
 /****************************************************************************/
 /**
  * Sets the default swap interval when the drawable is first bound to a
@@ -307,7 +324,8 @@ static int do_wait( drmVBlank * vbl, GLuint * vbl_seq, int fd )
 
 void driDrawableInitVBlank( __DRIdrawablePrivate *priv )
 {
-   if ( priv->swap_interval == (unsigned)-1 ) {
+   if ( priv->swap_interval == (unsigned)-1 &&
+       !( priv->vblFlags & VBLANK_FLAG_NO_IRQ ) ) {
       /* Get current vertical blank sequence */
       drmVBlank vbl;
  
@@ -318,8 +336,7 @@ void driDrawableInitVBlank( __DRIdrawablePrivate *priv )
       do_wait( &vbl, &priv->vblSeq, priv->driScreenPriv->fd );
       priv->vblank_base = priv->vblSeq;
 
-      priv->swap_interval =
-        (priv->vblFlags & (VBLANK_FLAG_THROTTLE | VBLANK_FLAG_SYNC)) ? 1 : 0;
+      priv->swap_interval = driGetDefaultVBlankInterval( priv );
    }
 }
 
@@ -330,21 +347,17 @@ void driDrawableInitVBlank( __DRIdrawablePrivate *priv )
  */
 
 unsigned
-driGetVBlankInterval( const  __DRIdrawablePrivate *priv, GLuint flags )
+driGetVBlankInterval( const  __DRIdrawablePrivate *priv )
 {
-   if ( (flags & VBLANK_FLAG_INTERVAL) != 0 ) {
+   if ( (priv->vblFlags & VBLANK_FLAG_INTERVAL) != 0 ) {
       /* this must have been initialized when the drawable was first bound
        * to a direct rendering context. */
       assert ( priv->swap_interval != (unsigned)-1 );
 
       return priv->swap_interval;
    }
-   else if ( (flags & (VBLANK_FLAG_THROTTLE | VBLANK_FLAG_SYNC)) != 0 ) {
-      return 1;
-   }
-   else {
-      return 0;
-   }
+   else 
+      return driGetDefaultVBlankInterval( priv );
 }
 
 
@@ -354,18 +367,17 @@ driGetVBlankInterval( const  __DRIdrawablePrivate *priv, GLuint flags )
  */
 
 void
-driGetCurrentVBlank( const  __DRIdrawablePrivate *priv, GLuint flags,
-                    GLuint *vbl_seq )
+driGetCurrentVBlank( __DRIdrawablePrivate *priv )
 {
    drmVBlank vbl;
 
    vbl.request.type = DRM_VBLANK_RELATIVE;
-   if ( flags & VBLANK_FLAG_SECONDARY ) {
+   if ( priv->vblFlags & VBLANK_FLAG_SECONDARY ) {
       vbl.request.type |= DRM_VBLANK_SECONDARY;
    }
    vbl.request.sequence = 0;
 
-   (void) do_wait( &vbl, vbl_seq, priv->driScreenPriv->fd );
+   (void) do_wait( &vbl, &priv->vblSeq, priv->driScreenPriv->fd );
 }
 
 
@@ -373,19 +385,15 @@ driGetCurrentVBlank( const  __DRIdrawablePrivate *priv, GLuint flags,
 /**
  * Waits for the vertical blank for use with glXSwapBuffers.
  * 
- * \param vbl_seq  Vertical blank sequence number (MSC) after the last buffer
- *                 swap.  Updated after this wait.
- * \param flags    \c VBLANK_FLAG bits that control how long to wait.
  * \param missed_deadline  Set to \c GL_TRUE if the MSC after waiting is later
- *                 than the "target" based on \c flags.  The idea is that if
- *                 \c missed_deadline is set, then the application is not 
- *                 achieving its desired framerate.
+ *                 than the "target" based on \c priv->vblFlags.  The idea is
+ *                 that if \c missed_deadline is set, then the application is
+ *                 not achieving its desired framerate.
  * \return         Zero on success, -1 on error.
  */
 
 int
-driWaitForVBlank( const  __DRIdrawablePrivate *priv, GLuint * vbl_seq,
-                 GLuint flags, GLboolean * missed_deadline )
+driWaitForVBlank( __DRIdrawablePrivate *priv, GLboolean * missed_deadline )
 {
    drmVBlank vbl;
    unsigned   original_seq;
@@ -394,10 +402,10 @@ driWaitForVBlank( const  __DRIdrawablePrivate *priv, GLuint * vbl_seq,
    unsigned   diff;
 
    *missed_deadline = GL_FALSE;
-   if ( (flags & (VBLANK_FLAG_INTERVAL |
-                 VBLANK_FLAG_THROTTLE |
-                 VBLANK_FLAG_SYNC)) == 0 ||
-       (flags & VBLANK_FLAG_NO_IRQ) != 0 ) {
+   if ( (priv->vblFlags & (VBLANK_FLAG_INTERVAL |
+                          VBLANK_FLAG_THROTTLE |
+                          VBLANK_FLAG_SYNC)) == 0 ||
+       (priv->vblFlags & VBLANK_FLAG_NO_IRQ) != 0 ) {
       return 0;
    }
 
@@ -408,44 +416,45 @@ driWaitForVBlank( const  __DRIdrawablePrivate *priv, GLuint * vbl_seq,
     *
     * VBLANK_FLAG_INTERVAL and VBLANK_FLAG_THROTTLE mean to wait for at
     * least one vertical blank since the last wait.  Since do_wait modifies
-    * vbl_seq, we have to save the original value of vbl_seq for the
+    * priv->vblSeq, we have to save the original value of priv->vblSeq for the
     * VBLANK_FLAG_INTERVAL / VBLANK_FLAG_THROTTLE calculation later.
     */
 
-   original_seq = *vbl_seq;
-   interval = driGetVBlankInterval(priv, flags);
+   original_seq = priv->vblSeq;
+   interval = driGetVBlankInterval(priv);
    deadline = original_seq + interval;
 
    vbl.request.type = DRM_VBLANK_RELATIVE;
-   if ( flags & VBLANK_FLAG_SECONDARY ) {
+   if ( priv->vblFlags & VBLANK_FLAG_SECONDARY ) {
       vbl.request.type |= DRM_VBLANK_SECONDARY;
    }
-   vbl.request.sequence = ((flags & VBLANK_FLAG_SYNC) != 0) ? 1 : 0;
+   vbl.request.sequence = ((priv->vblFlags & VBLANK_FLAG_SYNC) != 0) ? 1 : 0;
 
-   if ( do_wait( & vbl, vbl_seq, priv->driScreenPriv->fd ) != 0 ) {
+   if ( do_wait( & vbl, &priv->vblSeq, priv->driScreenPriv->fd ) != 0 ) {
       return -1;
    }
 
-   diff = *vbl_seq - deadline;
+   diff = priv->vblSeq - deadline;
 
    /* No need to wait again if we've already reached the target */
    if (diff <= (1 << 23)) {
-      *missed_deadline = (flags & VBLANK_FLAG_SYNC) ? (diff > 0) : GL_TRUE;
+      *missed_deadline = (priv->vblFlags & VBLANK_FLAG_SYNC) ? (diff > 0) :
+                        GL_TRUE;
       return 0;
    }
 
    /* Wait until the target vertical blank. */
    vbl.request.type = DRM_VBLANK_ABSOLUTE;
-   if ( flags & VBLANK_FLAG_SECONDARY ) {
+   if ( priv->vblFlags & VBLANK_FLAG_SECONDARY ) {
       vbl.request.type |= DRM_VBLANK_SECONDARY;
    }
    vbl.request.sequence = deadline;
 
-   if ( do_wait( & vbl, vbl_seq, priv->driScreenPriv->fd ) != 0 ) {
+   if ( do_wait( & vbl, &priv->vblSeq, priv->driScreenPriv->fd ) != 0 ) {
       return -1;
    }
 
-   diff = *vbl_seq - deadline;
+   diff = priv->vblSeq - deadline;
    *missed_deadline = diff > 0 && diff <= (1 << 23);
 
    return 0;
index e8550b281244ed2332783d350adf335858565834..4613c09222e8233425320ea3b02e7f5f8734c75a 100644 (file)
@@ -53,12 +53,10 @@ 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 );
-extern unsigned driGetVBlankInterval( const  __DRIdrawablePrivate *priv,
-                                     GLuint flags );
-extern void driGetCurrentVBlank( const  __DRIdrawablePrivate *priv,
-                                GLuint flags, GLuint *vbl_seq );
-extern int driWaitForVBlank( const __DRIdrawablePrivate *priv,
-    GLuint * vbl_seq, GLuint flags, GLboolean * missed_deadline );
+extern unsigned driGetVBlankInterval( const  __DRIdrawablePrivate *priv );
+extern void driGetCurrentVBlank( __DRIdrawablePrivate *priv );
+extern int driWaitForVBlank( __DRIdrawablePrivate *priv,
+                            GLboolean * missed_deadline );
 
 #undef usleep
 #include <unistd.h>  /* for usleep() */
index 2d4d00edefdfddff3a372b8603a1ed523fd651d5..2761136f47f3eebc3abb5e924e2a0f36db0f481a 100644 (file)
@@ -40,7 +40,6 @@
 #include "intel_fbo.h"
 #include "intel_reg.h"
 #include "intel_regions.h"
-#include "vblank.h"
 
 #define FILE_DEBUG_FLAG DEBUG_BLIT
 
index faa13adbcb3f903dde150ff3484e0eda9ed2e848..1ae8b5feb4c6ae439ea89f52e5bc1856c2c3eabf 100644 (file)
@@ -351,7 +351,7 @@ intelWindowMoved(struct intel_context *intel)
          * Then get new vblank_base and vblSeq values
          */
         dPriv->vblFlags = flags;
-        driGetCurrentVBlank(dPriv, dPriv->vblFlags, &dPriv->vblSeq);
+        driGetCurrentVBlank(dPriv);
         dPriv->vblank_base = dPriv->vblSeq;
 
         intel_fb->vbl_waited = dPriv->vblSeq;
@@ -838,7 +838,7 @@ static GLboolean
 intelScheduleSwap(__DRIdrawablePrivate * dPriv, GLboolean *missed_target)
 {
    struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
-   unsigned int interval = driGetVBlankInterval(dPriv, dPriv->vblFlags);
+   unsigned int interval;
    struct intel_context *intel =
       intelScreenContext(dPriv->driScreenPriv->private);
    const intelScreenPrivate *intelScreen = intel->intelScreen;
@@ -852,6 +852,8 @@ intelScheduleSwap(__DRIdrawablePrivate * dPriv, GLboolean *missed_target)
        intelScreen->drmMinor < (intel_fb->pf_active ? 9 : 6))
       return GL_FALSE;
 
+   interval = driGetVBlankInterval(dPriv);
+
    swap.seqtype = DRM_VBLANK_ABSOLUTE;
 
    if (dPriv->vblFlags & VBLANK_FLAG_SYNC) {
@@ -933,8 +935,7 @@ intelSwapBuffers(__DRIdrawablePrivate * dPriv)
 
          if (screen->current_rotation != 0 ||
             !intelScheduleSwap(dPriv, &missed_target)) {
-           driWaitForVBlank(dPriv, &dPriv->vblSeq, dPriv->vblFlags,
-                            &missed_target);
+           driWaitForVBlank(dPriv, &missed_target);
 
            if (screen->current_rotation != 0 || !intelPageFlip(dPriv)) {
               intelCopyBuffer(dPriv, NULL);
index 6343f613cc9df681188a01c8010c40521ffd5673..31fe20fb2adc39fa74e6942109e3df7a7657fa14 100644 (file)
@@ -49,7 +49,7 @@
 /*
  * Copy the back buffer to the front buffer. 
  */
-void intelCopyBuffer( const __DRIdrawablePrivate *dPriv,
+void intelCopyBuffer( __DRIdrawablePrivate *dPriv,
                      const drm_clip_rect_t *rect ) 
 {
    struct intel_context *intel;
@@ -76,8 +76,7 @@ void intelCopyBuffer( const __DRIdrawablePrivate *dPriv,
    if (!rect)
    {
        UNLOCK_HARDWARE( intel );
-       driWaitForVBlank( dPriv, &dPriv->vblSeq, dPriv->vblFlags,
-                        &missed_target );
+       driWaitForVBlank( dPriv, &missed_target );
        LOCK_HARDWARE( intel );
    }
 
index e361545c8fab316c2e4315734fd69a1ec7a82642..1412baf1c0fc08a4ed0730e61c452d0d9dcf3afd 100644 (file)
@@ -33,7 +33,7 @@
 
 struct buffer;
 
-extern void intelCopyBuffer( const __DRIdrawablePrivate *dpriv,
+extern void intelCopyBuffer( __DRIdrawablePrivate *dpriv,
                             const drm_clip_rect_t *rect );
 extern void intelClearWithBlit(GLcontext *ctx, GLbitfield mask);
 
index 96ef9d8c208a61bb78b3b01f93a9440aca4f52fb..406aa93d06dff28922b5872fa647d1c0ccf1aa09 100644 (file)
@@ -229,7 +229,7 @@ void intelWindowMoved( struct intel_context *intel )
          * Then get new vblank_base and vblSeq values
          */
         dPriv->vblFlags = flags;
-        driGetCurrentVBlank(dPriv, dPriv->vblFlags, &dPriv->vblSeq);
+        driGetCurrentVBlank(dPriv);
         dPriv->vblank_base = dPriv->vblSeq;
       }
    } else {
index d654d2d30dea089e703330853c29e2f14415443f..49431b2a0b292351fd7bfae1f05369dcd25eeff4 100644 (file)
@@ -589,19 +589,21 @@ GLboolean intelMakeCurrent(__DRIcontextPrivate *driContextPriv,
    if (driContextPriv) {
       struct intel_context *intel = (struct intel_context *) driContextPriv->driverPrivate;
 
-      driDrawPriv->vblFlags = (intel->intelScreen->irq_active != 0)
-         ? driGetDefaultVBlankFlags(&intel->optionCache) : VBLANK_FLAG_NO_IRQ;
-
-
       if (intel->driReadDrawable != driReadPriv) {
           intel->driReadDrawable = driReadPriv;
       }
 
       if ( intel->driDrawable != driDrawPriv ) {
+        if (driDrawPriv->swap_interval == (unsigned)-1) {
+           driDrawPriv->vblFlags = (intel->intelScreen->irq_active != 0)
+              ? driGetDefaultVBlankFlags(&intel->optionCache)
+              : VBLANK_FLAG_NO_IRQ;
+           driDrawableInitVBlank( driDrawPriv );
+        }
+
         intel->driDrawable = driDrawPriv;
         intelWindowMoved( intel );
         /* Shouldn't the readbuffer be stored also? */
-        driDrawableInitVBlank( driDrawPriv );
       }
 
       _mesa_make_current(&intel->ctx,
index 138e84decb9e2c1d5715d7a1e4f5d1df1a46b7eb..f730c831e4d11c1b6358d8cc356002af90badc6a 100644 (file)
@@ -100,7 +100,6 @@ GLboolean mach64CreateContext( const __GLcontextModes *glVisual,
 {
    GLcontext *ctx, *shareCtx;
    __DRIscreenPrivate *driScreen = driContextPriv->driScreenPriv;
-   __DRIdrawablePrivate *dPriv = driContextPriv->driDrawablePriv;
    struct dd_function_table functions;
    mach64ContextPtr mmesa;
    mach64ScreenPtr mach64Screen;
@@ -254,9 +253,6 @@ GLboolean mach64CreateContext( const __GLcontextModes *glVisual,
 
    mmesa->do_irqs = (mmesa->mach64Screen->irq && !getenv("MACH64_NO_IRQS"));
 
-   dPriv->vblFlags = (mmesa->do_irqs)
-      ? driGetDefaultVBlankFlags(&mmesa->optionCache) : VBLANK_FLAG_NO_IRQ;
-
    driContextPriv->driverPrivate = (void *)mmesa;
 
    if (driQueryOptionb(&mmesa->optionCache, "no_rast")) {
@@ -331,9 +327,15 @@ mach64MakeCurrent( __DRIcontextPrivate *driContextPriv,
       }
 
       
-      driDrawableInitVBlank( driDrawPriv );
-
       if ( newMach64Ctx->driDrawable != driDrawPriv ) {
+        if (driDrawPriv->swap_interval == (unsigned)-1) {
+           driDrawPriv->vblFlags = (newMach64Ctx->do_irqs)
+              ? driGetDefaultVBlankFlags(&newMach64Ctx->optionCache)
+              : VBLANK_FLAG_NO_IRQ;
+
+           driDrawableInitVBlank( driDrawPriv );
+        }
+
         newMach64Ctx->driDrawable = driDrawPriv;
         mach64CalcViewport( newMach64Ctx->glCtx );
       }
index 7405a27f8eb4b7c722491642bcf75d462e24a13f..3bcec50cf81e1ea793ad3134da0301dfd96a984c 100644 (file)
@@ -320,7 +320,7 @@ void mach64CopyBuffer( __DRIdrawablePrivate *dPriv )
 #endif
 
    UNLOCK_HARDWARE( mmesa );
-   driWaitForVBlank( dPriv, &dPriv->vblSeq, dPriv->vblFlags, &missed_target );
+   driWaitForVBlank( dPriv, &missed_target );
    LOCK_HARDWARE( mmesa );
 
    /* use front buffer cliprects */
index 31042f9739b88f054648b4c40fed755daad7b58f..896f2d94fc690eb677c3b093f1fac4d782536776 100644 (file)
@@ -452,7 +452,6 @@ mgaCreateContext( const __GLcontextModes *mesaVis,
    GLcontext *ctx, *shareCtx;
    mgaContextPtr mmesa;
    __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
-   __DRIdrawablePrivate *dPriv = driContextPriv->driDrawablePriv;
    mgaScreenPrivate *mgaScreen = (mgaScreenPrivate *)sPriv->private;
    drm_mga_sarea_t *saPriv = (drm_mga_sarea_t *)(((char*)sPriv->pSAREA)+
                                              mgaScreen->sarea_priv_offset);
@@ -651,9 +650,6 @@ mgaCreateContext( const __GLcontextModes *mesaVis,
                                    debug_control );
 #endif
 
-   dPriv->vblFlags = (mmesa->mgaScreen->irq == 0)
-       ? VBLANK_FLAG_NO_IRQ : driGetDefaultVBlankFlags(&mmesa->optionCache);
-
    (*dri_interface->getUST)( & mmesa->swap_ust );
 
    if (driQueryOptionb(&mmesa->optionCache, "no_rast")) {
@@ -883,7 +879,13 @@ mgaMakeCurrent(__DRIcontextPrivate *driContextPriv,
       mgaContextPtr mmesa = (mgaContextPtr) driContextPriv->driverPrivate;
 
       if (mmesa->driDrawable != driDrawPriv) {
-        driDrawableInitVBlank( driDrawPriv );
+        if (driDrawPriv->swap_interval == (unsigned)-1) {
+           driDrawPriv->vblFlags = (mmesa->mgaScreen->irq == 0)
+              ? VBLANK_FLAG_NO_IRQ
+              : driGetDefaultVBlankFlags(&mmesa->optionCache);
+
+           driDrawableInitVBlank( driDrawPriv );
+        }
 
         mmesa->driDrawable = driDrawPriv;
         mmesa->dirty = ~0; 
index 94126a31f91e1fbaf225f7084f13c1407f5a6f44..ff26b9475b9e9271aa1445c190062a2505e0331c 100644 (file)
@@ -409,7 +409,7 @@ static void mgaWaitForFrameCompletion( mgaContextPtr mmesa )
 /*
  * Copy the back buffer to the front buffer.
  */
-void mgaCopyBuffer( const __DRIdrawablePrivate *dPriv )
+void mgaCopyBuffer( __DRIdrawablePrivate *dPriv )
 {
    mgaContextPtr mmesa;
    drm_clip_rect_t *pbox;
@@ -428,7 +428,7 @@ void mgaCopyBuffer( const __DRIdrawablePrivate *dPriv )
    FLUSH_BATCH( mmesa );
 
    mgaWaitForFrameCompletion( mmesa );
-   driWaitForVBlank( dPriv, & dPriv->vblSeq, dPriv->vblFlags, & missed_target );
+   driWaitForVBlank( dPriv, & missed_target );
    if ( missed_target ) {
       mmesa->swap_missed_count++;
       (void) (*dri_interface->getUST)( & mmesa->swap_missed_ust );
index f3ae749ca992b56f6777727a9a6304952e1637d7..0ea0ba1acd4848bd23687fd41e55a2e5f4b4b4df 100644 (file)
@@ -33,7 +33,7 @@
 #include "mgacontext.h"
 #include "mga_xmesa.h"
 
-void mgaCopyBuffer( const __DRIdrawablePrivate *dPriv );
+void mgaCopyBuffer( __DRIdrawablePrivate *dPriv );
 void mgaWaitForVBlank( mgaContextPtr mmesa );
 
 void mgaGetILoadBufferLocked( mgaContextPtr mmesa );
index 5ef24d827064a000f044c82dd75e329df48f3177..4f4128c875d797d9d207388863ff1957cd1471e9 100644 (file)
@@ -283,7 +283,13 @@ GLboolean nouveauMakeCurrent( __DRIcontextPrivate *driContextPriv,
                struct gl_framebuffer *read_fb =
                        (struct gl_framebuffer*)driReadPriv->driverPrivate;
 
-               driDrawableInitVBlank(driDrawPriv);
+               if (driDrawPriv->swap_interval == (unsigned)-1) {
+                       driDrawPriv->vblFlags =
+                               driGetDefaultVBlankFlags(&nmesa->optionCache);
+
+                       driDrawableInitVBlank(driDrawPriv);
+               }
+
                nmesa->driDrawable = driDrawPriv;
 
                _mesa_resize_framebuffer(nmesa->glCtx, draw_fb,
index 25efe5e4cd744087e713dd9ca2fa21117de5e88b..cdea77642bd3a6cf49202aa8c165fe5cf8025827 100644 (file)
@@ -113,7 +113,6 @@ GLboolean r128CreateContext( const __GLcontextModes *glVisual,
 {
    GLcontext *ctx, *shareCtx;
    __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
-   __DRIdrawablePrivate *dPriv = driContextPriv->driDrawablePriv;
    struct dd_function_table functions;
    r128ContextPtr rmesa;
    r128ScreenPtr r128scrn;
@@ -263,9 +262,6 @@ GLboolean r128CreateContext( const __GLcontextModes *glVisual,
    r128DDInitSpanFuncs( ctx );
    r128DDInitState( rmesa );
 
-   dPriv->vblFlags = (rmesa->r128Screen->irq != 0)
-       ? driGetDefaultVBlankFlags(&rmesa->optionCache) : VBLANK_FLAG_NO_IRQ;
-
    driContextPriv->driverPrivate = (void *)rmesa;
 
 #if DO_DEBUG
@@ -348,7 +344,13 @@ r128MakeCurrent( __DRIcontextPrivate *driContextPriv,
         newR128Ctx->dirty = R128_UPLOAD_ALL;
       }
 
-      driDrawableInitVBlank( driDrawPriv );
+      if (driDrawPriv->swap_interval == (unsigned)-1) {
+        driDrawPriv->vblFlags = (newR128Ctx->r128Screen->irq != 0)
+           ? driGetDefaultVBlankFlags(&newR128Ctx->optionCache)
+           : VBLANK_FLAG_NO_IRQ;
+
+        driDrawableInitVBlank( driDrawPriv );
+      }
       newR128Ctx->driDrawable = driDrawPriv;
 
       _mesa_make_current( newR128Ctx->glCtx,
index e04c0872f0d823434bc08448d2e446a1c431d704..034261a53545c9bb1bb11488e51a1fc543afd27b 100644 (file)
@@ -282,7 +282,7 @@ void r128CopyBuffer( __DRIdrawablePrivate *dPriv )
    }
 
    UNLOCK_HARDWARE( rmesa );
-   driWaitForVBlank( dPriv, &dPriv->vblSeq, dPriv->vblFlags, &missed_target );
+   driWaitForVBlank( dPriv, &missed_target );
    LOCK_HARDWARE( rmesa );
 
    nbox = dPriv->numClipRects; /* must be in locked region */
@@ -359,7 +359,7 @@ void r128PageFlip( __DRIdrawablePrivate *dPriv )
    }
 
    UNLOCK_HARDWARE( rmesa );
-   driWaitForVBlank( dPriv, &dPriv->vblSeq, dPriv->vblFlags, &missed_target );
+   driWaitForVBlank( dPriv, &missed_target );
    LOCK_HARDWARE( rmesa );
 
    /* The kernel will have been initialized to perform page flipping
index 2b188897f1ea654e320081db86eee1c077c5759e..982bd9e62a80ffc0d5e8273574a532b727998e55 100644 (file)
@@ -248,7 +248,6 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual,
                             void *sharedContextPrivate)
 {
    __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
-   __DRIdrawablePrivate *dPriv = driContextPriv->driDrawablePriv;
    radeonScreenPtr screen = (radeonScreenPtr)(sPriv->private);
    struct dd_function_table functions;
    r200ContextPtr rmesa;
@@ -500,9 +499,6 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual,
              fthrottle_mode,
              rmesa->r200Screen->irq);
 
-   dPriv->vblFlags = (rmesa->r200Screen->irq != 0)
-       ? driGetDefaultVBlankFlags(&rmesa->optionCache) : VBLANK_FLAG_NO_IRQ;
-
    rmesa->prefer_gart_client_texturing = 
       (getenv("R200_GART_CLIENT_TEXTURES") != 0);
 
@@ -667,14 +663,18 @@ r200MakeCurrent( __DRIcontextPrivate *driContextPriv,
       if (R200_DEBUG & DEBUG_DRI)
         fprintf(stderr, "%s ctx %p\n", __FUNCTION__, (void *)newCtx->glCtx);
 
-      if ( newCtx->dri.drawable != driDrawPriv ) {
-         driDrawableInitVBlank( driDrawPriv );
-      }
-
       newCtx->dri.readable = driReadPriv;
 
       if ( newCtx->dri.drawable != driDrawPriv ||
            newCtx->lastStamp != driDrawPriv->lastStamp ) {
+        if (driDrawPriv->swap_interval == (unsigned)-1) {
+           driDrawPriv->vblFlags = (newCtx->r200Screen->irq != 0)
+              ? driGetDefaultVBlankFlags(&newCtx->optionCache)
+              : VBLANK_FLAG_NO_IRQ;
+
+           driDrawableInitVBlank( driDrawPriv );
+        }
+
         newCtx->dri.drawable = driDrawPriv;
 
         r200SetCliprects(newCtx);
index 2ab9ff8a467bf2377201fdfcf3a5c9e4a10296b0..34e7ada34b4d0466e7c48ec4b610825864d6157c 100644 (file)
@@ -449,7 +449,7 @@ void r200CopyBuffer( __DRIdrawablePrivate *dPriv,
    if (!rect)
    {
        UNLOCK_HARDWARE( rmesa );
-       driWaitForVBlank( dPriv, & dPriv->vblSeq, dPriv->vblFlags, & missed_target );
+       driWaitForVBlank( dPriv, & missed_target );
        LOCK_HARDWARE( rmesa );
    }
 
@@ -553,7 +553,7 @@ void r200PageFlip( __DRIdrawablePrivate *dPriv )
     */
    r200WaitForFrameCompletion( rmesa );
    UNLOCK_HARDWARE( rmesa );
-   driWaitForVBlank( dPriv, & dPriv->vblSeq, dPriv->vblFlags, & missed_target );
+   driWaitForVBlank( dPriv, & missed_target );
    if ( missed_target ) {
       rmesa->swap_missed_count++;
       (void) (*dri_interface->getUST)( & rmesa->swap_missed_ust );
index 8316b745cef4892fc6864a15619d2686d8b66922..787d4b5c57c7b818c045c4199f4bbfcbf24a8b8d 100644 (file)
@@ -127,7 +127,6 @@ GLboolean radeonInitContext(radeonContextPtr radeon,
                            void *sharedContextPrivate)
 {
        __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
-       __DRIdrawablePrivate *dPriv = driContextPriv->driDrawablePriv;
        radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private);
        GLcontext* ctx;
        GLcontext* shareCtx;
@@ -178,9 +177,6 @@ GLboolean radeonInitContext(radeonContextPtr radeon,
                        radeon->do_usleeps ? "usleeps" : "busy waits",
                        fthrottle_mode, radeon->radeonScreen->irq);
 
-       dPriv->vblFlags = (radeon->radeonScreen->irq != 0)
-           ? driGetDefaultVBlankFlags(&radeon->optionCache) : VBLANK_FLAG_NO_IRQ;
-
        (*dri_interface->getUST) (&radeon->swap_ust);
 
        return GL_TRUE;
@@ -278,7 +274,15 @@ GLboolean radeonMakeCurrent(__DRIcontextPrivate * driContextPriv,
                                radeon->glCtx);
 
                if (radeon->dri.drawable != driDrawPriv) {
-                   driDrawableInitVBlank(driDrawPriv);
+                       if (driDrawPriv->swap_interval == (unsigned)-1) {
+                               driDrawPriv->vblFlags =
+                                       (radeon->radeonScreen->irq != 0)
+                                       ? driGetDefaultVBlankFlags(&radeon->
+                                                                  optionCache)
+                                       : VBLANK_FLAG_NO_IRQ;
+
+                               driDrawableInitVBlank(driDrawPriv);
+                       }
                }
 
                radeon->dri.readable = driReadPriv;
index eeef71aaaffc42d560d84c4e9786a5e3b78ac8e1..866b1deaa057794a256f194c6a39e45473727c2d 100644 (file)
@@ -187,8 +187,7 @@ void radeonCopyBuffer(__DRIdrawablePrivate * dPriv,
        if (!rect)
        {
            UNLOCK_HARDWARE(radeon);
-           driWaitForVBlank(dPriv, &dPriv->vblSeq, dPriv->vblFlags,
-                            &missed_target);
+           driWaitForVBlank(dPriv, &missed_target);
            LOCK_HARDWARE(radeon);
        }
 
@@ -293,8 +292,7 @@ void radeonPageFlip(__DRIdrawablePrivate * dPriv)
         */
        radeonWaitForFrameCompletion(radeon);
        UNLOCK_HARDWARE(radeon);
-       driWaitForVBlank(dPriv, &dPriv->vblSeq, dPriv->vblFlags,
-                        &missed_target);
+       driWaitForVBlank(dPriv, &missed_target);
        if (missed_target) {
                radeon->swap_missed_count++;
                (void)(*dri_interface->getUST) (&radeon->swap_missed_ust);
index fe6d3c21b8077cfdd47e69f4c5516effb922e7ed..18d9b0b65a5b640ca6c55491ec8297177386d183 100644 (file)
@@ -424,9 +424,6 @@ radeonCreateContext( const __GLcontextModes *glVisual,
 
    rmesa->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS);
 
-   rmesa->vblank_flags = (rmesa->radeonScreen->irq != 0)
-       ? driGetDefaultVBlankFlags(&rmesa->optionCache) : VBLANK_FLAG_NO_IRQ;
-
    (*dri_interface->getUST)( & rmesa->swap_ust );
 
 
@@ -592,15 +589,18 @@ radeonMakeCurrent( __DRIcontextPrivate *driContextPriv,
       if (RADEON_DEBUG & DEBUG_DRI)
         fprintf(stderr, "%s ctx %p\n", __FUNCTION__, (void *) newCtx->glCtx);
 
-      if ( newCtx->dri.drawable != driDrawPriv ) {
-         /* XXX we may need to validate the drawable here!!! */
-         driDrawableInitVBlank( driDrawPriv );
-      }
-
       newCtx->dri.readable = driReadPriv;
 
       if ( (newCtx->dri.drawable != driDrawPriv) ||
            newCtx->lastStamp != driDrawPriv->lastStamp ) {
+        if (driDrawPriv->swap_interval == (unsigned)-1) {
+           driDrawPriv->vblFlags = (newCtx->radeonScreen->irq != 0)
+              ? driGetDefaultVBlankFlags(&newCtx->optionCache)
+              : VBLANK_FLAG_NO_IRQ;
+
+           driDrawableInitVBlank( driDrawPriv );
+        }
+
         newCtx->dri.drawable = driDrawPriv;
 
         radeonSetCliprects(newCtx);
index 8dedd66f563f8a9e5edcc8416ec4b11f93118acb..b4ffde5d54076349248fd7c75f12058f1235468f 100644 (file)
@@ -667,9 +667,6 @@ struct radeon_context {
 
        /* VBI
         */
-       GLuint vbl_seq;
-       GLuint vblank_flags;
-
        int64_t swap_ust;
        int64_t swap_missed_ust;
 
index 4c64bc201ae598a72df3947e39a356e7f667da38..2430158db2d03f0c385871416e90cbcac9d7a122 100644 (file)
@@ -863,7 +863,7 @@ static void radeonWaitForFrameCompletion( radeonContextPtr rmesa )
 
 /* Copy the back color buffer to the front color buffer.
  */
-void radeonCopyBuffer( const __DRIdrawablePrivate *dPriv,
+void radeonCopyBuffer( __DRIdrawablePrivate *dPriv,
                       const drm_clip_rect_t      *rect)
 {
    radeonContextPtr rmesa;
@@ -891,7 +891,7 @@ void radeonCopyBuffer( const __DRIdrawablePrivate *dPriv,
    if (!rect)
    {
        UNLOCK_HARDWARE( rmesa );
-       driWaitForVBlank( dPriv, & rmesa->vbl_seq, rmesa->vblank_flags, & missed_target );
+       driWaitForVBlank( dPriv, & missed_target );
        LOCK_HARDWARE( rmesa );
    }
 
@@ -952,7 +952,7 @@ void radeonCopyBuffer( const __DRIdrawablePrivate *dPriv,
    }
 }
 
-void radeonPageFlip( const __DRIdrawablePrivate *dPriv )
+void radeonPageFlip( __DRIdrawablePrivate *dPriv )
 {
    radeonContextPtr rmesa;
    GLint ret;
@@ -987,7 +987,7 @@ void radeonPageFlip( const __DRIdrawablePrivate *dPriv )
     */
    radeonWaitForFrameCompletion( rmesa );
    UNLOCK_HARDWARE( rmesa );
-   driWaitForVBlank( dPriv, & rmesa->vbl_seq, rmesa->vblank_flags, & missed_target );
+   driWaitForVBlank( dPriv, & missed_target );
    if ( missed_target ) {
       rmesa->swap_missed_count++;
       (void) (*dri_interface->getUST)( & rmesa->swap_missed_ust );
index 11a7d02b1b7a0b8582adc9f1d36608fe165dbf6a..b8d68eec8673e0998f4c98ad48cd0903dfb6d4ee 100644 (file)
@@ -87,9 +87,9 @@ extern void radeonReleaseDmaRegion( radeonContextPtr rmesa,
                                    struct radeon_dma_region *region,
                                    const char *caller );
 
-extern void radeonCopyBuffer( const __DRIdrawablePrivate *drawable,
+extern void radeonCopyBuffer( __DRIdrawablePrivate *drawable,
                              const drm_clip_rect_t      *rect);
-extern void radeonPageFlip( const __DRIdrawablePrivate *drawable );
+extern void radeonPageFlip( __DRIdrawablePrivate *drawable );
 extern void radeonFlush( GLcontext *ctx );
 extern void radeonFinish( GLcontext *ctx );
 extern void radeonWaitForIdleLocked( radeonContextPtr rmesa );
index 5d95d97d5391fdc5398005cf4d12ffa12478af4f..1551be5e7514b90320d8226672e40ed5a324ac6b 100644 (file)
@@ -465,7 +465,6 @@ viaCreateContext(const __GLcontextModes *visual,
     GLcontext *ctx, *shareCtx;
     struct via_context *vmesa;
     __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
-    __DRIdrawablePrivate *dPriv = driContextPriv->driDrawablePriv;
     viaScreenPrivate *viaScreen = (viaScreenPrivate *)sPriv->private;
     drm_via_sarea_t *saPriv = (drm_via_sarea_t *)
         (((GLubyte *)sPriv->pSAREA) + viaScreen->sareaPrivOffset);
@@ -659,10 +658,6 @@ viaCreateContext(const __GLcontextModes *visual,
         driQueryOptionb(&vmesa->optionCache, "no_rast"))
        FALLBACK(vmesa, VIA_FALLBACK_USER_DISABLE, 1);
 
-    dPriv->vblFlags =
-       vmesa->viaScreen->irqEnabled ?
-        driGetDefaultVBlankFlags(&vmesa->optionCache) : VBLANK_FLAG_NO_IRQ;
-
     if (getenv("VIA_PAGEFLIP"))
        vmesa->allowPageFlip = 1;
 
@@ -838,12 +833,17 @@ viaMakeCurrent(__DRIcontextPrivate *driContextPriv,
         drawBuffer = (GLframebuffer *)driDrawPriv->driverPrivate;
         readBuffer = (GLframebuffer *)driReadPriv->driverPrivate;
 
-       if (vmesa->driDrawable != driDrawPriv) {
-           driDrawableInitVBlank(driDrawPriv);
-       }
-
        if ((vmesa->driDrawable != driDrawPriv)
           || (vmesa->driReadable != driReadPriv)) {
+         if (driDrawPriv->swap_interval == (unsigned)-1) {
+            driDrawPriv->vblFlags =
+               vmesa->viaScreen->irqEnabled ?
+               driGetDefaultVBlankFlags(&vmesa->optionCache) :
+               VBLANK_FLAG_NO_IRQ;
+
+            driDrawableInitVBlank(driDrawPriv);
+         }
+
          vmesa->driDrawable = driDrawPriv;
          vmesa->driReadable = driReadPriv;
 
index 3c7dafd0e6baaa2777e5c785921fea3ef3e44c96..a14a4613d3e4ae3d5f146d09fd9d8e6d7391b7ee 100644 (file)
@@ -523,8 +523,7 @@ static void viaWaitIdleVBlank(  __DRIdrawablePrivate *dPriv,
          vmesa->thrashing)
         viaSwapOutWork(vmesa);
 
-      driWaitForVBlank( dPriv, & dPriv->vblSeq, dPriv->vblFlags,
-                       & missed_target );
+      driWaitForVBlank( dPriv, & missed_target );
       if ( missed_target ) {
         vmesa->swap_missed_count++;
         (*dri_interface->getUST)( &vmesa->swap_missed_ust );