Name

    ARB_create_context
    ARB_create_context_profile

Name Strings

    GLX_ARB_create_context
    GLX_ARB_create_context_profile

Contact

    Jon Leech (jon 'at' alumni.caltech.edu)

Notice

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

IP Status

    No known IP claims.

Status

    Complete. Approved by the ARB on July 28, 2009.
    Approved by the Khronos Board of Promoters on August 28, 2009.
    Version 8 update approved by the ARB on September 24, 2009.

Version

    Version 10, 2012/03/28

Number

    ARB Extension #56 (GLX_ARB_create_context)
    ARB Extension #75 (GLX_ARB_create_context_profile)

Dependencies

    GLX 1.4 is required.

    Some of the capabilities of these extensions are only available with
    contexts supporting OpenGL 3.0 or later.

    The presence of an OpenGL 3.2 or later implementation determines
    whether or not GLX_ARB_create_context_profile is required.

Overview

    With the advent of new versions of OpenGL which deprecate features
    and/or break backward compatibility with older versions, there is a
    need and desire to indicate at context creation which interface will
    be used. These extensions add a new context creation routine with
    attributes specifying the GL version and context properties
    requested for the context, and additionally add an attribute
    specifying the GL profile requested for a context of OpenGL 3.2 or
    later. It also allows making an OpenGL 3.0 or later context current
    without providing a default framebuffer.

New Procedures and Functions

    GLXContext glXCreateContextAttribsARB(
                    Display *dpy, GLXFBConfig config,
                    GLXContext share_context, Bool direct,
                    const int *attrib_list);

New Tokens

    Accepted as an attribute name in <*attrib_list>:

        GLX_CONTEXT_MAJOR_VERSION_ARB           0x2091
        GLX_CONTEXT_MINOR_VERSION_ARB           0x2092
        GLX_CONTEXT_FLAGS_ARB                   0x2094
        GLX_CONTEXT_PROFILE_MASK_ARB            0x9126

    Accepted as bits in the attribute value for GLX_CONTEXT_FLAGS_ARB in
    <*attrib_list>:

        GLX_CONTEXT_DEBUG_BIT_ARB               0x0001
        GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB  0x0002

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

        GLX_CONTEXT_CORE_PROFILE_BIT_ARB        0x00000001
        GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002

Additions to the OpenGL / WGL Specifications

    None. This specification is written for GLX.

