| Name | 
 |  | 
 |     ARB_sparse_texture2 | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_ARB_sparse_texture2 | 
 |  | 
 | Contact | 
 |  | 
 |     Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com) | 
 |     Piers Daniell, NVIDIA Corporation (pdaniell 'at' nvidia.com) | 
 |  | 
 | Contributors | 
 |  | 
 |     Jeff Bolz, NVIDIA Corporation | 
 |     Mathias Heyer, NVIDIA Corporation | 
 |     Eric Werness, NVIDIA Corporation | 
 |  | 
 | Notice | 
 |  | 
 |     Copyright (c) 2015 The Khronos Group Inc. Copyright terms at | 
 |         http://www.khronos.org/registry/speccopyright.html | 
 |  | 
 | Specification Update Policy | 
 |  | 
 |     Khronos-approved extension specifications are updated in response to | 
 |     issues and bugs prioritized by the Khronos OpenGL Working Group. For | 
 |     extensions which have been promoted to a core Specification, fixes will | 
 |     first appear in the latest version of that core Specification, and will | 
 |     eventually be backported to the extension document. This policy is | 
 |     described in more detail at | 
 |         https://www.khronos.org/registry/OpenGL/docs/update_policy.php | 
 |  | 
 | Status | 
 |  | 
 |     Complete. Approved by the ARB on June 26, 2015. | 
 |     Ratified by the Khronos Board of Promoters on August 7, 2015. | 
 |  | 
 | Version | 
 |  | 
 |     Last Modified Date:         May 26, 2015 | 
 |     Revision:                   3 | 
 |  | 
 | Number | 
 |  | 
 |     ARB Extension #186 | 
 |  | 
 | Dependencies | 
 |  | 
 |     This extension is written against the OpenGL 4.5 Specification | 
 |     (Compatibility Profile), dated February 2, 2015. | 
 |  | 
 |     This extension is written against the OpenGL Shading Language | 
 |     Specification, version 4.50, revision 5. | 
 |  | 
 |     When implemented in OpenGL, this extension requires and extends | 
 |     ARB_sparse_texture. | 
 |  | 
 |     This extension interacts trivially with EXT_depth_bounds_test. | 
 |  | 
 |     This extension interacts with NV_gpu_program4 and NV_gpu_program5. | 
 |  | 
 | Overview | 
 |  | 
 |     This extension builds on the ARB_sparse_texture extension, providing the | 
 |     following new functionality: | 
 |  | 
 |       * New built-in GLSL texture lookup and image load functions are provided | 
 |         that return information on whether the texels accessed for the texture | 
 |         lookup accessed uncommitted texture memory. | 
 |  | 
 |       * New built-in GLSL texture lookup functions are provided that specify a | 
 |         minimum level of detail to use for lookups where the level of detail | 
 |         is computed automatically.  This allows shaders to avoid accessing | 
 |         unpopulated portions of high-resolution levels of detail when it knows | 
 |         that the memory accessed is unpopulated, either from a priori | 
 |         knowledge or from feedback provided by the return value of previously | 
 |         executed "sparse" texture lookup functions. | 
 |  | 
 |       * Reads of uncommitted texture memory will act as though such memory | 
 |         were filled with zeroes; previously, the values returned by reads were | 
 |         undefined. | 
 |  | 
 |       * Standard implementation-independent virtual page sizes for internal | 
 |         formats required to be supported with sparse textures. These standard | 
 |         sizes can be requested by leaving VIRTUAL_PAGE_SIZE_INDEX_ARB at its | 
 |         initial value (0). | 
 |  | 
 |       * Support for creating sparse multisample and multisample array textures | 
 |         is added.  However, the virtual page sizes for such textures remain | 
 |         fully implementation-dependent. | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |     None. | 
 |  | 
 | New Tokens | 
 |  | 
 |     None. | 
 |  | 
 | Modifications to the OpenGL 4.5 Specification (Compatibility Profile) | 
 |  | 
 |     Modify Section 8.10, Texture Parameters, p. 264 | 
 |  | 
 |     (modify the following Errors section entry for TexParameter*, added by | 
 |     ARB_sparse_texture, to allow for sparse multisample and multisample array | 
 |     textures) | 
 |  | 
 |         INVALID_VALUE is generated if <pname> is TEXTURE_SPARSE_ARB, <pname> | 
 |     is TRUE and <target> is not one of TEXTURE_2D, TEXTURE_2D_ARRAY, | 
 |     TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY, TEXTURE_3D, TEXTURE_RECTANGLE, | 
 |     TEXTURE_2D_MULTISAMPLE, or TEXTURE_2D_MULTISAMPLE_ARRAY. | 
 |  | 
 |  | 
 |     Modify the edits to Section 8.19 (Immutable-Format Texture Images), as | 
 |     made by ARB_sparse_texture | 
 |  | 
 |     (remove the following language from the "p. 233" edits starting with "If | 
 |      TEXTURE_SPARSE_ARB is TRUE"; there is no longer a restriction on the base | 
 |      size of a sparse texture allocation) | 
 |  | 
 |     [REMOVED LANGUAGE] ... 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. ... | 
 |  | 
 |     (remove the following TexStorage error added by ARB_sparse_texture; there | 
 |      is no longer a restriction on the base size of a sparse texture | 
 |      allocation) | 
 |  | 
 |     [REMOVED LANGUAGE] An INVALID_VALUE error is generated if | 
 |     TEXTURE_SPARSE_ARB is TRUE and <width>, <height> or <depth> is is not an | 
 |     integer multiple of the page size in the corresponding dimension. | 
 |  | 
 |     (remove the error language beginning with "If the value of | 
 |      SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB is FALSE", and replace with | 
 |      the following) | 
 |  | 
 |     In older extensions supporting sparse textures, the constant | 
 |     SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB was provided to advertise | 
 |     implementation-dependent limitations potentially prohibiting the | 
 |     allocation of array or cube map textures with full mipmap chains.  No such | 
 |     limitations apply in this extension.  This constant is retained for | 
 |     backwards compatibility, but all implementations of this extension must | 
 |     return TRUE. | 
 |  | 
 |  | 
 |     Modify Section 8.20.1 of ARB_sparse_texture (Allocation of and Access to | 
 |     Sparse Textures) | 
 |  | 
 |     (insert after the two paragraphs discussing VIRTUAL_PAGE_SIZE_INDEX_ARB) | 
 |  | 
 |     When leaving the VIRTUAL_PAGE_SIZE_INDEX_ARB texture parameter at its | 
 |     initial value (0), the virtual page size for many non-multisample sparse | 
 |     textures can be found in Table 8.X. If the internal format of the texture | 
 |     is not listed in Table 8.X or if the texture target is | 
 |     TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY, or TEXTURE_3D, the | 
 |     virtual page size for index zero is fully implementation- | 
 |     dependent. Otherwise, the virtual page size of such a texture comes from | 
 |     the value listed in the value listed in the "2D Page Size" column. | 
 |  | 
 |       Internal Format      2D Page Size | 
 |       ---------------      ------------- | 
 |       R8                   256 x 256 x 1 | 
 |       R8_SNORM | 
 |       R8I | 
 |       R8UI | 
 |  | 
 |       R16                  256 x 128 x 1 | 
 |       R16_SNORM | 
 |       RG8 | 
 |       RG8_SNORM | 
 |       RGB565 | 
 |       R16F | 
 |       R16I | 
 |       R16UI | 
 |       RG8I | 
 |       RG8UI | 
 |  | 
 |       RG16                 128 x 128 x 1 | 
 |       RG16_SNORM | 
 |       RGBA8 | 
 |       RGBA8_SNORM | 
 |       RGB10_A2 | 
 |       RGB10_A2UI | 
 |       RG16F | 
 |       R32F | 
 |       R11F_G11F_B10F | 
 |       RGB9_E5 | 
 |       R32I | 
 |       R32UI | 
 |       RG16I | 
 |       RG16UI | 
 |       RGBA8I | 
 |       RGBA8UI | 
 |  | 
 |       RGBA16               128 x 64 x 1 | 
 |       RGBA16_SNORM | 
 |       RGBA16F | 
 |       RG32F | 
 |       RG32I | 
 |       RG32UI | 
 |       RGBA16I | 
 |       RGBA16UI | 
 |  | 
 |       RGBA32F              64 x 64 x 1 | 
 |       RGBA32I | 
 |       RGBA32UI | 
 |  | 
 |       Table 8.X, Standard Virtual Page Sizes for Sparse Textures | 
 |  | 
 |  | 
 |     (modify first bullet under "When a sparsely committed texture is accessed | 
 |      by the GL" at the end of the section) | 
 |  | 
 |         * Reads from such regions behave as if the data in texture memory for | 
 |           all components present in the texture format were zero.  This | 
 |           includes samples required for the implementation of texture | 
 |           filtering, image loads, mipmap generation, and so on.  For texture | 
 |           and image loads, components not present in the texture format (e.g., | 
 |           alpha in a texture with an RGB base internal format) will return | 
 |           default values, as in non-sparse textures. | 
 |  | 
 |     (modify third bullet under "When a sparsely committed texture is accessed | 
 |      by the GL" at the end of the section) | 
 |  | 
 |         * Atomic operations operating on uncommitted regions will not generate | 
 |           exceptions but will always return zero.  The result of the atomic | 
 |           operation, which is normally written to memory, will instead be | 
 |           discarded. | 
 |  | 
 |     (add new bullets under "When a sparsely committed texture is accessed by | 
 |      the GL" at the end of the section) | 
 |  | 
 |         * When performing the stencil test (section 17.3.5), depth buffer test | 
 |           (section 17.3.6), or depth bounds test on pixels in uncommitted | 
 |           regions, the results of the test will be consistent with reading a | 
 |           value of zero from the framebuffer.  No value is written to the | 
 |           depth buffer. | 
 |  | 
 |     (add a new paragraph at the end of the section) | 
 |  | 
 |     The OpenGL Shading Language provides built-in functions that perform a | 
 |     texture fetch or image load and return sparse texture status information | 
 |     to the caller.  The status information can be queried by the built-in | 
 |     function sparseTexelsResidentARB(), which returns false if the lookup | 
 |     function read one or more uncommitted texels and true otherwise.  For the | 
 |     purposes of this query, texels addressed by a filter normally computing a | 
 |     weighted average of multiple texels (e.g., LINEAR) will be considered to | 
 |     access only those texels with non-zero weights. | 
 |  | 
 |  | 
 |     Modify Section 8.20.2 of ARB_sparse_texture (Controlling Sparse Texture | 
 |     Commitment) | 
 |  | 
 |     (modify the fifth paragraph of the section from ARB_sparse_texture, | 
 |     starting with "For levels of a sparse texture where..." to guarantee that | 
 |     any level greater than or equal to the page size in all dimensions can be | 
 |     sparsely populated) | 
 |  | 
 |     For levels of a sparse texture where each dimension is greater than or | 
 |     equal to of the virtual page size, the residency of individual page-size | 
 |     regions is controlled by TexPageCommitmentARB and such levels may be | 
 |     partially populated.  When the mipmap chain reaches a level that is not | 
 |     greater than or equal to 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.  ... | 
 |  | 
 |  | 
 | Modifications to the OpenGL Shading Language Specification, Version 4.50 | 
 |  | 
 |     Including the following line in a shader can be used to control the | 
 |     language features described in this extension: | 
 |  | 
 |       #extension GL_ARB_sparse_texture2 : <behavior> | 
 |  | 
 |     where <behavior> is as specified in section 3.3. | 
 |  | 
 |     New preprocessor #defines are added to the OpenGL Shading Language: | 
 |  | 
 |       #define GL_ARB_sparse_texture2            1 | 
 |  | 
 |     Modify Section 8.9.2, Texel Lookup Functions, p. 162 | 
 |  | 
 |     (This extension adds one new variant of texture lookup functions. The | 
 |     "sparse" functions are like normal texture lookup functions, except that | 
 |     they return a sparse texture residency status to the caller and return the | 
 |     actual filtered texel value in an "out" parameter. | 
 |  | 
 |     For each set of texture functions, we provide one to three new variants | 
 |     based on whether sparse functionality is desired. This new variant copies | 
 |     the existing functions, adds suffixes to the function names, and adds one or | 
 |     more new parameters. | 
 |  | 
 |     We create a new variant only for the targets for which sparse storage is | 
 |     supported -- no new functions are added for the following sampler types: | 
 |     gsampler1D, sampler1DShadow, gsampler1DArray, sampler1DArrayShadow. | 
 |     Additionally, to reduce the number of new functions added, we are not | 
 |     including any new variants for textureProj*() built-ins.  To use the new | 
 |     features with projective texture lookups, shaders can divide through by q | 
 |     and use non-projective variants.) | 
 |  | 
 |     (insert new lookup function table cells, at the end of the section, | 
 |     p. 168) | 
 |  | 
 |     Syntax: | 
 |  | 
 |       int sparseTextureARB(gsampler2D sampler, vec2 P, | 
 |                            out gvec4 texel [, float bias]); | 
 |       int sparseTextureARB(gsampler3D sampler, vec3 P, | 
 |                            out gvec4 texel [, float bias]); | 
 |       int sparseTextureARB(gsamplerCube sampler, vec3 P, | 
 |                            out gvec4 texel [, float bias]); | 
 |       int sparseTextureARB(sampler2DShadow sampler, vec3 P, | 
 |                            out float texel [, float bias]); | 
 |       int sparseTextureARB(samplerCubeShadow sampler, vec4 P, | 
 |                            out float texel [, float bias]); | 
 |       int sparseTextureARB(gsampler2DArray sampler, vec3 P, | 
 |                            out gvec4 texel [, float bias]); | 
 |       int sparseTextureARB(gsamplerCubeArray sampler, vec4 P, | 
 |                            out gvec4 texel [, float bias]); | 
 |       int sparseTextureARB(sampler2DArrayShadow sampler, vec4 P, | 
 |                            out float texel); | 
 |       int sparseTextureARB(gsampler2DRect sampler, vec2 P, | 
 |                            out gvec4 texel); | 
 |       int sparseTextureARB(sampler2DRectShadow sampler, vec3 P, | 
 |                            out float texel); | 
 |       int sparseTextureARB(samplerCubeArrayShadow sampler, vec4 P, | 
 |                            float compare, out float texel); | 
 |  | 
 |     Description: | 
 |  | 
 |     Do a filtered texture lookup as in texture(), but return texture access | 
 |     residency information from the function and the filtered lookup result in | 
 |     the out parameter <texel>. | 
 |  | 
 |     -- | 
 |  | 
 |  | 
 |     Syntax: | 
 |  | 
 |       int sparseTextureLodARB(gsampler2D sampler, vec2 P, float lod, | 
 |                               out gvec4 texel); | 
 |       int sparseTextureLodARB(gsampler3D sampler, vec3 P, float lod, | 
 |                               out gvec4 texel); | 
 |       int sparseTextureLodARB(gsamplerCube sampler, vec3 P, float lod, | 
 |                               out gvec4 texel); | 
 |       int sparseTextureLodARB(sampler2DShadow sampler, vec3 P, float lod, | 
 |                               out float texel); | 
 |       int sparseTextureLodARB(gsampler2DArray sampler, vec3 P, float lod, | 
 |                               out gvec4 texel); | 
 |       int sparseTextureLodARB(gsamplerCubeArray sampler, vec4 P, float lod, | 
 |                               out gvec4 texel); | 
 |  | 
 |     Description: | 
 |  | 
 |     Do a filtered texture lookup as in textureLod(), but return texture access | 
 |     residency information from the function and the filtered lookup result in | 
 |     the out parameter <texel>. | 
 |  | 
 |     -- | 
 |  | 
 |     Syntax: | 
 |  | 
 |       int sparseTextureOffsetARB(gsampler2D sampler, vec2 P, | 
 |                                  ivec2 offset, out gvec4 texel | 
 |                                  [, float bias]); | 
 |       int sparseTextureOffsetARB(gsampler3D sampler, vec3 P, | 
 |                                  ivec3 offset, out gvec4 texel | 
 |                                  [, float bias]); | 
 |       int sparseTextureOffsetARB(gsampler2DRect sampler, vec2 P, | 
 |                                  ivec2 offset, out gvec4 texel); | 
 |       int sparseTextureOffsetARB(sampler2DRectShadow sampler, vec3 P, | 
 |                                  ivec2 offset, out float texel); | 
 |       int sparseTextureOffsetARB(sampler2DShadow sampler, vec3 P, | 
 |                                  ivec2 offset, out float texel | 
 |                                  [, float bias]); | 
 |       int sparseTextureOffsetARB(gsampler2DArray sampler, vec3 P, | 
 |                                  ivec2 offset, out gvec4 texel | 
 |                                  [, float bias]); | 
 |       int sparseTextureOffsetARB(sampler2DArrayShadow sampler, vec4 P, | 
 |                                  ivec2 offset, out float texel); | 
 |  | 
 |     Description: | 
 |  | 
 |     Do a filtered texture lookup as in textureOffset(), but return texture | 
 |     access residency information from the function and the filtered lookup | 
 |     result in the out parameter <texel>. | 
 |  | 
 |     -- | 
 |  | 
 |     Syntax: | 
 |  | 
 |       int sparseTexelFetchARB(gsampler2D sampler, ivec2 P, int lod, | 
 |                               out gvec4 texel); | 
 |       int sparseTexelFetchARB(gsampler3D sampler, ivec3 P, int lod, | 
 |                               out gvec4 texel); | 
 |       int sparseTexelFetchARB(gsampler2DRect sampler, ivec2 P, | 
 |                               out gvec4 texel); | 
 |       int sparseTexelFetchARB(gsampler2DArray sampler, ivec3 P, int lod, | 
 |                               out gvec4 texel); | 
 |       int sparseTexelFetchARB(gsampler2DMS sampler, ivec2 P, int sample, | 
 |                               out gvec4 texel); | 
 |       int sparseTexelFetchARB(gsampler2DMSArray sampler, ivec3 P, int sample, | 
 |                               out gvec4 texel); | 
 |  | 
 |     Description: | 
 |  | 
 |     Do a single texel fetch as in texelFetch(), but return texture access | 
 |     residency information from the function and the fetched texel in the out | 
 |     parameter <texel>. | 
 |  | 
 |     -- | 
 |  | 
 |     Syntax: | 
 |  | 
 |       int sparseTexelFetchOffsetARB(gsampler2D sampler, ivec2 P, int lod, | 
 |                                     ivec2 offset, out gvec4 texel); | 
 |       int sparseTexelFetchOffsetARB(gsampler3D sampler, ivec3 P, int lod, | 
 |                                     ivec3 offset, out gvec4 texel); | 
 |       int sparseTexelFetchOffsetARB(gsampler2DRect sampler, ivec2 P, | 
 |                                     ivec2 offset, out gvec4 texel); | 
 |       int sparseTexelFetchOffsetARB(gsampler2DArray sampler, ivec3 P, int lod, | 
 |                                     ivec2 offset, out gvec4 texel); | 
 |  | 
 |     Description: | 
 |  | 
 |     Do a single texel fetch as in texelFetchOffset(), but return texture | 
 |     access residency information from the function and the fetched texel in | 
 |     the out parameter <texel>. | 
 |  | 
 |     -- | 
 |  | 
 |     Syntax: | 
 |  | 
 |       int sparseTextureLodOffsetARB(gsampler2D sampler, vec2 P, | 
 |                                     float lod, ivec2 offset, | 
 |                                     out gvec4 texel); | 
 |       int sparseTextureLodOffsetARB(gsampler3D sampler, vec3 P, | 
 |                                     float lod, ivec3 offset, | 
 |                                     out gvec4 texel); | 
 |       int sparseTextureLodOffsetARB(sampler2DShadow sampler, vec3 P, | 
 |                                     float lod, ivec2 offset, | 
 |                                     out float texel); | 
 |       int sparseTextureLodOffsetARB(gsampler2DArray sampler, vec3 P, | 
 |                                     float lod, ivec2 offset, | 
 |                                     out gvec4 texel); | 
 |  | 
 |     Description: | 
 |  | 
 |     Do a filtered texture lookup as in textureLodOffset(), but return texture | 
 |     access residency information from the function and the filtered lookup | 
 |     result in the out parameter <texel>. | 
 |  | 
 |     -- | 
 |  | 
 |     Syntax: | 
 |  | 
 |       int sparseTextureGradARB(gsampler2D sampler, vec2 P, | 
 |                                vec2 dPdx, vec2 dPdy, | 
 |                                out gvec4 texel); | 
 |       int sparseTextureGradARB(gsampler3D sampler, vec3 P, | 
 |                                vec3 dPdx, vec3 dPdy, | 
 |                                out gvec4 texel); | 
 |       int sparseTextureGradARB(gsamplerCube sampler, vec3 P, | 
 |                                vec3 dPdx, vec3 dPdy, | 
 |                                out gvec4 texel); | 
 |       int sparseTextureGradARB(gsampler2DRect sampler, vec2 P, | 
 |                                vec2 dPdx, vec2 dPdy, | 
 |                                out gvec4 texel); | 
 |       int sparseTextureGradARB(sampler2DRectShadow sampler, vec3 P, | 
 |                                vec2 dPdx, vec2 dPdy, | 
 |                                out float texel); | 
 |       int sparseTextureGradARB(sampler2DShadow sampler, vec3 P, | 
 |                                vec2 dPdx, vec2 dPdy, | 
 |                                out float texel); | 
 |       int sparseTextureGradARB(samplerCubeShadow sampler, vec4 P, | 
 |                                vec3 dPdx, vec3 dPdy, | 
 |                                out float texel); | 
 |       int sparseTextureGradARB(gsampler2DArray sampler, vec3 P, | 
 |                                vec2 dPdx, vec2 dPdy, | 
 |                                out gvec4 texel); | 
 |       int sparseTextureGradARB(sampler2DArrayShadow sampler, vec4 P, | 
 |                                vec2 dPdx, vec2 dPdy, | 
 |                                out float texel); | 
 |       int sparseTextureGradARB(gsamplerCubeArray sampler, vec4 P, | 
 |                                vec3 dPdx, vec3 dPdy, | 
 |                                out gvec4 texel); | 
 |  | 
 |     Description: | 
 |  | 
 |     Do a filtered texture lookup as in textureGrad(), but return texture | 
 |     access residency information from the function and the filtered lookup | 
 |     result in the out parameter <texel>. | 
 |  | 
 |     -- | 
 |  | 
 |     Syntax: | 
 |  | 
 |       int sparseTextureGradOffsetARB(gsampler2D sampler, vec2 P, | 
 |                                      vec2 dPdx, vec2 dPdy, ivec2 offset, | 
 |                                      out gvec4 texel); | 
 |       int sparseTextureGradOffsetARB(gsampler3D sampler, vec3 P, | 
 |                                      vec3 dPdx, vec3 dPdy, ivec3 offset, | 
 |                                      out gvec4 texel); | 
 |       int sparseTextureGradOffsetARB(gsampler2DRect sampler, vec2 P, | 
 |                                      vec2 dPdx, vec2 dPdy, ivec2 offset, | 
 |                                      out gvec4 texel); | 
 |       int sparseTextureGradOffsetARB(sampler2DRectShadow sampler, vec3 P, | 
 |                                      vec2 dPdx, vec2 dPdy, ivec2 offset, | 
 |                                      out float texel); | 
 |       int sparseTextureGradOffsetARB(sampler2DShadow sampler, vec3 P, | 
 |                                      vec2 dPdx, vec2 dPdy, ivec2 offset, | 
 |                                      out float texel); | 
 |       int sparseTextureGradOffsetARB(gsampler2DArray sampler, vec3 P, | 
 |                                      vec2 dPdx, vec2 dPdy, ivec2 offset, | 
 |                                      out gvec4 texel); | 
 |       int sparseTextureGradOffsetARB(sampler2DArrayShadow sampler, vec4 P, | 
 |                                      vec2 dPdx, vec2 dPdy, ivec2 offset, | 
 |                                      out float texel); | 
 |  | 
 |     Description: | 
 |  | 
 |     Do a filtered texture lookup as in textureGradOffset(), but return texture | 
 |     access residency information from the function and the filtered lookup | 
 |     result in the out parameter <texel>. | 
 |  | 
 |  | 
 |  | 
 |     Modify Section 8.9.3, Texel Gather Functions, p. 161 | 
 |  | 
 |     (insert new lookup function table cells, at the end of the section, | 
 |     p. 163) | 
 |  | 
 |     Syntax: | 
 |  | 
 |       int sparseTextureGatherARB(gsampler2D sampler, vec2 P, | 
 |                                  out gvec4 texel [, int comp]); | 
 |       int sparseTextureGatherARB(gsampler2DArray sampler, vec3 P, | 
 |                                  out gvec4 texel [, int comp]); | 
 |       int sparseTextureGatherARB(gsamplerCube sampler, vec3 P, | 
 |                                  out gvec4 texel [, int comp]); | 
 |       int sparseTextureGatherARB(gsamplerCubeArray sampler, vec4 P, | 
 |                                  out gvec4 texel [, int comp]); | 
 |       int sparseTextureGatherARB(gsampler2DRect sampler, vec2 P, | 
 |                                  out gvec4 texel [, int comp]); | 
 |       int sparseTextureGatherARB(gsampler2DShadow sampler, vec2 P, | 
 |                                  float refZ, out vec4 texel); | 
 |       int sparseTextureGatherARB(gsampler2DArrayShadow sampler, vec3 P, | 
 |                                  float refZ, out vec4 texel); | 
 |       int sparseTextureGatherARB(gsamplerCubeShadow sampler, vec3 P, | 
 |                                  float refZ, out vec4 texel); | 
 |       int sparseTextureGatherARB(gsamplerCubeArrayShadow sampler, vec4 P, | 
 |                                  float refZ, out vec4 texel); | 
 |       int sparseTextureGatherARB(gsampler2DRectShadow sampler, vec2 P, | 
 |                                  float refZ, out vec4 texel); | 
 |  | 
 |     Description: | 
 |  | 
 |     Do a texture gather operation as in textureGather(), but return texture | 
 |     access residency information from the function and the filtered lookup | 
 |     result in the out parameter <texel>. | 
 |  | 
 |     -- | 
 |  | 
 |     Syntax: | 
 |  | 
 |       int sparseTextureGatherOffsetARB(gsampler2D sampler, vec2 P, | 
 |                                        ivec2 offset, out gvec4 texel | 
 |                                        [, int comp]); | 
 |       int sparseTextureGatherOffsetARB(gsampler2DArray sampler, vec3 P, | 
 |                                        ivec2 offset, out gvec4 texel | 
 |                                        [, int comp]); | 
 |       int sparseTextureGatherOffsetARB(gsampler2DRect sampler, vec2 P, | 
 |                                        ivec2 offset, out gvec4 texel | 
 |                                        [, int comp]); | 
 |       int sparseTextureGatherOffsetARB(gsampler2DShadow sampler, vec2 P, | 
 |                                        float refZ, ivec2 offset, | 
 |                                        out vec4 texel); | 
 |       int sparseTextureGatherOffsetARB(gsampler2DArrayShadow sampler, vec3 P, | 
 |                                        float refZ, ivec2 offset, | 
 |                                        out vec4 texel); | 
 |       int sparseTextureGatherOffsetARB(gsampler2DRectShadow sampler, vec2 P, | 
 |                                        float refZ, ivec2 offset, | 
 |                                        out vec4 texel); | 
 |  | 
 |     Description: | 
 |  | 
 |     Do a texture gather operation as in textureGatherOffset(), but return | 
 |     texture access residency information from the function and the filtered | 
 |     lookup result in the out parameter <texel>. | 
 |  | 
 |     -- | 
 |  | 
 |     Syntax: | 
 |  | 
 |       int sparseTextureGatherOffsetsARB(gsampler2D sampler, vec2 P, | 
 |                                         ivec2 offsets[4], out gvec4 texel | 
 |                                         [, int comp]); | 
 |       int sparseTextureGatherOffsetsARB(gsampler2DArray sampler, vec3 P, | 
 |                                         ivec2 offsets[4], out gvec4 texel | 
 |                                         [, int comp]); | 
 |       int sparseTextureGatherOffsetsARB(gsampler2DRect sampler, vec2 P, | 
 |                                         ivec2 offsets[4], out gvec4 texel | 
 |                                         [, int comp]); | 
 |       int sparseTextureGatherOffsetsARB(gsampler2DShadow sampler, vec2 P, | 
 |                                         float refZ, ivec2 offsets[4], | 
 |                                         out vec4 texel); | 
 |       int sparseTextureGatherOffsetsARB(gsampler2DArrayShadow sampler, vec3 P, | 
 |                                         float refZ, ivec2 offsets[4], | 
 |                                         out vec4 texel); | 
 |       int sparseTextureGatherOffsetsARB(gsampler2DRectShadow sampler, vec2 P, | 
 |                                         float refZ, ivec2 offsets[4], | 
 |                                         out vec4 texel); | 
 |  | 
 |     Description: | 
 |  | 
 |     Do a texture gather operation as in textureGatherOffset(), but return | 
 |     texture access residency information from the function and the filtered | 
 |     lookup result in the out parameter <texel>. | 
 |  | 
 |  | 
 |     Add to the end of Section 8.12, Image Functions, p. 167 | 
 |  | 
 |     (insert new lookup function table cells, at the end of the section, | 
 |     p. 170) | 
 |  | 
 |     Syntax: | 
 |  | 
 |       int sparseImageLoadARB(gimage2D image, ivec2 P, | 
 |                              out gvec4 texel); | 
 |       int sparseImageLoadARB(gimage3D image, ivec3 P, | 
 |                              out gvec4 texel); | 
 |       int sparseImageLoadARB(gimage2DRect image, ivec2 P, | 
 |                              out gvec4 texel); | 
 |       int sparseImageLoadARB(gimageCube image, ivec3 P, | 
 |                              out gvec4 texel); | 
 |       int sparseImageLoadARB(gimage2DArray image, ivec3 P, | 
 |                              out gvec4 texel); | 
 |       int sparseImageLoadARB(gimageCubeArray image, ivec3 P, | 
 |                              out gvec4 texel); | 
 |       int sparseImageLoadARB(gimage2DMS image, ivec2 P, int sample, | 
 |                              out gvec4 texel); | 
 |       int sparseImageLoadARB(gimage2DMSArray image, ivec3 P, int sample, | 
 |                              out gvec4 texel); | 
 |  | 
 |     Description: | 
 |  | 
 |     Loads a texel from the image <image> as in imageLoad(), but return texture | 
 |     access residency information from the function and the filtered lookup | 
 |     result in the out parameter <texel>. | 
 |  | 
 |  | 
 |     Add to the end of Section 8.17, Shader Memory Control Functions, p. 178 | 
 |  | 
 |     Many of the built-in texture lookup functions in sections 8.9.2 and 8.9.3 | 
 |     and the sparseImageLoad() function in section 8.12 can be used to return | 
 |     sparse texture residency information in addition to texel values.  In | 
 |     these functions, the sparse texture residency information is returned by | 
 |     the function as an integer and the texel values are returned in the output | 
 |     parameter <texel>.  The residency information can be interpreted by a | 
 |     built-in function to determine if the lookup accessed any uncommitted | 
 |     texels. | 
 |  | 
 |     Syntax: | 
 |  | 
 |       bool sparseTexelsResidentARB(int code); | 
 |  | 
 |     Description: | 
 |  | 
 |       Returns false if any of the texels accessed by the sparse texture lookup | 
 |       generating <code> were in uncommitted texture memory, and true | 
 |       otherwise. | 
 |  | 
 |  | 
 | Additions to the AGL/GLX/WGL Specifications | 
 |  | 
 |     None. | 
 |  | 
 | Errors | 
 |  | 
 |     None. | 
 |  | 
 | New State | 
 |  | 
 |     None. | 
 |  | 
 | New Implementation Dependent State | 
 |  | 
 |     None. | 
 |  | 
 | Dependencies on EXT_depth_bounds_test | 
 |  | 
 |     If EXT_depth_bounds_test is not supported, references to the depth bounds | 
 |     test should be removed. | 
 |  | 
 | Dependencies on NV_gpu_program4 and NV_gpu_program5 | 
 |  | 
 |     Modify Section 2.X.2, Program Grammar | 
 |  | 
 |     <opModifier>            ::= "SPARSE" | 
 |  | 
 |     <ccMaskRule>            ::= "RESIDENT" | 
 |                               | "NONRESIDENT" | 
 |  | 
 |     Modify Section 2.X.3.7, Program Condition Code Registers | 
 |  | 
 |     (modify the first paragraph) | 
 |  | 
 |     There are two general-purpose four-component condition code registers (CC0 | 
 |     and CC1), where each component of this register is a collection of | 
 |     single-bit flags, including a sign flag (SF), a zero flag (ZF), an | 
 |     overflow flag (OF), and a carry flag (CF).  The values of these registers | 
 |     are undefined at the beginning of program execution.  Additionally, there | 
 |     is a special single-component sparse memory condition code register that | 
 |     holds the status of the most recently executed texture or image load | 
 |     instruction using the "SPARSE" opcode modifier.  This condition code | 
 |     includes a resident flag (RESF) indicating whether all memory accessed by | 
 |     the instruction was populated. | 
 |  | 
 |     Modify Section 2.X.4.1, Program Instruction Modifiers | 
 |  | 
 |     (Update the discussion of instruction precision modifiers.  If | 
 |      GL_NV_gpu_program_fp64 is not found in the extension string, the "F64" | 
 |      instruction modifier described below is not supported.) | 
 |  | 
 |     (add to Table X.14 of the NV_gpu_program4 specification.) | 
 |  | 
 |       Modifier  Description | 
 |       --------  ------------------------------------------------------ | 
 |       SPARSE    Update the sparse memory condition code with status on | 
 |                 whether the memory accessed by a texture or image load | 
 |                 instruction was fully populated. | 
 |  | 
 |     For texture fetch, surface load, and surface atomic instructions, the | 
 |     "SPARSE" modifier specifies that the sparse memory condition code | 
 |     described in Section 2.X.3.7 should be updated to reflect whether the | 
 |     memory accessed by the instruction was fully populated. | 
 |  | 
 |     Modify Section 2.X.4.3, Program Destination Variable Update | 
 |  | 
 |     (add to Table X.16, Condition Code Tests) | 
 |  | 
 |          mask rule         test name                condition | 
 |          ---------------   ----------------------   ----------------- | 
 |          RESIDENT          sparse resident          RESF | 
 |          NONRESIDENT       sparse nonresident       !RESF | 
 |  | 
 |     (also modify the table description) | 
 |  | 
 |       Table X.16, Condition Code Tests.  The allowed rules are specified in | 
 |       the "mask rule" column.  For "RESIDENT" or "NONRESIDENT", all four | 
 |       components of the test result are loaded from the RESF flag of the | 
 |       sparse condition code.  Otherwise, If "0" or "1" is appended ... | 
 |  | 
 |     (modify the paragraph about condition code updates) | 
 |  | 
 |     A program instruction can also optionally update one of the two general | 
 |     condition code registers ... | 
 |  | 
 |     (add a new paragraph about updating CCSPARSE) | 
 |  | 
 |     Additionally, a program instruction accessing memory can optionally update | 
 |     the sparse memory condition code register if the "SPARSE" instruction | 
 |     modifier is specified.  If the memory accessed by the instruction was | 
 |     fully populated, the resident flag (RESF) is set; otherwise, RESF is | 
 |     cleared. | 
 |  | 
 | Issues | 
 |  | 
 |     (1) How does this extension compare to the ARB_sparse_texture extension? | 
 |  | 
 |       RESOLVED:  We extend the mechanisms provided by ARB_sparse_texture in | 
 |       several ways: | 
 |  | 
 |         - We add built-in texture and image lookup functions returning | 
 |           information on memory accesses performed by the built-in functions; | 
 |           in particular, whether any uncommitted memory was referenced. | 
 |  | 
 |         - We specify that all loads and atomics from uncommitted sparse memory | 
 |           behave as though zero were fetched. | 
 |  | 
 |         - We remove the requirement that the base size of a sparse texture | 
 |           must be a multiple of the page size.  Implementations are expected | 
 |           to pad mipmap allocations internally to page size boundaries as | 
 |           required, until the tail is reached. | 
 |  | 
 |         - We modify the definition of the sparse texture mipmap tail, so that | 
 |           all levels greater than or equal to the page size in all dimensions | 
 |           are guaranteed to be sparsely populated (i.e., not in the tail). | 
 |           The previous spec allowed implementations to put levels in the tail | 
 |           if they were not integer multiples of the page size. | 
 |  | 
 |         - We add support for an implementation-independent virtual page size | 
 |           for some formats, instead of depending on querying | 
 |           implementation-dependent page size. For such formats, the default | 
 |           virtual page size index (0) is guaranteed to specify the standard | 
 |           page size. | 
 |  | 
 |         - We require that all implementations of this extension return TRUE | 
 |           for the value of the implementation-dependent constant | 
 |           SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB, which removes some | 
 |           potential errors when allocating sparse array or cube map textures. | 
 |  | 
 |         - We add support for sparse multisample and multisample array | 
 |           textures, but require no implementation-independent virtual page | 
 |           size. | 
 |  | 
 |     (2) How does this extension compare to the AMD_sparse_texture extension? | 
 |  | 
 |       RESOLVED:  This extension, like the AMD extension, provide built-in | 
 |       texture lookup functions returning information on whether uncommitted | 
 |       memory was accessed.  There are several differences between these | 
 |       functions: | 
 |  | 
 |         - This extension uses an "ARB" suffix on built-in function names. | 
 |  | 
 |         - This extension supports sparse accesses for shadow map sampler types | 
 |           (e.g., sampler2DShadow). | 
 |  | 
 |         - This extension supports sparse variants of imageLoad(); the AMD | 
 |           extension does not. | 
 |  | 
 |         - This extension doesn't attempt to support sparse variants of | 
 |           projective texture lookups to reduce the number of texture functions | 
 |           added. | 
 |  | 
 |         - This extension doesn't attempt to support sparse variants of | 
 |           one-dimensional and one-dimensional array texture lookups.  Sparse | 
 |           textures with these targets are explicitly not supported in the ARB | 
 |           extension. | 
 |  | 
 |         - This extension returns the texel data in an "out" parameter and | 
 |           returns a value consistent with sampling zero in any uncommitted | 
 |           texels.  The AMD extension returns the texel data in an "inout" | 
 |           parameter and guarantees not to write to the return value if any | 
 |           uncommitted texel is accessed. | 
 |  | 
 |         - The function sparseTexelResident() from the AMD extension is renamed | 
 |           to sparseTexelsResidentARB().  We use "texels" instead of "texel" in | 
 |           the function name because a texture lookup may access multiple | 
 |           texels, and the code will reflect non-resident status if any of the | 
 |           texels is non-resident. | 
 |  | 
 |       The built-in functions returning zero on reads from uncommitted memory, | 
 |       and the standard virtual page size are not provided by the AMD extension, | 
 |       either. | 
 |  | 
 |       Neither this extension nor ARB_sparse_texture provide the minimum LOD | 
 |       warning feature provided by the AMD extension or the related built-in | 
 |       functions. | 
 |  | 
 |     (3) How should the "sparse" built-in functions return both access status | 
 |         and a texel value? | 
 |  | 
 |       RESOLVED:  We mostly followed the precedent of the AMD extension, where | 
 |       the sparse access status is returned as an integer and the texel values | 
 |       are returning in a vec4-typed "out" parameter.  (This differs slightly | 
 |       from the AMD extension in that it uses an "inout" parameter.) | 
 |  | 
 |       We considered included returning the texel values from the function, | 
 |       just like normal texture lookups, and returning status in a separate | 
 |       "out" parameter (reversing the order).  We also considered returning a | 
 |       structure type containing both the status and the texel.  We ultimately | 
 |       chose to return the status code to more closely match the AMD extension | 
 |       and because we expect that shaders caring to use the "sparse" functions | 
 |       will want to look at the status code first. | 
 |  | 
 |     (4) What data type should we use for the access status information | 
 |         returned by the "sparse" built-in functions? | 
 |  | 
 |       RESOLVED:  We chose to follow the precedent of the AMD extension, where | 
 |       an integer code is returned.  Requiring a separate function call | 
 |       (sparseTexelsResidentARB) is required to reason about the code returned | 
 |       is mildly annoying, but we didn't consider it serious enough to warrant | 
 |       a change. | 
 |  | 
 |       We could have used a "bool" type instead, but chose to stick with "int" | 
 |       for compatibility and for possible future expansion.  The AMD extension | 
 |       also includes built-in functions sparseTexelMinLodWarning() and | 
 |       sparseTexelWarningFetch() that can be used to check the return code for | 
 |       other conditions not supported by this extension.  Shaders that only | 
 |       care about residency information can still check the status in a single | 
 |       (long) line: | 
 |  | 
 |         if (!sparseTexelsResidentARB(sparseTextureARB(sampler, coords, | 
 |                                                       texel)) | 
 |         { | 
 |           // do something about the failure | 
 |         } | 
 |  | 
 |     (5) When using a "sparse" built-in texture function, what RGBA values are | 
 |         generated when the lookup accesses one or more uncommited texels? | 
 |  | 
 |       RESOLVED:  We return a filtered result vector where memory for | 
 |       uncommitted texels is treated as being filled with zeroes.  The data | 
 |       vector returned by the "sparse" functions for this case should exactly | 
 |       match the vector returned by an equivalent non-"sparse" function. | 
 |  | 
 |     (6) For "sparse" built-in texture functions, where should the <texel> | 
 |         return value go relative to other parameters? | 
 |  | 
 |       RESOLVED:  We chose to follow the precedent of the AMD extension, | 
 |       putting it in (approximately) the last parameter.  Note that the | 
 |       optional <bias> parameter of texture() breaks this pattern; we chose to | 
 |       keep the optional bias at the end. | 
 |  | 
 |       Other options considered included:  always first (before the sampler), | 
 |       always second (after the sampler), always third (after the sampler and | 
 |       the base coordinates).  For "always third", note there are a couple | 
 |       cases like shadow lookups in cube arrays where the coordinates are split | 
 |       across multiple parameters and "always third" would be awkward. | 
 |       Additional options are discussed in issue (3). | 
 |  | 
 |     (7) Should we provide sparse variants of the "2DMS" and "2DMSArray" | 
 |         variants of texelFetch() and imageLoad() in this extension? | 
 |  | 
 |       RESOLVED:  Yes.  ARB_sparse_texture doesn't support multisample | 
 |       textures.  In this extension, we lift this restriction, allow them to be | 
 |       accessed using normal built-ins, and provide new functions allowing | 
 |       shaders to determine if uncommitted memory was accessed. | 
 |  | 
 |     (8) How does the feedback provided in the "sparse" built-in texture | 
 |         functions interact with texture filtering modes involving multiple | 
 |         texels? | 
 |  | 
 |       RESOLVED:  The sparse texture lookup status will indicate that | 
 |       uncommitted memory was accessed if any texel read during the filtering | 
 |       operation was uncommitted, but will do so only if the filter weight is | 
 |       non-zero.  When applying a texture filter such as LINEAR_MIPMAP_LINEAR, | 
 |       it's possible that the interpolated texture coordinate lines up exactly | 
 |       at the center of a texel and/or exactly at an integer level of detail. | 
 |       According to the standard filtering equations, eight samples are taken | 
 |       -- four in each of two levels.  However, it's possible that only one of | 
 |       the eight samples has a non-zero weight (if the coordinates hit a texel | 
 |       center and the LOD is an integer). | 
 |  | 
 |       This "non-zero weight" feature may be important for getting proper | 
 |       feedback in some cases, such as displaying a texture tile with an | 
 |       aligned 1:1 mapping of pixels to texels or forcing a specific level of | 
 |       detail in some cases.  Note that when attempting to apply a 1:1 mapping | 
 |       of pixels to texels via an interpolated texture attribute, it's possible | 
 |       that small floating-point errors might produce very small but non-zero | 
 |       weights for neighboring texels.  If avoiding such errors is important | 
 |       and a 1:1 mapping is required, a single-sample filter like NEAREST | 
 |       should be used. | 
 |  | 
 |     (9) Should we support sparse texel fetches and image loads for buffer | 
 |         textures? | 
 |  | 
 |       RESOLVED:  Not in this extension.  This should be handled by a separate | 
 |       extension allowing for the creation and use of sparse buffer resources. | 
 |       Such an extension might also provide the ability to get "sparse" | 
 |       information when non-texture mechanisms are used to access memory (e.g., | 
 |       ARB_shader_storage_buffer_object, NV_shader_buffer_load). | 
 |  | 
 |     (10) Should we support "sparse" variants of the image atomic functions | 
 |          that return information on residency as well as the value normally | 
 |          returned by the atomic operation? | 
 |  | 
 |       RESOLVED:  Not in this extension; it's not clear that there's an | 
 |       important use case for this.  If required, a shader can use imageLoad() | 
 |       to probe the residency of a given texel and ignore the data values | 
 |       returned. | 
 |  | 
 |     (11) This extension is adding a *large* number of new built-in functions. | 
 |          What can we do to control this? | 
 |  | 
 |       RESOLVED:  We chose not to add any "sparse" variants of | 
 |       projective texture lookups (e.g., textureProj).  If required, you can | 
 |       divide through by the "q" texture coordinate and use an equivalent | 
 |       non-projective lookup. | 
 |  | 
 |       We considered the possibility of more significant GLSL syntax changes to | 
 |       reduce the cross-product of different features.  For example, the AMD | 
 |       extension has a function: | 
 |  | 
 |         int sparseTextureProjGradOffset(...); | 
 |  | 
 |       that combines four separate "optional" features (sparse, projection, | 
 |       explicitly specified gradients, and texel offsets) and is supported for | 
 |       six separate texture targets.  One might consider an approach like: | 
 |  | 
 |         #define TEX_IS_PROJECTIVE       0x1 | 
 |         #define TEX_HAS_GRADIENTS       0x2 | 
 |         #define TEX_HAS_TEXEL_OFFSET    0x4 | 
 |         #define TEX_WANTS_SPARSE_STATUS 0x8 | 
 |         struct TexLookup3D { | 
 |           uint          flags;          /* in */ | 
 |           float         q;              /* in */ | 
 |           vec3          ddx, ddy;       /* in */ | 
 |           ivec3         texelOffset;    /* in */ | 
 |           int           sparseStatus;   /* out */ | 
 |         }; | 
 |         ... | 
 |         TexLookup3D lookup; | 
 |         lookup.flags = (TEX_IS_PROJECTIVE | TEX_HAS_GRADIENTS | | 
 |                         TEX_HAS_TEXEL_OFFSET | TEX_WANTS_SPARSE_STATUS); | 
 |         lookup.q = coords.w; | 
 |         lookup.ddx = ddx; | 
 |         lookup.ddy = ddy; | 
 |         lookup.texelOffset = ivec3(-1,+1,+2); | 
 |         texture(sampler, lookup); | 
 |  | 
 |       to handle all possible cases in one interface.  Alternately, a | 
 |       "prettier" C++-style approach with methods on sampler classes could be | 
 |       used. | 
 |  | 
 |       Given that either such feature might involve a large change to the | 
 |       shading language, it seems more appropriate to address this issue in a | 
 |       future core version of a shading language rather than an extension. | 
 |  | 
 |     (12) How does the "reads produce zero" behave if a sparse texture is bound | 
 |          to a framebuffer and used for the depth or stencil test? | 
 |  | 
 |       RESOLVED:  The depth and stencil tests act as though zero were read from | 
 |       the framebuffer.  The actual results of the tests depend on the depth | 
 |       and stencil functions, the incoming depth value, and the stencil | 
 |       reference value. | 
 |  | 
 |       There may be cases where it might be advantageous to configure the depth | 
 |       or stencil tests to fail when touching an unpopulated portion of the | 
 |       depth/stencil buffer.  The "return zero" behavior may work well for some | 
 |       cases (e.g., returning zero when using a depth test of LESS will cause | 
 |       the test to almost always fail), but not as well for others (e.g., depth | 
 |       test of GREATER).  We've chosen not to address this case in the current | 
 |       extension. | 
 |  | 
 |     (13) How does the "reads produce zero" behave for textures that don't have | 
 |          all four components? | 
 |  | 
 |       RESOLVED:  Components that are present in the texture will return zero; | 
 |       others will return default values.  For example, an access to an | 
 |       uncommitted sparse texture whose with a format has no alpha component | 
 |       (e.g, RGB8) will return 1.0 on the alpha channel of the returned RGBA | 
 |       vector.  The handling of "missing" components is the same as for | 
 |       non-sparse textures. | 
 |  | 
 |     (14) Should we provide standard sparse texture page sizes that | 
 |          applications can rely on without having to query the set of supported | 
 |          page sizes for each format it uses?  If so, how will this be handled? | 
 |          Will we have some formats that have standard sizes and others that | 
 |          don't? | 
 |  | 
 |       RESOLVED: Yes; we will provide standard page sizes for some, but not | 
 |       all, formats.  However, we will still allow for implementation- | 
 |       dependent page sizes (as in ARB_sparse_textures) for formats that have a | 
 |       standard page size and allow implementations to support sparse textures | 
 |       on formats for which a standard page size is not available.  The basic | 
 |       page sizes we use arrange sparse textures into 64KB pages and attempt to | 
 |       keep the X and Y dimensions of the page roughly equal. | 
 |  | 
 |     (15) Should we add specific compressed formats to the required formats list | 
 |          and provide standard page sizes? | 
 |  | 
 |       RESOLVED:  Not in this extension.  Note that the current | 
 |       ARB_sparse_texture extension already allows implementations to support | 
 |       compressed formats. | 
 |  | 
 |       We've chosen not to go to the trouble of enumerating standard page sizes | 
 |       for all the compressed formats (many of which are added by extension), | 
 |       but one logical approach would be to treat each 64- or 128-bit block in | 
 |       common formats as a single logical texel and treat the standard page | 
 |       sizes of 64- and 128-bit texels as being in units of compression blocks. | 
 |  | 
 |     (16) How do applications get to use the standard page size? | 
 |  | 
 |       RESOLVED:  Applications opt in to using standard page sizes by leaving | 
 |       VIRTUAL_PAGE_SIZE_INDEX_ARB at its initial value (zero). | 
 |  | 
 |       In ARB_sparse_texture, there were no standard page sizes.  Applications | 
 |       can use GetInternalformativ() with <pname> of NUM_VIRTUAL_PAGE_SIZES_ARB | 
 |       to query the implementation-dependent number of page sizes supported for | 
 |       any given format.  Some formats may be unsupported, and the GL will | 
 |       return a page size count of zero.  Other formats may have a page size | 
 |       count of one, or more than one if the implementation supports multiple | 
 |       page sizes.  An application can query the properties of each page size | 
 |       index by calling GetInternalFormativ() with <pname> set to | 
 |       VIRTUAL_PAGE_SIZE_{X,Y,Z}_ARB.  When an application determines the page | 
 |       size it wants to use from the options returned by the GL, it sets the | 
 |       VIRTUAL_PAGE_SIZE_INDEX_ARB texture parameter prior to calling | 
 |       TexStorage* to allocate storage for the sparse texture. | 
 |  | 
 |       If an application doesn't bother setting the VIRTUAL_PAGE_SIZE_INDEX_ARB | 
 |       texture parameter, the default index of zero will be used and the page | 
 |       size will be whatever the implementation chooses for its first page size | 
 |       index.  In the absence of this extension, the application still needs to | 
 |       call GetInternalFormativ() to determine the page size being used so it | 
 |       can manage texture residency. But in the presence of this extension, page | 
 |       size index 0 will be a standard size and will be the same on all | 
 |       implementations supporting the extension. | 
 |  | 
 |     (17) Should we support sparse multisample textures?  If so, should we | 
 |          support standard virtual page sizes? | 
 |  | 
 |       RESOLVED:  Yes, we add will support for sparse multisample textures, but | 
 |       will not specify standard page sizes. | 
 |  | 
 |       Different implementations of this extension may represent multisample | 
 |       textures in different ways.  Some implementations might interleave | 
 |       samples in memory, while others might have separate "planes" in memory | 
 |       for each individual sample.  If we were to support a standard page size, | 
 |       the easiest approach might be to have a greatest-common-multiple | 
 |       standard page size.  For example, the standard page size for | 
 |       single-sample textures with 32-bit texels is 128x128 (64KB total).  We | 
 |       could choose to use the same page size for multisample textures.  For 4x | 
 |       multisample, a page of 128x128 pixels would have an effective page size | 
 |       of 256KB.  If an implementation interleaves samples, each virtual page | 
 |       might be assembled from four consecutive 64K physical pages.  If an | 
 |       implementation has separate "planes", the virtual page might be | 
 |       assembled from four 64K physical pages spread out in memory. | 
 |  | 
 |     (18) Should we require support for sparse depth or stencil textures? | 
 |          Sparse support for these formats is optional in ARB_sparse_texture. | 
 |          If so, should we support standard virtual page sizes? | 
 |  | 
 |       RESOLVED:  Not in this extension. | 
 |  | 
 |       The current ARB_sparse_texture extension already allows implementations | 
 |       to support sparse depth/stencil formats, so the only things a change | 
 |       could accomplish is (a) provide standard page sizes that can be used | 
 |       without querying implementation page sizes, (b) ensure that apps can | 
 |       rely on *some* support by just checking the extension without querying | 
 |       the number of supported page sizes via GetInternalFormat. | 
 |  | 
 |       We expect that different implementations may store depth and stencil | 
 |       textures in different ways and might have different "natural" page | 
 |       sizes.  We could deal with this by using a greatest-common-multiple | 
 |       standard page size (i.e., have a standard page size larger than 64K), | 
 |       but it's not clear if that will fly. | 
 |  | 
 |       The advantages of (b) seem low relative to (a), so we aren't proposing | 
 |       to add depth and stencil formats to the required list for this | 
 |       extension. | 
 |  | 
 |     (19) Should we make a separate extension for the LOD clamp GLSL functions? | 
 |  | 
 |       RESOLVED:  Yes. See ARB_sparse_texture_clamp. | 
 |  | 
 |     (20) Should we reconsider re-examining some of the non-orthogonalities in | 
 |          the current set of texture built-ins, which are being extended for | 
 |          sparse.  For example, the texture() built-in for a sampler type of | 
 |          samplerCubeArrayShadow does not include an optional LOD bias despite | 
 |          the fact that cubemap arrays do support multiple LODs. | 
 |  | 
 |       RESOLVED:  Not in this extension. | 
 |  | 
 |       We chose to create "sparse" variants of existing built-ins without | 
 |       re-examining current capabilities.  It might make sense to have an | 
 |       extension or future core shading language re-examine things and improve | 
 |       orthogonality if implementations can support it. | 
 |  | 
 | Revision History | 
 |  | 
 |     Revision 1 | 
 |       - Branched from EXT_sparse_texture2 | 
 |  | 
 |     Revision 2 | 
 |       - Split clamp functions into ARB_sparse_texture_clamp | 
 |  | 
 |     Revision 3 | 
 |       - Remove pre-defined page sizes for 3D textures |