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;