From bdcbdfdfcbf539e5fdf82f2fe97bf9afcd76f960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Fri, 20 Aug 2021 17:56:24 +0200 Subject: [PATCH] egl/wayland: Prefer back buffer with minimum buffer age This may allow applications making use of buffer age to save some effort in some cases. v2: (Simon Ser) * Add space between struct member and "<" operator. * Remove break statement which prevented the change from working as intended in swrast_update_buffers. Part-of: --- src/egl/drivers/dri2/platform_wayland.c | 26 +++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index 260eb9c82af..248d217f5e7 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -1033,12 +1033,15 @@ get_back_bo(struct dri2_egl_surface *dri2_surf) while (dri2_surf->back == NULL) { for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) { /* Get an unlocked buffer, preferably one with a dri_buffer - * already allocated. */ + * already allocated and with minimum age. + */ if (dri2_surf->color_buffers[i].locked) continue; - if (dri2_surf->back == NULL) - dri2_surf->back = &dri2_surf->color_buffers[i]; - else if (dri2_surf->back->dri_image == NULL) + + if (!dri2_surf->back || + !dri2_surf->back->dri_image || + (dri2_surf->color_buffers[i].age > 0 && + dri2_surf->color_buffers[i].age < dri2_surf->back->age)) dri2_surf->back = &dri2_surf->color_buffers[i]; } @@ -2351,13 +2354,16 @@ swrast_update_buffers(struct dri2_egl_surface *dri2_surf) /* There might be a buffer release already queued that wasn't processed */ wl_display_dispatch_queue_pending(dri2_dpy->wl_dpy, dri2_surf->wl_queue); - /* try get free buffer already created */ + /* Try to get free buffer already created and with minimum age */ for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) { - if (!dri2_surf->color_buffers[i].locked && - dri2_surf->color_buffers[i].wl_buffer) { - dri2_surf->back = &dri2_surf->color_buffers[i]; - break; - } + if (dri2_surf->color_buffers[i].locked || + !dri2_surf->color_buffers[i].wl_buffer) + continue; + + if (!dri2_surf->back || + (dri2_surf->color_buffers[i].age > 0 && + dri2_surf->color_buffers[i].age < dri2_surf->back->age)) + dri2_surf->back = &dri2_surf->color_buffers[i]; } /* else choose any another free location */