Mesa (main): freedreno: Add missing valid range tracking for SSBOs/images

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 11 02:06:15 UTC 2021


Module: Mesa
Branch: main
Commit: 5a32976a1d8f0308a117839ddf66fd84378a7da6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5a32976a1d8f0308a117839ddf66fd84378a7da6

Author: Rob Clark <robdclark at chromium.org>
Date:   Thu Jun 10 14:20:36 2021 -0700

freedreno: Add missing valid range tracking for SSBOs/images

Normally TC takes care of this for us.  But we might as well not get it
wrong in cases where TC is disabled.

Reported-by: Alyssa Rosenzweig <alyssa at collabora.com>
Signed-off-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11311>

---

 src/gallium/drivers/freedreno/freedreno_state.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/gallium/drivers/freedreno/freedreno_state.c b/src/gallium/drivers/freedreno/freedreno_state.c
index 8e12fdbb1af..6ff9c1e1e0f 100644
--- a/src/gallium/drivers/freedreno/freedreno_state.c
+++ b/src/gallium/drivers/freedreno/freedreno_state.c
@@ -169,6 +169,13 @@ fd_set_shader_buffers(struct pipe_context *pctx, enum pipe_shader_type shader,
          fd_resource_set_usage(buffers[i].buffer, FD_DIRTY_SSBO);
 
          so->enabled_mask |= BIT(n);
+
+         if (writable_bitmask & BIT(i)) {
+            struct fd_resource *rsc = fd_resource(buf->buffer);
+            util_range_add(&rsc->b.b, &rsc->valid_buffer_range,
+                           buf->buffer_offset,
+                           buf->buffer_offset + buf->buffer_size);
+         }
       } else {
          pipe_resource_reference(&buf->buffer, NULL);
       }
@@ -205,6 +212,15 @@ fd_set_shader_images(struct pipe_context *pctx, enum pipe_shader_type shader,
          if (buf->resource) {
             fd_resource_set_usage(buf->resource, FD_DIRTY_IMAGE);
             so->enabled_mask |= BIT(n);
+
+            if ((buf->access & PIPE_IMAGE_ACCESS_WRITE) &&
+                (buf->resource->target == PIPE_BUFFER)) {
+
+               struct fd_resource *rsc = fd_resource(buf->resource);
+               util_range_add(&rsc->b.b, &rsc->valid_buffer_range,
+                              buf->u.buf.offset,
+                              buf->u.buf.offset + buf->u.buf.size);
+            }
          } else {
             so->enabled_mask &= ~BIT(n);
          }



More information about the mesa-commit mailing list