st/wgl: flush with ST_FLUSH_WAIT before releasing shared contexts
authorCharmaine Lee <charmainel@vmware.com>
Sat, 18 Feb 2017 09:26:52 +0000 (01:26 -0800)
committerCharmaine Lee <charmainel@vmware.com>
Sat, 18 Feb 2017 17:36:42 +0000 (09:36 -0800)
Before releasing a shared context, flush the context
with ST_FLUSH_WAIT to make sure all commands are executed.
This ensures that rendering to any shared resources is completed
before they will be referenced by another context.

Fixes an intermittent flickering with Photoshop. (VMware bug# 1779340)

Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/state_trackers/wgl/stw_context.c
src/gallium/state_trackers/wgl/stw_context.h

index b1e5f5e20fb47d55452080777eb658da30c235f9..85cffa6352935415f735e67a02894ddc75a67c0f 100644 (file)
@@ -104,8 +104,11 @@ DrvShareLists(DHGLRC dhglrc1, DHGLRC dhglrc2)
    ctx1 = stw_lookup_context_locked( dhglrc1 );
    ctx2 = stw_lookup_context_locked( dhglrc2 );
 
-   if (ctx1 && ctx2 && ctx2->st->share)
+   if (ctx1 && ctx2 && ctx2->st->share) {
       ret = ctx2->st->share(ctx2->st, ctx1->st);
+      ctx1->shared = TRUE;
+      ctx2->shared = TRUE;
+   }
 
    stw_unlock_contexts(stw_dev);
 
@@ -175,6 +178,7 @@ stw_create_context_attribs(HDC hdc, INT iLayerPlane, DHGLRC hShareContext,
    if (hShareContext != 0) {
       stw_lock_contexts(stw_dev);
       shareCtx = stw_lookup_context_locked( hShareContext );
+      shareCtx->shared = TRUE;
       stw_unlock_contexts(stw_dev);
    }
 
@@ -184,6 +188,7 @@ stw_create_context_attribs(HDC hdc, INT iLayerPlane, DHGLRC hShareContext,
 
    ctx->hdc = hdc;
    ctx->iPixelFormat = iPixelFormat;
+   ctx->shared = shareCtx != NULL;
 
    memset(&attribs, 0, sizeof(attribs));
    attribs.visual = pfi->stvis;
@@ -403,7 +408,14 @@ stw_make_current(HDC hdc, DHGLRC dhglrc)
             return TRUE;
          }
       } else {
-         old_ctx->st->flush(old_ctx->st, ST_FLUSH_FRONT, NULL);
+         if (old_ctx->shared) {
+            struct pipe_fence_handle *fence = NULL;
+            old_ctx->st->flush(old_ctx->st,
+                               ST_FLUSH_FRONT | ST_FLUSH_WAIT, &fence);
+         }
+         else {
+            old_ctx->st->flush(old_ctx->st, ST_FLUSH_FRONT, NULL);
+         }
       }
    }
 
index 6bfa7150d6facc7460b96fc6be9127faa68b6f80..0f180c8e2ec9234d8ccd40f220d1bbdfd85fffdf 100644 (file)
@@ -40,6 +40,7 @@ struct stw_context
    DHGLRC dhglrc;
    int iPixelFormat;
    HDC hdc;
+   BOOL shared;
 
    struct stw_framebuffer *current_framebuffer;