loader/dri3: Allocate up to 4 back buffers for page flips

With swap interval 0, i.e. sync-to-vblank disabled.

This can be necessary for unthrottled drawing with Xwayland:

1) One buffer can be scanned out
2) One buffer can be pending in the kernel for a page flip
3) One buffer can be pending in the Wayland compositor

Therefore, with 3 buffers, the frame-rate could be capped much lower
than the throughput the GPU is capable of, in the worst case at the
Wayland compositor refresh rate.

(The native Wayland EGL backend always uses up to 4 buffers)

Leave the maximum number of buffers at 3 for swap interval != 0, it's
sufficient in that case to always be able to queue one frame ahead of
time.

https://gitlab.gnome.org/GNOME/mutter/-/issues/1455
https://gitlab.gnome.org/GNOME/mutter/-/issues/1462

Cc: mesa-stable
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7033>
This commit is contained in:
Michel Dänzer 2020-10-02 15:55:05 +02:00 committed by Marge Bot
parent 16a7cc4d44
commit 31e9de9c8a
1 changed files with 22 additions and 3 deletions

View File

@ -275,10 +275,29 @@ static void
dri3_update_max_num_back(struct loader_dri3_drawable *draw)
{
switch (draw->last_present_mode) {
case XCB_PRESENT_COMPLETE_MODE_FLIP:
/* Leave cur_num_back unchanged, it'll grow as needed */
draw->max_num_back = 3;
case XCB_PRESENT_COMPLETE_MODE_FLIP: {
int new_max;
if (draw->swap_interval == 0)
new_max = 4;
else
new_max = 3;
assert(new_max <= LOADER_DRI3_MAX_BACK);
if (new_max != draw->max_num_back) {
/* On transition from swap interval == 0 to != 0, start with two
* buffers again. Otherwise keep the current number of buffers. Either
* way, more will be allocated if needed.
*/
if (new_max < draw->max_num_back)
draw->cur_num_back = 2;
draw->max_num_back = new_max;
}
break;
}
case XCB_PRESENT_COMPLETE_MODE_SKIP:
break;