Name

    NV_blend_minmax_factor

Name Strings

    GL_NV_blend_minmax_factor

Contributors

    Jeff Bolz
    Pierre Boudier
    Charles Hansen
    Bill Sebastian, Visual Music Systems
    Graham Sellers, original AMD specification

Contact

    Mark Kilgard, NVIDIA (mjk 'at' nvidia.com)

Status

    Implemented in NVIDIA's August 2017 SIGGRAPH driver

Version

    Last Modified Date:         July 26, 2017
    Author Revision:            3

Number

    OpenGL Extension #510
    OpenGL ES Extension #285

Dependencies

    The extension is written against the OpenGL 4.1 (Core) Specification.

    OpenGL 1.0 or ES 2.0 is required.

    This extension interacts with
    NVX_blend_equation_advanced_multi_draw_buffers as specified.

    This extension interacts with ARB_blend_func_extended,
    EXT_blend_func_extended (for ES), or OpenGL 3.3 as specified.

    This extension interacts with NV_blend_equation_advanced,
    NV_blend_equation_advanced_coherent, KHR_blend_equation_advanced,
    KHR_blend_equation_advanced_coherent, OpenGL 4.5, or ES 3.2 as
    specified.

Overview

    The EXT_blend_minmax extension extended the GL's blending
    functionality to allow the blending equation to be specified by the
    application. That extension introduced the MIN_EXT and MAX_EXT blend
    equations, which caused the result of the blend equation to become
    the minimum or maximum of the source color and destination color,
    respectively.

    The MIN_EXT and MAX_EXT blend equations, however, do not include the
    source or destination blend factors in the arguments to the min and
    max functions.  This extension provides two new blend equations that
    produce the minimum or maximum of the products of the source color
    and source factor, and the destination color and destination factor.

    This NVIDIA extension has some limitations relative to the
    AMD_blend_minmax_factor extension.  See issues #1, #2, and #3.

New Procedures and Functions

    None.

New Tokens

    Accepted by the <mode> parameter of BlendEquation and BlendEquationi, and by
    the <modeRGB> and <modeAlpha> parameters of BlendEquationSeparate and
    BlendEquationSeparatei:

        FACTOR_MIN_AMD                              0x901C
        FACTOR_MAX_AMD                              0x901D

Additions to Chapter 2 of the OpenGL 4.1 (Core) Specification (OpenGL Operation)

    None.

Additions to Chapter 3 of the OpenGL 4.1 (Core) Specification (Rasterization)

    None.

Additions to Chapter 4 of the OpenGL 4.1 (Core) Specification (Per-Fragment
Operations and the Frame Buffer)

    Modify the list of accepted tokens for <mode>, <modeRGB> and <modeAlpha>
    in the description of BlendEquation{i} and BlendEquationSeparate{i}, p.262:

    "... <mode>, <modeRGB>, <modeAlpha> must be one of FUNC_ADD, FUNC_SUBTRACT,
    FUNC_REVERSE_SUBTRACT, MIN, MAX, FACTOR_MIN_AMD, or FACTOR_MAX_AMD. ..."

    Add to Table 4.1: RGB and Alpha Blend Equations

    +-----------------+---------------------------+-----------------------------+
    | Mode            | RGB Components            | Alpha Component             |
    +-----------------+---------------------------+-----------------------------+
    | FACTOR_MIN_AMD  | R = min(Rs * Sr, Rd * Dr) | A = min(As * Sa, Ad * Da)   |
    |                 | G = min(Gs * Sg, Gd * Dg) |                             |
    |                 | B = min(Bs * Sb, Bd * Db) |                             |
    +-----------------+---------------------------+-----------------------------+
    | FACTOR_MAX_AMD  | R = max(Rs * Sr, Rd * Dr) | A = max(As * Sa, Ad * Da)   |
    |                 | G = max(Gs * Sg, Gd * Dg) |                             |
    |                 | B = max(Bs * Sb, Bd * Db) |                             |
    +-----------------+---------------------------+-----------------------------+

    Add the following precision limitation after table 4.1:

    "An implementation may perform the computations for the FACTOR_MIN_AMD
    and FACTOR_MAX_AMD modes in half-precsion floating-point even
    when the representable range of the framebuffer is can represent
    single-precision or better color components."

    Add the following orthogonality restriction after table 4.1:

    "When the NVX_blend_equation_advanced_multi_draw_buffers is not
    supported, the FACTOR_MIN_AMD and FACTOR_MAX_AMD blending equations
    are supported only when rendering to a single color buffer using
    fragment color zero.  In this case, if any non-NONE draw buffer
    enabled for blending uses either the FACTOR_MIN_AMD and FACTOR_MAX_AMD
    blending equations, the error INVALID_OPERATION is generated by
    [[Compatibility Profile:  Begin or any operation that implicitly
    calls Begin (such as DrawElements)]] [[Core Profile:  DrawArrays
    and the other drawing commands defined in section 2.8.3]] if:

      * the draw buffer for color output zero selects multiple color buffers
        (e.g., FRONT_AND_BACK in the default framebuffer); or

      * the draw buffer for any other color output is not NONE.

    Alternatively when the NVX_blend_equation_advanced_multi_draw_buffers
    is supported, if any non-NONE draw buffer enabled for blending uses
    a blend equation of either FACTOR_MIN_AMD or FACTOR_MAX_AMD for
    either RGB or alpha, the error INVALID_OPERATION is generated by
    [[Compatibility Profile:  Begin or any operation that implicitly
    calls Begin (such as DrawElements)]] [[Core Profile:  DrawArrays
    and the other drawing commands defined in section 2.8.3]] if any
    other non-NONE draw buffer uses a different combination of the
    first draw buffer's RGB and alpha blend equation." In other words,
    the FACTOR_MIN_AMD or FACTOR_MAX_AMD blend equations are now allowed
    with multiple draw buffers as long as they use they use identical
    blend equations for RGB and alpha for all non-NONE draw buffers.

    If any non-NONE draw buffer enabled for blending uses any of
    SRC1_COLOR, SRC1_ALPHA, ONE_MINUS_SRC1_COLOR, or ONE_MINUS_SRC1_ALPHA
    for a source or destination blend function, the error
    INVALID_OPERATION is generated by [[Compatibility Profile:  Begin or
    any operation that implicitly calls Begin (such as DrawElements)]]
    [[Core Profile:  DrawArrays and the other drawing commands defined
    in section 2.8.3]]."

Additions to Chapter 5 of the OpenGL 4.1 (Core) Specification (Special Functions)

    None.

Additions to Chapter 6 of the OpenGL 4.1 (Core) Specification (State and
State Requests)

    None.

Additions to Appendix A of the OpenGL 4.1 (Core) Specification (Invariance)

    None.

Additions to the AGL/GLX/WGL Specifications

    None.

Errors

    None.

New State

    Modify Table 6.21: Pixel Operations (cont.) p.343

    Change entries for BLEND_EQUATION_ALPHA and BLEND_EQUATION_RGB to:

    +----------------------+---------+---------------+---------------+-------------------------+-------+
    | Get Value            | Type    | Get Command   | Initial Value | Description             | Sec.  |
    +----------------------+---------+---------------+---------------+-------------------------+-------+
    | BLEND_EQUATION_RGB   | 8* x Z7 | GetIntegeri_v | FUNC_ADD      | RGB Blending Equation   | 4.1.7 |
    |                      |         |               |               | for Draw Buffer i       |       |
    +----------------------+---------+---------------+---------------+-------------------------+-------+
    | BLEND_EQUATION_ALPHA | 8* x Z7 | GetIntegeri_v | FUNC_ADD      | Alpha Blending Equation | 4.1.7 |
    |                      |         |               |               | for Draw Buffer i       |       |
    +----------------------+---------+---------------+---------------+-------------------------+-------+

    * Note that the only change change is that BLEND_EQUATION_RGB and
      BLEND_EQUATION_ALPHA are now Z7 rather than Z5.

Issues

    1)  Why not just implement AMD_blend_factor_minmax?

        RESOLVED:  NVIDIA has a precision limitation and orthogonality
        restrictions.

        Rather than pollute the AMD extension with an incomplete
        implementation, this comparable NV version is API-consistent
        (uses the same token values) and same blending math but documents
        its precision limitation and restrictions.

    2)  What is the precision limitation?

        The GL_FACTOR_MIN_AMD and GL_FACTOR_MAX_AMD blend functions are
        allowed to compute their blend results in half-precision even
        when the framebuffer format is single-precision.  In practice,
        this means the blend modes work but will quantize results
        to the representable range of half-precision, even if the
        framebuffer is full precision.

        This limitation matches the allowance of the advanced blend
        equations introduced by NV_blend_equation_advanced (and
        standardized by KHR_blend_equation and OpenGL 4.5 and ES 3.2).

        This means magnitudes beyond the largest representable magnitude
        of half-precision may be mapped to infinity.  Magnitudes less
        than the smallest representable non-zero magnitude may be mapped
        to zero.  Mantissa bits may be quantied.

        While this limitation allows implementations to perform these
        blend modes in half-precision, it does not require the blend
        modes to be performed in half-precsion.  Implementations are
        allowed to blend with better numerics than half-precision.
        This being said, expect NVIDIA implementations circa 2017 to
        implement these blend modes using half-precision numerics.

    3)  What are the orthogonality restrictions?

        If more than one draw buffer is configured
        with glDrawBuffers (or similar command) and
        NVX_blend_equation_advanced_multi_draw_buffers is supported and at
        least one of the non-NONE draw buffers has GL_FACTOR_MIN_AMD or
        GL_FACTOR_MAX_AMD configured as the buffer's RGB or alpha blend
        equation, then all non-NONE draw buffers must have identical
        blend equations configuration for RGB and alpha; otherwise the
        error GL_INVALID_OPERATION is generated.

        If more than one draw buffer is configured
        with glDrawBuffers (or similar command) and
        NVX_blend_equation_advanced_multi_draw_buffers is NOT
        supported and any one or more of the non-NONE draw buffers has
        GL_FACTOR_MIN_AMD or GL_FACTOR_MAX_AMD configured as the buffer's
        blend equation, the error GL_INVALID_OPERATION is generated.

        If any source or destination blend factor is one of GL_SRC1_COLOR
        for that  draw buffer, GL_SRC1_ALPHA, GL_ONE_MINUS_SRC1_COLOR,
        or GL_ONE_MINUS_SRC1_ALPHA (the dual-source blending factors
        introduced by ARB_blend_func_extended and EXT_blend_func_extended
        and standardized by OpenGL 3.3) for a given enabled draw buffer,
        the error GL_INVALID_OPERATION is generated.

    4)  Do the blend parameters GL_BLEND_PREMULTIPLIED_SRC_NV and
        GL_BLEND_OVERLAP_NV apply to GL_FACTOR_MIN_AMD and GL_FACTOR_MAX_AMD.

        RESOLVED:  No.

        These blend parameters are intended to affect advanced blend modes
        expressed as RGBA compositing operators.  GL_FACTOR_MIN_ARM and
        GL_FACTOR_MAX_AMD can be used separately for RGB and alpha so these
        blend parameters should not apply to them.

    5)  Will these blend modes be coherent
        if NV_blend_equation_advanced_coherent or
        KHR_blend_equation_advanced_coherent are not supported?

        RESOLVED:  No, but they should still operate if
        NV_blend_minmax_factor is advertised.  glBlendBarrierNV or
        glBlendBarrierKHR will be needed to ensure coherency for
        overlapping primitives.

    6)  What NVIDIA GPUs can be expected to implement this extension?

        RESOLVED:  The same set that advertise
        KHR_blend_equation_advanced_coherent and
        NV_blend_equation_advanced_coherent.

        In practice, this is Maxwell GPUs and beyond.

    7)  Does this extension support OpenGL ES?

        RESOLVED:  Yes.

Revision History

    Rev.    Date      Author    Changes
    ----  --------    --------  -----------------------------------------
     3    07/26/2017  mjk       public release
