Signed-off-by: Andres Rodriguez <andre...@gmail.com> --- src/gallium/drivers/ddebug/dd_context.c | 23 +++++++++++++++++++ src/gallium/drivers/ddebug/dd_screen.c | 25 +++++++++++++++++++++ src/gallium/drivers/trace/tr_context.c | 36 ++++++++++++++++++++++++++++++ src/gallium/drivers/trace/tr_screen.c | 39 +++++++++++++++++++++++++++++++++ src/gallium/include/pipe/p_context.h | 26 ++++++++++++++++++++++ src/gallium/include/pipe/p_screen.h | 22 +++++++++++++++++++ src/gallium/include/pipe/p_state.h | 8 +++++++ 7 files changed, 179 insertions(+)
diff --git a/src/gallium/drivers/ddebug/dd_context.c b/src/gallium/drivers/ddebug/dd_context.c index 2abbff9..653e368 100644 --- a/src/gallium/drivers/ddebug/dd_context.c +++ b/src/gallium/drivers/ddebug/dd_context.c @@ -663,6 +663,27 @@ dd_context_texture_subdata(struct pipe_context *_pipe, stride, layer_stride); } +/******************************************************************** + * Semaphores + */ + +static void +dd_context_semobj_wait(struct pipe_context *_pipe, + struct pipe_semaphore_object *semobj) +{ + struct pipe_context *pipe = dd_context(_pipe)->pipe; + + pipe->semobj_wait(pipe, semobj); +} + +static void +dd_context_semobj_signal(struct pipe_context *_pipe, + struct pipe_semaphore_object *semobj) +{ + struct pipe_context *pipe = dd_context(_pipe)->pipe; + + pipe->semobj_signal(pipe, semobj); +} /******************************************************************** * miscellaneous @@ -912,6 +933,8 @@ dd_context_create(struct dd_screen *dscreen, struct pipe_context *pipe) CTX_INIT(create_image_handle); CTX_INIT(delete_image_handle); CTX_INIT(make_image_handle_resident); + CTX_INIT(semobj_wait); + CTX_INIT(semobj_signal); dd_init_draw_functions(dctx); diff --git a/src/gallium/drivers/ddebug/dd_screen.c b/src/gallium/drivers/ddebug/dd_screen.c index caf31f6..6c854cd 100644 --- a/src/gallium/drivers/ddebug/dd_screen.c +++ b/src/gallium/drivers/ddebug/dd_screen.c @@ -367,6 +367,29 @@ dd_screen_memobj_destroy(struct pipe_screen *_screen, screen->memobj_destroy(screen, memobj); } + +/******************************************************************** + * memobj + */ + +static struct pipe_semaphore_object * +dd_screen_semobj_create_from_fd(struct pipe_screen *_screen, + int fd) +{ + struct pipe_screen *screen = dd_screen(_screen)->screen; + + return screen->semobj_create_from_fd(screen, fd); +} + +static void +dd_screen_semobj_destroy(struct pipe_screen *_screen, + struct pipe_semaphore_object *semobj) +{ + struct pipe_screen *screen = dd_screen(_screen)->screen; + + screen->semobj_destroy(screen, semobj); +} + /******************************************************************** * screen */ @@ -486,6 +509,8 @@ ddebug_screen_create(struct pipe_screen *screen) SCR_INIT(fence_finish); SCR_INIT(memobj_create_from_handle); SCR_INIT(memobj_destroy); + SCR_INIT(semobj_create_from_fd); + SCR_INIT(semobj_destroy); SCR_INIT(get_driver_query_info); SCR_INIT(get_driver_query_group_info); SCR_INIT(get_compiler_options); diff --git a/src/gallium/drivers/trace/tr_context.c b/src/gallium/drivers/trace/tr_context.c index 6d918d4..3e423c5 100644 --- a/src/gallium/drivers/trace/tr_context.c +++ b/src/gallium/drivers/trace/tr_context.c @@ -1810,6 +1810,40 @@ static void trace_context_make_image_handle_resident(struct pipe_context *_pipe, pipe->make_image_handle_resident(pipe, handle, access, resident); } +/******************************************************************** + * Semaphores + */ + +static void +trace_context_semobj_wait(struct pipe_context *_pipe, + struct pipe_semaphore_object *semobj) +{ + struct trace_context *tr_ctx = trace_context(_pipe); + struct pipe_context *pipe = tr_ctx->pipe; + + trace_dump_call_begin("pipe_context", "semobj_wait"); + trace_dump_arg(ptr, _pipe); + trace_dump_arg(ptr, semobj); + trace_dump_call_end(); + + pipe->semobj_wait(pipe, semobj); +} + +static void +trace_context_semobj_signal(struct pipe_context *_pipe, + struct pipe_semaphore_object *semobj) +{ + struct trace_context *tr_ctx = trace_context(_pipe); + struct pipe_context *pipe = tr_ctx->pipe; + + trace_dump_call_begin("pipe_context", "semobj_signal"); + trace_dump_arg(ptr, _pipe); + trace_dump_arg(ptr, semobj); + trace_dump_call_end(); + + pipe->semobj_signal(pipe, semobj); +} + struct pipe_context * trace_context_create(struct trace_screen *tr_scr, struct pipe_context *pipe) @@ -1917,6 +1951,8 @@ trace_context_create(struct trace_screen *tr_scr, TR_CTX_INIT(create_image_handle); TR_CTX_INIT(delete_image_handle); TR_CTX_INIT(make_image_handle_resident); + TR_CTX_INIT(semobj_wait); + TR_CTX_INIT(semobj_signal); TR_CTX_INIT(transfer_map); TR_CTX_INIT(transfer_unmap); diff --git a/src/gallium/drivers/trace/tr_screen.c b/src/gallium/drivers/trace/tr_screen.c index d5a8124..4c8182c 100644 --- a/src/gallium/drivers/trace/tr_screen.c +++ b/src/gallium/drivers/trace/tr_screen.c @@ -560,6 +560,43 @@ trace_screen_memobj_destroy(struct pipe_screen *_screen, screen->memobj_destroy(screen, memobj); } +/******************************************************************** + * semobj + */ + +static struct pipe_semaphore_object * +trace_screen_semobj_create_from_fd(struct pipe_screen *_screen, + int fd) +{ + struct pipe_screen *screen = trace_screen(_screen)->screen; + + trace_dump_call_begin("pipe_screen", "semobj_create_from_fd"); + trace_dump_arg(ptr, screen); + trace_dump_arg(int, fd); + + struct pipe_semaphore_object *res = + screen->semobj_create_from_fd(screen, fd); + + trace_dump_ret(ptr, res); + trace_dump_call_end(); + + return res; +} + +static void +trace_screen_semobj_destroy(struct pipe_screen *_screen, + struct pipe_semaphore_object *semobj) +{ + struct pipe_screen *screen = trace_screen(_screen)->screen; + + trace_dump_call_begin("pipe_screen", "semobj_destroy"); + trace_dump_arg(ptr, screen); + trace_dump_arg(ptr, semobj); + + screen->semobj_destroy(screen, semobj); + + trace_dump_call_end(); +} /******************************************************************** * screen @@ -655,6 +692,8 @@ trace_screen_create(struct pipe_screen *screen) tr_scr->base.fence_finish = trace_screen_fence_finish; SCR_INIT(memobj_create_from_handle); SCR_INIT(memobj_destroy); + SCR_INIT(semobj_create_from_fd); + SCR_INIT(semobj_destroy); tr_scr->base.flush_frontbuffer = trace_screen_flush_frontbuffer; tr_scr->base.get_timestamp = trace_screen_get_timestamp; SCR_INIT(get_driver_uuid); diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h index 4609d4d..0e3e930 100644 --- a/src/gallium/include/pipe/p_context.h +++ b/src/gallium/include/pipe/p_context.h @@ -61,6 +61,7 @@ struct pipe_resource; struct pipe_sampler_state; struct pipe_sampler_view; struct pipe_scissor_state; +struct pipe_semaphore_object; struct pipe_shader_buffer; struct pipe_shader_state; struct pipe_stencil_ref; @@ -839,6 +840,31 @@ struct pipe_context { */ void (*make_image_handle_resident)(struct pipe_context *ctx, uint64_t handle, unsigned access, bool resident); + + /** + * Wait for a semaphore object + * + * Emit a wait operation for the specified semaphore. After the wait + * completes, the semaphore will return to the unsignaled state. + * + * Waiting on a semaphore that has no current signal operation associated + * with it (from the GL client or an external semaphore signaler) results + * in undefined behaviour. + * + * \param semobj The semaphore object to wait upon + */ + void (*semobj_wait)(struct pipe_context *ctx, + struct pipe_semaphore_object *semobj); + + /** + * Signal a semaphore object + * + * Emit a signal operation for the specified semaphore. + * + * \param semobj The semaphore object to signal + */ + void (*semobj_signal)(struct pipe_context *ctx, + struct pipe_semaphore_object *semobj); }; diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h index c249c7d..d999d14 100644 --- a/src/gallium/include/pipe/p_screen.h +++ b/src/gallium/include/pipe/p_screen.h @@ -412,6 +412,28 @@ struct pipe_screen { uint64_t offset); /** + * Create a semaphore object from a file descriptor + * + * The underlying primitive is often allocated by a foreign API, then + * exported through interfaces compatible with EXT_semaphore. + * + * Note: the caller retains ownership of fd. + * + * \param fd A file descriptor representing the semaphore object to import + */ + struct pipe_semaphore_object *(*semobj_create_from_fd)(struct pipe_screen *screen, + int fd); + + + /** + * Destroy a semaphore object + * + * \param semobj The semaphore object to destroy + */ + void (*semobj_destroy)(struct pipe_screen *screen, + struct pipe_semaphore_object *semobj); + + /** * Fill @uuid with a unique driver identifier * * \param uuid pointer to a memory region of PIPE_UUID_SIZE bytes diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index 90dc561..9edd5ef 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -910,6 +910,14 @@ struct pipe_memory_object bool dedicated; }; +/** + * Structure that contains information about semaphores + */ +struct pipe_semaphore_object +{ + bool imported; +}; + #ifdef __cplusplus } #endif -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev