Name

    EXT_clear_texture

Name Strings

    GL_EXT_clear_texture

Contact

    Tobias Hector, Imagination Technologies (tobias.hector 'at' imgtec.com)

Contributors

    Contributors to the original ARB_clear_texture
    Ian Romanick
    Daniel Koch

Notice

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

Status

    Draft

Version

    Last Modified Date: September 16, 2016
    Revision: 2

Number

    OpenGL ES Extension #269

Dependencies

    OpenGL ES 3.1 is required.

    This extension is written against the OpenGL ES 3.1 API specification.

    This extension interacts with EXT/OES_texture_buffer or OpenGL ES 3.2.

    This extension interacts with EXT/OES_texture_cube_map_array or
    OpenGL ES 3.2.

    This extension interacts with OES_texture_stencil8 or OpenGL ES 3.2.

Overview

    Texture objects are fundamental to the operation of OpenGL. They are
    used as a source for texture sampling and destination for rendering
    as well as being accessed in shaders for image load/store operations
    It is also possible to invalidate the contents of a texture. It is
    currently only possible to set texture image data to known values by
    uploading some or all of a image array from application memory or by
    attaching it to a framebuffer object and using the Clear or ClearBuffer
    commands.

    Both uploading initial texture data and clearing by attaching to a
    framebuffer have potential disadvantages when one simply wants to
    initialize texture data to a known value. Uploading initial data
    requires the application to allocate a (potentially large) chunk
    of memory and transferring that to the GL.  This can be a costly
    operation both in terms of memory bandwidth and power usage.
    Alternatively, attaching a texture level to a framebuffer to clear it
    may not be possible if the texture format isn't supported for
    rendering, or even if it is, attaching the image to a framebuffer object
    may cause the texture to be allocated in certain types of memory, which
    it may otherwise not need to be placed in.

    This extension solves these problems by providing a mechanism whereby
    the contents of a texture image array can be set to known values by
    using the ClearTexImageEXT or ClearTexSubImageEXT commands.  These commands
    can also be useful for initializing an image that will be used for
    atomic shader operations.

IP Status

    No known IP claims.

New Procedures and Functions

    void ClearTexImageEXT(uint texture, int level,
                          enum format, enum type,
                          const void * data);

    void ClearTexSubImageEXT(uint texture, int level,
                             int xoffset, int yoffset, int zoffset,
                             sizei width, sizei height, sizei depth,
                             enum format, enum type,
                             const void * data);

New Types

    None

New Tokens

    None

