Name

    KHR_robust_buffer_access_behavior

Name Strings

    GL_KHR_robust_buffer_access_behavior

Contact

    Jon Leech (oddhack 'at' sonic.net)
    Piers Daniell, NVIDIA (pdaniell 'at' nvidia.com)

Contributors

    Jan-Harald Fredriksen, ARM
    Jeff Bolz, NVIDIA
    Kenneth Russell, Google
    Pat Brown, NVIDIA

Notice

    Copyright (c) 2012-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 OpenGL ES Working Group on June 25, 2014.
    Approved by the ARB on June 26, 2014.
    Ratified by the Khronos Board of Promoters on August 7, 2014.

Version

    Version 7, June 26, 2014

Number

    ARB Extension #169
    OpenGL ES Extension #189

Dependencies

    OpenGL ES 2.0 or OpenGL 3.2 are required.

    GL_KHR_robustness is required.
    
    This extension is written against the OpenGL ES 3.1 Specification
    (version of June 4, 2014) and the OpenGL ES 3.10.3 Shading Language
    Specification (version of June 6, 2014)

Overview

    This extension specifies the behavior of out-of-bounds buffer and
    array accesses. This is an improvement over the existing
    KHR_robustness extension which states that the application should
    not crash, but that behavior is otherwise undefined. This extension
    specifies the access protection provided by the GL to ensure that
    out-of-bounds accesses cannot read from or write to data not owned
    by the application. All accesses are contained within the buffer
    object and program area they reference. These additional robustness
    guarantees apply to contexts created with the robust access flag
    set.

IP Status

    No known IP claims.

New Procedures and Functions

    None

New Tokens

    None

Additions to the OpenGL ES 3.1 Specification

    Append to section 6.4 "Effects of Accessing Outside Buffer Bounds" on p.
    58:
    
   "Robust buffer access can be enabled by creating a context with robust
    access enabled through the window system binding APIs. When enabled, any
    command unable to generate a GL error as described above, such as buffer
    object accesses from the active program, will not read or modify memory
    outside of the data store of the buffer object and will not result in GL
    interruption or termination.

    Out-of-bounds reads may return any of the following values:

      * Values from anywhere within the buffer object.
      * Zero values, or (0,0,0,x) vectors for vector reads where x is a
        valid value represented in the type of the vector components and may
        be any of

        + 0, 1, or the maximum representable positive integer value, for
          signed or unsigned integer components
        + 0.0 or 1.0, for floating-point components

    Out-of-bounds writes may modify values within the buffer object or be
    discarded.

    Accesses made through resources attached to binding points are only
    protected within the buffer object from which the binding point is
    declared. For example, for an out-of-bounds access to a member variable
    of a uniform block, the access protection is provided within the uniform
    buffer object, and not for the bound buffer range for this uniform
    block."


    Add a new subsection 10.3.4rob "Robust Buffer Access" preceding section
    10.3.5 "Packed Vertex Data Formats" on p. 243:

   "Robust buffer access can be enabled by creating a context with robust
    access enabled through the window system binding APIs. When enabled,
    indices within the element array (see section 10.3.7) that reference
    vertex data that lies outside the enabled attribute's vertex buffer
    object result in reading zero. It is not possible to read vertex data
    from outside the enabled vertex buffer objects or from another GL
    context, and these accesses do not result in abnormal program
    termination."


    Replace the last paragraph of section 11.1.3.2 "Texel Fetches", on p.
    265:
    
    "In all the above cases, if the context was created with robust buffer
    access enabled (see section 10.3.4rob), the result of the texture fetch
    is zero, or a texture source color of (0,0,0,1) in the case of a texel
    fetch from an incomplete texture. If robust buffer access is not
    enabled, the result of the texture fetch is undefined in each case."


    Replace the last paragraph of section 11.1.3.12 "Undefined Behavior" on
    p. 272:
    
   "Robust buffer access can be enabled by creating a context with
    robust access enabled through the window system binding APIs. When
    enabled, out-of-bounds accesses will be bounded within the working
    memory of the active program, cannot access memory owned by other
    GL contexts, and will not result in abnormal program termination.
    Out-of-bounds access to local and global variables cannot read
    values from other program invocations. An out-of-bounds read may
    return another value from the active program's working memory or
    zero. An out-of-bounds write may overwrite a value from the active
    program's working memory or be discarded.
    
    Out-of-bounds accesses to resources backed by buffer objects cannot read
    or modify data outside of the buffer object. For resources bound to
    buffer ranges, access is restricted within the buffer object from which
    the buffer range was created, and not within the buffer range itself.
    Out-of-bounds reads and writes behave as described in section 6.4.
    
    Out-of-bounds accesses to arrays of resources, such as an array of
    textures, can only access the data of bound resources. Reads from
    unbound resources return zero and writes are discarded. It is not
    possible to access data owned by other GL contexts.

    Applications that require defined behavior for out-of-bounds
    accesses should range check all computed indices before
    dereferencing the array, vector or matrix."


Additions to chapter 5 of the OpenGL ES Shading Language Specification
version 3.10.3

    Add a new section 5.12 "Out-of-Bounds Access and Robust Buffer Access
    Behavior" on p. 84:
    
   "In the sections described above for array, vector, matrix and structure
    accesses, any out-of-bounds access produces undefined behavior. However,
    if robust buffer access is enabled via the GL API, such accesses will be
    bound within the memory extent of the active program. It will not be
    possible to access memory from other programs, and accesses will not
    result in abnormal program termination. Out-of-bounds reads return
    undefined values, which include values from other variables of the
    active program or zero. Out-of-bounds writes may be discarded or
    overwrite other variables of the active program, depending on the value
    of the computed index and how this relates to the extent of the active
    program's memory. Applications that require defined behavior for
    out-of-bounds accesses should range check all computed indices before
    dereferencing an array."

Errors

    None

New State

    None

New Implementation Dependent State

    None

Interactions with OpenGL ES 2.0

    If only OpenGL ES 2.0 is supported then modifications to texel fetch
    behavior are ignored, since texel fetch functionality does not exist
    in OpenGL ES 2.0.

Interactions with OpenGL

    In OpenGL implementations of this extension, the language in section 6.4
    on values returned from out-of-bound reads is still applied in its
    entirety to the "Undefined Behavior" language in section 11.1.3.12,
    including the (0,0,0,x) read behavior.

    However, when read specifically against the operations in 6.4,
    out-of-bounds reads are further restricted to return either values from
    anywhere within the buffer object, or zero. The less tightly specified
    (0,0,0,x) reads defined for OpenGL ES does *not* apply in this case.

Issues

    1) Why are out-of-bounds reads of buffer object backed resources defined
       to allow returning "a value from the current buffer object" in
       addition to one of several possible defined values?
       
       RESOLVED: This is necessary to allow the implementation to either
       range check, apply a mask/modulus or apply a clamp to the index.
       
    2) Why do out-of-bounds writes to buffer object backed resources have a
       stronger guarantee than reads? The spec says that writes outside of
       the bounded range are discarded but reads are only protected within
       the buffer object.
       
       RESOLVED: This stronger guarantee for writes can be made because
       GPUs made since around 2008 (DX10) already implement this behavior.

    3) How does this extension differ from
       ARB_robust_buffer_access_behavior?

       - It is written against OpenGL ES 3.1 instead of GL 4.2, and can
         be implemented for OpenGL ES 2.0 contexts as well.
       - References to GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB are
         removed, since there is no query for context creation flags in
         any version of OpenGL ES.
       - For OpenGL ES implementations only, it widens the scope of possible
         return values from OOB buffer reads to (0,0,0,x) where x is zero,
         one, or MAXINT for integer types.

    4) What value should be returned for out of bounds reads that are
       not part of another resource?

       DISCUSSION: As noted in bug 12104, some implementations cannot return
       zero for all components in this case, but may return another defined
       value, such as one, for the alpha component of vector reads. The
       agreed resolution has been incorporated in the language for section
       2.9.4 and referenced from elsewhere in the extension language.

    5) How should this extension be enabled via EGL?

       PROPOSED: If a context is successfully created supporting
       KHR_robustness (see issue 10 of that spec), the EGL 1.5 spec and
       EGL_EXT_create_context_robustness extensions will be modified to
       *allow* (but not require) support of
       GL_KHR_robust_buffer_access_behavior as well.

       DISCUSSION: We can't require support of this extension, because
       that's a behavior modification to the EGL context creation
       functionality and cannot be supported on existing implementations
       which may support robustness already but not the additional
       guarantees of this spec.

    6) What changed in promoting this extension from OES to KHR? What
       remains to be done for consistency between GL and ES?

       DISCUSSION: The only meaningful difference is identified in the
       "Interactions with OpenGL" section, and is simply slightly tighter
       constrains on out-of-range buffer reads through the operations in
       section 6.4.


Revision History

    Rev.    Date       Author     Changes
    ----  ------------ ---------  -------------------------------------------
      7   2014/06/26   Jon Leech  Change from OES to KHR. Update issue 3
                                  and add issue 6 on ES / GL differences.
      6   2014/06/24   Jon Leech  Rebase against OpenGL ES 3.1. Fix typos.
                                  Add issue 5 on enabling the extension
                                  at context creation time.
      5   2014/06/09   Jon Leech  Update values-returned language to allow
                                  returning any of 0, 1, or the maximum 
                                  representable positive value for integer
                                  types (Bug 12104).
      4   2014/06/02   Jon Leech  Incorporate new language on values returned
                                  from reads inside a buffer object (Bug
                                  12104 comment #31).
      3   2014/05/14   Jon Leech  Revert language on disabled attribute 
                                  reads mistakenly included from bug 10695.
      2   2014/05/07   Jon Leech  Add issue 4 on values to be returned
                                  from out of bounds reads (Bug 12104).
      1   2014/04/23   Jon Leech  Branch from ARB_rbab and convert to be
                                  based on ES 3 specs instead of GL 4.2.
