Blend¶
This state controls blending of the final fragments into the target rendering buffers.
Blend Factors¶
The blend factors largely follow the same pattern as their counterparts in other modern and legacy drawing APIs.
Dual source blend factors are supported for up to 1 MRT, although you can advertise > 1 MRT, the stack cannot handle them for a few reasons. There is no definition on how the 1D array of shader outputs should be mapped to something that would be a 2D array (location, index). No current hardware exposes > 1 MRT, and we should revisit this issue if anyone ever does.
Logical Operations¶
Logical operations, also known as logicops, LOPs, or ROPs, are supported. Only two-operand logicops are available. When logicops are enabled, all other blend state is ignored, including per-render-target state, so logicops are performed on all render targets.
The blend_enable flag is ignored for all render targets when logical operations are enabled.
For a source component s
and destination component d
, the logical
operations are defined as taking the bits of each channel of each component,
and performing one of the following operations per-channel:
Operation |
Equation |
---|---|
|
\(0\) |
|
\(\lnot(s \lor d)\) |
|
\(\lnot s \land d\) |
|
\(\lnot s\) |
|
\(s \land \lnot d\) |
|
\(\lnot d\) |
|
\(s \oplus d\) |
|
\(\lnot(s \land d)\) |
|
\(s \land d\) |
|
\(\lnot(s \oplus d)\) |
|
\(d\) |
|
\(\lnot s \lor d\) |
|
\(s\) |
|
\(s \lor \lnot d\) |
|
\(s \lor d\) |
|
\(1\) |
The logical operation names and definitions match those of the OpenGL API, and are similar to the ROP2 and ROP3 definitions of GDI. This is intentional, to ease transitions to Gallium.
Members¶
These members affect all render targets.
- dither
Whether dithering is enabled.
NoteDithering is completely implementation-dependent. It may be ignored by drivers for any reason, and some render targets may always or never be dithered depending on their format or usage flags.
- logicop_enable
Whether the blender should perform a logicop instead of blending.
- logicop_func
The logicop to use. One of
PIPE_LOGICOP
.- independent_blend_enable
If enabled, blend state is different for each render target, and for each render target set in the respective member of the rt array. If disabled, blend state is the same for all render targets, and only the first member of the rt array contains valid data.
- rt
Contains the per-rendertarget blend state.
- alpha_to_coverage
If enabled, the fragment’s alpha value is used to override the fragment’s coverage mask. The coverage mask will be all zeros if the alpha value is zero. The coverage mask will be all ones if the alpha value is one. Otherwise, the number of bits set in the coverage mask will be proportional to the alpha value. Note that this step happens regardless of whether multisample is enabled or the destination buffer is multisampled.
- alpha_to_one
If enabled, the fragment’s alpha value will be set to one. As with alpha_to_coverage, this step happens regardless of whether multisample is enabled or the destination buffer is multisampled.
- max_rt
The index of the max render target (irrespective of whether independent blend is enabled), i.e. the number of MRTs minus one. This is provided so that the driver can avoid the overhead of programming unused MRTs.
Per-rendertarget Members¶
- blend_enable
If blending is enabled, perform a blend calculation according to blend functions and source/destination factors. Otherwise, the incoming fragment color gets passed unmodified (but colormask still applies).
- rgb_func
The blend function to use for RGB channels. One of PIPE_BLEND.
- rgb_src_factor
The blend source factor to use for RGB channels. One of PIPE_BLENDFACTOR.
- rgb_dst_factor
The blend destination factor to use for RGB channels. One of PIPE_BLENDFACTOR.
- alpha_func
The blend function to use for the alpha channel. One of PIPE_BLEND.
- alpha_src_factor
The blend source factor to use for the alpha channel. One of PIPE_BLENDFACTOR.
- alpha_dst_factor
The blend destination factor to use for alpha channel. One of PIPE_BLENDFACTOR.
- colormask
Bitmask of which channels to write. Combination of PIPE_MASK bits.