Re: [PATCH v2 7/7] drm: rcar-du: Add new formats (2-10-10-10 ARGB, Y210)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hans,

On Tue, Dec 20, 2022 at 10:26:35AM +0100, Hans Verkuil wrote:
> On 20/12/2022 10:18, Laurent Pinchart wrote:
> > On Tue, Dec 20, 2022 at 10:01:04AM +0100, Hans Verkuil wrote:
> >> On 19/12/2022 22:47, Laurent Pinchart wrote:
> >>> Hi Tomi,
> >>>
> >>> (CC'ing Sakari and Hans)
> >>>
> >>> Thank you for the patch.
> >>>
> >>> On Mon, Dec 19, 2022 at 04:01:39PM +0200, Tomi Valkeinen wrote:
> >>>> Add new pixel formats: RGBX1010102, RGBA1010102, ARGB2101010 and Y210.
> >>>>
> >>>> Signed-off-by: Tomi Valkeinen <tomi.valkeinen+renesas@xxxxxxxxxxxxxxxx>
> >>>> ---
> >>>>  drivers/gpu/drm/rcar-du/rcar_du_kms.c | 24 +++++++++++++
> >>>>  drivers/gpu/drm/rcar-du/rcar_du_vsp.c | 49 +++++++++++++++++++++++++--
> >>>>  2 files changed, 71 insertions(+), 2 deletions(-)
> >>>>
> >>>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> >>>> index 8c2719efda2a..8ccabf5a30c4 100644
> >>>> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> >>>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> >>>> @@ -259,6 +259,24 @@ static const struct rcar_du_format_info rcar_du_format_infos[] = {
> >>>>  		.bpp = 32,
> >>>>  		.planes = 1,
> >>>>  		.hsub = 1,
> >>>> +	}, {
> >>>> +		.fourcc = DRM_FORMAT_RGBX1010102,
> >>>
> >>> Ah, here the format makes sense.
> >>>
> >>>> +		.v4l2 = V4L2_PIX_FMT_XBGR2101010,
> >>>
> >>> But this is horrible :-( Could we use the same names as DRM for new
> >>> formats, when there is no conflict with existing V4L2 formats ?
> >>>
> >>> Sakari, Hans, what do you think ? Please see patch 1/7 in the series for
> >>> the format definitions.
> >>
> >> V4L2 describes pixel formats based on how they appear in memory from the
> >> lowest to highest memory address.
> >>
> >> If I am not mistaken, DRM uses the CPU order. So that explains the difference
> >> in naming. I don't think we should hide that difference. And V4L2 has been
> >> quite consistent in following memory ordering in the naming (except possibly
> >> for some of the really old pixelformats).
> > 
> > We depart from that rule with at least the following RGB formats:
> > 
> > V4L2_PIX_FMT_XBGR32
> > V4L2_PIX_FMT_BGRX32
> > V4L2_PIX_FMT_ABGR32
> > V4L2_PIX_FMT_BGRA32
> > 
> > While the following formats follow the rule:
> > 
> > V4L2_PIX_FMT_RGB24
> > V4L2_PIX_FMT_BGR24
> > V4L2_PIX_FMT_XRGB32
> > V4L2_PIX_FMT_RGBX32
> > V4L2_PIX_FMT_RGBA32
> > V4L2_PIX_FMT_ARGB32
> > 
> > For 16-bit RGB formats, we name them based on the order in a 16-bit word
> > which is then stored in memory in little endian (except for the formats
> > explicitly defined as big-endian):
> > 
> > #define V4L2_PIX_FMT_RGB444  v4l2_fourcc('R', '4', '4', '4') /* 16  xxxxrrrr ggggbbbb */
> > #define V4L2_PIX_FMT_ARGB444 v4l2_fourcc('A', 'R', '1', '2') /* 16  aaaarrrr ggggbbbb */
> > #define V4L2_PIX_FMT_XRGB444 v4l2_fourcc('X', 'R', '1', '2') /* 16  xxxxrrrr ggggbbbb */
> > #define V4L2_PIX_FMT_RGBA444 v4l2_fourcc('R', 'A', '1', '2') /* 16  rrrrgggg bbbbaaaa */
> > #define V4L2_PIX_FMT_RGBX444 v4l2_fourcc('R', 'X', '1', '2') /* 16  rrrrgggg bbbbxxxx */
> > #define V4L2_PIX_FMT_ABGR444 v4l2_fourcc('A', 'B', '1', '2') /* 16  aaaabbbb ggggrrrr */
> > #define V4L2_PIX_FMT_XBGR444 v4l2_fourcc('X', 'B', '1', '2') /* 16  xxxxbbbb ggggrrrr */
> > #define V4L2_PIX_FMT_BGRA444 v4l2_fourcc('G', 'A', '1', '2') /* 16  bbbbgggg rrrraaaa */
> > #define V4L2_PIX_FMT_BGRX444 v4l2_fourcc('B', 'X', '1', '2') /* 16  bbbbgggg rrrrxxxx */
> > #define V4L2_PIX_FMT_RGB555  v4l2_fourcc('R', 'G', 'B', 'O') /* 16  RGB-5-5-5     */
> > #define V4L2_PIX_FMT_ARGB555 v4l2_fourcc('A', 'R', '1', '5') /* 16  ARGB-1-5-5-5  */
> > #define V4L2_PIX_FMT_XRGB555 v4l2_fourcc('X', 'R', '1', '5') /* 16  XRGB-1-5-5-5  */
> > #define V4L2_PIX_FMT_RGBA555 v4l2_fourcc('R', 'A', '1', '5') /* 16  RGBA-5-5-5-1  */
> > #define V4L2_PIX_FMT_RGBX555 v4l2_fourcc('R', 'X', '1', '5') /* 16  RGBX-5-5-5-1  */
> > #define V4L2_PIX_FMT_ABGR555 v4l2_fourcc('A', 'B', '1', '5') /* 16  ABGR-1-5-5-5  */
> > #define V4L2_PIX_FMT_XBGR555 v4l2_fourcc('X', 'B', '1', '5') /* 16  XBGR-1-5-5-5  */
> > #define V4L2_PIX_FMT_BGRA555 v4l2_fourcc('B', 'A', '1', '5') /* 16  BGRA-5-5-5-1  */
> > #define V4L2_PIX_FMT_BGRX555 v4l2_fourcc('B', 'X', '1', '5') /* 16  BGRX-5-5-5-1  */
> > #define V4L2_PIX_FMT_RGB565  v4l2_fourcc('R', 'G', 'B', 'P') /* 16  RGB-5-6-5     */
> 
> Yes, these are all really old pixel formats :-)

Which ones do you consider new then ? :-) Even if we look at the 24-bit
and 32-bit RGB formats only (which are not very recent), its 40%/60%.

> > I would thus argue that, at least for RGB formats, naming them based on
> > the byte order in memory isn't such a clear cut rule. 
> > 
> >> Departing from that would be more of a hindrance than a help, IMHO.
> 
> Ideally we would unify the drm and v4l2 formats to new defines shared among
> the two subsystems. I believe that was attempted some years back. In the end,
> it was just decided to keep them separate, i.e. it wasn't worth the effort.
> 
> So unless someone wants to restart that idea, I think we should just stick to
> what we have today, warts and all.

Maxime proposed that and submitted an RFC If I recall correctly. I
really liked the idea, but it was shot down on maintenance issues (again
if I recall correctly) with concerns that the media tree would depend on
code outside of its direct control when adding new formats.

Still, even if we don't share any code, I think it's worth making new
formats identical between V4L2 and DRM (as in having the same 4CC value
and the same macro name, excluding the prefix, for the same format).

> >>>> +		.bpp = 32,
> >>>> +		.planes = 1,
> >>>> +		.hsub = 1,
> >>>> +	}, {
> >>>> +		.fourcc = DRM_FORMAT_RGBA1010102,
> >>>> +		.v4l2 = V4L2_PIX_FMT_ABGR2101010,
> >>>> +		.bpp = 32,
> >>>> +		.planes = 1,
> >>>> +		.hsub = 1,
> >>>> +	}, {
> >>>> +		.fourcc = DRM_FORMAT_ARGB2101010,
> >>>> +		.v4l2 = V4L2_PIX_FMT_BGRA1010102,
> >>>> +		.bpp = 32,
> >>>> +		.planes = 1,
> >>>> +		.hsub = 1,
> >>>>  	}, {
> >>>>  		.fourcc = DRM_FORMAT_YVYU,
> >>>>  		.v4l2 = V4L2_PIX_FMT_YVYU,
> >>>> @@ -307,6 +325,12 @@ static const struct rcar_du_format_info rcar_du_format_infos[] = {
> >>>>  		.bpp = 24,
> >>>>  		.planes = 3,
> >>>>  		.hsub = 1,
> >>>> +	}, {
> >>>> +		.fourcc = DRM_FORMAT_Y210,
> >>>> +		.v4l2 = V4L2_PIX_FMT_Y210,
> >>>> +		.bpp = 32,
> >>>> +		.planes = 1,
> >>>> +		.hsub = 2,
> >>>>  	},
> >>>
> >>> Any reason why you'd not adding Y212 support already ?
> >>>
> >>>>  };
> >>>>  
> >>>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
> >>>> index e465aef41585..6f3e109a4f80 100644
> >>>> --- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
> >>>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c
> >>>> @@ -139,6 +139,42 @@ static const u32 rcar_du_vsp_formats[] = {
> >>>>  	DRM_FORMAT_YVU444,
> >>>>  };
> >>>>  
> >>>> +/*
> >>>> + * Gen4 supports the same formats as above, and additionally 2-10-10-10 RGB
> >>>> + * formats and Y210 format.
> >>>> + */
> >>>> +static const u32 rcar_du_vsp_formats_gen4[] = {
> >>>> +	DRM_FORMAT_RGB332,
> >>>> +	DRM_FORMAT_ARGB4444,
> >>>> +	DRM_FORMAT_XRGB4444,
> >>>> +	DRM_FORMAT_ARGB1555,
> >>>> +	DRM_FORMAT_XRGB1555,
> >>>> +	DRM_FORMAT_RGB565,
> >>>> +	DRM_FORMAT_BGR888,
> >>>> +	DRM_FORMAT_RGB888,
> >>>> +	DRM_FORMAT_BGRA8888,
> >>>> +	DRM_FORMAT_BGRX8888,
> >>>> +	DRM_FORMAT_ARGB8888,
> >>>> +	DRM_FORMAT_XRGB8888,
> >>>> +	DRM_FORMAT_RGBX1010102,
> >>>> +	DRM_FORMAT_RGBA1010102,
> >>>> +	DRM_FORMAT_ARGB2101010,
> >>>> +	DRM_FORMAT_UYVY,
> >>>> +	DRM_FORMAT_YUYV,
> >>>> +	DRM_FORMAT_YVYU,
> >>>> +	DRM_FORMAT_NV12,
> >>>> +	DRM_FORMAT_NV21,
> >>>> +	DRM_FORMAT_NV16,
> >>>> +	DRM_FORMAT_NV61,
> >>>> +	DRM_FORMAT_YUV420,
> >>>> +	DRM_FORMAT_YVU420,
> >>>> +	DRM_FORMAT_YUV422,
> >>>> +	DRM_FORMAT_YVU422,
> >>>> +	DRM_FORMAT_YUV444,
> >>>> +	DRM_FORMAT_YVU444,
> >>>> +	DRM_FORMAT_Y210,
> >>>> +};
> >>>> +
> >>>>  static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane)
> >>>>  {
> >>>>  	struct rcar_du_vsp_plane_state *state =
> >>>> @@ -436,14 +472,23 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp, struct device_node *np,
> >>>>  					 ? DRM_PLANE_TYPE_PRIMARY
> >>>>  					 : DRM_PLANE_TYPE_OVERLAY;
> >>>>  		struct rcar_du_vsp_plane *plane = &vsp->planes[i];
> >>>> +		unsigned int num_formats;
> >>>> +		const u32 *formats;
> >>>> +
> >>>> +		if (rcdu->info->gen < 4) {
> >>>> +			num_formats = ARRAY_SIZE(rcar_du_vsp_formats);
> >>>> +			formats = rcar_du_vsp_formats;
> >>>> +		} else {
> >>>> +			num_formats = ARRAY_SIZE(rcar_du_vsp_formats_gen4);
> >>>> +			formats = rcar_du_vsp_formats_gen4;
> >>>> +		}
> >>>>  
> >>>>  		plane->vsp = vsp;
> >>>>  		plane->index = i;
> >>>>  
> >>>>  		ret = drm_universal_plane_init(&rcdu->ddev, &plane->plane,
> >>>>  					       crtcs, &rcar_du_vsp_plane_funcs,
> >>>> -					       rcar_du_vsp_formats,
> >>>> -					       ARRAY_SIZE(rcar_du_vsp_formats),
> >>>> +					       formats, num_formats,
> >>>>  					       NULL, type, NULL);
> >>>>  		if (ret < 0)
> >>>>  			return ret;

-- 
Regards,

Laurent Pinchart



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux