[gnome-remote-desktop] egl-thread: Add API to run external functions in EGL thread



commit ba7d015165ad568288fb50d373f96e0fcbef89b4
Author: Pascal Nowack <Pascal Nowack gmx de>
Date:   Fri Dec 31 13:04:36 2021 +0100

    egl-thread: Add API to run external functions in EGL thread
    
    This allows e.g. fetching the compute devices from the current GL
    context for CUDA.

 src/grd-egl-thread.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
 src/grd-egl-thread.h |  8 ++++++++
 2 files changed, 53 insertions(+)
---
diff --git a/src/grd-egl-thread.c b/src/grd-egl-thread.c
index 0675894d..17fb7dac 100644
--- a/src/grd-egl-thread.c
+++ b/src/grd-egl-thread.c
@@ -62,6 +62,14 @@ typedef struct _GrdEglTask
   GDestroyNotify callback_destroy;
 } GrdEglTask;
 
+typedef struct _GrdEglTaskCustom
+{
+  GrdEglTask base;
+
+  GrdEglThreadCustomFunc custom_func;
+  gpointer user_data;
+} GrdEglTaskCustom;
+
 typedef struct _GrdEglTaskSync
 {
   GrdEglTask base;
@@ -738,6 +746,18 @@ sync_in_impl (gpointer data,
   task->base.callback (TRUE, task->base.callback_user_data);
 }
 
+static void
+run_custom_task_in_impl (gpointer data,
+                         gpointer user_data)
+{
+  GrdEglTaskCustom *task = user_data;
+  gboolean success;
+
+  success = task->custom_func (task->user_data);
+
+  task->base.callback (success, task->base.callback_user_data);
+}
+
 void
 grd_egl_thread_download (GrdEglThread         *egl_thread,
                          uint8_t              *dst_data,
@@ -800,6 +820,31 @@ grd_egl_thread_sync (GrdEglThread         *egl_thread,
   g_main_context_wakeup (egl_thread->impl.main_context);
 }
 
+void
+grd_egl_thread_run_custom_task (GrdEglThread           *egl_thread,
+                                GrdEglThreadCustomFunc  custom_func,
+                                gpointer                custom_func_data,
+                                GrdEglThreadCallback    callback,
+                                gpointer                user_data,
+                                GDestroyNotify          destroy)
+{
+  GrdEglTaskCustom *task;
+
+  task = g_new0 (GrdEglTaskCustom, 1);
+
+  task->custom_func = custom_func;
+  task->user_data = custom_func_data;
+
+  task->base.func = run_custom_task_in_impl;
+  task->base.destroy = (GDestroyNotify) grd_egl_task_free;
+  task->base.callback = callback;
+  task->base.callback_user_data = user_data;
+  task->base.callback_destroy = destroy;
+
+  g_async_queue_push (egl_thread->task_queue, task);
+  g_main_context_wakeup (egl_thread->impl.main_context);
+}
+
 gboolean
 grd_egl_thread_get_modifiers_for_format (GrdEglThread  *egl_thread,
                                          uint32_t       format,
diff --git a/src/grd-egl-thread.h b/src/grd-egl-thread.h
index 9af35eef..2e032513 100644
--- a/src/grd-egl-thread.h
+++ b/src/grd-egl-thread.h
@@ -28,6 +28,7 @@
 
 typedef void (* GrdEglThreadCallback) (gboolean success,
                                        gpointer user_data);
+typedef gboolean (* GrdEglThreadCustomFunc) (gpointer user_data);
 
 GrdEglThread * grd_egl_thread_new (GError **error);
 
@@ -53,6 +54,13 @@ void grd_egl_thread_sync (GrdEglThread         *egl_thread,
                           gpointer              user_data,
                           GDestroyNotify        destroy);
 
+void grd_egl_thread_run_custom_task (GrdEglThread           *egl_thread,
+                                     GrdEglThreadCustomFunc  custom_func,
+                                     gpointer                custom_func_data,
+                                     GrdEglThreadCallback    callback,
+                                     gpointer                user_data,
+                                     GDestroyNotify          destroy);
+
 gboolean grd_egl_thread_get_modifiers_for_format (GrdEglThread  *egl_thread,
                                                   uint32_t       format,
                                                   int           *out_n_modifiers,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]