zink: use surface references for fb attachments
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Tue, 22 Dec 2020 15:25:14 +0000 (10:25 -0500)
committerMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Mon, 22 Mar 2021 12:49:26 +0000 (08:49 -0400)
this guarantees the lifetimes of framebuffer surfaces

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9665>

src/gallium/drivers/zink/zink_context.c

index afc25a5..095ec61 100644 (file)
@@ -1264,10 +1264,12 @@ zink_begin_render_pass(struct zink_context *ctx, struct zink_batch *batch)
    framebuffer_state_buffer_barriers_setup(ctx, fb_state, batch);
 
    zink_batch_reference_framebuffer(batch, ctx->framebuffer);
-   for (int i = 0; i < ARRAY_SIZE(ctx->framebuffer->surfaces); i++) {
-      if (!ctx->framebuffer->surfaces[i])
-         break;
-      zink_batch_reference_resource_rw(batch, zink_resource(ctx->framebuffer->surfaces[i]->texture), true);
+   for (int i = 0; i < ctx->framebuffer->state.num_attachments; i++) {
+      if (ctx->framebuffer->surfaces[i]) {
+         struct zink_surface *surf = zink_surface(ctx->framebuffer->surfaces[i]);
+         zink_batch_reference_resource_rw(batch, zink_resource(surf->base.texture), true);
+         zink_batch_reference_surface(batch, surf);
+      }
    }
 
    vkCmdBeginRenderPass(batch->state->cmdbuf, &rpbi, VK_SUBPASS_CONTENTS_INLINE);