freedreno: Track image/SSBO usage for all stages

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>
This commit is contained in:
Rob Clark 2023-01-05 07:28:17 -08:00 committed by Marge Bot
parent 165de87f8e
commit 066ff5c759

View 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 */