Additions to the GLX 1.4 Specification

    Replace the initial six paragraphs of section 3.3.7 "Rendering
    Contexts", describing glXCreateNewContext, with:

   "To create an OpenGL rendering context, call

        GLXContext glXCreateContextAttribsARB(
                        Display *dpy,
                        GLXFBConfig config,
                        GLXContext share_context,
                        Bool direct,
                        const int *attrib_list);

    If glXCreateContextAttribsARB succeeds, it initializes the context
    to the initial state defined by the OpenGL specification, and
    returns a handle to it. This handle can be used to render to any GLX
    surface (window, pixmap, or pbuffer) compatible with <config>,
    subject to constraints imposed by the OpenGL API version of the
    context.

    If <share_context> is not NULL, then all shareable data (excluding
    OpenGL texture objects named 0) will be shared by <share_context>,
    all other contexts <share_context> already shares with, and the
    newly created context. An arbitrary number of GLXContexts can share
    data in this fashion. The server context state for all sharing
    contexts must exist in a single address space.

    Direct rendering is requested if <direct> is True, and indirect
    rendering if <direct> is False. If <direct> is True, the
    implementation may nonetheless create an indirect rendering context
    if any of the following conditions hold:

      * The implementation does not support direct rendering.
      * <display> is not a local X server.
      * Implementation-dependent limits on the number of direct
        rendering contexts that can be supported simultaneously are
        exceeded.

    Use glXIsDirect (see below) to determine whether or not a request
    for a direct rendering context succeeded.

    <attrib_list> specifies a list of attributes for the context. The
    list consists of a sequence of <name,value> pairs terminated by the
    value None (0). If an attribute is not specified in <attrib_list>,
    then the default value specified below is used instead.

    <attrib_list> may be NULL or empty (first attribute is None), in
    which case all attributes assume their default values as described
    below.

    The attribute names GLX_CONTEXT_MAJOR_VERSION_ARB and
    GLX_CONTEXT_MINOR_VERSION_ARB request an OpenGL context supporting
    the specified version of the API. If successful, the context
    returned must be backwards compatible with the context requested.
    Backwards compatibility is determined as follows:

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

      * Any version no less than that requested and no greater than 3.0.
      * Version 3.1, if the GL_ARB_compatibility extension is also
        implemented.
      * The compatibility profile of version 3.2 or greater.

    If version 3.1 is requested, the context returned may implement
    any of the following versions:

      * Version 3.1. The GL_ARB_compatibility extension may or may not
        be implemented, as determined by the implementation.
      * The core profile of version 3.2 or greater.

    If version 3.2 or greater is requested, the context returned may
    implement any of the following versions:

      * The requested profile of the requested version.
      * The requested profile of any later version, so long as no
        features have been removed from that later version and profile.

    Querying the GL_VERSION string with glGetString (or the
    GL_MAJOR_VERSION and GL_MINOR_VERSION values with glGetIntegerv, in
    a 3.0 or later context) will return the actual version supported by
    a context.

    The default values for GLX_CONTEXT_MAJOR_VERSION_ARB and
    GLX_CONTEXT_MINOR_VERSION_ARB are 1 and 0 respectively. In this
    case, implementations will typically return the most recent version
    of OpenGL they support which is backwards compatible with OpenGL 1.0
    (e.g. 3.0, 3.1 + GL_ARB_compatibility, or 3.2 compatibility profile)

    The attribute name GLX_CONTEXT_PROFILE_MASK_ARB requests an OpenGL
    context supporting a specific <profile> of the API. If the
    GLX_CONTEXT_CORE_PROFILE_BIT_ARB bit is set in the attribute value,
    then a context implementing the <core> profile of OpenGL is
    returned. If the GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB bit is
    set, then a context implementing the <compatibility> profile is
    returned. 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.

    Querying the value of GL_CONTEXT_PROFILE_MASK with glGetIntegerv
    will return the profile mask used to create the context. This query
    is only supported in an OpenGL 3.2 or later context.

    The default value for GLX_CONTEXT_PROFILE_MASK_ARB is
    GLX_CONTEXT_CORE_PROFILE_BIT_ARB. All OpenGL 3.2 implementations are
    required to implement the core profile, but implementation of the
    compatibility profile is optional.

    If the core profile is requested, then the context returned cannot
    implement functionality defined only by the compatibility profile.

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

    If the GLX_CONTEXT_DEBUG_BIT_ARB flag bit is set in
    GLX_CONTEXT_FLAGS_ARB, then a <debug context> will be created. Debug
    contexts are intended for use during application development, and
    provide additional runtime checking, validation, and logging
    functionality while possibly incurring performance penalties. The
    additional functionality provided by debug contexts may vary
    according to the implementation(fn). In some cases a debug context
    may be identical to a non-debug context.
        [fn: The ARB Ecosystem TSG is still defining the expected and
        required features of debug contexts.]

    If the GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB is set in
    GLX_CONTEXT_FLAGS_ARB, then a <forward-compatible> context will be
    created. Forward-compatible contexts are defined only for OpenGL
    versions 3.0 and later. They must not support functionality marked
    as <deprecated> by that version of the API, while a
    non-forward-compatible context must support all functionality in
    that version, deprecated or not.

    The default value of GLX_CONTEXT_FLAGS_ARB is 0.

    The attribute name GLX_RENDER_TYPE specifies the type of rendering
    to be supported by the context. RGBA rendering is supported if the
    attribute value is GLX_RGBA_TYPE, and color index rendering is
    supported if the attribute value is GLX_COLOR_INDEX_TYPE. The
    default value of GLX_RENDER_TYPE is GLX_RGBA_TYPE. OpenGL contexts
    supporting version 3.0 or later of the API do not support color
    index rendering, even if a color index <config> is available.

    On failure glXCreateContextAttribsARB returns NULL and generates an
    X error with extended error information. Conditions that cause
    failure include:

      * If the server context state for <share_context> exists in an
        address space that cannot be shared with the newly created
        context, if <share_context> was created on a different screen
        than the one referenced by <config>, or if the contexts are
        otherwise incompatible (for example, one context being
        associated with a hardware device driver and the other with a
        software renderer), BadMatch is generated.

      * If the server does not have enough resources to allocate the new
        context, BadAlloc is generated.

      * If <share_context> is neither zero nor a valid GLX rendering
        context, GLXBadContext is generated.

      * If <config> is not a valid GLXFBConfig, GLXBadFBConfig is
        generated.

      * If attribute GLX_RENDER_TYPE does not describe a valid rendering
        type, BadValue is generated.

      * If attributes GLX_CONTEXT_MAJOR_VERSION_ARB and
        GLX_CONTEXT_MINOR_VERSION_ARB, when considered together with
        attributes GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB and
        GLX_RENDER_TYPE, specify an OpenGL version and feature set that
        are not defined, BadMatch is generated.

        The defined versions of OpenGL at the time of writing are OpenGL
        1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 2.0, 2.1, 3.0, 3.1, and 3.2.
        Feature deprecation was introduced with OpenGL 3.0, so
        forward-compatible contexts may only be requested for OpenGL 3.0
        and above. Thus, examples of invalid combinations of attributes
        include:

          - Major version < 1 or > 3
          - Major version == 1 and minor version < 0 or > 5
          - Major version == 2 and minor version < 0 or > 1
          - Major version == 3 and minor version > 2
          - Forward-compatible flag set and major version < 3
          - Color index rendering and major version >= 3

        Because the purpose of forward-compatible contexts is to allow
        application development on a specific OpenGL version with the
        knowledge that the app will run on a future version, context
        creation will fail if GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB is
        set and the context version returned cannot implement exactly
        the requested version.

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

      * If <config> does not support compatible OpenGL contexts
        providing the requested API major and minor version,
        forward-compatible flag, and debug context flag, GLXBadFBConfig
        is generated.

      * If an attribute or attribute value in <attrib_list>
        is not recognized (including unrecognized bits in bitmask
        attributes), BadValue is generated.

    3.3.7.1 Legacy Context Creation
    -------------------------------

    To create an OpenGL rendering context of version 2.1 or below, call

        GLXContext glXCreateNewContext(
                        Display *dpy,
                        GLXFBConfig config,
                        int render_type,
                        GLXContext share_list,
                        Bool direct);

    Calling glXCreateNewContext is equivalent to the command sequence

        int attrib_list[] = {
            GLX_RENDER_TYPE, render_type,
            None
        };

        glXCreateContextAttribs(dpy, config, share_list, direct, attrib_list);

    The legacy context creation routines can only return OpenGL 3.1
    contexts if the GL_ARB_compatibility extension is supported, and can
    only return OpenGL 3.2 or greater contexts implementing the
    compatibility profile. This ensures compatibility for existing
    applications. However, 3.0-aware applications are encouraged to use
    wglCreateContextAttribsARB instead of the legacy routines.

    To determine if an OpenGL rendering context is direct, call..."


    In the description of glXMakeContextCurrent, replace the text

   "If either <draw> or <read> are not a valid GLX drawable, a
    GLXBadDrawable error is generated."

    with

   "If either <draw> or <read> are not a valid GLX drawable, a
    GLXBadDrawable error is generated, unless <draw> and <read> are both
    None and the OpenGL version supported by <ctx> is 3.0 or greater. In
    this case the context is made current without a default framebuffer,
    as defined in chapter 4 of the OpenGL 3.0 Specification."

    Replace the text

   "To release the current context without assigning a new one, set
    <ctx> to NULL and set <draw> and <read> to None. If <ctx> is NULL
    and <draw> and <read> are not None, or if <draw> or <read> are set
    to None and <ctx> is not NULL, then a BadMatch error will be
    generated."

    with

   "To release the current context without assigning a new one, set
    <ctx> to NULL and set <draw> and <read> to None. A BadMatch
    error will be generated under any of the following conditions:

      * <ctx> is NULL, and either or both of <draw> and <read> are not
        None.
      * <ctx> is not NULL, and exactly one of <draw> or <read> is None.
      * <ctx> is not NULL, both <draw> or <read> are None, and the
        OpenGL version supported by <ctx> is less than 3.0."

    After the sentence

   "The first time <ctx> is made current, the viewport and scissor
    dimensions are set to the size of the draw drawable (as though
    glViewport(0,0,w,h) and glScissor(0,0,w,h) were called, where <w>
    and <h> are the width and height of the drawable, respectively)."

    insert

   "If the first time <ctx> is made current, it is without a default
    framebuffer (e.g. both <draw> and <read> are None), then the
    viewport and scissor regions are set as though glViewport(0,0,0,0)
    and glScissor(0,0,0,0) were called."

GLX Errors

    GLXBadProfileARB

    The requested context profile is invalid or not supported.

    BEC is the base error code for the extension, as returned by
    XQueryExtension.

    Encoding:

        1      0                      Error
        1      BEC + 13               Error code (GLXBadProfileARB)
        2      CARD16                 sequence number
        4      CARD32                 bad profile bitmask
        2      CARD16                 minor opcode
        1      CARD8                  major opcode
        21                            unused

GLX Protocol

    Three new GLX protocol commands are added.

    Send Extended Client Information To The Server (glXSetClientInfoARB
    and glXSetClientInfo2ARB)
    ----------------------------------------------

    This request is sent to the server during initialization, describing
    the GLX version, GLX extensions, GL version(s), and GL extensions
    supported by the client. The client needs to send only names of GL
    extensions that require server support, but must send all GLX
    extension names.

    When the server receives a GetString request, it uses this
    information to compute the version and extensions that can be
    supported on the connection. The GLX client library should append
    any client-side only extensions to the extension string returned by
    the GetString request. When the server receives a
    glXCreateContextAttribsARB request, it uses this information to
    determine whether the requested context version, attributes, and
    flags can be supported on the connection.

    glXSetClientInfo2ARB supersedes glXSetClientInfoARB, which in turn
    supersedes the glXClientInfo request.  The client should only send
    glXSetClientInfo2ARB if both GLX_ARB_create_context and
    GLX_ARB_create_context_profile are present in the server's extension
    string.  If only GLX_ARB_create_context is present, the client
    should send glXSetClientInfoARB, and if neither are present
    glXClientInfo should be sent. If none of these requests are ever
    sent to the server, the server assumes the client supports OpenGL
    major version 1 and minor version 0, GLX major version 1, and minor
    version 0, and doesn't support any OpenGL or GLX extensions.

    glXSetClientInfo2ARB Encoding:

        1      CARD8                 opcode (X assigned)
        1      35                    GLX opcode (glXSetClientInfoARB)
        2      6+(n0*3)+((n1+p1)/4)+((n2+p2)/4)    request length
        4      CARD32                client GLX major version
        4      CARD32                client GLX minor version
        4      n0                    number of context versions
        4      n1                    number of bytes in extension_string
        4      n2                    number of bytes in glx_extension_string
        n0*3*4 LISTofCARD32          context versions
        n1     STRING8               client GL extension string
        p1                           unused, p1 = pad(n1)
        n2     STRING8               client GLX extension string
        p2                           unused, p2 = pad(n2)

    glXSetClientInfoARB Encoding:

        1      CARD8                 opcode (X assigned)
        1      33                    GLX opcode (glXSetClientInfoARB)
        2      6+(n0*2)+((n1+p1)/4)+((n2+p2)/4)    request length
        4      CARD32                client GLX major version
        4      CARD32                client GLX minor version
        4      n0                    number of context versions
        4      n1                    number of bytes in extension_string
        4      n2                    number of bytes in glx_extension_string
        n0*2*4 LISTofCARD32          context versions
        n1     STRING8               client GL extension string
        p1                           unused, p1 = pad(n1)
        n2     STRING8               client GLX extension string
        p2                           unused, p2 = pad(n2)

    "Context versions" is a list of (major version, minor version,
    [profile mask]) tuple; each tuple describes a GL version supported
    by the client.  The profile mask member is only sent when using
    glXSetClientInfo2ARB and is ignored for versions less than 3.2.
    Only the highest supported version below 3.0 should be sent, since
    OpenGL 2.1 is backwards compatible with all earlier versions.  For
    example, a context versions array containing

        { 2, 1, 0x0, 3, 0, 0x0, 3, 1, 0x0, 3, 2, 0x3 }

    Means that the client supports all GL versions between 1.0 and 2.1,
    as well as versions 3.0, 3.1, and 3.2.  Version 3.2 core and
    compatibility profiles are supported.  A BadValue error will be
    generated if the client sends a 3.2 or greater version tuple with a
    profile mask of 0, or with a profile mask that does not include the
    core profile.

    If glXSetClientInfo2ARB or glXSetClientInfoARB are not sent by the
    client prior to context creation the server will behave as if no
    contexts above version 2.1 are supported, and assume the client
    supports all GLX extensions.  If the client sends
    glXSetClientInfoARB and the server supports
    GLX_ARB_create_context_profile, the server will behave as if no
    contexts above version 3.1 are supported.


    Context Creation with Attributes (glXCreateContextAttribsARB)
    --------------------------------

    This request is sent to create a context with specified attributes

        1     CARD8                  opcode (X assigned)
        1     34                     GLX opcode (glXCreateContextAttribsARB)
        2     7+n                    request length
        4     GLX_CONTEXT            context
        4     FBCONFIGID             fbconfig
        4     CARD32                 screen
        4     GLX_CONTEXT            share_context
        1     BOOL                   isdirect
        1     CARD8                  reserved1
        2     CARD16                 reserved2
        4     CARD32                 num_attribs
        4*n   LISTofATTRIBUTE_PAIR   attribute, value pairs

Errors

    GLX errors for glXCreateContextAttribsARB and glXSetClientInfo2ARB
    as described in the body of the specification.

    glXMakeContextCurrent error behavior is relaxed to allow making an
    OpenGL 3.0 or later context current without a default read or draw
    framebuffer.

Dependencies on GLX_ARB_create_context

    If GLX_ARB_create_context_profile is supported, then
    GLX_ARB_create_context must also be supported.

Dependencies on OpenGL 3.2 and later OpenGL versions

    If GLX_ARB_create_context is supported, and if the OpenGL
    implementation supports OpenGL 3.2 or later, then
    GLX_ARB_create_context_profile must also be supported. If the OpenGL
    implementation does not support OpenGL 3.2 or later, then
    GLX_ARB_create_context_profile may or may not be supported.

    If GLX_ARB_create_context_profile is not supported, then the
    GLX_CONTEXT_PROFILE_MASK_ARB attribute, the
    GLX_CONTEXT_CORE_PROFILE_BIT_ARB and
    GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB bits in that attribute,
    and the ERROR_INVALID_PROFILE_ARB error are not defined, and
    specifying the attribute in <attribList> attribute will generate
    BadValue.

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_ARB_create_context extension specification apply equally to
    GLX_ARB_create_context.

 1) Why was the context creation parameter <render_type> folded into the
    attribute list, while the parameters <direct> and <share_context>
    remains explicit?

    For <direct>, because different paths to the server may be taken for
    creating direct contexts, and parsing the attribute list in the
    client should not be required. For <share_context>, because putting
    a GLXContext, which is implemented as a struct pointer, into a list
    of 'int's does not work on LP64 architectures.

 2) What is the behavior when creating an indirect rendering context
    with attributes, flags, or a GLXFBConfig that require extensions not
    supported by the client GLX implementation?

    Context creation will succeed, but using such features may be
    impossible, since there may be no entry points defined in the client
    library to control them.

 3) Does client support for profiles need to be sent to the server
    along with client support for versions?

    Yes.  glXSetClientInfo2ARB extends glXSetClientInfoARB to support
    sending supported profile masks for each supported version.

