Name

    ANGLE_robust_resource_initialization

Name Strings

    GL_ANGLE_robust_resource_intialization

Contributors

    Geoff Lang, Google
    Ken Russell, Google

Contacts

    Shannon Woods, Google (shannonwoods 'at' google.com)

Status

    Draft

Version

    Version 3, September 19, 2017

Number

    OpenGL ES Extension TBD

Dependencies

    OpenGL ES 2.0 is required.

    This extension is written against the wording of the OpenGL ES
    3.1 specification.

    EGL_ANGLE_robust_initialization is required to request a
    context that supports this extension, and resource initialization.

Overview

    This extension specifies the behavior for initialization of
    resources such as textures and buffers to default values. This
    initialization ensures that access will not be provided by the
    GL to previously allocated data not owned by the application.

New Types

    None

New Procedures and Functions

    None

New Tokens

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

        ROBUST_RESOURCE_INITIALIZATION_ANGLE    0x93A7

Additions to Chapter 6 of the OpenGL ES 3.1 Specification (Buffer
Objects)

    Replace the last sentence of the first paragraph of section 6.2
    "BufferData":

    If <data> is NULL, and robust resource initialization is enabled,
    the contents of the buffer object's data store are set to zero.
    Otherwise, the contents of the buffer object's data store are
    undefined.

Additions to Chapter 8 of the OpenGL ES 3.1 Specification (Textures and
Samplers)

    Replace the first two sentances of the final paragraph in section
    8.5.3 "Texture Image Structure":

    If the <data> argument of TexImage2D or TexImage3D is NULL, and the
    pixel unpack buffer object is zero, a two- or three-dimensional
    texel array is created with the specified <target>, <level>,
    <internalformat>, <border>, <width>, <height>, and <depth>. If
    robust resource initialization is enabled, the contents of the image
    are initialized as though a zero value were provided for each
    component of each pixel, and processed and transferred to the GL
    as described above. The components comprising this zero-filled data
    are determined by <internalformat>. If robust resource
    initialization is not enabled, the image contents are undefined, and
    no pixel processing is performed. In either case, no pixel values
    are accessed in client memory.

    Replace the first sentence of the fifth paragraph in section 8.8
    "Multisample Textures":

    Upon success, TexStorage2DMultisample deletes any existing image
    for target. If robust resource initialization is enabled, the
    contents of each texel are initialized as though a zero value were
    written to each channel of each sample; otherwise the contents of
    texels are undefined.

    Add to the final paragraph of section 8.17 "Immutable-Format Texture
    Images":

    If robust resource initialization is enabled, the contents of each
    texel is initialized as though a zero value were provided for each
    component of each pixel, and processed and transferred to the GL
    as for a call to the appropriate TexSubImage* call for <target>.
    Otherwise, the contents of texels are undefined.

Additions to Chapter 9 of the OpenGL ES 3.1 Specification (Framebuffers
and Framebuffer Objects)

    Replace the sentence in section 9.2.4 "Renderbuffer Objects"
    beginning "Upon success, RenderbufferStorageMultisample":

    Upon success, RenderbufferStorageMultisample deletes any existing
    data store for the renderbuffer image. If robust resource
    initialization is enabled, the contents of each pixel in the data
    store are initialized as though a zero value was written to each
    channel of each sample; otherwise, the contents of the data store
    are undefined.

Interactions with EGL_ANGLE_create_context_robust_resource_initialization

    If the EGL window-system binding API is used to create a context,
    the EGL_ANGLE_create_context_robust_initialization extension is
    supported, and the attribute
    EGL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE is set to
    EGL_TRUE when eglCreateContext is called, the resulting context
    will perform robust resource initialization as described above in
    section <section>, and the
    CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE
    query will return GL_TRUE as described above in section 2.6.1.1.
    Otherwise queries will return GL_FALSE.

Issues

    None

Revision History

    Version 1, 2015/01/07 - first draft.
    Version 2, 2017/03/07 - fixed EGL naming and added IsEnabled.
    Version 3, 2017/09/19 - name cleanup.
