[Mesa-dev] [PATCH 05/17] gallium: introduce semaphore object

Andres Rodriguez andresx7 at gmail.com
Thu Nov 2 03:57:08 UTC 2017


Signed-off-by: Andres Rodriguez <andresx7 at 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



More information about the mesa-dev mailing list