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 parameter of BlendEquation and BlendEquationi, and by the and 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 , and in the description of BlendEquation{i} and BlendEquationSeparate{i}, p.262: "... , , 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