glx: move the glFlush call one layer down
authorMarek Olšák <maraeo@gmail.com>
Tue, 13 Nov 2012 16:06:37 +0000 (17:06 +0100)
committerMarek Olšák <maraeo@gmail.com>
Sat, 1 Dec 2012 23:15:00 +0000 (00:15 +0100)
src/glx/dri2_glx.c
src/glx/dri_glx.c
src/glx/drisw_glx.c
src/glx/glxclient.h
src/glx/glxcmds.c

index 12b302601e1dff56e90d9183c1fbb19c2e6386c8..30f6913010a010f6da530f5ef6bf531524561929 100644 (file)
@@ -534,7 +534,7 @@ dri2Throttle(struct dri2_screen *psc,
 static void
 __dri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y,
                    int width, int height,
-                   enum __DRI2throttleReason reason)
+                   enum __DRI2throttleReason reason, Bool flush)
 {
    struct dri2_drawable *priv = (struct dri2_drawable *) pdraw;
    struct dri2_screen *psc = (struct dri2_screen *) pdraw->psc;
@@ -550,6 +550,10 @@ __dri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y,
    xrect.width = width;
    xrect.height = height;
 
+   if (flush) {
+      glFlush();
+   }
+
    if (psc->f)
       (*psc->f->flush) (priv->driDrawable);
 
@@ -571,10 +575,10 @@ __dri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y,
 
 static void
 dri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y,
-                 int width, int height)
+                 int width, int height, Bool flush)
 {
    __dri2CopySubBuffer(pdraw, x, y, width, height,
-                      __DRI2_THROTTLE_COPYSUBBUFFER);
+                      __DRI2_THROTTLE_COPYSUBBUFFER, flush);
 }
 
 
@@ -731,7 +735,7 @@ static void show_fps(struct dri2_drawable *draw)
 
 static int64_t
 dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor,
