diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 5cd95f6..de22540 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -784,7 +784,7 @@ __glXDisp_WaitGL(__GLXclientState * cl, GLbyte * pc)
     }
 
     if (glxc && glxc->drawPriv->waitGL)
-        (*glxc->drawPriv->waitGL) (glxc->drawPriv);
+        (*glxc->drawPriv->waitGL) (client, glxc->drawPriv);
 
     return Success;
 }
@@ -811,7 +811,7 @@ __glXDisp_WaitX(__GLXclientState * cl, GLbyte * pc)
     }
 
     if (glxc && glxc->drawPriv->waitX)
-        (*glxc->drawPriv->waitX) (glxc->drawPriv);
+        (*glxc->drawPriv->waitX) (client, glxc->drawPriv);
 
     return Success;
 }
@@ -1841,7 +1841,7 @@ __glXDisp_CopySubBufferMESA(__GLXclientState * cl, GLbyte * pc)
         pGlxDraw->copySubBuffer == NULL)
         return __glXError(GLXBadDrawable);
 
-    (*pGlxDraw->copySubBuffer) (pGlxDraw, x, y, width, height);
+    (*pGlxDraw->copySubBuffer) (client, pGlxDraw, x, y, width, height);
 
     return Success;
 }
diff --git a/glx/glxdrawable.h b/glx/glxdrawable.h
index 80c3234..7e71a23 100644
--- a/glx/glxdrawable.h
+++ b/glx/glxdrawable.h
@@ -46,10 +46,10 @@ enum {
 struct __GLXdrawable {
     void (*destroy) (__GLXdrawable * private);
      GLboolean(*swapBuffers) (ClientPtr client, __GLXdrawable *);
-    void (*copySubBuffer) (__GLXdrawable * drawable,
+    void (*copySubBuffer) (ClientPtr client, __GLXdrawable * drawable,
                            int x, int y, int w, int h);
-    void (*waitX) (__GLXdrawable *);
-    void (*waitGL) (__GLXdrawable *);
+    void (*waitX) (ClientPtr client, __GLXdrawable *);
+    void (*waitGL) (ClientPtr client, __GLXdrawable *);
 
     int refcnt; /* number of resources handles referencing this */
 
diff --git a/glx/glxdri.c b/glx/glxdri.c
index 326f539..3fbf118 100644
--- a/glx/glxdri.c
+++ b/glx/glxdri.c
@@ -270,7 +270,7 @@ __glXDRIdrawableSwapInterval(__GLXdrawable * baseDrawable, int interval)
 }
 
 static void
-__glXDRIdrawableCopySubBuffer(__GLXdrawable * basePrivate,
+__glXDRIdrawableCopySubBuffer(ClientPtr client, __GLXdrawable * basePrivate,
                               int x, int y, int w, int h)
 {
     __GLXDRIdrawable *private = (__GLXDRIdrawable *) basePrivate;
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 5e524db..ff6145b 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -114,10 +114,11 @@ __glXDRIdrawableDestroy(__GLXdrawable * drawable)
 }
 
 static void
-__glXDRIdrawableCopySubBuffer(__GLXdrawable * drawable,
+__glXDRIdrawableCopySubBuffer(ClientPtr client, __GLXdrawable * drawable,
                               int x, int y, int w, int h)
 {
     __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+    __GLXDRIscreen *screen = private->screen;
     BoxRec box;
     RegionRec region;
 
@@ -127,12 +128,27 @@ __glXDRIdrawableCopySubBuffer(__GLXdrawable * drawable,
     box.y2 = private->height - y;
     RegionInit(&region, &box, 0);
 
-    DRI2CopyRegion(drawable->pDraw, &region,
-                   DRI2BufferFrontLeft, DRI2BufferBackLeft);
+    LogMessage(X_INFO, "%s:%d \n",__func__,__LINE__);
+#if __DRI2_FLUSH_VERSION >= 3
+    LogMessage(X_INFO, "%s:%d flushing\n",__func__,__LINE__);
+    if (screen->flush) {
+        LogMessage(X_INFO, "%s:%d flushing2\n",__func__,__LINE__);
+	(*screen->flush->flush)(private->driDrawable);
+	(*screen->flush->invalidate)(private->driDrawable);
+    }
+#else
+    LogMessage(X_INFO, "%s:%d \n",__func__,__LINE__);
+    if (screen->flush)
+	(*screen->flush->flushInvalidate)(private->driDrawable);
+#endif
+
+    LogMessage(X_INFO, "%s:%d \n",__func__,__LINE__);
+    DRI2CopyRegion(client, drawable->pDraw, &region,
+                   DRI2BufferFrontLeft, DRI2BufferBackLeft, TRUE);
 }
 
 static void
-__glXDRIdrawableWaitX(__GLXdrawable * drawable)
+__glXDRIdrawableWaitX(ClientPtr client, __GLXdrawable * drawable)
 {
     __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
     BoxRec box;
@@ -144,12 +160,12 @@ __glXDRIdrawableWaitX(__GLXdrawable * drawable)
     box.y2 = private->height;
     RegionInit(&region, &box, 0);
 
-    DRI2CopyRegion(drawable->pDraw, &region,
-                   DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft);
+    DRI2CopyRegion(client, drawable->pDraw, &region,
+                   DRI2BufferFakeFrontLeft, DRI2BufferFrontLeft, FALSE);
 }
 
 static void
-__glXDRIdrawableWaitGL(__GLXdrawable * drawable)
+__glXDRIdrawableWaitGL(ClientPtr client, __GLXdrawable * drawable)
 {
     __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
     BoxRec box;
@@ -161,8 +177,8 @@ __glXDRIdrawableWaitGL(__GLXdrawable * drawable)
     box.y2 = private->height;
     RegionInit(&region, &box, 0);
 
-    DRI2CopyRegion(drawable->pDraw, &region,
-                   DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft);
+    DRI2CopyRegion(client, drawable->pDraw, &region,
+                   DRI2BufferFrontLeft, DRI2BufferFakeFrontLeft, FALSE);
 }
 
 static void
@@ -565,7 +581,7 @@ static void
 dri2FlushFrontBuffer(__DRIdrawable * driDrawable, void *loaderPrivate)
 {
     (void) driDrawable;
-    __glXDRIdrawableWaitGL((__GLXdrawable *) loaderPrivate);
+    __glXDRIdrawableWaitGL(NULL, (__GLXdrawable *) loaderPrivate);
 }
 
 static const __DRIdri2LoaderExtension loaderExtension = {
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index d03d082..28383fb 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -87,6 +87,7 @@ typedef struct _DRI2Drawable {
     int swap_limit;             /* for N-buffering */
     unsigned long serialNumber;
     Bool needInvalidate;
+    RegionPtr previous_region;
 } DRI2DrawableRec, *DRI2DrawablePtr;
 
 typedef struct _DRI2Screen {
@@ -175,6 +176,7 @@ DRI2AllocateDrawable(DrawablePtr pDraw)
     pPriv->swap_count = 0;
     pPriv->target_sbc = -1;
     pPriv->swap_interval = 1;
+    pPriv->previous_region = NULL;
     /* Initialize last swap target from DDX if possible */
     if (!ds->GetMSC || !(*ds->GetMSC) (pDraw, &ust, &pPriv->last_swap_target))
         pPriv->last_swap_target = 0;
@@ -552,8 +554,8 @@ do_get_buffers(DrawablePtr pDraw, int *width, int *height,
         box.y2 = pPriv->height;
         RegionInit(&region, &box, 0);
 
-        DRI2CopyRegion(pDraw, &region, DRI2BufferFakeFrontLeft,
-                       DRI2BufferFrontLeft);
+        DRI2CopyRegion(NULL, pDraw, &region, DRI2BufferFakeFrontLeft,
+                       DRI2BufferFrontLeft, FALSE);
     }
 
     pPriv->needInvalidate = TRUE;
@@ -661,9 +663,118 @@ DRI2BlockClient(ClientPtr client, DrawablePtr pDraw)
     pPriv->blockedOnMsc = TRUE;
 }
 
+static Bool DRI2CopyRegionWithFlip(ClientPtr client, DrawablePtr pDraw,
+				   RegionPtr pRegion,
+				   DRI2BufferPtr pDestBuffer,
+				   DRI2BufferPtr pSrcBuffer)
+{
+    DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
+    DRI2DrawablePtr pPriv = DRI2GetDrawable(pDraw);
+    ScreenPtr pScreen = pPriv->dri2_screen->screen;
+    RegionPtr pPreviousRegion;
+    RegionPtr pCopyFrontToBack;
+    int ret;
+    DRI2SwapEventPtr func = NULL;
+    void *data = NULL;
+    PixmapPtr pWindowPix, pScreenPix;
+    CARD64 target_msc = 0, divisor = 0, remainder = 0;
+    CARD64 ust, current_msc;
+    CARD64 swap_target;
+
+    /* Make sure we have a window */
+    if (pDraw->type != DRAWABLE_WINDOW)
+        return FALSE;
+
+    /* Ensure that our window is the screen pixmap */
+    pWindowPix = pScreen->GetWindowPixmap((WindowPtr)pDraw);
+    pScreenPix = pScreen->GetScreenPixmap(pScreen);
+    if (pWindowPix != pScreenPix)
+        return FALSE;
+
+    /* Create a region pCopyFrontToBack which brings over the changes from
+     * the last frame. Do this by subtracting the current region from the
+     * previous updates and copying the resulting bits. In the case where we
+     * don't have a previous region we'll update the whole drawable */
+    pCopyFrontToBack = REGION_CREATE(pScreen, NULL, 0);
+
+    if (pPriv->previous_region) {
+        pPreviousRegion = pPriv->previous_region;
+    } else {
+        BoxRec box;
+        box.x1 = 0;
+        box.y1 = 0;
+        box.x2 = box.x1 + pDraw->width;
+        box.y2 = box.y1 + pDraw->height;
+        pPreviousRegion = REGION_CREATE(pScreen, &box, 1);
+    }
+
+    REGION_SUBTRACT(pScreen, pCopyFrontToBack, pPreviousRegion, pRegion);
+    REGION_DESTROY(pScreen, pPreviousRegion);
+    (*ds->CopyRegion)(pDraw, pCopyFrontToBack, pSrcBuffer, pDestBuffer);
+
+    /*
+     * In the simple glXSwapBuffers case, all params will be 0, and we just
+     * need to schedule a swap for the last swap target + the swap interval.
+     */
+    if (target_msc == 0 && divisor == 0 && remainder == 0) {
+        /* If the current vblank count of the drawable's crtc is lower
+         * than the count stored in last_swap_target from a previous swap
+         * then reinitialize last_swap_target to the current crtc's msc,
+         * otherwise the swap will hang. This will happen if the drawable
+         * is moved to a crtc with a lower refresh rate, or a crtc that just
+         * got enabled.
+         */
+        if (ds->GetMSC) {
+            if (!(*ds->GetMSC)(pDraw, &ust, &current_msc))
+		pPriv->last_swap_target = 0;
+
+            if (current_msc < pPriv->last_swap_target)
+		pPriv->last_swap_target = current_msc;
+
+        }
+
+        /*
+         * Swap target for this swap is last swap target + swap interval since
+         * we have to account for the current swap count, interval, and the
+         * number of pending swaps.
+         */
+        swap_target = pPriv->last_swap_target + pPriv->swap_interval;
+
+    } else {
+        /* glXSwapBuffersMscOML could have a 0 target_msc, honor it */
+        swap_target = target_msc;
+    }
+
+    if (pPriv->swapsPending > 0)
+        return FALSE;
+
+    pPriv->swapsPending++;
+    ret = (*ds->ScheduleSwap)(client, pDraw, pDestBuffer, pSrcBuffer,
+		      &swap_target, divisor, remainder, func, data);
+    if (!ret) {
+        pPriv->swapsPending--; /* didn't schedule */
+        return FALSE;
+    }
+
+    pPriv->last_swap_target = swap_target;
+
+    /* According to spec, return expected swapbuffers count SBC after this swap
+     * will complete.
+     */
+    swap_target = pPriv->swap_count + pPriv->swapsPending;
+
+    DRI2InvalidateDrawable(pDraw);
+
+    pPriv->previous_region = REGION_CREATE(pScreen, NULL, 0);
+    REGION_COPY(pScreen, pPriv->previous_region, pRegion);
+
+    REGION_DESTROY(pScreen, pCopyFrontToBack);
+    return TRUE;
+}
+
 int
-DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
-               unsigned int dest, unsigned int src)
+DRI2CopyRegion(ClientPtr client, DrawablePtr pDraw, RegionPtr pRegion,
+               unsigned int dest, unsigned int src, Bool invalidate)
 {
     DRI2ScreenPtr ds = DRI2GetScreen(pDraw->pScreen);
     DRI2DrawablePtr pPriv;
@@ -685,8 +796,13 @@ DRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion,
     if (pSrcBuffer == NULL || pDestBuffer == NULL)
         return BadValue;
 
-    (*ds->CopyRegion) (pDraw, pRegion, pDestBuffer, pSrcBuffer);
+    if (invalidate &&
+        DRI2CopyRegionWithFlip(client, pDraw, pRegion,
+                               pDestBuffer, pSrcBuffer))
+        return Success;
 
+    pPriv->previous_region = NULL;
+    (*ds->CopyRegion)(pDraw, pRegion, pDestBuffer, pSrcBuffer);
     return Success;
 }
 
@@ -814,8 +930,8 @@ DRI2SwapComplete(ClientPtr client, DrawablePtr pDraw, int frame,
     box.x2 = pDraw->width;
     box.y2 = pDraw->height;
     RegionInit(&region, &box, 0);
-    DRI2CopyRegion(pDraw, &region, DRI2BufferFakeFrontLeft,
-                   DRI2BufferFrontLeft);
+    DRI2CopyRegion(client, pDraw, &region, DRI2BufferFakeFrontLeft,
+                   DRI2BufferFrontLeft, FALSE);
 
     ust = ((CARD64) tv_sec * 1000000) + tv_usec;
     if (swap_complete)
@@ -889,6 +1005,8 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
         return BadDrawable;
     }
 
+    pPriv->previous_region = NULL;
+
     /* Old DDX or no swap interval, just blit */
     if (!ds->ScheduleSwap || !pPriv->swap_interval) {
         BoxRec box;
@@ -1345,3 +1463,4 @@ DRI2Version(int *major, int *minor)
     if (minor != NULL)
         *minor = DRI2VersRec.minorversion;
 }
+
diff --git a/hw/xfree86/dri2/dri2.h b/hw/xfree86/dri2/dri2.h
index a67e35f..e30fb7a 100644
--- a/hw/xfree86/dri2/dri2.h
+++ b/hw/xfree86/dri2/dri2.h
@@ -248,9 +248,11 @@ extern _X_EXPORT DRI2BufferPtr *DRI2GetBuffers(DrawablePtr pDraw,
                                                unsigned int *attachments,
                                                int count, int *out_count);
 
-extern _X_EXPORT int DRI2CopyRegion(DrawablePtr pDraw,
+extern _X_EXPORT int DRI2CopyRegion(ClientPtr client,
+                                    DrawablePtr pDraw,
                                     RegionPtr pRegion,
-                                    unsigned int dest, unsigned int src);
+                                    unsigned int dest, unsigned int src,
+                                    Bool invalidate);
 
 /**
  * Determine the major and minor version of the DRI2 extension.
diff --git a/hw/xfree86/dri2/dri2ext.c b/hw/xfree86/dri2/dri2ext.c
index 73ef7f2..dfa242a 100644
--- a/hw/xfree86/dri2/dri2ext.c
+++ b/hw/xfree86/dri2/dri2ext.c
@@ -319,7 +319,7 @@ ProcDRI2CopyRegion(ClientPtr client)
 
     VERIFY_REGION(pRegion, stuff->region, client, DixReadAccess);
 
-    status = DRI2CopyRegion(pDrawable, pRegion, stuff->dest, stuff->src);
+    status = DRI2CopyRegion(client, pDrawable, pRegion, stuff->dest, stuff->src, TRUE);
     if (status != Success)
         return status;
 
-- 
1.7.7.3

