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

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