radeonsi: implement pipe_screen::semaphore_create

Acked-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36007>
This commit is contained in:
Karol Herbst 2025-07-09 21:27:34 +02:00 committed by Marge Bot
parent 51d03ba1b9
commit 389577c8bb
3 changed files with 41 additions and 0 deletions

View file

@ -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;
}

View file

@ -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.
*/

View file

@ -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;