Hi Sandy,yes, most gpu output format is ARGB888, so we didn't noticed it before.
Am Freitag, 19. Juni 2020, 04:12:51 CEST schrieb Sandy Huang:
RGB888 format msb is red component and the lsb is blue component,just me struggling with color formats ... and wondering why this never
at vop full platform this is swapped, and this is different from vop
lite and vop next, so add this patch to fix it.
came up so far - with Version 3 being all major SoCs of the last years.
So I guess the reason that nobody noticed so far is, that most things
will use ARGB888 instead of RGB888?
One implementation nit below as well.OK, update at v2.
Signed-off-by: Sandy Huang <hjc@xxxxxxxxxxxxxx>one-line-comment?
---
drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index c80f7d9fd13f..1c17048ad737 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -132,6 +132,7 @@ struct vop_win {
struct rockchip_rgb;
struct vop {
+ uint32_t version;
struct drm_crtc crtc;
struct device *dev;
struct drm_device *drm_dev;
@@ -989,6 +990,12 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
VOP_WIN_SET(vop, win, dsp_st, dsp_st);
rb_swap = has_rb_swapped(fb->format->format);
+ /*
+ * VOP full need to do rb swap to show rgb888/bgr888 format color correctly
+ */
/* VOP-full needs rb_swap for correctly showing rgb888/bgr888 */
+ if ((fb->format->format == DRM_FORMAT_RGB888 || fb->format->format == DRM_FORMAT_BGR888) &&can we move this into the existing has_rb_swapped() function?
+ VOP_MAJOR(vop->version) == 3)
+ rb_swap = !rb_swap;
Like doing
rb_swap = has_rb_swapped(vop, fb->format->format)
and adding your conditional to the end there?
Thanks--
Heiko
VOP_WIN_SET(vop, win, rb_swap, rb_swap);
/*
@@ -2091,6 +2098,7 @@ static int vop_bind(struct device *dev, struct device *master, void *data)
vop->dev = dev;
vop->data = vop_data;
vop->drm_dev = drm_dev;
+ vop->version = vop_data->version;
dev_set_drvdata(dev, vop);
vop_win_init(vop);