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