GL_EXT_gpu_shader5#
Supported Hardware#
Series6, Series6XE, Series6XT
Valid APIs#
OpenGL ES 3.1
Description#
This extension adds a number of useful, but miscellaneous features to the OpenGL ES shading language. These features are as follows:
support for indexing into arrays of opaque types (samplers, and atomic counters) using dynamically uniform integer expressions;
support for indexing into arrays of images and shader storage blocks using only constant integral expressions;
extending the uniform block capability to allow shaders to index into an array of uniform blocks;
a “precise” qualifier allowing computations to be carried out exactly as specified in the shader source to avoid optimization-induced invariance issues (which might cause cracking in tessellation);
new built-in functions supporting:
fused floating-point multiply-add operations;
extending the textureGather() built-in functions provided by OpenGL ES Shading Language 3.10:
allowing shaders to use arbitrary offsets computed at run-time to select a 2x2 footprint to gather from; and
allowing shaders to use separate independent offsets for each of the four texels returned, instead of requiring a fixed 2x2 footprint.
Example#
#extension GL_EXT_gpu_shader5 : require
uniform lowp sampler2DArray arrayOfTextureArrays[8];
uniform lowp sampler2D gatherableTexture;
in highp vec2 textureCoords;
in highp float a, b, c;
void main()
{
...
// Loop through and reference each member of an array of texture arrays.
highp vec4 value = vec4(0.0);
for (uint i = 0; i < 8; ++i)
{
for (uint j = 0; j < 8; ++j)
{
value += texture(arrayOfTextureArrays[i], vec3(textureCoords, j));
}
}
...
// Perform an explicit fused multiply-add
highp float result;
result = fma(a,b,c);
...
// Ensure that no optimisations are done on any calculations that affect the result of a value (result2);
precise highp float result2;
result2 = a * b + c;
...
// Gather four texels from a texture that aren't necessarily neighbours, obtaining the red channel.
ivec2 offsets[4] = {ivec2(0,0), ivec2(5, 0), ivec2(5, 5), ivec2(0, 5)};
vec4 gatheredTexels = textureGatherOffsets(gatherableTexture, textureCoords, offsets, 0);
...
}