From cc32c5c2eb02e2ba8a7dd5463ee46893b7978c47 Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Mon, 7 Jul 2025 13:27:10 +0200 Subject: [PATCH] gallium: add pipe_screen::semaphore_create Acked-by: Alyssa Rosenzweig Part-of: --- .../auxiliary/driver_ddebug/dd_screen.c | 9 +++++++++ src/gallium/auxiliary/driver_noop/noop_pipe.c | 10 ++++++++++ .../auxiliary/driver_trace/tr_screen.c | 20 +++++++++++++++++++ src/gallium/include/pipe/p_screen.h | 8 ++++++++ 4 files changed, 47 insertions(+) diff --git a/src/gallium/auxiliary/driver_ddebug/dd_screen.c b/src/gallium/auxiliary/driver_ddebug/dd_screen.c index 6c427eb882d..becc8410719 100644 --- a/src/gallium/auxiliary/driver_ddebug/dd_screen.c +++ b/src/gallium/auxiliary/driver_ddebug/dd_screen.c @@ -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; diff --git a/src/gallium/auxiliary/driver_noop/noop_pipe.c b/src/gallium/auxiliary/driver_noop/noop_pipe.c index 4845068a67e..a8c1c13433d 100644 --- a/src/gallium/auxiliary/driver_noop/noop_pipe.c +++ b/src/gallium/auxiliary/driver_noop/noop_pipe.c @@ -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; diff --git a/src/gallium/auxiliary/driver_trace/tr_screen.c b/src/gallium/auxiliary/driver_trace/tr_screen.c index 14171a350dc..7f4b103b9dd 100644 --- a/src/gallium/auxiliary/driver_trace/tr_screen.c +++ b/src/gallium/auxiliary/driver_trace/tr_screen.c @@ -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; diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h index 6d6f6548ef1..7eb97885f57 100644 --- a/src/gallium/include/pipe/p_screen.h +++ b/src/gallium/include/pipe/p_screen.h @@ -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. *