Skip to content

Commit e13d4e9

Browse files
6by9pelwell
authored andcommitted
drm/vc4: Add alpha_blend_mode property to each plane.
Move from only supporting the default of pre-multiplied alpha to supporting user specified blend mode using the standardised property. Signed-off-by: Dave Stevenson <[email protected]>
1 parent cd1b7be commit e13d4e9

File tree

1 file changed

+49
-13
lines changed

1 file changed

+49
-13
lines changed

drivers/gpu/drm/vc4/vc4_plane.c

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,48 @@ static const u32 colorspace_coeffs[2][DRM_COLOR_ENCODING_MAX][3] = {
667667
}
668668
};
669669

670+
static u32 vc4_hvs4_get_alpha_blend_mode(struct drm_plane_state *state)
671+
{
672+
if (!state->fb->format->has_alpha)
673+
return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_FIXED,
674+
SCALER_POS2_ALPHA_MODE);
675+
676+
switch (state->pixel_blend_mode) {
677+
case DRM_MODE_BLEND_PIXEL_NONE:
678+
return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_FIXED,
679+
SCALER_POS2_ALPHA_MODE);
680+
default:
681+
case DRM_MODE_BLEND_PREMULTI:
682+
return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_PIPELINE,
683+
SCALER_POS2_ALPHA_MODE) |
684+
SCALER_POS2_ALPHA_PREMULT;
685+
case DRM_MODE_BLEND_COVERAGE:
686+
return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_PIPELINE,
687+
SCALER_POS2_ALPHA_MODE);
688+
}
689+
}
690+
691+
static u32 vc4_hvs5_get_alpha_blend_mode(struct drm_plane_state *state)
692+
{
693+
if (!state->fb->format->has_alpha)
694+
return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_FIXED,
695+
SCALER5_CTL2_ALPHA_MODE);
696+
697+
switch (state->pixel_blend_mode) {
698+
case DRM_MODE_BLEND_PIXEL_NONE:
699+
return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_FIXED,
700+
SCALER5_CTL2_ALPHA_MODE);
701+
default:
702+
case DRM_MODE_BLEND_PREMULTI:
703+
return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_PIPELINE,
704+
SCALER5_CTL2_ALPHA_MODE) |
705+
SCALER5_CTL2_ALPHA_PREMULT;
706+
case DRM_MODE_BLEND_COVERAGE:
707+
return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_PIPELINE,
708+
SCALER5_CTL2_ALPHA_MODE);
709+
}
710+
}
711+
670712
/* Writes out a full display list for an active plane to the plane's
671713
* private dlist state.
672714
*/
@@ -928,13 +970,8 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
928970
/* Position Word 2: Source Image Size, Alpha */
929971
vc4_state->pos2_offset = vc4_state->dlist_count;
930972
vc4_dlist_write(vc4_state,
931-
VC4_SET_FIELD(fb->format->has_alpha ?
932-
SCALER_POS2_ALPHA_MODE_PIPELINE :
933-
SCALER_POS2_ALPHA_MODE_FIXED,
934-
SCALER_POS2_ALPHA_MODE) |
935973
(mix_plane_alpha ? SCALER_POS2_ALPHA_MIX : 0) |
936-
(fb->format->has_alpha ?
937-
SCALER_POS2_ALPHA_PREMULT : 0) |
974+
vc4_hvs4_get_alpha_blend_mode(state) |
938975
VC4_SET_FIELD(vc4_state->src_w[0],
939976
SCALER_POS2_WIDTH) |
940977
VC4_SET_FIELD(vc4_state->src_h[0],
@@ -979,14 +1016,9 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
9791016
vc4_dlist_write(vc4_state,
9801017
VC4_SET_FIELD(state->alpha >> 4,
9811018
SCALER5_CTL2_ALPHA) |
982-
(fb->format->has_alpha ?
983-
SCALER5_CTL2_ALPHA_PREMULT : 0) |
1019+
vc4_hvs5_get_alpha_blend_mode(state) |
9841020
(mix_plane_alpha ?
985-
SCALER5_CTL2_ALPHA_MIX : 0) |
986-
VC4_SET_FIELD(fb->format->has_alpha ?
987-
SCALER5_CTL2_ALPHA_MODE_PIPELINE :
988-
SCALER5_CTL2_ALPHA_MODE_FIXED,
989-
SCALER5_CTL2_ALPHA_MODE)
1021+
SCALER5_CTL2_ALPHA_MIX : 0)
9901022
);
9911023

9921024
/* Position Word 1: Scaled Image Dimensions. */
@@ -1470,6 +1502,10 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
14701502
drm_plane_helper_add(plane, &vc4_plane_helper_funcs);
14711503

14721504
drm_plane_create_alpha_property(plane);
1505+
drm_plane_create_blend_mode_property(plane,
1506+
BIT(DRM_MODE_BLEND_PIXEL_NONE) |
1507+
BIT(DRM_MODE_BLEND_PREMULTI) |
1508+
BIT(DRM_MODE_BLEND_COVERAGE));
14731509
drm_plane_create_rotation_property(plane, DRM_MODE_ROTATE_0,
14741510
DRM_MODE_ROTATE_0 |
14751511
DRM_MODE_ROTATE_180 |

0 commit comments

Comments
 (0)