Additions to Chapter 7 of the OpenGL ES 3.1 API Specification (Programs and
Shaders)

    In section 7.11.2 (Shader Memory Access Synchronization) edit the
    description of the TEXTURE_UPDATE_BARRIER_BIT to add ClearTexImageEXT
    and ClearTexSubImageEXT to the list of commands that can write to
    texture images.

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

    Add a new Section 8.x (Clearing Texture Image Data) after
    Section 8.17 (Immutable-Format Texture Images):

    "All or part of a texture image may be filled with a constant value
    by calling the command

      void ClearTexSubImageEXT(uint texture, int level,
                               int xoffset, int yoffset, int zoffset,
                               sizei width, sizei height, sizei depth,
                               enum format, enum type,
                               const void * data);

    with <texture> and <level> indicating which texture array image is being
    cleared.  It is an error if <texture> is zero or not the name of a texture
    object, if <texture> is a buffer texture, or if the texture image has
    a compressed internal format.

    Arguments <xoffset>, <yoffset>, and <zoffset> specify the lower left
    texel coordinates of a <width>-wide by <height>-high by <depth>-deep
    rectangular subregion of the texel array and are interpreted as they
    are in TexSubImage3D as described in section 8.6 (Alternate Texture
    Image Specification Commands). The subregion must lie within the bounds
    of the texture image, as described in that section.

    For 2D array textures, <zoffset> is interpreted as the first layer to be
    cleared and <depth> is the number of layers to clear. Cube map textures are
    treated as an array of six slices in the z-dimension, where the value
    of <zoffset> is interpreted as specifying the cube map face for the
    corresponding <layer> in table 8.25 (Layer numbers for cube map texture
    faces) and <depth> is the number of faces to clear. For cube map array
    textures, <zoffset> is the first layer-face to clear, and <depth> is the
    number of layer-faces to clear. Each layer-face is translated into an
    array layer and a cube map face as described for layer-face numbers in
    section 8.5.3 [in OpenGL ES 3.2].

    For texture types that do not have certain dimensions, this
    command treats those dimensions as having a size of 1.  For example,
    to clear a portion of a two-dimensional texture, the application would
    use <zoffset> equal to zero and <depth> equal to one.

    <format> and <type> specify the format and type of the source
    data and are interpreted as they are for TexImage3D, as described in
    section 8.4.2 (Transfer of Pixel Rectangles). Textures with a base
    internal format of DEPTH_COMPONENT, STENCIL_INDEX, or DEPTH_STENCIL
    require depth component, stencil, or depth/stencil component data
    respectively. Textures with other base internal formats require RGBA
    formats. Textures with integer internal formats (see table 8.13) require
    integer data.

    <data> is a pointer to an array of between one and four components of
    texel data that will be used as the source for the constant fill value.
    The elements of <data> are converted by the GL into the
    <internalformat> of the texture image (that was specified when the level
    was defined by any of the TexImage, TexStorage or CopyTexImage
    commands) in the manner described in section 8.4.2 (Transfer of Pixel
    Rectangles), and then used to fill the specified range of the
    destination texture level.  If <data> is NULL, then the pointer is
    ignored and the sub-range of the texture image is filled with zeros.
    If <texture> is a multisample texture, all the samples in a texel
    are cleared to the value specified by <data>.

    Errors

        An INVALID_OPERATION error is generated if <texture> is zero or not the
        name of a texture object.

        An INVALID_OPERATION error is generated if <texture> is a buffer
        texture.

        An INVALID_OPERATION error is generated if <texture> has a compressed
        internal format.

        An INVALID_OPERATION error is generated if the base internal format is
        DEPTH_COMPONENT and <format> is not DEPTH_COMPONENT.

        An INVALID_OPERATION error is generated if the base internal format is
        DEPTH_STENCIL and <format> is not DEPTH_STENCIL.

        An INVALID_OPERATION error is generated if the base internal format is
        STENCIL_INDEX and <format> is not STENCIL_INDEX.

        An INVALID_OPERATION error is generated if the base internal format is
        RGBA and the <format> is DEPTH_COMPONENT, STENCIL_INDEX, or
        DEPTH_STENCIL.

        An INVALID_OPERATION error is generated if the internal format is
        integer and <format> does not specify integer data.

        An INVALID_OPERATION error is generated if the internal format is
        not integer and <format> does specify integer data.

        An INVALID_OPERATION error is generated if the specified subregion
        does not lie within the bounds of the texture image, as described
        for TexSubImage3D in section 8.6.

    The command

      void ClearTexImageEXT(uint texture, int level,
                            enum format, enum type,
                            const void * data);

    is equivalent to calling ClearTexSubImageEXT with <xoffset>, <yoffset>,
    and <zoffset> equal to 0 and <width>, <height>, and <depth> equal
    to the dimensions of the texture image (or zero and one for dimensions
    the texture doesn't have).

    Errors

        In addition to the errors generated by ClearTexSubImageEXT:

        An INVALID_OPERATION error is generated if the image array identified by
        <level> has not previously been defined by a TexImage* or TexStorage*
        command."

Interactions with EXT/OES_texture_buffer or OpenGL ES 3.2

    If EXT_texture_buffer or equivalent functionality is not supported,
    ignore all references to buffer textures.

Interactions with EXT/OES_texture_cube_map_array or OpenGL ES 3.2

    If EXT_texture_cube_map_array or equivalent functionality is not supported,
    ignore all references to cube map array textures.

Interactions with OES_texture_stencil8 or OpenGL ES 3.2

    If OES_texture_stencil8 or equivalent functionality is not supported,
    ignore all references to stencil textures.

Errors

    An INVALID_OPERATION error is generated by ClearTexImageEXT or
    ClearTexSubImageEXT if <texture> is zero or not the name of a texture object.

    An INVALID_OPERATION error is generated by ClearTexImageEXT or
    ClearTexSubImageEXT if <texture> is a buffer texture.

    An INVALID_OPERATION error is generated by ClearTexImageEXT or
    ClearTexSubImageEXT if <texture> has a compressed internal format.

    An INVALID_OPERATION error is generated by ClearTexImageEXT or
    ClearTexSubImageEXT if the base internal format is DEPTH_COMPONENT and
    <format> is not DEPTH_COMPONENT.

    An INVALID_OPERATION error is generated by ClearTexImageEXT or
    ClearTexSubImageEXT if the base internal format is STENCIL_INDEX and
    <format> is not STENCIL_INDEX.

    An INVALID_OPERATION error is generated by ClearTexImageEXT or
    ClearTexSubImageEXT if the base internal format is DEPTH_STENCIL and
    <format> is not DEPTH_STENCIL.

    An INVALID_OPERATION error is generated by ClearTexImageEXT or
    ClearTexSubImageEXT if the base internal format is RGBA and the <format>
    is DEPTH_COMPONENT, STENCIL_INDEX, or DEPTH_STENCIL.

    An INVALID_OPERATION error is generated by ClearTexImageEXT or
    ClearTexSubImageEXT if the internal format is integer and <format> does not
    specify integer data.

    An INVALID_OPERATION error is generated by ClearTexImageEXT or
    ClearTexSubImageEXT if the internal format is not integer and <format>
    does specify integer data.

    An INVALID_OPERATION error is generated if the specified subregion
    does not lie within the bouds of the texture image, as described
    for TexSubImage3D in section 8.6.

    An INVALID_OPERATION error is generated by ClearTexImageEXT if the
    image array identified by <level> has not previously been defined.

New State

    None.

New Implementation Dependent State

    None.

Issues

    See ARB_clear_texture for relevant issues.

    1) How does this differ from ARB_clear_texture?

    RESOLVED:
      - Removed interactions with features not present in OpenGL ES:
        - 1D arrays
        - border texels
      - Removed CLEAR_TEXTURE token for GetInternalFormat* which relies
        on the ARB_internalformat_query2 extension which does not have
        equivalent functionality in OpenGL ES.
      - minor language updates to sync with OpenGL 4.5 language.

Revision History

    Revision 1, 2015/08/15, thector
      - Initial revision
    Revision 2, 2016/09/16, dgkoch
      - added interactions with texture cube map arrays and stencil textures
      - added missing suffixes on commands
      - removed CLEAR_TEXTURE, which relies on functionality not in ES.
      - minor language updates to sync with OpenGL 4.5 core language.
      - updated some section references.
