[Mesa-dev] EGL: Question about deferred context and surface destroy

Tapani Pälli tapani.palli at intel.com
Fri Apr 28 05:05:21 UTC 2017



On 04/27/2017 06:59 PM, Mike Gorchak wrote:
> Hi Tapani,
> 
> Could you please do modification like I suggested to eglut library and 
> check how it is going?
> 
> I'm asking because I see following code:
> 
> EGLBoolean EGLAPIENTRY
> eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
> {
>     _EGLDisplay *disp = _eglLockDisplay(dpy);
>     _EGLSurface *surf = _eglLookupSurface(surface, disp);
>     _EGLDriver *drv;
>     EGLBoolean ret;
> 
>     _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
>     _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
>     _eglUnlinkSurface(surf);
>     ret = drv->API.DestroySurface(drv, disp, surf);
> 
>     RETURN_EGL_EVAL(disp, ret);
> }
> 
> It does explicit call to _eglUnlinkSurface(surf) without any conditions 
> which unlinks Surface from current Display and then if we re-use this 
> surface, for example, in eglSwapBuffer() it return EGL_BAD_SURFACE, 
> because _eglCheckSurface() will return error (NULL). This surface was 
> unlinked from Display, but not yet destroyed.

ok, so in the driver side we do handle refcount but the API side has 
called _eglUnlinkSurface ... yeah, this looks a bit weird, I'll try to 
think of an example for this.

I did not quite get your eglut proposal, I believe in that one I will be 
destroying surface and context since no other thread has them current at 
that point. I should have 2 threads where both have made surface current 
and then destroy surface in another and make sure surface is still 
usable in another, right?


> Same applies for Context resource.
> 
> Thank you!
> 
> On Thu, Apr 27, 2017 at 2:37 AM, Tapani Pälli <tapani.palli at intel.com 
> <mailto:tapani.palli at intel.com>> wrote:
> 
> 
> 
>     On 04/26/2017 05:08 PM, Mike Gorchak wrote:
> 
>         Hi Tapani,
> 
>         Sure, I can share them, but they are QNX based. And as far as I
>         remember it was an issue in the past :)
> 
> 
>     I thought to ask because there are some multithread dEQP EGL tests
>     around this and they are passing at the moment.
> 
>     Surface and context reference counts are incremented in
>     _eglBindContext that gets called during makecurrent. Surface count
>     decrements via _eglPutSurface and _eglPutContext calls. AFAIK
>     everything looks OK.
> 
> 
>         I think the simplest way for you is to add following calls to
>         function eglutCreateWindow():
> 
>         https://cgit.freedesktop.org/mesa/demos/tree/src/egl/eglut/eglut.c#n321
>         <https://cgit.freedesktop.org/mesa/demos/tree/src/egl/eglut/eglut.c#n321>
> 
>         |if (!eglMakeCurrent(_eglut->dpy, win->surface, win->surface,
>         win->context)) _eglutFatal("failed to make window current");|
> 
>         to
> 
>         |if (!eglMakeCurrent(_eglut->dpy, win->surface, win->surface,
>         win->context)) _eglutFatal("failed to make window current");
>         |
> 
>         |||eglDestroySurface(|||_eglut->dpy, ||||win->surface|);|
> 
>         |eglDestroyContext||(||||_eglut->dpy, ||||win->context||);|
> 
>         And then run GLES 1.x gears for example. According to EGL
>         specification, these Destroy calls should be delayed till
>         surface and context is not current in any thread. Perhaps I
>         understand specification too literally, that's why I'm asking
>         rather than reporting it as a bug.
> 
>         Thank you!
> 
> 
>         On Wed, Apr 26, 2017 at 2:09 AM, Tapani Pälli
>         <tapani.palli at intel.com <mailto:tapani.palli at intel.com>
>         <mailto:tapani.palli at intel.com <mailto:tapani.palli at intel.com>>>
>         wrote:
> 
>              On 04/25/2017 10:20 PM, Mike Gorchak wrote:
> 
>                  Hi all,
> 
>                  During a quick tests of latest Mesa3D versions at different
>                  branches 12.x, 13.x, 17.x we have found that deferred
>             context and
>                  surface destroy doesn't work properly.
> 
> 
>              What kind of test case are you using, could you share this?
> 
>                  According to docs:
>             https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglDestroySurface.xhtml
>             <https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglDestroySurface.xhtml>
>                 
>             <https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglDestroySurface.xhtml
>             <https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglDestroySurface.xhtml>>
> 
>                  Description
>                  If the EGL surface is not current to any thread,
>             eglDestroySurface
>                  destroys it immediately. Otherwise, surface is
>             destroyed when it
>                  becomes not current to any thread. Furthermore, resources
>                  associated with a pbuffer surface are not released
>             until all color
>                  buffers of that pbuffer bound to a texture object have
>             been released.
> 
>                  Same for context destroy:
>             https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglDestroyContext.xhtml
>             <https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglDestroyContext.xhtml>
>                 
>             <https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglDestroyContext.xhtml
>             <https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglDestroyContext.xhtml>>
> 
>                  Description
>                  If the EGL rendering context is not current to any thread,
>                  eglDestroyContext destroys it immediately. Otherwise,
>             context is
>                  destroyed when it becomes not current to any thread.
> 
>                  Should this behavior be handled at EGL common DRI2
>             level or DRI2
>                  platform driver level or it should be handled by EGL
>             itself? I can
>                  see some refcounts implemented for EGL surfaces,
>             buteglMakeCurrent
>                  seems don't increment them for surfaces and contexts.
> 
>                  Thanks!
> 
> 
> 
>                  _______________________________________________
>                  mesa-dev mailing list
>             mesa-dev at lists.freedesktop.org
>             <mailto:mesa-dev at lists.freedesktop.org>
>             <mailto:mesa-dev at lists.freedesktop.org
>             <mailto:mesa-dev at lists.freedesktop.org>>
>             https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>             <https://lists.freedesktop.org/mailman/listinfo/mesa-dev>
>                 
>             <https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>             <https://lists.freedesktop.org/mailman/listinfo/mesa-dev>>
> 
> 
> 
> 
> 


More information about the mesa-dev mailing list