[Mesa-dev] [PATCH] Releasing a surfaceless EGL context doesn't release underlying DRI context.

Daniel Stone daniel at fooishbar.org
Fri Oct 24 03:18:01 PDT 2014


Hi,

On 24 October 2014 11:03, Kalyan Kondapally <
kondapallykalyancontribute at gmail.com> wrote:

> driUnbindContext() checks for valid drawables before calling the driver
> unbind function. In case of Surfaceless contexts, the drawables are always
> Null and we end up not releasing the underlying DRI context. Moving the
> call to the driver function before the drawable validity checks fixes
> things.
>

Yep, that looks good to me; seems like you've found the only possible case
that would trigger this breakage. Calling DestroyContext will always unbind
if it's current in that thread (see the end _mesa_free_context_data); it's
only when you follow that exact pattern of:
  - create surfaceless context
  - make ctx current
  - make something else current
  - {another thread} destroy ctx
  - make ctx current again
that you hit the crash.

The only effect of calling UnbindContext() is that _mesa_make_current(NULL,
NULL, NULL) gets called, which is what we want.

Could you please document some part of that in the commit message for
future archaeology?

Reviewed-by: Daniel Stone <daniels at collabora.com>

Cheers,
Daniel


> Signed-off-by: Alexandros Frantzis <Alexandros.Frantzis at canonical.com>
> Signed-off-by: Kalyan Kondapally <kalyan.kondapally at intel.com>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=74563
> ---
>  src/mesa/drivers/dri/common/dri_util.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/common/dri_util.c
> b/src/mesa/drivers/dri/common/dri_util.c
> index 6c78928..02499f2 100644
> --- a/src/mesa/drivers/dri/common/dri_util.c
> +++ b/src/mesa/drivers/dri/common/dri_util.c
> @@ -569,6 +569,12 @@ static int driUnbindContext(__DRIcontext *pcp)
>      if (pcp == NULL)
>         return GL_FALSE;
>
> +    /*
> +    ** Call driUnbindContext before checking for valid drawables
> +    ** to handle surfaceless contexts properly.
> +    */
> +    pcp->driScreenPriv->driver->UnbindContext(pcp);
> +
>      pdp = pcp->driDrawablePriv;
>      prp = pcp->driReadablePriv;
>
> @@ -576,8 +582,6 @@ static int driUnbindContext(__DRIcontext *pcp)
>      if (!pdp && !prp)
>         return GL_TRUE;
>
> -    pcp->driScreenPriv->driver->UnbindContext(pcp);
> -
>      assert(pdp);
>      if (pdp->refcount == 0) {
>         /* ERROR!!! */
> --
> 1.9.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141024/8f25eaef/attachment.html>


More information about the mesa-dev mailing list