skia / external / github.com / KhronosGroup / OpenGL-Registry / 5fc988eda8bf7cecd4cdea814a73ed7aa75c38cf / . / extensions / ARB / ARB_sparse_texture_clamp.txt

Name | |

ARB_sparse_texture_clamp | |

Name Strings | |

GL_ARB_sparse_texture_clamp | |

Contact | |

Eric Werness, NVIDIA Corporation (ewerness 'at' nvidia.com) | |

Contributors | |

Pat Brown, NVIDIA Corporation | |

Piers Daniell, NVIDIA Corporation | |

Jeff Bolz, NVIDIA Corporation | |

Mathias Heyer, 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: April 30, 2015 | |

Revision: 2 | |

Number | |

ARB Extension #187 | |

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. | |

This extension requires and extends ARB_sparse_texture2. | |

This extension interacts with NV_gpu_program4 and NV_gpu_program5. | |

Overview | |

This extension builds on the ARB_sparse_texture2 extension, providing the | |

following new functionality: | |

* 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. | |

New Procedures and Functions | |

None. | |

New Tokens | |

None. | |

Modifications to the OpenGL 4.5 Specification (Compatibility Profile) | |

Modify Section 8.14.1, Scale Factor and Level of Detail, p. 280 | |

(move the third paragraph, p. 281, describing lod_min and lod_max | |

in equation 8.6, up one paragraph and modify it to read as follows) | |

lod_min and lod_max indicate minimum and maximum clamps on the computed | |

level of detail. lod_max is taken directly from the TEXTURE_MAX_LOD | |

texture or sampler parameter. If a texture access is performed in a | |

fragment shader with a minimum level of detail clamp specified in the | |

built-in texture lookup function, lod_min is the larger of the | |

TEXTURE_MIN_LOD texture or sampler parameter and the minimum level of | |

detail provided by the shader. Otherwise, lod_min is taken directly from | |

the TEXTURE_MIN_LOD texture or sampler parameter. The initial values of | |

the TEXTURE_MIN_LOD and TEXTURE_MAX_LOD texture and sampler parameters are | |

chosen so as to never clamp the range of lambda values. | |

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_texture_clamp : <behavior> | |

where <behavior> is as specified in section 3.3. | |

New preprocessor #defines are added to the OpenGL Shading Language: | |

#define GL_ARB_sparse_texture_clamp 1 | |

Modify Section 8.9, Texture Functions, p. 158 | |

(insert after first paragraph, p. 159) | |

The texture lookup functions with an <lodClamp> parameter specify a | |

minimum clamp applied to the automatic level of detail computations. | |

Since automatic level of detail calculations are only supported by | |

fragment shaders, these lookup functions are also only available in | |

fragment shaders. No functions with the <lodClamp> parameter are provided | |

for rectangle textures, multisample textures, and texture buffers because | |

mipmaps are not allowed for these types of textures. | |

Modify Section 8.9.2, Texel Lookup Functions, p. 162 | |

(The combination of this extension and ARB_sparse_texture2 adds two new | |

variants 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. The "Clamp" variants are functions adding a new | |

parameter specifying a minimum LOD to use for texture lookup functions where | |

level of detail is computed automatically. | |

For each set of texture functions, we provide one to three new variants | |

based on whether sparse and LOD clamping functionality are desired. These | |

new variants copy the existing functions, add suffixes to the function | |

names, and add one or more new parameters. | |

We create new variants 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. We also chose not to provide "Clamp" | |

variants of functions like textureLod() expecting an explicit | |

level-of-detail.) | |

(insert new lookup function table cells, at the end of the section, | |

p. 168) | |

Syntax: | |

int sparseTextureClampARB(gsampler2D sampler, vec2 P, | |

float lodClamp, out gvec4 texel | |

[, float bias]); | |

int sparseTextureClampARB(gsampler3D sampler, vec3 P, | |

float lodClamp, out gvec4 texel | |

[, float bias]); | |

int sparseTextureClampARB(gsamplerCube sampler, vec3 P, | |

float lodClamp, out gvec4 texel | |

[, float bias]); | |

int sparseTextureClampARB(sampler2DShadow sampler, vec3 P, | |

float lodClamp, out float texel | |

[, float bias]); | |

int sparseTextureClampARB(samplerCubeShadow sampler, vec4 P, | |

float lodClamp, out float texel | |

[, float bias]); | |

int sparseTextureClampARB(gsampler2DArray sampler, vec3 P, | |

float lodClamp, out gvec4 texel | |

[, float bias]); | |

