From ec0860b40137779e1cbe92c8ca5b3e5d86105da5 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 27 Mar 2023 15:35:47 -0400 Subject: [PATCH] zink: manually re-set framebuffer after msrtss replicate blit 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: --- src/gallium/drivers/zink/zink_render_pass.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gallium/drivers/zink/zink_render_pass.c b/src/gallium/drivers/zink/zink_render_pass.c index 8b70552..333c750 100644 --- a/src/gallium/drivers/zink/zink_render_pass.c +++ b/src/gallium/drivers/zink/zink_render_pass.c @@ -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); -- 2.7.4