Name

    EXT_texture_sRGB_decode

Name Strings

    GL_EXT_texture_sRGB_decode

Contributors

    Matt Collins, Apple Inc
    Alex Eddy, Apple Inc
    Mark Kilgard, NVIDIA
    Chris Niederauer, Apple Inc
    Richard Schreyer, Apple Inc
    Henri Verbeet, CodeWeavers
    Brent Wilson, NVIDIA
    Jeff Bolz, NVIDIA
    Dan Omachi, Apple Inc
    Jason Green, TransGaming
    Daniel Koch, NVIDIA
    Mathias Heyer, NVIDIA

Contact

    Matt Collins, Apple Inc (matthew.collins 'at' apple.com)

Status

    Shipping on OS X 10.7

Version

    Date: November 8, 2017
    Revision: 0.91

Number

    OpenGL Extension #402
    OpenGL ES Extension #152

Dependencies

    OpenGL 2.1 or EXT_texture_sRGB requried for OpenGL

    OpenGL ES 3.0 or EXT_sRGB are required for OpenGL ES

    OpenGL 3.0 or later interacts with this extension.

    OpenGL ES 2.0 interacts with this extension.

    OpenGL ES 3.0 interacts with this extension.

    ARB_bindless_texture interacts with this extension.

    ARB_sampler_objects interacts with this extension.

    ARB_framebuffer_object interacts with this extension.

    EXT_direct_state_access interacts with this extension.

    EXT_texture_compression_s3tc interacts with this extension.

    EXT_texture_integer interacts with this extension.

    EXT_sRGB interacts with this extension.

    NV_sRGB_formats interacts with this extension.

    NV_generate_mipmap_sRGB interacts with this extension.

    KHR_texture_compression_astc_ldr interacts with this extension.

    ETC2 texure compression formats interact with this extension.

    This extension is written against the OpenGL 2.1 (December 1, 2006)
    specification.

Overview

    The EXT_texture_sRGB extension (promoted to core in OpenGL 2.1)
    provides a texture format stored in the sRGB color space. Sampling one
    of these textures will always return the color value decoded into a
    linear color space. However, an application may wish to sample and
    retrieve the undecoded sRGB data from the texture and manipulate
    that directly.

    This extension adds a Texture Parameter and Sampler Object parameter to
    allow sRGB textures to be read directly, without decoding.

    The new parameter, TEXTURE_SRGB_DECODE_EXT controls whether the
    decoding happens at sample time. It only applies to textures with an
    internal format that is sRGB and is ignored for all other textures.
    This value defaults to DECODE_EXT, which indicates the texture
    should be decoded to linear color space.

New Procedures and Functions

    None

New Tokens

    Accepted by the <pname> parameter of TexParameterf, TexParameteri,
    TexParameterfv, TexParameteriv, TexParameterIiv, TexParameterIuiv,
    TexParameterIivEXT, TexParameterIuivEXT, TextureParameterfEXT,
    TextureParameterfvEXT, TextureParameteriEXT, TextureParameterivEXT,
    TextureParameterIivEXT, TextureParameterIuivEXT,
    MultiTexParameterfEXT, MultiTexParameterfvEXT, MultiTexParameteriEXT,
    MultiTexParameterivEXT, MultiTexParameterIivEXT,
    MultiTexParameterIuivEXT, GetTexParameterfv, GetTexParameteriv,
    GetTexParameterIiv, GetTexParameterIuiv, GetTexParameterIivEXT,
    GetTexParameterIuivEXT, GetTextureParameterfEXT,
    GetTextureParameterfvEXT, GetTextureParameteriEXT,
    GetTextureParameterivEXT, GetTextureParameterIivEXT,
    GetTextureParameterIuivEXT, GetMultiTexParameterfEXT,
    GetMultiTexParameterfvEXT, GetMultiTexParameteriEXT,
    GetMultiTexParameterivEXT, GetMultiTexParameterIivEXT,
    GetMultiTexParameterIuivEXT, SamplerParameteri, SamplerParameterf,
    SamplerParameteriv, SamplerParameterfv, SamplerParameterIiv,
    SamplerParameterIuiv, GetSamplerParameteriv, GetSamplerParameterfv,
    GetSamplerParameterIiv, and GetSamplerParameterIuiv:

        TEXTURE_SRGB_DECODE_EXT        0x8A48

    Accepted by the <param> parameter of TexParameterf, TexParameteri,
    TexParameterfv, TexParameteriv, TexParameterIiv, TexParameterIuiv,
    TexParameterIivEXT, TexParameterIuivEXT, TextureParameterfEXT,
    TextureParameterfvEXT, TextureParameteriEXT, TextureParameterivEXT,
    TextureParameterIivEXT, TextureParameterIuivEXT,
    MultiTexParameterfEXT, MultiTexParameterfvEXT, MultiTexParameteriEXT,
    MultiTexParameterivEXT, MultiTexParameterIivEXT,
    MultiTexParameterIuivEXT, SamplerParameteri, SamplerParameterf,
    SamplerParameteriv, SamplerParameterfv, SamplerParameterIiv, and
    SamplerParameterIuiv:

        DECODE_EXT             0x8A49
        SKIP_DECODE_EXT        0x8A4A

