gallium: add pipe_screen::semaphore_create

Acked-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36007>
This commit is contained in:
Karol Herbst 2025-07-07 13:27:10 +02:00 committed by Marge Bot
parent 9bacd232b8
commit cc32c5c2eb
4 changed files with 47 additions and 0 deletions

View file

@ -453,6 +453,14 @@ dd_screen_memobj_destroy(struct pipe_screen *_screen,
screen->memobj_destroy(screen, memobj);
}
static struct pipe_fence_handle *
dd_screen_semaphore_create(struct pipe_screen *_screen)
{
struct pipe_screen *screen = dd_screen(_screen)->screen;
return screen->semaphore_create(screen);
}
/********************************************************************
* screen
*/
@ -664,6 +672,7 @@ ddebug_screen_create(struct pipe_screen *screen)
dscreen->base.get_driver_pipe_screen = dd_get_driver_pipe_screen;
SCR_INIT(is_dmabuf_modifier_supported);
SCR_INIT(get_dmabuf_modifier_planes);
SCR_INIT(semaphore_create);
/* copy all caps */
*(struct pipe_caps *)&dscreen->base.caps = screen->caps;

View file

@ -736,6 +736,14 @@ static void noop_vertex_state_destroy(struct pipe_screen *screen,
FREE(state);
}
static struct pipe_fence_handle *
noop_semaphore_create(struct pipe_screen *screen)
{
struct pipe_reference *f = MALLOC_STRUCT(pipe_reference);
f->count = 1;
return (struct pipe_fence_handle*)f;
}
static struct pipe_screen * noop_get_driver_pipe_screen(struct pipe_screen *_screen)
{
struct pipe_screen * screen = ((struct noop_pipe_screen*)_screen)->oscreen;
@ -800,6 +808,8 @@ struct pipe_screen *noop_screen_create(struct pipe_screen *oscreen)
screen->query_compression_rates = noop_query_compression_rates;
screen->query_compression_modifiers = noop_query_compression_modifiers;
screen->get_driver_pipe_screen = noop_get_driver_pipe_screen;
if (oscreen->semaphore_create)
screen->semaphore_create = noop_semaphore_create;
/* copy all caps */
*(struct pipe_caps *)&screen->caps = oscreen->caps;

View file

@ -936,6 +936,25 @@ trace_screen_fence_reference(struct pipe_screen *_screen,
}
static struct pipe_fence_handle *
trace_screen_semaphore_create(struct pipe_screen *_screen)
{
struct trace_screen *tr_scr = trace_screen(_screen);
struct pipe_screen *screen = tr_scr->screen;
struct pipe_fence_handle *res;
trace_dump_call_begin("pipe_screen", "fence_reference");
trace_dump_arg(ptr, screen);
res = screen->semaphore_create(screen);
trace_dump_ret(ptr, res);
trace_dump_call_end();
return res;
}
static int
trace_screen_fence_get_fd(struct pipe_screen *_screen,
struct pipe_fence_handle *fence)
@ -1508,6 +1527,7 @@ trace_screen_create(struct pipe_screen *screen)
SCR_INIT(resource_changed);
tr_scr->base.resource_destroy = trace_screen_resource_destroy;
tr_scr->base.fence_reference = trace_screen_fence_reference;
SCR_INIT(semaphore_create);
SCR_INIT(fence_get_fd);
SCR_INIT(create_fence_win32);
tr_scr->base.fence_finish = trace_screen_fence_finish;

View file

@ -388,6 +388,14 @@ struct pipe_screen {
struct pipe_fence_handle **ptr,
struct pipe_fence_handle *fence);
/**
* Creates a semaphore that can be signaled and waited on through
* fence_server_sync and fence_server_signal.
*
* Drivers are required to not flush or wait on anything in this call.
*/
struct pipe_fence_handle* (*semaphore_create)(struct pipe_screen *screen);
/**
* Wait for the fence to finish.
*