Module: Mesa Branch: main Commit: 69740fb82b4a4a23578703b691bc1f260a935316 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=69740fb82b4a4a23578703b691bc1f260a935316
Author: Asahi Lina <[email protected]> Date: Wed May 3 20:32:23 2023 +0900 asahi: Implement create_fence_fd and fence_server_sync Apparently we were still missing some fence stuff, and it started crashing Firefox in apitrace? I'm not sure why we never noticed this before, but it's trivial enough. Cargo culted from Panfrost. Signed-off-by: Asahi Lina <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22971> --- src/gallium/drivers/asahi/agx_fence.c | 23 +++++++++++++++++++++++ src/gallium/drivers/asahi/agx_fence.h | 7 +++++++ src/gallium/drivers/asahi/agx_pipe.c | 3 +++ 3 files changed, 33 insertions(+) diff --git a/src/gallium/drivers/asahi/agx_fence.c b/src/gallium/drivers/asahi/agx_fence.c index 6cb16f6b8e7..d0ba3d93f9e 100644 --- a/src/gallium/drivers/asahi/agx_fence.c +++ b/src/gallium/drivers/asahi/agx_fence.c @@ -15,6 +15,7 @@ #include "agx_fence.h" #include "agx_state.h" +#include "util/libsync.h" #include "util/os_time.h" #include "util/u_inlines.h" @@ -136,3 +137,25 @@ agx_fence_create(struct agx_context *ctx) return f; } + +void +agx_create_fence_fd(struct pipe_context *pctx, + struct pipe_fence_handle **pfence, int fd, + enum pipe_fd_type type) +{ + *pfence = agx_fence_from_fd(agx_context(pctx), fd, type); +} + +void +agx_fence_server_sync(struct pipe_context *pctx, struct pipe_fence_handle *f) +{ + struct agx_device *dev = agx_device(pctx->screen); + struct agx_context *ctx = agx_context(pctx); + int fd = -1, ret; + + ret = drmSyncobjExportSyncFile(dev->fd, f->syncobj, &fd); + assert(!ret); + + sync_accumulate("asahi", &ctx->in_sync_fd, fd); + close(fd); +} diff --git a/src/gallium/drivers/asahi/agx_fence.h b/src/gallium/drivers/asahi/agx_fence.h index 4c94ccdc498..518b2b609a6 100644 --- a/src/gallium/drivers/asahi/agx_fence.h +++ b/src/gallium/drivers/asahi/agx_fence.h @@ -32,4 +32,11 @@ struct pipe_fence_handle *agx_fence_from_fd(struct agx_context *ctx, int fd, struct pipe_fence_handle *agx_fence_create(struct agx_context *ctx); +void agx_create_fence_fd(struct pipe_context *pctx, + struct pipe_fence_handle **pfence, int fd, + enum pipe_fd_type type); + +void agx_fence_server_sync(struct pipe_context *pctx, + struct pipe_fence_handle *f); + #endif diff --git a/src/gallium/drivers/asahi/agx_pipe.c b/src/gallium/drivers/asahi/agx_pipe.c index 16f53ef8bac..eba84a477a2 100644 --- a/src/gallium/drivers/asahi/agx_pipe.c +++ b/src/gallium/drivers/asahi/agx_pipe.c @@ -1403,6 +1403,9 @@ agx_create_context(struct pipe_screen *screen, void *priv, unsigned flags) pctx->invalidate_resource = agx_invalidate_resource; pctx->memory_barrier = agx_memory_barrier; + pctx->create_fence_fd = agx_create_fence_fd; + pctx->fence_server_sync = agx_fence_server_sync; + agx_init_state_functions(pctx); agx_init_query_functions(pctx); agx_init_streamout_functions(pctx);
