Mesa (main): broadcom/simulator: enable multisync in the simulator
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Feb 9 07:44:10 UTC 2022
Module: Mesa
Branch: main
Commit: 70a219d4a358be1d0d41af5b33203aebb19aa9ec
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=70a219d4a358be1d0d41af5b33203aebb19aa9ec
Author: Melissa Wen <mwen at igalia.com>
Date: Mon Jan 31 15:17:36 2022 -0100
broadcom/simulator: enable multisync in the simulator
Use drmSyncobjSignal to signal out_syncobjs when a GPU job submission
ends in the simulator. With this, we can enable multisync support in the
simulator and keep the multisync approach to process fence by submitting
a serialized no-op job that adds the fence to the array of out syncobjs,
i.e. syncobjs to be signaled in the kernel when a job completes (job
post deps).
Signed-off-by: Melissa Wen <mwen at igalia.com>
Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14768>
---
src/broadcom/simulator/v3d_simulator.c | 49 ++++++++++++++++++++++++++++++++-
src/broadcom/simulator/v3dx_simulator.c | 2 +-
2 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/src/broadcom/simulator/v3d_simulator.c b/src/broadcom/simulator/v3d_simulator.c
index 494e5bb4475..878e38ed889 100644
--- a/src/broadcom/simulator/v3d_simulator.c
+++ b/src/broadcom/simulator/v3d_simulator.c
@@ -427,6 +427,32 @@ v3d_simulator_perfmon_switch(int fd, uint32_t perfid)
file->active_perfid = perfid;
}
+static int
+v3d_simulator_signal_syncobjs(int fd, struct drm_v3d_multi_sync *ms)
+{
+ struct drm_v3d_sem *out_syncs = (void *)(uintptr_t)ms->out_syncs;
+ int n_syncobjs = ms->out_sync_count;
+ uint32_t syncobjs[n_syncobjs];
+
+ for (int i = 0; i < n_syncobjs; i++)
+ syncobjs[i] = out_syncs[i].handle;
+ return drmSyncobjSignal(fd, (uint32_t *) &syncobjs, n_syncobjs);
+}
+
+static int
+v3d_simulator_process_post_deps(int fd, struct drm_v3d_extension *ext)
+{
+ int ret = 0;
+ while (ext && ext->id != DRM_V3D_EXT_ID_MULTI_SYNC)
+ ext = (void *)(uintptr_t) ext->next;
+
+ if (ext) {
+ struct drm_v3d_multi_sync *ms = (struct drm_v3d_multi_sync *) ext;
+ ret = v3d_simulator_signal_syncobjs(fd, ms);
+ }
+ return ret;
+}
+
static int
v3d_simulator_submit_cl_ioctl(int fd, struct drm_v3d_submit_cl *submit)
{
@@ -459,7 +485,12 @@ v3d_simulator_submit_cl_ioctl(int fd, struct drm_v3d_submit_cl *submit)
if (ret)
return ret;
- return 0;
+ if (submit->flags & DRM_V3D_SUBMIT_EXTENSION) {
+ struct drm_v3d_extension *ext = (void *)(uintptr_t)submit->extensions;
+ ret = v3d_simulator_process_post_deps(fd, ext);
+ }
+
+ return ret;
}
/**
@@ -590,6 +621,14 @@ v3d_simulator_submit_tfu_ioctl(int fd, struct drm_v3d_submit_tfu *args)
v3d_simulator_copy_out_handle(file, args->bo_handles[0]);
+ if (ret)
+ return ret;
+
+ if (args->flags & DRM_V3D_SUBMIT_EXTENSION) {
+ struct drm_v3d_extension *ext = (void *)(uintptr_t)args->extensions;
+ ret = v3d_simulator_process_post_deps(fd, ext);
+ }
+
return ret;
}
@@ -614,6 +653,14 @@ v3d_simulator_submit_csd_ioctl(int fd, struct drm_v3d_submit_csd *args)
for (int i = 0; i < args->bo_handle_count; i++)
v3d_simulator_copy_out_handle(file, bo_handles[i]);
+ if (ret < 0)
+ return ret;
+
+ if (args->flags & DRM_V3D_SUBMIT_EXTENSION) {
+ struct drm_v3d_extension *ext = (void *)(uintptr_t)args->extensions;
+ ret = v3d_simulator_process_post_deps(fd, ext);
+ }
+
return ret;
}
diff --git a/src/broadcom/simulator/v3dx_simulator.c b/src/broadcom/simulator/v3dx_simulator.c
index abc7f9196f1..0d8d0bf62a1 100644
--- a/src/broadcom/simulator/v3dx_simulator.c
+++ b/src/broadcom/simulator/v3dx_simulator.c
@@ -270,7 +270,7 @@ v3dX(simulator_get_param_ioctl)(struct v3d_hw *v3d,
args->value = V3D_VERSION >= 41;
return 0;
case DRM_V3D_PARAM_SUPPORTS_MULTISYNC_EXT:
- args->value = 0;
+ args->value = 1;
return 0;
}
More information about the mesa-commit
mailing list