On 2017-11-03 02:20 PM, Marek Olšák wrote:
On Fri, Nov 3, 2017 at 7:18 PM, Andres Rodriguez <andre...@gmail.com> wrote:


On 2017-11-03 01:56 PM, Marek Olšák wrote:

On Thu, Nov 2, 2017 at 4:57 AM, Andres Rodriguez <andre...@gmail.com>
wrote:

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;


"imported" is unused.

Also, why don't we use pipe_fence_handle and existing fence API? It's
a syncobj anyway. There is create_fence_fd (import), fence_get_fd
(export), fence_finish (CPU wait and/or return status),
fence_server_sync (GPU or scheduler wait).


Semaphores have some semantics that differ from fences, mainly around their
re-usability. That was my initial reasoning for keeping them separate.
However, nha just pointed out to me that those semantics are already
supported by fences so I'm gonna look at merging things together.

One small comment from when I initially was taking this approach. The
create_fence_fd() implementation would need some changes as the incoming
semaphore don't use sync_file fds, they use syncobj fds which are slightly.
Are you okay with attempting to import as a sync_file fd first, and then on
failure attempt to import as a syncobj fd?

Adding a type parameter to create_fence_fd should be sufficient. Note
that any existing pipe callback can be modified if it's necessary.



Sounds good.

Marek

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to