dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: Pekka Paalanen <ppaalanen@gmail.com>
To: "Kazlauskas, Nicholas" <Nicholas.Kazlauskas@amd.com>
Cc: "daniel.vetter@ffwll.ch" <daniel.vetter@ffwll.ch>,
	"Michel Dänzer" <michel@daenzer.net>,
	"amd-gfx@lists.freedesktop.org" <amd-gfx@lists.freedesktop.org>,
	"manasi.d.navare@intel.com" <manasi.d.navare@intel.com>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	"Deucher, Alexander" <Alexander.Deucher@amd.com>,
	"Olsak, Marek" <Marek.Olsak@amd.com>
Subject: Re: [PATCH v4 3/4] drm: Document variable refresh properties
Date: Thu, 1 Nov 2018 10:37:23 +0200	[thread overview]
Message-ID: <20181101103723.166ef50f@eldfell> (raw)
In-Reply-To: <87bcab42-e377-259c-13ea-0cfe9c675cf9@amd.com>


[-- Attachment #1.1: Type: text/plain, Size: 8807 bytes --]

On Wed, 31 Oct 2018 17:54:34 +0000
"Kazlauskas, Nicholas" <Nicholas.Kazlauskas@amd.com> wrote:

> On 10/31/18 12:20 PM, Michel Dänzer wrote:
> > On 2018-10-31 3:41 p.m., Kazlauskas, Nicholas wrote:  
> >> On 10/31/18 10:12 AM, Michel Dänzer wrote:  
> >>> On 2018-10-31 2:38 p.m., Kazlauskas, Nicholas wrote:  
> >>>> On 10/30/18 11:34 AM, Kazlauskas, Nicholas wrote:  
> >>>>>
> >>>>> I understand the issue you're describing now. The timestamp is supposed
> >>>>> to signify the end of the current vblank. The call to get scanout
> >>>>> position is supposed to return the number of lines until scanout (a
> >>>>> negative value) or the number of lines since the next scanout began (a
> >>>>> positive value).
> >>>>>
> >>>>> The amdgpu driver calculates the number of lines based on a hardware
> >>>>> register status position which returns an increasing value from 0 that
> >>>>> indicates the current vpos/hpos for the display.
> >>>>>
> >>>>> For any vpos below vbl_start we know the value is correct since the next
> >>>>> vblank hasn't begun yet. But for anythign about vbl_start it's probably
> >>>>> wrong since it applies a corrective offset based on the fixed value of
> >>>>> crtc_vtotal. It's even worse when the value is above crtc_vtotal since
> >>>>> it'll be calculating the number of lines since the last scanout since
> >>>>> it'll be a positive value.
> >>>>>
> >>>>> So the issue becomes determining when the vfront porch will end.
> >>>>>
> >>>>> When the flip address gets written the vfront porch will end at the
> >>>>> start of the next line leaving only the back porch plus part of the
> >>>>> line. But we don't know when the flip will occur, if at all. It hasn't
> >>>>> occurred yet in this case.
> >>>>>
> >>>>> Waiting for the wrap around to 0 might be the best choice here since
> >>>>> there's no guarantee the flip will occur.  
> >>>>
> >>>> I put some more thought into this and I don't think this is as bad as I
> >>>> had originally thought.
> >>>>
> >>>> I think the vblank timestamp is supposed to be for the first active
> >>>> pixel of the next scanout. The usage of which is for clients to time
> >>>> their content/animation/etc.
> >>>>
> >>>> The client likely doesn't care when they issue their flip, just that
> >>>> their content is matched for that vblank timestamp. The fixed refresh
> >>>> model works really well for that kind of application.
> >>>>
> >>>> Utilizing variable refresh rate would be a mistake in that case since
> >>>> the client would then have to time based on when they flip which is a
> >>>> lot harder to "predict" precisely.  
> >>>
> >>> It's only a "mistake" as long as the timestamps are misleading. :) As
> >>> discussed before, accurate presentation timestamps are one requirement
> >>> for achieving perfectly smooth animation.  
> >>
> >> For most 3D games the game world/rendering can advance by an arbitrary
> >> timestep - and faster will be smoother, which is what the native mode
> >> would give you.
> >>
> >> For fixed interval content/animation where you can't do that variable
> >> refresh rate could vastly improve the output. But like discussed before
> >> that would need a way to specify the interval/presentation timestamp to
> >> control that front porch duration. The timestamp will be misleading in
> >> any other case.  
> > 
> > I don't agree that an accurate timestamp can ever be more "misleading"
> > than an inaccurate one. But yeah, accurate timestamps and time-based
> > presentation are two sides of the same coin which can buy the holy grail
> > of perfectly smooth animation. :)
> > 
> >   
> >>>> I did some more investigation into when amdgpu gets the scanout position
> >>>> and what values we get back out of it. The timestamp is updated shortly
> >>>> after the crtc irq vblank which is typically within a few lines of
> >>>> vbl_start. This makes sense, since we can provide the prediction
> >>>> timestamp early. Waiting for the vblank to wrap around to 0 doesn't
> >>>> really make sense here since that would mean we already hit timeout or
> >>>> the flip occurred  
> >>>
> >>> Sounds like you're mixing up the two cases of "actual" vblank events
> >>> (triggered by the "vblank" interrupt => drm_(crtc_)handle_vblank) and
> >>> flip completion events (triggered by the PFLIP interrupt with our
> >>> hardware => drm_crtc_send_vblank_event).
> >>>
> >>> Actual vblank events need to be delivered to userspace at the start of
> >>> vblank, so we indeed can't wait until the timestamp is accurate for
> >>> them. We just need to document the exact semantics of their timestamp
> >>> with VRR.
> >>>
> >>> For page flip completion events though, the timestamp needs to be
> >>> accurate and correspond to when the flipped frame starts being scanned
> >>> out, otherwise we'll surely break at least some userspace relying on
> >>> this information.
> >>>  
> >> Yeah, I was. I guess what's sent is the estimated vblank timestamp
> >> calculated at the start of the interrupt.  
> > 
> > s/interrupt/vblank/, yeah.
> > 
> >   
> >> And since that's just a guess rather than what's actually going to
> >> happen it's going to be wrong in a lot of cases.
> >>
> >> I could see the wrap-around method working if the vblank timestamp was
> >> somehow updated in amdgpu or in drm_crtc_send_vblank_event.  
> > 
> > DC already calls drm_crtc_accurate_vblank_count before
> > drm_crtc_send_vblank_event, we "just" need to make sure that results in
> > an accurate timestamp.
> > 
> >   
> >> This would be a relatively simple fix but would break anything in
> >> userspace that relied on the timestamp for vblank interrupt and the
> >> flip completion being the same value.  
> > 
> > Hmm, that's a good point. So while VRR is enabled, maybe it is safer to
> > defer delivery of vblank events until the accurate timestamp is known as
> > well, at least by default. If there is userspace which needs the events
> > earlier even with VRR but can live with the guessed timestamp, a flag or
> > something could be added for that.
> > 
> >   
> 
> I was under the impression that the vblank timestamp was reused but it's 
> already going to differ since we call drm_crtc_accurate_vblank_count 
> before drm_crtc_send_vblank_event. Thanks for pointing that out.
> 
> Since that works for updating timestamp what's left is making sure that 
> it waits for the wrap around if it's above crtc_vtotal. It might make 
> sense to add a new flag for this that's only used within 
> amdgpu_get_crtc_scanout_position so the other call sites aren't affected.
> 
> There isn't a way to get an accurate timestamp with VRR enabled until 
> after the flip happens. So deferring it kind of defeats the purpose of a 
> client using it to make predictions before the flip for displaying their 
> content.

Hi,

I don't think I understood half of the discussion above, but I'd like
to offer how Weston uses vblank timestamps and pageflip timestamps
today.

When Weston starts rendering "from idle", which means it has lost track
of the past flip timestamps since it has not been flipping, it uses
drmWaitVBlank() to query the latest flip time non-blocking:

	drmVBlank vbl = {
		.request.type = DRM_VBLANK_RELATIVE,
		.request.sequence = 0,
		.request.signal = 0,
	};

If that returns a valid answer, it is taken as the base timestamp. (If
it doesn't result in a valid timestamp, Weston makes a flip to the
current FB and uses the realized pageflip timestamp of that as the base
timestamp.)  The base timestamp is used to predict the next possible
flip time by adding one refresh period to it.

This obviously depends heavily on fixed refresh rate. However, if
userspace can know the VRR flip timeout length, I think it should be
possible to compute the next possible flip window being between:
base timestamp + minimum refresh period + { 0, timeout }.

Of course, the prediction of the next possible flip window is only an
estimate, so some inaccuracy is allowed. We still rely on the
after-the-fact feedback in the form of pageflip timestamps to be
accurate, so that we can potentially adjust the userspace timings to
eventually hit what we predict.

Implementing support for flip target timestamps would be merely an
addition to all the above, that should improve the sub-refresh-period
timing accuracy even further. But, to compute target timestamps,
userspace would still need to predict the flip window to avoid being
half a refresh period or more off on average.

Therefore, if at all possible, I would like you to set the vblank and
pageflip timestamp semantics such that this prediction is not
fundamentally broken.


Thanks,
pq

