From d2094c1e1b8234ea8416bbff8217cb16b6108a88 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Tue, 23 Jan 2024 16:13:05 +0100 Subject: [PATCH] panfrost: Clamp the render area to the damage region The render area clamping was lost during the transition to the FB helpers. Restore the original logic so we can benefit from EGL_KHR_partial_update on v4, and on v5 when only one damage rectangle is passed. Fixes: ff3eada7eb4e ("panfrost: Use the generic preload and FB helpers in the gallium driver") Reported-by: Sjoerd Simons Signed-off-by: Boris Brezillon Tested-by: Sjoerd Simons Reviewed-by: Erik Faye-Lund Part-of: (cherry picked from commit f6f7715c5824922e867aa739c587eb1718db66c1) --- .pick_status.json | 2 +- src/gallium/drivers/panfrost/pan_job.c | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 6b14b95e275..0f1315a8286 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -54,7 +54,7 @@ "description": "panfrost: Clamp the render area to the damage region", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "ff3eada7eb4e4df0abe93ee76b77101f9d24e72c", "notes": null diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index b48329f52e2..d322a0741b9 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -491,6 +491,19 @@ panfrost_batch_to_fb_info(const struct panfrost_batch *batch, fb->rts[i].discard = !reserve && !(batch->resolve & mask); + /* Clamp the rendering area to the damage extent. The + * KHR_partial_update spec states that trying to render outside of + * the damage region is "undefined behavior", so we should be safe. + */ + if (!fb->rts[i].discard) { + fb->extent.minx = MAX2(fb->extent.minx, prsrc->damage.extent.minx); + fb->extent.miny = MAX2(fb->extent.miny, prsrc->damage.extent.miny); + fb->extent.maxx = MIN2(fb->extent.maxx, prsrc->damage.extent.maxx - 1); + fb->extent.maxy = MIN2(fb->extent.maxy, prsrc->damage.extent.maxy - 1); + assert(fb->extent.minx <= fb->extent.maxx); + assert(fb->extent.miny <= fb->extent.maxy); + } + rts[i].format = surf->format; rts[i].dim = MALI_TEXTURE_DIMENSION_2D; rts[i].last_level = rts[i].first_level = surf->u.tex.level;