Name

    EXT_gl_colorspace_bt2020

Name Strings

    EGL_EXT_gl_colorspace_bt2020_linear
    EGL_EXT_gl_colorspace_bt2020_pq

Contributors

    Tom Cooksey
    Andrew Garrard
    Jesse Hall
    Mathias Heyer
    Lauri Hyvarinen
    Adam Jackson
    James Jones
    Daniel Koch
    Jeff Leger
    Weiwan Liu
    Jeff Vigil

Contact

    Weiwan Liu (weiwliu 'at' nvidia.com)

IP Status

    No known IP claims.

Status

    Complete

Version

     Version 7 - Nov 22, 2016

Number

    EGL Extension #107

Dependencies

    These extensions are written against the wording of the EGL 1.5
    specification (August 27, 2014).

    These extensions require EGL_KHR_gl_colorspace.

Overview

    Applications may wish to take advantage of a larger color gamut in the
    BT.2020 (ITU-R Recommendation BT.2020) color space. These extensions allow
    applications to do so by communicating to the platform the color space the
    framebuffer data is in, i.e. BT.2020 color space, as well as the encoding
    of the framebuffer data, which can be either linear or PQ (Dolby Perceptual
    Quantizer - SMPTE ST 2084) encoding. Applications are expected to prepare
    the framebuffer data properly.

New Procedures and Functions

    None.

New Tokens

    Accepted as attribute values for EGL_GL_COLORSPACE by
    eglCreateWindowSurface, eglCreatePbufferSurface and eglCreatePixmapSurface:

    [[ If EGL_EXT_gl_colorspace_bt2020_linear is supported ]]

        EGL_GL_COLORSPACE_BT2020_LINEAR_EXT            0x333F

    [[ If EGL_EXT_gl_colorspace_bt2020_pq is supported ]]

        EGL_GL_COLORSPACE_BT2020_PQ_EXT                0x3340

Modifications to the EGL 1.5 Specification

    Insert below text in the 3rd paragraph on page 33 in 3.5.1 "Creating On-
    Screen Rendering Surfaces, before "The default value of EGL_GL_COLORSPACE
    is EGL_GL_COLORSPACE_LINEAR.":

    [[ If EGL_EXT_gl_colorspace_bt2020_linear is supported ]]

    If its value is EGL_GL_COLORSPACE_BT2020_LINEAR_EXT, then a linear BT.2020
    color space is assumed, with a corresponding GL_FRAMEBUFFER_ATTACHMENT_-
    COLOR_ENCODING value of GL_LINEAR.

    [[ If EGL_EXT_gl_colorspace_bt2020_pq is supported ]]

    If its value is EGL_GL_COLORSPACE_BT2020_PQ_EXT, then a non-linear, PQ
    encoded BT.2020 color space is assumed, with a corresponding GL_FRAMEBUFFER-
    _ATTACHMENT_COLOR_ENCODING value of GL_LINEAR, as neither OpenGL nor OpenGL
    ES supports PQ framebuffers. Applications utilizing this option need to
    ensure that PQ encoding is performed on the application side.

    Modify the 4th paragraph on the same page:

    Note that the EGL_GL_COLORSPACE_SRGB attribute is used only by OpenGL and
    OpenGL ES contexts supporting sRGB framebuffers. EGL itself does not
    distinguish multiple colorspace models. Refer to the "sRGB Conversion"
    sections of the OpenGL 4.4 and OpenGL ES 3.0 specifications for more
    information.

    Add a paragraph after the 4th paragraph above:

    [[ If EGL_EXT_gl_colorspace_bt2020_linear is supported ]]

    When using a floating-point EGL surface with EGL_GL_COLORSPACE_BT2020_-
    LINEAR_EXT, the output values in the display-referred range of [0.0, 1.0]
    correspond to a luminance range of 0 to 80 nits, which is the same luminance
    range for sRGB. To achieve a larger dynamic range of 0 to 10000 nits, which
    is the same range for PQ, the display-referred output values can go beyond
    1.0 and to a range of [0.0, 125.0], where 0.0 corresponds to 0 nit and 125.0
    corresponds to 10000 nits.

    [[ If EGL_EXT_gl_colorspace_bt2020_pq is supported ]]

    When using a floating-point EGL surface with EGL_GL_COLORSPACE_BT2020_PQ_-
    EXT, to achieve the luminance range of 0 to 10000 nits (candela per square
    meter) as defined by the SMPTE 2084 standard, applications can output values
    in a display-referred range of [0.0, 1.0], where 0.0 corresponds to 0 nit
    and 1.0 corresponds to 10000 nits.

Errors

    Modify below error in the "Errors" section on page 34:

    "If config does not support the OpenVG colorspace or alpha format at-
    tributes specified in attrib list (as defined for eglCreatePlatformWindow-
    Surface), an EGL_BAD_MATCH error is generated."

    To include OpenGL colorspace as well:

    "If config does not support the OpenGL colorspace, the OpenVG colorspace or
    alpha format attributes specified in attrib list (as defined for eglCreate-
    PlatformWindowSurface), an EGL_BAD_MATCH error is generated."

Issues

    1. When creating an EGL surface, what happens when the specified colorspace
       is not compatible with or supported by the EGLConfig?

       RESOLVED: There is currently no way to query the compatibility of a
       EGLConfig and colorspace pair. So the only option is to define an error
       case similar to that of OpenVG colorspace, i.e. if config does not
       support the colorspace specified in attrib list (as defined for egl-
       CreateWindowSurface, eglCreatePbufferSurface and eglCreatePixmapSurface),
       an EGL_BAD_MATCH error is generated.

Revision History

    Version 1, 2016/04/27
      - Internal revisions

    Version 2, 2016/05/20
      - Rename to EXT

    Version 3, 2016/05/25
      - Add issues

    Version 4, 2016/06/06
      - Split up the extension and put each colorspace option into an individual
        extension

    Version 5, 2016/06/17
      - Correct the meaning of the data from scene-referred to display-referred

    Version 6, 2016/10/27
      - Mark issue #1 as "RESOLVED" and add an error case

    Version 7, 2016/11/22
      - Change status to complete

