Name

    EXT_texture_filter_minmax

Name Strings

    GL_EXT_texture_filter_minmax

Contact

    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

Status

    Shipping

Version

    Last Modified Date:         March 27, 2015
    Revision:                   2

Number

    OpenGL Extension #464
    OpenGL ES Extension #227

Dependencies

    This extension is written against the OpenGL 4.3 Specification
    (Compatibility Profile), dated February 14, 2013.

    OpenGL 1.0 is required.

    This extension interacts with EXT_texture_filter_anisotropic.

    This extension interacts with EXT_direct_state_access.

    This extension interacts with OpenGL ES 3.1 (June 4, 2014).

    When implemented for OpenGL ES 3.1, this extension interacts with
    EXT_texture_border_clamp.

    When implemented for OpenGL ES 3.1, this extension interacts with
    OES_texture_stencil8.

Overview

    In unextended OpenGL 4.3, 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_EXT) 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}EXT,
    TextureParameterI{u}ivEXT, GetTextureParameter{i f}vEXT,
    GetTextureParameterI{u}ivEXT, MultiTexParameter{i f}{v}EXT,
    MultiTexParameterI{u}ivEXT, GetMultiTexParameter{i f}vEXT, and
    GetMultiTexParameterI{u}ivEXT:

        TEXTURE_REDUCTION_MODE_EXT                  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}EXT, TextureParameterI{u}ivEXT,
    MultiTexParameter{i f}{v}EXT, or MultiTexParameterI{u}ivEXT when <pname>
    is TEXTURE_REDUCTION_MODE_EXT:

        WEIGHTED_AVERAGE_EXT                        0x9367
        MIN                                         (reused from core)
        MAX                                         (reused from core)

Modifications to the OpenGL 4.3 Specification (Compatibility Profile)

    Modify Section 8.10, Texture Parameters (p. 241)

    (add to Table 8.24, pp. 241-243)

      Name                              Type    Legal Values
      --------------------------        ----    --------------------
      TEXTURE_REDUCTION_MODE_EXT        enum    WEIGHTED_AVERAGE_EXT, 
                                                MIN, MAX


    Modify Section 8.14.2, Coordinate Wrapping and Texel Selection (p. 254)

    (add below the equations specifying the values i_0, j_0, ... beta, gamma)

    ... 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 (p. 259)

    (modify the last paragraph in the section, p. 261)

    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 (p. 263)

    (modify the last two bullets in the section, p. 264)

      * The internal format of the texture arrays is integer (see tables 8.19-
        8.20), the texture reduction mode is WEIGHTED_AVERAGE_EXT, and either
        the magnification filter is not NEAREST, or the minification filter is
        neither NEAREST nor NEAREST_MIPMAP_NEAREST.

      * The internal format of the texture is DEPTH_STENCIL, the DEPTH_-
        STENCIL_TEXTURE_MODE for the texture is STENCIL_INDEX, the texture
        reduction mode is WEIGHTED_AVERAGE_EXT, and either the magnification
        filter or the minification filter is not NEAREST.


    Insert before Section 8.23, sRGB Texture Color Conversion (p. 279)

    Section 8.X, 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_EXT 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_EXT 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_EXT is used.

    If a texture access using a reduction mode of MIN or MAX is used with a
    texture access with depth comparisons enabled (section 8.22.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.

Additions to the AGL/GLX/WGL Specifications

    None.

Errors

    INVALID_ENUM is generated when SamplerParameter*, TexParameter*,
    TextureParameter*EXT, and MultiTextureParameter*EXT is called with a
    <pname> of TEXTURE_REDUCTION_MODE_EXT and a <param> value or value pointed
    to by <params> points that is not one of WEIGHTED_AVERAGE_EXT, MIN, or
    MAX.

New State

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

                                                     Initial
    Get Value                   Type  Get Command     Value      Description                Sec.
    --------------------------  ----  ------------  ---------    ------------------------   -----
    TEXTURE_REDUCTION_MODE_EXT  E     GetTexParam-  WEIGHTED_     Texture reduction mode     8.10
                                       eteriv       AVERAGE_EXT   (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.

Dependencies on EXT_direct_state_access

    If EXT_direct_state_access is not supported, references to these functions
    should be removed:

        TextureParameter{i f}{v}EXT, TextureParameterI{u}ivEXT,
        GetTextureParameter{i f}vEXT, GetTextureParameterI{u}ivEXT,
        MultiTexParameter{i f}{v}EXEXTT, MultiTexParameterI{u}ivEXT,
        GetMultiTexParameter{i f}vEXT, and GetMultiTexParameterI{u}ivEXT

Interactions with EXT_texture_border_clamp

    References to each of the following functions should be decorated with the
    EXT suffix:

        SamplerParameterI{u}iv, GetSamplerParameterI{u}iv,
        TexParameterI{u}iv, and GetTexParameterI{u}iv

    If EXT_texture_border_clamp is not supported, all references to the above
    functions should be removed.

Interactions with OpenGL ES 3.1

    Ignore any earlier changes to the "Texture Completeness" section.

    In section 8.16 "Texture Completeness", Modify the last three bullets:

      * The effective internal format specified for the texture arrays is a
        sized internal color format that is not texture-filterable (see table
        8.13), the texture reduction mode is WEIGHTED_AVERAGE_EXT, and either
        the magnification filter is not NEAREST or the minification filter is
        neither NEAREST nor NEAREST_MIPMAP_NEAREST.

      * The effective internal format specified for the texture arrays is a
        sized internal depth or depth and stencil format (see table 8.14), the
        value of TEXTURE_COMPARE_MODE is NONE, the texture reduction mode is
        WEIGHTED_AVERAGE_EXT, and either the magnification filter is not
        NEAREST or the minification filter is neither NEAREST nor
        NEAREST_MIPMAP_NEAREST.

      * The internal format of the texture is DEPTH_STENCIL, the value of
        DEPTH_STENCIL_TEXTURE_MODE for the texture is STENCIL_INDEX, the
        texture reduction mode is WEIGHTED_AVERAGE_EXT, and either the
        magnification filter or the minification filter is not NEAREST.

Interactions with OES_texture_stencil8

    Modify 3.8.13 "Texture Completeness" to change the bullet added by
    OES_texture_stencil8 to the list of reasons a texture would be complete:

      * The internal format of the texture is STENCIL_INDEX, the
        TEXTURE_REDUCTION_MODE_EXT parameter is WEIGHTED_AVERAGE_EXT, and
        either the magnification filter is not NEAREST or the minification
        filter is neither NEAREST nor NEAREST_MIPMAP_NEAREST.

Issues

    (1) What should this extension be called?

      RESOLVED:  EXT_texture_filter_minmax, as it allows for "min" and "max"
      operations during texture filtering.  This follows the precedent of
      EXT_blend_minmax, which provides similar functionality for blending
      values in the framebuffer.

    (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:  The per-sample comparison should be performed prior to the
      min/max reduction.

      This implies the MIN mode for TEXTURE_REDUCTION_MODE_EXT 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_EXT 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.3 doesn't actually 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_EXT 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_EXT 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_EXT work with stencil textures?

      RESOLVED:  Yes.

Revision History

    Revision 2, 2015/03/27
      - Add ES interactions

    Revision 1
      - Internal revisions.
