mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-10 08:10:14 +01:00
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:
parent
51d03ba1b9
commit
389577c8bb
3 changed files with 41 additions and 0 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue