mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 06:58:05 +02:00
v3dv: make cmd_buffer_serialize_job_if_needed take a barrier state
Instead of the cmd_buffer. Also, rename it to drop the cmd_buffer reference, make it a public helper, make it accumulate the barrier state instead of overwriting it and make it return whether it actually applies a barrier into the job. We will use this new public helper in a follow-up change from the queue to better handle barriers at the end of a command buffer. Reviewed-by: Juan A. Suarez <jasuarez@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33507>
This commit is contained in:
parent
71b711ad82
commit
c6264c641d
2 changed files with 18 additions and 13 deletions
|
|
@ -737,46 +737,48 @@ v3dv_job_type_is_gpu(struct v3dv_job *job)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
cmd_buffer_serialize_job_if_needed(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
struct v3dv_job *job)
|
||||
bool
|
||||
v3dv_job_apply_barrier_state(struct v3dv_job *job,
|
||||
struct v3dv_barrier_state *barrier)
|
||||
{
|
||||
assert(cmd_buffer && job);
|
||||
assert(barrier && job);
|
||||
|
||||
/* Serialization only affects GPU jobs, CPU jobs are always automatically
|
||||
* serialized.
|
||||
*/
|
||||
if (!v3dv_job_type_is_gpu(job))
|
||||
return;
|
||||
return false;
|
||||
|
||||
uint8_t barrier_mask = cmd_buffer->state.barrier.dst_mask;
|
||||
uint8_t barrier_mask = barrier->dst_mask;
|
||||
if (barrier_mask == 0)
|
||||
return;
|
||||
return false;
|
||||
|
||||
uint8_t bit = 0;
|
||||
uint8_t *src_mask;
|
||||
if (job->type == V3DV_JOB_TYPE_GPU_CSD) {
|
||||
assert(!job->is_transfer);
|
||||
bit = V3DV_BARRIER_COMPUTE_BIT;
|
||||
src_mask = &cmd_buffer->state.barrier.src_mask_compute;
|
||||
src_mask = &barrier->src_mask_compute;
|
||||
} else if (job->is_transfer) {
|
||||
assert(job->type == V3DV_JOB_TYPE_GPU_CL ||
|
||||
job->type == V3DV_JOB_TYPE_GPU_CL_INCOMPLETE ||
|
||||
job->type == V3DV_JOB_TYPE_GPU_TFU);
|
||||
bit = V3DV_BARRIER_TRANSFER_BIT;
|
||||
src_mask = &cmd_buffer->state.barrier.src_mask_transfer;
|
||||
src_mask = &barrier->src_mask_transfer;
|
||||
} else {
|
||||
assert(job->type == V3DV_JOB_TYPE_GPU_CL ||
|
||||
job->type == V3DV_JOB_TYPE_GPU_CL_INCOMPLETE);
|
||||
bit = V3DV_BARRIER_GRAPHICS_BIT;
|
||||
src_mask = &cmd_buffer->state.barrier.src_mask_graphics;
|
||||
src_mask = &barrier->src_mask_graphics;
|
||||
}
|
||||
|
||||
if (barrier_mask & bit) {
|
||||
job->serialize = *src_mask;
|
||||
job->serialize |= *src_mask;
|
||||
*src_mask = 0;
|
||||
cmd_buffer->state.barrier.dst_mask &= ~bit;
|
||||
barrier->dst_mask &= ~bit;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -844,7 +846,7 @@ v3dv_job_init(struct v3dv_job *job,
|
|||
|
||||
job->is_transfer = cmd_buffer->state.is_transfer;
|
||||
|
||||
cmd_buffer_serialize_job_if_needed(cmd_buffer, job);
|
||||
v3dv_job_apply_barrier_state(job, &cmd_buffer->state.barrier);
|
||||
|
||||
job->perf = cmd_buffer->state.query.active_query.perf;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1860,6 +1860,9 @@ bool v3dv_cmd_buffer_copy_image_tfu(struct v3dv_cmd_buffer *cmd_buffer,
|
|||
struct v3dv_image *src,
|
||||
const VkImageCopy2 *region);
|
||||
|
||||
bool v3dv_job_apply_barrier_state(struct v3dv_job *job,
|
||||
struct v3dv_barrier_state *barrier);
|
||||
|
||||
struct v3dv_event {
|
||||
struct vk_object_base base;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue