blob: bb02f8077e1b19483dc2e067d54775e79dbb24f8 [file] [log] [blame]
Name
AMD_sparse_texture
Name Strings
GL_AMD_sparse_texture
Contributors
Graham Sellers, AMD
Pierre Boudier, AMD
Juraj Obert, AMD
Contact
Graham Sellers, AMD (graham.sellers 'at' amd.com)
Status
Shipping.
Version
Last Modified Date: 03/27/2012
AMD Revision: 6
Number
426
Dependencies
OpenGL 2.0 or ARB_fragment_shader is required.
This extension is written against the OpenGL 4.2 (Core) Specification.
This extension is written against the OpenGL Shading Language (GLSL)
Specification, version 4.20.
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 TexStorageSparseAMD(enum target,
enum internalFormat,
sizei width,
sizei height,
sizei depth,
sizei layers,
bitfield flags);
void TextureStorageSparseAMD(uint texture,
enum target,
enum internalFormat,
sizei width,
sizei height,
sizei depth,
sizei layers,
bitfield flags);
New Tokens
Accepted by the <flags> parameter to TexStorageSparseAMD and TextureStorageSparseAMD:
TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001
Accepted by the <pname> parameter to GetInternalformativ:
VIRTUAL_PAGE_SIZE_X_AMD 0x9195
VIRTUAL_PAGE_SIZE_Y_AMD 0x9196
VIRTUAL_PAGE_SIZE_Z_AMD 0x9197
Accepted by the <pname> parameter to GetIntegerv, GetFloatv, GetDoublev,
GetInteger64v, and GetBooleanv:
MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198
MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199
MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A
Accepted by the <pname> parameter of GetTexParameter{if}v:
MIN_SPARSE_LEVEL_AMD 0x919B
Accepted by the <pname> parameter of TexParameter{if}{v} and
GetTexParameter{if}v:
MIN_LOD_WARNING_AMD 0x919C
Additions to Chapter 2 of the OpenGL 4.2 (Core) Specification (OpenGL Operation)
None.
Additions to Chapter 3 of the OpenGL 4.2 (Core) Specification (Rasterization)
Add new Subsection 3.8.3 "Texture Storage Allocation". Renumber
subsequent sections.
3.8.3 Texture Storage Allocation
The command
void TexStorageSparseAMD(enum target,
enum internalFormat,
sizei width,
sizei height,
sizei depth,
sizei layers,
bitfield flags);
is used to specify the storage requirements for a texture object. <target>
must be one of TEXTURE_1D, TEXTURE_1D_ARRAY, TEXTURE_2D, TEXTURE_RECTANGLE,
TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY or TEXTURE_3D
for a one-dimensional texture, one-dimensional array texture,
two-dimensional texture, rectangular texture, two-dimensional array texture,
cube-map texture, cube-map array texture, or three-dimensional texture,
respectively.
<width>, <height>, and <depth> determine the size of the allocated texture.
When <target> is TEXTURE_1D or TEXTURE_1D_ARRAY, <height> and <depth> must
be 1. When <target> is TEXTURE_2D, TEXTURE_RECTANGLE or TEXTURE_2D_ARRAY,
<depth> must be 1. When <target> is TEXTURE_CUBE_MAP or TEXTURE_CUBE_MAP_ARRAY,
<width>, <height> and <depth> must be equal. For the non-array targets (TEXTURE_1D,
TEXTURE_2D, TEXTURE_CUBE_MAP and TEXTURE_3D), <layers> must be 1, otherwise
it specifies the number of layers in the array. <internalFormat> specifies
the internal storage format for the texture data and must be one of the
sized internal formats listed in Table 3.12.
<width>, and <height> must be less than or equal to the value of
MAX_SPARSE_TEXTURE_SIZE_AMD, and <depth> must be less than or equal to the
value of MAX_SPARSE_3D_TEXTURE_SIZE_AMD. <layers> must be less than or
equal to the value of MAX_SPARSE_ARRAY_TEXTURE_LAYERS_AMD.
<flags> contains a bitfield that is used to control the allocation strategy
used for the texture.
If <flags> contains TEXTURE_STORAGE_SPARSE_BIT_AMD, storage is reserved for
the texture data, but not committed immediately, otherwise, storage is
both reserved and committed at time of specification . If the texture is
marked as sparse (and storage is therefore uncommitted), storage for the
texture data is committed on later specification through commands such as
TexSubImage1D, TexSubImage2D or CopyTexSubImage2D.
Texture image stores allocated via calls to TextStorageSparseAMD are always
considered complete, whether or not physical backing store for all mipmap
levels has been allocated.
The TextureStorageSparseAMD command operates identically to the
TexStorageSparseAMD command except, rather than specifying storage requirements
for the current bound texture for the texture unit indicated by the current
active texture state and the target parameter, this command specifies storage
requirements for the texture object named by the initial texture parameter.
The error INVALID_VALUE is generated if <texture> is zero.
Add new Subsection 3.8.6 "Texture Storage Commitment and Decommitment",
p.212. Renumber subsequent sections.
For texture images allocated by calling TexStorageSparseAMD or
TextureStorageSparseAMD with a <flags> parameter which contains
the TEXTURE_STORAGE_SPARSE_BIT_AMD, physical storage for the underlying
texture data may not yet be committed. Commitment is made by calling
TexSubImage1D, TexSubImage2D, TexSubImage3D, with <data> containing a value
other than NULL. When such a command is encountered, physical storage
for the specified region of the texture is committed and the data
becomes resident. If <data> is NULL and no buffer is bound to the
PIXEL_UNPACK_BUFFER binding, then the data corresponding to
the specified region is decommitted and released to the GL. If a buffer is
bound to the PIXEL_UNPACK_BUFFER binding point, then <data> is interpreted
as normal - that is, if <data> is NULL, then it indicates an offset of
zero into that buffer's data store.
Compressed texture data may be specified by calling CompressedTexSubImage1D,
CompressedTexSubImage2D or CompressedTexSubImage3D. Again, physical pages
are allocated on demand when <data> is non-NULL and freed when <data> is
NULL and no buffer is bound to the PIXEL_UNPACK_BUFFER binding point.
The origin and size of committed regions must be integer multiples of the
virtual page size in each dimension as appropriate for the specified level
of the specified texture. The virtual page size for a sparse texture may be
determined by calling GetInternalformativ with <pname> set to
VIRTUAL_PAGE_SIZE_X_AMD, VIRTUAL_PAGE_SIZE_Y_AMD or VIRTUAL_PAGE_SIZE_Z_AMD
to query the X, Y or Z dimension of the page size, respectively. Calling
TexSubImage* or CopyTexSubImage* with <width>, <height> (for 2D and 3D
textures) or <depth> (for 3D textures) not set to integer multiples of
VIRTUAL_PAGE_SIZE_X_AMD, VIRTUAL_PAGE_SIZE_Y_AMD or VIRTUAL_PAGE_SIZE_Z_AMD,
respectively, will generate an INVALID_VALUE error. An INVALID_VALUE error
is also generated if <xoffset>, <yoffset> (for 2D and 3D textures) or
<zoffset> (for 3D textures) is not a multiple of VIRTUAL_PAGE_SIZE_X_AMD,
VIRTUAL_PAGE_SIZE_Y_AMD or VIRTUAL_PAGE_SIZE_Z_AMD, respectively.
Calling TexStorageSparseAMD or TextureStorageSparseAMD on an already
committed texture decommits any associated storage and, if <flags>
contains TEXTURE_STORAGE_SPARSE_BIT_AMD, returns the image store to
fully uncommitted. Likewise, calling one of the TexImage commands
reallocates the storage for the texture image data and commits it
immediately.
When storage is committed for texture levels greater than or equal to
the value of MIN_SPARSE_LEVEL_AMD for a sparse texture, all levels greater
than or equal to that level become committed. The value of
MIN_SPARSE_LEVEL_AMD may be retrieved by calling GetTexParameter{if}v with
<pname> set to MIN_SPARSE_LEVEL_AMD. Sampling from a committed level of a
texture that has not yet had data specified produces undefined results,
but will not result in instability or program termination.
Add new paragraph heading "Effects of Texture Commitment on Completeness"
to end of Section 3.8.17 "Texture Completeness", p.237.
Effects of Texture Commitment on Completeness
Texture images whose storage was allocated without commitment (by calling
TexStorageSparseAMD or TextureStorageSparseAMD with a <flags> parameter
containing TEXTURE_STORAGE_SPARSE_BIT_AMD) are always considered complete,
regardless of their commitment status. Using such a texture image as
the source for rendering operations produces results as described
in sections XXX and XXX of the OpenGL Specification and section XXX
of the OpenGL Shading Language specification.
User-Specified LOD Warning Thresholds
In addition to detecting attempts to read from uncommitted regions of a
sparse texture, the GL can also signal to the shader that it required texels
that reside at LODs below some user specified threshold. This may be used,
for example, to specify a watermark and to provide feedback to an
application before it attempts to fetch from uncommitted texture regions.
Any attempt to fetch from lower LOD than the user-specified LOD warning
level will generate an LOD warning, which may be detected in the shader
by calling the sparseTexelMinLodWarning built-in function. When this
function returns <true>, the sparseTexelLodWarningFetch function may
be called to determine the requested LOD that generated this warning. If
the data representing this LOD is resident, the texture read will still
return valid texel data.
To specify the user-defined LOD watermark for a texture, call TexParameteri
with <target> set to a valid texture target, and with <pname> set to
MIN_LOD_WARNING_AMD. Setting MIN_LOD_WARNING_AMD to zero effectively
disables the warning.
Additions to Chapter 4 of the OpenGL 4.2 (Core) Specification (Per-Fragment Operations
and the Framebuffer)
None.
Additions to Chapter 5 of the OpenGL 4.2 (Core) Specification (Special
Functions)
None.
Additions to Chapter 6 of the OpenGL 4.2 (Core) Specification (State and
State Requests)
None.
Additions to Chapter 2 of the OpenGL Shading Language (GLSL) Specification,
version 4.20, (Overview of OpenGL Shading)
None.
Additions to Chapter 3 of the OpenGL Shading Language (GLSL) Specification,
version 4.20, (Basics)
None.
Additions to Chapter 4 of the OpenGL Shading Language (GLSL) Specification,
version 4.20, (Variables and Types)
None.
Additions to Chapter 5 of the OpenGL Shading Language (GLSL) Specification,
version 4.20, (Operators and Expressions)
None.
Additions to Chapter 6 of the OpenGL Shading Language (GLSL) Specification,
version 4.20, (Statement Structure)
None.
Additions to Chapter 7 of the OpenGL Shading Language (GLSL) Specification,
version 4.20 (Built-in variables)
None.
Additions to Chapter 8 of the OpenGL Shading Language (GLSL) Specification,
version 4.20, (Built-in Functions)
Add the Subection 8.9.3, "Uncommitted Texture Images", renumber subsequent
sections.
If a standard texture function is used to sample from a region of a texture
image where storage is uncommitted, undefined data is returned to the
shader (although no instability results). If the application can guarantee
that this will not occur (such as when well defined texture coordinates are
used with a texture atlas, for example), then standard texturing functions
may be used with partially resident textures. If there is a possibility that
at the time of use, data in the texture may be non-resident (uncommitted),
one of the sparse texture functions may be used to determine the residency
status of the data.
The sparse texture functions return a condition code indicating the success
of a texel fetch operation. If texture data is present at the sampled
location, the texture data is returned in the <texel> inout parameter and
the function returns zero. If texture data is not present at the sampled
location, <texel> is unmodified and the function returns a non-zero status
code. It is then the responsibility of the shader to determine the
appropriate course of action.
Add the following tables to the end of Section 8.9.3:
Sparse texture lookup functions:
+-------------------------------------------------------------------+-------------------------------------------+
| Syntax | Description |
+-------------------------------------------------------------------+-------------------------------------------+
| int sparseTexture(gsampler1D sampler, float P, | Behave as in texture(), but with |
| inout gvec4 texel [, float bias]); | data returned in <texel> and a |
| | status code produced as the return value |
| int sparseTexture(gsampler2D sampler, vec2 P, | of the function. |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTexture(gsampler2DRect sampler, vec2 P, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTexture(gsampler3D sampler, vec3 P, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTexture(gsampler1DArray sampler, vec2 P, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTexture(gsampler2DArray sampler, vec3 P, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTexture(gsamplerCube sampler, vec3 P, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTexture(gsamplerCubeArray sampler, vec4 P, | |
| inout gvec4 texel [, float bias]); | |
+-------------------------------------------------------------------+-------------------------------------------+
| int sparseTextureProj(gsampler1D sampler, | Behave as in textureProj(), but with |
| vec2 P, | data returned in <texel> and a |
| inout gvec4 texel [, float bias]); | status code produced as the return value |
| | of the function. |
| int sparseTextureProj(gsampler1D sampler, | |
| vec4 P, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTextureProj(gsampler2D sampler, | |
| vec3 P, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTextureProj(gsampler2DRect sampler, | |
| vec3 P, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTextureProj(gsampler2D sampler, | |
| vec4 P, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTextureProj(gsampler2DRect sampler, | |
| vec4 P, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTextureProj(gsampler3D sampler, | |
| vec4 P, | |
| inout gvec4 texel [, float bias]); | |
+-------------------------------------------------------------------+-------------------------------------------+
| int sparseTextureLod(gsampler1D sampler, | Behave as in textureLod(), but with |
| float P, float lod, | data returned in <texel> and a |
| inout gvec4 texel); | status code produced as the return value |
| | of the function. |
| int sparseTextureLod(gsampler2D sampler, | |
| vec2 P, float lod, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureLod(gsampler3D sampler, | |
| vec3 P, float lod, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureLod(gsampler1DArray sampler, | |
| vec2 P, float lod, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureLod(gsampler2DArray sampler, | |
| vec3 P, float lod, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureLod(gsamplerCube sampler, | |
| vec3 P, float lod, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureLod(gsamplerCubeArray sampler, | |
| vec4 P, float lod, | |
| inout gvec4 texel); | |
+-------------------------------------------------------------------+-------------------------------------------+
| int sparseTextureOffset(gsampler1D sampler, | Behave as in textureOffset(), but |
| float P, int offset, | with data returned in <texel> and a |
| inout gvec4 texel [, float bias]); | status code produced as the return value |
| | of the function. |
| int sparseTextureOffset(gsampler2D sampler, | |
| vec2 P, ivec2 offset, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTextureOffset(gsampler3D sampler, | |
| vec3 P, ivec3 offset, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTextureOffset(gsampler1DArray sampler, | |
| vec2 P, int offset, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTextureOffset(gsampler2DArray sampler, | |
| vec3 P, ivec2 offset, | |
| inout gvec4 texel [, float bias]); | |
+-------------------------------------------------------------------+-------------------------------------------+
| int sparseTextureProjOffset(gsampler1D sampler, | Behave as in textureProjOffset(), but |
| vec2 P, int offset, | with data returned in <texel> and a |
| inout gvec4 texel [, float bias]); | status code produced as the return value |
| | of the function. |
| int sparseTextureProjOffset(gsampler1D sampler, | |
| vec4 P, int offset, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTextureProjOffset(gsampler2D sampler, | |
| vec3 P, ivec2 offset, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTextureProjOffset(gsampler2D sampler, | |
| vec4 P, ivec2 offset, | |
| inout gvec4 texel [, float bias]); | |
| | |
| int sparseTextureProjOffset(gsampler3D sampler, | |
| vec4 P, ivec3 offset, | |
| inout gvec4 texel [, float bias]); | |
+-------------------------------------------------------------------+-------------------------------------------+
| int sparseTextureLodOffset(gsampler1D sampler, | Behave as in textureLodOffset(), but |
| float P, float lod, int offset, | with data returned in <texel> and a |
| inout gvec4 texel); | status code produced as the return value |
| | of the function. |
| int sparseTextureLodOffset(gsampler2D sampler, | |
| vec2 P, float lod, ivec2 offset, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureLodOffset(gsampler3D sampler, | |
| vec3 P, float lod, ivec3 offset, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureLodOffset(gsampler1DArray sampler, | |
| vec2 P, float lod, int offset, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureLodOffset(gsampler2DArray sampler, | |
| vec3 P, float lod, ivec2 offset, | |
| inout gvec4 texel); | |
+-------------------------------------------------------------------+-------------------------------------------+
| int sparseTextureProjLod(gsampler1D sampler, | Behave as in textureProjLod(), but |
| vec2 P, float lod, | with data returned in <texel> and a |
| inout gvec4 texel); | status code produced as the return value |
| | of the function. |
| int sparseTextureProjLod(gsampler1D sampler, | |
| vec4 P, float lod, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureProjLod(gsampler2D sampler, | |
| vec3 P, float lod, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureProjLod(gsampler2D sampler, | |
| vec4 P, float lod, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureProjLod(gsampler3D sampler, | |
| vec4 P, float lod, | |
| inout gvec4 texel); | |
+-------------------------------------------------------------------+-------------------------------------------+
| int sparseTextureProjLodOffset(gsampler1D sampler, | Behave as in textureProjLodOffset(), but |
| vec2 P, float lod, int offset, | with data returned in <texel> and a |
| inout gvec4 texel); | status code produced as the return value |
| | of the function. |
| int sparseTextureProjLodOffset(gsampler1D sampler, | |
| vec4 P, float lod, int offset, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureProjLodOffset(gsampler2D sampler, | |
| vec3 P, float lod, ivec2 offset, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureProjLodOffset(gsampler2D sampler, | |
| vec4 P, float lod, ivec2 offset, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureProjLodOffset(gsampler3D sampler, | |
| vec4 P, float lod, ivec3 offset, | |
| inout gvec4 texel); | |
+-------------------------------------------------------------------+-------------------------------------------+
| int sparseTextureGrad(gsampler1D sampler, float P, | Behave as in textureGrad(), but |
| float dPdx, float dPdy, | with data returned in <texel> and a |
| inout gvec4 texel); | status code produced as the return value |
| | of the function. |
| int sparseTextureGrad(gsampler2D sampler, vec2 P, | |
| vec2 dPdx, vec2 dPdy, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureGrad(gsampler3D sampler, vec3 P, | |
| vec3 dPdx, vec3 dPdy, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureGrad(gsampler1DArray sampler, vec2 P, | |
| float dPdx, float dPdy, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureGrad(gsampler2DArray sampler, vec3 P, | |
| vec2 dPdx, vec2 dPdy, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureGrad(gsamplerCube sampler, vec3 P, | |
| vec2 dPdx, vec2 dPdy, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureGrad(gsamplerCubeArray sampler, vec4 P, | |
| vec2 dPdx, vec2 dPdy, | |
| inout gvec4 texel); | |
+-------------------------------------------------------------------+-------------------------------------------+
| int sparseTextureGradOffset(gsampler1D sampler, float P, | Behave as in textureGradOffset(), but |
| float dPdx, float dPdy, int offset, | with data returned in <texel> and a |
| inout gvec4 texel); | status code produced as the return value |
| | of the function. |
| int sparseTextureGradOffset(gsampler2D sampler, vec2 P, | |
| vec2 dPdx, vec2 dPdy, ivec2 offset, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureGradOffset(gsampler3D sampler, vec3 P, | |
| vec3 dPdx, vec3 dPdy, ivec3 offset, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureGradOffset(gsampler1DArray sampler, vec2 P, | |
| float dPdx, float dPdy, int offset, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureGradOffset(gsampler2DArray sampler, vec3 P, | |
| vec2 dPdx, vec2 dPdy, ivec2 offset, | |
| inout gvec4 texel); | |
+-------------------------------------------------------------------+-------------------------------------------+
| int sparseTextureProjGrad(gsampler1D sampler, | Behave as in textureProjGrad(), but |
| vec2 P, float dPdx, float dPdy, | with data returned in <texel> and a |
| inout gvec4 texel); | status code produced as the return value |
| | of the function. |
| int sparseTextureProjGrad(gsampler1D sampler, | |
| vec4 P, float dPdx, float dPdy, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureProjGrad(gsampler2D sampler, | |
| vec3 P, vec2 dPdx, vec2 dPdy, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureProjGrad(gsampler2D sampler, | |
| vec4 P, vec2 dPdx, vec2 dPdy, | |
| inout gvec4 texel); | |
| | |
| int sparseTextureProjGrad(gsampler3D sampler, | |
| vec4 P, | |
| inout gvec4 texel); | |
+-------------------------------------------------------------------+-------------------------------------------+
| int sparseTextureProjGradOffset(gsampler1D sampler, vec2 P, | Behave as in textureProjGradOffset(), but |
| float dPdx, float dPdy, | with data returned in <texel> and a |
| int offset, inout gvec4 texel); | status code produced as the return value |
| | of the function. |
| int sparseTextureProjGradOffset(gsampler1D sampler, vec4 P, | |
| float dPdx, float dPdy, | |
| int offset, inout gvec4 texel); | |
| | |
| int sparseTextureProjGradOffset(gsampler2D sampler, vec3 P, | |
| vec2 dPdx, vec2 dPdy, | |
| ivec2 offset, inout gvec4 texel); | |
| | |
| int sparseTextureProjGradOffset(gsampler2D sampler, vec4 P, | |
| vec2 dPdx, vec2 dPdy, | |
| ivec2 offset, inout gvec4 texel); | |
| | |
| int sparseTextureProjGradOffset(gsampler3D sampler, vec4 P, | |
| vec3 dPdx, vec3 dPdy, | |
| ivec3 offset, inout gvec4 texel); | |
+-------------------------------------------------------------------+-------------------------------------------+
Add the following table and description.
The following functions may be used to interpret the status codes returned
by the sparse texture lookup functions.
+-------------------------------------------------------------------+-------------------------------------------+
| Syntax | Description |
+-------------------------------------------------------------------+-------------------------------------------+
| bool sparseTexelResident(int code); | Returns true if the texture read that |
| | produced <code> retrieved valid data, and |
| | false otherwise. |
| | |
| bool sparseTexelMinLodWarning(int code); | Returns true if the texture read that |
| | produced <code> required a texel fetch |
| | from any LOD lower than the user |
| | specified LOD warning threshold. |
| | |
| int sparseTexelLodWarningFetch(int code); | Returns the LOD calculated by the texture |
| | read that generated <code> and resulted |
| | in a condition that would cause |
| | sparseTexelMinLodWarning to return true. |
| | If the LOD warning was not encountered, |
| | this function returns zero. |
+-------------------------------------------------------------------+-------------------------------------------+
Additions to Chapter 9 of the OpenGL Shading Language (GLSL) Specification,
version 4.20, (Shading Language Grammar)
None.
Additions to the AGL/GLX/WGL Specifications
None.
GLX Protocol
None.
Errors
INVALID_ENUM is generated by TexStorageSparseAMD
and TextureStorageSparseAMD if <target> is not one of the supported
texture targets.
INVALID_ENUM is generated by TexStorageSparseAMD
and TextureStorageSparseAMD if <internalFormat> is not one of the
accepted internal texture formats.
INVALID_VALUE is generated by TexStorageSparseAMD
and TextureStorageSparseAMD if <height> or <depth> is not 1 and
<target> is TEXTURE_1D or TEXTURE_1D_ARRAY.
INVALID_VALUE is generated by TexStorageSparseAMD
and TextureStorageSparseAMD if <height> is not 1 and <target> is
TEXTURE_2D, TEXTURE_RECTANGLE or TEXTURE_2D_ARRAY.
INVALID_VALUE is generated by TexStorageSparseAMD
and TextureStorageSparseAMD if <width>, <height> and <depth> are not
equal and <target> is TEXTURE_CUBE_MAP or TEXTURE_CUBE_MAP_ARRAY.
INVALID_VALUE is generated by TexStorageSparseAMD
and TextureStorageSparseAMD if <layers> is not 1 and <target> is not
one of the ARRAY texture targets.
INVALID_VALUE is generated by TexStorageSparseAMD
and TextureStorageSparseAMD if <width> or <height> is greater than the
value of MAX_SPARSE_TEXTURE_SIZE_AMD, or if <depth> is greater than
the value of MAX_SPARSE_3D_TEXTURE_SIZE_AMD, or if <layers> is greater
than the value of MAX_SPARSE_ARRAY_TEXTURE_LAYERS_AMD.
INVALID_VALUE is generated by TexImage* and CopyTexImage* if the dimensions
of the updated region are not integer multiples of VIRTUAL_PAGE_SIZE_X_AMD,
VIRTUAL_PAGE_SIZE_Y_AMD (for 2D and 3D textures) and VIRTUAL_PAGE_SIZE_Z_AMD
(for 3D textures).
New State
Append to Table 6.16, "Textures (state per texture object)"
+-----------------------+-------+-------------------+---------------+-------------------------------------------+-------+
| Get Value | Type | Get Command | Initial Value | Description | Sec. |
+-----------------------+-------+-------------------+---------------+-------------------------------------------+-------+
| MIN_LOD_WARNING_AMD | Z+ | GetTexParameteriv | 0 | User-specified minimum LOD warning level. | 3.8.6 |
+-----------------------+-------+-------------------+---------------+-------------------------------------------+-------+
New Implementation Dependent State
Append to Table 6.42, "Implementation Dependent Values"
+-----------------------------------+-------+-------------+-----------------+---------------------------------------+-------+
| Get Value | Type | Get Command | Minimum Value | Description | Sec. |
+-----------------------------------+-------+-------------+-----------------+---------------------------------------+-------+
| MAX_SPARSE_TEXTURE_SIZE_AMD | Z+ | GetIntegerv | 16384 | Maximum 1D/2D/rectangle texture image | 3.8.6 |
| | | | | dimension for a sparse texture. | |
| MAX_SPARSE_3D_TEXTURE_SIZE_AMD | Z+ | GetIntegerv | 2048 | Maximum 3D texture image dimension | 3.8.6 |
| | | | | for a sparse texture. | |
| MAX_SPARSE_3D_TEXTURE_SIZE_AMD | Z+ | GetIntegerv | 2048 | Maximum number of layers in a sparse | 3.8.6 |
| | | | | array texture. | |
+-----------------------------------+-------+-------------+-----------------+---------------------------------------+-------+
Issues
1) Are all supported texture targets exposed? Are any exposed that are not
supported well by hardware?
RESOLVED: All texture targets are exposed except for multisample, and
buffer textures.
2) Why do we have <depth> and <layers> separate in TexStorageSparseAMD and
TextureStorageSparseAMD, whereas in TexImage3D, <depth> specifies the
size of the 2D array, for example?
Because it's easier to validate and because I don't want to hack up my
extension if we introduce 3D-array textures.
3) Does this play nice with the proposed EXT_texture_storage extension
(which defines some very similar entry points to TexStorageSparseAMD
and TextureStorageSparseAMD)? Can it be made to play nice?
RESOLVED: Yes, it should interact just fine. Unfortunately,
EXT_texture_storage didn't introduce any mechanism to convey flags or
allocation strategies and so those entry points could not be used here.
Otherwise, textures allocated with TexStorage* APIs should appear as
fully resident textures if used with sparse texture sampling functions.
4) Is it possible to attach a partially resident texture to an FBO and
render into it?
RESOLVED: Yes, this is supported. Keep in mind, though, that data rendered
to an attachment in areas that are not resident will be discarded and there
is no mechanism to detect this. Also, depth, stencil and multisample
formats are not supported by this extension.
5) What happens if TEXTURE_STORAGE_SPARSE_BIT_AMD is not present in
TexStorageSparseAMD or TextureStorageSparseAMD?
RESOLVED: Texture storage will be both allocated and committed. The
texture is still considered immutable and so this is mostly equivalent
to calling the TexStorage API.
6) Does this extension increase the maximum supported texture size?
RESOLVED: No, not explicitly. The maximum supported texture size is
still queryable by retrieving the value of MAX_TEXTURE_SIZE. A new token,
MAX_SPARSE_TEXTURE_SIZE_AMD is added to query the maximum sparse texture
size, which may be larger than the non-sparse maximum. However, there
is no requirement for it to be so.
7) What if a larger sparse textures are supported than non-sparse textures?
RESOLVED: Query the maximum sparse texture size by retrieving the value
of MAX_SPARSE_TEXTURE_SIZE_AMD.
8) How do you decommit (free) a region of a sparse texture?
RESOLVED: Call TexSubImageND with <data> set to NULL and without a
pixel unpack buffer bound.
9) -
10) Is compression supported for sparse textures?
RESOLVED: Yes, but be aware that the dimensions of a single tile could
be substantially larger when the texture is compressed.
11) Does this work with non-power-of-two textures?
RESOLVED: Yes, so long as the texture size is an integer multiple of
the texture tile size in all dimensions.
12) Are multisampled sparse textures supported?
RESOLVED: No.
13) What about OUT_OF_MEMORY errors?
RESOLVED: OUT_OF_MEMORY errors can be reported if there isn't sufficient
system memory to allocate internal structures (even a fully uncommitted
sparse texture requires some internal resources), or if there isn't
sufficient video memory to commit all requested regions.
The error doesn't have to be reported upon creation of a sparse texture.
For example, allocation of two 64 GB sparse textures might succeed, but
their simulatenous use in one draw call might result in an OUT_OF_MEMORY
error being reported by the GL later.
14) Does CopyTexSubImage work with sparse textures?
RESOLVED: Yes.
15) Does GetTexImage work with sparse texture?
RESOLVED: Yes in general. However, the call can fail based on
implementation-specific limitations.
Revision History
Rev. Date Author Changes
---- -------- -------- -----------------------------------------
6 03/27/2012 gsellers Resolve some issues.
Clarify interactions with PBO.
5 03/14/2012 jobert Rename some tokens.
Assign token values.
4 20/04/2011 gsellers Add min-lod warning.
Add sparse texture fetch return code built-ins.
Add new state tables.
Add 3D sparse texture size limit.
Add support for cube textures and cube texture
arrays.
Add issues 10 and 11, remove issue 9.
3 25/03/2011 gsellers Change required version of GL to 2.0 (or
equivalent extensions).
Add query for virtual page size.
Add restrictions on page size and alignment
during commitment.
Add MAX_SPARSE_TEXTURE_SIZE_AMD.
Add issues 6 through 9.
Add MIN_SPARSE_LEVEL_AMD.
2 25/02/2011 jobert Expanded the Issues section
1 11/02/2011 gsellers Initial Revision