Name

    ANGLE_request_extension

Name Strings

    GL_ANGLE_request_extension

Contributors

    Geoff Lang
    James Darpinian

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 2, October 4, 2019

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 that an extension be enabled or disabled.

New Procedures and Functions

    void RequestExtension(const char *name)

    void DisableExtension(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 commands

       void RequestExtension(const char *name)
       void DisableExtension(const char *name)

    enable or disable the requestable OpenGL ES extension named <name>. If the
    requested extension was not requestable or disablable, INVALID_OPERATION is
    generated. Not all requestable extensions can be disabled. There is
    currently no query for disablable extensions.

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
      2    Oct 4, 2019   jdarpinian Add DisableExtension
