Name

    EXT_sparse_texture

Name Strings

    GL_EXT_sparse_texture

Contributors

    Dominik Witczak, Mobica
    Contributors to ARB_sparse_texture

    Xi Chen, NVIDIA

Contact

    Daniel Koch, NVIDIA Corporation (dkoch 'at' nvidia.com)

Notice

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

    Portions Copyright (c) 2014 NVIDIA Corporation.

Status

    Complete.

Version

    Last Modified Date:         27/03/2015
    Revision:                   3

Number

    OpenGL ES Extension #240

Dependencies

    OpenGL ES 3.1 is required.

    This extension is written against the OpenGL ES 3.1 (June 4, 2014)
    Specification.

    This extension interacts with OES_texture_border_clamp.

    This extension interacts with EXT_texture_border_clamp.

    This extension interacts with OES_texture_cube_map_array.

    This extension interacts with EXT_texture_cube_map_array.

    This extension interacts with OES_texture_view.

    This extension interacts with EXT_texture_view.

    This extension interacts with EXT_texture_norm16.

    The definition of this extension is affected by the presence of
    EXT_direct_state_access.

Overview

    Recent advances in application complexity and a desire for higher
    resolutions have pushed texture sizes up considerably. Often, the amount
    of physical memory available to a graphics processor is a limiting factor
    in the performance of texture-heavy applications. Once the available
    physical memory is exhausted, paging may occur bringing performance down
    considerably - or worse, the application may fail. Nevertheless, the amount
    of address space available to the graphics processor has increased to the
    point where many gigabytes - or even terabytes of address space may be
    usable even though that amount of physical memory is not present.

    This extension allows the separation of the graphics processor's address
    space (reservation) from the requirement that all textures must be
    physically backed (commitment). This exposes a limited form of
    virtualization for textures. Use cases include sparse (or partially
    resident) textures, texture paging, on-demand and delayed loading of
    texture assets and application controlled level of detail.

New Procedures and Functions

        void TexPageCommitmentEXT(enum target,
                                  int level,
                                  int xoffset,
                                  int yoffset,
                                  int zoffset,
                                  sizei width,
                                  sizei height,
                                  sizei depth,
                                  boolean commit);

    [[ The following is only added if EXT_direct_state_access is supported. ]]

        void TexturePageCommitmentEXT(uint texture,
                                      int level,
                                      int xoffset,
                                      int yoffset,
                                      int zoffset,
                                      sizei width,
                                      sizei height,
                                      sizei depth,
                                      boolean commit);

New Tokens

    Accepted by the <pname> parameter to TexParameter{if}{v},
    GetTexParameter{if}v, TexParameterI{u}ivOES, GetTexParameterI{u}ivOES
    TexParameterI{u}ivEXT, and GetTexParameterI{u}ivEXT:

        TEXTURE_SPARSE_EXT                          0x91A6
        VIRTUAL_PAGE_SIZE_INDEX_EXT                 0x91A7

    Accepted by the <pname> parameter of GetTexParameter{if}v,
    GetTexParameterIi{u}vOES, and GetTexParameterIi{u}vEXT:

        NUM_SPARSE_LEVELS_EXT                       0x91AA

    Accepted by the <pname> parameter to GetInternalformativ:

        NUM_VIRTUAL_PAGE_SIZES_EXT                  0x91A8

        VIRTUAL_PAGE_SIZE_X_EXT                     0x9195
        VIRTUAL_PAGE_SIZE_Y_EXT                     0x9196
        VIRTUAL_PAGE_SIZE_Z_EXT                     0x9197

    Accepted by the <target> parameter to GetInternalformativ:

        TEXTURE_2D                                  0x0DE1
        TEXTURE_2D_ARRAY                            0x8C1A
        TEXTURE_CUBE_MAP                            0x8513
        TEXTURE_CUBE_MAP_ARRAY_OES                  0x9009
        TEXTURE_3D                                  0x806F

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

        MAX_SPARSE_TEXTURE_SIZE_EXT                 0x9198
        MAX_SPARSE_3D_TEXTURE_SIZE_EXT              0x9199
        MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT         0x919A
        SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT  0x91A9

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

    Add the "Supports Sparse Allocation" column to Table 8.13, "Correspondence
    of sized internal color formats..."

        +-------------------------------+-------------------------------+
        | Sized Internal Format         | Supports Sparse Allocation    |
        +-------------------------------+-------------------------------+
        | R8                            | Y                             |
        | R8_SNORM                      | Y                             |
        | R16_EXT                       | Y                             |
        | R16_SNORM_EXT                 | Y                             |
        | RG8                           | Y                             |
        | RG8_SNORM                     | Y                             |
        | RG16_EXT                      | Y                             |
        | RG16_SNORM_EXT                | Y                             |
        | RGB565                        | Y                             |
        | RGB8                          |                               |
        | RGB8_SNORM                    |                               |
        | RGB16_EXT                     |                               |
        | RGB16_SNORM_EXT               |                               |
        | RGBA4                         |                               |
        | RGB5_A1                       |                               |
        | RGBA8                         | Y                             |
        | RGBA8_SNORM                   | Y                             |
        | RGB10_A2                      | Y                             |
        | RGB10_A2UI                    | Y                             |
        | RGBA16_EXT                    | Y                             |
        | RGBA16_SNORM_EXT              | Y                             |
        | SRGB8                         |                               |
        | SRGB8_ALPHA8                  |                               |
        | R16F                          | Y                             |
        | RG16F                         | Y                             |
        | RGB16F                        |                               |
        | RGBA16F                       | Y                             |
        | R32F                          | Y                             |
        | RG32F                         | Y                             |
        | RGB32F                        |                               |
        | RGBA32F                       | Y                             |
        | R11F_G11F_B10F                | Y                             |
        | RGB9_E5                       | Y                             |
        | R8I                           | Y                             |
        | R8UI                          | Y                             |
        | R16I                          | Y                             |
        | R16UI                         | Y                             |
        | R32I                          | Y                             |
        | R32UI                         | Y                             |
        | RG8I                          | Y                             |
        | RG8UI                         | Y                             |
        | RG16I                         | Y                             |
        | RG16UI                        | Y                             |
        | RG32I                         | Y                             |
        | RG32UI                        | Y                             |
        | RGB8I                         |                               |
        | RGB8UI                        |                               |
        | RGB16I                        |                               |
        | RGB16UI                       |                               |
        | RGB32I                        |                               |
        | RGB32UI                       |                               |
        | RGBA8I                        | Y                             |
        | RGBA8UI                       | Y                             |
        | RGBA16I                       | Y                             |
        | RGBA16UI                      | Y                             |
        | RGBA32I                       | Y                             |
        | RGBA32UI                      | Y                             |
        +-------------------------------+-------------------------------+

    Insert the following paragraph before Table 8.16:

        If <pname> is TEXTURE_SPARSE_EXT or VIRTUAL_PAGE_SIZE_INDEX_EXT, then
    the state is stored in the texture, but only takes effect the next time
    storage is allocated for a texture using TexStorage*. If the value of
    TEXTURE_IMMUTABLE_FORMAT is TRUE, then TEXTURE_SPARSE_EXT and
    VIRTUAL_PAGE_SIZE_INDEX_EXT cannot be changed and an error is generated.

    Append to Table 8.20: "Texture parameters and their values."

      +------------------------------+---------+---------------------------+
      | Name                         | Type    | Legal values              |
      +------------------------------+---------+---------------------------+
      | TEXTURE_SPARSE_EXT           | boolean | TRUE, FALSE               |
      | VIRTUAL_PAGE_SIZE_INDEX_EXT  | int     | any non-negative integer  |
      +------------------------------+---------+---------------------------+

    Add to the Errors table for TexParameter*

        INVALID_OPERATION is generated if <pname> is TEXTURE_SPARSE_EXT or
    VIRTUAL_PAGE_SIZE_INDEX_EXT and the value of TEXTURE_IMMUTABLE_FORMAT for
    the texture identified by <target> is TRUE.

        INVALID_VALUE is generated if <pname> is TEXTURE_SPARSE_EXT, <pname>
    is TRUE and <target> is not one of TEXTURE_2D, TEXTURE_2D_ARRAY,
    TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY_OES, or TEXTURE_3D.

    Additions to Section 8.16view (Texture Views), of the OpenGL ES
    Specification (as added by OES_texture_view or EXT_texture_view):

        Texture views may be created that reference sparse textures (see
    Section 8.17sparse.1), and in such cases, the view is considered to be sparse.
    Should a texture view reference part or all of the tail of a sparse
    texture, then modifications to the commitment of that tail via the view
    affect the tail of the parent texture and all other views that reference
    the tail, even for portions of the tail outside the controlling view.

    Additions to Section 8.17 of the OpenGL Specification, "Immutable-Format
    Texture Images"

    Add the following bullet point to the list of psuedo-operations performed
    by all variants of TexStorage* (p.188):

        * If TEXTURE_SPARSE_EXT is TRUE, only virtual address space is
          allocated for the texture but physical backing store is not.
          Physical store for pages of a virtual texture may be committed and
          decommitted by calling TexPageCommitmentEXT. The page size chosen
          for the texture is taken from the texture's value of
          VIRTUAL_PAGE_SIZE_INDEX_EXT. In this case, <width>, <height> and
          <depth> must either be integer multiples of the selected virtual
          page size in the X, Y and Z dimensions, respectively, or be less
          than those dimensions. Additionally, the dimensions of sparse
          textures must be compatible with the chosen value of
          <internalFormat> as described in Section 8.17sparse.1.

    Add to the errors that may be generated by TexStorage*:

        An INVALID_OPERATION error is generated if the texture's
        TEXTURE_SPARSE_EXT parameter is TRUE and the value of its
        VIRTUAL_PAGE_SIZE_INDEX_EXT parameter is greater than or equal to
        NUM_VIRTUAL_PAGE_SIZES_EXT for the specified target and internal
        format.

        An INVALID_VALUE error is generated if the texture's TEXTURE_SPARSE_EXT
        parameter is TRUE and any of the following are true:

          * <target> is TEXTURE_3D, and <width>, <height>, or <depth>
            is greater than MAX_SPARSE_3D_TEXTURE_SIZE_EXT;

          * <target> is not TEXTURE_3D, and <width> or <height> is greater
            than MAX_SPARSE_TEXTURE_SIZE_EXT; or

          * <target> is TEXTURE_2D_ARRAY or TEXTURE_CUBE_MAP_ARRAY_OES and
            <depth> is greater than MAX_SPARSE_TEXTURE_ARRAY_LAYERS_EXT.

        An INVALID_VALUE error is generated if the texture's
        TEXTURE_SPARSE_EXT parameter is TRUE and <width> or <height> is greater
        than the value of MAX_SPARSE_3D_TEXTURE_SIZE_EXT when <target> is
        TEXTURE_3D, or if <height> or <depth> is greater than the value of
        MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT if <target> is a 2D array
        texture target, respectively.

        An INVALID_VALUE error is generated if TEXTURE_SPARSE_EXT is TRUE and
        <width>, <height> or <depth> is is not an integer multiple of the
        page size in the corresponding dimension.

        If the value of SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT is FALSE,
        then TexStorage* will generate an INVALID_OPERATION error if

          * the texture's TEXTURE_SPARSE_EXT parameter is TRUE,

          * <target> is one of TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, or
            TEXTURE_CUBE_MAP_ARRAY_OES, and

          * for the virtual page size corresponding to the
            VIRTUAL_PAGE_SIZE_INDEX_EXT parameter, either of the following is
            true:

              - <width> is not a multiple of VIRTUAL_PAGE_SIZE_X_EXT *
                 2^(<levels>-1), or

              - <height> is not a multiple of VIRTUAL_PAGE_SIZE_Y_EXT *
                 2^(<levels>-1).

    Insert Section 8.17sparse, "Sparse Textures and Commitment"
    following section 8.17 "Immutable-Format Texture Images".

        Textures may be allocated such that their images' physical backing
    store is only partially allocated. Only immutable format textures may
    be sparsely allocated. To allocate a sparse texture, set a texture's
    TEXTURE_SPARSE_EXT parameter to TRUE before allocating storage for it
    with TexStorage*.

    Insert Subsection 8.17sparse.1, "Allocation of and Access to Sparse Textures"

        Sparse textures are allocated setting a texture's TEXTURE_SPARSE_EXT
    parameter to TRUE and then issuing one of the TexStorage* commands.
    The dimensions of a sparse texture must be compatible with the internal
    format chosen for the texture. Each internal format has zero or more
    sparse page sizes that may be selected. The number of available page sizes
    for an internal format and the dimensions of the pages may be determined
    by calling GetInternalFormat* with the <pname> NUM_VIRTUAL_PAGE_SIZES_EXT
    (for the number of available page sizes), VIRTUAL_PAGE_SIZE_X_EXT,
    VIRTUAL_PAGE_SIZE_Y_EXT or VIRTUAL_PAGE_SIZE_Z_EXT (for the virtual
    page widths, heights and depths, respectively). Not all internal formats
    support sparse allocation. For those formats, the value of
    NUM_VIRTUAL_PAGE_SIZES_EXT will be zero. The internal formats which are
    guaranteed to support sparse allocation is listed in Table 8.13. Formats
    not listed as supported in Table 8.13 may still be supported by some
    implementations.

        The VIRTUAL_PAGE_SIZE_INDEX_EXT may be used to select the page layout for
    a sparse texture. The value of the texture's VIRTUAL_PAGE_SIZE_INDEX_EXT
    parameter is treated as an index into the array of possible page sizes
    for the type and requested internal format of the texture, and matches
    index of the array of values returned for the VIRTUAL_PAGE_SIZE_{XYZ}_EXT
    internal format query.

        When a sparsely committed texture is accessed by the GL, accesses that
    require only samples contained in committed regions complete as normal.
    For operations that access samples from uncommitted regions produce
    the following behavior:

        * Reads from such regions produce undefined data, but otherwise have
          no adverse effect. This includes samples required for the
          implementation of texture filtering, mipmap generation and so on.

        * Writes to such regions are ignored. The GL may attempt to write to
          uncommitted regions but the effect of doing so will be benign.

        * Atomic operations with return values on uncommitted regions will
          complete normally, but the returned value will be undefined and the
          result of the atomic operation will be discarded.

        * Reads and writes through framebuffers shall have no adverse effect,
          but fragment shaders corresponding to uncommitted regions of the
          framebuffer still execute to completion. Visible side effects
          of these shaders such as operations on atomic counters, storage
          blocks or committed regions of images are still seen, as are
          the results of operations such as occlusion queries.

        * Access to uncommitted regions by the client (for example through
          ReadPixels) shall have similar effect as through any
          other part of the GL --- reads return undefined data and writes are
          discarded, with no other ill effect.

    Insert Subsection 8.17sparse.2. "Controlling Sparse Texture Commitment"

        If a texture is allocated using sparse storage (that is, its
    TEXTURE_SPARSE_EXT parameter is TRUE at the time that its storage is
    allocated), it is initially created with only a virtual data store, and no
    physical data store. Individual pages of a sparse texture may be made
    resident or non-resident by calling

        void TexPageCommitmentEXT(enum target,
                                  int level,
                                  int xoffset,
                                  int yoffset,
                                  int zoffset,
                                  sizei width,
                                  sizei height,
                                  sizei depth,
                                  boolean commit);

    with <target> and <level> indicating the level of the texture object whose
    residency is to be modified. <xoffset>, <yoffset>, <zoffset>, <width>,
    <height> and <depth> are interpreted as they are in TexSubImage3D.  An
    error will be generated unless <xoffset>, <yoffset> <zoffset>, <width>,
    <height> and <depth> specify a region of the texture level that is aligned
    to multiples of the page size or to the edges of the texture.

    If the value of <commit> is TRUE, then the texture pages contained in
    the region defined by the values of <xoffset>, <yoffset>, <zoffset>,
    <width>, <height> and <depth> are committed. If they were not committed
    before the call, then new physical backing store is allocated and associated
    with the sparse pages and their initial content is undefined. If the pages
    were already committed, then they remain committed, no error is generated,
    and the content of those pages remains unmodified. If the value of
    <committed> is FALSE, then the texture pages contained in the region are
    made de-committed. Their physical store is de-allocated, and their contents
    again become undefined.

    For the purposes of commitment, a cube map texture is treated as a 2D
    array texture with a depth of six and cube map array textures are treated
    as 2D array textures with a depth equal to six times the number of layers
    in the cube map array.

    For levels of a sparse texture where each dimension is a multiple of the
    virtual page size, the residency of individual page-size regions is
    controlled by TexPageCommitmentEXT and such levels may be partially
    populated.  When the mipmap chain reaches a level that is not an integer
    multiple of the virtual page size in any dimension, padding and memory
    layout considerations may make it impossible to treat that level and
    subsequent smaller ones as partially populated.  The set of levels that
    can be partially populated is implementation-dependent.  The total number
    of levels that may be partially populated may be queried by calling
    GetTexParameter* with the <pname> NUM_SPARSE_LEVELS_EXT.

    The collection of texture levels that may not be partially populated, if
    any, consists of levels NUM_SPARSE_LEVELS_EXT and higher, and is referred
    to as the mipmap 'tail'.  The levels comprising the tail are made resident
    or non-resident as a unit.  The tail is resident if and only if
    TexPageCommitmentEXT has been called successfully with <level> greater
    than or equal to NUM_SPARSE_LEVELS_EXT and the value of <commit> was TRUE
    for the last such call.

    Views of sparse textures are also considered sparse. Modifications to
    commitment of a texture via a view of it affect the parent texture and
    any other views containing the modified pages. If a view of a sparse
    texture references its tail (or is entirely contained within it),
    modifications to commitment of the tail via the view will affect the entire
    tail of the parent, even for parts of the tail that are not referenced
    by the view. Furthermore, modifications to tail commitment may affect
    views referencing other parts of the tail.

    Errors

      An INVALID_OPERATION error is generated if <xoffset> + <width> or
      <yoffset> + <height> is greater than the width or height, respectively,
      of level <level> of the texture bound to <target>.

      An INVALID_OPERATION error is generated if <zoffset> + <depth> is
      greater than

        * the depth of level <level> of the texture bound to <target>, if
          <target> is TEXTURE_3D;

        * the number of layers of level <level> of the texture bound to
          <target>, if <target> is TEXTURE_2D_ARRAY;

        * six times the number of layers of level <level> of the texture bound
          to <target>, if <target> is TEXTURE_CUBE_MAP_ARRAY_OES; or

        * one, for all other targets.

      An INVALID_VALUE error is generated if <xoffset>, <yoffset>, or
      <zoffset> is not a multiple of VIRTUAL_PAGE_SIZE_X_EXT,
      VIRTUAL_PAGE_SIZE_Y_EXT, or VIRTUAL_PAGE_SIZE_Z_EXT, respectively, of
      the texture bound to <target>.

      An INVALID_OPERATION error is generated if <width> is not an integer
      multiple of VIRTUAL_PAGE_SIZE_X_EXT and <width> plus <xoffset> is not
      equal to the width of level <level> of the texture bound to <target>.

      An INVALID_OPERATION error is generated if <height> is not an integer
      multiple of VIRTUAL_PAGE_SIZE_Y_EXT and <height> plus <yoffset> is not
      equal to the height of level <level> of the texture bound to <target>.

      An INVALID_OPERATION error is generated if <depth> is not an integer
      multiple of VIRTUAL_PAGE_SIZE_Z_EXT and <depth> plus <zoffset> is not
      equal to

        * the depth of level <level> of the texture bound to <target>, if
          <target> is TEXTURE_3D;

        * the number of layers of level <level> of the texture bound to
          <target>, if <target> is TEXTURE_2D_ARRAY;

        * six times the number of layers of level <level> of the texture bound
          to <target>, if <target> is TEXTURE_CUBE_MAP_ARRAY; or

        * one, for all other targets.

      An INVALID_OPERATION error is generated if the value of
      TEXTURE_IMMUTABLE_FORMAT or TEXTURE_SPARSE_EXT for the texture bound to
      <target> is FALSE.

    [[ The following is only added if EXT_direct_state_access is supported. ]]

    The command

        void TexturePageCommitmentEXT(uint texture,
                                      int level,
                                      int xoffset,
                                      int yoffset,
                                      int zoffset,
                                      sizei width,
                                      sizei height,
                                      sizei depth,
                                      boolean commit);

    may also be used to control the residency of sparse textures.  This
    command behaves identically to TexPageCommitmentEXT, except that the
    texture is identified by the name <texture> instead of via <target>.

    Errors

      An INVALID_OPERATION error is generated if <texture> is not the name of
      an existing texture.

      All other errors listed for TexPageCommitmentEXT also apply to
      TexturePageCommitmentEXT, except that references to "the texture bound
      to <target>" should be replaced with "the texture <texture>", and all
      other references to "<target>" should be replaced with "the target of
      texture <texture>".

