From 11a5297ef52865f5512e98f1e49448a6c88908a5 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 2 Sep 2022 10:10:01 -0400 Subject: [PATCH] zink: don't add void clears if a full clear already exists this otherwise may clobber other clears or add unnecessary duplicates Fixes: 7ea7d0687b8 ("zink: inject a 0,0,0,1 clear for RGBX formats") Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_clear.h | 7 +++++++ src/gallium/drivers/zink/zink_context.c | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/zink/zink_clear.h b/src/gallium/drivers/zink/zink_clear.h index aa66fbe6eb1..05fb115b84a 100644 --- a/src/gallium/drivers/zink/zink_clear.h +++ b/src/gallium/drivers/zink/zink_clear.h @@ -89,6 +89,13 @@ zink_fb_clear_element_needs_explicit(struct zink_framebuffer_clear_data *clear) return clear->has_scissor || clear->conditional; } +static inline bool +zink_fb_clear_full_exists(struct zink_context *ctx, unsigned clear_buffer) +{ + struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[clear_buffer]; + return zink_fb_clear_count(fb_clear) && !zink_fb_clear_first_needs_explicit(fb_clear); +} + void zink_clear_apply_conditionals(struct zink_context *ctx); diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index df277b91acb..7240cdbcc72 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -2929,7 +2929,7 @@ zink_set_framebuffer_state(struct pipe_context *pctx, } res->fb_binds++; if (util_format_has_alpha1(psurf->format)) { - if (!res->valid) + if (!res->valid && !zink_fb_clear_full_exists(ctx, i)) ctx->void_clears |= (PIPE_CLEAR_COLOR0 << i); } }