Name

    ARB_create_context_robustness

Name Strings

    GLX_ARB_create_context_robustness

Contact

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

Notice

    Copyright (c) 2010-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

Status

    Complete. Approved by the ARB on June 9, 2010.
    Approved by the Khronos Board of Promoters on July 23, 2010.

Version

    Version 3, 2010/07/22

Number

    ARB Extension #101

Dependencies

    GLX 1.4 is required.

    GLX_ARB_create_context is required.

    An OpenGL implementation supporting GL_ARB_robustness is required.

Overview

    This extension allows creating an OpenGL context supporting robust
    buffer access behavior and a specified graphics reset notification
    behavior.

IP Status

    No known IP claims.

New Procedures and Functions

    None

New Tokens

    Accepted as a bit in the attribute value for GLX_CONTEXT_FLAGS_ARB
    in the <*attrib_list> argument to glXCreateContextAttribsARB:

        GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB       0x00000004

    Accepted as an attribute name in the <*attrib_list> argument to
    glXCreateContextAttribsARB:

        GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB     0x8256

    Accepted as an attribute value for
    GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB in the <*attrib_list>
    argument to glXCreateContextAttribsARB:

        GLX_NO_RESET_NOTIFICATION_ARB                   0x8261
        GLX_LOSE_CONTEXT_ON_RESET_ARB                   0x8252

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, insert a new
    paragraph before the paragraph "The default value of
    GLX_CONTEXT_FLAGS_ARB is 0.":

   "If the GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB bit is set in
    GLX_CONTEXT_FLAGS_ARB, then a context supporting <robust buffer
    access> will be created. Robust buffer access is defined in the
    GL_ARB_robustness extension specification, and the resulting context
    must also support either the GL_ARB_robustness extension, or a
    version of OpenGL incorporating equivalent functionality."

    Add a new paragraph to the description of
    glXCreateContextAttribsARB:

   "The attribute name GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB
    specifies the <reset notification behavior> of the rendering
    context. Reset notification behavior is defined in the
    GL_ARB_robustness extension specification, and the resulting context
    must also support either the GL_ARB_robustness extension, or a
    version of OpenGL incorporating equivalent functionality. The
    attribute value may be either GLX_NO_RESET_NOTIFICATION_ARB or
    GLX_LOSE_CONTEXT_ON_RESET_ARB, which respectively result in reset
    notification behavior of GL_NO_RESET_NOTIFICATION_ARB and
    GL_LOSE_CONTEXT_ON_RESET_ARB, as described by GL_ARB_robustness. The
    default value for GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB is
    GLX_NO_RESET_NOTIFICATION_ARB."

    Add "robust buffer access flag" and "reset notification behavior" to
    the list of possible context creation errors resulting in a
    GLXBadFBConfig error in this sentence:

   "* 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."

    Add a new context creation error to glXCreateContextAttribsARB:

   "* If the reset notification behavior of <share_context> and the
    newly created context are different, BadMatch is generated."

GLX Errors

    None

GLX Protocol

    None

Errors

    GLXBadFBConfig is generated if GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB is
    set in attribute GLX_CONTEXT_FLAGS_ARB, and no GL context supporting
    the GL_ARB_robustness extension with robust buffer access enabled
    can be created.

    GLXBadFBConfig is generated if no GL context supporting the
    GL_ARB_robustness extension with the specified reset notification
    behavior (the value of attribute
    GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB) can be created.

    BadMatch is generated if the reset notification behavior of
    <share_context> does not match the reset notification behavior of
    the context being created.

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_robustness extension specification apply
    equally to this extension.

Revision History

    Version 3, 2010/07/22 - Assign enums for new tokens (shared with WGL and
    GL robustness extensions).

    Version 2, 2010/07/21 - Move reset notification behavior from a GL
    toggle to a context creation parameter. Disallow sharing contexts
    with different reset notification behaviors. Rename extension, since
    it's no longer only about robust buffer access.

    Version 1, 2010/06/06 - Initial version.