[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 160 bytes --]

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2018-11-01  8:37 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-11 16:39 [PATCH v4 0/4] A DRM API for adaptive sync and variable refresh rate support Nicholas Kazlauskas
2018-10-11 16:39 ` [PATCH v4 2/4] drm: Add vrr_enabled property to drm CRTC Nicholas Kazlauskas
2018-10-11 16:39 ` [PATCH v4 3/4] drm: Document variable refresh properties Nicholas Kazlauskas
     [not found]   ` <20181011163942.28267-4-nicholas.kazlauskas-5C7GfCeVMHo@public.gmane.org>
2018-10-26 11:37     ` Pekka Paalanen
2018-10-26 14:49       ` Kazlauskas, Nicholas
     [not found]         ` <bdda3a3b-c912-98bf-8dbd-29a5b58086df-5C7GfCeVMHo@public.gmane.org>
2018-10-26 14:53           ` Ville Syrjälä
     [not found]             ` <20181026145321.GV9144-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2018-10-26 17:34               ` Kazlauskas, Nicholas
     [not found]                 ` <f21251f7-10e2-e0f7-702d-bd3868ac8edc-5C7GfCeVMHo@public.gmane.org>
2018-10-26 17:59                   ` Ville Syrjälä
2018-10-29 16:37                     ` Michel Dänzer
     [not found]                       ` <481ae686-adda-5857-5538-2b0af2e25427-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-10-29 18:03                         ` Ville Syrjälä
     [not found]                           ` <20181029180341.GN9144-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2018-10-29 19:11                             ` Kazlauskas, Nicholas
     [not found]                               ` <3b03a13a-5418-b4fc-137f-2f917b3947d3-5C7GfCeVMHo@public.gmane.org>
2018-10-30  9:07                                 ` Michel Dänzer
2018-10-30  9:29                             ` Michel Dänzer
2018-10-30 15:34                               ` Kazlauskas, Nicholas
     [not found]                                 ` <1c1c0f6f-ccbd-bfc2-f249-a01f6fc997ec-5C7GfCeVMHo@public.gmane.org>
2018-10-31 13:38                                   ` Kazlauskas, Nicholas
     [not found]                                     ` <311638a8-eb8a-cb8d-3f7a-109aaa4b046b-5C7GfCeVMHo@public.gmane.org>
2018-10-31 14:12                                       ` Michel Dänzer
2018-10-31 14:41                                         ` Kazlauskas, Nicholas
2018-10-31 16:20                                           ` Michel Dänzer
2018-10-31 17:54                                             ` Kazlauskas, Nicholas
2018-11-01  8:37                                               ` Pekka Paalanen [this message]
     [not found]                                               ` <87bcab42-e377-259c-13ea-0cfe9c675cf9-5C7GfCeVMHo@public.gmane.org>
2018-11-01 10:58                                                 ` Michel Dänzer
     [not found]                                                   ` <99214cf0-9717-3c23-9457-791288d4d252-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-11-01 14:58                                                     ` Kazlauskas, Nicholas
2018-11-01 17:05                                                       ` Michel Dänzer
     [not found]                                                         ` <8617ac72-ec32-8146-cead-e28e78067ec0-otUistvHUpPR7s880joybQ@public.gmane.org>
2018-11-01 17:19                                                           ` Kazlauskas, Nicholas
2018-10-26 19:13                   ` Manasi Navare
2018-10-26 20:06                     ` Kazlauskas, Nicholas
2018-10-26 20:58                       ` Manasi Navare
2018-10-29  8:36                   ` Pekka Paalanen
2018-10-29 14:31                     ` Kazlauskas, Nicholas
     [not found] ` <20181011163942.28267-1-nicholas.kazlauskas-5C7GfCeVMHo@public.gmane.org>
2018-10-11 16:39   ` [PATCH v4 1/4] drm: Add vrr_capable property to the drm connector Nicholas Kazlauskas
2018-10-11 16:39   ` [PATCH v4 4/4] drm/amd/display: Set FreeSync state using drm VRR properties Nicholas Kazlauskas
     [not found]     ` <20181011163942.28267-5-nicholas.kazlauskas-5C7GfCeVMHo@public.gmane.org>
2018-10-11 20:39       ` Harry Wentland
     [not found]         ` <42b237df-9c30-4cd0-0891-d0b05b54533e-5C7GfCeVMHo@public.gmane.org>
2018-10-11 20:56           ` Kazlauskas, Nicholas
2018-10-11 21:24             ` Harry Wentland

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=20181101103723.166ef50f@eldfell \
    --to=ppaalanen@gmail.com \
    --cc=Alexander.Deucher@amd.com \
    --cc=Marek.Olsak@amd.com \
    --cc=Nicholas.Kazlauskas@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=manasi.d.navare@intel.com \
    --cc=michel@daenzer.net \
    /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;
as well as URLs for NNTP newsgroup(s).