From: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
To: "Michel Dänzer" <michel@daenzer.net>,
"Nicolas Dufresne" <nicolas@ndufresne.ca>,
"Daniel Vetter" <daniel@ffwll.ch>
Cc: Alexandre Courbot <acourbot@chromium.org>,
Maxime Ripard <maxime.ripard@bootlin.com>,
linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
Tomasz Figa <tfiga@chromium.org>,
Hans Verkuil <hverkuil@xs4all.nl>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
Dave Airlie <airlied@redhat.com>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
linux-media@vger.kernel.org
Subject: Re: Support for 2D engines/blitters in V4L2 and DRM
Date: Wed, 24 Apr 2019 14:19:11 +0200 [thread overview]
Message-ID: <cfb80745a780083034aae661f5b84cf6114bc186.camel@bootlin.com> (raw)
In-Reply-To: <1d6fb659-0516-41db-257b-258e6116a4f2@daenzer.net>
Hi,
On Wed, 2019-04-24 at 10:31 +0200, Michel Dänzer wrote:
> On 2019-04-19 10:38 a.m., Paul Kocialkowski wrote:
> > On Thu, 2019-04-18 at 20:30 -0400, Nicolas Dufresne wrote:
> > > Le jeudi 18 avril 2019 à 10:18 +0200, Daniel Vetter a écrit :
> > > > > It would be cool if both could be used concurrently and not just return
> > > > > -EBUSY when the device is used with the other subsystem.
> > > >
> > > > We live in this world already :-) I think there's even patches (or merged
> > > > already) to add fences to v4l, for Android.
> > >
> > > This work is currently suspended. It will require some feature on DRM
> > > display to really make this useful, but there is also a lot of
> > > challanges in V4L2. In GFX space, most of the use case are about
> > > rendering as soon as possible. Though, in multimedia we have two
> > > problems, we need to synchronize the frame rendering with the audio,
> > > and output buffers may comes out of order due to how video CODECs are
> > > made.
> >
> > Definitely, it feels like the DRM display side is currently a good fit
> > for render use cases, but not so much for precise display cases where
> > we want to try and display a buffer at a given vblank target instead of
> > "as soon as possible".
> >
> > I have a userspace project where I've implemented a page flip queue,
> > which only schedules the next flip when relevant and keeps ready
> > buffers in the queue until then. This requires explicit vblank
> > syncronisation (which DRM offsers, but pretty much all other display
> > APIs, that are higher-level don't, so I'm just using a refresh-rate
> > timer for them) and flip done notification.
> >
> > I haven't looked too much at how to flip with a target vblank with DRM
> > directly but maybe the atomic API already has the bits in for that (but
> > I haven't heard of such a thing as a buffer queue, so that makes me
> > doubt it).
>
> Not directly. What's available is that if userspace waits for vblank n
> and then submits a flip, the flip will complete in vblank n+1 (or a
> later vblank, depending on when the flip is submitted and when the
> fences the flip depends on signal).
>
> There is reluctance allowing more than one flip to be queued in the
> kernel, as it would considerably increase complexity in the kernel. It
> would probably only be considered if there was a compelling use-case
> which was outright impossible otherwise.
Well, I think it's just less boilerplace for userspace. This is indeed
quite complex, and I prefer to see that complexity done once and well
in Linux rather than duplicated in userspace with more or less reliable
implementations.
> > Well, I need to handle stuff like SDL in my userspace project, so I have
> > to have all that queuing stuff in software anyway, but it would be good
> > if each project didn't have to implement that. Worst case, it could be
> > in libdrm too.
>
> Usually, this kind of queuing will be handled in a display server such
> as Xorg or a Wayland compositor, not by the application such as a video
> player itself, or any library in the latter's address space. I'm not
> sure there's much potential for sharing code between display servers for
> this.
This assumes that you are using a display server, which is definitely
not always the case (there is e.g. Kodi GBM). Well, I'm not saying it
is essential to have it in the kernel, but it would avoid code
duplication and lower the complexity in userspace.
> > > In the first, we'd need a mechanism where we can schedule a render at a
> > > specific time or vblank. We can of course already implement this in
> > > software, but with fences, the scheduling would need to be done in the
> > > driver. Then if the fence is signalled earlier, the driver should hold
> > > on until the delay is met. If the fence got signalled late, we also
> > > need to think of a workflow. As we can't schedule more then one render
> > > in DRM at one time, I don't really see yet how to make that work.
> >
> > Indeed, that's also one of the main issues I've spotted. Before using
> > an implicit fence, we basically have to make sure the frame is due for
> > display at the next vblank. Otherwise, we need to refrain from using
> > the fence and schedule the flip later, which is kind of counter-
> > productive.
>
> Fences are about signalling that the contents of a frame are "done" and
> ready to be presented. They're not about specifying which frame is to be
> presented when.
Yes, that's precisely the issue I see with them. Once you have
scheduled the flip with a buffer, it is too late to schedule a more
recent buffer for flip if a more recent buffer is available sooner (see
the issue that Nicolas is describing). If you attach a vblank target to
the flip, the flip can be skipped when the fence is signaled if a more
recent buffer was signaled first.
> > I feel like specifying a target vblank would be a good unit for that,
>
> The mechanism described above works for that.
I still don't see any fence-based mechanism that can work to achieve
that, but maybe I'm missing your point.
> > since it's our native granularity after all (while a timestamp is not).
>
> Note that variable refresh rate (Adaptive Sync / FreeSync / G-Sync)
> changes things in this regard. It makes the vblank length variable, and
> if you wait for multiple vblanks between flips, you get the maximum
> vblank length corresponding to the minimum refresh rate / timing
> granularity. Thus, it would be useful to allow userspace to specify a
> timestamp corresponding to the earliest time when the flip is to
> complete. The kernel could then try to hit that as closely as possible.
I'm not very familiar with how this works, but I don't really see what
it changes. Does it mean we can flip multiple times per vblank?
If so, how can userspace be aware of that and deal with it properly?
Unless I'm missing something, I think flip scheduling should still work
on vblank granularity in that case.
And I really like a vblank count over a timestamp, as one is the native
unit at hand and the other one only correleates to it.
Cheers,
Paul
--
Paul Kocialkowski, Bootlin
Embedded Linux and kernel engineering
https://bootlin.com
next prev parent reply other threads:[~2019-04-24 12:19 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-17 18:10 Support for 2D engines/blitters in V4L2 and DRM Paul Kocialkowski
2019-04-18 8:18 ` Daniel Vetter
2019-04-18 8:54 ` Paul Kocialkowski
2019-04-18 9:09 ` Tomasz Figa
2019-04-18 9:13 ` Paul Kocialkowski
2019-04-18 9:21 ` Tomasz Figa
2019-04-19 0:30 ` Nicolas Dufresne
2019-04-19 4:27 ` Tomasz Figa
2019-04-19 15:31 ` Nicolas Dufresne
2019-04-22 4:02 ` Tomasz Figa
2019-04-19 8:38 ` Paul Kocialkowski
2019-04-24 8:31 ` Michel Dänzer
2019-04-24 12:01 ` Nicolas Dufresne
2019-04-24 14:39 ` Michel Dänzer
2019-04-24 14:41 ` Paul Kocialkowski
2019-04-24 15:06 ` Daniel Vetter
2019-04-24 15:44 ` Nicolas Dufresne
2019-04-24 16:54 ` Michel Dänzer
2019-04-24 17:43 ` Nicolas Dufresne
2019-04-25 15:17 ` Michel Dänzer
2019-04-24 12:19 ` Paul Kocialkowski [this message]
2019-04-24 17:10 ` Michel Dänzer
2019-05-06 8:28 ` Pekka Paalanen
2019-05-09 8:32 ` Paul Kocialkowski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cfb80745a780083034aae661f5b84cf6114bc186.camel@bootlin.com \
--to=paul.kocialkowski@bootlin.com \
--cc=acourbot@chromium.org \
--cc=airlied@redhat.com \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=hverkuil@xs4all.nl \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=maxime.ripard@bootlin.com \
--cc=mchehab@kernel.org \
--cc=michel@daenzer.net \
--cc=nicolas@ndufresne.ca \
--cc=tfiga@chromium.org \
--cc=thomas.petazzoni@bootlin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox