mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-01-03 11:40:15 +01:00
present: Requeue if flip driver hook fails and target MSC not reached
For flipping, we wait for the MSC before the target MSC and then call
the driver flip hook. If the latter fails, we have to wait for the
target MSC before falling back to a copy, or else it's executed too
early.
Fixes glxgears running at unbounded framerate (not synchronized to the
refresh rate) in fullscreen if the driver flip hook fails.
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
(cherry picked from commit e7a35b9e16)
This commit is contained in:
parent
cf30b7cfd6
commit
eb5108b870
1 changed files with 14 additions and 0 deletions
|
|
@ -712,6 +712,20 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
|
|||
if (window == screen_priv->flip_window)
|
||||
present_unflip(screen);
|
||||
}
|
||||
|
||||
/* If present_flip failed, we may have to requeue for the target MSC */
|
||||
if (msc_is_after(vblank->target_msc, crtc_msc) &&
|
||||
Success == present_queue_vblank(screen,
|
||||
vblank->crtc,
|
||||
vblank->event_id,
|
||||
vblank->target_msc)) {
|
||||
xorg_list_add(&vblank->event_queue, &present_exec_queue);
|
||||
xorg_list_append(&vblank->window_list,
|
||||
&present_get_window_priv(window, TRUE)->vblank);
|
||||
vblank->queued = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
present_copy_region(&window->drawable, vblank->pixmap, vblank->update, vblank->x_off, vblank->y_off);
|
||||
|
||||
/* present_copy_region sticks the region into a scratch GC,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue