On Sun, Sep 18, 2016 at 01:17:27PM +0300, Laurent Pinchart wrote: > Various pieces of information about DRM formats (number of planes, color > depth, chroma subsampling, ...) are scattered across different helper > functions in the DRM core. Callers of those functions often need to > access more than a single parameter of the format, leading to > inefficiencies due to multiple lookups. > > Centralize all format information in a data structure and create a > function to look up information based on the format 4CC. > > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com> > --- > Changes since v4: > > - Fixed depth value of DRM_FORMAT_[AXRGB]{4}4444 formats to match > current code > - Documented the depth field as legacy > --- > Documentation/gpu/drm-kms.rst | 3 ++ > drivers/gpu/drm/drm_fourcc.c | 84 > +++++++++++++++++++++++++++++++++++++++++++ > include/drm/drm_fourcc.h | 21 +++++++++++ > 3 files changed, 108 insertions(+) > > diff --git a/Documentation/gpu/drm-kms.rst b/Documentation/gpu/drm-kms.rst > index f9a991bb87d4..85c4c49f4436 100644 > --- a/Documentation/gpu/drm-kms.rst > +++ b/Documentation/gpu/drm-kms.rst > @@ -63,6 +63,9 @@ Frame Buffer Functions Reference > DRM Format Handling > =================== > > +.. kernel-doc:: include/drm/drm_fourcc.h > + :internal: > + > .. kernel-doc:: drivers/gpu/drm/drm_fourcc.c > :export: > > diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c > index 29c56b4331e0..39f09c564111 100644 > --- a/drivers/gpu/drm/drm_fourcc.c > +++ b/drivers/gpu/drm/drm_fourcc.c > @@ -103,6 +103,90 @@ char *drm_get_format_name(uint32_t format) > EXPORT_SYMBOL(drm_get_format_name); > > /** > + * drm_format_info - query information for a given format > + * @format: pixel format (DRM_FORMAT_*) > + * > + * Returns: > + * The instance of struct drm_format_info that describes the pixel format, or > + * NULL if the format is unsupported. > + */ > +const struct drm_format_info *drm_format_info(u32 format) > +{ > + static const struct drm_format_info formats[] = { > + { .format = DRM_FORMAT_C8, .depth = 8, > .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_RGB332, .depth = 8, > .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_BGR233, .depth = 8, > .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_XRGB4444, .depth = 0, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_XBGR4444, .depth = 0, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_RGBX4444, .depth = 0, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_BGRX4444, .depth = 0, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_ARGB4444, .depth = 0, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_ABGR4444, .depth = 0, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_RGBA4444, .depth = 0, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_BGRA4444, .depth = 0, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_XRGB1555, .depth = 15, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_XBGR1555, .depth = 15, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_RGBX5551, .depth = 15, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_BGRX5551, .depth = 15, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_ARGB1555, .depth = 15, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_ABGR1555, .depth = 15, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_RGBA5551, .depth = 15, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_BGRA5551, .depth = 15, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_RGB565, .depth = 16, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_BGR565, .depth = 16, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_RGB888, .depth = 24, > .num_planes = 1, .cpp = { 3, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_BGR888, .depth = 24, > .num_planes = 1, .cpp = { 3, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_XRGB8888, .depth = 24, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_XBGR8888, .depth = 24, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_RGBX8888, .depth = 24, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_BGRX8888, .depth = 24, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_XRGB2101010, .depth = 30, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_XBGR2101010, .depth = 30, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_RGBX1010102, .depth = 30, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_BGRX1010102, .depth = 30, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_ARGB2101010, .depth = 30, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_ABGR2101010, .depth = 30, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_RGBA1010102, .depth = 30, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_BGRA1010102, .depth = 30, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_ARGB8888, .depth = 32, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_ABGR8888, .depth = 32, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_RGBA8888, .depth = 32, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_BGRA8888, .depth = 32, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_YUV410, .depth = 0, > .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 4, .vsub = 4 }, > + { .format = DRM_FORMAT_YVU410, .depth = 0, > .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 4, .vsub = 4 }, > + { .format = DRM_FORMAT_YUV411, .depth = 0, > .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 4, .vsub = 1 }, > + { .format = DRM_FORMAT_YVU411, .depth = 0, > .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 4, .vsub = 1 }, > + { .format = DRM_FORMAT_YUV420, .depth = 0, > .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 2, .vsub = 2 }, > + { .format = DRM_FORMAT_YVU420, .depth = 0, > .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 2, .vsub = 2 }, > + { .format = DRM_FORMAT_YUV422, .depth = 0, > .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 2, .vsub = 1 }, > + { .format = DRM_FORMAT_YVU422, .depth = 0, > .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 2, .vsub = 1 }, > + { .format = DRM_FORMAT_YUV444, .depth = 0, > .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_YVU444, .depth = 0, > .num_planes = 3, .cpp = { 1, 1, 1 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_NV12, .depth = 0, > .num_planes = 2, .cpp = { 1, 2, 0 }, .hsub = 2, .vsub = 2 }, > + { .format = DRM_FORMAT_NV21, .depth = 0, > .num_planes = 2, .cpp = { 1, 2, 0 }, .hsub = 2, .vsub = 2 }, > + { .format = DRM_FORMAT_NV16, .depth = 0, > .num_planes = 2, .cpp = { 1, 2, 0 }, .hsub = 2, .vsub = 1 }, > + { .format = DRM_FORMAT_NV61, .depth = 0, > .num_planes = 2, .cpp = { 1, 2, 0 }, .hsub = 2, .vsub = 1 }, > + { .format = DRM_FORMAT_NV24, .depth = 0, > .num_planes = 2, .cpp = { 1, 2, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_NV42, .depth = 0, > .num_planes = 2, .cpp = { 1, 2, 0 }, .hsub = 1, .vsub = 1 }, > + { .format = DRM_FORMAT_YUYV, .depth = 0, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 2, .vsub = 1 }, > + { .format = DRM_FORMAT_YVYU, .depth = 0, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 2, .vsub = 1 }, > + { .format = DRM_FORMAT_UYVY, .depth = 0, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 2, .vsub = 1 }, > + { .format = DRM_FORMAT_VYUY, .depth = 0, > .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 2, .vsub = 1 }, > + { .format = DRM_FORMAT_AYUV, .depth = 0, > .num_planes = 1, .cpp = { 4, 0, 0 }, .hsub = 1, .vsub = 1 }, > + }; > + > + unsigned int i; > + > + for (i = 0; i < ARRAY_SIZE(formats); ++i) { > + if (formats[i].format == format) > + return &formats[i]; > + } > + > + return NULL; > +} > +EXPORT_SYMBOL(drm_format_info); > + > +/** > * drm_fb_get_bpp_depth - get the bpp/depth values for format > * @format: pixel format (DRM_FORMAT_*) > * @depth: storage for the depth value > diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h > index 30c30fa87ee8..135fef050ee6 100644 > --- a/include/drm/drm_fourcc.h > +++ b/include/drm/drm_fourcc.h > @@ -25,6 +25,27 @@ > #include <linux/types.h> > #include <uapi/drm/drm_fourcc.h> > > +/** > + * struct drm_format_info - information about a DRM format > + * @format: 4CC format identifier (DRM_FORMAT_*) > + * @depth: Color depth (number of bits per pixel excluding padding bits), > + * valid for a subset of RGB formats only. This is a legacy field, do not > + * use in new code and set to 0 for new formats. > + * @num_planes: Number of color planes (1 to 3) > + * @cpp: Number of bytes per pixel (per plane) > + * @hsub: Horizontal chroma subsampling factor > + * @vsub: Vertical chroma subsampling factor > + */
Atm we don't include the drm_fourcc.h header in Documentation/gpu/drm-kms.rst, which means we're missing this new kerneldoc. With that fixed: Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch> > +struct drm_format_info { > + u32 format; > + u8 depth; > + u8 num_planes; > + u8 cpp[3]; > + u8 hsub; > + u8 vsub; > +}; > + > +const struct drm_format_info *drm_format_info(u32 format); > uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth); > void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth, int *bpp); > int drm_format_num_planes(uint32_t format); > -- > Regards, > > Laurent Pinchart > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch