blob: da06a12cfbe01fb312c552c6a8f41339f2b8f42c [file]
Name
EXT_display_alloc
Name Strings
EGL_EXT_display_alloc
Contributors
Contacts
Kyle Brenneman, NVIDIA (kbrenneman 'at' nvidia.com)
Status
Complete.
Version
Version 1 - March 25, 2022
Number
EGL Extension #154
Extension Type
EGL client extension
Dependencies
Written based on the wording of the EGL 1.5 specification.
Requires EGL_EXT_platform_base or EGL 1.5
Interacts with the EGL_KHR_display_reference extension
This extension includes the function eglQueryDisplayAttribEXT as
defined in EGL_EXT_device_query.
Overview
The existing semantics of EGLDisplay object lifetimes work well for
applications in which one module manages all EGL usage, and in which
EGL displays and the underlying native displays are expected to
remain available until application termination once they are
instantiated. However, EGL does not provide reasonable semantics for
the following use cases:
1) Applications that rely on toolkit libraries which use EGL
independently from the application itself.
2) Applications that use multiple native display objects with EGL
and wish to completely release resources associated with
EGLDisplay objects they no longer need.
3) Platforms where the native display connection can be closed,
such as X11 or Wayland. If the native display is closed, then
there's no possible reasonable behavior for an EGLDisplay.
This extension solves these problems by adding the ability to create
multiple unique, unshared EGLDisplay objects from the same native
display, and to destroy those EGLDisplay objects when the caller no
longer needs them.
New Types
None
New Functions
EGLBoolean eglDestroyDisplayEXT(EGLDisplay dpy);
New Tokens
Accepted as an attribute in the <attrib_list> parameter of
eglGetPlatformDisplay and the <name> parameter of
eglQueryDisplayAttribEXT:
EGL_ALLOC_NEW_DISPLAY_EXT 0x3379
In section "3.2 Initialization":
Remove the sentence in the description of eglGetPlatformDisplay
indicating no valid attribute names are defined, and add the following:
If the EGL_ALLOC_NEW_DISPLAY_EXT attribute is set to EGL_TRUE, then
eglGetPlatformDisplay creates a new, unique EGLDisplay handle, even
if the platform, native_display, and attributes would match an
existing EGLDisplay.
The default value of the EGL_ALLOC_NEW_DISPLAY_EXT attribute is
EGL_FALSE.
Add to the end of section "3.2 Initialization":
To destroy an EGLDisplay handle, use:
EGLBoolean eglDestroyDisplayEXT(EGLDisplay dpy);
eglDestroyDisplayEXT frees the handle <dpy>.
If <dpy> is initialized, or if it is current to one or more threads,
then is is marked for deletion, and it will be destroyed when it is
terminated and no longer current.
After <dpy> is destroyed, it is not valid to pass to any EGL
function. Subsequent calls to eglGetPlatformDisplay may re-use the
EGLDisplay handle value for new displays.
If <dpy> was not created with the EGL_ALLOC_NEW_DISPLAY_EXT attribute
set to EGL_TRUE, then an EGL_BAD_ACCESS error is generated.
Changes to section "3.3 EGL Queries":
Add EGL_ALLOC_NEW_DISPLAY_EXT to the attributes accepted by
eglQueryDisplayAttribEXT.
Interactions with EGL_KHR_display_reference:
If a display has both EGL_ALLOC_NEW_DISPLAY_EXT and
EGL_TRACK_REFERENCES_KHR set to EGL_TRUE, then a call to
eglDestroyDisplayEXT will destroy the display after the display's
initialization count reaches zero.
That is, the display handle is not destroyed until eglTerminate has
been called as many times as eglInitialize.
Issues
1. What happens if an EGLDisplay is deleted while it's current to a
thread?
RESOLVED: Follow the same behavior as destroying a current
EGLContext or EGLSurface. Mark the display for deletion, but
don't delete it until it's no longer current.
2. What happens if an EGLDisplay is deleted while it's initialized?
How should this interact with EGL_KHR_display_reference?
RESOLVED: An initialized display counts as "in use" for the
purposes of destruction, so the display doesn't get destroyed
until it's terminated. With EGL_KHR_display_reference, that just
means you have to call eglTerminate enough times to actually
terminate the display.
Treating an initialized display as "in use" allows for
compatibility with any libraries that get an EGLDisplay handle
from somewhere else, but expect to use EGL_KHR_display_reference
to maintain a reference to that display.
In addition, that keeps eglDestroyDisplayEXT and eglTerminate
orthogonal. If eglDestroyDisplayEXT destroyed an initialized
EGLDisplay, then it would effectively have one (or more)
implicit calls to eglTerminate.
Also note that unlike EGLContext and EGLSurface objects (whose
handles are invalidated immediately when they're marked for
deletion), an EGLDisplay handle remain valid until it's no
longer in use. That's necessary because eglMakeCurrent doesn't
accept EGL_NO_DISPLAY even to release the current context.
3. Do we need a separate eglDestroyDisplayEXT function, instead of
just destroying the display when it's terminated?
RESOLVED: Yes. Using a separate function means that the
semantics of eglTerminate are unchanged. That keeps this
extension orthogonal to EGL_KHR_display_reference.
4. What happens if you create two EGLDisplays from the same native
display?
RESOLVED: The two EGLDisplays will share the same native display
connection, but they are otherwise separate. Each EGLDisplay can
be initialized, terminated, and destroyed independently of one
another, and they're separate namespaces for EGLContexts,
EGLSurfaces, and other EGL objects.
Note that this not a change from core EGL: Calling
eglGetPlatformDisplay with the same native display but different
attribute lists already creates multiple EGLDisplay objects.
EGL_ALLOC_NEW_DISPLAY_EXT just tells eglGetPlatformDisplay to
create a new EGLDisplay even if the attribute lists are the
same.
Revision History
#1 (March 25, 2022) Kyle Brenneman
- Initial draft