Name

    ARB_ES3_compatibility

Name Strings

    GL_ARB_ES3_compatibility

Contact

    Piers Daniell, NVIDIA Corporation (pdaniell 'at' nvidia.com)

Contributors

    Bruce Merry
    Jeff Bolz, NVIDIA
    John Kessenich
    Jon Leech
    Pat Brown, NVIDIA

Notice

    Copyright (c) 2012-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Status

    Complete.
    Approved by the ARB on 2012/06/12.

Version

    Last Modified Date:         October 18, 2013
    Revision:                   10

Number

    ARB Extension #127

Dependencies

    OpenGL 3.3, ARB_ES2_compatibility, ARB_invalidate_subdata, and
    ARB_texture_storage are required.
    
    The ETC2 and EAC texture compression formats added to OpenGL-ES 3.0
    OES_compressed_ETC2_RGB8_texture,
    OES_compressed_ETC2_sRGB8_texture,
    OES_compressed_ETC2_punchthroughA_RGBA8_texture,
    OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture,
    OES_compressed_ETC2_RGBA8_texture,
    OES_compressed_ETC2_sRGB8_alpha8_texture,
    OES_compressed_EAC_R11_unsigned_texture,
    OES_compressed_EAC_R11_signed_texture,
    OES_compressed_EAC_RG11_unsigned_texture and
    OES_compressed_EAC_RG11_signed_texture are required.

    This extension is written against The OpenGL 4.2 (Compatibility Profile)
    specification.

Overview

    This extension adds support for features of OpenGL ES 3.0 that are
    missing from OpenGL 3.x. Enabling these features will ease the process
    of porting applications from OpenGL ES 3.0 to OpenGL. These features
    include conservative boolean occlusion queries, primitive restart with a
    fixed index, the OpenGL ES Shading Language 3.00 specification, and the
    dependencies stated above.

New Procedures and Functions

    None

New Tokens

    Accepted by the <internalformat> parameter of CompressedTexImage2D
        COMPRESSED_RGB8_ETC2                             0x9274
        COMPRESSED_SRGB8_ETC2                            0x9275
        COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2         0x9276
        COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2        0x9277
        COMPRESSED_RGBA8_ETC2_EAC                        0x9278
        COMPRESSED_SRGB8_ALPHA8_ETC2_EAC                 0x9279
        COMPRESSED_R11_EAC                               0x9270
        COMPRESSED_SIGNED_R11_EAC                        0x9271
        COMPRESSED_RG11_EAC                              0x9272
        COMPRESSED_SIGNED_RG11_EAC                       0x9273

    Accepted by the <target> parameter of Enable and Disable:
    
        PRIMITIVE_RESTART_FIXED_INDEX                    0x8D69
        
    Accepted by the <target> parameter of BeginQuery, EndQuery,
    GetQueryIndexediv and GetQueryiv:
    
        ANY_SAMPLES_PASSED_CONSERVATIVE                  0x8D6A
        
    Accepted by the <value> parameter of the GetInteger* functions:
        
        MAX_ELEMENT_INDEX                                0x8D6B
        
    Accepted by the <pname> parameters of GetTexParameterfv and 
    GetTexParameteriv:

        TEXTURE_IMMUTABLE_LEVELS                         0x82DF

