Name AMD_texture_gather_bias_lod Name Strings GL_AMD_texture_gather_bias_lod Contact Rex Xu, AMD (Rex.Xu 'at' amd.com) Contributors Rex Xu, AMD Timothy Lottes, AMD Qun Lin, AMD Daniel Rakos, AMD Graham Sellers, AMD Dominik Witczak, AMD Matthäus G. Chajdas, AMD Status Shipping Version Last Modified Date: 05/10/2017 Author Revision: 5 Number 502 Dependencies This extension is written against the OpenGL 4.5 (Core Profile) Specification. This extension is written against version 4.50 of the OpenGL Shading Language Specification. OpenGL 4.0 and GLSL 4.00 are required. This extension interacts with ARB_sparse_texture2. Overview This extension was developed based on existing built-in texture gather functions to allow implementations supporting bias of implicit level of detail and explicit control of level of detail in texture gather operations. New Procedures and Functions None. New Tokens None. 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_AMD_texture_gather_bias_lod : where is as specified in section 3.3. New preprocessor #defines are added to the OpenGL Shading Language: #define GL_AMD_texture_gather_bias_lod 1 Additions to Chapter 8 of the OpenGL Shading Language Specification (Built-in Functions) Modify Section 8.9.3 Texture Gather Functions (modify the first sentence of the first paragraph on p. 170) The texture gather functions take components of a single floating-point vector operand as a texture coordinate, determine a set of four texels to sample either from the base level of detail and its bias (if present) of the specified texture image or from the explicit level of detail (if present) of this texture image, and return one component from each texel in a four- component result vector. (modify certain functions in the "Syntax" table cell of each gather function group, adding an optional parameter for those sampler types: gsampler2D, gsampler2DArray, gsamplerCube, gsamplerCubeArray, and modify four-texel sampling formulas in the "Description" table cell of textureGather() on p. 171-172) +--------------------------------------------------------------+------------------------------+ | Syntax | Description | +--------------------------------------------------------------+------------------------------+ | gvec4 textureGather(gsampler2D sampler, vec2 P [, int comp | Returns the value | | [, float bias]]) | | | gvec4 textureGather(gsampler2DArray sampler, vec3 P | gvec4( | | [, int comp [, float bias]]) | Sample_i0_j1( | | gvec4 textureGather(gsamplerCube sampler, vec3 P | P, base, bias).comp, | | [, int comp [, float bias]]) | Sample_i1_j1( | | gvec4 textureGather(gsamplerCubeArray sampler, vec4 P | P, base, bias).comp, | | [, int comp [, float bias]]) | Sample_i1_j0( | | ... | P, base, bias).comp, | | | Sample_i0_j0( | | | P, base, bias).comp) | | | ... | +--------------------------------------------------------------+------------------------------+ | gvec4 textureGatherOffset(gsampler2D sampler, vec2 P, | Perform a texture gather | | ivec2 offset [, int comp | operation as in | | [, float bias]]) | textureGather() by | | gvec4 textureGatherOffset(gsampler2DArray sampler, vec3 P, | as described in | | ivec2 offset [, int comp | textureOffset() except that | | [, float bias]]) | the can be variable | | ... | (non constant) and ... | +--------------------------------------------------------------+------------------------------+ | gvec4 textureGatherOffsets(gsampler2D sampler, vec2 P, | Operate identically to | | ivec2 offsets[4] [, int comp | textureGatherOffset() except | | [, float bias]]) | that is used to | | gvec4 textureGatherOffsets(gsampler2DArray sampler, vec3 P, | determine the location of the| | ivec2 offsets[4] [, int comp | four texels to sample. ... | | [, float bias]]) | | | ... | | +--------------------------------------------------------------+------------------------------+ (insert new gather function table cells, at the end of the section, p. 172) +--------------------------------------------------------------+------------------------------+ | Syntax | Description | +--------------------------------------------------------------+------------------------------+ | gvec4 textureGatherLodAMD(gsampler2D sampler, vec2 P, | Perform a texture gather | | float lod [, int comp]) | operation as in | | gvec4 textureGatherLodAMD(gsampler2DArray sampler, vec3 P, | textureGather() with explicit| | float lod [, int comp]) | LOD, but the four-texel | | gvec4 textureGatherLodAMD(gsamplerCube sampler, vec3 P, | sampling is modified as | | float lod [, int comp]) | follow: | | gvec4 textureGatherLodAMD(gsamplerCubeArray sampler, vec4 P, | | | float lod [, int comp]) | gvec4( | | | Sample_i0_j1(P, lod).comp, | | | Sample_i1_j1(P, lod).comp, | | | Sample_i1_j0(P, lod).comp, | | | Sample_i0_j0(P, lod).comp) | +--------------------------------------------------------------+------------------------------+ | gvec4 textureGatherLodOffsetAMD(gsampler2D sampler, vec2 P, | Perform a texture gather | | float lod, ivec2 offset | operation as in | | [, int comp]) | textureGatherOffset() but | | gvec4 textureGatherLodOffsetAMD(gsampler2DArray sampler, | with explicit LOD. | | vec3 P, float lod, | | | ivec2 offset [, int comp]) | | +--------------------------------------------------------------+------------------------------+ | gvec4 textureGatherLodOffsetsAMD(gsampler2D sampler, vec2 P, | Perform a texture gather | | float lod, ivec2 offsets[4] | operation as in | | [, int comp]) | textureGatherOffsets() but | | gvec4 textureGatherLodOffsetsAMD(gsampler2DArray sampler, | with explicit LOD. | | vec3 P, float lod, | | | ivec2 offsets[4] | | | [, int comp]) | | +--------------------------------------------------------------+------------------------------+ Dependencies on ARB_sparse_texture2 If the shader enables ARB_sparse_texture2, this extension modifies certain variants of sparseTextureGather*(), adding optional parameter for those sampler types: gsampler2D, gsampler2DArray, gsamplerCube, gsamplerCubeArray. +--------------------------------------------------------------+------------------------------+ | Syntax | Description | +--------------------------------------------------------------+------------------------------+ | int sparseTextureGatherARB(gsampler2D sampler, vec2 P, | Do a texture gather operation| | out gvec4 texel [, int comp | as in textureGather(), but | | [, float bias]]) | return texture access | | int sparseTextureGatherARB(gsampler2DArray sampler, vec3 P, | residency information from | | out gvec4 texel [, int comp | the function and the filtered| | [, float bias]]) | lookup result in the out | | int sparseTextureGatherARB(gsamplerCube sampler, vec3 P, | parameter . | | out gvec4 texel [, int comp | | | [, float bias]]) | | | int sparseTextureGatherARB(gsamplerCubeArray sampler, vec4 P,| | | out gvec4 texel [, int comp | | | [, float bias]]) | | | ... | | +--------------------------------------------------------------+------------------------------+ | int sparseTextureGatherOffsetARB(gsampler2D sampler, vec2 P, | Do a texture gather operation| | ivec2 offset, | as in textureGatherOffset(), | | out gvec4 texel | but return texture access | | [, int comp [, float bias]])| residency information from | | int sparseTextureGatherOffsetARB(gsampler2DArray sampler, | the function and the filtered| | vec3 P, ivec2 offset, | lookup result in the out | | out gvec4 texel | parameter . | | [, int comp [, float bias]])| | | ... | | +--------------------------------------------------------------+------------------------------+ | int sparseTextureGatherOffsetsARB(gsampler2D sampler, vec2 P,| Do a texture gather operation| | ivec2 offsets[4], | as in textureGatherOffsets(),| | out gvec4 texel | but return texture access | | [, int comp | residency information from | | [, float bias]]) | the function and the filtered| | int sparseTextureGatherOffsetsARB(gsampler2DArray sampler, | lookup result in the out | | vec3 P, ivec2 offsets[4], | parameter . | | out gvec4 texel | | | [, int comp | | | [, float bias]]) | | | ... | | +--------------------------------------------------------------+------------------------------+ Meanwhile, this extension adds additional texture gather functions as follow if the shader enables ARB_sparse_texture2, providing explicit control of level of detail. +--------------------------------------------------------------+------------------------------+ | Syntax | Description | +--------------------------------------------------------------+------------------------------+ | int sparseTextureGatherLodAMD(gsampler2D sampler, vec2 P, | Do a texture gather operation| | float lod, out gvec4 texel | as in textureGather() with, | | [, int comp]) | explicit LOD, but return | | int sparseTextureGatherLodAMD(gsampler2DArray sampler, | texture access residency | | vec3 P, float lod, | information from the function| | out gvec4 texel [, int comp]) | and the filtered lookup | | int sparseTextureGatherLodAMD(gsamplerCube sampler, vec3 P, | result in the out parameter | | float lod, out gvec4 texel | . | | [, int comp]) | | | int sparseTextureGatherLodAMD(gsamplerCubeArray sampler, | | | vec4 P, float lod, | | | out gvec4 texel [, int comp]) | | +--------------------------------------------------------------+------------------------------+ | int sparseTextureGatherLodOffsetAMD(gsampler2D sampler, | Do a texture gather operation| | vec2 P, float lod, | as in textureGatherOffset() | | ivec2 offset, | with explicit LOD, but return| | out gvec4 texel | texture access residency | | [, int comp]) | information from the function| | int sparseTextureGatherLodOffsetAMD(gsampler2DArray sampler, | and the filtered lookup | | vec3 P, float lod, | result in the out parameter | | ivec2 offset, | . | | out gvec4 texel | | | [, int comp]) | | +--------------------------------------------------------------+------------------------------+ | int sparseTextureGatherLodOffsetsAMD(gsampler2D sampler, | Do a texture gather operation| | vec2 P, float lod, | as in textureGatherOffsets() | | ivec2 offsets[4], | with explicit LOD, but return| | out gvec4 texel | texture access residency | | [, int comp]) | information from the function| | int sparseTextureGatherLodOffsetsAMD(gsampler2DArray sampler,| and the filtered lookup | | vec3 P, float lod, | result in the out parameter | | ivec2 offsets[4], | . | | out gvec4 texel | | | [, int comp]) | | +--------------------------------------------------------------+------------------------------+ Errors None. New State None. New Implementation Dependent State None. Issues (1) Could you explain the function syntax since is added as another optional parameter? RESOLVED: This extension adds as another optional parameter apart from the existing parameter . The function syntax is somewhat similar to rules of default parameters in C++. To be exact, when is not specified, should not be specified as well; when is specified, could be specified or not. For example, uniform sampler2D samp2D; vec2 P; int comp; float bias; ... textureGather(samp2D, P); // legal, both comp and bias are not specified textureGather(samp2D, P, bias); // illegal, bias is specified while comp is not textureGather(samp2D, P, comp); // legal, comp is specified while bias is not textureGather(samp2D, p, comp, bias); // legal both comp and bias are specified (2) Which level-of-detail do texture gather functions use, if the extension is defined? RESOLVED: If GL_AMD_texture_gather_bias_lod extension is *enabled*, *all* texture gather functions (ie. the ones which do not take the extra bias argument and the ones that do) fetch texels from implicit LOD in fragment shader stage. In all other shader stages, base level is used instead. If the extension is *disabled*, all texture gather functions always fetch texels from the base mip level. Revision History Rev. Date Author Changes ---- -------- -------- --------------------------------------------------------------------- 5 05/10/17 dwitczak Added issue 2. 4 01/24/17 dwitczak Fix sparseTextureGatherOffsetsARB() and sparseTextureGatherLodOffsetAMD() function prototypes. 3 11/17/16 rexu Clarify that when parameter is specified, the optional parameter, prior to , should be specified as well based on the calling rules of default parameters. 2 11/16/16 rexu Add the interaction with ARB_sparse_texture2. 1 11/15/16 rexu Initial draft.