From 389577c8bbda0daeeb159674a705b66e590e91bd Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Wed, 9 Jul 2025 21:27:34 +0200 Subject: [PATCH] radeonsi: implement pipe_screen::semaphore_create MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Acked-by: Alyssa Rosenzweig Reviewed-by: Marek Olšák Part-of: --- src/gallium/drivers/radeonsi/si_fence.c | 13 +++++++++++ src/gallium/include/winsys/radeon_winsys.h | 2 ++ src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp | 26 +++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_fence.c b/src/gallium/drivers/radeonsi/si_fence.c index 16fd0bc84b0..af6d655f65d 100644 --- a/src/gallium/drivers/radeonsi/si_fence.c +++ b/src/gallium/drivers/radeonsi/si_fence.c @@ -206,6 +206,17 @@ static struct si_fence *si_alloc_fence() return fence; } +static struct pipe_fence_handle * +si_semaphore_create(struct pipe_screen *screen) +{ + struct radeon_winsys *rws = ((struct si_screen *)screen)->ws; + struct si_fence *fence = si_alloc_fence(); + + fence->gfx = rws->semaphore_create(rws); + + return (struct pipe_fence_handle *)fence; +} + struct pipe_fence_handle *si_create_fence(struct pipe_context *ctx, struct tc_unflushed_batch_token *tc_token) { @@ -606,4 +617,6 @@ void si_init_screen_fence_functions(struct si_screen *screen) screen->b.fence_finish = si_fence_finish; screen->b.fence_reference = si_fence_reference; screen->b.fence_get_fd = si_fence_get_fd; + if (screen->ws->semaphore_create) + screen->b.semaphore_create = si_semaphore_create; } diff --git a/src/gallium/include/winsys/radeon_winsys.h b/src/gallium/include/winsys/radeon_winsys.h index 08fdfb873e7..781a993df9f 100644 --- a/src/gallium/include/winsys/radeon_winsys.h +++ b/src/gallium/include/winsys/radeon_winsys.h @@ -737,6 +737,8 @@ struct radeon_winsys { void (*fence_reference)(struct radeon_winsys *ws, struct pipe_fence_handle **dst, struct pipe_fence_handle *src); + struct pipe_fence_handle *(*semaphore_create)(struct radeon_winsys *ws); + /** * Create a new fence object corresponding to the given syncobj fd. */ diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp index b88bdcdd989..9ed2b41e300 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.cpp @@ -60,6 +60,31 @@ amdgpu_fence_create(struct amdgpu_cs *acs) return (struct pipe_fence_handle *)fence; } +static struct pipe_fence_handle * +amdgpu_fence_create_semaphore(struct radeon_winsys *rws) +{ + struct amdgpu_winsys *aws = amdgpu_winsys(rws); + struct amdgpu_fence *fence = CALLOC_STRUCT(amdgpu_fence); + + if (!fence) + return NULL; + + pipe_reference_init(&fence->reference, 1); + fence->aws = aws; + /* fence->ctx == NULL means that the fence is syncobj-based. */ + + int r = ac_drm_cs_create_syncobj2(aws->dev, 0, &fence->syncobj); + if (r) { + FREE(fence); + return NULL; + } + + util_queue_fence_init(&fence->submitted); + fence->imported = true; + + return (struct pipe_fence_handle*)fence; +} + static struct pipe_fence_handle * amdgpu_fence_import_syncobj(struct radeon_winsys *rws, int fd) { @@ -2254,6 +2279,7 @@ void amdgpu_cs_init_functions(struct amdgpu_screen_winsys *sws) sws->base.cs_add_fence_dependency = amdgpu_cs_add_fence_dependency; sws->base.cs_add_syncobj_signal = amdgpu_cs_add_syncobj_signal; sws->base.cs_get_ip_type = amdgpu_cs_get_ip_type; + sws->base.semaphore_create = amdgpu_fence_create_semaphore; sws->base.fence_wait = amdgpu_fence_wait_rel_timeout; sws->base.fence_reference = amdgpu_winsys_fence_reference; sws->base.fence_import_syncobj = amdgpu_fence_import_syncobj;