From 6f25ace87ecddeecf1d2ecdb42a6222de2f1d010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 23 Aug 2024 17:37:26 -0400 Subject: [PATCH] radeonsi: add si_fb_barrier_before_rendering Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/si_barrier.c | 7 +++++++ src/gallium/drivers/radeonsi/si_pipe.h | 1 + src/gallium/drivers/radeonsi/si_state.c | 10 ++++------ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_barrier.c b/src/gallium/drivers/radeonsi/si_barrier.c index 7fd8ac4086d..6c522ec979d 100644 --- a/src/gallium/drivers/radeonsi/si_barrier.c +++ b/src/gallium/drivers/radeonsi/si_barrier.c @@ -726,6 +726,13 @@ static void si_set_sampler_depth_decompress_mask(struct si_context *sctx, struct } } +void si_fb_barrier_before_rendering(struct si_context *sctx) +{ + /* Wait for all shaders because all image loads must finish before CB/DB can write there. */ + sctx->barrier_flags |= SI_CONTEXT_CS_PARTIAL_FLUSH | SI_CONTEXT_PS_PARTIAL_FLUSH; + si_mark_atom_dirty(sctx, &sctx->atoms.s.barrier); +} + void si_fb_barrier_after_rendering(struct si_context *sctx, unsigned flags) { if (sctx->gfx_level < GFX12 && !sctx->decompression_enabled) { diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 8b64d400523..97906681402 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -1384,6 +1384,7 @@ void si_barrier_before_simple_buffer_op(struct si_context *sctx, unsigned flags, struct pipe_resource *dst, struct pipe_resource *src); void si_barrier_after_simple_buffer_op(struct si_context *sctx, unsigned flags, struct pipe_resource *dst, struct pipe_resource *src); +void si_fb_barrier_before_rendering(struct si_context *sctx); void si_fb_barrier_after_rendering(struct si_context *sctx, unsigned flags); void si_init_barrier_functions(struct si_context *sctx); diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index de3f84fd225..fb6246189da 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -2569,12 +2569,6 @@ static void si_set_framebuffer_state(struct pipe_context *ctx, } } - /* Wait for CS because: shader write -> FB read - * Wait for PS because: texture -> render (eg: glBlitFramebuffer(with src=dst) then glDraw*) - */ - sctx->barrier_flags |= SI_CONTEXT_CS_PARTIAL_FLUSH | SI_CONTEXT_PS_PARTIAL_FLUSH; - si_mark_atom_dirty(sctx, &sctx->atoms.s.barrier); - /* Take the maximum of the old and new count. If the new count is lower, * dirtying is needed to disable the unbound colorbuffers. */ @@ -2584,6 +2578,10 @@ static void si_set_framebuffer_state(struct pipe_context *ctx, si_dec_framebuffer_counters(&sctx->framebuffer.state); util_copy_framebuffer_state(&sctx->framebuffer.state, state); + + /* The framebuffer state must be set before the barrier. */ + si_fb_barrier_before_rendering(sctx); + /* Recompute layers because frontends and utils might not set it. */ sctx->framebuffer.state.layers = util_framebuffer_get_num_layers(state);