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

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



On 04/28/2017 08:05 AM, Tapani Pälli wrote:
> 
> 
> 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?

Sorry nope, now I got it. You mean surface should survive because it is 
still current at same thread.


> 
>> 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>>
>>
>>
>>
>>
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list