lavapipe: add some safety asserts when beginning rendering
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Fri, 6 Jan 2023 20:19:38 +0000 (15:19 -0500)
committerEric Engestrom <eric@engestrom.ch>
Wed, 11 Jan 2023 17:44:22 +0000 (17:44 +0000)
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 <erik.faye-lund@collabora.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20583>
(cherry picked from commit 847d198c1fffe018f4c3557db239168100400319)

.pick_status.json
src/gallium/frontends/lavapipe/lvp_execute.c

index e2e7066..70e4e88 100644 (file)
         "description": "lavapipe: add some safety asserts when beginning rendering",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": null
     },
index ff76c81..bf4cbcc 100644 (file)
@@ -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;