• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • NVIDIA DRIVE OS Linux SDK API Reference

    6.0.8 Release
    All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
    GL_EXT_sparse_texture
    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
    
    人人超碰97caoporen国产