Additions to Chapter 2 of the OpenGL 4.2 (Compatibility Profile)
Specification (OpenGL Operation)

    Modify Section 1.7.1 (OpenGL Shading Language) to require the OpenGL
    ES Shading Language specifications:
    
    "This specification should be read together with a companion documents
    titled The OpenGL Shading Language and The OpenGL ES Shading Language.
    ..."
  
    And later in this section:
    
    "OpenGL 4.2 implementations are guaranteed to support version 4.20 of the
    OpenGL Shading Language, version 1.00 of the OpenGL ES Shading Language
    and version 3.00 of the OpenGL ES Shading Language, and the version
    required by the application is specified in the shader source. ..."

    Modify Section 2.8 (Vertex Arrays) on page 45 before the start of
    Section 2.8.1:
    
    "Primitive restart can also be enabled or disabled with a <target> of
    PRIMITIVE_RESTART_FIXED_INDEX. In this case, the primitive restart index
    is equal to 2^N-1, where N is 8, 16 or 32 if the type is UNSIGNED_BYTE,
    UNSIGNED_SHORT, or UNSIGNED_INT, respectively, and the <index> value
    specified by PrimitiveRestartIndex is ignored.

    If both PRIMITIVE_RESTART and PRIMITIVE_RESTART_FIXED_INDEX are enabled,
    the <index> value determined by PRIMITIVE_RESTART_FIXED_INDEX is used.
    If PRIMITIVE_RESTART_FIXED_INDEX is enabled, primitive restart is not
    performed for array elements transferred by any drawing command not
    taking a <type> parameter, including ArrayElement or any of the Draw*
    commands other than *DrawElements*."

    Modify Section 2.18 (Asynchronous Queries) on page 195 to add
    ANY_SAMPLES_PASSED_CONSERVATIVE as another <target> option:
    
    "BeginQuery sets the active query object name for the query type given by
    <target> to <id>. If BeginQuery is called with an id of zero, if the
    active query object name for target is non-zero (for the targets
    SAMPLES_PASSED, ANY_SAMPLES_PASSED, and ANY_SAMPLES_PASSED_CONSERVATIVE if
    the active query for either target is non-zero), if <id> is the name of an
    existing query object whose type does not match target, if <id> is the
    active query object name for any query type, or if id is the active query
    object  for condtional rendering (see section 2.19), the error
    INVALID_OPERATION is generated."

    Modify Section 2.19 (Conditional Rendering) on page 197 to add
    ANY_SAMPLES_PASSED_CONSERVATIVE as another <mode> option:
    
    "If the result (SAMPLES_PASSED) of the query is zero, or if the result
    (ANY_SAMPLES_PASSED or ANY_SAMPLES_PASSED_CONSERVATIVE) is false, all
    rendering comands between BeginConditionalRender and the corresponding
    EndConditionalRender are discarded. ..."
    
    And later in this paragraph:
    
    "... If the result (SAMPLES_PASSED) of the query is non-zero, or if the
    result (ANY_SAMPLES_PASSED or ANY_SAMPLES_PASSED_CONSERVATIVE) is true,
    such commands are not discarded."
    
    Again at the end of Section 2.19 (Conditional Rendering) on page 198:
    
    "If <id> is the name of a query object with a target other than
    SAMPLES_PASSED, ANY_SAMPLES_PASSED or ANY_SAMPLES_PASSED_CONSERVATIVE,
    or if <id> is the name of a query currently in progress, the error
    INVALID_OPERATION is generated."
    
    Modify subsection 3.10.15 (Texture State and Proxy State):
    
    Modify the end of the first paragraph on page 345
    
    "... The value of TEXTURE_IMMUTABLE_FORMAT is FALSE. The value of
    TEXTURE_IMMUTABLE_LEVELS is 0. The values of DEPTH_TEXTURE_MODE,
    TEXTURE_COMPARE_MODE, and TEXTURE_COMPARE_FUNC are LUMINANCE,
    NONE, and LEQUAL respectively. ..."
    
    Modify subsection 3.10.16 (Immutable-Format Texture Images):
    
    Modify the second to last bullet on page 347
    
    "If the command is successful, TEXTURE_IMMUTABLE_FORMAT becomes
    TRUE and TEXTURE_IMMUTABLE_LEVELS becomes <levels>."

    Modify Section 4.1.7 (Occlusion Queries) to add
    ANY_SAMPLES_PASSED_CONSERVATIVE as another <target> option:
    
    "Occlusion queries use query objects to track the number of fragments or
    samples that pass the depth test. An occlusion query can be started and
    finished by calling BeginQuery and EndQuery, respectively, with a target
    of SAMPLES_PASSED, ANY_SAMPLES_PASSED or ANY_SAMPLES_PASSED_CONSERVATIVE."
    
    Modify last paragraph in Section 4.1.7:
    
    "When an occlusion query is started with the target ANY_SAMPLES_PASSED,
    the samples-boolean state maintained by the GL is set to FALSE. While that
    occlusion query is active, the samples-boolean state is set to TRUE if any
    fragment or sample passes the depth test. If the target of the query is
    ANY_SAMPLES_PASSED_CONSERVATIVE, an implementation may choose to use a
    less precise version of the test which can additionally set the
    samples-boolean state to TRUE in some other implementation-dependent
    cases. This may offer better performance on some implementations at the
    expense of false positives. When the occlusion query finishes, the
    samples-boolean state of FALSE or TRUE is written to the corresponding
    query object as the query result value, and the query result for that
    object is marked as available."
    
    Modify the list of allowed <value> parameters to GetTexParameter* in
    section 6.1.3 on page 478:
    
    "<value> must be IMAGE_FORMAT_COMPATIBILITY_TYPE,
    TEXTURE_IMMUTABLE_FORMAT, TEXTURE_IMMUTABLE_LEVELS, TEXTURE_RESIDENT,
    or one of the symbolic values in table 3.22"
    
    Modify the first paragraph of Section 6.1.13 (Asynchronous Queries) as
    follows:
    
    "... <target> identifies the query target, and must be one of
    SAMPLES_PASSED, ANY_SAMPLES_PASSED or ANY_SAMPLES_PASSED_CONSERVATIVE
    for occlusion queries, ..."
    
    Modify the first paragraph of page 488 in Section 6.1.13:
    
    "For occlusion queries with target ANY_SAMPLES_PASSED or
    ANY_SAMPLES_PASSED_CONSERVATIVE, if the number of bits is non-zero, the
    minimum number of bits is 1. ..."
    
Additions to Chapter 3 of the OpenGL 4.2 (Compatibility Profile)
Specification (Rasterization)

    Add to Table 3.20: Generic and specific compressed internal formats on
    page 303:
    
    Compressed Internal Format                 Base Internal Format Type
    ------------------------------------------ -------------------- ----------
    COMPRESSED_RGB8_ETC2                       RGB                  Specific
    COMPRESSED_SRGB8_ETC2                      RGBA                 Specific
    COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2   RGB                  Specific
    COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2  RGB                  Specific
    COMPRESSED_RGBA8_ETC2_EAC                  RGBA                 Specific
    COMPRESSED_SRGB8_ALPHA8_ETC2_EAC           RGBA                 Specific
    COMPRESSED_R11_EAC                         RED                  Specific
    COMPRESSED_SIGNED_R11_EAC                  RED                  Specific
    COMPRESSED_RG11_EAC                        RG                   Specific
    COMPRESSED_SIGNED_RG11_EAC                 RG                   Specific

    Add the following text to the Table 3.20 key:
    
    "The specific RGTC, BPTC, ETC2 and EAC formats are described in Appendix C."
    
Additions to Chapter 4 of the OpenGL 4.2 (Compatibility Profile)
Specification (Per-Fragment Operations and the Framebuffer)

    Add to section 4.4.2 in the unnumbered "Required Renderbuffer Formats"
    subsection, following the paragraph starting "Implementations are
    required to support..."

    "Implementations are also required to support STENCIL_INDEX8."

    Modify section 4.4.2 in the unnumbered "Required Framebuffer Formats"
    subsection, changing the third sentence to read
    
   "The depth attachment may be in any of the required depth or combined
    depth+stencil formats described in those sections, and the stencil
    attachment may be in any of the required stencil or combined
    depth+stencil formats."

Additions to Appendix C of the OpenGL 4.20.6 Specification (Compressed Texture
Image Formats)

    Add a new section to Appendix C:
    
    "C.3 ETC2/EAC Compressed Texture Image Formats
    
    The following sub-sections describe the texture compression format for the
    ETC2/EAC family of compression formats. It is not necessary for the
    GL to implement these compression formats in hardware and is acceptable
    for the decode to occur in software and be represented internally as
    uncompressed images."
    
    Then copy in the body of the OpenGL ES 3.0 Specification, Appendix C.1
    "ETC Compressed Texture Image Formats", which describes the details of
    the ETC2 and EAC formats required by this extension. Change "OpenGL ES
    implementations" to "OpenGL implementations" when performing this
    copying.

Additions to Chapter 3 of the OpenGL Shading Language 4.20.6 Specification
(Basics)

    Modify the paragraph at the bottom of page 12 in Section 3.3
    (Preprocessor) as follows:
    
    "... Shaders that specify #version 100 will be treated as targeting
    version 1.00 of the OpenGL ES Shading Language. Shaders that specify
    #version 300 will be treated as targeting version 3.00 of the OpenGL
    ES Shading Language. Shaders declaring 1.40, 1.50, ..."
    
    Modify the second paragraph at the of page 13 in Section 3.3
    (Preprocessor) as follows:
    
    "If the optional <profile> argument is provided, it must be the name of
    an OpenGL profile. Currently there are three choices:
        core
        compatibility
        es
        
    A <profile> argument can only be used with version 150 or greater. If no
    profile argument is provided and the version is 150 or greater, the
    default is <core>. If #version 300 is specified, the profile argument is
    not optional and must be <es>, or a compile-time error results. The
    Language Specification for the <es> profile is specified in  The OpenGL
    ES Shading Language specification. Unless otherwise specified, this ..."

Additions to the AGL/GLX/WGL Specifications

    None

Interactions with the OpenGL 4.2 Core Profile

    In the core profile, remove ArrayElement from the list of drawing
    commands for which primitive restart is not performed when
    PRIMITIVE_RESTART_FIXED_INDEX is enabled.

Errors

    None

New State

    (add to table 6.13, p. 520 (Vertex Array Data (not in Vertex Array Objects)))

                                                        Initial                          
    Get Value                     Type  Get Command     Value     Description               Sec.    Attribute
    ------------------------      ----  --------------- -------   ----------------------    -----   ------------
    PRIMITIVE_RESTART_FIXED_INDEX  B    IsEnabled       FALSE     Primitive restart with    2.8     vertex-array
                                                                  fixed index enable                

    (add to table 6.24, p. 531 (Textures (state per texture object)))

                                                        Initial   
    Get Value                     Type  Get Command     Value     Description               Sec.    Attribute
    ------------------------      ----  --------------- -------   ------------------------  ------- ---------
    TEXTURE_IMMUTABLE_LEVELS       Z+   GetTexParameter 0         storage number of levels  3.10.15 texture