Additions to Chapter 3 of the 2.1 Specification (Rasterization)

    Add 1 new row to Table 3.18 (page 169).

    Name                       Type       Initial value     Legal values
    ----                       ----       -------------     ------------
    TEXTURE_SRGB_DECODE_EXT    enum        DECODE_EXT       DECODE_EXT, SKIP_DECODE_EXT

-- OpenGL: Section 3.8.8, Texture Minification

    Add to the end of the "Automatic Mipmap Generation" subsection:

    If the automatic mipmap generation is applied to a texture
    whose internal format is one of SRGB_EXT, SRGB8_EXT,
    SRGB_ALPHA_EXT, SRGB8_ALPHA8_EXT, SLUMINANCE_ALPHA_EXT,
    SLUMINANCE8_ALPHA8_EXT, SLUMINANCE_EXT, SLUMINANCE8_EXT,
    COMPRESSED_SRGB_EXT, COMPRESSED_SRGB_ALPHA_EXT,
    COMPRESSED_SLUMINANCE_EXT, COMPRESSED_SLUMINANCE_ALPHA_EXT,
    COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,
    COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or
    COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, and the TEXTURE_SRGB_DECODE_EXT
    parameter for the current texture unit is DECODE_EXT, the RGB
    texel components are decoded to a linear components as described
    in section 3.8.15 prior to downsampling; then after downsampling,
    the linear components are re-encoded as sRGB in the following manner:

    If cl is the linear color component, then the corresponding sRGB
    encoded component is encoded as follows

             {  cl * 12.92,                  cl < 0.0031308
        cs = {
             {  1.055 * cl^0.41666 - 0.055,  cl >= 0.0031308

    If the automatic mipmap generation is applied to a texture whose
    internal format is one of the sRGB formats listed previously and
    the TEXTURE_SRGB_DECODE_EXT parameter for the texture object is
    SKIP_DECODE_EXT, the sRGB decode and encode steps are skipped during
    mipmap generation.

-- OpenGL:  Section 3.8.15, sRGB Color Decoding

    (section was previously titled sRGB Color Conversion)

    Replace current text with the following:

    If the currently bound texture's internal format is one
    of SRGB_EXT, SRGB8_EXT, SRGB_ALPHA_EXT, SRGB8_ALPHA8_EXT,
    SLUMINANCE_ALPHA_EXT, SLUMINANCE8_ALPHA8_EXT, SLUMINANCE_EXT,
    SLUMINANCE8_EXT, COMPRESSED_SRGB_EXT, COMPRESSED_SRGB_ALPHA_EXT,
    COMPRESSED_SLUMINANCE_EXT, COMPRESSED_SLUMINANCE_ALPHA_EXT,
    COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,
    COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, or
    COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, and the TEXTURE_SRGB_DECODE_EXT
    parameter for the current texture unit is DECODE_EXT, the red, green, and blue
    components are decoded from an sRGB color space to a linear color
    space as part of filtering described in sections 3.8.8 and 3.8.9.
    Any alpha component is left unchanged. Ideally, implementations
    should perform this color decoding on each sample prior to filtering
    but implementations are allowed to perform this decoding after
    filtering (though this post-filtering approach is inferior to
    decoding from sRGB prior to filtering).

    The decoding from an sRGB encoded component, cs, to a linear
    component, cl, is as follows

            {  0,                          cs <= 0
            {
            {  cs / 12.92,                 0 < cs <= 0.04045
       cl = {
            {  ((cs + 0.055)/1.055)^2.4,   0.04045 < cs < 1
            {
            {  1,                          cs >= 1

    Assume cs is the sRGB component in the range [0,1].

    If the TEXTURE_SRGB_DECODE_EXT parameter is SKIP_DECODE_EXT, the value
    is returned without decoding. The TEXTURE_SRGB_DECODE_EXT
    parameter state is ignored for any texture with an internal format
    not explicitly listed above, as no decoding needs to be done.

--- OpenGL ES 3.2: Section 8.21, sRGB Texture Color Conversion
--- OpenGL ES 3.0: Section 3.8.16, sRGB Texture Color Conversion
--- OpenGL ES 2.0: Section 3.7.14, sRGB Texture Color Conversion

    Add after the first paragraph of the section:

   "The conversion of sRGB color space components to linear color space is
    always applied if the TEXTURE_SRGB_DECODE_EXT parameter is DECODE_EXT.
    Table X.1 describes whether the conversion is skipped if the
    TEXTURE_SRGB_DECODE_EXT parameter is SKIP_DECODE_EXT, depending on
    the function used for the access, whether the access occurs through a
    bindless sampler, and whether the texture is statically accessed
    elsewhere with a texelFetch function."

    Add a new table X.1, Whether the conversion of sRGB color space
    components to linear color space is skipped when the
    TEXTURE_SRGB_DECODE_EXT parameter is SKIP_DECODE_EXT.

                                       texelFetch       other builtin
      --------------------------------------------------------------------
      non-bindless sampler,            n/a              yes
      no accesses with
      texelFetch

      non-bindless sampler,            no               undefined
      statically accessed with
      texelFetch

      bindless sampler                 undefined        yes

Dependencies on ARB_bindless_texture

    If ARB_bindless_texture is NOT supported, delete all references to
    bindless samplers.

Dependencies on ARB_sampler_objects or OpenGL 3.3 or later

    If ARB_sampler_objects or OpenGL 3.3 or later is NOT supported,
    delete all references to SamplerParameter* and GetSamplerParameter*.

Dependencies on ARB_framebuffer_object or OpenGL 3.0 or later

    If ARB_framebuffer_object or OpenGL 3.0 or later is supported, the
    explanation in the "Automatic Mipmap Generation" section applies to
    the GenerateMipmap command as well.

Dependencies on EXT_texture_compression_s3tc

    If EXT_texture_compression_s3tc is NOT supported, delete
    COMPRESSED_SRGB_S3TC_DXT1_EXT, COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,
    COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, and
    COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT from Section 3.8.15.

Dependencies on EXT_texture_integer

    If EXT_texture_integer is NOT supported, delete references to
    TexParameterIivEXT, TexParameterIuivEXT, GetTexParameterIivEXT,
    and GetTexParameterIuivEXT.

Dependencies on EXT_direct_state_access

    If EXT_direct_state_access is NOT supported, delete
    references to TextureParameterfEXT, TextureParameterfvEXT,
    TextureParameteriEXT, TextureParameterivEXT, TextureParameterIivEXT,
    TextureParameterIuivEXT, MultiTexParameterfEXT,
    MultiTexParameterfvEXT, MultiTexParameteriEXT, MultiTexParameterivEXT,
    MultiTexParameterIivEXT, MultiTexParameterIuivEXT,
    GetTextureParameterfEXT, GetTextureParameterfvEXT,
    GetTextureParameteriEXT, GetTextureParameterivEXT,
    GetTextureParameterIivEXT, GetTextureParameterIuivEXT,
    GetMultiTexParameterfEXT, GetMultiTexParameterfvEXT,
    GetMultiTexParameteriEXT, GetMultiTexParameterivEXT,
    GetMultiTexParameterIivEXT, and GetMultiTexParameterIuivEXT.

Dependencies on OpenGL 3.0

    If OpenGL 3.0 or later is NOT supported, delete references
    to TexParameterIiv, TexParameterIuiv, GetTexParameterIiv,
    and GetTexParameterIuiv.

Interactions with OpenGL ES

    If OpenGL ES 3.0 is NOT supported, delete references
    to TexParameterIiv, TexParameterIuiv, GetTexParameterIiv,
    and GetTexParameterIuiv, GetTexParameterfv, GetTexParameteriv.

    If OpenGL ES 3.0 or NV_generate_mipmap_sRGB is supported,
    TEXTURE_SRGB_DECODE_EXT will control the linearization of sRGB
    texture levels while generating the mipmap levels. The section
    "Automatic Mipmap Generation" applies to glGenerateMipmap instead.

    If neither OpenGL ES 3.0 nor NV_sampler_objects is supported,
    delete all references to SamplerParameter* and GetSamplerParameter*.

    If NV_sampler_objects is supported, substitue the ARB_sampler_objects
    references with corresponding commands of NV_sampler_objects.

Interactions with KHR_texture_compression_astc_ldr

    If KHR_texture_compression_astc_ldr is supported, the
    TEXTURE_SRGB_DECODE_EXT texture and/or sampler parameter affects the
    COMPRESSED_SRGB8_ALPHA8_ASTC_*_KHR formats as described in the Section
    3.8.16 edits.

Interactions with ETC2 compressed texture formats

    If the ETC2 texture compression formats (part of OpenGL ES 3.0 and OpenGL
    4.3) are supported, the TEXTURE_SRGB_DECODE_EXT texture and/or sampler
    parameter affects the COMPRESSED_SRGB8_*ETC2* formats as described in the
    Section 3.8.16 edits.

Interactions with NV_sRGB_formats

    If NV_sRGB_formats is supported, the TEXTURE_SRGB_DECODE_EXT texture and/or
    sampler parameter affects the new SRGB and SLUMINANCE formats as described
    in the Section 3.7.14 edits.

Errors

    INVALID_ENUM is generated if the <pname> parameter of
    TexParameter[i,f,Ii,Iui][v][EXT], MultiTexParameter[i,f,Ii,Iui][v]EXT,
    TextureParameter[i,f,Ii,Iui][v]EXT, SamplerParameter[i,f,Ii,Iui][v]
    is TEXTURE_SRGB_DECODE_EXT when the <param> parameter is not one of
    DECODE_EXT or SKIP_DECODE_EXT.

New State

    In table 6.20, Texture Objects, p. 384, add the following:

    Get Value                     Type  Get Command           Initial Value  Description       Sec.   Attribute
    ----------------------------  ----  --------------------  -------------  ----------------  -----  ---------
    TEXTURE_SRGB_DECODE_EXT       Z_2   GetTexParameter[if]v  DECODE_EXT     indicates when    3.8.15 texture
                                                                             sRGB textures
                                                                             are decoded from
                                                                             sRGB or the
                                                                             decoding step is
                                                                             skipped

    Add to Table 6.23 of ARB_sampler_objects, "Textures (state per sampler object)":

    Get Value                     Type  Get Command               Initial Value  Description       Sec.   Attribute
    ----------------------------  ----  ------------------------  -------------  ----------------  -----  ---------
    TEXTURE_SRGB_DECODE_EXT       Z_2   GetSamplerParameter[if]v  DECODE_EXT     indicates when    3.8.15 texture
                                                                                 sRGB textures
                                                                                 are decoded from
                                                                                 sRGB or the
                                                                                 decoding step is
                                                                                 skipped

Issues

    1) What should this extension be called?

        RESOLVED: EXT_texture_sRGB_decode

        The purpose of this extension is to allow developers to skip
        the sRGB-to-linear decoding detailed in Section 3.8.15.
        Since this is a decoding of the sRGB value into linear space, we
        use that word to describe the pname. The enum indicating this
        decoding is to happen is DECODE, as that is what the GL will do.
        The enum that indicates this decoding is to be skipped is then
        appropriately, SKIP_DECODE.

    2) Should this allow for filters other than NEAREST on undecoded
       sRGB values?

        RESOLVED: YES

        Hardware supports this, and it is left up to the programmer.

    3) Do we generate an error if TEXTURE_SRGB_DECODE_EXT is changed for normal
       textures?

        RESOLVED: NO

        This is similar to the ARB_shadow and ARB_framebuffer_sRGB extensions - the flag
        is ignored for non-sRGB texture internal formats.

    4) Should we add forward-looking support for ARB_sampler_objects?

        RESOLVED: YES

        If ARB_sampler_objects exists in the implementation, the sampler
        objects should also include this parameter per sampler.

    5) What is the expense of changing the sRGB-ness of a texture without
       this extension?

        RESOLVED:  If an application wants to use a texture with sRGB
        texels and then switch to using it with linear filtering (or vice
        versa), OpenGL without this extension requires the application
        to read back all the texels in all the mipmap levels of all the
        images, and respecify a different texture object with a different
        texture format.  This is very expensive.

        With this extension, the driver can simply change the underlying
        hardware texture format associated with the texture to perform
        sRGB conversion on filtering or not.  This is very inexpensive.

        However, note that the functionality of this extension can also
        be obtained using the more modern approach provided by
        ARB_texture_view (added to OpenGL 4.3) and OES_texture_view.

    6) Do any major games or game engines depend on the ability to
       change the sRGB-ness of textures?

        RESOLVED:  Yes, Valve's Source engine used by Half-Life 2,
        Counter-Strike: Source, and Left 4 Dead; and Unreal Engine 3
        games including Unreal Tournament 3 and BioShock.

        These games and their underlying engines repeatedly render linear
        color values into textures and then texture from the rendered
        textures with sRGB texture filtering.

    7) Why not simply allow changing whether a standard GL_RGBA8
       can perform an sRGB color space conversion for filtering?

        RESOLVED:  Allowing this would create a consistency problem.
        Why would the GL_TEXTURE_SRGB_DECODE_EXT parameter not
        apply to GL_RGB4 or GL_RGB12 textures too?  In practice,
        sRGB color conversion for texture filtering is only typically
        supported in hardware for a small subset of texture formats
        (corresponding to the sized internal formats introduced by the
        EXT_texture_sRGB specification).  It's essentially only 8-bit
        fixed-point unsigned textures where sRGB color conversion makes
        sense.  And the initial value of the parameter (GL_DECODE_EXT) would be
        appropriate for sRGB texture formats but not conventional linear
        texture formats (as no decoding needs to be done). Having the

        texture parameter apply just to sRGB texture eliminates the ambiguity
        of which conventional texture formats can and cannot have sRGB decoding
        applied to them. This also eliminates the burden of having every future

        texture format extension specify whether or not the sRGB decoding parameter
        applies to them.

        Direct3D 9 handles this situation by advertising for each surface
        format (which double as texture formats) a D3DUSAGE_QUERY_SRGBREAD
        parameter.  In practice, Direct3D 9 implementation only advertise
        the D3DUSAGE_QUERY_SRGBREAD parameter for 8-bit fixed-point
        unsigned RGB or luminance formats, corresponding to the formats
        available from EXT_texture_sRGB.

    8) Does there need to be a control for whether to update (and
       possibly blend) framebuffer pixels in sRGB or linear color space?

        RESOLVED:  The EXT_framebuffer_sRGB extension (made core in OpenGL
        3.0) already has this capability with the GL_FRAMEBUFFER_SRGB_EXT
        enable.

        The GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING query parameter
        roughly corresponds to Direct3D 9's D3DUSAGE_QUERY_SRGBWRITE
        parameter.

    9) How is the border color handled when toggling sRGB color
       conversion for blending of sRGB textures?

        RESOLVED:  Consistent with the EXT_texture_sRGB specification, the
        border color is always specified as a linear value (never sRGB).
        So changing the TEXTURE_SRGB_DECODE_EXT parameter will
        not affect the resulting sampled border color.

        If an implementation were to store the texture border color in a
        format consistent with the texel format (including the sRGB color
        space), this would require such implementations to convert the
        (linear) texture border RGB components to sRGB space.
        In this case, this would mean an implementation to re-specify
        the texture border color state in the hardware when the
        TEXTURE_SRGB_DECODE_EXT parameter for an sRGB texture
        changed.

        Alternatively, if the implementation stored the texture
        border color in texture formant-independent format (say 4
        floating-point values) and always treated this as a linear RGB
        color for purposes of texture filtering, no sRGB conversion
        of the texture border color would ever occur.  In this case,
        this would mean an implementation would NOT need to re-specify
        the texture border color state in the hardware when the
        TEXTURE_SRGB_DECODE_EXT parameter for an sRGB texture
        changed.

   10) How is mipmap generation of sRGB textures affected by the
       TEXTURE_SRGB_DECODE_EXT parameter?

        RESOLVED:  When the TEXTURE_SRGB_DECODE parameter is DECODE_EXT
        for an sRGB texture, mipmap generation should decode sRGB texels
        to a linear RGB color space, perform downsampling, then encode
        back to an sRGB color space.  (Issue 24 in the EXT_texture_sRGB
        specification provides a rationale for why.)  When the parameter
        is SKIP_DECODE_EXT instead, mipmap generation skips the encode
        and decode steps during mipmap generation.  By skipping the
        encode and decode steps, sRGB mipmap generation should match
        the mipmap generation for a non-sRGB texture.

        The TEXTURE_SRGB_DECODE_EXT texture parameter has no effect on
        mipmap generation of non-sRGB textures.

        Direct3D 10 and Direct3D 11 expect mipmap generation for sRGB
        textures to be "correctly done" (meaning sRGB decode samples,
        perform weighted average in linear space, then sRGB encode
        the result).

        Direct3D 9 expects to NOT perform sRGB-correct mipmap generation.
        Hence the ability to generate mipmaps from an sRGB texture
        where you skip the decode (and encode) during mipmap generation
        is important.

   11) Does automatic mipmap generation change the smaller mipmap levels
       when the TEXTURE_SRGB_DECODE texture parameter changes?

        RESOLVED:  No, automatic mipmap generation only happens when the
        base level is changed.

        This means if the TEXTURE_SRGB_DECODE parameter is changed from
        DECODE_EXT to SKIP_DECODE_EXT (or vice versa), the texels in the
        smaller mipmap levels are not modified.

        Use the glGenerateMipmap command to regenerate mipmaps explicitly
        to reflect a change in the TEXTURE_SRGB_DECODE parameter.

   12) How is this extension expected to be used for Direct3D 9 emulation?

        RESOLVED: Direct3D texture resources that are created with a
        format supporting either the SRGBREAD or SRGBWRITE capabilities
        should be created as an OpenGL texture object with an sRGB
        internal format.

        This means that normal "linear" RGBA8 textures for Direct3D 9
        should be created as GL_SRGB8_ALPHA8 textures so they can be used
        with samplers where the GL_TEXTURE_SRGB_DECODE_EXT parameter of
        the sampler (assuming ARB_sampler_objects) determines whether
        they operate as linear textures (the GL_SKIP_DECODE_EXT) state
        or sRGB textures (the GL_DECODE_EXT state).

        Example for a Direct3D9 CreateTexture with a D3DFMT_A8R8G8B8 format:

          glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8,
            width, height, border, GL_UNSIGNED_BYTE, GL_RGBA, texels);
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);

        Notice the texture is created with a GL_SRGB_ALPHA8 format but
        immediately switched to GL_SKIP_DECODE_EXT.  This is because:

        1a) The format needs to be GL_SRGBA_ALPHA so that when used with
            a sampler configured with the (initial) value of zero (false)
            for D3DSAMP_SRGBTEXTURE, the texture will be filtered without
            sRGB decode.

        1b) Likewise, when D3DSAMP_SRGBTEXTURE is true for a sampler, the
            texture needs to be decoded to sRGB for filtering.  In this case,
            the OpenGL translation would use:

              glSamplerParameteri(sampler, GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT);

        2)  Direct3D9's D3DUSAGE_AUTOGENMIPMAP does not generate mipmaps
            in sRGB space (but rather in linear space).

        When rendering into a surface in Direct3D 9 with the
        D3DRS_SRGBWRITEENABLE render state (set by SetRenderState) set to false,
        the pixel updates (including blending) need to operate with
        GL_FRAMEBUFFER_SRGB disabled.  So:

          glDisable(GL_FRAMEBUFFER_SRGB);

        Likewise when the D3DRS_SRGBWRITEENABLE render state is true,
        OpenGL should operate

          glEnable(GL_FRAMEBUFFER_SRGB);

        Any texture with an sRGB internal format (for example,
        GL_SRGB8_ALPHA8 for the internal format) will perform sRGB decode
        before blending and encode after blending.  This matches the Direct3D9
        semantics when D3DUSAGE_QUERY_SRGBWRITE is true of the resource format.

   13) How is this extension expected to be used for Direct3D 10 and
       11 emulation?

        RESOLVED:  Direct3D 10 and 11 support non-mutable formats for sRGB
        textures (matching the original behavior of EXT_texture_sRGB,
        unextended by this extension).  So the DXGI_FORMAT_*_SRGB
        formats are always decoded from sRGB to linear (and vice versa)
        as necessary.  Formats not suffixed with _SRGB are never decoded
        or encoded to sRGB.

        Direct3D 10 and 11 support "typeless" resources with resource views
        that can have different formats.  So you can create a texture
        with a format of DXGI_FORMAT_R8G8B8A8_TYPELESS and then create
        shader resource views with the DXGI_FORMAT_R8G8B8A8_UNORM and
        DXGI_FORMAT_R8G8B8A8_UNORM_SRGB formats on that. This is a much
        more generic approach to decoupling storage and interpretation in
        Direct3D 10 and 11.  However support for "typeless" resources
        and resource views is beyond the scope of this extension.

        These two questions from Microsoft's Direct3D 10 Frequently Asked
        Questions list provide helpful context:

            "Q:  Where did the D3DSAMP_SRGBTEXTURE state go?

            A: SRGB was removed as part of the sampler state and now
            is tied to the texture format. Binding an SRGB texture will
            result in the same sampling you would get if you specified
            D3DSAMP_SRGBTEXTURE in Direct3D 9.

            Q:  What are these new SRGB formats?

            A:  SRGB was removed as part of the sampler state and is
            now tied to the texture format. Binding an SRGB texture will
            result in the same sampling you would get if you specified
            D3DSAMP_SRGBTEXTURE in Direct3D 9."

        This means that normal "linear" textures, such as
        DXGI_FORMAT_R8G8B8A8_UNORM, would be created as GL_RGBA8 textures
        (not sRGB), so that they will always behave as linear textures
        (never sRGB-decoded).

        On the other hand, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB would be
        created as GL_SRGB8_ALPHA8.  Its texture sRGB decode parameter
        would be left with the initial value of GL_DECODE_EXT.  Mipmap
        generation for a texture using DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
        (GL_RGB8_ALPHA8 in OpenGL) would perform the proper sRGB decode
        and encode needed for automatic mipmap generation.

        In Direct3D 10 and 11 emulation, the GL_TEXTURE_SRGB_DECODE_EXT
        parameter of sampler objects would simply be left at its initial
        value of GL_DECODE_EXT.  Unlike Direct3D 9 where the sampler
        controlled sRGB decode (via the D3DSAMP_SRGBTEXTURE), that parameter
        is not present in Direct3D 10 and 11 (see the FAQ questions above).

        The conclusion of this issue's discussion is that Direct3D
        10 and 11 emulation software should simply ignore the
        EXT_texture_sRGB_decode extension.  This is to be expected
        because the EXT_texture_sRGB_decode extension is meant to match
        the legacy functionality of Direct3D 9.

   14) Why does Table X.1 show "Undefined", and why does it appear in
       different columns depending on whether bindless samplers are used
       or not?

        RESOLVED: Conceptually, TEXTURE_SRGB_DECODE_EXT is part of the
        sampler state and should therefore not apply to texelFetch. However,
        not all hardware has the required bit in the sampler state.

        With bindless samplers, texture handles are *always* statically
        accessed by texelFetch (because an application could choose to do so
        at any time), so applying the same rules as for non-bindless
        samplers would make the functionality provided in this extension
        useless.

Revision History

        Rev.    Date    Author    Changes
        ----  --------  --------  -------------------------------------
        0.91  11/08/17  nhaehnle  Add interaction with bindless textures
                                  (API issue #51)
        0.90  04/27/16  Jon Leech Add interaction with texelFetch builtins
                                  (Bug 14934)
        0.89  08/14/13  dkoch     Add interactions with ASTC/ETC2/NV_sRGB_formats
        0.88  07/24/13  mheyer    Add OpenGL ES interactions
        0.87  08/22/11  mjk       correction to issue #8 from Jason
        0.86  08/22/11  mjk       corrections from Daniel + more interactions
        0.85  08/13/11  mjk       corrections to issues from Jason and Henri
        0.84  08/05/11  mjk       New issues to explain Direct3D interactions;
                                  fix table Get Command.
        0.83  07/15/11  mjk       "current texture unit" -> "texture
                                  object" for mipmap generation
        0.82  04/12/11  mjk       Mipmap generation interactions.
        0.81  11/18/10  mattc     Fixed language in error section.
                                  Cleaned up which functions take which tokens.
        0.8   11/18/10  mattc     Added issues from EXT_texture_sRGB_decode

                                  for background info. Cleaned up layout.
        0.71  11/18/10  mattc     Adapted apple_texture_linearize_srgb into
                                  this specification.
