[Mesa-dev] [PATCH] st/dri: fix deadlock when waiting on android fences

Nicolai Hähnle nhaehnle at gmail.com
Fri Nov 10 20:40:31 UTC 2017


On 10.11.2017 19:10, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
> 
> Android fences can't be deferred, because st/dri calls fence_finish
> with ctx = NULL, so the driver can't flush u_threaded_context.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


> ---
>   src/gallium/include/state_tracker/st_api.h   | 3 +--
>   src/gallium/state_trackers/dri/dri_helpers.c | 3 +--
>   src/mesa/state_tracker/st_manager.c          | 2 --
>   3 files changed, 2 insertions(+), 6 deletions(-)
> 
> diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h
> index 6cdaefc..a407b98 100644
> --- a/src/gallium/include/state_tracker/st_api.h
> +++ b/src/gallium/include/state_tracker/st_api.h
> @@ -140,22 +140,21 @@ enum st_attachment_type {
>   #define ST_ATTACHMENT_DEPTH_STENCIL_MASK  (1 << ST_ATTACHMENT_DEPTH_STENCIL)
>   #define ST_ATTACHMENT_ACCUM_MASK          (1 << ST_ATTACHMENT_ACCUM)
>   #define ST_ATTACHMENT_SAMPLE_MASK         (1 << ST_ATTACHMENT_SAMPLE)
>   
>   /**
>    * Flush flags.
>    */
>   #define ST_FLUSH_FRONT                    (1 << 0)
>   #define ST_FLUSH_END_OF_FRAME             (1 << 1)
>   #define ST_FLUSH_WAIT                     (1 << 2)
> -#define ST_FLUSH_DEFERRED                 (1 << 3)
> -#define ST_FLUSH_FENCE_FD                 (1 << 4)
> +#define ST_FLUSH_FENCE_FD                 (1 << 3)
>   
>   /**
>    * Value to st_manager->get_param function.
>    */
>   enum st_manager_param {
>      /**
>       * The dri state tracker on old libGL's doesn't do the right thing
>       * with regards to invalidating the framebuffers.
>       *
>       * For the mesa state tracker that means that it needs to invalidate
> diff --git a/src/gallium/state_trackers/dri/dri_helpers.c b/src/gallium/state_trackers/dri/dri_helpers.c
> index 4a61455..37ab2c2 100644
> --- a/src/gallium/state_trackers/dri/dri_helpers.c
> +++ b/src/gallium/state_trackers/dri/dri_helpers.c
> @@ -109,22 +109,21 @@ dri2_create_fence(__DRIcontext *_ctx)
>   
>   static void *
>   dri2_create_fence_fd(__DRIcontext *_ctx, int fd)
>   {
>      struct st_context_iface *stapi = dri_context(_ctx)->st;
>      struct pipe_context *ctx = stapi->pipe;
>      struct dri2_fence *fence = CALLOC_STRUCT(dri2_fence);
>   
>      if (fd == -1) {
>         /* exporting driver created fence, flush: */
> -      stapi->flush(stapi, ST_FLUSH_DEFERRED | ST_FLUSH_FENCE_FD,
> -                   &fence->pipe_fence);
> +      stapi->flush(stapi, ST_FLUSH_FENCE_FD, &fence->pipe_fence);
>      } else {
>         /* importing a foreign fence fd: */
>         ctx->create_fence_fd(ctx, &fence->pipe_fence, fd);
>      }
>      if (!fence->pipe_fence) {
>         FREE(fence);
>         return NULL;
>      }
>   
>      fence->driscreen = dri_screen(_ctx->driScreenPriv);
> diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
> index 43d5dfd..4a1998c 100644
> --- a/src/mesa/state_tracker/st_manager.c
> +++ b/src/mesa/state_tracker/st_manager.c
> @@ -627,22 +627,20 @@ st_framebuffers_purge(struct st_context *st)
>   
>   static void
>   st_context_flush(struct st_context_iface *stctxi, unsigned flags,
>                    struct pipe_fence_handle **fence)
>   {
>      struct st_context *st = (struct st_context *) stctxi;
>      unsigned pipe_flags = 0;
>   
>      if (flags & ST_FLUSH_END_OF_FRAME)
>         pipe_flags |= PIPE_FLUSH_END_OF_FRAME;
> -   if (flags & ST_FLUSH_DEFERRED)
> -      pipe_flags |= PIPE_FLUSH_DEFERRED;
>      if (flags & ST_FLUSH_FENCE_FD)
>         pipe_flags |= PIPE_FLUSH_FENCE_FD;
>   
>      FLUSH_VERTICES(st->ctx, 0);
>      FLUSH_CURRENT(st->ctx, 0);
>      st_flush(st, fence, pipe_flags);
>   
>      if ((flags & ST_FLUSH_WAIT) && fence && *fence) {
>         st->pipe->screen->fence_finish(st->pipe->screen, NULL, *fence,
>                                        PIPE_TIMEOUT_INFINITE);
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list