summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Osipenko <dmitry.osipenko@collabora.com>2023-07-27 23:25:22 +0300
committerMarge Bot <emma+marge@anholt.net>2023-09-11 12:58:18 +0000
commitf8383c47991f7f13149e097346ce0c3f89802f3e (patch)
tree40c110675665840153a1138bfa015724bdd0d3ca
parentcbb5e9166a6f10cc1e83207d9d8d95fd713074eb (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.c10
-rw-r--r--src/virglrenderer.h2
-rw-r--r--src/vrend_renderer.c13
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: