Name

    NV_sRGB_formats

Name Strings

    GL_NV_sRGB_formats

Contributors

    Contributors to ARB_framebuffer_sRGB and EXT_texture_sRGB
    Mathias Heyer, NVIDIA
    Jussi Rasanen, NVIDIA
    Greg Roth, NVIDIA

Contact

    Greg Roth, NVIDIA (groth 'at' nvidia.com)

Status

    Complete

Version

    Date: 17 Jan, 2013
    Revision: 5

Number

    OpenGL ES Extension #148

Dependencies

    OpenGL ES 2.0 is required.

    This extension is written against the OpenGL ES 2.0.25
    specification.

    Requires EXT_sRGB.

    OES_compressed_ETC1_RGB8_texture affects the definition of this
    extension.

    EXT_texture_storage affects the definition of this extension.

    NV_texture_array affects the definition of this extension.

    NV_texture_compression_s3tc affects the definition of this
    extension.

    NV_texture_compression_s3tc_update affects the definition of this
    extension.

Overview

    This extension adds new uncompressed and compressed color texture
    formats with nonlinear sRGB color components.

    Luminance and luminance alpha provide support for textures
    containing sRGB values with identical red, green, and blue
    components.

    Compressed texture formats using S3TC and ETC1 compression
    algorithms are also added to provide compressed sRGB texture
    options.

    Finally, sized variant of sRGB, sLuminace, and sLuminance_alpha are
    provided for immutable textures defined using the EXT_texture_storage
    extension.

New Procedures and Functions

    None

New Tokens

    Accepted by the <format> and <internalformat> parameter of
    TexImage2D, and TexImage3DNV.  These are also accepted by <format>
    parameter of TexSubImage2D and TexSubImage3DNV:

        SLUMINANCE_NV                                  0x8C46
        SLUMINANCE_ALPHA_NV                            0x8C44

    Accepted by the <internalformat> parameter of RenderbufferStorage,
    TexStorage2DEXT, and TexStorage3DEXT:
        SRGB8_NV                                       0x8C41

    Accepted by the <internalformat> parameter of TexStorage2DEXT and
    TexStorage3DEXT:
        SLUMINANCE8_NV                                 0x8C47
        SLUMINANCE8_ALPHA8_NV                          0x8C45

    Accepted by the <internalformat> parameters of TexImage2D,
    TexImage3DNV, CompressedTexImage2D, and CompressedTexImage3DNV as
    well as the <format> parameter of TexSubImage2D, TexSubImage3DNV,
    CompressedTexSubImage2D, and CompressedTexSubImage3DNV:

        COMPRESSED_SRGB_S3TC_DXT1_NV                   0x8C4C
        COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV             0x8C4D
        COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV             0x8C4E
        COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV             0x8C4F

    Accepted by the <internalformat> parameter of CompressedTexImage2D,
    and CompressedTexImage3DNV:

        ETC1_SRGB8_NV                                  0x88EE

Additions to Chapter 3 of the OpenGL ES 2.0.25 Specification
(Rasterization)

