Name

    EXT_create_context_es_profile
    EXT_create_context_es2_profile

Name Strings

    GLX_EXT_create_context_es_profile
    GLX_EXT_create_context_es2_profile

    NOTE: implementations of this extension must export BOTH extension
    strings, for backwards compatibility with applications written
    against version 1 of this extension.

Contact

    Jon Leech (jon 'at' alumni.caltech.edu)
    Piers Daniell (pdaniell 'at' nvidia.com)

IP Status

    No known IP claims.

Status

    Complete.

Version

    Version 4, April 6, 2012

Number

    399

Dependencies

    GLX 1.4 is required.

    GLX_ARB_create_context is required.

    GLX_ARB_create_context_profile is required.

    An OpenGL ES implementation is required.

Overview

    This extension allows creating an OpenGL ES context.

New Procedures and Functions

    None

New Tokens

    Accepted as a bit in the attribute value for
    GLX_CONTEXT_PROFILE_MASK_ARB in <*attrib_list>:

	GLX_CONTEXT_ES_PROFILE_BIT_EXT		0x00000004
	GLX_CONTEXT_ES2_PROFILE_BIT_EXT		0x00000004

Additions to the OpenGL / WGL Specifications

    None. This specification is written for GLX.

Additions to the GLX 1.4 Specification

    This extension modifies language specified in the
    GLX_ARB_create_context and GLX_ARB_create_context_profile
    extensions.

    In the description of glXCreateContextAttribsARB, replace the
    sentence

   "... If a version less than or equal to 3.0 is requested, the context
    returned may implement any of the following versions:"

    with

   "... If the version requested is a valid and supported OpenGL-ES version,
    and the GLX_CONTEXT_ES_PROFILE_BIT_EXT bit is set in the
    GLX_CONTEXT_PROFILE_MASK_ARB attribute (see below), then the context
    returned will implement the OpenGL ES version requested.

    Otherwise, if a version less than or equal to 3.0 is requested, the
    context returned may implement any of the following versions:"


    Replace the sentence

   "... If the requested OpenGL version is less than 3.2,
    GLX_CONTEXT_PROFILE_MASK_ARB is ignored and the functionality of the
    context is determined solely by the requested version."

    with

   "... If the GLX_CONTEXT_ES_PROFILE_BIT_EXT bit is set, and the
    requested version is a valid and supported OpenGL-ES implementation,
    then a context implementing that OpenGL ES version is returned;
    otherwise, if the requested OpenGL version is less than
    3.2, GLX_CONTEXT_PROFILE_MASK_ARB is ignored and the functionality
    of the context is determined solely by the requested version."


    Add prior to the sentence

   "The attribute name GLX_CONTEXT_FLAGS_ARB specifies a set of flag
    bits affecting the rendering context.":

   "If an OpenGL ES profile is requested, then the context returned
    cannot implement additional functionality, including functionality
    defined only by the core or compatibility profiles, unless such
    functionality is defined by extensions that are themselves specified
    relative to that specific OpenGL ES version[*].
	[*] Such functionality should have a corresponding extension
	specification in the OpenGL ES Registry. In some
	implementations, vendor extensions defined relative to the OpenGL ES
	version, but not yet added to the OpenGL ES Registry, may also be
	supported."

    Replace the bullet point starting "* If attribute
    GLX_CONTEXT_PROFILE_MASK_ARB has no bits set;..." with

 "* If attribute GLX_CONTEXT_PROFILE_MASK_ARB has no bits set; has any
    bits set other than GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
    GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, or
    GLX_CONTEXT_ES_PROFILE_BIT_EXT; has more than one of these bits
    set; or if the implementation does not supported the requested
    profile, then GLXBadProfileARB is generated."

GLX Errors

    None

GLX Protocol

    None

Errors

    GLXBadProfileARB is generated if the value of
    GLX_CONTEXT_PROFILE_MASK_ARB contains more than a single valid
    profile bit.

New State

    None

New Implementation Dependent State

    None

Conformance Tests

    TBD

Sample Code

    TBD

Issues

    All non-window-system dependent issues described in the
    WGL_EXT_create_context_es_profile extension specification apply
    equally to this extension.

Revision History

    Version 4, 2012/04/06 - Specify that both name strings must be
	exported for backwards compatibility. Restore GLXBadProfileARB
	error that was mistakenly changed in version 3.

    Version 3, 2012/03/28 - Add support for any OpenGL-ES version, not
	just version 2.0. Alias GLX_CONTEXT_ES2_PROFILE_BIT_EXT with
	GLX_CONTEXT_ES_PROFILE_BIT_EXT and the extension name
	GLX_EXT_create_context_es2_profile with
	GLX_EXT_create_context_es_profile.

    Version 2, 2010/08/04 - Fix typos and assign extension number.

    Version 1, 2010/05/18 - Recast the OpenGL ES 2.0 "profile" mechanism
    into a separate EXT layered on the ARB profiled context creation
    mechanism.
