On 2019-02-09 7:52 a.m., Mario Kleiner wrote: > In VRR mode, keep track of the vblank count of the last > completed pageflip in amdgpu_crtc->last_flip_vblank, as > recorded in the pageflip completion handler after each > completed flip. > > Use that count to prevent mmio programming a new pageflip > within the same vblank in which the last pageflip completed, > iow. to throttle pageflips to at most one flip per video > frame, while at the same time allowing to request a flip > not only before start of vblank, but also anywhere within > vblank. > > The old logic did the same, and made sense for regular fixed > refresh rate flipping, but in vrr mode it prevents requesting > a flip anywhere inside the possibly huge vblank, thereby > reducing framerate in vrr mode instead of improving it, by > delaying a slightly delayed flip requests up to a maximum > vblank duration + 1 scanout duration. This would limit VRR > usefulness to only help applications with a very high GPU > demand, which can submit the flip request before start of > vblank, but then have to wait long for fences to complete. > > With this method a flip can be both requested and - after > fences have completed - executed, ie. it doesn't matter if > the request (amdgpu_dm_do_flip()) gets delayed until deep > into the extended vblank due to cpu execution delays. This > also allows clients which want to regulate framerate within > the vrr range a much more fine-grained control of flip timing, > a feature that might be useful for video playback, and is > very useful for neuroscience/vision research applications. > > In regular non-VRR mode, retain the old flip submission > behavior. This to keep flip scheduling for fullscreen X11/GLX > OpenGL clients intact, if they use the GLX_OML_sync_control > extensions glXSwapBufferMscOML(, ..., target_msc,...) function > with a specific target_msc target vblank count. > > glXSwapBuffersMscOML() or DRI3/Present PresentPixmap() will > not flip at the proper target_msc for a non-zero target_msc > if VRR mode is active with this patch. They'd often flip one > frame too early. However, this limitation should not matter > much in VRR mode, as scheduling based on vblank counts is > pretty futile/unusable under variable refresh duration > anyway, so no real extra harm is done. > > According to some testing already done with this patch by > Nicholas on top of my tests, IGT tests didn't report any > problems. If fixes stuttering and flickering when flipping > at rates below the minimum vrr refresh rate. > > Fixes: bb47de736661 ("drm/amdgpu: Set FreeSync state using drm VRR > properties") > Signed-off-by: Mario Kleiner <mario.kleiner.de@xxxxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> > Cc: Nicholas Kazlauskas <nicholas.kazlauskas@xxxxxxx> > Cc: Harry Wentland <harry.wentland@xxxxxxx> > Cc: Alex Deucher <alexander.deucher@xxxxxxx> > Cc: Michel Dänzer <michel@xxxxxxxxxxx> I wonder if this couldn't be solved in a simpler / cleaner way by making use of the target MSC passed to the page_flip_target hook. -- Earthling Michel Dänzer | http://www.amd.com Libre software enthusiast | Mesa and X developer _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx