Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <campbell@blender.org>2022-07-05 07:49:36 +0300
committerCampbell Barton <campbell@blender.org>2022-07-06 08:30:47 +0300
commite58e023e1a3e10f4ff2557aedcd730b5dba23579 (patch)
tree6f4383d011e359b13add3dd7917a7e69b4231c0e /intern/wayland_dynload/intern/wayland_dynload_egl.c
parentd9505831a4549e872bcef023ac082d002e8d8392 (diff)
GHOST/Wayland: support dynamic loading libraries for Wayland
Add intern/wayland_dynload which is used when WITH_GHOST_WAYLAND_DYNLOAD is enabled (off by default). When enabled, systems without Wayland installed will fall back to X11. This allows Blender to dynamically load: - libwayland-client - libwayland-cursor - libwayland-egl - libdecor-0 (when WITH_GHOST_WAYLAND_LIBDECOR is enabled).
Diffstat (limited to 'intern/wayland_dynload/intern/wayland_dynload_egl.c')
-rw-r--r--intern/wayland_dynload/intern/wayland_dynload_egl.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/intern/wayland_dynload/intern/wayland_dynload_egl.c b/intern/wayland_dynload/intern/wayland_dynload_egl.c
new file mode 100644
index 00000000000..b62adb6c90e
--- /dev/null
+++ b/intern/wayland_dynload/intern/wayland_dynload_egl.c
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+/** \file
+ * \ingroup intern_wayland_dynload
+ *
+ * Wrapper functions for `<wayland-egl.h>`.
+ */
+
+#include <stdlib.h> /* `atexit`. */
+
+#include "wayland_dynload_API.h"
+#include "wayland_dynload_utils.h"
+
+#include "wayland_dynload_egl.h" /* Own include. */
+
+/* Public handle. */
+struct WaylandDynload_EGL wayland_dynload_egl = {NULL};
+
+static DynamicLibrary lib = NULL;
+
+bool wayland_dynload_egl_init(const bool verbose)
+{
+ /* Library paths. */
+ const char *paths[] = {
+ "libwayland-egl.so.0",
+ "libwayland-egl.so",
+ };
+ const int paths_num = sizeof(paths) / sizeof(*paths);
+ int path_found = 0;
+ if (!(lib = dynamic_library_open_array_with_error(paths, paths_num, verbose, &path_found))) {
+ return false;
+ }
+ if (atexit(wayland_dynload_egl_exit)) {
+ return false;
+ }
+
+#define WAYLAND_DYNLOAD_FN(symbol) \
+ if (!(wayland_dynload_egl.symbol = dynamic_library_find_with_error( \
+ lib, #symbol, paths[path_found]))) { \
+ return false; \
+ }
+#include "wayland_dynload_egl.h"
+#undef WAYLAND_DYNLOAD_FN
+
+ return true;
+}
+
+void wayland_dynload_egl_exit(void)
+{
+ if (lib != NULL) {
+ dynamic_library_close(lib); /* Ignore errors. */
+ lib = NULL;
+ }
+}
+
+/* Validate local signatures against the original header. */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wredundant-decls"
+#define WAYLAND_DYNLOAD_VALIDATE
+#include "wayland_dynload_egl.h"
+#pragma GCC diagnostic pop