zink: manually re-set framebuffer after msrtss replicate blit
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Mon, 27 Mar 2023 19:35:47 +0000 (15:35 -0400)
committerMarge Bot <emma+marge@anholt.net>
Thu, 20 Apr 2023 12:58:12 +0000 (12:58 +0000)
with the new zsbuf elimination handling, the fb state calculated in
u_blitter's fb restore may be incorrect if the zsbuf has indeed been
eliminated, so ensure the right fb is stored to be reapplied so that
misrenders will be avoided

fixes some crashes/misrenders in webgl

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22577>

src/gallium/drivers/zink/zink_render_pass.c

index 8b70552..333c750 100644 (file)
@@ -769,6 +769,7 @@ zink_begin_render_pass(struct zink_context *ctx)
    if (ctx->framebuffer->rp->state.msaa_expand_mask) {
       uint32_t rp_state = ctx->gfx_pipeline_state.rp_state;
       struct zink_render_pass *rp = ctx->gfx_pipeline_state.render_pass;
+      struct zink_framebuffer *fb = ctx->framebuffer;
 
       u_foreach_bit(i, ctx->framebuffer->rp->state.msaa_expand_mask) {
          struct zink_ctx_surface *csurf = (struct zink_ctx_surface*)ctx->fb_state.cbufs[i];
@@ -801,6 +802,9 @@ zink_begin_render_pass(struct zink_context *ctx)
       ctx->fb_changed = ctx->rp_changed = false;
       ctx->gfx_pipeline_state.rp_state = rp_state;
       ctx->gfx_pipeline_state.render_pass = rp;
+      /* manually re-set fb: depth buffer may have been eliminated */
+      ctx->framebuffer = fb;
+      ctx->framebuffer->rp = rp;
    }
    assert(ctx->gfx_pipeline_state.render_pass);
    return begin_render_pass(ctx);