On Wed, Nov 4, 2020 at 1:21 AM Bas Nieuwenhuizen
<b...@basnieuwenhuizen.nl> wrote:
>
> On Wed, Nov 4, 2020 at 12:52 AM Mark Thompson <s...@jkqxz.net> wrote:
> >
> > On 03/11/2020 23:17, Bas Nieuwenhuizen wrote:
> > > The kernel defaults to initializing the field to 0 when modifiers
> > > are not used and this happens to be linear. If we end up actually
> > > passing the modifier to a driver, tiling issues happen.
> > >
> > > So if the kernel doesn't return a modifier set it explicitly to
> > > INVALID. That way later processing knows there is no explicit
> > > modifier.
> > > ---
> > >   libavdevice/kmsgrab.c | 19 +++++++++++++++----
> > >   1 file changed, 15 insertions(+), 4 deletions(-)
> >
> > Huh - I didn't notice that GETFB2 was allowed to not return modifiers.
> >
> > What does this case actually mean for the returned framebuffers?
> >
> > For example, if they actually have modifiers applied but the kernel won't 
> > tell us then can we guarantee that any following step will also be ok with 
> > not having the modifier?  (I'm wondering whether it would be of any value 
> > to reuse the GETFB user-supplied-modifer in that case.)
>
> Can't 100% guarantee that in general as the display and encoder device
> might be from different vendors. However, if the flag is not set then
> it was not set on modeset either. So the KMS driver has to depend on
> implicit modifiers (i.e. a default for all shared images or some out
> of band info). With suitably matched devices this should always work.

I realized that with Vulkan we don't have an import path for implicit
modifiers. I'll update the getfb2 path to only override the
user-supplied modifier if the getfb2 returns a modifier.

>
> In particular the case where a user-specified modifier could
> conceivably help we have a new encoder (supports modifiers) but old
> KMS (doesn't support modifiers). That means the compositor+driver
> userspace had to set the correct implicit modifier for KMS to work,
> and the encoder should be able to pick that up as long as you don't
> feed it a real modifier (so you really want DRM_FORMAT_MOD_INVALID in
> this case). So it doesn't really help ... In fact it can confuse
> things as with an user-specified (non-INVALID) modifier the encoder
> doesn't know to look at the implicit modifier.
>
> As an aside, your mention of the user-supplied-modifier made me notice
> I probably broke that by always setting it to DRM_FORMAT_MOD_INVALID
> in the GetFB path ... Will delete that in the V2.
>
> >
> > > diff --git a/libavdevice/kmsgrab.c b/libavdevice/kmsgrab.c
> > > index a0aa9dc22f..2a03ba4122 100644
> > > --- a/libavdevice/kmsgrab.c
> > > +++ b/libavdevice/kmsgrab.c
> > > @@ -160,6 +160,7 @@ static int kmsgrab_get_fb2(AVFormatContext *avctx,
> > >       KMSGrabContext *ctx = avctx->priv_data;
> > >       drmModeFB2 *fb;
> > >       int err, i, nb_objects;
> > > +    uint64_t modifier = DRM_FORMAT_MOD_INVALID;
> > >
> > >       fb = drmModeGetFB2(ctx->hwctx->fd, plane->fb_id);
> > >       if (!fb) {
> > > @@ -195,6 +196,9 @@ static int kmsgrab_get_fb2(AVFormatContext *avctx,
> > >           goto fail;
> > >       }
> > >
> > > +    if (fb->flags & DRM_MODE_FB_MODIFIERS)
> > > +        modifier = fb->modifier;
> > > +
> > >       *desc = (AVDRMFrameDescriptor) {
> > >           .nb_layers = 1,
> > >           .layers[0] = {
> > > @@ -243,7 +247,7 @@ static int kmsgrab_get_fb2(AVFormatContext *avctx,
> > >               desc->objects[obj] = (AVDRMObjectDescriptor) {
> > >                   .fd              = fd,
> > >                   .size            = size,
> > > -                .format_modifier = fb->modifier,
> > > +                .format_modifier = modifier,
> > >               };
> > >               desc->layers[0].planes[i] = (AVDRMPlaneDescriptor) {
> > >                   .object_index = obj,
> > > @@ -519,6 +523,8 @@ static av_cold int 
> > > kmsgrab_read_header(AVFormatContext *avctx)
> > >           err = AVERROR(err);
> > >           goto fail;
> > >       } else {
> > > +        uint64_t modifier = DRM_FORMAT_MOD_INVALID;
> > > +
> > >           av_log(avctx, AV_LOG_INFO, "Template framebuffer is "
> > >                  "%"PRIu32": %"PRIu32"x%"PRIu32" "
> > >                  "format %"PRIx32" modifier %"PRIx64" flags %"PRIx32".\n",
> > > @@ -557,15 +563,19 @@ static av_cold int 
> > > kmsgrab_read_header(AVFormatContext *avctx)
> > >               err = AVERROR(EINVAL);
> > >               goto fail;
> > >           }
> > > +
> > > +        if (fb2->flags & DRM_MODE_FB_MODIFIERS)
> > > +            modifier = fb2->modifier;
> > > +
> > >           if (ctx->drm_format_modifier != DRM_FORMAT_MOD_INVALID &&
> > > -            ctx->drm_format_modifier != fb2->modifier) {
> > > +            ctx->drm_format_modifier != modifier) {
> > >               av_log(avctx, AV_LOG_ERROR, "Framebuffer format modifier "
> > >                      "%"PRIx64" does not match expected modifier.\n",
> > > -                   fb2->modifier);
> > > +                   modifier);
> > >               err = AVERROR(EINVAL);
> > >               goto fail;
> > >           } else {
> > > -            ctx->drm_format_modifier = fb2->modifier;
> > > +            ctx->drm_format_modifier = modifier;
> > >           }
> > >           av_log(avctx, AV_LOG_VERBOSE, "Format is %s, from "
> > >                  "DRM format %"PRIx32" modifier %"PRIx64".\n",
> > > @@ -609,6 +619,7 @@ static av_cold int 
> > > kmsgrab_read_header(AVFormatContext *avctx)
> > >
> > >           ctx->width  = fb->width;
> > >           ctx->height = fb->height;
> > > +        ctx->drm_format_modifier = DRM_FORMAT_MOD_INVALID;
> > >
> > >           if (!fb->handle) {
> > >               av_log(avctx, AV_LOG_ERROR, "No handle set on framebuffer: "
> > >
> >
> > Thanks,
> >
> > - Mark
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to