Additions to Chapter 19 of the OpenGL ES 3.1 Specification (Context State
Queries)

    Append to Table 19.1, "Possible targets that internalformat can be used
    with and the corresponding usage meaning"

    +-------------------------------+-------------------------+
    | Target                        | Usage                   |
    +-------------------------------+-------------------------+
    | TEXTURE_2D                    | 2D texture              |
    | TEXTURE_2D_ARRAY              | 2D texture array        |
    | TEXTURE_CUBE_MAP              | Cube map texture        |
    | TEXTURE_CUBE_MAP_ARRAY_OES    | Cube map texture array  |
    | TEXTURE_3D                    | 3D texture              |
    +-------------------------------+-------------------------+

    Modify Section 19.3.1, "Internal Format Query Parameters"

    (In the first item on the supported pnames list for NUM_SAMPLE_COUNTS,
     modify the first sub-list item "If <target> does not support multiple
     samples..")

        - If <internalformat> is not color-renderable, depth-renderable, or
          stencil-renderable (as defined in section 9.4), or if <target> does
          not support multiple samples (is not TEXTURE_2D_MULTISAMPLE. or
          RENDERBUFFER), zero is returned.

    (In the second item on the supported pnames list for SAMPLES, append to the
     sub-list)

        - If <internalformat> is not color-renderable, depth-renderable, or
          stencil-renderable (as defined in section 9.4), or if <target> does
          not support multiple samples (is not TEXTURE_2D_MULTISAMPLE. or
          RENDERBUFFER), <params> is not modified.

    (Add to supported pnames list)

        * NUM_VIRTUAL_PAGE_SIZES_EXT: The number of virtual page sizes
          supported by internalformat and target is written into params.
          Unsupported internal formats and targets report 0.

        * VIRTUAL_PAGE_SIZE_X_EXT: The virtual page widths supported for
          internalformat and target are written into params.

        * VIRTUAL_PAGE_SIZE_Y_EXT: The virtual page heights supported for
          internalformat and target are written into params.

        * VIRTUAL_PAGE_SIZE_Z_EXT: The virtual page depths supported for
          internalformat and target are written into params.

    In the error list on p.353, modify the first item:

    * An INVALID_ENUM error is generated if <target> is not one of the targets
      in table 19.1, or if <pname> is not SAMPLES, NUM_SAMPLES_COUNTS,
      NUM_VIRTUAL_PAGE_SIZES_EXT, VIRTUAL_PAGE_SIZE_X_EXT,
      VIRTUAL_PAGE_SIZE_Y_EXT or VIRTUAL_PAGE_SIZE_Z_EXT.

    Remove the second item "An INVALID_ENUM error is generated if
    internalformat is not color-, depth- or stencil-renderable."

Additions to the AGL/GLX/WGL/EGL Specifications

    None.

GLX Protocol

    None.

New State

    Append to Table 20.9, "Textures (state per texture object) (cont.)"

    +-----------------------------------+-------+---------------------+-----------------+---------------------------------------+-------------+
    | Get Value                         | Type  | Get Command         | Initial Value   | Description                           | Sec.        |
    +-----------------------------------+-------+---------------------+-----------------+---------------------------------------+-------------+
    | VIRTUAL_PAGE_SIZE_INDEX_EXT       | Z+    | GetTexParameteriv   | 0               | Virtual page size index               | 8.17sparse  |
    | TEXTURE_SPARSE_EXT                | B     | GetTexParameteriv   | FALSE           | Texture sparseness                    | 8.17sparse  |
    | NUM_SPARSE_LEVELS_EXT             | Z+    | GetTexParameteriv   | 0               | Number of potentially sparse levels   | 8.17sparse  |
    +-----------------------------------+-------+---------------------+-----------------+---------------------------------------+-------------+

New Implementation Dependent State

    Append to Table 20.41, "Implementation Dependent Values"

    +--------------------------------------------+-------+-------------+-----------------+---------------------------------------+-------+
    | Get Value                                  | Type  | Get Command | Minimum Value   | Description                           | Sec.  |
    +--------------------------------------------+-------+-------------+-----------------+---------------------------------------+-------+
    | MAX_SPARSE_TEXTURE_SIZE_EXT                | Z+    | GetIntegerv | 2048            | Maximum 1D/2D/rectangle texture image | 8.19  |
    |                                            |       |             |                 | dimension for a sparse texture.       |       |
    | MAX_SPARSE_3D_TEXTURE_SIZE_EXT             | Z+    | GetIntegerv | 256             | Maximum 3D texture image dimension    | 8.19  |
    |                                            |       |             |                 | for a sparse texture.                 |       |
    | MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT        | Z+    | GetIntegerv | 256             | Maximum number of layers in a sparse  | 8.19  |
    |                                            |       |             |                 | array texture.                        |       |
    | SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT | B     | GetBooleanv | -               | TRUE if there are no restrictions on  | 8.19  |
    |                                            |       |             |                 | the allocation of mipmaps in sparse   |       |
    |                                            |       |             |                 | textures and FALSE otherwise.         |       |
    +--------------------------------------------+-------+-------------+-----------------+---------------------------------------+-------+

    (Note the values of MAX_SPARSE_TEXTURE_SIZE_EXT, MAX_SPARSE_3D_TEXTURE_SIZE_EXT,
    MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT must be at least as high as the
    corresponding non-sparse maximums. These values were 16384, 2048, and
    2048 respectively in ARB_sparse_texture, reflecting the desktop texture
    size limits. They were reduced in this extension to reflect the ES 3.1
    limits of 2048, 256, and 256.)

Dependencies on OES_texture_view and EXT_texture_view

    If neither OES_texture_view nor EXT_texture_view is supported,
    then remove all references to texture views.

Dependencies on OES_texture_border_clamp

    If OES_texture_border_clamp is not supported, ignore all references
    to TexParameterI{u}ivOES and GetTexParameterI{u}ivOES.

Dependencies on EXT_texture_border_clamp

    If EXT_texture_border_clamp is not supported, ignore all references
    to TexParameterI{u}ivEXT and GetTexParameterI{u}ivEXT.

Dependencies on OES_texture_cube_map_array and EXT_texture_cube_map_array

    If neither OES_texture_cube_map_array nor EXT_texture_cube_map_array is
    supported, ignore all references to cube map array textures and
    TEXTURE_CUBE_MAP_ARRAY_OES.

    If OES_texture_cube_map_array is not supported, but
    EXT_texture_cube_map_array is, replace all occurrences of
    TEXTURE_CUBE_MAP_ARRAY_OES with TEXTURE_CUBE_MAP_ARRAY_EXT.

Dependencies on EXT_texture_norm16

    If EXT_texture_norm16 is not supported, remove references to
    all texture formats added by that extension. These are:
    R16_EXT, R16_SNORM_EXT, RG16_EXT, RG16_SNORM_EXT, RGB16_EXT,
    RGB16_SNORM_EXT, RGBA16_EXT, and RGBA16_SNORM_EXT.

Dependencies on GL_EXT_direct_state_access

    If the GL_EXT_direct_state_access extension is not supported, remove all
    references to TexturePageCommitmentEXT.

Issues

    Note: Issues 1-9 are the same as those in the OpenGL extension
    ARB_sparse_texture, which can be found in the OpenGL Registry.
    They were retained here to aid in understanding the functionality.

    0) How does this extension differ from ARB_sparse_texture?

        * It was rebased against OpenGL ES 3.1 and suffices converted from
          ARB to EXT.  Interactions with ES extensions were added.
        * References to functions and texture formats not present in
          OpenGL ES were removed (GetDoublev, GetTexImage).

    1) Do we want to mandate specific page sizes for specific formats?

       RESOLVED. No, this functionality is available in EXT_sparse_texture2.

    2) What happened to MIN_SPARSE_LEVEL_AMD from the AMD spec? Do we need it
       here?

       RESOLVED. We changed it to NUM_SPARSE_LEVELS_EXT. MIN_SPARSE_LEVEL_AMD
       could not acceptably describe the case where a texture is technically
       sparse, but no level of the texture may be sparsely populated. The
       AMD specification disallowed creation of such a texture. However, this
       extension does allow creation of a texture that is either wholly
       resident or non-resident. Furthermore, if a view of a sparse texture
       is created starting somewhere in the tail, then that whole view
       is essentially sparse.

    3) Should it be mandatory to support sparse allocation for compressed
       textures?

       RESOLVED: No, but in all likelihood, implementations will support some
       or all compressed texture formats.

    4) Are multisample textures supported? What about depth and stencil
       format textures?

       RESOLVED: No. Depth and stencil format textures are optional to support.
       Providing support would be a case of reporting non-zero for
       NUM_VIRTUAL_PAGE_SIZES_EXT for those formats. Multi-sample textures
       are explicitly not supported by this extension as their targets are
       excluded from TexStorage* support. Allowing support for these would
       require a new extension, if only to remove the error generated
       if one of the multi-sample targets is used with TexStorage* when
       the sparse flag is set.

    5) Do we need language clarifying completeness and the effects of
       residency on completeness?

       RESOLVED: Currently, there is no language. Textures allocated by
       TexStorage* (which include all sparse textures) are always complete.
       Residency doesn't effect that and sampling from them is well defined
       (or explicitly undefined).

    6) Can commitment fail? What happens if it does?

       RESOLVED: An OUT_OF_MEMORY error is generated if physical backing cannot
       be allocated for the previously allocated virtual space. No language
       is added here as it is implicit that any command can generate
       OUT_OF_MEMORY at any time for any reason... which includes new commands
       introduced here.

    7) Please explain, in plain English, what the rules are governing the size
       of a texture's base level, mipmap levels, and the 'tail'.

       The base level of the texture must be an integer multiple of the page
       size in each dimension. This need not be a power of two or square or
       anything of that nature. As we proceed along the mipmap chain, the
       current level will become smaller and smaller, at each step halving in
       size. At some point, the level dimensions will no longer be an integer
       multiple of the page size, where the memory corresponding to that level
       and smaller sized levels may not be evenly divided into pages.  The
       memory allocated to such levels may not be naturally aligned on memory
       page boundaries or may be too small to bother with partial residency.
       Implementations are permitted to treat such a level and all subsequent
       levels as either fully resident or fully non-resident.  We refer to
       this set of levels as the mipmap "tail".  The set of levels belonging
       to the tail is implementation-dependent.  Some implementations may
       start the tail at the first level where any dimension is not the
       multiple of a page size; others might pad out such allocations to page
       boundaries and start the tail at a much smaller mipmap level.  The tail
       is made resident or non-resident as a unit; the tail is resident if and
       only if <resident> was TRUE for the last call to TexPageCommitmentEXT
       when <level> was any value in the tail.

       Clearly, making the base level a square power of two multiple of the
       page size will mean that the greatest part of the texture can be sparse
       and will minimize the size of the tail. However, it's perfectly legal,
       with a hypothetical 256 x 256 texel page size to create a texture with
       a base level of 4096 x 256. Such a texture can be sparse in the base
       level, but level 1 would be 2048 x 128, which is no longer a multiple
       of the page size, and therefore might be considered as the start of the
       tail.

    8) What's SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT for?

       Some implementations may store the mipmap chain for array textures
       and cubemaps such that the presence and size of mipmaps affects the
       alignment of the start of each layer, even in the base level. Consider
       an implementation that stores all layers of level 0, then all of
       level 1, then all of level 2 and so on. The presence of a mipmap chain
       (or lack thereof) would have no effect on the alignment of layers 1
       through N of the array (or cubemap faces). Now, consider an
       implementation that stores all of the levels for layer 0, then all
       levels of layer 1 and so on. The number and size of the levels of the
       texture _would_ have an effect on the alignment of layers 1 through N
       of the texture. If the size of the mipmap chain for a single layer
       causes the next layer to become misaligned to the page size in linear
       address space, then the texture cannot be sparsely populated. This flag
       indicates whether the implementation has any restrictions on the size
       of the mipmap chain. In particular, these restrictions ensure that,
       while the texture may have mipmaps, the total size of the mipmap chain
       for each level still satisfies the alignment restrictions required by
       that implementation's virtual memory subsystem.

    9) What happens when you create a view of a sparse texture?

       RESOLVED: That view is sparse, as are views of that view and so on.
       Also, if the view hits the tail, then modifications of tail residency
       via the view affect the whole tail of the parent texture.

Revision History

    Rev.    Date      Author    Changes
    ----  ----------  --------  -----------------------------------------
     3    03/27/2015  dkoch     update status and contributors
     2    02/25/2015  xiche     Additional interaction with GetInternalformativ
     1    11/13/2014  dkoch     Initial version based on ARB_sparse_texture v11
