[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