int sparseTextureClampARB(gsamplerCubeArray sampler, vec4 P, | |

float lodClamp, out gvec4 texel | |

[, float bias]); | |

int sparseTextureClampARB(sampler2DArrayShadow sampler, vec4 P, | |

float lodClamp, out float texel); | |

int sparseTextureClampARB(samplerCubeArrayShadow sampler, vec4 P, | |

float compare, float lodClamp, | |

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>. Additionally, clamp the automatically computed | |

level of detail to be greater than or equal to <lodClamp>. | |

-- | |

Syntax: | |

gvec4 textureClampARB(gsampler1D sampler, float P, | |

float lodClamp [, float bias]); | |

gvec4 textureClampARB(gsampler2D sampler, vec2 P, | |

float lodClamp [, float bias]); | |

gvec4 textureClampARB(gsampler3D sampler, vec3 P, | |

float lodClamp [, float bias]); | |

gvec4 textureClampARB(gsamplerCube sampler, vec3 P, | |

float lodClamp [, float bias]); | |

float textureClampARB(sampler1DShadow sampler, vec3 P, | |

float lodClamp [, float bias]); | |

float textureClampARB(sampler2DShadow sampler, vec3 P, | |

float lodClamp [, float bias]); | |

float textureClampARB(samplerCubeShadow sampler, vec4 P, | |

float lodClamp [, float bias]); | |

gvec4 textureClampARB(gsampler1DArray sampler, vec2 P, | |

float lodClamp [, float bias]); | |

gvec4 textureClampARB(gsampler2DArray sampler, vec3 P, | |

float lodClamp [, float bias]); | |

gvec4 textureClampARB(gsamplerCubeArray sampler, vec4 P, | |

float lodClamp [, float bias]); | |

float textureClampARB(sampler1DArrayShadow sampler, vec3 P, | |

float lodClamp [, float bias]); | |

float textureClampARB(sampler2DArrayShadow sampler, vec4 P, | |

float lodClamp); | |

float textureClampARB(samplerCubeArrayShadow sampler, vec4 P, | |

float compare, float lodClamp); | |

Description: | |

Do a filtered texture lookup as in texture(), but clamp the automatically | |

computed level of detail to be greater than or equal to <lodClamp>. | |

-- | |

Syntax: | |

int sparseTextureOffsetClampARB(gsampler2D sampler, vec2 P, | |

ivec2 offset, float lodClamp, | |

out gvec4 texel [, float bias]); | |

int sparseTextureOffsetClampARB(gsampler3D sampler, vec3 P, | |

ivec3 offset, float lodClamp, | |

out gvec4 texel [, float bias]); | |

int sparseTextureOffsetClampARB(sampler2DShadow sampler, vec3 P, | |

ivec2 offset, float lodClamp, | |

out float texel [, float bias]); | |

int sparseTextureOffsetClampARB(gsampler2DArray sampler, vec3 P, | |

ivec2 offset, float lodClamp, | |

out gvec4 texel [, float bias]); | |

int sparseTextureOffsetClampARB(sampler2DArrayShadow sampler, vec4 P, | |

ivec2 offset, float lodClamp, | |

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>. Additionally, clamp the | |

automatically computed level of detail to be greater than or equal to | |

<lodClamp>. | |

-- | |

Syntax: | |

gvec4 textureOffsetClampARB(gsampler1D sampler, float P, | |

int offset, float lodClamp [, float bias]); | |

gvec4 textureOffsetClampARB(gsampler2D sampler, vec2 P, | |

ivec2 offset, float lodClamp [, float bias]); | |

gvec4 textureOffsetClampARB(gsampler3D sampler, vec3 P, | |

ivec3 offset, float lodClamp [, float bias]); | |

float textureOffsetClampARB(sampler1DShadow sampler, vec3 P, | |

int offset, float lodClamp [, float bias]); | |

float textureOffsetClampARB(sampler2DShadow sampler, vec3 P, | |

ivec2 offset, float lodClamp [, float bias]); | |

gvec4 textureOffsetClampARB(gsampler1DArray sampler, vec2 P, | |

int offset, float lodClamp [, float bias]); | |

gvec4 textureOffsetClampARB(gsampler2DArray sampler, vec3 P, | |

ivec2 offset, float lodClamp [, float bias]); | |

float textureOffsetClampARB(sampler1DArrayShadow sampler, vec3 P, | |

int offset, float lodClamp [, float bias]); | |

float textureOffsetClampARB(sampler2DArrayShadow sampler, vec4 P, | |

ivec2 offset, float lodClamp); | |

Description: | |

Do a filtered texture lookup as in textureOffset(), but clamp the | |

automatically computed level of detail to be greater than or equal to | |

<lodClamp>. | |

-- | |

Syntax: | |

int sparseTextureGradClampARB(gsampler2D sampler, vec2 P, | |

vec2 dPdx, vec2 dPdy, float lodClamp, | |

out gvec4 texel); | |

int sparseTextureGradClampARB(gsampler3D sampler, vec3 P, | |

vec3 dPdx, vec3 dPdy, float lodClamp, | |

out gvec4 texel); | |

int sparseTextureGradClampARB(gsamplerCube sampler, vec3 P, | |

vec3 dPdx, vec3 dPdy, float lodClamp, | |

out gvec4 texel); | |

int sparseTextureGradClampARB(sampler2DShadow sampler, vec3 P, | |

vec2 dPdx, vec2 dPdy, float lodClamp, | |

out float texel); | |

int sparseTextureGradClampARB(samplerCubeShadow sampler, vec4 P, | |

vec3 dPdx, vec3 dPdy, float lodClamp, | |

out float texel); | |

int sparseTextureGradClampARB(gsampler2DArray sampler, vec3 P, | |

vec2 dPdx, vec2 dPdy, float lodClamp, | |

out gvec4 texel); | |

int sparseTextureGradClampARB(sampler2DArrayShadow sampler, vec4 P, | |

vec2 dPdx, vec2 dPdy, float lodClamp, | |

out float texel); | |

int sparseTextureGradClampARB(gsamplerCubeArray sampler, vec4 P, | |

vec3 dPdx, vec3 dPdy, float lodClamp, | |

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>. Additionally, clamp the | |

automatically computed level of detail to be greater than or equal to | |

<lodClamp>. | |

-- | |

Syntax: | |

gvec4 textureGradClampARB(gsampler1D sampler, float P, | |

float dPdx, float dPdy, float lodClamp); | |

gvec4 textureGradClampARB(gsampler2D sampler, vec2 P, | |

vec2 dPdx, vec2 dPdy, float lodClamp); | |

gvec4 textureGradClampARB(gsampler3D sampler, vec3 P, | |

vec3 dPdx, vec3 dPdy, float lodClamp); | |

gvec4 textureGradClampARB(gsamplerCube sampler, vec3 P, | |

vec3 dPdx, vec3 dPdy, float lodClamp); | |

float textureGradClampARB(sampler1DShadow sampler, vec3 P, | |

float dPdx, float dPdy, float lodClamp); | |

float textureGradClampARB(sampler2DShadow sampler, vec3 P, | |

vec2 dPdx, vec2 dPdy, float lodClamp); | |

float textureGradClampARB(samplerCubeShadow sampler, vec4 P, | |

vec3 dPdx, vec3 dPdy, float lodClamp); | |

gvec4 textureGradClampARB(gsampler1DArray sampler, vec2 P, | |

float dPdx, float dPdy, float lodClamp); | |

gvec4 textureGradClampARB(gsampler2DArray sampler, vec3 P, | |

vec2 dPdx, vec2 dPdy, float lodClamp); | |

float textureGradClampARB(sampler1DArrayShadow sampler, vec3 P, | |

float dPdx, float dPdy, float lodClamp); | |

float textureGradClampARB(sampler2DArrayShadow sampler, vec4 P, | |

vec2 dPdx, vec2 dPdy, float lodClamp); | |

gvec4 textureGradClampARB(gsamplerCubeArray sampler, vec4 P, | |

vec3 dPdx, vec3 dPdy, float lodClamp); | |

Description: | |

Do a filtered texture lookup as in textureGrad(), but clamp the | |

automatically computed level of detail to be greater than or equal to | |

<lodClamp>. | |

-- | |

Syntax: | |

int sparseTextureGradOffsetClampARB(gsampler2D sampler, vec2 P, | |

vec2 dPdx, vec2 dPdy, ivec2 offset, | |

float lodClamp, out gvec4 texel); | |

int sparseTextureGradOffsetClampARB(gsampler3D sampler, vec3 P, | |

vec3 dPdx, vec3 dPdy, ivec3 offset, | |

float lodClamp, out gvec4 texel); | |

int sparseTextureGradOffsetClampARB(sampler2DShadow sampler, vec3 P, | |

vec2 dPdx, vec2 dPdy, ivec2 offset, | |

float lodClamp, out float texel); | |

int sparseTextureGradOffsetClampARB(gsampler2DArray sampler, vec3 P, | |

vec2 dPdx, vec2 dPdy, ivec2 offset, | |

float lodClamp, out gvec4 texel); | |

int sparseTextureGradOffsetClampARB(sampler2DArrayShadow sampler, vec4 P, | |

vec2 dPdx, vec2 dPdy, ivec2 offset, | |

float lodClamp, 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>. Additionally, clamp the | |

automatically computed level of detail to be greater than or equal to | |

<lodClamp>. | |

-- | |

Syntax: | |

gvec4 textureGradOffsetClampARB(gsampler1D sampler, float P, | |

float dPdx, float dPdy, int offset, | |

float lodClamp); | |

gvec4 textureGradOffsetClampARB(gsampler2D sampler, vec2 P, | |

vec2 dPdx, vec2 dPdy, ivec2 offset, | |

float lodClamp); | |

gvec4 textureGradOffsetClampARB(gsampler3D sampler, vec3 P, | |

vec3 dPdx, vec3 dPdy, ivec3 offset, | |

float lodClamp); | |

float textureGradOffsetClampARB(sampler1DShadow sampler, vec3 P, | |

float dPdx, float dPdy, int offset, | |

float lodClamp); | |

float textureGradOffsetClampARB(sampler2DShadow sampler, vec3 P, | |

vec2 dPdx, vec2 dPdy, ivec2 offset, | |

float lodClamp); | |

gvec4 textureGradOffsetClampARB(gsampler1DArray sampler, vec2 P, | |

float dPdx, float dPdy, int offset, | |

float lodClamp); | |

gvec4 textureGradOffsetClampARB(gsampler2DArray sampler, vec3 P, | |

vec2 dPdx, vec2 dPdy, ivec2 offset, | |

float lodClamp); | |

float textureGradOffsetClampARB(sampler1DArrayShadow sampler, vec3 P, | |

float dPdx, float dPdy, int offset, | |

float lodClamp); | |

float textureGradOffsetClampARB(sampler2DArrayShadow sampler, vec4 P, | |

vec2 dPdx, vec2 dPdy, ivec2 offset, | |

float lodClamp); | |

Description: | |

Do a filtered texture lookup as in textureGrad(), but clamp the | |

automatically computed level of detail to be greater than or equal to | |

<lodClamp>. | |

Additions to the AGL/GLX/WGL Specifications | |

None. | |

Errors | |

None. | |

New State | |

None. | |

New Implementation Dependent State | |

None. | |

Dependencies on NV_gpu_program4 and NV_gpu_program5 | |

Modify Section 2.X.2, Program Grammar | |

<opModifier> ::= "LODCLAMP" | |

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 | |

-------- ------------------------------------------------------ | |

LODCLAMP Clamp the LOD used by texture lookups to a specified | |

value | |

For texture fetch instructions with implicit LOD calcuations (TEX, TXB, | |

TXD), the "LODCLAMP" modifier specifies that the instruction includes an | |

extra floating-point component indicating a minimum level of detail to be | |

used for the texture lookup. If the implicitly computed level of detail | |

is less than the level of detail provided in the instruction data, that | |

level should be used instead. | |

Modify Section 2.X.4.4, Program Texture Access | |

(modify the prototype of the TextureSample utility function, adding | |

<coord2> and removing <lod>) | |

result_t_vec | |

TextureSample(float_vec coord, float_vec coord2, | |

float_vec ddx, float_vec ddy, int_vec offset); | |

(modify the description of <coord> to add <coord2>) | |

<coord> and <coord2> are two four-component floating-point vectors from | |

which the (s,t,r) texture coordinates used for the texture access, the | |

layer used for array textures, and the reference value used for depth | |

comparisons (section 3.8.14) are extracted according to Table X.17. ... | |

(replace the paragraph discussing <lod>) | |

<ddx> and <ddy> specify partial derivatives (ds/dx, dt/dx, dr/dx, ds/dy, | |

dt/dy, and dr/dy) for the texture coordinates, and may be used for level | |

of detail calculations and to derive footprint shapes for anisotropic | |

texture filtering. | |

The level of detail used for the texture lookup is a function of the | |

texture instruction type, texture target, LODCLAMP qualifier, and the | |

inputs <ddx> and <ddy>. For TEX, TXB, TXD, and TXP instructions in a base | |

level of detail is computed based on the partial derivatives <ddx> and | |

<ddy>. For the TXB and TXL instruction, an additional level of detail | |

value is taken from the component in <coord> or <coord2> identified by the | |

first entry in the "lod" column of Table X.17. For TXB, this value is | |

added to the computed base level of detail; for TXL, it specifies the base | |

level of detail. After that, per-texture and per-texture unit LOD biases | |

are added to the level of detail. Finally, if the LODCLAMP opcode | |

modifier is specified, an LOD clamp value is extracted from <coord> or | |

<coord2> according to the second entry in the "lod" column of Table X.17. | |

The computed level of detail is clamped to be greater than or equal to | |

this LOD clamp value. | |

coordinates used | |

texTarget Texture Type s t r lay shd lod | |

---------------- --------------------- ----- --- --- ----- | |

1D TEXTURE_1D x - - - - w,x2 | |

2D TEXTURE_2D x y - - - w,x2 | |

3D TEXTURE_3D x y z - - w,x2 | |

CUBE TEXTURE_CUBE_MAP x y z - - w,x2 | |

RECT TEXTURE_RECTANGLE_ARB x y - - - -,- | |

ARRAY1D TEXTURE_1D_ARRAY_EXT x - - y - w,x2 | |

ARRAY2D TEXTURE_2D_ARRAY_EXT x y - z - w,x2 | |

ARRAYCUBE TEXTURE_CUBE_MAP_ARRAY x y z w - x2,y2 | |

SHADOW1D TEXTURE_1D x - - - z w,x2 | |

SHADOW2D TEXTURE_2D x y - - z w,x2 | |

SHADOWRECT TEXTURE_RECTANGLE_ARB x y - - z -,- | |

SHADOWCUBE TEXTURE_CUBE_MAP x y z - w x2,y2 | |

SHADOWARRAY1D TEXTURE_1D_ARRAY_EXT x - - y z w,x2 | |

SHADOWARRAY2D TEXTURE_2D_ARRAY_EXT x y - z w -,x2 | |

SHADOWARRAYCUBE TEXTURE_CUBE_MAP_ARRAY x y z w x2 -,y2 | |

BUFFER TEXTURE_BUFFER_EXT <not supported> | |

RENDERBUFFER TEXTURE_RENDERBUFFER <not supported> | |

2DMS TEXTURE_2D_MULTISAMPLE <not supported> | |

ARRAY2DMS TEXTURE_2D_MULTISAMPLE_ <not supported> | |

ARRAY | |

Table X.17: Texture types accessed for each of the <texTarget>, and | |

coordinate mappings. Components "x", "y", "z", and "w" are taken from | |

the first coordinate vector <coord>; "x2" and "y2" are taken from the | |

second vector <coord2>. The "SHADOW" and "ARRAY" targets are special | |

pseudo-targets described below. The "coordinates used" column indicate | |

the input values used for each coordinate of the texture lookup, the | |

layer selector for array textures, the reference value for texture | |

comparisons, and up to two components of level-of-detail information. | |

Buffer textures are not supported by normal texture lookup functions, | |

but are supported by TXF and TXQ, described below. Renderbuffer and | |

multisample textures are not supported by normal texture lookup | |

functions, but are supported by TXFMS. The TXB and TXL instructions are | |

not supported for the targets SHADOWARRAY2D and SHADOWARRAYCUBE, so the | |

first column of "lod" is ignored. | |

Modify Section 2.X.8.Z, TXD: Texture Sample with Partials | |

... The partial derivatives of the texture coordinates with respect to X | |

and Y are specified by the second and third floating-point source vectors. | |

If the LODCLAMP instruction modifier is specified, floating-point | |

level-of-detail clamp value is specified in the <w> component of the third | |

floating-point source vector. The level of detail is computed | |

automatically using the provided partial derivatives. | |

Issues | |

(1) How does this extension compare to the ARB_sparse_texture2 extension? | |

RESOLVED: We extend the mechanisms provided by ARB_sparse_texture2 in | |

adding built-in texture and image lookup functions clamping the final | |

level of detail computed based on texture coordinates, derivatives, and | |

LOD bias to a minimum LOD specified in the shader. | |

(2) The combination of this extension and GL_ARB_sparse_texture2 add a | |

*large* number of new built-in functions. | |

What can we do to control this? | |

RESOLVED: We chose not to add any "sparse" or "LOD clamp" 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 obviously don't support features that make no sense -- for example, | |

LOD clamp on single-level rectangle textures. | |

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. | |

(3) For new "LOD clamp" functions, how does the LOD clamp interact with | |

the LOD bias? | |

RESOLVED: The LOD clamp is applied after the LOD bias. Clamping to the | |

LOD provided in the shader is logically applied at the same point in the | |

pipeline where the LOD clamps based on the texture/sampler parameters | |

TEXTURE_{MIN,MAX}_LOD are applied. | |

Revision History | |

Revision 1 | |

- Split clamp functions from ARB_sparse_texture2 |