Mesa (main): lavapipe: set image access on pipeline bind, not descriptor bind

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jul 25 22:21:14 UTC 2022


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Mon Jul 25 11:32:02 2022 -0400

lavapipe: set image access on pipeline bind, not descriptor bind

this is where the access originates, so set it here

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17739>

---

 src/gallium/frontends/lavapipe/lvp_execute.c | 37 +++++++++++++++++-----------
 1 file changed, 23 insertions(+), 14 deletions(-)

diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c
index 3bad295199d..dee4752a8af 100644
--- a/src/gallium/frontends/lavapipe/lvp_execute.c
+++ b/src/gallium/frontends/lavapipe/lvp_execute.c
@@ -1103,14 +1103,35 @@ static void handle_graphics_pipeline(struct vk_cmd_queue_entry *cmd,
    }
 }
 
+static void
+handle_pipeline_access(struct rendering_state *state, enum pipe_shader_type pstage)
+{
+   for (unsigned i = 0; i < PIPE_MAX_SHADER_IMAGES; i++) {
+      state->iv[pstage][i].access = 0;
+      state->iv[pstage][i].shader_access = 0;
+   }
+   u_foreach_bit(idx, state->access[pstage].images_read) {
+      state->iv[pstage][idx].access |= PIPE_IMAGE_ACCESS_READ;
+      state->iv[pstage][idx].shader_access |= PIPE_IMAGE_ACCESS_READ;
+   }
+   u_foreach_bit(idx, state->access[pstage].images_written) {
+      state->iv[pstage][idx].access |= PIPE_IMAGE_ACCESS_WRITE;
+      state->iv[pstage][idx].shader_access |= PIPE_IMAGE_ACCESS_WRITE;
+   }
+}
+
 static void handle_pipeline(struct vk_cmd_queue_entry *cmd,
                             struct rendering_state *state)
 {
    LVP_FROM_HANDLE(lvp_pipeline, pipeline, cmd->u.bind_pipeline.pipeline);
-   if (pipeline->is_compute_pipeline)
+   if (pipeline->is_compute_pipeline) {
       handle_compute_pipeline(cmd, state);
-   else
+      handle_pipeline_access(state, PIPE_SHADER_COMPUTE);
+   } else {
       handle_graphics_pipeline(cmd, state);
+      for (unsigned i = 0; i < PIPE_SHADER_COMPUTE; i++)
+         handle_pipeline_access(state, i);
+   }
    state->push_size[pipeline->is_compute_pipeline] = pipeline->layout->push_constant_size;
    state->pipeline[pipeline->is_compute_pipeline] = pipeline;
 }
@@ -1355,18 +1376,6 @@ static void fill_image_view_stage(struct rendering_state *state,
       state->iv[p_stage][idx].u.tex.level = 0;
    }
 
-   assert(idx < 32);
-   state->iv[p_stage][idx].access = 0;
-   state->iv[p_stage][idx].shader_access = 0;
-   if (state->access[stage].images_read & BITFIELD_BIT(idx)) {
-      state->iv[p_stage][idx].access |= PIPE_IMAGE_ACCESS_READ;
-      state->iv[p_stage][idx].shader_access |= PIPE_IMAGE_ACCESS_READ;
-   }
-   if (state->access[stage].images_written & BITFIELD_BIT(idx)) {
-      state->iv[p_stage][idx].access |= PIPE_IMAGE_ACCESS_WRITE;
-      state->iv[p_stage][idx].shader_access |= PIPE_IMAGE_ACCESS_WRITE;
-   }
-
    if (state->num_shader_images[p_stage] <= idx)
       state->num_shader_images[p_stage] = idx + 1;
 



More information about the mesa-commit mailing list