Modify Section 3.7.1, "Texture Image Specification":

    Add 2 new rows to Table 3.3, "TexImage2D and ReadPixels formats":

                              Element Meaning
        Format Name           and Order        Target Buffer
        ----------------      ---------------  -------------
        SLUMINANCE_NV         Luminance        Color
        SLUMINANCE_ALPHA_NV   Luminance, A     Color

    Add 2 new rows to Table 3.4, "Valid pixel format and type
    combinations":

        Format                Type             Bytes per Pixel
        ----------------      ---------------  ---------------
        SLUMINANCE_NV         UNSIGNED_BYTE    1
        SLUMINANCE_ALPHA_NV   UNSIGNED_BYTE    2

    Add 2 new rows to "Valid combinations of format, type, and sized
    internal-format" Table:

        Internal Format        Format              Type
        ----------------       --------            ------
        SLUMINANCE8_NV         SLUMINANCE_NV       UNSIGNED_BYTE
        SLUMINANCE8_ALPHA8_NV  SLUMINANCE_ALPHA_NV UNSIGNED_BYTE


    Add 5 new rows to "Specific Compressed Internal Formats" Table

        Compressed Internal Format           Base Internal Format
        -----------------------------------  --------------------
        COMPRESSED_SRGB_S3TC_DXT1_NV         RGB
        COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV   RGBA
        COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV   RGBA
        COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV   RGBA
        ETC1_SRGB8_NV                        RGB

    Modify Section 3.7.2 "Alternate Texture Image Specification
    Commands"

    Modify the first sentence of the last paragraph (added by
    NV_texture_compression_s3tc_update):

    When the internal format of the texture object is
    COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT,
    COMPRESSED_RGBA_S3TC_DXT3_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT,
    COMPRESSED_SRGB_S3TC_DXT1_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV
    COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV, or COMPRESSED_SRGB_ALPHA_-
    S3TC_DXT5_NV the update region specified in TexSubImage2D must be
    aligned to 4x4 pixel blocks. ...

    Modify Section 3.7.3 "Compressed Texture Images"

    Add to the description of CompressedTexImage*

    If <internalformat> is COMPRESSED_SRGB_S3TC_DXT1_NV,
    COMPRESSED_SRGBA_S3TC_DXT1_NV, COMPRESSED_SRGBA_S3TC_DXT3_NV, or
    COMPRESSED_SRGBA_S3TC_DXT5_NV, the compressed texture is stored
    using one of several S3TC compressed texture image formats.  The
    S3TC texture compression algorithm supports only 2D images.
    CompressedTexImage3DNV produce an INVALID_OPERATION error if
    <internalformat> is an S3TC format and <target> is not TEXTURE_-
    2D_ARRAY_NV.

    If <internalformat> is ETC1_SRGB8_NV, the compressed texture is an
    ETC1 compressed texture.

    Change the penultimate paragraph describing CompressedTexSubImage*
    (added by NV_texture_compression_s3tc):

    If the internal format is one of COMPRESSED_RGB_S3TC_DXT1_NV,
    COMPRESSED_RGBA_S3TC_DXT1_NV, COMPRESSED_RGBA_S3TC_DXT3_NV,
    COMPRESSED_RGBA_S3TC_DXT5_NV, COMPRESSED_SRGBA_S3TC_DXT1_NV,
    COMPRESSED_SRGBA_S3TC_DXT3_NV, or COMPRESSED_SRGBA_S3TC_DXT5_NV
    the compressed texture is stored using one of several S3TC
    compressed texture image formats ...

    Modify Section 3.7.14, "sRGB Texture Color Conversion":

    Change the first sentence to:

    "If the currently bound texture's internal format is one
    of SRGB_EXT, SRGB_ALPHA_EXT, SLUMINANCE_ALPHA_NV, SLUMINANCE_NV,
    COMPRESSED_SRGB_S3TC_DXT1_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV,
    COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV,
    or ETC1_SRGB8_NV the red, green, and blue components are converted
    from an sRGB color space to a linear color space as part of
    filtering described in sections 3.7.7 and 3.7.8. ..."

Additions to Chapter 4 of the OpenGL ES 2.0.25 Specification (Per-
Fragment Operations and the Framebuffer)

    The following should be added to table 4.5 "Renderbuffer Image
    formats":

    SRGB8_NV              color_renderable 8  8  8  -  -  -

