Name

    ARB_create_context_no_error

Name Strings

    WGL_ARB_create_context_no_error
    GLX_ARB_create_context_no_error

Contact

    Piers Daniell (pdaniell 'at' nvidia.com)

Contributors

    Piers Daniell, NVIDIA
    Daniel Koch, NVIDIA

Notice

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

Status

    Complete. Approved by the OpenGL working group on March 31, 2017.
    Approved by the Khronos Board of Promoters on May 26, 2017.

Version

    Last Modified Date:         2017-03-10
    Author Revision:            2

Number

    ARB Extension #191

Dependencies

    WGL_ARB_create_context_no_error is written against the
    WGL_ARB_create_context specification, which is required.

    GLX_ARB_create_context_no_error is written against the GLX 1.4 and
    GLX_ARB_create_context specifications. Both are required.

Overview

    This extension allows the creation of an OpenGL or OpenGL ES context that
    doesn't generate errors if the context supports a no error mode.  The
    implications of this feature are discussed in the GL_KHR_no_error
    extension.

New Procedures and Functions

    None

New Tokens (WGL)

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

        WGL_CONTEXT_OPENGL_NO_ERROR_ARB                     0x31B3

New Tokens (GLX)

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

        GLX_CONTEXT_OPENGL_NO_ERROR_ARB                     0x31B3

Additions to WGL_ARB_create_context and wglMakeCurrent

    Add a new paragraph to the description of wglCreateContextAttribsARB, as
    defined by WGL_ARB_create_context:

    "The attribute name WGL_CONTEXT_OPENGL_NO_ERROR_ARB indicates whether a
    faster and lower power mode should be enabled for the OpenGL or OpenGL ES
    context.  In this mode instead of GL errors occurring as defined in the
    OpenGL spec those errors will result in undefined behavior.  The default
    value of WGL_CONTEXT_OPENGL_NO_ERROR_ARB is FALSE."

Additions to the GLX 1.4 Specification and GLX_ARB_create_context

    Add a new paragraph to the description of glXCreateContextAttribsARB,
    as defined by GLX_ARB_create_context:

    "The attribute name GLX_CONTEXT_OPENGL_NO_ERROR_ARB indicates whether a
    faster and lower power mode should be enabled for the OpenGL or OpenGL ES
    context.  In this mode instead of GL errors occurring as defined in the
    OpenGL spec those errors will result in undefined behavior.  The default
    value of WGL_CONTEXT_OPENGL_NO_ERROR_ARB is FALSE."

GLX Protocol

    TBD.

Errors for WGL
    
    ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB is generated if the value of
    WGL_CONTEXT_OPENGL_NO_ERROR_ARB used to create <share_context> does not
    match the value of WGL_CONTEXT_OPENGL_NO_ERROR_ARB for the context being
    created.

    ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB is generated if the
    WGL_CONTEXT_OPENGL_NO_ERROR_ARB is TRUE at the same time as a debug or
    robustness context is specified.
    
Errors for GLX

    BadMatch is generated if the value of GLX_CONTEXT_OPENGL_NO_ERROR_ARB
    used to create <share_context> does not match the value of
    GLX_CONTEXT_OPENGL_NO_ERROR_ARB for the context being created.

    BadMatch is generated if the GLX_CONTEXT_OPENGL_NO_ERROR_ARB is TRUE at
    the same time as a debug or robustness context is specified.

New State

    None.

Issues

    None

Revision History

 Rev.   Date      Author    Changes
 ---- ----------  --------  ---------------------------------------------
   1  2017-03-02  pdaniell  Initial draft
   2  2017-03-10  pdaniell  Added errors
   3  2017-03-27  pdaniell  Removed example section and added enum values
