KHR_display_reference

Name

KHR_display_reference

Name Strings

EGL_KHR_display_reference

Contributors

James Jones
Daniel Kartch

Contacts

James Jones,  NVIDIA  (jajones 'at' nvidia.com)

Status

Complete
Ratified by the Khronos Board of Promoters on March 31, 2017.

Version

Version 4 - March 15, 2018

Number

EGL Extension #126

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 EGL platform extensions.

Interacts with the EGL_EXT_device_query extension.

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 are expected to remain available until application
termination once they are instantiated.  However, EGL does not
provide reasonable semantics in the case where applications rely on
toolkit libraries which use EGL independently from the application
itself.

This issue can be solved by adding a per-EGLDisplay reference
counter which is incremented by eglInitialize calls. Resource
destruction can then be deferred until a corresponding number of
eglTerminate calls is made. However, switching to this behavior
universally could cause backwards incompatibility problems with
existing applications that assume a single eglTerminate will
immediately free resources regardless of how many times the display
has been initialized.

We therefore must support both behaviors. A new attribute specified
when the EGLDisplay is obtained will indicate whether or not
reference counting is enabled. If an application requests the
EGLDisplay multiple times with different values for this attribute,
two separate displays will be returned. The one potential drawaback
is that these displays will have independent resource spaces, so
objects allocated from one cannot be used by the other. However, the
goal here is to support modules that access EGL independently. In
such a use case, they are not likely to need to share resources with
another module, particularly one that uses a different method for
accessing the display.

New Types

None

New Functions

EGLBoolean eglQueryDisplayAttribKHR(EGLDisplay dpy,
                                    EGLint name,
                                    EGLAttrib *value);

New Tokens

Accepted as an attribute in the <attrib_list> parameter of
eglGetPlatformDisplay and the <name> parameter of
eglQueryDisplayAttribKHR:

    EGL_TRACK_REFERENCES_KHR                         0x3352

In section "3.2 Initialization":

Remove the sentence in the description of eglGetPlatformDisplay indicating no valid attribute names are defined, and add the following:

The EGL_TRACK_REFERENCES_KHR attribute may be set to EGL_TRUE or
EGL_FALSE to indicate whether or not an EGLDisplay that tracks
reference counts for eglInitialize and eglTerminate calls (as
described below) is desired. If not specified, the default is
platform dependent. Implementations are not required to support both
EGL_TRUE and EGL_FALSE for this attribute. If separate successful
calls are made to eglGetPlatformDisplay requesting default and non-
default behavior for reference counting, two independent EGLDisplays
will be returned.

Also add to the Errors section:

An EGL_BAD_ATTRIBUTE error is generated if the requested value for
EGL_TRACK_REFERENCES_KHR is not supported.

Replace the first sentence of the second paragraph of the description of eglInitialize with:

When a previously uninitialized display is initialized, its
reference count will be set to one. Initializing an already-
initialized display is allowed, and will return EGL_TRUE and update
the EGL version numbers, but has no other effect except to increment
the display's reference count if its EGL_TRACK_REFERENCES_KHR
attribute is EGL_TRUE.

Insert after the declaration of eglTerminate:

If the specified display's EGL_TRACK_REFERENCES_KHR attribute is
EGL_FALSE, eglTerminate will immediately set its reference count
to zero. Otherwise, its reference count will be decremented if it
is above zero. When an initialized display's reference count reaches
zero, termination will occur.

Replace the second sentence of the last paragraph with:

All displays start out uninitialized with a reference count of zero.

Add to the end of section "3.3 EGL Queries".

To query non-string attributes of an initialized display, use:

    EGLBoolean eglQueryDisplayAttribKHR(EGLDisplay dpy,
                                        EGLint name,
                                        EGLAttrib *value);

On success, EGL_TRUE is returned, and the value of the attribute
specified by <name> is returned in the space pointed to by <value>.

On failure, EGL_FALSE is returned.  An EGL_NOT_INITIALIZED error
is generated if EGL is not initialized for <dpy>.  An
EGL_BAD_ATTRIBUTE error is generated if <name> is not a valid
value. Currently, the only valid attribute name is
EGL_TRACK_REFERENCES_KHR.

Interactions with EGL_KHR_platform_android:

If eglGetPlatformDisplay() is called with <platform> set to
EGL_PLATFORM_ANDROID_KHR, the default value of
EGL_TRACK_REFERENCES_KHR is EGL_TRUE.

Interactions with EGL_EXT_platform_device, EGL_KHR_platform_gbm, EGL_KHR_platform_x11, and EGL_KHR_platform_wayland:

If eglGetPlatformDisplay() is called with <platform> set to
EGL_PLATFORM_DEVICE_EXT, EGL_PLATFORM_GBM_KHR, EGL_PLATFORM_X11_KHR,
or EGL_PLATFORM_WAYLAND_KHR, the default value of
EGL_TRACK_REFERENCES_KHR is EGL_FALSE.

Interactions with EGL_EXT_device_query:

The eglQueryDisplayAttribKHR function defined here is equivalent to
eglQueryDisplayAttribEXT defined by EGL_EXT_device_query, and the
attribute names supported are a superset of those provided by both
extensions and any others which rely on them.

Issues

1.  What is the default value for EGL_TRACK_REFERENCES_KHR?

    RESOLUTION: For backwards compatibility reasons, the default
    value is platform-specific. The Android platform has
    historically implemented the behavior of
    EGL_TRACK_REFERENCES_KHR = EGL_TRUE, while other platforms
    defaulted to the opposite behavior. Application components
    capable of supporting either behavior will be able to query
    the value to determine how to proceed.

2.  Should the value of EGL_TRACK_REFERENCES_KHR affect whether
    eglGetPlatformDisplay returns a new display handle or an
    existing one given otherwise identical parameters?

    RESOLUTION: Yes. For any given combination of platform display
    handle and other attributes, calling eglGetPlatformDisplay
    with different values for EGL_TRACK_REFERENCES_KHR will result
    in two different EGLDisplay handles being returned.

    Resources created with respect to one of these EGLDisplays will
    not be accessible to the other. This restriction is unlikely to
    cause issues, because the reference counting is added primarily
    to support independent toolkits. Application components which
    independently initialize and terminate the display are not
    likely to share resources, particularly if they use different
    methods for that initialization.

3.  Should the new display attribute be queryable?

    RESOLUTION: Yes. Not all implemenations will support both TRUE
    and FALSE for this attribute. Application components capable of
    supporting either value will allow the default to be chosen, and
    then query the value to determine how to handle termination.

4.  Should implementations which support this extension be required
    to support both TRUE and FALSE for the attribute?

    RESOLUTION: No. Lack of refcounting in the core specification is
    considered by many to be a flaw, and some implementations/platforms
    will choose to always provide refcounting behavior. This technically
    makes them non-compliant. The addition of this extension should allow
    that deviation.

Revision History

#4 (March 15, 2018) Jon Leech

    - Change extension number from 118 to 126 to avoid an accidental
      collision.

#3 (January 12, 2017) Daniel Kartch

    - Change to KHR.
    - Allocate enum value.

#2 (November 15, 2016) Daniel Kartch

    - Full termination portion split off into separate extension
      EGL_XXX_full_termination.
    - Update reference counting to have separate EGLDisplays for
      the same native display, one with reference counting and
      one without.
    - Add query function to determine attribute value.

#1 (October 28, 2014) James Jones

    - Initial draft as EGL_XXX_display_reference