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

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

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.
