[Mesa-dev] [PATCH 2/2] st/wgl: flush with ST_FLUSH_WAIT before releasing shared contexts

Brian Paul brianp at vmware.com
Thu Feb 23 04:05:36 UTC 2017


For both, Reviewed-by: Brian Paul <brianp at vmware.com>


On 02/18/2017 02:45 AM, Charmaine Lee wrote:
> 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)
> ---
>   src/gallium/state_trackers/wgl/stw_context.c | 16 ++++++++++++++--
>   src/gallium/state_trackers/wgl/stw_context.h |  1 +
>   2 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/state_trackers/wgl/stw_context.c b/src/gallium/state_trackers/wgl/stw_context.c
> index b1e5f5e..85cffa6 100644
> --- a/src/gallium/state_trackers/wgl/stw_context.c
> +++ b/src/gallium/state_trackers/wgl/stw_context.c
> @@ -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);
> +         }
>         }
>      }
>
> diff --git a/src/gallium/state_trackers/wgl/stw_context.h b/src/gallium/state_trackers/wgl/stw_context.h
> index 6bfa715..0f180c8 100644
> --- a/src/gallium/state_trackers/wgl/stw_context.h
> +++ b/src/gallium/state_trackers/wgl/stw_context.h
> @@ -40,6 +40,7 @@ struct stw_context
>      DHGLRC dhglrc;
>      int iPixelFormat;
>      HDC hdc;
> +   BOOL shared;
>
>      struct stw_framebuffer *current_framebuffer;
>
>



More information about the mesa-dev mailing list