Additions to Chapter 6 of the OpenGL ES 2.0.25 Specification (State and
State Requests)

    In section 6.1.3, modify the last sentence of the description of
    GetFramebufferAttachmentParameteriv:

    "... For framebuffer objects, components are sRGB-encoded if the
    internal format of a color attachment is SRGB_EXT, SRGB8_NV,
    SRGB_ALPHA_EXT, SRGB8_ALPHA8_EXT, SLUMINANCE_NV, SLUMINANCE8_NV,
    SLUMINANCE_ALPHA_NV, SLUMINANCE8_ALPHA8_NV, COMPRESSED_SRGB_S3TC_-
    DXT1_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV, COMPRESSED_SRGB_ALPHA_-
    S3TC_DXT3_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV, or ETC1_SRGB8_NV."

Dependencies on OES_compressed_ETC1_RGB8_texture

    If OES_compressed_ETC1_RGB8_texture is not supported, ignore all
    references to ETC1_SRGB8_NV.

Dependencies on EXT_texture_storage

    If EXT_texture_storage is not supported, ignore all references to
    glTexStorage2DEXT and TexStorage3DEXT functions, additions to the
    "Valid combinations of format, type, and sized internal-format"
    Table, and LUMINANCE8_NV and LUMINANCE8_ALPHA8_NV tokens.

Dependencies on NV_texture_array

    If NV_texture_array is not supported, ignore all references to
    TexImage3DNV, TexSubImage3DNV, CompressedTexImage3DNV, and
    CompressedTexSubImage3DNV.

Dependencies on NV_texture_compression_s3tc

    If EXT_texture_compression_s3tc is not supported, ignore the new
    COMPRESSED_*_S3TC_DXT* tokens, the additions to the "Compressed
    Internal Format" table, errors related to the COMPRESSED_*_S3TC_DXT*
    tokens, and related discussion. Also ignore edits to decription
    of CompressedTexSubImage*.

Dependencies on NV_texture_compression_s3tc_update

    If NV_texture_compression_s3tc_update is not supported, passing
    COMPRESSED_SRGB_NV, COMPRESSED_SRGB_ALPHA_NV,
    COMPRESSED_SLUMINANCE_NV, COMPRESSED_SLUMINANCE_ALPHA_NV,
    COMPRESSED_SRGB_S3TC_DXT1_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV,
    COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV, or COMPRESSED_SRGB_ALPHA_S3TC_-
    DXT5_NV to the <internalformat> parameter of TexImage2D,
    TexImage3DNV, is not supported and will produce an INVALID_VALUE

Errors

    INVALID_OPERATION is generated by CompressedTexSubImage* if
    <internalformat> is COMPRESSED_SRGB_S3TC_DXT1_NV,
    COMPRESSED_SRGBA_S3TC_DXT1_NV, COMPRESSED_SRGBA_S3TC_DXT3_NV, or
    COMPRESSED_SRGBA_S3TC_DXT5_NV and any of the following apply:
        * <width> is not a multiple of four, and <width> plus
          <xoffset> is not equal to the texture width;
        * <height> is not a multiple of four, and <height> plus
          <yoffset> is not equal to the texture height; or
        * <xoffset> or <yoffset> is not a multiple of four.

    INVALID_OPERATION is generated by CompressedTexImage3DNV if
    <internalformat> is COMPRESSED_SRGB_S3TC_DXT1_NV, COMPRESSED_SRGB_-
    ALPHA_S3TC_DXT1_NV, COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV,
    COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV, or ETC1_SRGB8_NV and <target> is
    not TEXTURE_IMAGE_2D_ARRAY_NV.

    INVALID_OPERATION is generated by CompressedTexSubImage2D,
    TexSubImage2D, CompressedTexSubImage3DNV, or TexSubImage3DNV, if the
    texture image <level> bound to <target> has internal format
    ETC1_SRGB8_NV.

New State

    None

New Implementation Dependent State

    None

