Name

    WGL_ARB_robustness_isolation

Name Strings

    WGL_ARB_robustness_application_isolation
    WGL_ARB_robustness_share_group_isolation

Contributors

    Tim Johansson, Opera (timj 'at' opera.com)
    Bill Licea-Kane (bill.licea-kane 'at' amd.com)
    <TBD>

Contact

    Kenneth Russell, Google (kbr 'at' google.com)

Notice

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

Status

    Complete.
    Approved by the ARB on 2012/06/12.

Version

    Last Modified Date:  August 13, 2012
    Version:             5

Number

    ARB Extension #143

Dependencies

    WGL_ARB_extensions_string is required.

    WGL_ARB_create_context_robustness is required.

Overview

    GL_ARB_robustness and WGL_ARB_create_context_robustness allow
    creating an OpenGL context supporting graphics reset notification
    behavior.  WGL_ARB_robustness_application_isolation and
    WGL_ARB_robustness_share_group_isolation provide stronger
    guarantees about the possible side-effects of a graphics reset.

IP Status

    No known IP claims.

New Procedures and Functions

    None.

New Types

    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_RESET_ISOLATION_BIT_ARB             0x00000008    

Additions to the OpenGL / AGL / GLX Protocol Specificaitons

    None. This specification is written for WGL.

Additions to the WGL specification

    Add the following new paragraphs to the description of
    wglCreateContextAttribsARB, after that added by
    WGL_ARB_create_context_robustness:

    "If the application creates all of its OpenGL contexts with the
    WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB attribute set to
    WGL_LOSE_CONTEXT_ON_RESET_ARB, and the
    WGL_CONTEXT_RESET_ISOLATION_BIT_ARB bit set, then:

      If the graphics driver advertises the
      WGL_ARB_robustness_application_isolation extension string, then
      the driver guarantees that if a particular application causes a
      graphics reset to occur:

      1. No other application on the system is affected by the
         graphics reset.

      2. No other application on the system receives any notification
         that the graphics reset occurred.
    
      If the graphics driver advertises the
      WGL_ARB_robustness_share_group_isolation extension string, then
      the driver guarantees that if a context in a particular share
      group causes a graphics reset to occur:

      1. No other share group within the application is affected by
         the graphics reset. Additionally, no other application on the
         system is affected by the graphics reset.

      2. No other share group within the application receives any
         notification that the graphics reset occurred. Additionally,
         no other application on the system receives any notification
         that the graphics reset occurred.

    The WGL_ARB_robustness_application_isolation and
    WGL_ARB_robustness_share_group_isolation extensions do not provide
    guarantees for graphics resets caused by applications which did
    not create their contexts with both the LOSE_CONTEXT_ON_RESET_ARB
    reset notification strategy and the
    WGL_CONTEXT_RESET_ISOLATION_BIT_ARB bit."

    Add a new context creation error to wglCreateContextAttribsARB:

   "* If the reset isolation bits 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 isolation bit 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_RESET_ISOLATION_BIT_ARB is set in attribute
    WGL_CONTEXT_FLAGS_ARB, and no GL context supporting the
    GL_ARB_robustness_isolation extension with either application or
    share group isolation exists.

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

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

New State

    None

New Implementation Dependent State

    None

Conformance Tests

    TBD

Sample Code

    TBD

Issues

    1) Do GPU vendors all agree that the share_group_isolation variant
       is supportable? If so, we could drop the application_isolation
       variant, which would simplify the spec.

    2) How will these extension strings be handled and exposed on EGL
       and Mac OS?

Revision History

    Rev.    Date       Author     Changes
    ----  ------------ ---------  ----------------------------------------
      1   18 Apr 2011  kbr        Initial version
      2   28 Apr 2011  kbr        Renamed context_isolation to share_group_isolation
      3   08 Jun 2011  kbr        Made guarantees conditional on using LOSE_CONTEXT_ON_RESET_ARB
      4   17 Aug 2011  kbr        Renamed file to WGL_ARB_robustness_isolation
      5   24 Apr 2012  kbr        Added GLX_CONTEXT_RESET_ISOLATION_BIT_ARB on feedback from Bill Licea-Kane
      6   13 Aug 2012  Jon Leech  Renumbered from #146 to #143
