From 066ff5c759311ae82f80021bd0913804e2c2444b Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Thu, 5 Jan 2023 07:28:17 -0800 Subject: [PATCH] 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 Part-of: --- src/gallium/drivers/freedreno/freedreno_draw.c | 45 +++++++++++++------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index c68ba23..11de287 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -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 */ -- 2.7.4