Message ID | 194fd02a37172de6f2a799fee5c98ced5e7e9d76.1555487650.git-series.maxime.ripard@bootlin.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm: Split out the formats API and move it to a common place | expand |
Op 17-04-2019 om 09:54 schreef Maxime Ripard: > So far, the drm_format_plane_height/width functions were operating on the > format's fourcc and was doing a lookup to retrieve the drm_format_info > structure and return the cpp. > > However, this is inefficient since in most cases, we will have the > drm_format_info pointer already available so we shouldn't have to perform a > new lookup. Some drm_fourcc functions also already operate on the > drm_format_info pointer for that reason, so the API is quite inconsistent > there. > > Let's follow the latter pattern and remove the extra lookup while being a > bit more consistent. > > In order to be extra consistent, also rename that function to > drm_format_info_plane_cpp and to a static function in the header to match > the current policy. The parameters order have also be changed to match the > other functions prototype. > > Reviewed-by: Emil Velikov <emil.velikov@collabora.com> > Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> > --- > drivers/gpu/drm/drm_fourcc.c | 48 +---------------------------- > drivers/gpu/drm/meson/meson_overlay.c | 12 +++---- > include/drm/drm_fourcc.h | 46 +++++++++++++++++++++++++-- > 3 files changed, 50 insertions(+), 56 deletions(-) > > diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c > index 5f63fc74e265..35b459d186c5 100644 > --- a/drivers/gpu/drm/drm_fourcc.c > +++ b/drivers/gpu/drm/drm_fourcc.c > @@ -333,54 +333,6 @@ drm_get_format_info(struct drm_device *dev, > EXPORT_SYMBOL(drm_get_format_info); > > /** > - * drm_format_plane_width - width of the plane given the first plane > - * @width: width of the first plane > - * @format: pixel format > - * @plane: plane index > - * > - * Returns: > - * The width of @plane, given that the width of the first plane is @width. > - */ > -int drm_format_plane_width(int width, uint32_t format, int plane) > -{ > - const struct drm_format_info *info; > - > - info = drm_format_info(format); > - if (!info || plane >= info->num_planes) > - return 0; > - > - if (plane == 0) > - return width; > - > - return width / info->hsub; > -} > -EXPORT_SYMBOL(drm_format_plane_width); > - > -/** > - * drm_format_plane_height - height of the plane given the first plane > - * @height: height of the first plane > - * @format: pixel format > - * @plane: plane index > - * > - * Returns: > - * The height of @plane, given that the height of the first plane is @height. > - */ > -int drm_format_plane_height(int height, uint32_t format, int plane) > -{ > - const struct drm_format_info *info; > - > - info = drm_format_info(format); > - if (!info || plane >= info->num_planes) > - return 0; > - > - if (plane == 0) > - return height; > - > - return height / info->vsub; > -} > -EXPORT_SYMBOL(drm_format_plane_height); > - > -/** > * drm_format_info_block_width - width in pixels of block. > * @info: pixel format info > * @plane: plane index > diff --git a/drivers/gpu/drm/meson/meson_overlay.c b/drivers/gpu/drm/meson/meson_overlay.c > index fb8515b2860c..55b3f2f2e608 100644 > --- a/drivers/gpu/drm/meson/meson_overlay.c > +++ b/drivers/gpu/drm/meson/meson_overlay.c > @@ -466,8 +466,8 @@ static void meson_overlay_atomic_update(struct drm_plane *plane, > priv->viu.vd1_addr2 = gem->paddr + fb->offsets[2]; > priv->viu.vd1_stride2 = fb->pitches[2]; > priv->viu.vd1_height2 = > - drm_format_plane_height(fb->height, > - fb->format->format, 2); > + drm_format_info_plane_height(fb->format, > + fb->height, 2); > DRM_DEBUG("plane 2 addr 0x%x stride %d height %d\n", > priv->viu.vd1_addr2, > priv->viu.vd1_stride2, > @@ -478,8 +478,8 @@ static void meson_overlay_atomic_update(struct drm_plane *plane, > priv->viu.vd1_addr1 = gem->paddr + fb->offsets[1]; > priv->viu.vd1_stride1 = fb->pitches[1]; > priv->viu.vd1_height1 = > - drm_format_plane_height(fb->height, > - fb->format->format, 1); > + drm_format_info_plane_height(fb->format, > + fb->height, 1); > DRM_DEBUG("plane 1 addr 0x%x stride %d height %d\n", > priv->viu.vd1_addr1, > priv->viu.vd1_stride1, > @@ -490,8 +490,8 @@ static void meson_overlay_atomic_update(struct drm_plane *plane, > priv->viu.vd1_addr0 = gem->paddr + fb->offsets[0]; > priv->viu.vd1_stride0 = fb->pitches[0]; > priv->viu.vd1_height0 = > - drm_format_plane_height(fb->height, > - fb->format->format, 0); > + drm_format_info_plane_height(fb->format, > + fb->height, 0); > DRM_DEBUG("plane 0 addr 0x%x stride %d height %d\n", > priv->viu.vd1_addr0, > priv->viu.vd1_stride0, > diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h > index 6b5a82b31bc4..4ef8ccb5d236 100644 > --- a/include/drm/drm_fourcc.h > +++ b/include/drm/drm_fourcc.h > @@ -277,6 +277,50 @@ int drm_format_info_plane_cpp(const struct drm_format_info *info, int plane) > return info->cpp[plane]; > } > > +/** > + * drm_format_info_plane_width - width of the plane given the first plane > + * @format: pixel format info > + * @width: width of the first plane > + * @plane: plane index > + * > + * Returns: > + * The width of @plane, given that the width of the first plane is @width. > + */ > +static inline > +int drm_format_info_plane_width(const struct drm_format_info *info, int width, > + int plane) > +{ > + if (!info || plane >= info->num_planes) > + return 0; > + > + if (plane == 0) > + return width; > + > + return width / info->hsub; > +} > + > +/** > + * drm_format_info_plane_height - height of the plane given the first plane > + * @format: pixel format info > + * @height: height of the first plane > + * @plane: plane index > + * > + * Returns: > + * The height of @plane, given that the height of the first plane is @height. > + */ > +static inline > +int drm_format_info_plane_height(const struct drm_format_info *info, int height, > + int plane) > +{ > + if (!info || plane >= info->num_planes) > + return 0; > + > + if (plane == 0) > + return height; > + > + return height / info->vsub; > +} Why the null checks? None of the other inlines for drm_format_info perform them. ~Maarten
On Wed, Apr 17, 2019 at 12:47:48PM +0200, Maarten Lankhorst wrote: > > +/** > > + * drm_format_info_plane_width - width of the plane given the first plane > > + * @format: pixel format info > > + * @width: width of the first plane > > + * @plane: plane index > > + * > > + * Returns: > > + * The width of @plane, given that the width of the first plane is @width. > > + */ > > +static inline > > +int drm_format_info_plane_width(const struct drm_format_info *info, int width, > > + int plane) > > +{ > > + if (!info || plane >= info->num_planes) > > + return 0; > > + > > + if (plane == 0) > > + return width; > > + > > + return width / info->hsub; > > +} > > + > > +/** > > + * drm_format_info_plane_height - height of the plane given the first plane > > + * @format: pixel format info > > + * @height: height of the first plane > > + * @plane: plane index > > + * > > + * Returns: > > + * The height of @plane, given that the height of the first plane is @height. > > + */ > > +static inline > > +int drm_format_info_plane_height(const struct drm_format_info *info, int height, > > + int plane) > > +{ > > + if (!info || plane >= info->num_planes) > > + return 0; > > + > > + if (plane == 0) > > + return height; > > + > > + return height / info->vsub; > > +} > > Why the null checks? None of the other inlines for drm_format_info > perform them. Unless I'm mistaken, the subsampling only applies to the planes with the chrominance, which are always >= 1. Therefore the plane 0 is always the luminance, to which the subsampling doesn't apply. Or are you talking about something else? Maxime -- Maxime Ripard, Bootlin Embedded Linux and Kernel engineering https://bootlin.com
Op 17-04-2019 om 13:01 schreef Maxime Ripard: > On Wed, Apr 17, 2019 at 12:47:48PM +0200, Maarten Lankhorst wrote: >>> +/** >>> + * drm_format_info_plane_width - width of the plane given the first plane >>> + * @format: pixel format info >>> + * @width: width of the first plane >>> + * @plane: plane index >>> + * >>> + * Returns: >>> + * The width of @plane, given that the width of the first plane is @width. >>> + */ >>> +static inline >>> +int drm_format_info_plane_width(const struct drm_format_info *info, int width, >>> + int plane) >>> +{ >>> + if (!info || plane >= info->num_planes) >>> + return 0; >>> + >>> + if (plane == 0) >>> + return width; >>> + >>> + return width / info->hsub; >>> +} >>> + >>> +/** >>> + * drm_format_info_plane_height - height of the plane given the first plane >>> + * @format: pixel format info >>> + * @height: height of the first plane >>> + * @plane: plane index >>> + * >>> + * Returns: >>> + * The height of @plane, given that the height of the first plane is @height. >>> + */ >>> +static inline >>> +int drm_format_info_plane_height(const struct drm_format_info *info, int height, >>> + int plane) >>> +{ >>> + if (!info || plane >= info->num_planes) >>> + return 0; >>> + >>> + if (plane == 0) >>> + return height; >>> + >>> + return height / info->vsub; >>> +} >> Why the null checks? None of the other inlines for drm_format_info >> perform them. > Unless I'm mistaken, the subsampling only applies to the planes with > the chrominance, which are always >= 1. Therefore the plane 0 is > always the luminance, to which the subsampling doesn't apply. > > Or are you talking about something else? The info == NULL check. :)
On Wed, Apr 17, 2019 at 01:10:33PM +0200, Maarten Lankhorst wrote: > Op 17-04-2019 om 13:01 schreef Maxime Ripard: > > On Wed, Apr 17, 2019 at 12:47:48PM +0200, Maarten Lankhorst wrote: > >>> +/** > >>> + * drm_format_info_plane_width - width of the plane given the first plane > >>> + * @format: pixel format info > >>> + * @width: width of the first plane > >>> + * @plane: plane index > >>> + * > >>> + * Returns: > >>> + * The width of @plane, given that the width of the first plane is @width. > >>> + */ > >>> +static inline > >>> +int drm_format_info_plane_width(const struct drm_format_info *info, int width, > >>> + int plane) > >>> +{ > >>> + if (!info || plane >= info->num_planes) > >>> + return 0; > >>> + > >>> + if (plane == 0) > >>> + return width; > >>> + > >>> + return width / info->hsub; > >>> +} > >>> + > >>> +/** > >>> + * drm_format_info_plane_height - height of the plane given the first plane > >>> + * @format: pixel format info > >>> + * @height: height of the first plane > >>> + * @plane: plane index > >>> + * > >>> + * Returns: > >>> + * The height of @plane, given that the height of the first plane is @height. > >>> + */ > >>> +static inline > >>> +int drm_format_info_plane_height(const struct drm_format_info *info, int height, > >>> + int plane) > >>> +{ > >>> + if (!info || plane >= info->num_planes) > >>> + return 0; > >>> + > >>> + if (plane == 0) > >>> + return height; > >>> + > >>> + return height / info->vsub; > >>> +} > >> Why the null checks? None of the other inlines for drm_format_info > >> perform them. > > Unless I'm mistaken, the subsampling only applies to the planes with > > the chrominance, which are always >= 1. Therefore the plane 0 is > > always the luminance, to which the subsampling doesn't apply. > > > > Or are you talking about something else? > > > The info == NULL check. :) Aaah, sorry :) That's true, and that's actually the first four patches that change that behaviour a bit. Previously, drm_format_plane_cpp, _width, and _height will do the lookup themselves using drm_format_info, and test whether the pointer returned is null or not. Patches 3 and 4 removed that lookup but kept the null pointer check. We could remove it, but there's two downsides for that: * since the lookup is now effectively pushed to the caller (or the caller's caller), we would have to check there that the pointer isn't NULL. That's a lot of boilerplate to add. * And since this is a generic function, I wouldn't trust the caller to give a pointer that can be dereferenced right away. This might be more subjective though. So I guess we should make sure that we are consistent, but I'd be in favor of putting that check in all the functions. Maxime -- Maxime Ripard, Bootlin Embedded Linux and Kernel engineering https://bootlin.com
diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c index 5f63fc74e265..35b459d186c5 100644 --- a/drivers/gpu/drm/drm_fourcc.c +++ b/drivers/gpu/drm/drm_fourcc.c @@ -333,54 +333,6 @@ drm_get_format_info(struct drm_device *dev, EXPORT_SYMBOL(drm_get_format_info); /** - * drm_format_plane_width - width of the plane given the first plane - * @width: width of the first plane - * @format: pixel format - * @plane: plane index - * - * Returns: - * The width of @plane, given that the width of the first plane is @width. - */ -int drm_format_plane_width(int width, uint32_t format, int plane) -{ - const struct drm_format_info *info; - - info = drm_format_info(format); - if (!info || plane >= info->num_planes) - return 0; - - if (plane == 0) - return width; - - return width / info->hsub; -} -EXPORT_SYMBOL(drm_format_plane_width); - -/** - * drm_format_plane_height - height of the plane given the first plane - * @height: height of the first plane - * @format: pixel format - * @plane: plane index - * - * Returns: - * The height of @plane, given that the height of the first plane is @height. - */ -int drm_format_plane_height(int height, uint32_t format, int plane) -{ - const struct drm_format_info *info; - - info = drm_format_info(format); - if (!info || plane >= info->num_planes) - return 0; - - if (plane == 0) - return height; - - return height / info->vsub; -} -EXPORT_SYMBOL(drm_format_plane_height); - -/** * drm_format_info_block_width - width in pixels of block. * @info: pixel format info * @plane: plane index diff --git a/drivers/gpu/drm/meson/meson_overlay.c b/drivers/gpu/drm/meson/meson_overlay.c index fb8515b2860c..55b3f2f2e608 100644 --- a/drivers/gpu/drm/meson/meson_overlay.c +++ b/drivers/gpu/drm/meson/meson_overlay.c @@ -466,8 +466,8 @@ static void meson_overlay_atomic_update(struct drm_plane *plane, priv->viu.vd1_addr2 = gem->paddr + fb->offsets[2]; priv->viu.vd1_stride2 = fb->pitches[2]; priv->viu.vd1_height2 = - drm_format_plane_height(fb->height, - fb->format->format, 2); + drm_format_info_plane_height(fb->format, + fb->height, 2); DRM_DEBUG("plane 2 addr 0x%x stride %d height %d\n", priv->viu.vd1_addr2, priv->viu.vd1_stride2, @@ -478,8 +478,8 @@ static void meson_overlay_atomic_update(struct drm_plane *plane, priv->viu.vd1_addr1 = gem->paddr + fb->offsets[1]; priv->viu.vd1_stride1 = fb->pitches[1]; priv->viu.vd1_height1 = - drm_format_plane_height(fb->height, - fb->format->format, 1); + drm_format_info_plane_height(fb->format, + fb->height, 1); DRM_DEBUG("plane 1 addr 0x%x stride %d height %d\n", priv->viu.vd1_addr1, priv->viu.vd1_stride1, @@ -490,8 +490,8 @@ static void meson_overlay_atomic_update(struct drm_plane *plane, priv->viu.vd1_addr0 = gem->paddr + fb->offsets[0]; priv->viu.vd1_stride0 = fb->pitches[0]; priv->viu.vd1_height0 = - drm_format_plane_height(fb->height, - fb->format->format, 0); + drm_format_info_plane_height(fb->format, + fb->height, 0); DRM_DEBUG("plane 0 addr 0x%x stride %d height %d\n", priv->viu.vd1_addr0, priv->viu.vd1_stride0, diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h index 6b5a82b31bc4..4ef8ccb5d236 100644 --- a/include/drm/drm_fourcc.h +++ b/include/drm/drm_fourcc.h @@ -277,6 +277,50 @@ int drm_format_info_plane_cpp(const struct drm_format_info *info, int plane) return info->cpp[plane]; } +/** + * drm_format_info_plane_width - width of the plane given the first plane + * @format: pixel format info + * @width: width of the first plane + * @plane: plane index + * + * Returns: + * The width of @plane, given that the width of the first plane is @width. + */ +static inline +int drm_format_info_plane_width(const struct drm_format_info *info, int width, + int plane) +{ + if (!info || plane >= info->num_planes) + return 0; + + if (plane == 0) + return width; + + return width / info->hsub; +} + +/** + * drm_format_info_plane_height - height of the plane given the first plane + * @format: pixel format info + * @height: height of the first plane + * @plane: plane index + * + * Returns: + * The height of @plane, given that the height of the first plane is @height. + */ +static inline +int drm_format_info_plane_height(const struct drm_format_info *info, int height, + int plane) +{ + if (!info || plane >= info->num_planes) + return 0; + + if (plane == 0) + return height; + + return height / info->vsub; +} + const struct drm_format_info *__drm_format_info(u32 format); const struct drm_format_info *drm_format_info(u32 format); const struct drm_format_info * @@ -285,8 +329,6 @@ drm_get_format_info(struct drm_device *dev, uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth); uint32_t drm_driver_legacy_fb_format(struct drm_device *dev, uint32_t bpp, uint32_t depth); -int drm_format_plane_width(int width, uint32_t format, int plane); -int drm_format_plane_height(int height, uint32_t format, int plane); unsigned int drm_format_info_block_width(const struct drm_format_info *info, int plane); unsigned int drm_format_info_block_height(const struct drm_format_info *info,