diff options
author | Álvaro Fernández Rojas <noltari@gmail.com> | 2022-05-16 23:40:32 +0200 |
---|---|---|
committer | Álvaro Fernández Rojas <noltari@gmail.com> | 2022-05-17 15:11:22 +0200 |
commit | 20ea6adbf199097c4f5f591ffee088340630dae4 (patch) | |
tree | d6719d95e136611a1c25bbf7789652d6d402779d /target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch | |
parent | bca05bd072180dc38ef740b37ded9572a6db1981 (diff) | |
download | upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.gz upstream-20ea6adbf199097c4f5f591ffee088340630dae4.tar.bz2 upstream-20ea6adbf199097c4f5f591ffee088340630dae4.zip |
bcm27xx: add support for linux v5.15
Build system: x86_64
Build-tested: bcm2708, bcm2709, bcm2710, bcm2711
Run-tested: bcm2708/RPiB+, bcm2709/RPi3B, bcm2710/RPi3B, bcm2711/RPi4B
Signed-off-by: Marty Jones <mj8263788@gmail.com>
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Diffstat (limited to 'target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch b/target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch new file mode 100644 index 0000000000..23162421c3 --- /dev/null +++ b/target/linux/bcm27xx/patches-5.15/950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch @@ -0,0 +1,108 @@ +From 7760958a0fb50b0e20f88e220f55798ec154c41e Mon Sep 17 00:00:00 2001 +From: Dave Stevenson <dave.stevenson@raspberrypi.com> +Date: Sat, 8 Jan 2022 13:24:10 +0000 +Subject: [PATCH] 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 <dave.stevenson@raspberrypi.com> +--- + drivers/gpu/drm/vc4/vc4_plane.c | 62 ++++++++++++++++++++++++++------- + 1 file changed, 49 insertions(+), 13 deletions(-) + +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -663,6 +663,48 @@ static const u32 colorspace_coeffs[2][DR + } + }; + ++static u32 vc4_hvs4_get_alpha_blend_mode(struct drm_plane_state *state) ++{ ++ if (!state->fb->format->has_alpha) ++ return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_FIXED, ++ SCALER_POS2_ALPHA_MODE); ++ ++ switch (state->pixel_blend_mode) { ++ case DRM_MODE_BLEND_PIXEL_NONE: ++ return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_FIXED, ++ SCALER_POS2_ALPHA_MODE); ++ default: ++ case DRM_MODE_BLEND_PREMULTI: ++ return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_PIPELINE, ++ SCALER_POS2_ALPHA_MODE) | ++ SCALER_POS2_ALPHA_PREMULT; ++ case DRM_MODE_BLEND_COVERAGE: ++ return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_PIPELINE, ++ SCALER_POS2_ALPHA_MODE); ++ } ++} ++ ++static u32 vc4_hvs5_get_alpha_blend_mode(struct drm_plane_state *state) ++{ ++ if (!state->fb->format->has_alpha) ++ return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_FIXED, ++ SCALER5_CTL2_ALPHA_MODE); ++ ++ switch (state->pixel_blend_mode) { ++ case DRM_MODE_BLEND_PIXEL_NONE: ++ return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_FIXED, ++ SCALER5_CTL2_ALPHA_MODE); ++ default: ++ case DRM_MODE_BLEND_PREMULTI: ++ return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_PIPELINE, ++ SCALER5_CTL2_ALPHA_MODE) | ++ SCALER5_CTL2_ALPHA_PREMULT; ++ case DRM_MODE_BLEND_COVERAGE: ++ return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_PIPELINE, ++ SCALER5_CTL2_ALPHA_MODE); ++ } ++} ++ + /* Writes out a full display list for an active plane to the plane's + * private dlist state. + */ +@@ -945,13 +987,8 @@ static int vc4_plane_mode_set(struct drm + /* Position Word 2: Source Image Size, Alpha */ + vc4_state->pos2_offset = vc4_state->dlist_count; + vc4_dlist_write(vc4_state, +- VC4_SET_FIELD(fb->format->has_alpha ? +- SCALER_POS2_ALPHA_MODE_PIPELINE : +- SCALER_POS2_ALPHA_MODE_FIXED, +- SCALER_POS2_ALPHA_MODE) | + (mix_plane_alpha ? SCALER_POS2_ALPHA_MIX : 0) | +- (fb->format->has_alpha ? +- SCALER_POS2_ALPHA_PREMULT : 0) | ++ vc4_hvs4_get_alpha_blend_mode(state) | + VC4_SET_FIELD(vc4_state->src_w[0], + SCALER_POS2_WIDTH) | + VC4_SET_FIELD(vc4_state->src_h[0], +@@ -996,14 +1033,9 @@ static int vc4_plane_mode_set(struct drm + vc4_dlist_write(vc4_state, + VC4_SET_FIELD(state->alpha >> 4, + SCALER5_CTL2_ALPHA) | +- (fb->format->has_alpha ? +- SCALER5_CTL2_ALPHA_PREMULT : 0) | ++ vc4_hvs5_get_alpha_blend_mode(state) | + (mix_plane_alpha ? +- SCALER5_CTL2_ALPHA_MIX : 0) | +- VC4_SET_FIELD(fb->format->has_alpha ? +- SCALER5_CTL2_ALPHA_MODE_PIPELINE : +- SCALER5_CTL2_ALPHA_MODE_FIXED, +- SCALER5_CTL2_ALPHA_MODE) ++ SCALER5_CTL2_ALPHA_MIX : 0) + ); + + /* Position Word 1: Scaled Image Dimensions. */ +@@ -1493,6 +1525,10 @@ struct drm_plane *vc4_plane_init(struct + drm_plane_helper_add(plane, &vc4_plane_helper_funcs); + + drm_plane_create_alpha_property(plane); ++ drm_plane_create_blend_mode_property(plane, ++ BIT(DRM_MODE_BLEND_PIXEL_NONE) | ++ BIT(DRM_MODE_BLEND_PREMULTI) | ++ BIT(DRM_MODE_BLEND_COVERAGE)); + drm_plane_create_rotation_property(plane, DRM_MODE_ROTATE_0, + DRM_MODE_ROTATE_0 | + DRM_MODE_ROTATE_180 | |