-               int64_t remainder)
+               int64_t remainder, Bool flush)
 {
     struct dri2_drawable *priv = (struct dri2_drawable *) pdraw;
     struct glx_display *dpyPriv = __glXInitialize(priv->base.psc->dpy);
@@ -747,7 +751,7 @@ dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor,
     /* Old servers can't handle swapbuffers */
     if (!pdp->swapAvailable) {
        __dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height,
-                          __DRI2_THROTTLE_SWAPBUFFER);
+                          __DRI2_THROTTLE_SWAPBUFFER, flush);
     } else {
        xcb_connection_t *c = XGetXCBConnection(pdraw->psc->dpy);
        xcb_dri2_swap_buffers_cookie_t swap_buffers_cookie;
@@ -756,6 +760,10 @@ dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor,
        uint32_t divisor_hi, divisor_lo;
        uint32_t remainder_hi, remainder_lo;
 
+       if (flush) {
+          glFlush();
+       }
+
        if (psc->f) {
           struct glx_context *gc = __glXGetCurrentContext();
 
index f42db79ad61760d7c120a1e2873ae61d1b095fa0..ba8fda20ad2be8812bbf1688b175527fa5705ad5 100644 (file)
@@ -684,22 +684,30 @@ driCreateDrawable(struct glx_screen *base,
 
 static int64_t
 driSwapBuffers(__GLXDRIdrawable * pdraw, int64_t unused1, int64_t unused2,
-              int64_t unused3)
+              int64_t unused3, Bool flush)
 {
    struct dri_screen *psc = (struct dri_screen *) pdraw->psc;
    struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
 
+   if (flush) {
+      glFlush();
+   }
+
    (*psc->core->swapBuffers) (pdp->driDrawable);
    return 0;
 }
 
 static void
 driCopySubBuffer(__GLXDRIdrawable * pdraw,
-                 int x, int y, int width, int height)
+                 int x, int y, int width, int height, Bool flush)
 {
    struct dri_drawable *pdp = (struct dri_drawable *) pdraw;
    struct dri_screen *psc = (struct dri_screen *) pdp->base.psc;
 
+   if (flush) {
+      glFlush();
+   }
+
    (*psc->driCopySubBuffer->copySubBuffer) (pdp->driDrawable,
                                            x, y, width, height);
 }
index 014296b40edde106928779550452a9a18feb7553..832e9642ea9c3d3fa234fba2b3b3c2a9b4668028 100644 (file)
@@ -551,7 +551,8 @@ driswCreateDrawable(struct glx_screen *base, XID xDrawable,
 
 static int64_t
 driswSwapBuffers(__GLXDRIdrawable * pdraw,
-                 int64_t target_msc, int64_t divisor, int64_t remainder)
+                 int64_t target_msc, int64_t divisor, int64_t remainder,
+                 Bool flush)
 {
    struct drisw_drawable *pdp = (struct drisw_drawable *) pdraw;
    struct drisw_screen *psc = (struct drisw_screen *) pdp->base.psc;
@@ -560,6 +561,10 @@ driswSwapBuffers(__GLXDRIdrawable * pdraw,
    (void) divisor;
    (void) remainder;
 
+   if (flush) {
+      glFlush();
+   }
+
    (*psc->core->swapBuffers) (pdp->driDrawable);
 
    return 0;
index e4adedd509b7315f3ca2007d82b1cce2500a23c7..3e9b730e54aa8fa755905f8d5447b74dc7ac6d48 100644 (file)
@@ -113,9 +113,9 @@ struct __GLXDRIscreenRec {
                                       struct glx_config *config);
 
    int64_t (*swapBuffers)(__GLXDRIdrawable *pdraw, int64_t target_msc,
-                         int64_t divisor, int64_t remainder);
+                         int64_t divisor, int64_t remainder, Bool flush);
    void (*copySubBuffer)(__GLXDRIdrawable *pdraw,
-                        int x, int y, int width, int height);
+                        int x, int y, int width, int height, Bool flush);
    int (*getDrawableMSC)(struct glx_screen *psc, __GLXDRIdrawable *pdraw,
                         int64_t *ust, int64_t *msc, int64_t *sbc);
    int (*waitForMSC)(__GLXDRIdrawable *pdraw, int64_t target_msc,
index 394bf5960de29b78654ca6d58062907375a462c8..8874e3bebf6695bc35c9bbaf2132d0fc356b24b2 100644 (file)
@@ -781,11 +781,9 @@ glXSwapBuffers(Display * dpy, GLXDrawable drawable)
       __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable);
 
       if (pdraw != NULL) {
-         if (gc && drawable == gc->currentDrawable) {
-            glFlush();
-         }
+         Bool flush = gc && drawable == gc->currentDrawable;
 
-         (*pdraw->psc->driScreen->swapBuffers)(pdraw, 0, 0, 0);
+         (*pdraw->psc->driScreen->swapBuffers)(pdraw, 0, 0, 0, flush);
          return;
       }
    }
@@ -2171,7 +2169,7 @@ __glXSwapBuffersMscOML(Display * dpy, GLXDrawable drawable,
 #ifdef GLX_DIRECT_RENDERING
    if (psc->driScreen && psc->driScreen->swapBuffers)
       return (*psc->driScreen->swapBuffers)(pdraw, target_msc, divisor,
-                                           remainder);
+                                           remainder, False);
 #endif
 
    return -1;
@@ -2311,8 +2309,7 @@ __glXCopySubBufferMESA(Display * dpy, GLXDrawable drawable,
    if (pdraw != NULL) {
       struct glx_screen *psc = pdraw->psc;
       if (psc->driScreen->copySubBuffer != NULL) {
-         glFlush();
-         (*psc->driScreen->copySubBuffer) (pdraw, x, y, width, height);
+         (*psc->driScreen->copySubBuffer) (pdraw, x, y, width, height, True);
       }
 
       return;