egl/dri/wl: Move swrast damage region from put to swap

Pass application provided damage region to the compositor instead
of damaging the entire display. This also gives us the possibility
in the future to have put image only copy the parts of the framebuffer
that were modified.

Fixes: fa465e34ca
Acked-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31210>
(cherry picked from commit 32af15384d)
This commit is contained in:
Lucas Fryzek 2024-09-17 15:15:56 +01:00 committed by Eric Engestrom
parent 36fb8e658a
commit 3799f13b32
2 changed files with 8 additions and 7 deletions

View file

@ -4154,7 +4154,7 @@
"description": "egl/dri/wl: Move swrast damage region from put to swap",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "fa465e34cadacb7d29a664006b5d73bc2a8d9cf3",
"notes": null

View file

@ -2660,12 +2660,6 @@ dri2_wl_swrast_put_image2(__DRIdrawable *draw, int op, int x, int y, int w,
char *src, *dst;
assert(copy_width <= stride);
if (wl_proxy_get_version((struct wl_proxy *)dri2_surf->wl_surface_wrapper) <
WL_SURFACE_DAMAGE_BUFFER_SINCE_VERSION)
wl_surface_damage(dri2_surf->wl_surface_wrapper, 0, 0, INT32_MAX, INT32_MAX);
else
wl_surface_damage_buffer(dri2_surf->wl_surface_wrapper,
x, y, w, h);
dst = dri2_wl_swrast_get_backbuffer_data(dri2_surf);
@ -2747,6 +2741,13 @@ dri2_wl_swrast_swap_buffers_with_damage(_EGLDisplay *disp, _EGLSurface *draw,
dri2_wl_swrast_attach_backbuffer(dri2_surf);
/* If the compositor doesn't support damage_buffer, we deliberately
* ignore the damage region and post maximum damage, due to
* https://bugs.freedesktop.org/78190 */
if (!n_rects || !try_damage_buffer(dri2_surf, rects, n_rects))
wl_surface_damage(dri2_surf->wl_surface_wrapper, 0, 0, INT32_MAX,
INT32_MAX);
/* guarantee full copy for partial update */
int w = n_rects == 1 ? (rects[2] - rects[0]) : 0;
int copy_width = dri2_wl_swrast_get_stride_for_format(dri2_surf->format, w);