Name

    EXT_gl_colorspace_scrgb_linear

Name Strings

    EGL_EXT_gl_colorspace_scrgb_linear

Contributors

    Courtney Goeltzenleuchter
    Lauri Hyvarinen
    Weiwan Liu
    Arun Swain

Contact

    Weiwan Liu (weiwliu 'at' nvidia.com)

IP Status

    No known IP claims.

Status

    Complete

Version

     Version 4 - August 25, 2017

Number

    EGL Extension #108

Dependencies

    This extension is written against the wording of the EGL 1.5 specification
    (August 27, 2014).

    This extension requires EGL_KHR_gl_colorspace and EGL_EXT_pixel_format_-
    float, and interacts with EGL_EXT_surface_SMPTE2086_metadata. This extension
    is closely related to the EGL_EXT_gl_colorspace_scrgb.

Overview

    This extension provides an extended sRGB (also called scRGB) color
    space option for applications to choose from when creating an EGLSurface.
    This extension defines the linear display referred scRGB color space.
    It has the same white point and color primaries as sRGB, and thus is
    backward-compatible with sRGB. Refer to the IEC 61966-2-2:2003 standard
    for details on scRGB color space.

    This extension chooses to use floating-point formats for scRGB color space.
    For each color channel, the floating-point values of 0.0 and 1.0 still
    correspond to sRGB chromaticities and luminance levels. However, scRGB
    space allows for color values beyond the range of [0.0, 1.0], and can thus
    achieve a larger color volume than that of sRGB. As it is display referred,
    scRGB space makes assumptions of how the floating-point color values should
    map to luminance levels by the underlying display pipeline. The expected
    mapping is such that a color value of (1.0, 1.0, 1.0) corresponds to a
    luminance level of 80 nits on a standardized studio monitor. As the color
    value per channel goes beyond 1.0 and up to 125.0, the corresponding
    luminance levels also increase linearly to a maximum of 10000 nits.

New Procedures and Functions

    None.

New Tokens

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

        EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT            0x3350

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 its value is EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT, then a linear scRGB
    color space is assumed, with a corresponding GL_FRAMEBUFFER_ATTACHMENT_-
    COLOR_ENCODING value of GL_LINEAR. scRGB is defined to use the same
    primaries and white-point as sRGB. See IEC 61966-2-2:2003 for details.

    Add two paragraphs after the 4th paragraph above:

    When using a floating-point EGL surface with EGL_GL_COLORSPACE_SCRGB_-
    LINEAR_EXT, the display-referred values in the range of (0.0, 0.0, 0.0) to
    (1.0, 1.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 up
    to 10000 nits, the output values can go beyond 1.0 and to a range of
    [0.0, 125.0] for each channel.

    The effective color gamut and luminance range of the content that extend
    beyond those of sRGB may be described via EGL_EXT_surface_SMPTE2086_metadata.
    It is highly recommended to supply such metadata, so the display pipeline
    may use this information to transform the the colors in a manner that
    attempts to preserve the creative intent of the color data.

    In the "Errors" section on page 34 in 3.5.1 "Creating On Screen Rendering
    Surfaces", change the 3rd error definition to:

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

Issues

    * Clarifications on the scRGB colorspace extensions

Revision History

    Version 1, 2016/10/21
    - Initial draft

    Version 2, 2016/11/18
    - Add reference to IEC 61966-2-2:2003 standard and minor wording changes

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

    Version 4, 2017/08/25
    - Clarifications on the definition of scRGB colorspace

