On Tue, Jun 07, 2016 at 02:33:11AM +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@xxxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/drm_crtc.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++ > include/drm/drm_crtc.h | 21 ++++++++++++ > 2 files changed, 104 insertions(+) > > diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c > index 0e3cc66aa8b7..74b0c6dd80cd 100644 > --- a/drivers/gpu/drm/drm_crtc.c > +++ b/drivers/gpu/drm/drm_crtc.c > @@ -5544,6 +5544,89 @@ int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, > } > > /** > + * drm_format_info - 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[] = { > + { DRM_FORMAT_C8, 8, 8, 1, { 1 }, 1, 1 }, Named initializers please. > + { DRM_FORMAT_RGB332, 8, 8, 1, { 1 }, 1, 1 }, > + { DRM_FORMAT_BGR233, 8, 8, 1, { 1 }, 1, 1 }, > + { DRM_FORMAT_XRGB4444, 12, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_XBGR4444, 12, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_RGBX4444, 12, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_BGRX4444, 12, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_ARGB4444, 12, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_ABGR4444, 12, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_RGBA4444, 12, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_BGRA4444, 12, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_XRGB1555, 15, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_XBGR1555, 15, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_RGBX5551, 15, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_BGRX5551, 15, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_ARGB1555, 15, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_ABGR1555, 15, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_RGBA5551, 15, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_BGRA5551, 15, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_RGB565, 16, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_BGR565, 16, 16, 1, { 2 }, 1, 1 }, > + { DRM_FORMAT_RGB888, 24, 24, 1, { 3 }, 1, 1 }, > + { DRM_FORMAT_BGR888, 24, 24, 1, { 3 }, 1, 1 }, > + { DRM_FORMAT_XRGB8888, 24, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_XBGR8888, 24, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_RGBX8888, 24, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_BGRX8888, 24, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_XRGB2101010, 30, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_XBGR2101010, 30, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_RGBX1010102, 30, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_BGRX1010102, 30, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_ARGB2101010, 30, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_ABGR2101010, 30, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_RGBA1010102, 30, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_BGRA1010102, 30, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_ARGB8888, 32, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_ABGR8888, 32, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_RGBA8888, 32, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_BGRA8888, 32, 32, 1, { 4 }, 1, 1 }, > + { DRM_FORMAT_YUV410, 0, 0, 3, { 1, 1, 1 }, 4, 4 }, > + { DRM_FORMAT_YVU410, 0, 0, 3, { 1, 1, 1 }, 4, 4 }, > + { DRM_FORMAT_YUV411, 0, 0, 3, { 1, 1, 1 }, 4, 1 }, > + { DRM_FORMAT_YVU411, 0, 0, 3, { 1, 1, 1 }, 4, 1 }, > + { DRM_FORMAT_YUV420, 0, 0, 3, { 1, 1, 1 }, 2, 2 }, > + { DRM_FORMAT_YVU420, 0, 0, 3, { 1, 1, 1 }, 2, 2 }, > + { DRM_FORMAT_YUV422, 0, 0, 3, { 1, 1, 1 }, 2, 1 }, > + { DRM_FORMAT_YVU422, 0, 0, 3, { 1, 1, 1 }, 2, 1 }, > + { DRM_FORMAT_YUV444, 0, 0, 3, { 1, 1, 1 }, 1, 1 }, > + { DRM_FORMAT_YVU444, 0, 0, 3, { 1, 1, 1 }, 1, 1 }, > + { DRM_FORMAT_NV12, 0, 0, 2, { 1, 2 }, 2, 2 }, > + { DRM_FORMAT_NV21, 0, 0, 2, { 1, 2 }, 2, 2 }, > + { DRM_FORMAT_NV16, 0, 0, 2, { 1, 2 }, 2, 1 }, > + { DRM_FORMAT_NV61, 0, 0, 2, { 1, 2 }, 2, 1 }, > + { DRM_FORMAT_NV24, 0, 0, 2, { 1, 2 }, 1, 1 }, > + { DRM_FORMAT_NV42, 0, 0, 2, { 1, 2 }, 1, 1 }, > + { DRM_FORMAT_YUYV, 0, 0, 1, { 2 }, 2, 1 }, > + { DRM_FORMAT_YVYU, 0, 0, 1, { 2 }, 2, 1 }, > + { DRM_FORMAT_UYVY, 0, 0, 1, { 2 }, 2, 1 }, > + { DRM_FORMAT_VYUY, 0, 0, 1, { 2 }, 2, 1 }, > + { DRM_FORMAT_AYUV, 0, 0, 1, { 4 }, 1, 1 }, > + }; > + > + unsigned int i; > + > + for (i = 0; i < ARRAY_SIZE(formats); ++i) { > + if (formats[i].format == format) > + return &formats[i]; > + } > + > + return NULL; > +} > + > +/** > * 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_crtc.h b/include/drm/drm_crtc.h > index d1559cd04e3d..4199794cc317 100644 > --- a/include/drm/drm_crtc.h > +++ b/include/drm/drm_crtc.h > @@ -155,6 +155,26 @@ struct drm_display_info { > u8 cea_rev; > }; > > +/** > + * 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) > + * @bpp: number of bits per pixel including padding > + * @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 > + */ > +struct drm_format_info { > + u32 format; > + unsigned int depth; > + unsigned int bpp; > + unsigned int num_planes; > + unsigned int cpp[3]; > + unsigned int hsub; > + unsigned int vsub; > +}; > + > /* data corresponds to displayid vend/prod/serial */ > struct drm_tile_group { > struct kref refcount; > @@ -2540,6 +2560,7 @@ extern int drm_mode_plane_set_obj_prop(struct drm_plane *plane, > extern int drm_mode_atomic_ioctl(struct drm_device *dev, > void *data, struct drm_file *file_priv); > > +extern const struct drm_format_info *drm_format_info(u32 format); > extern void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth, > int *bpp); > extern int drm_format_num_planes(uint32_t format); > -- > Regards, > > Laurent Pinchart > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Ville Syrjälä Intel OTC _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel