Name

    ANGLE_lossy_etc_decode

Name Strings

    GL_ANGLE_lossy_etc_decode

Contributors

    Minmin Gong  (mgong 'at' microsoft.com)

Contacts

    Minmin Gong  (mgong 'at' microsoft.com)

Status

    Draft

Version

    Last Modified Date: Nov 25, 2015
    Author Revision: 1

Number

    TBD

Dependencies

    Requires OpenGL ES 3.0 for ETC2 and EAC formats, or OpenGL ES 2.0 and
    OES_compressed_ETC1_RGB8_texture for ETC1 format.
    The extension is written against the OpenGL ES 2.0 specification.

Overview

    Both the OpenGL ES 3.0 specification and OES_compressed_ETC1_RGB8_texture
    specify that Ericsson Texture Compression (ETC) decoding must not be lossy.
    The goal of this extension is to allow a lossy decode of
    compressed textures in the ETC formats in OpenGL ES, for lower memory
    and bandwidth consumption.

    This extension uses the same ETC compression format as OpenGL ES 3.0
    and OES_compressed_ETC1_RGB8_texture, with the restriction that the texture
    dimensions must be a multiple of four (except for mip levels where the
    dimensions are either 2 or 1). And the requirement that ETC decoding must
    not be lossy is relaxed.

    See OES_compressed_ETC1_RGB8_texture for a description of the ETC1 format.
    Also see OpenGL ES 3.0 specification appendix C.2 (ETC Compressed Texture
    ImageFormats) for a description of ETC2 and EAC formats.

IP Status

    See Ericsson's "IP Statement"

New Procedures and Functions

    None.

New Types

    None.

New Tokens

    Accepted by the <internalformat> parameter of CompressedTexImage2D
    and the <format> parameter of CompressedTexSubImage2D:

    ETC1_RGB8_LOSSY_DECODE_ANGLE                                  0x9690
    COMPRESSED_R11_LOSSY_DECODE_EAC_ANGLE                         0x9691
    COMPRESSED_SIGNED_R11_LOSSY_DECODE_EAC_ANGLE                  0x9692
    COMPRESSED_RG11_LOSSY_DECODE_EAC_ANGLE                        0x9693
    COMPRESSED_SIGNED_RG11_LOSSY_DECODE_EAC_ANGLE                 0x9694
    COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE                       0x9695
    COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE                      0x9696
    COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE   0x9697
    COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE  0x9698
    COMPRESSED_RGBA8_LOSSY_DECODE_ETC2_EAC_ANGLE                  0x9699
    COMPRESSED_SRGB8_ALPHA8_LOSSY_DECODE_ETC2_EAC_ANGLE           0x969A

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

    Add the following to Section 3.7.3 (Compressed Texture Images)
    (at the end of the description of the CompressedTexImage2D command):

    Compressed Internal Format                                    Base Internal Format
    ==========================                                    ====================
    ETC1_RGB8_LOSSY_DECODE_ANGLE                                  RGB
    COMPRESSED_R11_LOSSY_DECODE_EAC_ANGLE                         R
    COMPRESSED_SIGNED_R11_LOSSY_DECODE_EAC_ANGLE                  R
    COMPRESSED_RG11_LOSSY_DECODE_EAC_ANGLE                        RG
    COMPRESSED_SIGNED_RG11_LOSSY_DECODE_EAC_ANGLE                 RG
    COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE                       RGB
    COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE                      RGB
    COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE   RGBA
    COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE  RGBA
    COMPRESSED_RGBA8_LOSSY_DECODE_ETC2_EAC_ANGLE                  RGBA
    COMPRESSED_SRGB8_ALPHA8_LOSSY_DECODE_ETC2_EAC_ANGLE           RGBA

    Table 3.x: Specific Compressed Internal Formats

    If <internalformat> is one of the ETC lossy decode formats listed in
    Table 3.x, the compressed texture is stored in an unspecified compressed
    texture format, that may introduce losses of precision in the texture data.
    The GL and the ETC texture compression algorithm support only 2D images
    without borders.

    CompressedTexImage2D will produce the INVALID_OPERATION error when
    <internalformat> is one of the lossy decode ETC-format values from
    Table 3.x under the following conditions:

      * <border> is non-zero.
      * <width> is not one, two, nor a multiple of four.
      * <height> is not one, two, nor a multiple of four.

    Add the following to Section 3.7.3 (Compressed Texture Images)
    (at the end of the description of the CompressedTexSubImage2D command):

    If the internal format of the texture image being modified is an ETC-format
    listed in Table 3.x, the compressed texture is stored in an unspecified
    compressed texture format. The xoffset and yoffset must also be aligned to
    4x4 texel block boundaries, since ETC encoding makes it difficult to modify
    non-aligned regions. CompressedTexSubImage2D will result in an
    INVALID_OPERATION error only if one of the following conditions occurs:

      * <width> is not a multiple of four nor equal to TEXTURE_WIDTH.
      * <height> is not a multiple of four nor equal to TEXTURE_HEIGHT.
      * <xoffset> or <yoffset> is not a multiple of four.
      * <format> does not match the internal format of the texture image
        being modified.

Errors

    INVALID_OPERATION is generated by CompressedTexImage2D if
    lossy decode ETC-format is used and <internalformat> is one of the
    compressed internal formats from Table 3.x and any of the following apply:
      - <border> is not equal to zero.
      - <width> is not one, two, nor a multiple of four.
      - <height> is not one, two, nor a multiple of four.

    INVALID_OPERATION is generated by CompressedTexSubImage2D if
    lossy decode ETC-format is used and <format> is one of the compressed
    interal formats from Table 3.x and any of the following apply:
      - <width> is not a multiple of four nor equal to TEXTURE_WIDTH;
      - <height> is not a multiple of four nor equal to TEXTURE_HEIGHT;
      - <xoffset> or <yoffset> is not a multiple of four;
      - <format> does not match the internal format of the texture image
      being modified.

New State

    None.

Revision History

    Revision 1, 2015/11/25 - mgong
      - Initial revision
