Name

    EXT_device_drm
    EXT_output_drm

Name Strings

    EGL_EXT_device_drm
    EGL_EXT_output_drm

Contributors

    Daniel Kartch
    James Jones
    Christopher James Halse Rogers

Contacts

    Daniel Kartch, NVIDIA (dkartch 'at' nvidia.com)

Status

    Complete

Version

    Version 5 - December 28th, 2015

Number

    EGL Extension #79

Extension Type

    EGL device extension for EGL_EXT_device_drm

    EGL display extension for EGL_EXT_output_drm

Dependencies

    EGL_EXT_device_drm requires EGL_EXT_device_base.

    EGL_EXT_device_drm interacts with EGL_EXT_platform_device

    EGL_EXT_device_drm requires a DRM driver.

    EGL_EXT_output_drm requires EGL_EXT_output_base.

    EGL_EXT_output_drm requires a DRM driver which supports KMS.

    An EGLDisplay supporting EGL_EXT_output_drm must be associated
    with an EGLDevice supporting EGL_EXT_device_drm.

Overview

    Increasingly, EGL and its client APIs are being used in place of
    "native" rendering APIs to implement the basic graphics
    functionality of native windowing systems.  This creates demand
    for a method to initialize EGL displays and surfaces directly on
    top of native GPU or device objects rather than native window
    system objects.  The mechanics of enumerating the underlying
    native devices and constructing EGL displays and surfaces from
    them have been solved in various platform and implementation-
    specific ways.  The EGL device family of extensions offers a
    standardized framework for bootstrapping EGL without the use of
    any underlying "native" APIs or functionality.

    These extensions define how to map device and output handles between
    EGL and DRM/KMS. An EGL implementation which provides these
    extensions must have access to sufficient knowledge of the DRM
    implementation to be able to perform these mappings. No requirements
    are imposed on how this information is obtained, nor does this
    support have any implications for how EGL devices and outputs are
    implemented. Among the possibilities, support may be implemented in
    a generic fashion by layering on top of DRM, or EGL and DRM backends
    may be provided by the same vendor and share privileged lower level
    resources. An implementation which supports these extensions may
    support other low level device interfaces, such as OpenWF Display,
    as well.

New Types

    None

New Procedures and Functions

    None

New Tokens

    Added by EXT_device_drm:

        Accepted as the <name> parameter of eglQueryDeviceStringEXT

        EGL_DRM_DEVICE_FILE_EXT                 0x3233

        If EGL_EXT_platform_device is present, the following is accepted
        in the <attrib_list> of eglGetPlatformDisplayEXT().

        EGL_DRM_MASTER_FD_EXT                   0x333C

    Added by EXT_output_drm:

        Accepted in the <attrib_list> of eglGetOutputLayersEXT and as
        the <attribute> parameter of eglQueryOutputLayerAttribEXT

        EGL_DRM_CRTC_EXT                        0x3234
        EGL_DRM_PLANE_EXT                       0x3235

        Accepted in the <attrib_list> of eglGetOutputPortsEXT and as
        the <attribute> parameter of eglQueryOutputPortAttribEXT

        EGL_DRM_CONNECTOR_EXT                   0x3236

New Behavior for EXT_device_drm

    EGLDeviceEXTs may be mapped to DRM device files.

    To obtain a DRM device file for an EGLDeviceEXT, call
    eglQueryDeviceStringEXT with <name> set to EGL_DRM_DEVICE_FILE_EXT.
    The function will return a pointer to a string containing the name
    of the device file (e.g. "/dev/dri/cardN").

If EGL_EXT_platform_device is present, replace the last sentence of the
third paragraph in section 3.2 "Initialization" with the following:

    When <platform> is EGL_PLATFORM_DEVICE_EXT, the only valid attribute
    name is EGL_DRM_MASTER_FD_EXT.  If specified, the value must be a file
    descriptor with DRM master permissions on the DRM device associated
    with the specified EGLDevice, as determined by EGL_DRM_DEVICE_FILE_EXT.
    If the file descriptor does not refer to the correct DRM device or
    does not have master permissions, the behavior is undefined.  Calls to
    eglGetPlatformDeviceEXT() with the same values for <platform> and
    <native_display> but distinct EGL_DRM_MASTER_FD_EXT values will return
    separate EGLDisplays.

    If EGL requires the use of the DRM file descriptor beyond the duration
    of the call to eglGetPlatformDispay(), it will duplicate it.  If no
    file descriptor is specified and EGL requires one, it will attempt to
    open the device itself.  Applications should only need to specify a
    file descriptor in situations where EGL may fail to open a file
    descriptor itself, generally due to lack of permissions, or when EGL
    will fail to acquire DRM master permissions due to conflicts with an
    existing DRM client.  DRM master permissions are only required when EGL
    must modify output attributes.  This extension does not define any
    situations in which output attributes will be modified.

New Behavior for EXT_output_drm

    KMS CRTC, plane, and connector IDs may be used to restrict EGL
    output handle searches and may be queried from EGL output handles.

    Add to Table 3.10.3.1 in EGL_EXT_output_base:

        Attribute               Type      Access
        ---------------------   -------   ------
        EGL_DRM_CRTC_EXT        integer   S|R
        EGL_DRM_PLANE_EXT       integer   S|R

    Add to Table 3.10.3.2 in EGL_EXT_output_base:

        Attribute               Type      Access
        ---------------------   -------   ------
        EGL_DRM_CONNECTOR_EXT   integer   S|R

    Add to description of eglOutputLayerAttribEXT:

        If <layer> corresponds to a KMS CRTC and <attribute> is
        EGL_DRM_PLANE_EXT, or if <layer> corresponds to a KMS plane and
        <attribute> is EGL_DRM_CRTC_EXT, an EGL_BAD_MATCH error is
        generated.

Issues

    1)  Should different values of EGL_DRM_MASTER_FD_EXT result in separate
        EGLDisplays?

        RESOLVED: Yes.  Consider an application made up of two independent
        modules running in two independently scheduled threads.  Each
        module calls eglGetPlatformDisplayEXT():

          int fd = open("/dev/dri/card0", O_RDWR);
          int attr1[] = { EGL_DRM_MASTER_FD_EXT, fd };
          dpy1 = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT,
                                          eglDev,
                                          attr1);

        ...
                                
          dpy2 = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT,
                                          eglDev,
                                          NULL);

        Presumably, if dpy1 == dpy2, they would both be using the same DRM
        fd for output operations internally.  That would mean display
        attribute updates would likely fail if dpy2 happened to be created
        before dpy1.  This would be painful to debug.  If dpy2 != dpy1,
        failure for dpy2 would be consistent and obvious.  The application
        author would be required to work out a scheme to share the master
        FD between modules before creating EGL displays.
   
Revision History:

    #5  (December 28th, 2015) James Jones
        - Added EGL_DRM_MASTER_FD_EXT and associated
          language.
        - Added issue 1.

    #4  (August 22nd, 2014) James Jones
        - Marked complete.
        - Listed Daniel as the contact.

    #3  (June 5th, 2014) Daniel Kartch
        - Assigned enumerated values for constants.

    #2  (May 28th, 2014) Daniel Kartch
        - Simplified description of new behavior based on refinements
          to EGL_EXT_output_base.

    #1  (January 31st, 2014) Daniel Kartch
        - Initial draft, representing a signficant reworking of
          functionality previously proposed in
          EGL_EXT_native_device_drm.
