diff -urN wine-1.7.29-orig/dlls/wined3d/directx.c wine-1.7.29/dlls/wined3d/directx.c
--- wine-1.7.29-orig/dlls/wined3d/directx.c	2014-10-17 21:01:42 +0900
+++ wine-1.7.29/dlls/wined3d/directx.c	2014-10-27 22:35:21 +0900
@@ -5043,6 +5043,8 @@
 #define USE_GL_FUNC(f) gl_info->gl_ops.gl.p_##f = (void *)GetProcAddress(mod_gl, #f);
         ALL_WGL_FUNCS
 #undef USE_GL_FUNC
+        gl_info->gl_ops.gl_raw.glFinish = gl_info->gl_ops.gl.glFinish;
+        gl_info->gl_ops.gl_raw.glFlush = gl_info->gl_ops.gl.glFlush;
         gl_info->gl_ops.wgl.p_wglSwapBuffers = (void *)GetProcAddress(mod_gl, "wglSwapBuffers");
     }
 #else
@@ -5054,6 +5056,7 @@
         if (!wgl_driver || wgl_driver == (void *)-1) return FALSE;
         gl_info->gl_ops.wgl = wgl_driver->wgl;
         gl_info->gl_ops.gl = wgl_driver->gl;
+        gl_info->gl_ops.gl_raw = wgl_driver->gl_raw;
     }
 #endif
 
diff -urN wine-1.7.29-orig/dlls/wined3d/surface.c wine-1.7.29/dlls/wined3d/surface.c
--- wine-1.7.29-orig/dlls/wined3d/surface.c	2014-10-17 21:01:42 +0900
+++ wine-1.7.29/dlls/wined3d/surface.c	2014-10-27 22:35:21 +0900
@@ -820,6 +820,11 @@
 
     gl_info = context->gl_info;
 
+    /* If there are multiple contexts that might be rendering, make sure any
+     * other context's rendering to the source buffer is finished. */
+    if (context->swapchain->num_contexts > 1)
+        gl_info->gl_ops.gl_raw.p_glFinish();
+
     context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, NULL, src_surface, src_location);
     context_check_fbo_status(context, GL_READ_FRAMEBUFFER);
 
@@ -920,6 +925,11 @@
 
     gl_info = context->gl_info;
 
+    /* If there are multiple contexts that might be rendering, make sure any
+     * other context's rendering to the source buffer is finished. */
+    if (context->swapchain->num_contexts > 1)
+        gl_info->gl_ops.gl_raw.p_glFinish();
+
     if (src_location == WINED3D_LOCATION_DRAWABLE)
     {
         TRACE("Source surface %p is onscreen.\n", src_surface);
diff -urN wine-1.7.29-orig/dlls/wined3d/swapchain.c wine-1.7.29/dlls/wined3d/swapchain.c
--- wine-1.7.29-orig/dlls/wined3d/swapchain.c	2014-10-17 21:01:42 +0900
+++ wine-1.7.29/dlls/wined3d/swapchain.c	2014-10-27 22:35:21 +0900
@@ -528,6 +528,10 @@
         if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP && !once++)
             FIXME("WINED3D_SWAP_EFFECT_FLIP not implemented.\n");
 
+        /* Make sure any rendering to the source buffer is finished. */
+        if (swapchain->num_contexts > 1)
+            gl_info->gl_ops.gl_raw.p_glFinish();
+
         swapchain_blit(swapchain, context, &src_rect, &dst_rect);
     }
 
diff -urN wine-1.7.29-orig/dlls/winex11.drv/opengl.c wine-1.7.29/dlls/winex11.drv/opengl.c
--- wine-1.7.29-orig/dlls/winex11.drv/opengl.c	2014-10-17 21:01:42 +0900
+++ wine-1.7.29/dlls/winex11.drv/opengl.c	2014-10-27 22:35:21 +0900
@@ -598,7 +598,7 @@
 
     /* redirect some standard OpenGL functions */
 #define REDIRECT(func) \
-    do { p##func = opengl_funcs.gl.p_##func; opengl_funcs.gl.p_##func = w##func; } while(0)
+    do { p##func = opengl_funcs.gl.p_##func; opengl_funcs.gl_raw.p_##func = p##func; opengl_funcs.gl.p_##func = w##func; } while(0)
     REDIRECT( glFinish );
     REDIRECT( glFlush );
     REDIRECT( glGetString );
diff -urN wine-1.7.29-orig/include/wine/wgl_driver.h wine-1.7.29/include/wine/wgl_driver.h
--- wine-1.7.29-orig/include/wine/wgl_driver.h	2014-10-17 21:01:42 +0900
+++ wine-1.7.29/include/wine/wgl_driver.h	2014-10-27 22:35:21 +0900
@@ -368,6 +368,14 @@
         void       (WINE_GLAPI *p_glViewport)(GLint,GLint,GLsizei,GLsizei);
     } gl;
 
+    /* Unredirected versions (raw GL calls).  Used by wined3d. */
+    struct
+    {
+        void       (WINE_GLAPI *p_glFinish)(void);
+        void       (WINE_GLAPI *p_glFlush)(void);
+        const GLubyte * (WINE_GLAPI *p_glGetString)(GLenum);
+    } gl_raw;
+
     struct
     {
         void       (WINE_GLAPI *p_glAccumxOES)(GLenum,GLfixed);
