Name

    ARB_ES2_compatibility

Name Strings

    GL_ARB_ES2_compatibility

Contact

    Jeff Bolz, NVIDIA Corporation (jbolz 'at' nvidia.com)

Contributors

    Acorn Pooley, NVIDIA
    Bruce Merry, ARM
    Greg Roth, NVIDIA
    Pat Brown, NVIDIA

Notice

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

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

Status

    Complete. Approved by the ARB on June 9, 2010.
    Approved by the Khronos Board of Promoters on July 23, 2010.

Version

    Last Modified Date:         March 12, 2012
    Revision:                   7

Number

    ARB Extension #95

Dependencies

    Written based on the wording of the OpenGL 4.0 Compatibility
    Profile (March 11, 2010) specification.

    This extension interacts with ARB_tessellation_shader or OpenGL 4.0.

Overview

    This extension adds support for features of OpenGL ES 2.0 that are
    missing from OpenGL 3.x. Enabling these features will ease the process
    of porting applications from OpenGL ES 2.0 to OpenGL.

IP Status

    No known IP claims.

New Procedures and Functions

    void ReleaseShaderCompiler(void);
    void ShaderBinary(sizei count, const uint *shaders,
                      enum binaryformat, const void *binary, sizei length);
    void GetShaderPrecisionFormat(enum shadertype,
                                  enum precisiontype,
                                  int *range, int *precision);

    void DepthRangef(clampf n, clampf f);
    void ClearDepthf(clampf d);

New Tokens

    Accepted by the <value> parameter of GetBooleanv, GetIntegerv,
    GetInteger64v, GetFloatv, and GetDoublev:

        SHADER_COMPILER                                 0x8DFA
        SHADER_BINARY_FORMATS                           0x8DF8
        NUM_SHADER_BINARY_FORMATS                       0x8DF9
        MAX_VERTEX_UNIFORM_VECTORS                      0x8DFB
        MAX_VARYING_VECTORS                             0x8DFC
        MAX_FRAGMENT_UNIFORM_VECTORS                    0x8DFD
        IMPLEMENTATION_COLOR_READ_TYPE                  0x8B9A
        IMPLEMENTATION_COLOR_READ_FORMAT                0x8B9B

    Accepted by the <type> parameter of VertexAttribPointer:

        FIXED                                           0x140C

    Accepted by the <precisiontype> parameter of
    GetShaderPrecisionFormat:

        LOW_FLOAT                                       0x8DF0
        MEDIUM_FLOAT                                    0x8DF1
        HIGH_FLOAT                                      0x8DF2
        LOW_INT                                         0x8DF3
        MEDIUM_INT                                      0x8DF4
        HIGH_INT                                        0x8DF5

    Accepted by the <format> parameter of most commands taking sized
    internal formats:

        RGB565                                           0x8D62

