Name

    ANGLE_request_extension

Name Strings

    GL_ANGLE_request_extension

Contributors

    Geoff Lang

Contact

    Geoff Lang (geofflang 'at' google.com)

Notice

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

Status

    Draft

Version

    Version 1, November 28, 2016

Number

    OpenGL ES Extension #??

Dependencies

    Requires OpenGL ES 2.0

    Written against the OpenGL ES 3.0 specification.

Overview

    This extension allows the client to query extensions that can be enabled and
    explicitly request than an extension be enabled.

New Procedures and Functions

    void RequestExtension(const char *name)

New Tokens

    Accepted by the <name> parameter of GetString and GetStringi:

        REQUESTABLE_EXTENSIONS_ANGLE      0x93A8

    Accepted by the <value> parameter of the GetInteger* functions:

        NUM_REQUESTABLE_EXTENSIONS_ANGLE  0x93A9

Additions to the OpenGL ES 3.0 Specification

    Add the following paragraph to the end paragraph 4 of section 6.1.6, String
    Queries:

    "REQUESTABLE_EXTENSIONS_ANGLE returns a list of extensions that can be
    enabled at runtime by calling RequestExtension."

    Change the following section of paragraph 6 of section 6.1.6, String Queries:

    - "name may only be EXTENSIONS, indicating that the extension name
    - corresponding to the indexth supported extension should be returned.
    - <index> may range from zero to the value of NUM_EXTENSIONS minus one"
    + "name may be EXTENSIONS or REQUESTABLE_EXTENSIONS_ANGLE, indicating that
    + the extension name corresponding to the indexth supported or requestable
    + extension should be returned. <index> may range from zero to the value of
    + NUM_EXTENSIONS and NUM_REQUESTABLE_EXTENSIONS_ANGLE minus one"

    The command

       void RequestExtension(const char *name)

    enables the requestable OpenGL ES extension named <name>. If the extension
    was not requestable, INVALID_OPERATION is generated.

New State

    Add to Table 6.30 (Implementation Dependent Version and Extension Support)

    Get value                        Type Get Cmd     Min Value Description                      Sec.
    -------------------------------- ---- ----------- --------- -------------------------------- -----
    NUM_REQUESTABLE_EXTENSIONS_ANGLE Z+   GetIntegerv -         Number of individual requestable 6.1.6
                                                                extension names

Interactions with the OpenGL ES 2.0 specification:

    Remove all references to GetStringi and NUM_REQUESTABLE_EXTENSIONS_ANGLE.

Issues

    (1) How can the user determine which extensions can be enabled without
        potentially generating errors?

      This can be solved by:
      a) Never generate an error in EnableExtensions, simply return false when
         the extension is not recognized or cannot be enabled.
      b) Add another query for the extensions that the context supports
         enabling.

      RESOLVED: Use (b) because it allows the context to explicity advertise
      which extensions support enabling and doesn't generate errors in the
      normal use case.

Revision History

    Rev.    Date         Author     Changes
    ----  -------------  ---------  ----------------------------------------
      1    Nov 28, 2016  geofflang  Initial version
