From 4c0defda8a2e6796cdc992ba62ce182e3f797f5d Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Thu, 28 Sep 2023 12:43:33 -0700 Subject: [PATCH] freedreno: Fix streamout offset_buf dirtiness We also need to mark the offset buffer as dirty. Fixes: b43e5aec0d2c ("freedreno/batch: Move submit bo tracking to batch") Signed-off-by: Rob Clark Part-of: --- src/gallium/drivers/freedreno/freedreno_draw.c | 12 +++++++++--- src/gallium/drivers/freedreno/freedreno_state.c | 4 ++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index 0b17c5b77ba..872b642dfb7 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -182,9 +182,15 @@ batch_draw_tracking_for_dirty_bits(struct fd_batch *batch) assert_dt /* Mark streamout buffers as being written.. */ if (dirty & FD_DIRTY_STREAMOUT) { - for (unsigned i = 0; i < ctx->streamout.num_targets; i++) - if (ctx->streamout.targets[i]) - resource_written(batch, ctx->streamout.targets[i]->buffer); + for (unsigned i = 0; i < ctx->streamout.num_targets; i++) { + struct fd_stream_output_target *target = + fd_stream_output_target(ctx->streamout.targets[i]); + + if (target) { + resource_written(batch, target->base.buffer); + resource_written(batch, target->offset_buf); + } + } } if (dirty & FD_DIRTY_QUERY) { diff --git a/src/gallium/drivers/freedreno/freedreno_state.c b/src/gallium/drivers/freedreno/freedreno_state.c index 5fea07eac25..da6b5b7cd4f 100644 --- a/src/gallium/drivers/freedreno/freedreno_state.c +++ b/src/gallium/drivers/freedreno/freedreno_state.c @@ -702,6 +702,10 @@ fd_set_stream_output_targets(struct pipe_context *pctx, unsigned num_targets, if (targets[i]) { fd_resource_set_usage(targets[i]->buffer, FD_DIRTY_STREAMOUT); fd_dirty_resource(ctx, targets[i]->buffer, FD_DIRTY_STREAMOUT, true); + + struct fd_stream_output_target *target = fd_stream_output_target(targets[i]); + fd_resource_set_usage(target->offset_buf, FD_DIRTY_STREAMOUT); + fd_dirty_resource(ctx, target->offset_buf, FD_DIRTY_STREAMOUT, true); } if (!changed && !reset)