From 17ab0f2ece0a45dd5df507a466ecf6f40d452e1a Mon Sep 17 00:00:00 2001 From: Lucas Fryzek Date: Wed, 3 Dec 2025 19:33:57 -0500 Subject: [PATCH] drisw: Modify drisw_swap_buffers_with_damage to swap entire buffer When swapping buffer with damage regions, to be strictly correct we need to swap the entire back buffer to the front buffer. This needs to be done in case the compositor does not support damage regions. This means we need to ignore the input damage region and tell drisw to swap the entire buffer. Cc: mesa-stable Part-of: --- src/gallium/frontends/dri/drisw.c | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/src/gallium/frontends/dri/drisw.c b/src/gallium/frontends/dri/drisw.c index 4359ca569e5..394b6986832 100644 --- a/src/gallium/frontends/dri/drisw.c +++ b/src/gallium/frontends/dri/drisw.c @@ -225,6 +225,13 @@ drisw_copy_to_front(struct pipe_context *pipe, static void drisw_swap_buffers_with_damage(struct dri_drawable *drawable, int nrects, const int *rects) { + /* Damage regions still require us to update the whole front buffer + * in case the compositor doesn't obey them, so we will just ignore + * the passed in damage regions and swap the whole buffer + */ + (void)nrects; + (void)rects; + struct dri_context *ctx = dri_get_current(); struct dri_screen *screen = drawable->screen; struct pipe_resource *ptex; @@ -242,25 +249,6 @@ drisw_swap_buffers_with_damage(struct dri_drawable *drawable, int nrects, const if (ptex) { struct pipe_fence_handle *fence = NULL; - struct pipe_box stack_boxes[64]; - if (nrects > ARRAY_SIZE(stack_boxes)) - nrects = 0; - if (nrects) { - for (unsigned int i = 0; i < nrects; i++) { - const int *rect = &rects[i * 4]; - - int w = MIN2(rect[2], ptex->width0); - int h = MIN2(rect[3], ptex->height0); - int x = CLAMP(rect[0], 0, ptex->width0); - int y = CLAMP(ptex->height0 - rect[1] - h, 0, ptex->height0); - - if (h > ptex->height0 - y) - h = ptex->height0 - y; - - u_box_2d(x, y, w, h, &stack_boxes[i]); - } - } - if (ctx->pp) pp_run(ctx->pp, ptex, ptex, drawable->textures[ST_ATTACHMENT_DEPTH_STENCIL]); @@ -279,7 +267,7 @@ drisw_swap_buffers_with_damage(struct dri_drawable *drawable, int nrects, const screen->base.screen->fence_finish(screen->base.screen, ctx->st->pipe, fence, OS_TIMEOUT_INFINITE); screen->base.screen->fence_reference(screen->base.screen, &fence, NULL); - drisw_copy_to_front(ctx->st->pipe, drawable, ptex, nrects, nrects ? stack_boxes : NULL); + drisw_copy_to_front(ctx->st->pipe, drawable, ptex, 0, NULL); drawable->buffer_age = 1; /* TODO: remove this if the framebuffer state doesn't change. */