From 3f88abd621ef60b7d0ed8b82445d630abed6a810 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Thu, 22 Oct 2020 14:43:35 -0700 Subject: [PATCH] freedreno: Fix spurious flush Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/freedreno_state.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/freedreno/freedreno_state.c b/src/gallium/drivers/freedreno/freedreno_state.c index 9e1c1a1776c..5a3df1f3fd1 100644 --- a/src/gallium/drivers/freedreno/freedreno_state.c +++ b/src/gallium/drivers/freedreno/freedreno_state.c @@ -220,13 +220,20 @@ fd_set_framebuffer_state(struct pipe_context *pctx, framebuffer->width, framebuffer->height, framebuffer->layers, framebuffer->samples); - fd_context_switch_from(ctx); - cso = &ctx->framebuffer; if (util_framebuffer_state_equal(cso, framebuffer)) return; + /* Do this *after* checking that the framebuffer state is actually + * changing. In the fd_blitter_clear() path, we get a pfb update + * to restore the current pfb state, which should not trigger us + * to flush (as that can cause the batch to be freed at a point + * before fd_clear() returns, but after the point where it expects + * flushes to potentially happen. + */ + fd_context_switch_from(ctx); + util_copy_framebuffer_state(cso, framebuffer); cso->samples = util_framebuffer_get_num_samples(cso);