|
30 | 30 | #include "dpu_core_perf.h"
|
31 | 31 | #include "dpu_trace.h"
|
32 | 32 |
|
33 |
| -#define DPU_DRM_BLEND_OP_NOT_DEFINED 0 |
34 |
| -#define DPU_DRM_BLEND_OP_OPAQUE 1 |
35 |
| -#define DPU_DRM_BLEND_OP_PREMULTIPLIED 2 |
36 |
| -#define DPU_DRM_BLEND_OP_COVERAGE 3 |
37 |
| -#define DPU_DRM_BLEND_OP_MAX 4 |
38 |
| - |
39 | 33 | /* layer mixer index on dpu_crtc */
|
40 | 34 | #define LEFT_MIXER 0
|
41 | 35 | #define RIGHT_MIXER 1
|
@@ -146,20 +140,43 @@ static void _dpu_crtc_setup_blend_cfg(struct dpu_crtc_mixer *mixer,
|
146 | 140 | {
|
147 | 141 | struct dpu_hw_mixer *lm = mixer->hw_lm;
|
148 | 142 | uint32_t blend_op;
|
| 143 | + uint32_t fg_alpha, bg_alpha; |
149 | 144 |
|
150 |
| - /* default to opaque blending */ |
151 |
| - blend_op = DPU_BLEND_FG_ALPHA_FG_CONST | |
152 |
| - DPU_BLEND_BG_ALPHA_BG_CONST; |
| 145 | + fg_alpha = pstate->base.alpha >> 8; |
| 146 | + bg_alpha = 0xff - fg_alpha; |
153 | 147 |
|
154 |
| - if (format->alpha_enable) { |
| 148 | + /* default to opaque blending */ |
| 149 | + if (pstate->base.pixel_blend_mode == DRM_MODE_BLEND_PIXEL_NONE || |
| 150 | + !format->alpha_enable) { |
| 151 | + blend_op = DPU_BLEND_FG_ALPHA_FG_CONST | |
| 152 | + DPU_BLEND_BG_ALPHA_BG_CONST; |
| 153 | + } else if (pstate->base.pixel_blend_mode == DRM_MODE_BLEND_PREMULTI) { |
| 154 | + blend_op = DPU_BLEND_FG_ALPHA_FG_CONST | |
| 155 | + DPU_BLEND_BG_ALPHA_FG_PIXEL; |
| 156 | + if (fg_alpha != 0xff) { |
| 157 | + bg_alpha = fg_alpha; |
| 158 | + blend_op |= DPU_BLEND_BG_MOD_ALPHA | |
| 159 | + DPU_BLEND_BG_INV_MOD_ALPHA; |
| 160 | + } else { |
| 161 | + blend_op |= DPU_BLEND_BG_INV_ALPHA; |
| 162 | + } |
| 163 | + } else { |
155 | 164 | /* coverage blending */
|
156 | 165 | blend_op = DPU_BLEND_FG_ALPHA_FG_PIXEL |
|
157 |
| - DPU_BLEND_BG_ALPHA_FG_PIXEL | |
158 |
| - DPU_BLEND_BG_INV_ALPHA; |
| 166 | + DPU_BLEND_BG_ALPHA_FG_PIXEL; |
| 167 | + if (fg_alpha != 0xff) { |
| 168 | + bg_alpha = fg_alpha; |
| 169 | + blend_op |= DPU_BLEND_FG_MOD_ALPHA | |
| 170 | + DPU_BLEND_FG_INV_MOD_ALPHA | |
| 171 | + DPU_BLEND_BG_MOD_ALPHA | |
| 172 | + DPU_BLEND_BG_INV_MOD_ALPHA; |
| 173 | + } else { |
| 174 | + blend_op |= DPU_BLEND_BG_INV_ALPHA; |
| 175 | + } |
159 | 176 | }
|
160 | 177 |
|
161 | 178 | lm->ops.setup_blend_config(lm, pstate->stage,
|
162 |
| - 0xFF, 0, blend_op); |
| 179 | + fg_alpha, bg_alpha, blend_op); |
163 | 180 |
|
164 | 181 | DRM_DEBUG_ATOMIC("format:%p4cc, alpha_en:%u blend_op:0x%x\n",
|
165 | 182 | &format->base.pixel_format, format->alpha_enable, blend_op);
|
|
0 commit comments