Additions to Chapter 2 of the OpenGL 4.0 Specification (OpenGL Operation)

    Add a new Section 2.1.5 (Fixed-Point Computation) and renumber later
    sections:

    Fixed-Point Computation

    Vertex attributes may be specified using a 32-bit two's-complement signed
    representation with 16 bits to the right of the binary point (fraction
    bits).


    Add to Table 2.2, p. 16 (GL data types)

        GL Type |  Minimum  | Description
                | Bit Width |
        -----------------------------------
        fixed   |    32     | Signed 2's complement 16.16 scaled integer


    Section 2.8, p.36 (Vertex Arrays)

    Adjust the sentence in the first paragraph on p. 37:

    For type the values BYTE, SHORT, INT, FLOAT, HALF_FLOAT, DOUBLE, and
    FIXED indicate types byte, short, int, float, half, double, and fixed
    respectively;...


    Modify the descripion of the pseudocode explaining
    ArrayElementInstanced as follows (p.42):

    ... VertexAttrib[size]N[type]v will be called. When a generic vertex
    attribute array contains fixed-point data, the generic vertex
    attribute values are specified using a fixed-point signed 2's
    complement 16.16 scaled integer format.

    Section 2.8.2, p.43 (Drawing Commands)

    Modify the paragraphs that begin with "with one exception" (page 44):

    with one exception: the current normal coordinate, color, secondary
    color, color index, edge flag, fog coordinate, texture coordinates,
    and generic attribute values are not modified by the execution of
    DrawArraysOneInstance.

    ...

    with one exception: the current normal coordinate, color, secondary
    color, color index, edge flag, fog coordinate, texture coordinates, and
    generic attribute values are not modified by the execution of
    DrawElements.


    Table 2.5, p. 39 (Vertex array sizes (values per vertex) and data types.)

    Add "fixed" as a legal type for VertexAttribPointer


    Section 2.14, p. 89 (Vertex Shaders)

    Modify the third paragraph:

    To use a vertex shader, shader source code is first loaded into a shader
    object and then compiled. Alternatively, pre-compiled shader binary code
    may be directly loaded into a shader object. An OpenGL implementation
    must support shader compilation (the boolean value SHADER_COMPILER must
    be TRUE). If the integer value NUM_SHADER_BINARY_FORMATS is greater than
    zero, then shader binary loading is supported. One or more vertex shader
    objects are then attached to a program object....


    Section 2.14.1, p. 89 (Shader Objects)

    Add before the description of DeleteShader:

    Resources allocated by the shader compiler may be released with the
    command

        void ReleaseShaderCompiler(void);

    This is a hint from the application, and does not prevent later use
    of the shader compiler. If shader source is loaded and compiled after
    ReleaseShaderCompiler has been called, CompileShader must succeed
    provided there are no errors in the shader source.

    The range and precision for different numeric formats supported by the
    shader compiler may be determined with the command
    GetShaderPrecisionFormat (see section 6.1.16)


    Add a new Section 2.14.2 (Loading Shader Binaries) and shift other
    section numbers.

    Precompiled shader binaries may be loaded with the command

        void ShaderBinary(sizei count, const uint *shaders,
                          enum binaryformat, const void *binary,
                          sizei length);

    <shaders> contains a list of <count> shader object handles. Each
    handle refers to a unique shader type (vertex shader or fragment
    shader). <binary>  points to <length> bytes of pre-compiled binary
    shader code in client memory, and <binaryformat> denotes the format
    of the pre-compiled code.

    The binary image will be decoded according to the extension
    specification defining the specified <binaryformat>. OpenGL defines
    no specific binary formats, but does provide a mechanism to obtain
    token values for such formats provided by extensions. The number of
    shader binary formats supported can be obtained by querying the
    value of NUM_SHADER_BINARY_FORMATS. The list of specific binary
    formats supported can be obtained by querying the value of
    SHADER_BINARY_FORMATS.

    Depending on the types of the shader objects in <shaders>,
    ShaderBinary will individually load binary vertex or fragment
    shaders, or load an executable binary that contains an optimized
    pair of vertex and fragment shaders stored in the same binary.

    An INVALID_ENUM error is generated if <binaryformat> is not a
    supported format returned in SHADER_BINARY_FORMATS. An INVALID_VALUE
    error is generated if the data pointed to by binary does not match
    the specified <binaryformat>. Additional errors corresponding to
    specific binary formats may be generated as specified by the
    extensions defining those formats. An INVALID_OPERATION error is
    generated if more than one of the handles refers to the same type of
    shader (vertex or fragment shader.)

    If ShaderBinary fails, the old state of shader objects for which the
    binary was being loaded will not be restored. Note that if shader
    binary interfaces are supported, then an OpenGL implementation may
    require that an optimized pair of vertex and fragment shader binaries
    that were compiled together be specified to LinkProgram. Not
    specifying an optimized pair may cause LinkProgram to fail.

    Section 2.14.4, p. 97 (Uniform Variables)

    Add after the definition of MAX_VERTEX_UNIFORM_COMPONENTS:

    The implementation-dependent constant MAX_VERTEX_UNIFORM_VECTORS has
    a value equal to the value of MAX_VERTEX_UNIFORM_COMPONENTS divided
    by four.


    Section 2.14.7, p. 118 (Varying Variables)

    Add after the definition of MAX_VARYING_COMPONENTS:

    The implementation-dependent constant MAX_VARYING_VECTORS has a
    value equal to the value of MAX_VARYING_COMPONENTS divided by four.


    Section 2.16.1, p. 164 (Controlling the Viewport)

    Change the second paragraph:

    The factor and offset applied to zd encoded by n and f are set using

        void DepthRange(clampd n, clampd f);
        void DepthRangef(clampf n, clampf f);

    ...

