blob: 4b63f1d94ccbf81aa094bea6920a25abd9954ef8 [file] [log] [blame]
Name Strings
Jon Leech (oddhack 'at'
Pat Brown, NVIDIA Corporation (pbrown 'at'
Jeff Bolz, NVIDIA Corporation
Mark Kilgard, NVIDIA Corporation
Eric Werness, NVIDIA Corporation
James Helferty, NVIDIA Corporation
Daniel Koch, NVIDIA Corporation
Copyright (c) 2015 The Khronos Group Inc. Copyright terms at
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
Complete. Approved by the ARB on June 26, 2015.
Ratified by the Khronos Board of Promoters on August 7, 2015.
Version 6, April 20, 2015
ARB Extension #188
This extension is written against the OpenGL 4.5 Specification (Core
Profile), dated February 2, 2015.
OpenGL 3.3 is required.
This extension interacts with EXT_texture_filter_anisotropic.
In unextended OpenGL, minification and magnification filters such as
LINEAR allow texture lookups to returned a filtered texel value produced
by computing an weighted average of a collection of texels in the
neighborhood of the texture coordinate provided.
This extension provides a new texture and sampler parameter
(TEXTURE_REDUCTION_MODE_ARB) which allows applications to produce a
filtered texel value by computing a component-wise minimum (MIN) or
maximum (MAX) of the texels that would normally be averaged. The
reduction mode is orthogonal to the minification and magnification filter
parameters. The filter parameters are used to identify the set of texels
used to produce a final filtered value; the reduction mode identifies how
these texels are combined.
New Procedures and Functions
New Tokens
Accepted by the <pname> parameter to SamplerParameter{i f}{v},
SamplerParameterI{u}iv, GetSamplerParameter{i f}v,
GetSamplerParameterI{u}iv, TexParameter{i f}{v}, TexParameterI{u}iv,
GetTexParameter{i f}v, GetTexParameterI{u}iv, TextureParameter{i f}{v},
TextureParameterI{u}iv, GetTextureParameter{i f}v,
and GetTextureParameterI{u}iv:
Accepted by the <param> or <params> parameter to SamplerParameter{i f}{v},
SamplerParameterI{u}iv, TexParameter{i f}{v}, TexParameterI{u}iv,
TextureParameter{i f}{v}, and TextureParameterI{u}iv when <pname> is
MIN (reused from core)
MAX (reused from core)
Modifications to the OpenGL 4.3 Specification (Compatibility Profile)
Modify Section 8.10, Texture Parameters
(add to Table 8.17, pp 227-228.)
Name Type Legal Values
-------------------------- ---- --------------------
[[ jon - Note that the generalized error language for Tex*Parameter* and
SamplerParameter* catches the pname/param mismatch for this parameter,
previously mentioned explicitly in the "Errors" section of the EXT spec.
Modify Section 8.14.2, Coordinate Wrapping and Texel Selection
(add below the equations specifying the values i_0, j_0, ... beta, gamma
on p. 246):
... where frac(x) denotes the fractional part of <x>, and may be
quantized to a fixed-point value with implementation-dependent
Modify Section 8.14.3, Mipmapping
(modify the last paragraph in the section, p. 251)
The final texture value is then found as:
tau = (1 - frac(lambda)) * tau_1 + frac(lambda) * tau_2,
where frac(x) denotes the fractional part of <x> and may be quantized to
a fixed-point value with implementation-dependent precision.
Modify Section 8.17, Texture Completeness
[[ Jon - this change is with regard to the 20150421 GL 4.5 spec update and
the changes in the completeness list resulting from bug 12791 ]]
(modify the last bullet in the section, p. 264, so that this point only
applies when the reduction mode samples from two mip levels):
* Any of
- The internal format of the texture arrays is integer (see tables
8.19- 8.20), and the texture reduction mode is WEIGHTED_AVERAGE_ARB;
- THe internal format is STENCIL_INDEX;
- The internal format is DEPTH_STENCIL, the value of
texture reduction mode is WEIGHTED_AVERAGE_ARB
and either the magnification filter is not NEAREST, or the
minification filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST.
(add a new bullet point expressing the constraints on supported texture
* The texture reduction mode is MIN or MAX, and that reduction mode is
not supported for the texture dimensionality, multisample state, and
internal format. Support for these reduction modes is only
guaranteed in the following cases:
- The texture is not multisampled (see section 8.8)
- The internal format of the texture image is RED
[[ Compatibility profile only: add LUMINANCE and INTENSITY ]]
- The data type of the texture image is fixed- or floating-point.
Implementations may also support these reduction modes for other
formats. Such support can be determined by calling
GetInternalformat* (see section 22.3) with <pname>
Insert before Section 8.24, sRGB Texture Color Conversion (p. 271)
Section 8.23post, Texture Reduction Modes
When using minification and magnification filters such as LINEAR, or when
using anisotropic texture filtering, the values of multiple texels will
normally be combined using a weighted average to produce a filtered
texture value. However, a filtered texture value may also be produced by
computing per-component minimum and maximum values over the set of texels
that would normally be averaged. The texture and sampler parameter
TEXTURE_REDUCTION_MODE_EXT controls the process by which multiple texels
are combined to produce a filtered texture value. When set to its default
state of WEIGHTED_AVERAGE_EXT, a weighted average will be computed, as
described in previous sections.
When TEXTURE_REDUCTION_MODE_ARB is MIN or MAX, the equations to produce a
filtered texel value for LINEAR minification or magnification filters
(equation 8.10 and subsequent unnumbered ones) are replaced with
tau = reduce((1-alpha)*(1-beta)*(1-gamma), tau_i0_j0_k0,
( alpha)*(1-beta)*(1-gamma), tau_i1_j0_k0,
(1-alpha)*( beta)*(1-gamma), tau_i0_j1_k0,
( alpha)*( beta)*(1-gamma), tau_i1_j1_k0,
(1-alpha)*(1-beta)*( gamma), tau_i0_j0_k1,
( alpha)*(1-beta)*( gamma), tau_i1_j0_k1,
(1-alpha)*( beta)*( gamma), tau_i0_j1_k1,
( alpha)*( beta)*( gamma), tau_i1_j1_k1),
tau = reduce((1-alpha)*(1-beta), tau_i0_j0,
( alpha)*(1-beta), tau_i1_j0,
(1-alpha)*( beta), tau_i0_j1,
( alpha)*( beta), tau_i1_j1), or
tau = reduce((1-alpha), tau_i0,
( alpha), tau_i1)
for three-, two-, and one-dimensional texture accesses, respectively. The
function reduce() is defined to operate on pairs of weights and texel
values. If the reduction mode is MIN or MAX, reduce() computes a
component-wise minimum or maximum, respectively, of the R, G, B, and A
components of the set of provided texels with non-zero weights.
For minification filters involving two texture levels
two selected levels, tau_1 and tau_2, are produced as described in section
8.14.3, but using the reductions described immediately above. The two
filtered values will be combined to generate a final result using the
tau = reduce((1-frac(lambda)), tau_1,
( frac(lambda)), tau_2),
where tau_1 and tau_2 are filtered values for levels d_1 and d_2, and
frac(lambda) is the fractional portion of the texture level of detail and
may be quantized to a fixed-point value with implementation-dependent
If anisotropic texture filtering is enabled, a reduction mode of
WEIGHTED_AVERAGE_ARB will produce a filtered texel value by computing a
weighted average of texel values, using an implementation-dependent set of
selected texels and weights. When using reduction modes of MIN or MAX, a
filtered texel value will be produced using the equation
tau = reduce(tau_1, ..., tau_N)
where tau_1 through tau_N are the <N> texels that would be used with
non-zero weights when a reduction mode of WEIGHTED_AVERAGE_ARB is used.
If a texture access using a reduction mode of MIN or MAX is used with a
texture access with depth comparisons enabled (see section 8.23.1), the
individual tau values used in the reduce() functions should reflect the
results of the depth comparison (0.0 or 1.0), not the original values in
the depth texture.
Modify Section 22.3.1, Supported Operation Queries
(add to the table of support pnames starting on p. 542)
* TEXTURE_REDUCTION_MODE_ARB: Support for filtering with reduction modes
MIN and MAX is returned in <params>.
Additions to the AGL/GLX/WGL Specifications
New State
Add to Table 23.23, Textures (state per sampler object)
Get Value Type Get Command Value Description Sec.
-------------------------- ---- ----------------- -------------------- ------------------------ -----
TEXTURE_REDUCTION_MODE_ARB E GetTexParameteriv WEIGHTED_AVERAGE_ARB Texture reduction mode 8.10
(average, minimum, maximum)
New Implementation Dependent State
Dependencies on EXT_texture_filter_anisotropic
If EXT_texture_filter_anisotropic is not supported, references to
anisotropic filtering in the discussion of texture reduction modes should
be removed.
Interactions with the compatibility profile
If the compatibility profile is supported, then LUMINANCE and INTENSITY
are added to the list of formats guaranteed to support MIN and MAX
reduction modes.
(1) What should this extension be called?
RESOLVED: ARB_texture_filter_minmax, like EXT_texture_filter_minmax on
which it is based.
(2) How does this extension interact with restrictions on min/mag filters
textures with integer components?
RESOLVED: In unextended OpenGL 4.3, a texture with integer components
(e.g., RGBA8I) is considered incomplete if used with minification or
magnification filters that normally average multiple samples (anything
other than NEAREST and NEAREST_MIPMAP_NEAREST). This restriction exists
to avoid the need to define semantics for computing a weighted average
of integer values with non-integer weights, which will produce an
arithmetic result that is not an integer. Given that the MIN and MAX
reduction modes don't do any arithmetic and won't produce non-integer
values, we allow these reduction modes to be used with arbitrary
(3) How does this extension interact with TEXTURE_COMPARE_MODE set
to COMPARE_R_TO_TEXTURE for depth textures?
RESOLVED: This extension does not require support for DEPTH_COMPONENT
textures with the new filter modes, but if they are supported, the
per-sample comparison should be performed prior to the min/max
This implies the MIN mode for TEXTURE_REDUCTION_MODE_ARB in this case
returns a FALSE value if *any* of the texels compare FALSE; to return
TRUE, every comparison must be TRUE. Likewise this implies the MAX
mode for TEXTURE_REDUCTION_MODE_ARB in this case returns a TRUE value
if *any* of the texels compare TRUE; to return FALSE, every comparison
must be FALSE.
Note that unextended OpenGL 4.5 doesn't require that linear filtering
actually average depth comparison results of 0.0 and 1.0, but behaving
this way appears to be common practice and may be required for other
3D graphics APIs.
(4) Do interpolation weights figure into the min/max reductions?
RESOLVED: Yes. Texels that would have a weight of zero for the normal
WEIGHTED_AVERAGE_ARB reduction modes should not be considered when
performing MIN or MAX reductions.
Note that implementations may end up quantize the interpolation
weights to fixed-point values with implementation-dependent precision.
This may cause samples to be ignored in WEIGHTED_AVERAGE_ARB or
MIN/MAX reductions. For example, if you are using a minification
filter of LINEAR_MIPMAP_LINEAR and the computed LOD is 2.00001, the
implementation may round the LOD as being exactly 2.0 and ignore the
texels in level 3 for the purposes of trilinear filtering.
(5) Should TEXTURE_REDUCTION_MODE_ARB work with stencil textures?
(6) What are the constraints on supported texture targets and formats?
RESOLVED: After conducting a voting exercise, we concluded that the
set of supported formats would be limited to single-channel (R/L/I),
fixed- or floating-point, and that the GetInternalformat query should
be used to expose support for additional formats.
RESOLVED: Formats which don't support MIN/MAX reduction are treated as
incomplete textures when those reduction modes are set.
RESOLVED: TexParameter* does not generate an error when setting
MIN/MAX reduction for unsupported texture types. This can't catch all
misuse even when not using separate sampler objects, so only having
the mismatch affect completeness seems cleaner.
DISCUSSION: Different vendors all had different constraints. There
were problems with multi-channel textures, multisampled textures,
integer textures, and depth component and stencil index textures.
Revision History
Version 1, 2015/02/20 (Jon Leech)
- Branch from EXT_texture_filter_minmax and add issue 6 from ARB
Version 2, 2015/02/25 (Jon Leech)
- Rebase against GL 4.5 and change suffixes to ARB. Change minimum
required GL version from 1.0 to 3.3 (which is where
SamplerParameter* commands were introduced). Add constraints on
texture types guaranteed to support MIN/MAX reduction in sections
8.17, and query for additional supported types in section 22.3.1.
Remove no longer needed Errors section. Update issue 6 with proposed
resolution of the format compatibility issue.
Version 3, 2015/02/26 (Jon Leech)
- Remove DEPTH_COMPONENT from formats guaranteed to be supported, and
add LUMINANCE and INTENSITY in the compatibility profile. Clean up
state table entry.
Version 4, 2015/03/20 (Jon Leech)
- Remove nonexistent GREEN and BLUE internal formats. Remove
restriction to two-dimensional images (Intel determined they do not
require it). Update issues 3 and 6 to track restrictions of various
vendor hardware.
Version 5, 2015/04/01 (Jon Leech)
- Reduce required format support to single-channel (R/L/I), fixed- and
floating-point textures only. Remove guaranteed ALPHA format support
in the compatibility profile. Reflow text of Issues.
Version 6, 2015/04/20 (Jon Leech)
- Modify edits to the completeness conditions in section 8.17 based on
changes to the GL spec in this area (Bug 12791).