blob: 0c617ad800de8af7fa33e3d7aa839a8eeeec9d73 [file] [log] [blame]
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