Issues

    1)  Should this be one extension or two?

        RESOLVED: one. Desktop GL divided this functionality between
        texture_sRGB and framebuffer_sRGB, but the ES extension EXT_sRGB
        which took some features from each of those was only one. For
        consistency with EXT_sRGB, this is a single extension.

    2)  Should inherently incomplete compressed sRGB texture attachments
        still return sRGB for FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT
        queries?

        RESOLVED: Yes. Just because they are incomplete doesn't mean they
        aren't attached. Such a query might be performed to determine
        why an FBO is incomplete.

    3)  Should formats for sRGB luminance values be supported?

        RESOLVED:  Yes.  Implementations can always support luminance
        and luminance-alpha sRGB formats as an RGB8 or RGBA8 format with
        replicated R, G, and B values.

        For lack of a better term, "SLUMINANCE" will be used within
        token names to indicate sRGB values with identical red, green,
        and blue components.

    4)  Should all component sizes be supported for sRGB components or
        just 8-bit?

        RESOLVED:  Just 8-bit.  For sRGB values with more than 8 bit of
        precision, a linear representation may be easier to work with
        and adequately represent dim values.  Storing 5-bit and 6-bit
        values in sRGB form is unnecessary because applications
        sophisticated enough to sRGB to maintain color precision will
        demand at least 8-bit precision for sRGB values.

        Because hardware tables are required sRGB conversions, it doesn't
        make sense to burden hardware with conversions that are unlikely
        when 8-bit is the norm for sRGB values.

    5)  Should generic compressed sRGB formats be supported?

        RESOLVED:  Yes.  Implementations are free simply to use
        uncompressed sRGB formats to implement the GL_COMPRESSED_SRGB_*
        formats.

    6)  Should S3TC compressed sRGB formats be supported?

        RESOLVED:  Yes, but only if EXT_texture_compression_s3tc is also
        advertised.  For competitive reasons, we expect OpenGL ES will
        need  an S3TC-based block compression format for sRGB data.

        Rather than expose a separate "sRGB_compression" extension,
        it makes more sense to specify a dependency between
        EXT_texture_compression_s3tc and this extension such that when
        BOTH extensions are exposed, the GL_COMPRESSED_SRGB*_S3TC_DXT*_NV
        tokens are accepted.

        We avoid explicitly requiring S3TC formats when EXT_texture_sRGB
        is advertised to avoid IP encumbrances.

    7)  How is the texture border color handled for sRGB formats?
        (Only relevant if NV_texture_border_clamp is supported.

        RESOLVED:  The texture border color is specified as four
        floating-point values.  Given that the texture border color can
        be specified at such high precision, it is always treated as a
        linear RGBA value.

        Only texel components are converted from the sRGB encoding to a
        linear RGB value ahead of texture filtering.  The border color
        can be used "as is" without any conversion.

        By keeping the texture border color specified as a linear
        RGB value at the API level allows developers to specify the
        high-precision texture border color in a single consistent color
        space without concern for how the sRGB conversion is implemented
        in relation to filtering.

        An implementation that does post-filtering sRGB conversion is
        likely to convert the texture border color to sRGB within
        the driver so it can be filtered with the sRGB values coming
        from texels and then the filtered sRGB value is converted to
        linear RGB.

        By maintaining the texture border color always in linear RGB,
        we avoid developers having to know if an implementation is
        performing the sRGB conversion (ideally) pre-filtering or (less
        ideally) post-filtering.

    8)  Should sRGB framebuffer support affect the pixel path?

        RESOLVED:  No.

        sRGB conversion only applies to color reads for blending and
        color writes.  Color reads for glReadPixels have no sRGB
        conversion applied.


Revision History

    Rev.    Date       Author       Changes
    ----   --------    ---------    -------------------------------------
     5     17 Jan 2013  groth       Add sized L and LA sRGB formats
                                    Drastically flesh out interactions.
     4     11 sep 2012  groth       Further clarify interactions
     3     21 Aug 2012  groth       Reorganzied issues. Clarified some.
     2     15 Aug 2012  groth       Clarified mheyer feedback.
     1     13 Aug 2012  groth       Initial draft based off EXT_texture_sRGB
