From 8300554ba11eb77d8b85b28cbedc025005b984f5 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Tue, 20 Sep 2022 14:15:43 -0700 Subject: [PATCH] freedreno: Handle xfb invalidation So using the same buffer for CPU writes and GPU writes might be kinda unusual. But I noticed we were missing handling for the case while debugging something unrelated. Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/freedreno_resource.c | 12 ++++++++++++ src/gallium/drivers/freedreno/freedreno_state.c | 2 ++ 2 files changed, 14 insertions(+) diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index cc224c23534..cd001b70a64 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -85,6 +85,18 @@ rebind_resource_in_ctx(struct fd_context *ctx, } } + /* xfb/so buffers: */ + if (rsc->dirty & FD_DIRTY_STREAMOUT) { + struct fd_streamout_stateobj *so = &ctx->streamout; + + for (unsigned i = 0; + i < so->num_targets && !(ctx->dirty & FD_DIRTY_STREAMOUT); + i++) { + if (so->targets[i]->buffer == prsc) + fd_context_dirty(ctx, FD_DIRTY_STREAMOUT); + } + } + const enum fd_dirty_3d_state per_stage_dirty = FD_DIRTY_CONST | FD_DIRTY_TEX | FD_DIRTY_IMAGE | FD_DIRTY_SSBO; diff --git a/src/gallium/drivers/freedreno/freedreno_state.c b/src/gallium/drivers/freedreno/freedreno_state.c index 801fea1673a..6672c8f235b 100644 --- a/src/gallium/drivers/freedreno/freedreno_state.c +++ b/src/gallium/drivers/freedreno/freedreno_state.c @@ -611,6 +611,8 @@ fd_set_stream_output_targets(struct pipe_context *pctx, unsigned num_targets, ctx->streamout.verts_written = 0; } + if (so->targets[i]) + fd_resource_set_usage(so->targets[i]->buffer, FD_DIRTY_STREAMOUT); pipe_so_target_reference(&so->targets[i], targets[i]); }