diff -urN wine-4.3-orig/dlls/wined3d/adapter_gl.c wine-4.3/dlls/wined3d/adapter_gl.c
--- wine-4.3-orig/dlls/wined3d/adapter_gl.c	2019-03-02 07:40:42 +0900
+++ wine-4.3/dlls/wined3d/adapter_gl.c	2019-03-08 12:25:57 +0900
@@ -4243,6 +4243,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");
         gl_info->gl_ops.wgl.p_wglGetPixelFormat = (void *)GetProcAddress(mod_gl, "wglGetPixelFormat");
     }
@@ -4255,6 +4257,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-4.3-orig/dlls/wined3d/surface.c wine-4.3/dlls/wined3d/surface.c
--- wine-4.3-orig/dlls/wined3d/surface.c	2019-03-02 07:40:42 +0900
+++ wine-4.3/dlls/wined3d/surface.c	2019-03-08 12:25:57 +0900
@@ -95,6 +95,11 @@
     if (src_mask & WINED3DFMT_FLAG_STENCIL)
         gl_mask |= GL_STENCIL_BUFFER_BIT;
 
+    /* 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();
+
     /* Make sure the locations are up-to-date. Loading the destination
      * surface isn't required if the entire surface is overwritten. */
     wined3d_texture_load_location(src_texture, src_sub_resource_idx, context, src_location);
@@ -231,6 +236,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 texture %p is onscreen.\n", src_texture);
diff -urN wine-4.3-orig/dlls/wined3d/swapchain.c wine-4.3/dlls/wined3d/swapchain.c
--- wine-4.3-orig/dlls/wined3d/swapchain.c	2019-03-02 07:40:42 +0900
+++ wine-4.3/dlls/wined3d/swapchain.c	2019-03-08 12:25:57 +0900
@@ -484,7 +484,14 @@
     }
 
     if (swapchain->render_to_fbo)
+    {
+        /* Make sure any rendering to the source buffer is finished.
+         * This is needed despite the non-raw glFinish() call below. */
+        if (swapchain->num_contexts > 1)
+            gl_info->gl_ops.gl_raw.p_glFinish();
+
         swapchain_blit(swapchain, context, src_rect, dst_rect);
+    }
 
     if (swapchain->num_contexts > 1)
         gl_info->gl_ops.gl.p_glFinish();
diff -urN wine-4.3-orig/dlls/winex11.drv/opengl.c wine-4.3/dlls/winex11.drv/opengl.c
--- wine-4.3-orig/dlls/winex11.drv/opengl.c	2019-03-02 07:40:42 +0900
+++ wine-4.3/dlls/winex11.drv/opengl.c	2019-03-08 12:25:57 +0900
@@ -566,7 +566,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-4.3-orig/include/wine/wgl_driver.h wine-4.3/include/wine/wgl_driver.h
--- wine-4.3-orig/include/wine/wgl_driver.h	2019-03-02 07:40:42 +0900
+++ wine-4.3/include/wine/wgl_driver.h	2019-03-08 12:25:57 +0900
@@ -368,6 +368,14 @@
         void       (WINE_GLAPI *p_glViewport)( GLint x, GLint y, GLsizei width, GLsizei height );
     } 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 op, GLfixed value );