New Implementation Dependent State
                                  
    Get Value                     Type  Get Command     Value     Description               Sec.
    -----------------             ----  -------------   --------  ---------------------     ----
    MAX_ELEMENT_INDEX              Z+   GetInteger64v   2^32 - 1  Maximum element index     2.6

Issues

    1) OpenGL-ES 3.0 contains several features that have been deprecated from
       the latest OpenGL Core specification. These were retained in OpenGL-ES
       3.0 in order to provide backwards compatibility with OpenGL-ES 2.0. Those
       features are:
       
        * Wide lines - LineWidth values greater than 1.0 will generate an INVALID_-
        VALUE error. The value ALIASED_LINE_WIDTH_RANGE is the max width supported.

        * Global component limit query - the implementation-dependent values
        MAX_VARYING_COMPONENTS and MAX_VARYING_FLOATS.

        * Application-generated object names - the names of all object types, such as
        buffer, query, and texture objects, must be generated using the corresponding
        Gen* commands. Trying to bind an object name not returned by a Gen*
        command will result in an INVALID_OPERATION error. This behavior is already
        the case for framebuffer, renderbuffer, and vertex array objects. Object
        types which have default objects (objects named zero), such as vertex array,
        framebuffer, and texture objects, may also bind the default object, even
        though it is not returned by Gen*.

        * Client vertex and index arrays - all vertex array attribute and element array
        index pointers must refer to buffer objects. The default vertex array object
        (the name zero) is also deprecated. Calling VertexAttribPointer when no
        buffer object or no vertex array object is bound will generate an INVALID_-
        OPERATION error, as will calling any array drawing command when no vertex
        array object is bound.

        * Legacy pixel formats - all ALPHA, LUMINANCE, LUMINANCE_ALPHA

        * Hints - GENERATE_MIPMAP_HINT targets to Hint (section 5.4).

        * Unified extension string - EXTENSIONS target to GetString.
        
       Should we bring these features back into the OpenGL 4.x Core specification
       so that it is a complete super-set of OpenGL-ES 3.0?
       
       RESOLVED: No, these will not be brought back into OpenGL 4.x Core. Apps
       written for OpenGL-ES 3.0 that want to also be compatible with OpenGL
       should make sure they don't use these features.

    2) OpenGL ES 3.0 has some differences to OpenGL that may affect how the
       application operates. For example, in OpenGL ES 3.0 cubemaps are
       always seamless but with OpenGL this needs to be explicitly enabled.
       Also sRGB is handled differently. In OpenGL ES 3.0 a surface is either
       sRGB or not sRGB and this cannot be changed. With OpenGL a surface can
       be sRGB capable and the mode can be toggled. How do we deal with
       these differences?
       
       RESOLVED: If the application needs a strict OpenGL ES 3.0
       implementation, it should not attempt to use a desktop GL context
       with the ES3_compatibility extension supported. Instead, use the
       {GLX|WGL}_EXT_create_context_es_profile extensions to request an
       actual OpenGL ES 3.0 context, which will not have these caveats.

Revision History

    Rev.    Date    Author    Changes
    ----  --------  --------  -----------------------------------------------
    10    10/18/13  Jon Leech Refer to OpenGL ES 3.0 specification appendix
                              C.1 for ETC2/EAC formats, instead of to OES
                              extensions (Bug 7522).

    9     03/12/13  Jon Leech Update issue 2 resolution and fix typo.

    8     11/10/12  pdaniell  Add the missing token TEXTURE_IMMUTABLE_LEVELS
                              from ARB_texture_view, which is in ES 3.0, and
                              add language describing its behavior; add
                              PRIMITIVE_RESTART_FIXED_INDEX to state tables
                              (Bug 9559).

    7     09/16/12  Jon Leech Add language to chapter 4 requiring
                              STENCIL_INDEX8 support (Bug 9418).

    6     05/30/12  Jon Leech Add language specifying how the two types of
                              primitive restart enable interact and that the
                              fixed index form only applies to
                              *DrawElements* commands taking a <type>
                              parameter. Reorder ETC2/EAC formats to match
                              Halti appendix.

    5     04/27/12  pdaniell  Updates based on feedback from John Kessenich.

    4     04/20/12  pdaniell  Resolve issue 2.

    3     03/19/12  pdaniell  Remove references to RGB565, which are now fixed
                              in ARB_ES2_compatibility and an updated OpenGL
                              4.2 core spec. Make the ETC2/EAC compression
                              formats compulsory and bring in the tokens.
    
    2     01/31/12  pdaniell  Incorporated feedback from Bruce.

    1     01/23/12  pdaniell  Initial version.
