[Mesa-dev] [PATCH v2 10/30] egl/dri2: rework dri2_make_current code flow

Lionel Landwerlin lionel.g.landwerlin at intel.com
Fri Oct 14 14:58:43 UTC 2016


Hi Emil,

I've not been able to run the deqp gles31 test suite after this commit.
Like Eric suggested I think this is introducing a behavior change.

Thanks,

-
Lionel

On 03/10/16 19:28, Emil Velikov wrote:
> From: Emil Velikov <emil.velikov at collabora.com>
>
> Fold duplicate conditional blocks and add a few extra comments ;-)
>
> v2: Bring back the explicit "unbind" logic (Eric), remove NULL derefs.
>
> Signed-off-by: Emil Velikov <emil.velikov at collabora.com>
> ---
>   src/egl/drivers/dri2/egl_dri2.c | 72 ++++++++++++++++++++---------------------
>   1 file changed, 36 insertions(+), 36 deletions(-)
>
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> index 96fef52..378ee5c 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -1260,11 +1260,11 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
>      struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
>      struct dri2_egl_context *dri2_ctx = dri2_egl_context(ctx);
>      _EGLContext *old_ctx;
> +   _EGLDisplay *old_disp = NULL;
>      _EGLSurface *old_dsurf, *old_rsurf;
>      _EGLSurface *tmp_dsurf, *tmp_rsurf;
>      __DRIdrawable *ddraw, *rdraw;
>      __DRIcontext *cctx;
> -   EGLBoolean unbind;
>   
>      if (!dri2_dpy)
>         return _eglError(EGL_NOT_INITIALIZED, "eglMakeCurrent");
> @@ -1275,55 +1275,55 @@ dri2_make_current(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *dsurf,
>         return EGL_FALSE;
>      }
>   
> -   /* flush before context switch */
> -   if (old_ctx)
> -      dri2_drv->glFlush();
> -
>      ddraw = (dsurf) ? dri2_dpy->vtbl->get_dri_drawable(dsurf) : NULL;
>      rdraw = (rsurf) ? dri2_dpy->vtbl->get_dri_drawable(rsurf) : NULL;
>      cctx = (dri2_ctx) ? dri2_ctx->dri_context : NULL;
>   
>      if (old_ctx) {
>         __DRIcontext *old_cctx = dri2_egl_context(old_ctx)->dri_context;
> +
> +      /* flush before context switch */
> +      dri2_drv->glFlush();
>         dri2_dpy->core->unbindContext(old_cctx);
> +
> +      /* Keep track of the old dpy as we'll need it for resource cleanup */
> +      old_disp = old_ctx->Resource.Display;
>      }
>   
> -   unbind = (cctx == NULL && ddraw == NULL && rdraw == NULL);
> +   /* Bind if at least one of the primitives is valid ... */
> +   if (cctx || ddraw || rdraw) {
> +      if (dri2_dpy->core->bindContext(cctx, ddraw, rdraw)) {
> +         /* undo the previous _eglBindContext */
> +         _eglBindContext(old_ctx, old_dsurf, old_rsurf, &ctx, &tmp_dsurf, &tmp_rsurf);
> +         assert(&dri2_ctx->base == ctx &&
> +                tmp_dsurf == dsurf &&
> +                tmp_rsurf == rsurf);
> +
> +         _eglPutSurface(dsurf);
> +         _eglPutSurface(rsurf);
> +         _eglPutContext(ctx);
>   
> -   if (unbind || dri2_dpy->core->bindContext(cctx, ddraw, rdraw)) {
> -      dri2_destroy_surface(drv, disp, old_dsurf);
> -      dri2_destroy_surface(drv, disp, old_rsurf);
> +         _eglPutSurface(old_dsurf);
> +         _eglPutSurface(old_rsurf);
> +         _eglPutContext(old_ctx);
>   
> -      if (!unbind)
> -         dri2_dpy->ref_count++;
> -      if (old_ctx) {
> -         EGLDisplay old_disp = _eglGetDisplayHandle(old_ctx->Resource.Display);
> -         dri2_destroy_context(drv, disp, old_ctx);
> -         dri2_display_release(old_disp);
> +         /* dri2_dpy->core->bindContext failed. We cannot tell for sure why, but
> +          * setting the error to EGL_BAD_MATCH is surely better than leaving it
> +          * as EGL_SUCCESS.
> +          */
> +         return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
>         }
>   
> -      return EGL_TRUE;
> -   } else {
> -      /* undo the previous _eglBindContext */
> -      _eglBindContext(old_ctx, old_dsurf, old_rsurf, &ctx, &tmp_dsurf, &tmp_rsurf);
> -      assert(&dri2_ctx->base == ctx &&
> -             tmp_dsurf == dsurf &&
> -             tmp_rsurf == rsurf);
> -
> -      _eglPutSurface(dsurf);
> -      _eglPutSurface(rsurf);
> -      _eglPutContext(ctx);
> -
> -      _eglPutSurface(old_dsurf);
> -      _eglPutSurface(old_rsurf);
> -      _eglPutContext(old_ctx);
> -
> -      /* dri2_dpy->core->bindContext failed. We cannot tell for sure why, but
> -       * setting the error to EGL_BAD_MATCH is surely better than leaving it
> -       * as EGL_SUCCESS.
> -       */
> -      return _eglError(EGL_BAD_MATCH, "eglMakeCurrent");
> +      /* ... and refcount the dpy when successful. */
> +      dri2_dpy->ref_count++;
>      }
> +
> +   dri2_destroy_surface(drv, disp, old_dsurf);
> +   dri2_destroy_surface(drv, disp, old_rsurf);
> +   dri2_destroy_context(drv, disp, old_ctx);
> +   dri2_display_release(old_disp);
> +
> +   return EGL_TRUE;
>   }
>   
>   __DRIdrawable *




More information about the mesa-dev mailing list