From fdfe33d69d109ca64287f3a7e1c837cc1a4259f8 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 12 Aug 2024 13:10:00 -0400 Subject: [PATCH] zink: fix partial update handling * the damage region was not being used correctly (this is a normal rect) * use_damage was never unset at frame boundary * original renderArea was never re-set Fixes: 3d38c9597ff ("zink: hook up KHR_partial_update") Acked-by: Daniel Stone Part-of: (cherry picked from commit a7f64c62037eb33e97e0d4a0f9a27345baa8bcc3) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_context.c | 8 +++++++- src/gallium/drivers/zink/zink_kopper.c | 2 ++ src/gallium/drivers/zink/zink_screen.c | 23 +++++++++++++++++++---- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 192ae124dde..0d176c86a01 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -684,7 +684,7 @@ "description": "zink: fix partial update handling", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "3d38c9597ff3b687026fa4c664f8b4aa20b97f53", "notes": null diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 70fe09059bd..65ca3bcf3e6 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -2913,8 +2913,14 @@ begin_rendering(struct zink_context *ctx) if (has_swapchain) { ASSERTED struct zink_resource *res = zink_resource(ctx->fb_state.cbufs[0]->texture); zink_render_fixup_swapchain(ctx); - if (res->use_damage) + if (res->use_damage) { ctx->dynamic_fb.info.renderArea = res->damage; + } else { + ctx->dynamic_fb.info.renderArea.offset.x = 0; + ctx->dynamic_fb.info.renderArea.offset.y = 0; + ctx->dynamic_fb.info.renderArea.extent.width = ctx->fb_state.width; + ctx->dynamic_fb.info.renderArea.extent.height = ctx->fb_state.height; + } /* clamp for late swapchain resize */ if (res->base.b.width0 < ctx->dynamic_fb.info.renderArea.extent.width) ctx->dynamic_fb.info.renderArea.extent.width = res->base.b.width0; diff --git a/src/gallium/drivers/zink/zink_kopper.c b/src/gallium/drivers/zink/zink_kopper.c index 949ee8e88bf..4e19a600638 100644 --- a/src/gallium/drivers/zink/zink_kopper.c +++ b/src/gallium/drivers/zink/zink_kopper.c @@ -877,6 +877,8 @@ zink_kopper_present_queue(struct zink_screen *screen, struct zink_resource *res, kopper_present(cpi, screen, -1); } res->obj->indefinite_acquire = false; + res->use_damage = false; + memset(&res->damage, 0, sizeof(res->damage)); cdt->swapchain->images[res->obj->dt_idx].acquired = NULL; res->obj->dt_idx = UINT32_MAX; } diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 43ae9829d47..83b79daf676 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -1546,10 +1546,25 @@ zink_set_damage_region(struct pipe_screen *pscreen, struct pipe_resource *pres, for (unsigned i = 0; i < nrects; i++) { int y = pres->height0 - rects[i].y - rects[i].height; - res->damage.extent.width = MAX2(res->damage.extent.width, rects[i].x + rects[i].width); - res->damage.extent.height = MAX2(res->damage.extent.height, y + rects[i].height); - res->damage.offset.x = MIN2(res->damage.offset.x, rects[i].x); - res->damage.offset.y = MIN2(res->damage.offset.y, y); + /* convert back to coord-based rects to use coordinate calcs */ + struct u_rect currect = { + .x0 = res->damage.offset.x, + .y0 = res->damage.offset.y, + .x1 = res->damage.offset.x + res->damage.extent.width, + .y1 = res->damage.offset.y + res->damage.extent.height, + }; + struct u_rect newrect = { + .x0 = rects[i].x, + .y0 = y, + .x1 = rects[i].x + rects[i].width, + .y1 = y + rects[i].height, + }; + struct u_rect u; + u_rect_union(&u, &currect, &newrect); + res->damage.extent.width = u.y1 - u.y0; + res->damage.extent.height = u.x1 - u.x0; + res->damage.offset.x = u.x0; + res->damage.offset.y = u.y0; } res->use_damage = nrects > 0;