Revision History

    Version 1, 2008/08/20 - Fork from WGL_ARB_create_context

    Version 2, 2008/08/21 - Add viewport/scissor setting behavior when
    no default framebuffer is made current.

    Version 3, 2008/10/08 - Restore <direct> as an explicit parameter
    instead of an attribute. Allow creating indirect contexts requiring
    extensions not supported by the client. Add GLX protocol. Use
    existing GLX_RENDER_TYPE token. Rename some parameters following
    existing conventions. Update Errors section.

    Version 4, 2008/10/13 - Move "undefined behavior when successfully
    creating a context requiring extensions not supported by the client"
    language from the spec into the issues list. Remove unused
    GLX_DIRECT_RENDERER_ARB token. Expand description of
    glXSetClientInfoARB protocol negotiation.

    Version 5, 2008/10/22 - Mark as complete and assign extension number
    for the registry.

    Version 6, 2008/10/24 - Renumber to ARB extension #55 - misplaced
    into vendor extension numbering scheme at first.

    Version 7, 2009/07/27 - Add profiled context creation functionality
    (GLX_CONTEXT_PROFILE_MASK_ARB and the associated bit tokens).
    Clarify that if the core profile is requested, the returned context
    cannot restore functionality from the compatibility profile (issue
    17 in WGL_ARB_create_context). Specify the interdependencies between
    the two GLX extensions defined here and OpenGL 3.2, including the
    requirement that GLX_ARB_create_context_profile be supported if an
    OpenGL 3.2 or later implementation is supported. Add issue 3 on
    sending profile support to the server.

    Version 8, 2009/08/30 - Add glXSetClientInfo2ARB to support sending
    profile masks with the versions as well.  Specify which error is
    generated in the case profile tokens are used with a server that
    doesn't support them.  Replace ERROR_INVALID_PROFILE_ARB with
    GLXBadProfileARB and define its encoding.

    Version 9, 2009/11/19 - Clarify that BEC in the BadProfile protocol
    represents the base error code for the GLX extension.

    Version 10, 2012/03/28 - Clarify error conditions when
    glXMakeContextCurrent is called with a valid context and exactly one
    None drawable.
