freedreno: Track image/SSBO usage for all stages
authorRob Clark <robdclark@chromium.org>
Thu, 5 Jan 2023 15:28:17 +0000 (07:28 -0800)
committerMarge Bot <emma+marge@anholt.net>
Wed, 18 Jan 2023 06:10:10 +0000 (06:10 +0000)
Once a6xx enables image/SSBO for all shader stages, we have to care
about more than just frag shader in the 3d path.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20687>

src/gallium/drivers/freedreno/freedreno_draw.c

index c68ba23..11de287 100644 (file)
@@ -134,29 +134,6 @@ batch_draw_tracking_for_dirty_bits(struct fd_batch *batch) assert_dt
       }
    }
 
-   /* Mark SSBOs */
-   if (ctx->dirty_shader[PIPE_SHADER_FRAGMENT] & FD_DIRTY_SHADER_SSBO) {
-      const struct fd_shaderbuf_stateobj *so =
-         &ctx->shaderbuf[PIPE_SHADER_FRAGMENT];
-
-      u_foreach_bit (i, so->enabled_mask & so->writable_mask)
-         resource_written(batch, so->sb[i].buffer);
-
-      u_foreach_bit (i, so->enabled_mask & ~so->writable_mask)
-         resource_read(batch, so->sb[i].buffer);
-   }
-
-   if (ctx->dirty_shader[PIPE_SHADER_FRAGMENT] & FD_DIRTY_SHADER_IMAGE) {
-      u_foreach_bit (i, ctx->shaderimg[PIPE_SHADER_FRAGMENT].enabled_mask) {
-         struct pipe_image_view *img =
-            &ctx->shaderimg[PIPE_SHADER_FRAGMENT].si[i];
-         if (img->access & PIPE_IMAGE_ACCESS_WRITE)
-            resource_written(batch, img->resource);
-         else
-            resource_read(batch, img->resource);
-      }
-   }
-
    u_foreach_bit (s, ctx->bound_shader_stages) {
       /* Mark constbuf as being read: */
       if (ctx->dirty_shader[s] & FD_DIRTY_SHADER_CONST) {
@@ -169,6 +146,28 @@ batch_draw_tracking_for_dirty_bits(struct fd_batch *batch) assert_dt
          u_foreach_bit (i, ctx->tex[s].valid_textures)
             resource_read(batch, ctx->tex[s].textures[i]->texture);
       }
+
+      /* Mark SSBOs as being read or written: */
+      if (ctx->dirty_shader[s] & FD_DIRTY_SHADER_SSBO) {
+         const struct fd_shaderbuf_stateobj *so = &ctx->shaderbuf[s];
+
+         u_foreach_bit (i, so->enabled_mask & so->writable_mask)
+            resource_written(batch, so->sb[i].buffer);
+
+         u_foreach_bit (i, so->enabled_mask & ~so->writable_mask)
+            resource_read(batch, so->sb[i].buffer);
+      }
+
+      /* Mark Images as being read or written: */
+      if (ctx->dirty_shader[s] & FD_DIRTY_SHADER_IMAGE) {
+         u_foreach_bit (i, ctx->shaderimg[s].enabled_mask) {
+            struct pipe_image_view *img = &ctx->shaderimg[s].si[i];
+            if (img->access & PIPE_IMAGE_ACCESS_WRITE)
+               resource_written(batch, img->resource);
+            else
+               resource_read(batch, img->resource);
+         }
+      }
    }
 
    /* Mark VBOs as being read */