Module: Mesa
Branch: staging/23.2
Commit: 51a36be63c152d6bff40bddda4da24b33cf77b27
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=51a36be63c152d6bff40bddda4da24b33cf77b27

Author: Rob Clark <[email protected]>
Date:   Thu Sep 28 12:43:33 2023 -0700

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 <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25465>
(cherry picked from commit 4c0defda8a2e6796cdc992ba62ce182e3f797f5d)

---

 .pick_status.json                               |  2 +-
 src/gallium/drivers/freedreno/freedreno_draw.c  | 12 +++++++++---
 src/gallium/drivers/freedreno/freedreno_state.c |  4 ++++
 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)

Reply via email to