summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Clark <robdclark@chromium.org>2023-09-28 12:43:33 -0700
committerDylan Baker <dylan.c.baker@intel.com>2023-10-06 13:44:14 -0700
commit51a36be63c152d6bff40bddda4da24b33cf77b27 (patch)
tree5a02a079b4d7a83c096c02af3fd00fa5f25a3eba
parent4b6322f1c6606bab4b051f59e86d6d54221ab952 (diff)
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 <robdclark@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25465> (cherry picked from commit 4c0defda8a2e6796cdc992ba62ce182e3f797f5d)
-rw-r--r--.pick_status.json2
-rw-r--r--src/gallium/drivers/freedreno/freedreno_draw.c12
-rw-r--r--src/gallium/drivers/freedreno/freedreno_state.c4
3 files changed, 14 insertions, 4 deletions
diff --git a/.pick_status.json b/.pick_status.json
index f8d738a78fa..01efdf1de32 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -1714,7 +1714,7 @@
"description": "freedreno: Fix streamout offset_buf dirtiness",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "b43e5aec0d2ce542d4ba68da947e3ad752855979",
"notes": null
diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c
index 1324e1f0685..85c786d8258 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 5e36730ef69..19d40c9f1a6 100644
--- a/src/gallium/drivers/freedreno/freedreno_state.c
+++ b/src/gallium/drivers/freedreno/freedreno_state.c
@@ -683,6 +683,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)