Name

    WGL_ARB_create_context_robustness

Name Strings

    WGL_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

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 #102

Dependencies

    WGL_ARB_extensions_string is required.

    WGL_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 WGL_CONTEXT_FLAGS_ARB
    in the <*attrib_list> argument to wglCreateContextAttribsARB:

        WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB       0x00000004

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

        WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB     0x8256

    Accepted as an attribute value for
    WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB in the <*attrib_list>
    argument to wglCreateContextAttribsARB:

        WGL_NO_RESET_NOTIFICATION_ARB                   0x8261
        WGL_LOSE_CONTEXT_ON_RESET_ARB                   0x8252

Additions to the OpenGL / GLX / GLX Protocol Specificaitons

    None. This specification is written for WGL.

Additions to the WGL specification

    This extension modifies language specified in the
    WGL_ARB_create_context and WGL_ARB_create_context_profile
    extensions.

    In the description of wglCreateContextAttribsARB, insert a new
    paragraph before the paragraph "The default value of
    WGL_CONTEXT_FLAGS_ARB is 0.":

   "If the WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB bit is set in
    WGL_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
    wglCreateContextAttribsARB:

   "The attribute name WGL_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 WGL_NO_RESET_NOTIFICATION_ARB or
    WGL_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 WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB is
    WGL_NO_RESET_NOTIFICATION_ARB."

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

   "* If the pixel format associated with <hDC> does not support OpenGL
    contexts providing the requested API major and minor version,
    forward-compatible flag, and/or debug context flag, then
    ERROR_INVALID_PIXEL_FORMAT is generated."

    Add a new context creation error to wglCreateContextAttribsARB:

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

    Add to the description of wglShareLists:

   "If the reset notification behavior of <hglrc1> and <hglrc2> are
    different, then wglShareLists will return FALSE, and GetLastError
    will return ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB."

Dependencies on WGL_ARB_extensions_string

    Because there is no way to extend WGL, these calls are defined in
    the ICD and can be called by obtaining the address with
    wglGetProcAddress. Because this extension is a WGL extension, it is
    not included in the GL_EXTENSIONS string. Its existence can be
    determined with the WGL_ARB_extensions_string extension.

Errors

    ERROR_INVALID_PIXEL_FORMAT is generated if
    WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB is set in attribute
    WGL_CONTEXT_FLAGS_ARB, and no GL context supporting the
    GL_ARB_robustness extension with robust buffer access enabled
    exists.

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

    ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB is generated by
    wglCreateContextAttribsARB if the reset notification behavior of
    <hShareContext> does not match the reset notification behavior of
    the context being created.

    ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB is generated by wglShareLists
    if the reset notification behavior of <hglrc1> and <hglrc2> are
    different.

New State

    None

New Implementation Dependent State

   None

Conformance Tests

    TBD

Sample Code

    TBD

Issues

 1) Should there be a discovery mechanism for GL contexts supported by
    the implementation?

    UNRESOLVED. As we add more and more versions, profiles, and context
    flags, the number of possible types of contexts is growing rapidly.
    Some discovery mechanism may be useful, but simply enumerating all
    the possible contexts is probably impractica.

 2) How can applications query if a context supports robust buffer
    access?

    UNRESOLVED. See the matching issue in GL_ARB_robustness.

Revision History

    Version 3, 2010/07/22 - Assign enums for new tokens (shared with GLX 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.
