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@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17020>
This commit is contained in:

committed by
Marge Bot

parent
a97f78eb14
commit
d6702b99a2
@@ -1680,6 +1680,20 @@ v3dv_job_clone_in_cmd_buffer(struct v3dv_job *job,
|
|||||||
return clone_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
|
static void
|
||||||
cmd_buffer_execute_outside_pass(struct v3dv_cmd_buffer *primary,
|
cmd_buffer_execute_outside_pass(struct v3dv_cmd_buffer *primary,
|
||||||
uint32_t cmd_buffer_count,
|
uint32_t cmd_buffer_count,
|
||||||
@@ -1738,8 +1752,10 @@ cmd_buffer_execute_outside_pass(struct v3dv_cmd_buffer *primary,
|
|||||||
pending_barrier = secondary->state.barrier;
|
pending_barrier = secondary->state.barrier;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pending_barrier.dst_mask)
|
if (pending_barrier.dst_mask) {
|
||||||
primary->state.barrier = pending_barrier;
|
v3dv_cmd_buffer_merge_barrier_state(&primary->state.barrier,
|
||||||
|
&pending_barrier);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VKAPI_ATTR void VKAPI_CALL
|
VKAPI_ATTR void VKAPI_CALL
|
||||||
|
@@ -1512,6 +1512,9 @@ void v3dv_cmd_buffer_add_private_obj(struct v3dv_cmd_buffer *cmd_buffer,
|
|||||||
uint64_t obj,
|
uint64_t obj,
|
||||||
v3dv_cmd_buffer_private_obj_destroy_cb destroy_cb);
|
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 v3dv_event {
|
||||||
struct vk_object_base base;
|
struct vk_object_base base;
|
||||||
int state;
|
int state;
|
||||||
|
@@ -1756,8 +1756,10 @@ v3dX(cmd_buffer_execute_inside_pass)(struct v3dv_cmd_buffer *primary,
|
|||||||
pending_barrier = secondary->state.barrier;
|
pending_barrier = secondary->state.barrier;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pending_barrier.dst_mask)
|
if (pending_barrier.dst_mask) {
|
||||||
primary->state.barrier = pending_barrier;
|
v3dv_cmd_buffer_merge_barrier_state(&primary->state.barrier,
|
||||||
|
&pending_barrier);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Reference in New Issue
Block a user