From 87acd4cde5dca7ed637ac2fcd652eea58bb396c5 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Wed, 30 Oct 2024 08:44:04 +0100 Subject: [PATCH] v3d: add a V3D_DEBUG option to force synchronous execution of jobs This is useful to debug sync issues and can also can be used to instrument tooling for dumping job execution times in the future. Reviewed-by: Jose Maria Casanova Crespo Part-of: --- src/broadcom/common/v3d_debug.c | 2 ++ src/broadcom/common/v3d_debug.h | 1 + src/gallium/drivers/v3d/v3d_job.c | 5 ++++- src/gallium/drivers/v3d/v3dx_draw.c | 4 ++++ src/gallium/drivers/v3d/v3dx_tfu.c | 4 ++++ 5 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/broadcom/common/v3d_debug.c b/src/broadcom/common/v3d_debug.c index e55ff4a3d58..b69e56bd984 100644 --- a/src/broadcom/common/v3d_debug.c +++ b/src/broadcom/common/v3d_debug.c @@ -105,6 +105,8 @@ static const struct debug_named_value debug_control[] = { /* disable_tfu is v3dv only because v3d has some uses of the TFU without alternative codepaths */ { "disable_tfu", V3D_DEBUG_DISABLE_TFU, "Disable TFU (v3dv only)" }, + { "sync", V3D_DEBUG_SYNC, + "Sync wait for each job to complete after submission." }, DEBUG_NAMED_VALUE_END }; diff --git a/src/broadcom/common/v3d_debug.h b/src/broadcom/common/v3d_debug.h index 4b05bd300e0..a01326ba40c 100644 --- a/src/broadcom/common/v3d_debug.h +++ b/src/broadcom/common/v3d_debug.h @@ -69,6 +69,7 @@ extern uint32_t v3d_mesa_debug; #define V3D_DEBUG_NO_MERGE_JOBS (1 << 24) #define V3D_DEBUG_OPT_COMPILE_TIME (1 << 25) #define V3D_DEBUG_DISABLE_TFU (1 << 26) +#define V3D_DEBUG_SYNC (1 << 27) #define V3D_DEBUG_SHADERS (V3D_DEBUG_TGSI | V3D_DEBUG_NIR | \ V3D_DEBUG_VIR | V3D_DEBUG_QPU | \ diff --git a/src/gallium/drivers/v3d/v3d_job.c b/src/gallium/drivers/v3d/v3d_job.c index 09175060c4d..aec6fca09f3 100644 --- a/src/gallium/drivers/v3d/v3d_job.c +++ b/src/gallium/drivers/v3d/v3d_job.c @@ -592,7 +592,6 @@ v3d_job_submit(struct v3d_context *v3d, struct v3d_job *job) if (!V3D_DBG(NORAST)) { int ret; - ret = v3d_ioctl(v3d->fd, DRM_IOCTL_V3D_SUBMIT_CL, &job->submit); static bool warned = false; if (ret && !warned) { @@ -602,6 +601,10 @@ v3d_job_submit(struct v3d_context *v3d, struct v3d_job *job) } else if (!ret) { if (v3d->active_perfmon) v3d->active_perfmon->job_submitted = true; + if (V3D_DBG(SYNC)) { + drmSyncobjWait(v3d->fd, &v3d->out_sync, 1, INT64_MAX, + DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL, NULL); + } } /* If we are submitting a job in the middle of transform diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index 38f1c2aff92..c28572d4df0 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -1601,6 +1601,10 @@ v3d_launch_grid(struct pipe_context *pctx, const struct pipe_grid_info *info) } else if (!ret) { if (v3d->active_perfmon) v3d->active_perfmon->job_submitted = true; + if (V3D_DBG(SYNC)) { + drmSyncobjWait(v3d->fd, &v3d->out_sync, 1, INT64_MAX, + DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL, NULL); + } } } diff --git a/src/gallium/drivers/v3d/v3dx_tfu.c b/src/gallium/drivers/v3d/v3dx_tfu.c index e0b6d32db4a..a00e6f4d106 100644 --- a/src/gallium/drivers/v3d/v3dx_tfu.c +++ b/src/gallium/drivers/v3d/v3dx_tfu.c @@ -197,6 +197,10 @@ v3dX(tfu)(struct pipe_context *pctx, fprintf(stderr, "Failed to submit TFU job: %d\n", ret); return false; } + if (V3D_DBG(SYNC)) { + drmSyncobjWait(v3d->fd, &v3d->out_sync, 1, INT64_MAX, + DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL, NULL); + } dst->writes++;