Mesa (main): v3dv: merge pending secondary barrier state into primary command buffers

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 14 11:51:51 UTC 2022


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

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Mon Jun 13 10:35:12 2022 +0200

v3dv: merge pending secondary barrier state into primary command buffers

When we switched to using structs to track barrier state we made a mistake
and started to overwrite barrier state in primary command buffers with
the pending state from secondary command buffers executed inside them, when we
should've been merging the state instead.

Fixes flakyness with some CTS barrier tests.

Fixes: f7ce42636c ('v3dv: use an explicit struct type to track barrier state')
Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17020>

---

 src/broadcom/vulkan/v3dv_cmd_buffer.c  | 20 ++++++++++++++++++--
 src/broadcom/vulkan/v3dv_private.h     |  3 +++
 src/broadcom/vulkan/v3dvx_cmd_buffer.c |  6 ++++--
 3 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c
index 485e5b9a066..8fd5758ff29 100644
--- a/src/broadcom/vulkan/v3dv_cmd_buffer.c
+++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c
@@ -1680,6 +1680,20 @@ v3dv_job_clone_in_cmd_buffer(struct v3dv_job *job,
    return clone_job;
 }
 
+void
+v3dv_cmd_buffer_merge_barrier_state(struct v3dv_barrier_state *dst,
+                                    struct v3dv_barrier_state *src)
+{
+   dst->dst_mask |= src->dst_mask;
+
+   dst->src_mask_graphics |= src->src_mask_graphics;
+   dst->src_mask_compute  |= src->src_mask_compute;
+   dst->src_mask_transfer |= src->src_mask_transfer;
+
+   dst->bcl_buffer_access |= src->bcl_buffer_access;
+   dst->bcl_image_access  |= src->bcl_image_access;
+}
+
 static void
 cmd_buffer_execute_outside_pass(struct v3dv_cmd_buffer *primary,
                                 uint32_t cmd_buffer_count,
@@ -1738,8 +1752,10 @@ cmd_buffer_execute_outside_pass(struct v3dv_cmd_buffer *primary,
       pending_barrier = secondary->state.barrier;
    }
 
-   if (pending_barrier.dst_mask)
-      primary->state.barrier = pending_barrier;
+   if (pending_barrier.dst_mask) {
+      v3dv_cmd_buffer_merge_barrier_state(&primary->state.barrier,
+                                          &pending_barrier);
+   }
 }
 
 VKAPI_ATTR void VKAPI_CALL
diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h
index ee5b4b84853..6c1399b04d7 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -1512,6 +1512,9 @@ void v3dv_cmd_buffer_add_private_obj(struct v3dv_cmd_buffer *cmd_buffer,
                                      uint64_t obj,
                                      v3dv_cmd_buffer_private_obj_destroy_cb destroy_cb);
 
+void v3dv_cmd_buffer_merge_barrier_state(struct v3dv_barrier_state *dst,
+                                         struct v3dv_barrier_state *src);
+
 struct v3dv_event {
    struct vk_object_base base;
    int state;
diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c
index 58405714b28..3516a048ace 100644
--- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c
+++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c
@@ -1756,8 +1756,10 @@ v3dX(cmd_buffer_execute_inside_pass)(struct v3dv_cmd_buffer *primary,
       pending_barrier = secondary->state.barrier;
    }
 
-   if (pending_barrier.dst_mask)
-      primary->state.barrier = pending_barrier;
+   if (pending_barrier.dst_mask) {
+      v3dv_cmd_buffer_merge_barrier_state(&primary->state.barrier,
+                                          &pending_barrier);
+   }
 }
 
 static void



More information about the mesa-commit mailing list