Additions to Chapter 3 of the OpenGL 4.0 Specification (Rasterization)

    Section 3.9.3 (Texture Image Specification)

    Add to the list of required texture and renderbuffer color formats on
    page 262, on the same line as R11F_G11F_B10F:

    - RGB565

    Add to Table 3.17 (Correspondance of sized ...) on page 265, following
    the row for format RGB5:
    
    Sized Internal Format  Base Internal Format  R bits  G bits  B bits  A bits  Shared bits
    ---------------------  --------------------  ------  ------  ------  ------  -----------
    RGB565                 RGB                    5      6       5


    Section 3.12.1, p. 323 (Shader Variables)

    Add after the definition of MAX_FRAGMENT_UNIFORM_COMPONENTS:

    The implementation-dependent constant MAX_FRAGMENT_UNIFORM_VECTORS
    has a value equal to the value of MAX_FRAGMENT_UNIFORM_COMPONENTS
    divided by four.


Additions to Chapter 4 of the OpenGL 4.0 Specification (Per-Fragment Operations
and the Frame Buffer)

    Section 4.2.1, p. 352 (Selecting a Buffer for Writing)

    Extend this paragraph:

    Indicating a buffer or buffers using DrawBuffer or DrawBuffers causes
    subsequent pixel color value writes to affect the indicated buffers. If
    the GL is bound to a framebuffer object and a draw buffer selects an
    attachment that has no image attached, then that fragment color is not
    written to any buffer.


    Section 4.2.3, p. 358 (Clearing the Buffers)

    Change the third paragraph

    The commands

        void ClearDepth(clampd d);
        void ClearDepthf(clampf d);

    set the depth value used when clearing the depth buffer.


    Section 4.3.2, p. 363 (Reading Pixels)

    Add after the description of ReadPixels:

    If the current read buffer is neither floating point nor integer,
    calling GetIntegerv with the symbolic constants
    IMPLEMENTATION_COLOR_READ_FORMAT and IMPLEMENTATION_COLOR_READ_TYPE will
    return RGBA and UNSIGNED_BYTE respectively; otherwise it will generate
    an INVALID_OPERATION error.

    Extend this sentence:

    ReadPixels generates an INVALID_OPERATION error if it attempts to
    select a color buffer while READ_BUFFER is NONE or if the GL is
    using a framebuffer object (i.e. READ_FRAMEBUFFER_BINDING is
    non-zero) and the read buffer selects an attachment that has no
    image attached.


    Section 4.4.4, p. 390 (Framebuffer Completeness)

    Remove all references to draw/read buffers affecting completeness. In
    particular, delete:

      - The value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE must not be NONE
        for any color attachment point(s) named by DRAW_BUFFERi.

            { FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER }

      - If READ_BUFFER is not NONE, then the value of
        FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE must not be NONE for the
        color attachment point named by READ_BUFFER.

            { FRAMEBUFFER_INCOMPLETE_READ_BUFFER }

      - Changing the read buffer or one of the draw buffers.


Additions to Chapter 5 of the OpenGL 4.0 Specification (Special Functions)

    None

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

    Section 6.1.18 (Shader and Program Queries)

    Add after the description of GetShaderSource:

    The command

        void GetShaderPrecisionFormat(enum shadertype,
                                      enum precisiontype,
                                      int *range, int *precision);

    returns the range and precision for different numeric formats
    supported by the shader compiler. <shadertype> must be VERTEX_SHADER
    or FRAGMENT_SHADER. <precisiontype> must be one of LOW_FLOAT,
    MEDIUM_FLOAT, HIGH_FLOAT, LOW_INT, MEDIUM_INT or HIGH_INT. <range>
    points to an array of two integers in which encodings of the
    format's numeric range are returned. If min and max are the smallest
    and largest values representable in the format, then the values
    returned are defined to be

        <range>[0] = floor(log2(|min|))
        <range>[1] = floor(log2(|max|))

    <precision> points to an integer in which the log2 value of the
    number of bits of precision of the format is returned. If the
    smallest representable value greater than 1 is 1 + <eps>, then
    *<precision> will contain floor(-log2(eps)), and every value in the
    range

        [-2^<range>[0], 2^<range>[1]]

    can be represented to at least one part in 2^*<precision>. For
    example, an IEEE single-precision floating-point format would return
    <range>[0] = 127, <range>[1] = 127, and *<precision> = 23, while a
    32-bit two's-complement integer format would return <range>[0] = 31,
    <range>[1] = 30, and *<precision> = 0.

    The minimum required precision and range for formats corresponding
    to the different values of <precisiontype> are described in section
    4.5 of the OpenGL Shading Language specification.


