On Tue, Apr 13, 2021 at 04:11:29PM +0200, Daniel Vetter wrote: > On Tue, Apr 13, 2021 at 02:56:02PM +0300, Pekka Paalanen wrote: > > On Tue, 13 Apr 2021 11:49:03 +0200 > > Daniel Vetter <daniel.vetter@xxxxxxxx> wrote: > > > > > It's very confusing for userspace to have to deal with inconsistencies > > > here, and some drivers screwed this up a bit. Most just ommitted the > > > format list when they meant to say that only linear modifier is > > > allowed, but some also meant that only implied modifiers are > > > acceptable (because actually none of the planes registered supported > > > modifiers). > > > > > > Now that this is all done consistently across all drivers, document > > > the rules and enforce it in the drm core. > > > > > > Cc: Pekka Paalanen <pekka.paalanen@xxxxxxxxxxxxx> > > > Signed-off-by: Daniel Vetter <daniel.vetter@xxxxxxxxx> > > > Cc: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> > > > Cc: Maxime Ripard <mripard@xxxxxxxxxx> > > > Cc: Thomas Zimmermann <tzimmermann@xxxxxxx> > > > Cc: David Airlie <airlied@xxxxxxxx> > > > Cc: Daniel Vetter <daniel@xxxxxxxx> > > > --- > > > drivers/gpu/drm/drm_plane.c | 16 +++++++++++++++- > > > include/drm/drm_mode_config.h | 2 ++ > > > 2 files changed, 17 insertions(+), 1 deletion(-) > > > > > > diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c > > > index 0dd43882fe7c..16a7e3e57f7f 100644 > > > --- a/drivers/gpu/drm/drm_plane.c > > > +++ b/drivers/gpu/drm/drm_plane.c > > > @@ -128,6 +128,11 @@ > > > * pairs supported by this plane. The blob is a struct > > > * drm_format_modifier_blob. Without this property the plane doesn't > > > * support buffers with modifiers. Userspace cannot change this property. > > > + * > > > + * Note that userspace can check the DRM_CAP_ADDFB2_MODIFIERS driver > > > + * capability for general modifier support. If this flag is set then every > > > + * plane will have the IN_FORMATS property, even when it only supports > > > + * DRM_FORMAT_MOD_LINEAR. > > > > Ooh, that's even better. But isn't that changing the meaning of the > > cap? Isn't the cap older than IN_FORMATS? > > Hm indeed. But also how exactly are you going to user modifiers without > IN_FORMATS ... it's a bit hard. I think this is all because we've enabled > modifiers piece-by-piece and never across the entire thing (e.g. with > compositor and protocols), so the missing pieces only became apparent > later on. Ok I worked git log -Gallow_fb_modifiers and there's 3 drivers which enabled modifiers before IN_FORMATS was merged: - i915 - msm/mdp4 (for the tiled NV12 format thing) - tegra > I'm not sure whether compositors really want to support this, I guess > worst case we could disable the cap on these old kernels. > > > What about the opposite? Is it allowed to have even a single IN_FORMATS > > if you don't have the cap? > > That direction is enforced since 5.1, because some drivers screwed it up > and confusion in userspace ensued. > > Should I add a bug that on kernels older than 5.1 the situation is more > murky and there's lots of bugs? I guess we should recommend to userspace that if they spot an inconsistency between IN_FORMATS across planes and the cap then maybe they want to disable modifier support because it might be all kinds of broken? -Daniel > > > > > > */ > > > > > > static unsigned int drm_num_planes(struct drm_device *dev) > > > @@ -277,8 +282,14 @@ static int __drm_universal_plane_init(struct drm_device *dev, > > > format_modifier_count++; > > > } > > > > > > - if (format_modifier_count) > > > + /* autoset the cap and check for consistency across all planes */ > > > + if (format_modifier_count) { > > > + WARN_ON(!config->allow_fb_modifiers && > > > + !list_empty(&config->plane_list)); > > > > What does this mean? > > If allow_fb_modifiers isn't set yet (we do that in the line below) and we > are _not_ the first plane that gets added to the driver (that's done > towards the end of the function) then that means there's already a plane > registered without modifiers and hence IN_FORMAT. Which we then warn > about. > > > > > > config->allow_fb_modifiers = true; > > > + } else { > > > + WARN_ON(config->allow_fb_modifiers); > > This warning here checks the other case of an earlier plane with > modifiers, but the one we're adding now doesn't have them. > -Daniel > > > > + } > > > > > > plane->modifier_count = format_modifier_count; > > > plane->modifiers = kmalloc_array(format_modifier_count, > > > @@ -360,6 +371,9 @@ static int __drm_universal_plane_init(struct drm_device *dev, > > > * drm_universal_plane_init() to let the DRM managed resource infrastructure > > > * take care of cleanup and deallocation. > > > * > > > + * Drivers supporting modifiers must set @format_modifiers on all their planes, > > > + * even those that only support DRM_FORMAT_MOD_LINEAR. > > > > Good. > > > > > + * > > > * Returns: > > > * Zero on success, error code on failure. > > > */ > > > diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h > > > index ab424ddd7665..1ddf7783fdf7 100644 > > > --- a/include/drm/drm_mode_config.h > > > +++ b/include/drm/drm_mode_config.h > > > @@ -909,6 +909,8 @@ struct drm_mode_config { > > > * @allow_fb_modifiers: > > > * > > > * Whether the driver supports fb modifiers in the ADDFB2.1 ioctl call. > > > + * Note that drivers should not set this directly, it is automatically > > > + * set in drm_universal_plane_init(). > > > * > > > * IMPORTANT: > > > * > > > > Thanks, > > pq > > > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel