diff options
author | Campbell Barton <campbell@blender.org> | 2022-07-05 07:49:36 +0300 |
---|---|---|
committer | Campbell Barton <campbell@blender.org> | 2022-07-06 08:30:47 +0300 |
commit | e58e023e1a3e10f4ff2557aedcd730b5dba23579 (patch) | |
tree | 6f4383d011e359b13add3dd7917a7e69b4231c0e /intern/wayland_dynload/intern/wayland_dynload_egl.c | |
parent | d9505831a4549e872bcef023ac082d002e8d8392 (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.c | 61 |
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 |