Additions to the OpenGL Shading Language Specification, version 4.00.8

    Section 3.3, p. 8 (Preprocessor)

    ...Version 1.10 of the language does not require shaders to include this
    directive, and shaders that do not include a #version directive will be
    treated as targeting version 1.10. Shaders that specify #version 100 will
    be treated as targeting version 1.00 of the OpenGL ES Shading Language,
    which is a strict subset of version 1.50.


    Section 7.3, p. 90 (Built-In Constants)

    Add the following constants:

    const int gl_MaxVertexUniformVectors = 256;
    const int gl_MaxFragmentUniformVectors = 256;
    const int gl_MaxVaryingVectors = 15;


    Add a new Section X.Y (Counting of Varyings and Uniforms)

    GLSL ES 1.00 specifies the storage available for varying variables in
    terms of an array of 4-vectors. Similarly for uniform variables. The
    assumption is that variables will be packed into these arrays without
    wasting space. This places significant burden on implementations since
    optimal packing is computationally intensive. Implementations may have
    more internal resources than exposed to the application and so avoid the
    need to perform packing but this is also considered an expensive
    solution.

    ES 2.0 therefore relaxes the requirements for packing by specifying a
    simpler algorithm that may be used. This algorithm specifies a minimum
    requirement for when a set of variables must be supported by an
    implementation. The implementation is allowed to support more than the
    minimum and so may use a more efficient algorithm and/or may support more
    registers than the virtual target machine.

    In all cases, failing resource allocation for variables must result in an
    error.

    The resource allocation of variables must succeed for all cases where the
    following packing algorithm succeeds:

    - The target architecture consists of a grid of registers,
      gl_MaxVaryingVectors rows by 4 columns for varying variables and
      gl_Max{Vertex,Fragment}UniformVectors rows by 4 columns for uniform
      variables. Each register can contain a float value.

    - Variables are packed into the registers one at a time so that they each
      occupy a contiguous subrectangle. No splitting of variables is
      permitted.

    - The orientation of variables is fixed. Vectors always occupy registers
      in a single row. Elements of an array must be in different rows. E.g.
      vec4 will always occupy one row; float[8] will occupy one column. Since
      it is not permitted to split a variable, large arrays e.g.. for
      varyings, float[17] will always fail with this algorithm.

    - Variables consume only the minimum space required with the exception
      that mat2 occupies 2 complete rows. This is to allow implementations
      more flexibility in how variables are stored.

    - Arrays of size N are assumed to take N times the size of the base type.

    - Variables are packed in the following order:

      1. Arrays of mat4 and mat4
      2. Arrays of mat2 and mat2 (since they occupy full rows)
      3. Arrays of vec4 and vec4
      4. Arrays of mat3 and mat3
      5. Arrays of vec3 and vec3
      6. Arrays of vec2 and vec2
      7. Arrays of float and float

    - For each of the above types, the arrays are processed in order of size,
      largest first. Arrays of size 1 and the base type are considered
      equivalent. In the case of varyings, the first type to be packed
      (successfully) is mat4[2] followed by mat4, mat2[2], mat2, vec4[8],
      vec4[7],...vec4[1], vec4, mat3[2], mat3 and so on. The last variables
      to be packed will be float (and float[1]).

    - For 2,3 and 4 component variables packing is started using the 1st
      column of the 1st row. Variables are then allocated to successive rows,
      aligning them to the 1st column.

    - For 2 component variables, when there are no spare rows, the strategy
      is switched to using the highest numbered row and the lowest numbered
      column where the variable will fit. (In practice, this means they will
      be aligned to the x or z component.) Packing of any further 3 or 4
      component variables will fail at this point.

    - 1 component variables (i.e. floats and arrays of floats) have their own
      packing rule. They are packed in order of size, largest first. Each
      variable is placed in the column that leaves the least amount of space
      in the column and aligned to the lowest available rows within that
      column. During this phase of packing, space will be available in up to
      4 columns. The space within each column is always contiguous.

    - If at any time the packing of a variable fails, the compiler or linker
      must report an error.

    Example: pack the following types, if gl_MaxVaryingVectors were equal to
    eight:

        varying vec4 a;         // top left
        varying mat3 b;         // align to left, lowest numbered rows
        varying vec2 c[3];      // align to left, lowest numbered rows
        varying vec2 d[2];      // Cannot align to left so align to z column,
                                // highest numbered rows
        varying vec2 e;         // Align to left, lowest numbered rows.
        varying float f[3]      // Column with minimum space
        varying float g[2];     // Column with minimum space (choice of 2,
                                // either one can be used)
        varying float h;        // Column with minimum space

    In this example, the varyings happen to be listed in the order in which
    they are packed. Packing is independent of the order of declaration.

          x y z w
        0 a a a a
        1 b b b f
        2 b b b f
        3 b b b f
        4 c c g h
        5 c c g
        6 c c d d
        7 e e d d

    Some varyings e.g. mat4[8] will be too large to fit. These always fail
    with this algorithm.

    If referenced in the fragment shader (after preprocessing), the built-in
    special variables (gl_FragCoord, gl_FrontFacing and gl_PointCoord) are
    included when calculating the storage requirements of varyings.

    Only varyings statically used in both shaders are counted.

    When calculating the number of uniform variables used, any literal
    constants present in the shader source after preprocessing are included
    when calculating the storage requirements. Multiple instances of
    identical constants should count multiple times.

    Part of the storage may be reserved by an implementation for its own use
    e.g. for computation of transcendental functions. This reduces the number
    of uniforms available to the shader. The size of this reduction is
    undefined but should be minimized.


