From d6702b99a2e76f7b14a378a47c7d99321b8694ed Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Mon, 13 Jun 2022 10:35:12 +0200 Subject: [PATCH] v3dv: merge pending secondary barrier state into primary command buffers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Part-of: --- 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