From 453cb59d0346a246ab1f5a2dbd74295fc5073f07 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 6 Jan 2023 15:19:38 -0500 Subject: [PATCH] lavapipe: add some safety asserts when beginning rendering if the render area exceeds the attachment size, this is not only illegal, it will crash later cc: mesa-stable Reviewed-by: Erik Faye-Lund Reviewed-by: Brian Paul Reviewed-by: Roland Scheidegger Part-of: (cherry picked from commit 847d198c1fffe018f4c3557db239168100400319) --- .pick_status.json | 2 +- src/gallium/frontends/lavapipe/lvp_execute.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index e2e7066..70e4e88 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -994,7 +994,7 @@ "description": "lavapipe: add some safety asserts when beginning rendering", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index ff76c81..bf4cbcc 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -1849,6 +1849,8 @@ static void handle_begin_rendering(struct vk_cmd_queue_entry *cmd, state->color_att[i].imgv = create_multisample_surface(state, imgv, state->forced_sample_count, att_needs_replicate(state, imgv, state->color_att[i].load_op)); state->framebuffer.cbufs[i] = state->color_att[i].imgv->surface; + assert(state->render_area.offset.x + state->render_area.extent.width <= state->framebuffer.cbufs[i]->texture->width0); + assert(state->render_area.offset.y + state->render_area.extent.height <= state->framebuffer.cbufs[i]->texture->height0); } else { state->framebuffer.cbufs[i] = NULL; } @@ -1880,6 +1882,8 @@ static void handle_begin_rendering(struct vk_cmd_queue_entry *cmd, att_needs_replicate(state, imgv, load_op)); } state->framebuffer.zsbuf = state->ds_imgv->surface; + assert(state->render_area.offset.x + state->render_area.extent.width <= state->framebuffer.zsbuf->texture->width0); + assert(state->render_area.offset.y + state->render_area.extent.height <= state->framebuffer.zsbuf->texture->height0); } else { state->ds_imgv = NULL; state->framebuffer.zsbuf = NULL; -- 2.7.4