Additions to the AGL/GLX/WGL Specifications

    None

Errors

    ShaderBinary generates an INVALID_ENUM error if <binaryformat> is
    not a supported format returned in SHADER_BINARY_FORMATS.

    ShaderBinary generates an INVALID_VALUE error if the data pointed to
    by binary does not match the specified <binaryformat>.

    ShaderBinary generates an INVALID_OPERATION error if more than one
    of the handles refers to the same type of shader (vertex or fragment
    shader.)

    GetIntegerv, GetBooleanv, and GetFloatv generate an INVALID_OPERATION
    error if <pname> is IMPLEMENTATION_COLOR_READ_TYPE or
    IMPLEMENTATION_COLOR_READ_FORMAT and the current read buffer is floating
    point or integer format.

    ReadPixels generates an INVALID_OPERATION error if it attempts to
    select a color buffer while READ_BUFFER is NONE or if the GL is
    using a framebuffer object (i.e. READ_FRAMEBUFFER_BINDING is
    non-zero) and the read buffer selects an attachment that has no
    image attached.

New State

    None

New Implementation Dependent State

                                                       Minimum
    Get Value                        Type    Get Command  Value  Description                  Sec.
    -------------------------        ------- ------------ ------- ------------------------   ------
    SHADER_BINARY_FORMATS             0* x Z GetIntegerv    -    Enumerated shader binary    2.14.2
                                                                 formats
    NUM_SHADER_BINARY_FORMATS         Z+     GetIntegerv    0    Number of shader binary     2.14.2
                                                                 formats
    SHADER_COMPILER                   B      GetBooleanv    -    Shader compiler supported   2.14

    MAX_VERTEX_UNIFORM_VECTORS        Z+     GetIntegerv   256   Number of vectors for       2.14.4
                                                                 vertex shader uniform
                                                                 variables
    MAX_VARYING_VECTORS               Z+     GetIntegerv   15    Number of vectors for       2.14.6
                                                                 varying variables
    MAX_FRAGMENT_UNIFORM_VECTORS      Z+     GetIntegerv   256   Number of vectors for       3.12.1
                                                                 fragment shader uniform
                                                                 variables
    IMPLEMENTATION_COLOR_READ_TYPE    Z+     GetIntegerv    -    Implementation preferred    4.3.2
                                                                 pixel type
    IMPLEMENTATION_COLOR_READ_FORMAT  Z+     GetIntegerv    -    Implementation preferred    4.3.2
                                                                 pixel format


Issues

    (1) Should the uniform/varying limits MAX_*_COMPONENTS vs MAX_*_VECTORS
    constants be allowed to take independent values, or are they tied
    together?

    UNRESOLVED: Currently MAX_*_VECTORS = MAX_*_COMPONENTS / 4.

    (2) What should IMPLEMENTATION_COLOR_READ_FORMAT and
    IMPLEMENTATION_COLOR_READ_TYPE do? OpenGL does not have the same
    limitations of allowed format/type for ReadPixels that ES has.

    RESOLVED: Always return RGBA/UNSIGNED_BYTE.

    This query is in the weird situation where the application needs to know
    how to compute a size based on the format/type combination that is
    returned as well as how to interpret the data. So if the GL attempts to
    return "something useful", it may cause an application to have
    unpredictable behavior if it doesn't understand the values that are
    returned. Given the wide variety of format/type conversions supported by
    GL, this feature is not particularly useful - the app can simply use the
    format it wants.

    What's really required of this for compatibility is to return a valid
    format for any legal renderable format in GL ES2.0. RGBA/UNSIGNED_BYTE
    should be sufficient to accomplish that. Having these queries return
    an error for float and integer formats discourages their use in the
    future.

    (3) The current GLSL ES packing rules hardcode 8 and 128 rather than
    scaling with the limits exposed by the implementation. Should these
    scale?

    RESOLVED: Yes, replace references to 8 and 128 with gl_Max*Vectors.

    (4) How can we deal with the conflicting behavior of current vertex
    attribute state being made indeterminate by DrawArrays/DrawElements?

    UNRESOLVED: GL behavior is currently undefined, so make it defined to
    match ES behavior. Are there any performance concerns with this?

    (5) Should the varying/uniform packing rules apply to double-precision
    types in GL SM5?

    UNRESOLVED: Yes. Need to insert these into the ordered list of types.

    (6) What should we do about conflicting #version values?

    RESOLVED: The original GLSL 1.00 spec did not include #version, it was
    added in GLSL 1.10 and the first accepted value was "110". GLSL ES has
    only one version and it is "100", so there is currently no overlap and
    ambiguity. So GLSL can be extended to accept "100" and always interpret
    it to mean "GLSL ES 1.00 functionality".

    Future versions of the shading language specs should be modified to
    require something in the shader text to indicate which type of GLSL is
    being used. In GLSL 1.50, the #version command accepts

        #version <number> <profile_opt>

    where <profile_opt> can be either "core" or "compatibility". We could
    require "es" for GLSL ES shaders and make the profile be required in
    both GLSL and GLSL ES.

    (7) Are there any existing packing rules that the ES packing rules may
    conflict with?

    UNRESOLVED: Named uniform blocks have extensive packing rules, but the ES
    rules only apply to the default uniform block so those aren't in
    conflict. The only mention of how things may be packed in the default
    uniform block is that matrices consume no more than 4*min(r,c)
    components. For both uniforms and varyings, the spec does not explicitly
    guarantee that if a program is within the limit then linking will
    succeed, but that guarantee may be reasonably inferred.

    The ES rules guarantee that under certain circumstances linking is
    guaranteed to succeed. Adopting these rules as *the* minimum guarantee
    will weaken the desktop rules. However, it is likely that some vec4-
    centric implementations may not be able to satisfy the inferred desktop
    guarantee. For example, any time a single variable has more array
    elements than MAX_*_UNIFORM_COMPONENTS/4 and is dynamically indexed.

    Proposed resolution is to adopt the ES rules as the minimum guarnatee
    for the default uniform block and for varyings.

    (8) How should we handle draw buffer completeness?

    RESOLVED: Remove draw/readbuffer completeness checks, and treat
    drawbuffers referring to missing attachments as if they were NONE.

    GL ES does not support MRT and the notions of DrawBuffers and ReadBuffer
    were removed, including the FRAMEBUFFER_INCOMPLETE_{DRAW,READ}_BUFFER
    checks. One consequence of this is that a GL ES application can render to
    a depth-only FBO without calling DrawBuffer, whereas in Desktop GL an
    application must call DrawBuffer(NONE). To make Desktop GL a superset, we
    must remove the need to call DrawBuffer(NONE), and the most
    straightforward way to do that is to remove these completeness checks.

    (9) What divergent behaviors should this spec leave unaltered?

    RESOLVED: There are various differing features that cannot be
    resolved without breaking backward compatibility with desktop
    applications.

    * Framebuffer Objects are shared on desktop, but not in ES.
    * Some textures are incomplete in ES that would be considered
      complete on desktop.
    * ES requires different version string formats for API and shading
      language version queries.


    (10) Which changes should be made to both the core and compatibility
    profiles and which should be restricted to the core profile?

    UNRESOLVED: We should probably decide what needs to go into core and
    what into compatibility. In the cases that core has removed the
    features being expanded, this decision is clear. Even where this is
    not the case, it may make sense to limit certain features to
    compatibility rather than clutter up core with features only present
    for ES compatibility.

    Bruce Merry's suggested division:

    Core + compatibility:
    ReleaseShaderCompiler
    Relaxation of framebuffer completeness rules
    Preserving current attributes after Draw*

    Compatibility only:
    Fixed-point vertex attributes
    Float versions of DepthRange and ClearDepth
    Binary shaders
    #version 100
    ES2 packing model
    implementation read color format
    vector-based resource-limits
    GetShaderPrecisionFormat

    (11) Are immediate mode vertex attrib calls that take fixed point
    parameters required?

    RESOLVED: No. The purpose of this extension is limited to
    facilitating the porting of ES2 applications to the desktop. Adding
    immediate mode VertexAttrib calls to promote internal consistency
    with other desktop features is less important.

    (12) Should RGB565 be added to the extension?

    RESOLVED: Yes. The initial version of this extension did not include it,
    as did OpenGL 4.1, which included functionality from this extension.
    This was an oversight. RGB565 was added to the required format list in
    the initial release of the OpenGL 4.2 spec, but it was not added to the
    table of sized internal color formats. However, RGB565
    compatibility is important to ES2 compatibility.

    The ARB discussed this situation in February 2012 and agreed to revise
    the extension spec and OpenGL 4.2 spec to fully support RGB565. While
    some drivers may not support RGB565, we believe they will add support
    quickly.

    (13) OpenGL ES 2.0 may have some unavoidable differences from an OpenGL
    context supporting ES2_compatibility, since this extension can't change
    default GL state values or prevent behavior defined to work by the GL
    specification. How do we deal with these differences?
       
    RESOLVED: If the application needs a strict OpenGL ES 2.0
    implementation, it should not attempt to use a desktop GL context
    with the ES2_compatibility extension supported. Instead, use the
    {GLX|WGL}_EXT_create_context_es_profile extensions to request an
    actual OpenGL ES 2.0 context, which will not have these caveats.

Revision History

    Rev.    Date      Author    Changes
    ----  ----------  --------- -----------------------------------------
    7     03/12/2013  Jon Leech Add issue 13 and copy resolution from
                                ES3_compatibility spec.
    6     04/13/2012  Jon Leech Add RGB565 to required texture & renderbuffer
                                formats and to the table of sized internal
                                formats (Bug 8530).
    5     08/04/2010  Jon Leech Add SHADER_BINARY_FORMATS to new tokens
                                section.
    4     05/26/2010  Jon Leech Add missing tokens, make language more
                                consistent with GL core spec in some places,
                                and reflow paragraphs.
    3     05/21/2010  groth     limit features to the minimum for portability
                                purge VertexAttrib*. limit shaderbinary to V&F
                                adjust page/section numbers and text to 4.0
    2     05/19/2010  groth     respond to bmerry's feedback
    1     12/28/2009  jbolz     Internal revisions.
