diff options
author | Dmitry Osipenko <dmitry.osipenko@collabora.com> | 2023-07-27 23:25:22 +0300 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2023-09-11 12:58:18 +0000 |
commit | f8383c47991f7f13149e097346ce0c3f89802f3e (patch) | |
tree | 40c110675665840153a1138bfa015724bdd0d3ca | |
parent | cbb5e9166a6f10cc1e83207d9d8d95fd713074eb (diff) |
virgl/vrend: Use virgl_fence API for fence exporting
Switch virgl_renderer_export_fence() to use virgl_fence API for getting
fence's FD. Make vrend to always export fence upon its creation, which is
a requirement of the virgl_fence API.
Reviewed-by: Ryan Neph <ryanneph@google.com>
Reviewed-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/1138>
-rw-r--r-- | src/virglrenderer.c | 10 | ||||
-rw-r--r-- | src/virglrenderer.h | 2 | ||||
-rw-r--r-- | src/vrend_renderer.c | 13 |
3 files changed, 21 insertions, 4 deletions
diff --git a/src/virglrenderer.c b/src/virglrenderer.c index 6d5e170..d11bd52 100644 --- a/src/virglrenderer.c +++ b/src/virglrenderer.c @@ -1375,10 +1375,16 @@ virgl_renderer_resource_import_blob(const struct virgl_renderer_resource_import_ } int -virgl_renderer_export_fence(uint32_t client_fence_id, int *fd) +virgl_renderer_export_fence(uint64_t client_fence_id, int *fd) { TRACE_FUNC(); - return vrend_renderer_export_ctx0_fence(client_fence_id, fd); + + /* transfers FD ownership to caller */ + *fd = virgl_fence_get_fd(client_fence_id); + if (*fd >= 0) + return 0; + + return -EINVAL; } static int virgl_renderer_context_attach_in_fence(struct virgl_context *ctx, diff --git a/src/virglrenderer.h b/src/virglrenderer.h index 08ead08..08d493b 100644 --- a/src/virglrenderer.h +++ b/src/virglrenderer.h @@ -439,7 +439,7 @@ VIRGL_EXPORT int virgl_renderer_context_create_fence(uint32_t ctx_id, #ifdef VIRGL_RENDERER_UNSTABLE_APIS VIRGL_EXPORT int -virgl_renderer_export_fence(uint32_t client_fence_id, int *fd); +virgl_renderer_export_fence(uint64_t client_fence_id, int *fd); VIRGL_EXPORT void virgl_renderer_context_poll(uint32_t ctx_id); /* force fences */ VIRGL_EXPORT int virgl_renderer_context_get_poll_fd(uint32_t ctx_id); diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index 61b0699..1fe217a 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -60,6 +60,7 @@ #include "virglrenderer.h" #include "virglrenderer_hw.h" #include "virgl_protocol.h" +#include "virgl_fence.h" #include "tgsi/tgsi_text.h" @@ -10858,8 +10859,18 @@ int vrend_renderer_create_fence(struct vrend_context *ctx, list_addtail(&fence->fences, &vrend_state.fence_wait_list); cnd_signal(&vrend_state.fence_cond); mtx_unlock(&vrend_state.fence_mutex); - } else + } else { list_addtail(&fence->fences, &vrend_state.fence_list); + } + +#ifdef HAVE_EPOXY_EGL_H + int fence_fd = -1; + if (vrend_renderer_export_ctx0_fence(fence_id, &fence_fd) == 0 && + virgl_fence_set_fd(fence_id, fence_fd)) + virgl_error("failed to export fence sync object\n"); + if (fence_fd != -1) + close(fence_fd); +#endif return 0; fail: |