DRM_MODE_BLEND_PIXEL_NONE ignores an alpha channel.

Rcar-du driver supports only 3 formats with an alpha channel
(DRM_FORMAT_ARGB1555, DRM_FORMAT_ARGB8888 and DRM_FORMAT_ARGB4444). We
simply override the format passed to VSP1 for blending with the pixel
format without alpha channel.

Suggested-by: Laurent Pinchart <[email protected]>
Signed-off-by: Takanari Hayama <[email protected]>
---
 drivers/gpu/drm/rcar-du/rcar_du_vsp.c | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c 
b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
index b9580fcfec7a..7cce2d414ced 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
@@ -151,6 +151,7 @@ static void rcar_du_vsp_plane_setup(struct 
rcar_du_vsp_plane *plane)
                .alpha = state->state.alpha >> 8,
                .zpos = state->state.zpos,
        };
+       u32 fourcc = state->format->fourcc;
        unsigned int i;
 
        cfg.src.left = state->state.src.x1 >> 16;
@@ -169,7 +170,23 @@ static void rcar_du_vsp_plane_setup(struct 
rcar_du_vsp_plane *plane)
 
        cfg.premult = (state->state.pixel_blend_mode == 
DRM_MODE_BLEND_PREMULTI);
 
-       format = rcar_du_format_info(state->format->fourcc);
+       if (state->state.pixel_blend_mode == DRM_MODE_BLEND_PIXEL_NONE) {
+               switch (fourcc) {
+               case DRM_FORMAT_ARGB1555:
+                       fourcc = DRM_FORMAT_XRGB1555;
+                       break;
+
+               case DRM_FORMAT_ARGB4444:
+                       fourcc = DRM_FORMAT_XRGB4444;
+                       break;
+
+               case DRM_FORMAT_ARGB8888:
+                       fourcc = DRM_FORMAT_XRGB8888;
+                       break;
+               }
+       }
+
+       format = rcar_du_format_info(fourcc);
        cfg.pixelformat = format->v4l2;
 
        vsp1_du_atomic_update(plane->vsp->vsp, crtc->vsp_pipe,
@@ -447,6 +464,7 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp, struct 
device_node *np,
                }
 
                drm_plane_create_blend_mode_property(&plane->plane,
+                                       BIT(DRM_MODE_BLEND_PIXEL_NONE) |
                                        BIT(DRM_MODE_BLEND_PREMULTI) |
                                        BIT(DRM_MODE_BLEND_COVERAGE));
 
-- 
2.25.1

Reply via email to