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

(cherry picked from commit ec0860b401)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22598>
This commit is contained in:
Mike Blumenkrantz 2023-03-27 15:35:47 -04:00 committed by Eric Engestrom
parent 475cc6a516
commit 9c24784b7c
2 changed files with 5 additions and 1 deletions

View file

@ -139,7 +139,7 @@
"description": "zink: manually re-set framebuffer after msrtss replicate blit",
"nominated": false,
"nomination_type": null,
"resolution": 4,
"resolution": 1,
"main_sha": null,
"because_sha": null
},

View 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);