Name

    ANGLE_depth_texture

Name Strings

    GL_ANGLE_depth_texture

Contributors

    Nicolas Capens, TransGaming / Google
    Daniel Koch, TransGaming / NVIDIA
    Shannon Woods, TransGaming / Google
    Kenneth Russell, Google
    Vangelis Kokkevis, Google
    Gregg Tavares, Google
    Contributors to OES_depth_texture
    Contributors to OES_packed_depth_stencil

Contact

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

Status

    Implemented in ANGLE.

Version

    Last Modified Date: February 25, 2013
    Revision: #4

Number

    OpenGL ES Extension #138

Dependencies

    OpenGL ES 2.0 is required.
    This extension is written against the OpenGL ES 2.0.25 specification

    OES_packed_depth_stencil affects the definition of this extension.

    EXT_texture_storage affects the definition of this extension.

Overview

    This extension defines support for 2D depth and depth-stencil
    textures in an OpenGL ES implementation.

    This extension incorporates the depth texturing functionality of
    OES_depth_texture and OES_packed_depth_stencil, but does not
    provide the ability to load existing data via TexImage2D or
    TexSubImage2D. This extension also allows implementation
    variability in which components from a sampled depth texture
    contain the depth data. Depth textures created with this
    extension only support 1 level.

New Procedures and Functions

    None

New Tokens

    Accepted by the <format> parameter of TexImage2D and TexSubImage2D and
    <internalformat> parameter of TexImage2D:

        DEPTH_COMPONENT             0x1902
        DEPTH_STENCIL_OES           0x84F9

    Accepted by the <type> parameter of TexImage2D, TexSubImage2D:

        UNSIGNED_SHORT              0x1403
        UNSIGNED_INT                0x1405
        UNSIGNED_INT_24_8_OES       0x84FA

    Accepted by the <internalformat> parameter of TexStorage2DEXT:

        DEPTH_COMPONENT16           0x81A5
        DEPTH_COMPONENT32_OES       0x81A7
        DEPTH24_STENCIL8_OES        0x88F0

Additions to Chapter 2 of the OpenGL ES 2.0 Specification (OpenGL Operation)

    Update Section 2.10.5 "Shader Execution" in the subsection titled
    "Texture Access" add a new paragraph before the last paragraph add
    this line:

    "The stencil index texture internal component is ignored if the base
    internal format is DEPTH_STENCIL_OES.

    If a vertex shader uses..."

Additions to Chapter 3 of the OpenGL ES 2.0 specification (Rasterization)

    Add the following rows to Table 3.2 (page 62):

      type Parameter           GL Data Type    Special
      ------------------------------------------------
      ...                      ...              ...
      UNSIGNED_SHORT           ushort           No
      UNSIGNED_INT             uint             No
      UNSIGNED_INT_24_8_OES    uint             Yes

    Add the following rows to Table 3.3 (page 62):

      Format Name       Element Meaning and Order      Target Buffer
      ------------------------------------------------------------------
      ...               ...                            ...
      DEPTH_COMPONENT   Depth                          Depth
      DEPTH_STENCIL_OES Depth and Stencil Index        Depth and Stencil
      ...               ...                            ...

    Add a row to Table 3.5 "Packed pixel formats" (page 64):

      type Parameter               GL Type  Components  Pixel Formats
      ------------------------------------------------------------------
      ...                          ...      ...         ...
      UNSIGNED_INT_24_8_OES        uint     2           DEPTH_STENCIL_OES

    Add a new table after Table 3.6 (page 64):

    UNSIGNED_INT_24_8_OES

       31 30 29 28 27 26 ... 12 11 10 9 8 7 6 5 4 3 2 1 0
      +----------------------------------+---------------+
      |           1st Component          | 2nd Component |
      +----------------------------------+---------------+

      Table 3.6.B: UNSIGNED_INT formats

    Add a row to Table 3.7 "Packed pixel field assignments" (page 65):

      Format            |  1st     2nd     3rd     4th
      ------------------+-------------------------------
      ...               |  ...     ...     ...     ...
      DEPTH_STENCIL_OES |  depth   stencil N/A     N/A

    Add the following paragraph to the end of the section "Conversion to
    floating-point" (page 65):

    "For groups of components that contain both standard components and index
    elements, such as DEPTH_STENCIL_OES, the index elements are not converted."

    In section 3.7.1 "Texture Image Specification", update page 67 to
    say:

    "The selected groups are processed as described in section 3.6.2, stopping
    just before final conversion.  Each R, G, B, A, or depth value so generated
    is clamped to [0, 1], while the stencil index values are masked by 2^n-1,
    where n is the number of stencil bits in the internal format resolution
    (see below).

    Components are then selected from the resulting R, G, B, A, depth, or
    stencil index values to obtain a texture with the base internal format
    specified by <internalformat>.  Table 3.8 summarizes the mapping of R, G,
    B, A, depth, or stencil values to texture components, as a function of the
    base internal format of the texture image.  <internalformat> may be
    specified as one of the internal format symbolic constants listed in
    table 3.8. Specifying a value for <internalformat> that is not one of the
    above values generates the error INVALID_VALUE. If <internalformat> does
    not match <format>, the error INVALID_OPERATION is generated.

    Textures with a base internal format of DEPTH_COMPONENT or
    DEPTH_STENCIL_OES are supported by texture image specification commands
    only if <target> is TEXTURE_2D.  Using these formats in conjunction with
    any other <target> will result in an INVALID_OPERATION error.

    Textures with a base internal format of DEPTH_COMPONENT or
    DEPTH_STENCIL_OES only support one level of image data.  Specifying a
    non-zero value for <level> will result in an INVALID_OPERATION error.

    Textures with a base internal format of DEPTH_COMPONENT or DEPTH_STENCIL_OES
    require either depth component data or depth/stencil component data.
    Textures with other base internal formats require RGBA component data.  The
    error INVALID_OPERATION is generated if the base internal format is
    DEPTH_COMPONENT or DEPTH_STENCIL_OES and <format> is not DEPTH_COMPONENT or
    DEPTH_STENCIL_OES, or if the base internal format is not DEPTH_COMPONENT or
    DEPTH_STENCIL_OES and <format> is DEPTH_COMPONENT or DEPTH_STENCIL_OES.

    Textures with a base internal format of DEPTH_COMPONENT or
    DEPTH_STENCIL_OES do not support loading image data via the TexImage
    commands. They can only have their contents specified by rendering
    to them. The INVALID_OPERATION error is generated by the TexImage2D
    command if <data> is not NULL for such textures."

    Add a row to table 3.8 (page 68), and update the title of the
    second column:

      Base Internal Format  RGBA, Depth and Stencil Values  Internal Components
      -------------------------------------------------------------------------
      ...                   ...                             ...
      DEPTH_COMPONENT       Depth                           D
      DEPTH_STENCIL_OES     Depth,Stencil                   D,S
      ...                   ...                             ...

    Update the caption for table 3.8 (page 68)

    "Table 3.8: Conversion from RGBA, depth, and stencil pixel components to
    internal texture components.  Texture components R, G, B, A, and L are
    converted back to RGBA colors during filtering as shown in table 3.12.
    Texture components D are converted to RGBA colors as described in
    section 3.7.8-1/2."

    Add the following to section 3.7.2 "Alternate Texture Image Specification
    Commands":

    "CopyTexImage2D and CopyTexSubImage2D generate the INVALID_OPERATION
    error if the base internal format of the destination texture is
    DEPTH_COMPONENT or DEPTH_STENCIL_OES.

    TexSubImage2D generates the INVALID_OPERATION error if the base internal
    format of the texture is DEPTH_COMPONENT or DEPTH_STENCIL_OES."

    Add a new section between sections 3.7.8 and 3.7.9:

    "3.7.8-1/2 Depth/Stencil Textures

    If the currently bound texture's base internal format is DEPTH_COMPONENT or
    DEPTH_STENCIL_OES, then the output of the texture unit is as described
    below. Otherwise, the texture unit operates in the normal manner.

    Let <D_t> be the depth texture value, provided by the shader's texture lookup
    function. Then the effective texture value is computed as follows:
            <Tau> = <D_t>

    If the texture image has a base internal format of DEPTH_STENCIL_OES, then
    the stencil index texture component is ignored.  The texture value <Tau> does
    not include a stencil index component, but includes only the depth
    component.

    The resulting <Tau> is assigned to <R_t>. In some implementations, <Tau> is
    also assigned to <G_t>, <B_t>, or <A_t>. Thus in table 3.12, textures with
    depth component data behave as if their base internal format is RGBA, with
    values in <G_t>, <B_t>, and <A_t> being implementation dependent."

    Add the following to section 3.7.11 "Mipmap Generation":

    "If the level zero array contains depth or depth-stencil data, the
     error INVALID_OPERATION is generated."

    Insert a new paragraph after the first paragraph of the "Texture Access"
    subsection of section 3.8.2 on page 87, which says:

    "Texture lookups involving textures with depth component data generate
    a texture source color by using depth data directly, as described in
    section 3.7.8-1/2.  The stencil texture internal component is ignored
    if the base internal format is DEPTH_STENCIL_OES."

Additions to Chapter 4 of the OpenGL ES 2.0 specification (Per-Fragment
Operations and the Framebuffer)

    In section 4.4.5 "Framebuffer Completeness", replace the the 3rd
    paragraph with the following text:

     "* An internal format is color-renderable if it is one of the formats
        from table 4.5 noted as color-renderable or if it is unsized format
        RGBA or RGB. No other formats, including compressed internal formats,
        are color-renderable.

      * An internal format is depth-renderable if it is one of the sized
        internal formats from table 4.5 noted as depth-renderable, if it
        is the unsized format DEPTH_COMPONENT or if it is the internal
        format value of DEPTH24_STENCIL8_OES. No other formats are
        depth-renderable.

      * An internal format is stencil-renderable if it is one of the sized
        internal formats from table 4.5 noted as stencil-renderable or if it
        is DEPTH24_STENCIL8_OES. No other formats are stencil-renderable."

Additions to Chapter 5 of the OpenGL ES 2.0 Specification (Special
Functions)

    None.

Additions to Chapter 6 of the OpenGL ES 2.0 Specification (State and State
Requests)

    None.

Interactions with OES_packed_depth_stencil

    If OES_packed_depth_stencil is not supported, mentions of
    DEPTH_STENCIL_OES and UNSIGNED_INT_24_8_OES as a format/type combinations
    for TexImage2D and TexSubImage2D are omitted. Mentions of
    the internal format DEPTH24_STENCIL8_OES are also omitted.

Interactions with EXT_texture_storage

    If EXT_texture_storage is supported the following internalformat
    to format/type mappings are used:

        <internalformat>       <format>           <type>
        ----------------       --------           ------
        DEPTH_COMPONENT16      DEPTH_COMPONENT    UNSIGNED_SHORT
        DEPTH_COMPONENT32_OES  DEPTH_COMPONENT    UNSIGNED_INT
        DEPTH24_STENCIL8_OES   DEPTH_STENCIL_OES  UNSIGNED_INT

    Textures with the above <internalformats> only support one level of
    image data. Specifying a value other than one for the <levels> parameter
    to TexStorage2DEXT will result in an INVALID_OPERATION error.

    If EXT_texture_storage is not supported, ignore any references
    to TexStorage2DEXT.

Errors

    The error INVALID_OPERATION is generated by TexImage2D if <format> and
    <internalformat> are DEPTH_COMPONENT and <type> is not UNSIGNED_SHORT,
    or UNSIGNED_INT.

    The error INVALID_OPERATION is generated by TexSubImage2D if <format> is
    DEPTH_COMPONENT and <type> is not UNSIGNED_SHORT, or UNSIGNED_INT.

    The error INVALID_OPERATION is generated by TexImage2D if <format> and
    <internalformat> are not DEPTH_COMPONENT and <type> is UNSIGNED_SHORT,
    or UNSIGNED_INT.

    The error INVALID_OPERATION is generated by TexSubImage2D if <format> is
    not DEPTH_COMPONENT and <type> is UNSIGNED_SHORT, or UNSIGNED_INT.

    The error INVALID_OPERATION is generated by TexImage2D if <format> and
    <internalformat> are DEPTH_STENCIL_OES and <type> is not
    UNSIGNED_INT_24_8_OES.

    The error INVALID_OPERATION is generated by TexSubImage2D if <format>
    is DEPTH_STENCIL_OES and <type> is not UNSIGNED_INT_24_8_OES.

    The error INVALID_OPERATION is generated by TexImage2D if <format> and
    <internalformat> is not DEPTH_STENCIL_OES and <type> is
    UNSIGNED_INT_24_8_OES.

    The error INVALID_OPERATION is generated by TexSubImage2D if <format>
    is not DEPTH_STENCIL_OES and <type> is UNSIGNED_INT_24_8_OES.

    The error INVALID_OPERATION is generated in the following situations:
    - TexImage2D is called with <format> and <internalformat> of
      DEPTH_COMPONENT or DEPTH_STENCIL_OES and
       - <target> is not TEXTURE_2D,
       - <data> is not NULL, or
       - <level> is not zero.
    - TexSubImage2D is called with <format> of DEPTH_COMPONENT or
      DEPTH_STENCIL_OES.
    - TexStorage2DEXT is called with <internalformat> of DEPTH_COMPONENT16,
      DEPTH_COMPONENT32_OES, or DEPTH24_STENCIL8_OES, and
       - <target> is not TEXTURE_2D, or
       - <levels> is not one.
    - CopyTexImage2D is called with an <internalformat> that has a base
      internal format of DEPTH_COMPONENT or DEPTH_STENCIL_OES.
    - CopyTexSubImage2D is called with a target texture that has a base
      internal format of DEPTH_COMPONENT or DEPTH_STENCIL_OES.
    - GenerateMipmap is called on a texture that has a base internal format
      of DEPTH_COMPONENT or DEPTH_STENCIL_OES.

New State

    None.

Issues

    1) What are the differences between this extension and OES_depth_texture
       and OES_packed_depth_stencil?

       RESOLVED: This extension:
         - does not support loading pre-baked depth stencil data via
           TexImage2D or TexSubImage2D.
         - allows variability in the y-, z-, and w-components of the sample
           results from depth textures.
         - only supports one level textures.
         - explicitly lists the errors for unsupported functionality.
           Since these were not clearly specified in the OES_depth_texture
           extension there may be differences in error values between
           implementations of OES_depth_texture and ANGLE_depth_texture.
       This specification was also rebased to apply against the OpenGL ES 2.0
       specification instead of the OpenGL specification, making it more
       obvious what all the functionality changes are.

    2) Why does TexSubImage2D accept the new format/type combinations even
       though it does not actually support loading data?

       RESOLVED: This was done to be more consistent with the OES_depth_texture
       extension and to make it easier to add support for loading texture
       data if it is possible to support in the future.

    3) Why are only 1-level depth textures supported?

       RESOLVED: The only use for multiple levels of depth textures would
       be for fitlered texturing. However since it is not possible to
       render to non-zero-level texture levels in OpenGL ES 2.0, and since
       this extension forbids loading existing data and GenerateMipmap on
       depth textures, it is impossible to initialize or specify contents
       for non-zero levels of depth textures.

Revision History

    02/25/2013  swoods  revise to allow texture lookup to guarantee depth values
                        only in red channel of sample result.
    06/04/2012  dgkoch  fix errors, disallow multi-level depth textures.
    05/30/2012  dgkoch  minor updates and add issues.
    05/23/2012  dgkoch  intial revision based on OES_depth_texture and
                        OES_packed_depth_stencil and rebased against the ES 2.0 spec

