Name

    KHR_context_flush_control

Name Strings

    GL_KHR_context_flush_control
    EGL_KHR_context_flush_control
    GLX_ARB_context_flush_control
    WGL_ARB_context_flush_control

Contact

    Graham Sellers (graham.sellers 'at' amd.com)

Contributors

    Graham Sellers, AMD
    Jon Leech

Notice

    Copyright (c) 2014 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 and OpenGL ES Working Groups. 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 26, 2014.
    Approved by the OpenGL ES Working Group on August 6, 2014.
    Ratified by the Khronos Board of Promoters on August 7, 2014 (non-EGL
    extensions, and on September 26, 2014 (EGL extension).

Version

    Last Modified Date:         9/28/2016
    Author Revision:            8

Number

    ARB Extension #168
    OpenGL ES Extension #191 (for GL_KHR_context_flush_control only)
    EGL Extension #102 (for EGL_KHR_context_flush_control only)

Dependencies

    GL_KHR_context_flush_control is written against the OpenGL 4.4 (Core
    Profile) specification, but can be implemented against any version of
    OpenGL or OpenGL ES.

    EGL_KHR_context_flush_control is written against the EGL 1.5
    Specification, but can be implemented against any version of EGL.

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

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

Overview

    OpenGL and OpenGL ES have long supported multiple contexts. The
    semantics of switching contexts is generally left to window system
    binding APIs such as WGL, GLX and EGL. Most of these APIs (if not all)
    specify that when the current context for a thread is changed, the
    outgoing context performs an implicit flush of any commands that have
    been issued to that point. OpenGL and OpenGL ES define a flush as
    sending any pending commands for execution and that this action will
    result in their completion in finite time.

    This behavior has subtle consequences. For example, if an application is
    rendering to the front buffer and switches contexts, it may assume that
    any rendering performed thus far will eventually be visible to the user.
    With recent introduction of shared memory buffers, there become inumerable
    ways in which applications may observe side effects of an implicit flush
    (or lack thereof).

    In general, a full flush is not the desired behavior of the application.
    Nonetheless, applications that switch contexts frequently suffer the
    performance consequences of this unless implementations make special
    considerations for them, which is generally untenable.

    The EGL, GLX, and WGL extensions add new context creation parameters
    that allow an application to specify the behavior that is desired when a
    context is made non-current, and specifically to opt out of the implicit
    flush behavior. The GL extension allows querying the context flush
    behavior.

New Procedures and Functions

    None.

New Tokens (GL)

    NOTE: when implemented in an OpenGL ES context, all tokens defined by
    this extension must have a "_KHR" suffix. When implemented in an OpenGL
    context, all tokens must have NO suffix, as described below.

    Accepted by the <pname> parameter of GetIntegerv, GetFloatv, GetBooleanv
    GetDoublev and GetInteger64v:

        GL_CONTEXT_RELEASE_BEHAVIOR                         0x82FB

    Returned in <data> by GetIntegerv, GetFloatv, GetBooleanv
    GetDoublev and GetInteger64v when <pname> is
    GL_CONTEXT_RELEASE_BEHAVIOR:

        GL_NONE                                             0x0000
        GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH                   0x82FC

New Tokens (EGL)

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

        EGL_CONTEXT_RELEASE_BEHAVIOR_KHR                    0x2097

    Accepted as an attribute value for EGL_CONTEXT_RELEASE_BEHAVIOR_KHR in
    the <*attrib_list> argument to eglCreateContext:

        EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR               0x0000
        EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR              0x2098

New Tokens (GLX)

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

        GLX_CONTEXT_RELEASE_BEHAVIOR_ARB                    0x2097

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

        GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB               0x0000
        GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB              0x2098

New Tokens (WGL)

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

        WGL_CONTEXT_RELEASE_BEHAVIOR_ARB                    0x2097

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

        WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB               0x0000
        WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB              0x2098

Additions to Chapter 22 of the OpenGL 4.4 Core Pofile Specification (Context
State Queries)

    In Subsection 22.2, "String Queries", after the description of
    CONTEXT_FLAGS, insert the following:

    The behavior of the context when it is made no longer current (released)
    by the platform binding may be queried by calling GetIntegerv with
    <value> CONTEXT_RELEASE_BEHAVIOR. If the behavior is
    CONTEXT_RELEASE_BEHAVIOR_FLUSH, any pending commands on the context will
    be flushed. If the behavior is NONE, pending commands are not flushed.

    The default value is CONTEXT_RELEASE_BEHAVIOR_FLUSH, and may in some
    cases be changed using platform-specific context creation extensions.


Additions to the EGL 1.5 Specification

    Add a new subsection to the description of eglCreateContext,
    following section 3.7.1.6 "OpenGL and OpenGL ES Reset Notification
    Strategy":

   "3.7.1.7 OpenGL and OpenGL ES Context Flush Behavior

    The attribute name EGL_CONTEXT_RELEASE_BEHAVIOR_KHR specifies the
    behavior of the rendering context when it is made non-current, as
    described in section 3.7.3. The attribute value may be one of
    EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR or
    EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR. The default value is
    EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR."


    Modify section 3.7.3 "Binding Contexts and Drawables", on p. 58:

    Replace the fourth paragraph in the description of eglMakeCurrent,
    starting "If the calling thread already has a current context...":

   "If the calling thread already has a current context of the same
    client API type as <ctx>, behavior is determined as follows:

    The current context is flushed if any of the following conditions
    are true:

    - The client API type of the current context is not OpenGL or OpenGL
      ES;
    - The client API type of the current context is OpenGL or OpenGL ES,
      and the context does not support the GL_KHR_context_flush_control
      extension
    - The client API type of the current context is OpenGL or OpenGL ES,
      the context supports the GL_KHR_context_flush_control extension,
      and the <release behavior> (the value of the
      EGL_CONTEXT_RELEASE_BEHAVIOR_KHR parameter) of the current context
      is EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR.

    The only remaining case is treated differently. In this case, the client
    API type of the current context must be OpenGL or OpenGL ES; the context
    must support the GL_KHR_context_flush_control extension; and the release
    behavior must be EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR. In this case no
    action is taken, and it is as if the application simply stops making GL
    commands on the current context.

    After flushing (if appropriate) is performed, the current context is
    marked as no longer current. <ctx> is then made the current context
    for the calling thread. For purposes of ..."


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_MAKE_NON_CONTEXT_BEHAVIOR_ARB specifies the
    behavior of the rendering context when it is made non-current. The
    attribute value may be one of WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB or
    WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB. The default value of
    WGL_MAKE_NON_CONTEXT_BEHAVIOR_ARB is
    WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB."

    Define flushing behavior for wglMakeCurrent (there is no WGL
    specification; this language replaces the sentence "Before switching to
    the new rendering context, OpenGL flushes any previous rendering context
    that was current to the calling thread." in the Microsoft wglMakeCurrent
    reference page):

    "If the calling thread already has a current rendering context, behavior
    is determined by the <release behavior> (the value of the
    WGL_CONTEXT_RELEASE_BEHAVIOR_ARB parameter) of the current context. If
    the release behavior is WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB, pending
    commands to the previous context are flushed; if the release behavior is
    WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB, then no action is taken, and it
    is as if the application simply stops making GL commands on that
    context. That context is marked as no longer current, and <ctx> is made
    the current context for the calling thread."

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_RELEASE_BEHAVIOR_ARB specifies the
    behavior of the rendering context when it is made non-current. The
    attribute value may be one of GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB or
    GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB. The default value of
    GLX_CONTEXT_RELEASE_BEHAVIOR_ARB is GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB."

    Modify section 3.3.7 "Rendering Contexts" on p. 27:

    Replace the third paragraph in the description of glXMakeContextCurrent,
    starting "If the calling thread already has a current rendering
    context...":

    "If the calling thread already has a current rendering context, behavior
    is determined by the <release behavior> (the value of the
    GLX_CONTEXT_RELEASE_BEHAVIOR_ARB parameter) of the current context. If
    the release behavior is GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB, pending
    commands to the previous context are flushed; if the release behavior is
    GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB, then no action is taken, and it
    is as if the application simply stops making GL commands on that
    context. That context is marked as no longer current, and <ctx> is made
    the current context for the calling thread."


GLX Protocol

    TBD.

Errors

    The errors defined for eglCreateContext, glXCreateContextAttribsARB, and
    wglCreateContextAttribsARB already describe the situations where invalid
    attribute values for the context release behavior are specified, and
    where no context can be created satisfying the specified behavior, so no
    new errors are added.

New State

    None.

New Implementation Dependent State

    Append to Table 23.54, "Implementation Dependent State" of the OpenGL 4.4 Specification:

    +-------------------------------+-------+--------------------+------------------------------------------+------------------------------------+---------+
    | Get Value                     | Type  | Get Command        | Initial Value                            | Description                        | Sec.    |
    +-------------------------------+-------+--------------------+------------------------------------------+------------------------------------+---------+
    | CONTEXT_RELEASE_BEHAVIOR      | E     | GetIntegerv        | See sec. 2.22                            | Specifies flush behavior when      | 22.2    |
    |                               |       |                    |                                          | the context is released.           |         |
    +-------------------------------+-------+--------------------+------------------------------------------+------------------------------------+---------+

Usage Examples

    TBD

Issues

    1) What happens when you switch between contexts that have the new
       CONTEXT_RELEASE_BEHAVIOR_NONE behavior?

       Nothing. It is as if the thread simply stopped calling functions on
       one context and started calling functions on another. If, for
       example, an application is rendering to multiple windows or multiple
       framebuffer objects, it may not care what order commands are executed
       across the contexts. This extension allows the application to rapidly
       switch between contexts that may or may not share objects without any
       implied flushes.

    2) Does this extension affect or change sharing semantics?

       RESOLVED: No. There is no intention to do so. From the client's
       perspective, at least, changes made to objects on one context should
       be visible to other contexts whenever they would have before.
       However, there may be some subtle interaction here that we haven't
       thought of yet.

    3) Do we need to be able to query the context behavior?

       RESOLVED. Yes. Added a state query for GL_CONTEXT_RELEASE_BEHAVIOR.

    4) Should EGL/GLX/WGL/GL enum values for similar tokens be shared?

       RESOLVED: the developing tradition is for window system binding enums
       for context creation to share the same values, but GL to have its own
       values lying in the traditional GL enum ranges.

    5) Should there be a GL extension string corresponding to
       the window system binding extension strings?

       RESOLVED: Yes. This is how we've always done it. Added
       GL_KHR_context_flush_control to Name Strings in revision 3.

    6) Should there be an EGL equivalent of this functionality? Should the
       GL extension be KHR or ARB?

       RESOLVED: Yes, there should be an EGL extension, but it will be
       approved on a different schedule by EGL and GL WGs. The GL extension
       should be KHR, since ES is also interested in this functionality.

    7) When the release behavior of an OpenGL compatibility profile context
       or an OpenGL ES 1.x context is to not flush, should it be possible to
       make a context non-current within a glBegin/glEnd pair?

       RESOLVED: No. Only GLX (not EGL or WGL) specifies this constraint,
       and hypothetical immediate-mode paths would have difficulty
       supporting MakeCurrent between Begin and End whether or not a flush
       is done.


Revision History

 Rev.   Date     Author    Changes
 ---- ---------  --------  ---------------------------------------------
   8  9/28/2016  Jon Leech Merge EGL_KHR_context_flush_control language,
                           which was ratified more than two years ago but
                           which we forgot to post until now.
   7  8/11/2014  Jon Leech Add issue 7, minor wording tweaks to include
                           GL and ES as peer APIs.
   6  8/06/2014  Jon Leech Change GL extension to KHR instead of ARB.
   5  6/26/2014  Jon Leech Remove ARB suffixes from GL tokens (only, Bug
                           12299) and clarify the initial value of the
                           GL flush behavior query.
   4  6/25/2014  Jon Leech Rewrite spec changes to be against the actual
                           GLX/WGL API and extension specification
                           documents, where possible.
   3  6/24/2014  Jon Leech Assign enum values, add issues 4/5.
   2  6/05/2014  gsellers  Add state query for retrieving context behavior.
                           Rename "lose-context" to "context release". This
                           is the terminology in the existing GLX spec. The
                           WGL spec doesn't appear to use a concrete term.
                           Update state table.
                           Renumbered issues to be contiguous.
   1  4/17/2014  gsellers  Initial revision based on earlier extension.
