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