Name

    ARB_texture_filter_minmax

Name Strings

    GL_ARB_texture_filter_minmax

Contact

    Jon Leech (oddhack 'at' sonic.net)
    Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com)

Contributors

    Jeff Bolz, NVIDIA Corporation
    Mark Kilgard, NVIDIA Corporation
    Eric Werness, NVIDIA Corporation
    James Helferty, NVIDIA Corporation
    Daniel Koch, NVIDIA Corporation

Notice

    Copyright (c) 2015 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Status

    Complete. Approved by the ARB on June 26, 2015.
    Ratified by the Khronos Board of Promoters on August 7, 2015.

Version

    Version 6, April 20, 2015

Number

    ARB Extension #188

Dependencies

    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.

Overview

    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

    None.

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:

        TEXTURE_REDUCTION_MODE_ARB                  0x9366

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

        WEIGHTED_AVERAGE_ARB                        0x9367
        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
      --------------------------        ----    --------------------
      TEXTURE_REDUCTION_MODE_ARB        enum    WEIGHTED_AVERAGE_ARB,
                                                MIN, MAX

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


    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
        DEPTH_STENCIL_TEXTURE_MODE for the texture is STENCIL_INDEX, and the
        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
    formats)

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


    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
    (NEAREST_MIPMAP_LINEAR and LINEAR_MIPMAP_LINEAR), filtered values for the
    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
    equation

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

    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

    None.

New State

    Add to Table 23.23, Textures (state per sampler object)

                                                           Initial
    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

    None.

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.

Issues

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

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

      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?

      RESOLVED:  Yes.

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

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