From 8f8fc35e0239bde4b325155748fab2b20733cd29 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Mon, 19 May 2025 20:51:30 +0200 Subject: [PATCH 1/5] Record dynamic dependencies in .note.dlopen elf section The data can be used with `dlopen-notes`. The raw date can be viewed with `objdump -j .note.dlopen -s libSDL3.so.0` --- CMakeLists.txt | 20 ++++ docs/README-linux.md | 2 +- include/build_config/SDL_build_config.h.cmake | 2 + src/SDL_internal.h | 1 + src/audio/aaudio/SDL_aaudio.c | 11 +- src/audio/alsa/SDL_alsa_audio.c | 7 ++ src/audio/jack/SDL_jackaudio.c | 7 ++ src/audio/pipewire/SDL_pipewire.c | 7 ++ src/audio/pulseaudio/SDL_pulseaudio.c | 7 ++ src/audio/sndio/SDL_sndioaudio.c | 7 ++ src/camera/pipewire/SDL_camera_pipewire.c | 7 ++ src/core/linux/SDL_dbus.c | 10 +- src/core/linux/SDL_udev.c | 11 ++ src/dynapi/SDL_dynapi_dlopennote.h | 98 +++++++++++++++ src/hidapi/SDL_hidapi.c | 9 ++ src/io/io_uring/SDL_asyncio_liburing.c | 10 +- src/storage/steam/SDL_steamstorage.c | 29 +++-- src/video/SDL_egl.c | 31 +++++ src/video/kmsdrm/SDL_kmsdrmdyn.c | 7 ++ src/video/kmsdrm/SDL_kmsdrmvulkan.c | 7 ++ src/video/offscreen/SDL_offscreenvulkan.c | 7 ++ src/video/openvr/SDL_openvrvideo.c | 32 +++-- src/video/wayland/SDL_waylanddyn.c | 64 ++++++---- src/video/wayland/SDL_waylandvulkan.c | 7 ++ src/video/x11/SDL_x11dyn.c | 112 +++++++++++------- src/video/x11/SDL_x11vulkan.c | 7 ++ 26 files changed, 423 insertions(+), 96 deletions(-) create mode 100644 src/dynapi/SDL_dynapi_dlopennote.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a36d82acdd..648671f70a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -320,6 +320,7 @@ dep_option(SDL_ARMNEON "Use NEON assembly routines" ON "SDL_ASSEMBLY dep_option(SDL_LSX "Use LSX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_LOONGARCH64" OFF) dep_option(SDL_LASX "Use LASX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_LOONGARCH64" OFF) +dep_option(SDL_DLOPEN_NOTES "Record dlopen dependencies in .note.dlopen section" TRUE UNIX_SYS OFF) set_option(SDL_LIBC "Use the system C library" ${SDL_LIBC_DEFAULT}) set_option(SDL_SYSTEM_ICONV "Use iconv() from system-installed libraries" ${SDL_SYSTEM_ICONV_DEFAULT}) set_option(SDL_LIBICONV "Prefer iconv() from libiconv, if available, over libc version" OFF) @@ -1559,6 +1560,25 @@ elseif(EMSCRIPTEN) CheckLibUnwind() elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU) + + if(SDL_DLOPEN_NOTES) + set(CHECK_ELF_DLNOTES_SRC [==[ + #ifndef __ELF__ + ELF DL notes is only supported on ELF platforms + #endif + __attribute__ ((used,aligned(4),section(".note.dlopen"))) static const struct { + struct { int a; int b; int c; } hdr; char name[4]; __attribute__((aligned(4))) char json[24]; + } dlnote = { { 4, 0x407c0c0aU, 16 }, "FDO", "[\\"a\\":{\\"a\\":\\"1\\",\\"b\\":\\"2\\"}]" }; + int main(int argc, char *argv[]) { + return argc + dlnote.hdr.a; + } + ]==]) + check_c_source_compiles("${CHECK_ELF_DLNOTES_SRC}" COMPILER_SUPPORTS_ELFNOTES) + if(COMPILER_SUPPORTS_ELFNOTES) + set(HAVE_DLOPEN_NOTES TRUE) + endif() + endif() + if(SDL_AUDIO) if(NETBSD) set(SDL_AUDIO_DRIVER_NETBSD 1) diff --git a/docs/README-linux.md b/docs/README-linux.md index 8399881cd8..daf8b03c53 100644 --- a/docs/README-linux.md +++ b/docs/README-linux.md @@ -26,7 +26,7 @@ Ubuntu 22.04+ can also add `libpipewire-0.3-dev libwayland-dev libdecor-0-dev li Fedora 35, all available features enabled: sudo yum install gcc git-core make cmake \ - alsa-lib-devel pulseaudio-libs-devel nas-devel pipewire-devel \ + alsa-lib-devel pulseaudio-libs-devel pipewire-devel \ libX11-devel libXext-devel libXrandr-devel libXcursor-devel libXfixes-devel \ libXi-devel libXScrnSaver-devel dbus-devel ibus-devel \ systemd-devel mesa-libGL-devel libxkbcommon-devel mesa-libGLES-devel \ diff --git a/include/build_config/SDL_build_config.h.cmake b/include/build_config/SDL_build_config.h.cmake index c8c02894a1..a2fd8e1d78 100644 --- a/include/build_config/SDL_build_config.h.cmake +++ b/include/build_config/SDL_build_config.h.cmake @@ -231,6 +231,8 @@ #cmakedefine HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR 1 #cmakedefine HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR_NP 1 +#cmakedefine HAVE_DLOPEN_NOTES 1 + /* SDL internal assertion support */ #cmakedefine SDL_DEFAULT_ASSERT_LEVEL_CONFIGURED 1 #ifdef SDL_DEFAULT_ASSERT_LEVEL_CONFIGURED diff --git a/src/SDL_internal.h b/src/SDL_internal.h index a345252f3a..d0d1df58ba 100644 --- a/src/SDL_internal.h +++ b/src/SDL_internal.h @@ -63,6 +63,7 @@ #include "SDL_build_config.h" #include "dynapi/SDL_dynapi.h" +#include "dynapi/SDL_dynapi_dlopennote.h" #if SDL_DYNAMIC_API #include "dynapi/SDL_dynapi_overrides.h" diff --git a/src/audio/aaudio/SDL_aaudio.c b/src/audio/aaudio/SDL_aaudio.c index 5436be070a..644c224e30 100644 --- a/src/audio/aaudio/SDL_aaudio.c +++ b/src/audio/aaudio/SDL_aaudio.c @@ -53,6 +53,13 @@ struct SDL_PrivateAudioData #define LIB_AAUDIO_SO "libaaudio.so" +SDL_ELF_NOTE_DLOPEN(, + "audio-aaudio", + "Support for audio through AAudio", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + LIB_AAUDIO_SO +); + typedef struct AAUDIO_Data { SDL_SharedObject *handle; @@ -308,8 +315,8 @@ static bool BuildAAudioStream(SDL_AudioDevice *device) ctx.AAudioStreamBuilder_setFormat(builder, format); ctx.AAudioStreamBuilder_setSampleRate(builder, device->spec.freq); ctx.AAudioStreamBuilder_setChannelCount(builder, device->spec.channels); - - // If no specific buffer size has been requested, the device will pick the optimal + + // If no specific buffer size has been requested, the device will pick the optimal if(SDL_GetHint(SDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES)) { ctx.AAudioStreamBuilder_setBufferCapacityInFrames(builder, 2 * device->sample_frames); // AAudio requires that the buffer capacity is at least ctx.AAudioStreamBuilder_setFramesPerDataCallback(builder, device->sample_frames); // twice the size of the data callback buffer size diff --git a/src/audio/alsa/SDL_alsa_audio.c b/src/audio/alsa/SDL_alsa_audio.c index badbc43ec8..1ee89933ce 100644 --- a/src/audio/alsa/SDL_alsa_audio.c +++ b/src/audio/alsa/SDL_alsa_audio.c @@ -207,6 +207,13 @@ static bool load_alsa_syms(void) #ifdef SDL_AUDIO_DRIVER_ALSA_DYNAMIC +SDL_ELF_NOTE_DLOPEN( + "audio-libalsa", + "Support for audio through libalsa", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_AUDIO_DRIVER_ALSA_DYNAMIC +); + static void UnloadALSALibrary(void) { if (alsa_handle) { diff --git a/src/audio/jack/SDL_jackaudio.c b/src/audio/jack/SDL_jackaudio.c index 3ae5137a58..49dff5fc91 100644 --- a/src/audio/jack/SDL_jackaudio.c +++ b/src/audio/jack/SDL_jackaudio.c @@ -50,6 +50,13 @@ static bool load_jack_syms(void); #ifdef SDL_AUDIO_DRIVER_JACK_DYNAMIC +SDL_ELF_NOTE_DLOPEN( + "audio-libjack", + "Support for audio through libjack", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_AUDIO_DRIVER_JACK_DYNAMIC +); + static const char *jack_library = SDL_AUDIO_DRIVER_JACK_DYNAMIC; static SDL_SharedObject *jack_handle = NULL; diff --git a/src/audio/pipewire/SDL_pipewire.c b/src/audio/pipewire/SDL_pipewire.c index b934877b2c..fede5fbf35 100644 --- a/src/audio/pipewire/SDL_pipewire.c +++ b/src/audio/pipewire/SDL_pipewire.c @@ -93,6 +93,13 @@ static int (*PIPEWIRE_pw_properties_setf)(struct pw_properties *, const char *, #ifdef SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC +SDL_ELF_NOTE_DLOPEN( + "audio-libpipewire", + "Support for audio through libpipewire", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC +); + static const char *pipewire_library = SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC; static SDL_SharedObject *pipewire_handle = NULL; diff --git a/src/audio/pulseaudio/SDL_pulseaudio.c b/src/audio/pulseaudio/SDL_pulseaudio.c index 69e8c1a84c..4c6f427881 100644 --- a/src/audio/pulseaudio/SDL_pulseaudio.c +++ b/src/audio/pulseaudio/SDL_pulseaudio.c @@ -133,6 +133,13 @@ static bool load_pulseaudio_syms(void); #ifdef SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC +SDL_ELF_NOTE_DLOPEN( + "audio-libpulseaudio", + "Support for audio through libpulseaudio", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC +); + static const char *pulseaudio_library = SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC; static SDL_SharedObject *pulseaudio_handle = NULL; diff --git a/src/audio/sndio/SDL_sndioaudio.c b/src/audio/sndio/SDL_sndioaudio.c index a0d20209b5..1cc7ac7551 100644 --- a/src/audio/sndio/SDL_sndioaudio.c +++ b/src/audio/sndio/SDL_sndioaudio.c @@ -108,6 +108,13 @@ static bool load_sndio_syms(void) #ifdef SDL_AUDIO_DRIVER_SNDIO_DYNAMIC +SDL_ELF_NOTE_DLOPEN( + "audio-libsndio", + "Support for audio through libsndio", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_AUDIO_DRIVER_SNDIO_DYNAMIC +); + static void UnloadSNDIOLibrary(void) { if (sndio_handle) { diff --git a/src/camera/pipewire/SDL_camera_pipewire.c b/src/camera/pipewire/SDL_camera_pipewire.c index 255ea39ac4..81e83dca76 100644 --- a/src/camera/pipewire/SDL_camera_pipewire.c +++ b/src/camera/pipewire/SDL_camera_pipewire.c @@ -109,6 +109,13 @@ static int (*PIPEWIRE_pw_properties_setf)(struct pw_properties *, const char *, #ifdef SDL_CAMERA_DRIVER_PIPEWIRE_DYNAMIC +SDL_ELF_NOTE_DLOPEN( + "camera-libpipewire", + "Support for camera through libalsa", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_CAMERA_DRIVER_PIPEWIRE_DYNAMIC +); + static const char *pipewire_library = SDL_CAMERA_DRIVER_PIPEWIRE_DYNAMIC; static SDL_SharedObject *pipewire_handle = NULL; diff --git a/src/core/linux/SDL_dbus.c b/src/core/linux/SDL_dbus.c index b61a1cd920..e2770692d8 100644 --- a/src/core/linux/SDL_dbus.c +++ b/src/core/linux/SDL_dbus.c @@ -24,12 +24,20 @@ #ifdef SDL_USE_LIBDBUS // we never link directly to libdbus. -static const char *dbus_library = "libdbus-1.so.3"; +#define SDL_DRIVER_DBUS_DYNAMIC "libdbus-1.so.3" +static const char *dbus_library = SDL_DRIVER_DBUS_DYNAMIC; static SDL_SharedObject *dbus_handle = NULL; static char *inhibit_handle = NULL; static unsigned int screensaver_cookie = 0; static SDL_DBusContext dbus; +SDL_ELF_NOTE_DLOPEN( + "core-libdbus", + "Support for DBus RPC", + SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED, + SDL_DRIVER_DBUS_DYNAMIC +); + static bool LoadDBUSSyms(void) { #define SDL_DBUS_SYM2_OPTIONAL(TYPE, x, y) \ diff --git a/src/core/linux/SDL_udev.c b/src/core/linux/SDL_udev.c index 907c34c7f6..3a43eb27bd 100644 --- a/src/core/linux/SDL_udev.c +++ b/src/core/linux/SDL_udev.c @@ -38,6 +38,17 @@ static const char *SDL_UDEV_LIBS[] = { "libudev.so.1", "libudev.so.0" }; +#ifdef SDL_UDEV_DYNAMIC + +SDL_ELF_NOTE_DLOPEN( + "events-udev", + "Support for events through libudev", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_UDEV_DYNAMIC +); + +#endif + static SDL_UDEV_PrivateData *_this = NULL; static bool SDL_UDEV_load_sym(const char *fn, void **addr); diff --git a/src/dynapi/SDL_dynapi_dlopennote.h b/src/dynapi/SDL_dynapi_dlopennote.h new file mode 100644 index 0000000000..6018dc69ca --- /dev/null +++ b/src/dynapi/SDL_dynapi_dlopennote.h @@ -0,0 +1,98 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2025 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SDL_dynapi_dlopennote_h +#define SDL_dynapi_dlopennote_h + +#define SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED "required" +#define SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED "recommended" +#define SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED "suggested" + +#if defined(__ELF__) && defined(HAVE_DLOPEN_NOTES) + +#define SDL_ELF_NOTE_DLOPEN_VENDOR "FDO" +#define SDL_ELF_NOTE_DLOPEN_TYPE 0x407c0c0aU + +#define SDL_ELF_NOTE_INTERNAL2(json, variable_name) \ + __attribute__((aligned(4), used, section(".note.dlopen"))) \ + static const struct { \ + struct { \ + Uint32 n_namesz; \ + Uint32 n_descsz; \ + Uint32 n_type; \ + } nhdr; \ + char name[4]; \ + __attribute__((aligned(4))) char dlopen_json[sizeof(json)]; \ + } variable_name = { \ + { \ + sizeof(SDL_ELF_NOTE_DLOPEN_VENDOR), \ + sizeof(json), \ + SDL_ELF_NOTE_DLOPEN_TYPE \ + }, \ + SDL_ELF_NOTE_DLOPEN_VENDOR, \ + json \ + } + +#define SDL_ELF_NOTE_INTERNAL(json, variable_name) \ + SDL_ELF_NOTE_INTERNAL2(json, variable_name) + +#define SDL_SONAME_ARRAY1(N1) "[\"" N1 "\"]" +#define SDL_SONAME_ARRAY2(N1,N2) "[\"" N1 "\",\"" N2 "\"]" +#define SDL_SONAME_ARRAY3(N1,N2,N3) "[\"" N1 "\",\"" N2 "\",\"" N3 "\"]" +#define SDL_SONAME_ARRAY4(N1,N2,N3,N4) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\"]" +#define SDL_SONAME_ARRAY5(N1,N2,N3,N4,N5) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\",\"" N5 "\"]" +#define SDL_SONAME_ARRAY6(N1,N2,N3,N4,N5,N6) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\",\"" N5 "\",\"" N6 "\"]" +#define SDL_SONAME_ARRAY7(N1,N2,N3,N4,N5,N6,N7) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\",\"" N5 "\",\"" N6 "\",\"" N7 "\"]" +#define SDL_SONAME_ARRAY8(N1,N2,N3,N4,N5,N6,N7,N8) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\",\"" N5 "\",\"" N6 "\",\"" N7 "\",\"" N8 "\"]" +#define SDL_SONAME_ARRAY_GET(N1,N2,N3,N4,N5,N6,N7,N8,NAME,...) NAME +#define SDL_SONAME_ARRAY(...) \ + SDL_SONAME_ARRAY_GET(__VA_ARGS__, \ + SDL_SONAME_ARRAY8, \ + SDL_SONAME_ARRAY7, \ + SDL_SONAME_ARRAY6, \ + SDL_SONAME_ARRAY5, \ + SDL_SONAME_ARRAY4, \ + SDL_SONAME_ARRAY3, \ + SDL_SONAME_ARRAY2, \ + SDL_SONAME_ARRAY1 \ + )(__VA_ARGS__) + +// Create "unique" variable name using __LINE__, +// so creating elf notes on the same line is not supported +#define SDL_ELF_NOTE_JOIN2(A,B) A##B +#define SDL_ELF_NOTE_JOIN(A,B) SDL_ELF_NOTE_JOIN2(A,B) +#define SDL_ELF_NOTE_UNIQUE_NAME SDL_ELF_NOTE_JOIN(s_dlopen_note_, __LINE__) + +#define SDL_ELF_NOTE_DLOPEN(feature, description, priority, ...) \ + SDL_ELF_NOTE_INTERNAL( \ + "[{\"feature\":\"" feature \ + "\",\"description\":\"" description \ + "\",\"priority\":\"" priority \ + "\",\"soname\":" SDL_SONAME_ARRAY(__VA_ARGS__) "}]", \ + SDL_ELF_NOTE_UNIQUE_NAME) + +#else + +#define SDL_ELF_NOTE_DLOPEN(...) + +#endif + +#endif diff --git a/src/hidapi/SDL_hidapi.c b/src/hidapi/SDL_hidapi.c index a525f22391..07e1577013 100644 --- a/src/hidapi/SDL_hidapi.c +++ b/src/hidapi/SDL_hidapi.c @@ -40,6 +40,15 @@ #ifndef SDL_HIDAPI_DISABLED +#ifdef SDL_LIBUSB_DYNAMIC +SDL_ELF_NOTE_DLOPEN( + "hidabi-libusb", + "Support for joysticks through libusb", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_LIBUSB_DYNAMIC +); +#endif + #if defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_WINGDK) #include "../core/windows/SDL_windows.h" #endif diff --git a/src/io/io_uring/SDL_asyncio_liburing.c b/src/io/io_uring/SDL_asyncio_liburing.c index 07e8c2415c..ad8567d15d 100644 --- a/src/io/io_uring/SDL_asyncio_liburing.c +++ b/src/io/io_uring/SDL_asyncio_liburing.c @@ -44,9 +44,17 @@ static bool (*AsyncIOFromFile)(const char *file, const char *mode, SDL_AsyncIO * // we never link directly to liburing. // (this says "-ffi" which sounds like a scripting language binding thing, but the non-ffi version // is static-inline code we can't lookup with dlsym. This is by design.) -static const char *liburing_library = "liburing-ffi.so.2"; +#define SDL_DRIVER_LIBURING_DYNAMIC "liburing-ffi.so.2" +static const char *liburing_library = SDL_DRIVER_LIBURING_DYNAMIC; static void *liburing_handle = NULL; +SDL_ELF_NOTE_DLOPEN( + "io-io_uring", + "Support for async IO through liburing", + SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED, + SDL_DRIVER_LIBURING_DYNAMIC +); + #define SDL_LIBURING_FUNCS \ SDL_LIBURING_FUNC(int, io_uring_queue_init, (unsigned entries, struct io_uring *ring, unsigned flags)) \ SDL_LIBURING_FUNC(struct io_uring_probe *,io_uring_get_probe,(void)) \ diff --git a/src/storage/steam/SDL_steamstorage.c b/src/storage/steam/SDL_steamstorage.c index 8f735f84df..8f44667701 100644 --- a/src/storage/steam/SDL_steamstorage.c +++ b/src/storage/steam/SDL_steamstorage.c @@ -23,6 +23,23 @@ #include "../SDL_sysstorage.h" +#if defined(_WIN64) +#define SDL_DRIVER_STEAMAPI_DYNAMIC "steam_api64.dll" +#elif defined(_WIN32) +#define SDL_DRIVER_STEAMAPI_DYNAMIC "steam_api.dll" +#elif defined(__APPLE__) +#define SDL_DRIVER_STEAMAPI_DYNAMIC "libsteam_api.dylib" +#else +#define SDL_DRIVER_STEAMAPI_DYNAMIC "libsteam_api.so" +#endif + +SDL_ELF_NOTE_DLOPEN( + "storage-steam", + "Support for Steam storage", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_DRIVER_STEAMAPI_DYNAMIC +); + // !!! FIXME: Async API can use SteamRemoteStorage_ReadFileAsync // !!! FIXME: Async API can use SteamRemoteStorage_WriteFileAsync @@ -154,17 +171,7 @@ static SDL_Storage *STEAM_User_Create(const char *org, const char *app, SDL_Prop return NULL; } - steam->libsteam_api = SDL_LoadObject( -#if defined(_WIN64) - "steam_api64.dll" -#elif defined(_WIN32) - "steam_api.dll" -#elif defined(__APPLE__) - "libsteam_api.dylib" -#else - "libsteam_api.so" -#endif - ); + steam->libsteam_api = SDL_LoadObject(SDL_DRIVER_STEAMAPI_DYNAMIC); if (steam->libsteam_api == NULL) { SDL_free(steam); return NULL; diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c index 3d4df26073..301f959d58 100644 --- a/src/video/SDL_egl.c +++ b/src/video/SDL_egl.c @@ -110,6 +110,37 @@ #define DEFAULT_OGL_ES2 "libGLESv2.so.2" #define DEFAULT_OGL_ES_PVR "libGLES_CM.so.1" #define DEFAULT_OGL_ES "libGLESv1_CM.so.1" + +SDL_ELF_NOTE_DLOPEN( + "egl-opengl", + "Support for OpenGL", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + DEFAULT_OGL, ALT_OGL +); +SDL_ELF_NOTE_DLOPEN( + "egl-egl", + "Support for EGL", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + DEFAULT_EGL +); +SDL_ELF_NOTE_DLOPEN( + "egl-es2", + "Support for EGL ES2", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + DEFAULT_OGL_ES2 +); +SDL_ELF_NOTE_DLOPEN( + "egl-es-prv", + "Support for EGL ES PVR", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + DEFAULT_OGL_ES_PVR +); +SDL_ELF_NOTE_DLOPEN( + "egl-ogl-es", + "Support for OpenGL ES", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + DEFAULT_OGL_ES +); #endif // SDL_VIDEO_DRIVER_RPI #if defined(SDL_VIDEO_OPENGL) && !defined(SDL_VIDEO_VITA_PVR_OGL) diff --git a/src/video/kmsdrm/SDL_kmsdrmdyn.c b/src/video/kmsdrm/SDL_kmsdrmdyn.c index a532ceaf15..af8ffb6324 100644 --- a/src/video/kmsdrm/SDL_kmsdrmdyn.c +++ b/src/video/kmsdrm/SDL_kmsdrmdyn.c @@ -29,6 +29,13 @@ #ifdef SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC +SDL_ELF_NOTE_DLOPEN( + "video-kmsdrm", + "Support for KMSDRM", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC +); + typedef struct { void *lib; diff --git a/src/video/kmsdrm/SDL_kmsdrmvulkan.c b/src/video/kmsdrm/SDL_kmsdrmvulkan.c index d58277b789..37a1997841 100644 --- a/src/video/kmsdrm/SDL_kmsdrmvulkan.c +++ b/src/video/kmsdrm/SDL_kmsdrmvulkan.c @@ -42,6 +42,13 @@ #define DEFAULT_VULKAN "libvulkan.so.1" #endif +SDL_ELF_NOTE_DLOPEN( + "kmsdrm-vulkan", + "Support for Vulkan on KMSDRM", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + DEFAULT_VULKAN +); + bool KMSDRM_Vulkan_LoadLibrary(SDL_VideoDevice *_this, const char *path) { VkExtensionProperties *extensions = NULL; diff --git a/src/video/offscreen/SDL_offscreenvulkan.c b/src/video/offscreen/SDL_offscreenvulkan.c index b3dca4acba..ac1a84f102 100644 --- a/src/video/offscreen/SDL_offscreenvulkan.c +++ b/src/video/offscreen/SDL_offscreenvulkan.c @@ -42,6 +42,13 @@ static const char *s_defaultPaths[] = { #endif }; +SDL_ELF_NOTE_DLOPEN( + "offscreen-vulkan", + "Support for offscreen Vulkan", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + "libvulkan.so.1" +); + #if defined( SDL_PLATFORM_APPLE ) #include diff --git a/src/video/openvr/SDL_openvrvideo.c b/src/video/openvr/SDL_openvrvideo.c index a24cd02fbe..2198394098 100644 --- a/src/video/openvr/SDL_openvrvideo.c +++ b/src/video/openvr/SDL_openvrvideo.c @@ -53,6 +53,19 @@ struct SDL_GLContextState #include #endif +#ifdef SDL_PLATFORM_WINDOWS +#define SDL_OPENVR_DRIVER_DYNAMIC "openvr_api.dll" +#else +#define SDL_OPENVR_DRIVER_DYNAMIC "openvr_api.so" +#endif + +SDL_ELF_NOTE_DLOPEN( + "video-openvr + "Support for OpenVR video", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_OPENVR_DRIVER_DYNAMIC +); + #define MARKER_ID 0 #define MARKER_STR "vr-marker,frame_end,type,application" @@ -1474,6 +1487,7 @@ static SDL_VideoDevice *OPENVR_CreateDevice(void) { SDL_VideoDevice *device; SDL_VideoData *data; + const char *hint; #ifdef SDL_PLATFORM_WINDOWS SDL_RegisterApp(NULL, 0, NULL); @@ -1495,19 +1509,13 @@ static SDL_VideoDevice *OPENVR_CreateDevice(void) } device->internal = data; - { - const char * hint = SDL_GetHint(SDL_HINT_OPENVR_LIBRARY); - if (hint) - data->openVRLIB = SDL_LoadObject(hint); -#ifdef SDL_PLATFORM_WINDOWS - if (!data->openVRLIB) - data->openVRLIB = SDL_LoadObject("openvr_api.dll"); -#else - if (!data->openVRLIB) - data->openVRLIB = SDL_LoadObject("openvr_api.so"); -#endif + hint = SDL_GetHint(SDL_HINT_OPENVR_LIBRARY); + if (hint) { + data->openVRLIB = SDL_LoadObject(hint); + } + if (!data->openVRLIB) { + data->openVRLIB = SDL_LoadObject(SDL_OPENVR_DRIVER_DYNAMIC); } - if (!data->openVRLIB) { SDL_SetError("Could not open OpenVR API Library"); goto error; diff --git a/src/video/wayland/SDL_waylanddyn.c b/src/video/wayland/SDL_waylanddyn.c index 7d6d42f3f5..eebe64396e 100644 --- a/src/video/wayland/SDL_waylanddyn.c +++ b/src/video/wayland/SDL_waylanddyn.c @@ -28,36 +28,54 @@ #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC -typedef struct -{ - SDL_SharedObject *lib; - const char *libname; -} waylanddynlib; - -static waylanddynlib waylandlibs[] = { - { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC }, #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL - { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL }, +#define SDL_WAYLAND_EGL_APPEND ,SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL +#else +#define SDL_WAYLAND_EGL_APPEND #endif #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR - { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR }, +#define SDL_WAYLAND_CURSOR_APPEND ,SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR +#else +#define SDL_WAYLAND_CURSOR_APPEND #endif #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON - { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON }, +#define SDL_WAYLAND_XKBCOMMON_APPEND ,SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON +#else +#define SDL_WAYLAND_XKBCOMMON_APPEND #endif #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR - { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR }, +#define SDL_WAYLAND_LIBDECOR_APPEND ,SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR +#else +#define SDL_WAYLAND_LIBDECOR_APPEND #endif - { NULL, NULL } + +#define SDL_WAYLAND_DYNAMIC_LIBS \ + SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC \ + SDL_WAYLAND_EGL_APPEND \ + SDL_WAYLAND_CURSOR_APPEND \ + SDL_WAYLAND_XKBCOMMON_APPEND \ + SDL_WAYLAND_LIBDECOR_APPEND + +SDL_ELF_NOTE_DLOPEN( + "wayland", + "Support for Wayland video", + SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED, + SDL_WAYLAND_DYNAMIC_LIBS +); + +static const char *waylandlibnames[] = { + SDL_WAYLAND_DYNAMIC_LIBS }; +static SDL_SharedObject *waylandlibs[SDL_arraysize(waylandlibnames)]; + static void *WAYLAND_GetSym(const char *fnname, int *pHasModule, bool required) { + size_t i; void *fn = NULL; - waylanddynlib *dynlib; - for (dynlib = waylandlibs; dynlib->libname; dynlib++) { - if (dynlib->lib) { - fn = SDL_LoadFunction(dynlib->lib, fnname); + for (i = 0; i < SDL_arraysize(waylandlibnames); i++) { + if (waylandlibs[i]) { + fn = SDL_LoadFunction(waylandlibs[i], fnname); if (fn) { break; } @@ -112,9 +130,9 @@ void SDL_WAYLAND_UnloadSymbols(void) #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC for (i = 0; i < SDL_arraysize(waylandlibs); i++) { - if (waylandlibs[i].lib) { - SDL_UnloadObject(waylandlibs[i].lib); - waylandlibs[i].lib = NULL; + if (waylandlibs[i]) { + SDL_UnloadObject(waylandlibs[i]); + waylandlibs[i] = NULL; } } #endif @@ -132,10 +150,8 @@ bool SDL_WAYLAND_LoadSymbols(void) #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC int i; int *thismod = NULL; - for (i = 0; i < SDL_arraysize(waylandlibs); i++) { - if (waylandlibs[i].libname) { - waylandlibs[i].lib = SDL_LoadObject(waylandlibs[i].libname); - } + for (i = 0; i < SDL_arraysize(waylandlibnames); i++) { + waylandlibs[i] = SDL_LoadObject(waylandlibnames[i]); } #define SDL_WAYLAND_MODULE(modname) SDL_WAYLAND_HAVE_##modname = 1; // default yes diff --git a/src/video/wayland/SDL_waylandvulkan.c b/src/video/wayland/SDL_waylandvulkan.c index 956be4630e..2f9576d4c0 100644 --- a/src/video/wayland/SDL_waylandvulkan.c +++ b/src/video/wayland/SDL_waylandvulkan.c @@ -41,6 +41,13 @@ #define DEFAULT_VULKAN "libvulkan.so.1" #endif +SDL_ELF_NOTE_DLOPEN( + "wayland-vulkan", + "Support for Vulkan on wayland backend", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + DEFAULT_VULKAN +); + bool Wayland_Vulkan_LoadLibrary(SDL_VideoDevice *_this, const char *path) { VkExtensionProperties *extensions = NULL; diff --git a/src/video/x11/SDL_x11dyn.c b/src/video/x11/SDL_x11dyn.c index 116f5655e8..f8f67f65ab 100644 --- a/src/video/x11/SDL_x11dyn.c +++ b/src/video/x11/SDL_x11dyn.c @@ -32,52 +32,78 @@ #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC -typedef struct -{ - SDL_SharedObject *lib; - const char *libname; -} x11dynlib; - -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS NULL -#endif -#ifndef SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST -#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST NULL +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT +#define SDL_X11_DYNAMIC_XEXT_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT +#else +#define SDL_X11_DYNAMIC_XEXT_APPEND #endif -static x11dynlib x11libs[] = { - { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC }, - { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT }, - { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR }, - { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 }, - { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES }, - { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR }, - { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS }, - { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST } +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR +#define SDL_X11_DYNAMIC_XCURSOR_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR +#else +#define SDL_X11_DYNAMIC_XCURSOR_APPEND +#endif + +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 +#define SDL_X11_DYNAMIC_XINPUT2_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 +#else +#define SDL_X11_DYNAMIC_XINPUT2_APPEND +#endif + +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES +#define SDL_X11_DYNAMIC_XFIXES_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES +#else +#define SDL_X11_DYNAMIC_XFIXES_APPEND +#endif + +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR +#define SDL_X11_DYNAMIC_XRANDR_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR +#else +#define SDL_X11_DYNAMIC_XRANDR_APPEND +#endif + +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS +#define SDL_X11_DYNAMIC_XSS_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS +#else +#define SDL_X11_DYNAMIC_XSS_APPEND +#endif + +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST +#define SDL_X11_DYNAMIC_XTEST_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST +#else +#define SDL_X11_DYNAMIC_XTEST_APPEND +#endif + +#define SDL_X11_DYNAMIC_LIBS \ + SDL_VIDEO_DRIVER_X11_DYNAMIC \ + SDL_X11_DYNAMIC_XEXT_APPEND \ + SDL_X11_DYNAMIC_XCURSOR_APPEND \ + SDL_X11_DYNAMIC_XINPUT2_APPEND \ + SDL_X11_DYNAMIC_XFIXES_APPEND \ + SDL_X11_DYNAMIC_XRANDR_APPEND \ + SDL_X11_DYNAMIC_XSS_APPEND \ + SDL_X11_DYNAMIC_XTEST_APPEND + +SDL_ELF_NOTE_DLOPEN( + "x11", + "Support for video through X11 backend", + SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED, + SDL_X11_DYNAMIC_LIBS +); + +static const char *x11libnames[] = { + SDL_X11_DYNAMIC_LIBS }; +static SDL_SharedObject *x11libs[SDL_arraysize(x11libnames)]; + static void *X11_GetSym(const char *fnname, int *pHasModule) { int i; void *fn = NULL; for (i = 0; i < SDL_arraysize(x11libs); i++) { - if (x11libs[i].lib) { - fn = SDL_LoadFunction(x11libs[i].lib, fnname); + if (x11libs[i]) { + fn = SDL_LoadFunction(x11libs[i], fnname); if (fn) { break; } @@ -86,7 +112,7 @@ static void *X11_GetSym(const char *fnname, int *pHasModule) #if DEBUG_DYNAMIC_X11 if (fn) - printf("X11: Found '%s' in %s (%p)\n", fnname, x11libs[i].libname, fn); + printf("X11: Found '%s' in %s (%p)\n", fnname, x11libnames[i], fn); else printf("X11: Symbol '%s' NOT FOUND!\n", fnname); #endif @@ -133,9 +159,9 @@ void SDL_X11_UnloadSymbols(void) #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC for (i = 0; i < SDL_arraysize(x11libs); i++) { - if (x11libs[i].lib) { - SDL_UnloadObject(x11libs[i].lib); - x11libs[i].lib = NULL; + if (x11libs[i]) { + SDL_UnloadObject(x11libs[i]); + x11libs[i] = NULL; } } #endif @@ -154,9 +180,7 @@ bool SDL_X11_LoadSymbols(void) int i; int *thismod = NULL; for (i = 0; i < SDL_arraysize(x11libs); i++) { - if (x11libs[i].libname) { - x11libs[i].lib = SDL_LoadObject(x11libs[i].libname); - } + x11libs[i] = SDL_LoadObject(x11libnames[i]); } #define SDL_X11_MODULE(modname) SDL_X11_HAVE_##modname = 1; // default yes diff --git a/src/video/x11/SDL_x11vulkan.c b/src/video/x11/SDL_x11vulkan.c index 065549b86b..aac560293b 100644 --- a/src/video/x11/SDL_x11vulkan.c +++ b/src/video/x11/SDL_x11vulkan.c @@ -39,6 +39,13 @@ #define DEFAULT_X11_XCB "libX11-xcb.so.1" #endif +SDL_ELF_NOTE_DLOPEN( + "x11-vulkan", + "Support for vulkan on X11", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + DEFAULT_VULKAN, DEFAULT_X11_XCB +); + /* typedef uint32_t xcb_window_t; typedef uint32_t xcb_visualid_t; From 2dd1a80b147e9dcac76ad6628b16a6b7f518f354 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Mon, 19 May 2025 20:01:37 +0000 Subject: [PATCH 2/5] Typo fixes Co-authored-by: Ben Boeckel --- src/audio/aaudio/SDL_aaudio.c | 2 +- src/video/openvr/SDL_openvrvideo.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/audio/aaudio/SDL_aaudio.c b/src/audio/aaudio/SDL_aaudio.c index 644c224e30..8f3f00d3fa 100644 --- a/src/audio/aaudio/SDL_aaudio.c +++ b/src/audio/aaudio/SDL_aaudio.c @@ -53,7 +53,7 @@ struct SDL_PrivateAudioData #define LIB_AAUDIO_SO "libaaudio.so" -SDL_ELF_NOTE_DLOPEN(, +SDL_ELF_NOTE_DLOPEN( "audio-aaudio", "Support for audio through AAudio", SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, diff --git a/src/video/openvr/SDL_openvrvideo.c b/src/video/openvr/SDL_openvrvideo.c index 2198394098..9df1ff2677 100644 --- a/src/video/openvr/SDL_openvrvideo.c +++ b/src/video/openvr/SDL_openvrvideo.c @@ -60,7 +60,7 @@ struct SDL_GLContextState #endif SDL_ELF_NOTE_DLOPEN( - "video-openvr + "video-openvr", "Support for OpenVR video", SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, SDL_OPENVR_DRIVER_DYNAMIC From fc231761aceb1027fe5a3952702c191f0f03c00b Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 22 May 2025 17:45:02 +0200 Subject: [PATCH 3/5] Address review --- src/audio/pipewire/SDL_pipewire.c | 2 +- src/camera/pipewire/SDL_camera_pipewire.c | 2 +- src/core/linux/SDL_dbus.c | 2 +- src/core/linux/SDL_udev.c | 14 +- src/io/io_uring/SDL_asyncio_liburing.c | 2 +- src/storage/steam/SDL_steamstorage.c | 2 +- src/video/wayland/SDL_waylanddyn.c | 109 ++++++++------ src/video/x11/SDL_x11dyn.c | 165 +++++++++++++--------- 8 files changed, 181 insertions(+), 117 deletions(-) diff --git a/src/audio/pipewire/SDL_pipewire.c b/src/audio/pipewire/SDL_pipewire.c index fede5fbf35..320a326013 100644 --- a/src/audio/pipewire/SDL_pipewire.c +++ b/src/audio/pipewire/SDL_pipewire.c @@ -96,7 +96,7 @@ static int (*PIPEWIRE_pw_properties_setf)(struct pw_properties *, const char *, SDL_ELF_NOTE_DLOPEN( "audio-libpipewire", "Support for audio through libpipewire", - SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC ); diff --git a/src/camera/pipewire/SDL_camera_pipewire.c b/src/camera/pipewire/SDL_camera_pipewire.c index 81e83dca76..bd90eedb7b 100644 --- a/src/camera/pipewire/SDL_camera_pipewire.c +++ b/src/camera/pipewire/SDL_camera_pipewire.c @@ -111,7 +111,7 @@ static int (*PIPEWIRE_pw_properties_setf)(struct pw_properties *, const char *, SDL_ELF_NOTE_DLOPEN( "camera-libpipewire", - "Support for camera through libalsa", + "Support for camera through libpipewire", SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, SDL_CAMERA_DRIVER_PIPEWIRE_DYNAMIC ); diff --git a/src/core/linux/SDL_dbus.c b/src/core/linux/SDL_dbus.c index e2770692d8..762fbb3f50 100644 --- a/src/core/linux/SDL_dbus.c +++ b/src/core/linux/SDL_dbus.c @@ -33,7 +33,7 @@ static SDL_DBusContext dbus; SDL_ELF_NOTE_DLOPEN( "core-libdbus", - "Support for DBus RPC", + "Support for D-Bus IPC", SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED, SDL_DRIVER_DBUS_DYNAMIC ); diff --git a/src/core/linux/SDL_udev.c b/src/core/linux/SDL_udev.c index 3a43eb27bd..3aea729a54 100644 --- a/src/core/linux/SDL_udev.c +++ b/src/core/linux/SDL_udev.c @@ -36,19 +36,23 @@ #include "SDL_evdev_capabilities.h" #include "../unix/SDL_poll.h" -static const char *SDL_UDEV_LIBS[] = { "libudev.so.1", "libudev.so.0" }; +#define SDL_UDEV_FALLBACK_LIBS "libudev.so.1", "libudev.so.0" + +static const char *SDL_UDEV_LIBS[] = { SDL_UDEV_FALLBACK_LIBS }; #ifdef SDL_UDEV_DYNAMIC +#define SDL_UDEV_DLNOTE_LIBS SDL_UDEV_DYNAMIC, SDL_UDEV_FALLBACK_LIBS +#else +#define SDL_UDEV_DLNOTE_LIBS SDL_UDEV_FALLBACK_LIBS +#endif SDL_ELF_NOTE_DLOPEN( "events-udev", "Support for events through libudev", - SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, - SDL_UDEV_DYNAMIC + SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, + SDL_UDEV_DLNOTE_LIBS ); -#endif - static SDL_UDEV_PrivateData *_this = NULL; static bool SDL_UDEV_load_sym(const char *fn, void **addr); diff --git a/src/io/io_uring/SDL_asyncio_liburing.c b/src/io/io_uring/SDL_asyncio_liburing.c index ad8567d15d..d9c759798b 100644 --- a/src/io/io_uring/SDL_asyncio_liburing.c +++ b/src/io/io_uring/SDL_asyncio_liburing.c @@ -51,7 +51,7 @@ static void *liburing_handle = NULL; SDL_ELF_NOTE_DLOPEN( "io-io_uring", "Support for async IO through liburing", - SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED, + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, SDL_DRIVER_LIBURING_DYNAMIC ); diff --git a/src/storage/steam/SDL_steamstorage.c b/src/storage/steam/SDL_steamstorage.c index 8f44667701..2867bf40fe 100644 --- a/src/storage/steam/SDL_steamstorage.c +++ b/src/storage/steam/SDL_steamstorage.c @@ -35,7 +35,7 @@ SDL_ELF_NOTE_DLOPEN( "storage-steam", - "Support for Steam storage", + "Support for Steam user storage", SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, SDL_DRIVER_STEAMAPI_DYNAMIC ); diff --git a/src/video/wayland/SDL_waylanddyn.c b/src/video/wayland/SDL_waylanddyn.c index eebe64396e..293c43b775 100644 --- a/src/video/wayland/SDL_waylanddyn.c +++ b/src/video/wayland/SDL_waylanddyn.c @@ -28,54 +28,75 @@ #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC -#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL -#define SDL_WAYLAND_EGL_APPEND ,SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL -#else -#define SDL_WAYLAND_EGL_APPEND -#endif -#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR -#define SDL_WAYLAND_CURSOR_APPEND ,SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR -#else -#define SDL_WAYLAND_CURSOR_APPEND -#endif -#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON -#define SDL_WAYLAND_XKBCOMMON_APPEND ,SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON -#else -#define SDL_WAYLAND_XKBCOMMON_APPEND -#endif -#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR -#define SDL_WAYLAND_LIBDECOR_APPEND ,SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR -#else -#define SDL_WAYLAND_LIBDECOR_APPEND -#endif - -#define SDL_WAYLAND_DYNAMIC_LIBS \ - SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC \ - SDL_WAYLAND_EGL_APPEND \ - SDL_WAYLAND_CURSOR_APPEND \ - SDL_WAYLAND_XKBCOMMON_APPEND \ - SDL_WAYLAND_LIBDECOR_APPEND - SDL_ELF_NOTE_DLOPEN( "wayland", "Support for Wayland video", - SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED, - SDL_WAYLAND_DYNAMIC_LIBS + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC ); +#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL +SDL_ELF_NOTE_DLOPEN( + "wayland-egl", + "Support for Wayland video", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL +); +#endif +#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR +SDL_ELF_NOTE_DLOPEN( + "wayland-cursor", + "Support for Wayland video", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR +); +#endif +#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON +SDL_ELF_NOTE_DLOPEN( + "wayland-xkbcommon", + "Support for Wayland video", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON +); +#endif +#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR +SDL_ELF_NOTE_DLOPEN( + "wayland-libdecor", + "Support for Wayland video", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR +); +#endif -static const char *waylandlibnames[] = { - SDL_WAYLAND_DYNAMIC_LIBS +typedef struct +{ + SDL_SharedObject *lib; + const char *libname; +} waylanddynlib; + +static waylanddynlib waylandlibs[] = { + { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC }, +#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL + { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL }, +#endif +#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR + { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR }, +#endif +#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON + { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON }, +#endif +#ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR + { NULL, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR }, +#endif + { NULL, NULL } }; -static SDL_SharedObject *waylandlibs[SDL_arraysize(waylandlibnames)]; - static void *WAYLAND_GetSym(const char *fnname, int *pHasModule, bool required) { - size_t i; void *fn = NULL; - for (i = 0; i < SDL_arraysize(waylandlibnames); i++) { - if (waylandlibs[i]) { - fn = SDL_LoadFunction(waylandlibs[i], fnname); + waylanddynlib *dynlib; + for (dynlib = waylandlibs; dynlib->libname; dynlib++) { + if (dynlib->lib) { + fn = SDL_LoadFunction(dynlib->lib, fnname); if (fn) { break; } @@ -130,9 +151,9 @@ void SDL_WAYLAND_UnloadSymbols(void) #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC for (i = 0; i < SDL_arraysize(waylandlibs); i++) { - if (waylandlibs[i]) { - SDL_UnloadObject(waylandlibs[i]); - waylandlibs[i] = NULL; + if (waylandlibs[i].lib) { + SDL_UnloadObject(waylandlibs[i].lib); + waylandlibs[i].lib = NULL; } } #endif @@ -150,8 +171,10 @@ bool SDL_WAYLAND_LoadSymbols(void) #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC int i; int *thismod = NULL; - for (i = 0; i < SDL_arraysize(waylandlibnames); i++) { - waylandlibs[i] = SDL_LoadObject(waylandlibnames[i]); + for (i = 0; i < SDL_arraysize(waylandlibs); i++) { + if (waylandlibs[i].libname) { + waylandlibs[i].lib = SDL_LoadObject(waylandlibs[i].libname); + } } #define SDL_WAYLAND_MODULE(modname) SDL_WAYLAND_HAVE_##modname = 1; // default yes diff --git a/src/video/x11/SDL_x11dyn.c b/src/video/x11/SDL_x11dyn.c index f8f67f65ab..08f09ce82d 100644 --- a/src/video/x11/SDL_x11dyn.c +++ b/src/video/x11/SDL_x11dyn.c @@ -32,78 +32,113 @@ #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC -#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT -#define SDL_X11_DYNAMIC_XEXT_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT -#else -#define SDL_X11_DYNAMIC_XEXT_APPEND -#endif - -#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR -#define SDL_X11_DYNAMIC_XCURSOR_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR -#else -#define SDL_X11_DYNAMIC_XCURSOR_APPEND -#endif - -#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 -#define SDL_X11_DYNAMIC_XINPUT2_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 -#else -#define SDL_X11_DYNAMIC_XINPUT2_APPEND -#endif - -#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES -#define SDL_X11_DYNAMIC_XFIXES_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES -#else -#define SDL_X11_DYNAMIC_XFIXES_APPEND -#endif - -#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR -#define SDL_X11_DYNAMIC_XRANDR_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR -#else -#define SDL_X11_DYNAMIC_XRANDR_APPEND -#endif - -#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS -#define SDL_X11_DYNAMIC_XSS_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS -#else -#define SDL_X11_DYNAMIC_XSS_APPEND -#endif - -#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST -#define SDL_X11_DYNAMIC_XTEST_APPEND ,SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST -#else -#define SDL_X11_DYNAMIC_XTEST_APPEND -#endif - -#define SDL_X11_DYNAMIC_LIBS \ - SDL_VIDEO_DRIVER_X11_DYNAMIC \ - SDL_X11_DYNAMIC_XEXT_APPEND \ - SDL_X11_DYNAMIC_XCURSOR_APPEND \ - SDL_X11_DYNAMIC_XINPUT2_APPEND \ - SDL_X11_DYNAMIC_XFIXES_APPEND \ - SDL_X11_DYNAMIC_XRANDR_APPEND \ - SDL_X11_DYNAMIC_XSS_APPEND \ - SDL_X11_DYNAMIC_XTEST_APPEND +typedef struct { + SDL_SharedObject *lib; + const char *libname; +} x11dynlib; SDL_ELF_NOTE_DLOPEN( "x11", "Support for video through X11 backend", - SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED, - SDL_X11_DYNAMIC_LIBS + SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, + SDL_VIDEO_DRIVER_X11_DYNAMIC ); -static const char *x11libnames[] = { - SDL_X11_DYNAMIC_LIBS -}; +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT +SDL_ELF_NOTE_DLOPEN( + "x11-xcursor", + "Support for video through X11 backend", + SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, + SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT +); +#else +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT NULL +#endif -static SDL_SharedObject *x11libs[SDL_arraysize(x11libnames)]; +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR +SDL_ELF_NOTE_DLOPEN( + "x11-xext", + "Support for video through X11 backend", + SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, + SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR +); +#else +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR NULL +#endif + +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 +SDL_ELF_NOTE_DLOPEN( + "x11-xinput2", + "Support for video through X11 backend", + SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, + SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 +); +#else +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 NULL +#endif + +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES +SDL_ELF_NOTE_DLOPEN( + "x11-xfixes", + "Support for video through X11 backend", + SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, + SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES +); +#else +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES NULL +#endif + +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR +SDL_ELF_NOTE_DLOPEN( + "x11-xrandr", + "Support for video through X11 backend", + SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, + SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR +); +#else +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR NULL +#endif + +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS +SDL_ELF_NOTE_DLOPEN( + "x11-xss", + "Support for video through X11 backend", + SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, + SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS +); +#else +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS NULL +#endif + +#ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST +SDL_ELF_NOTE_DLOPEN( + "x11-xtest", + "Support for video through X11 backend", + SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, + SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST +); +#else +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST NULL +#endif + +static x11dynlib x11libs[] = { + { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC }, + { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT }, + { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR }, + { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 }, + { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES }, + { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR }, + { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS }, + { NULL, SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST } +}; static void *X11_GetSym(const char *fnname, int *pHasModule) { int i; void *fn = NULL; for (i = 0; i < SDL_arraysize(x11libs); i++) { - if (x11libs[i]) { - fn = SDL_LoadFunction(x11libs[i], fnname); + if (x11libs[i].lib) { + fn = SDL_LoadFunction(x11libs[i].lib, fnname); if (fn) { break; } @@ -112,7 +147,7 @@ static void *X11_GetSym(const char *fnname, int *pHasModule) #if DEBUG_DYNAMIC_X11 if (fn) - printf("X11: Found '%s' in %s (%p)\n", fnname, x11libnames[i], fn); + printf("X11: Found '%s' in %s (%p)\n", fnname, x11libs[i].libname, fn); else printf("X11: Symbol '%s' NOT FOUND!\n", fnname); #endif @@ -159,9 +194,9 @@ void SDL_X11_UnloadSymbols(void) #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC for (i = 0; i < SDL_arraysize(x11libs); i++) { - if (x11libs[i]) { - SDL_UnloadObject(x11libs[i]); - x11libs[i] = NULL; + if (x11libs[i].lib) { + SDL_UnloadObject(x11libs[i].lib); + x11libs[i].lib = NULL; } } #endif @@ -180,7 +215,9 @@ bool SDL_X11_LoadSymbols(void) int i; int *thismod = NULL; for (i = 0; i < SDL_arraysize(x11libs); i++) { - x11libs[i] = SDL_LoadObject(x11libnames[i]); + if (x11libs[i].libname) { + x11libs[i].lib = SDL_LoadObject(x11libs[i].libname); + } } #define SDL_X11_MODULE(modname) SDL_X11_HAVE_##modname = 1; // default yes From 38e58dc8b20228c8ad02143462f8f3bdd919d71a Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 22 May 2025 19:02:20 +0200 Subject: [PATCH 4/5] Address review --- src/core/linux/SDL_dbus.c | 2 +- src/video/SDL_egl.c | 2 +- src/video/wayland/SDL_waylanddyn.c | 8 ++++---- src/video/x11/SDL_x11dyn.c | 17 +++++++++-------- src/video/x11/SDL_x11vulkan.c | 9 ++++++++- 5 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/core/linux/SDL_dbus.c b/src/core/linux/SDL_dbus.c index 762fbb3f50..b675f18724 100644 --- a/src/core/linux/SDL_dbus.c +++ b/src/core/linux/SDL_dbus.c @@ -34,7 +34,7 @@ static SDL_DBusContext dbus; SDL_ELF_NOTE_DLOPEN( "core-libdbus", "Support for D-Bus IPC", - SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED, + SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, SDL_DRIVER_DBUS_DYNAMIC ); diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c index 301f959d58..4cf7712e31 100644 --- a/src/video/SDL_egl.c +++ b/src/video/SDL_egl.c @@ -130,7 +130,7 @@ SDL_ELF_NOTE_DLOPEN( DEFAULT_OGL_ES2 ); SDL_ELF_NOTE_DLOPEN( - "egl-es-prv", + "egl-es-pvr", "Support for EGL ES PVR", SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, DEFAULT_OGL_ES_PVR diff --git a/src/video/wayland/SDL_waylanddyn.c b/src/video/wayland/SDL_waylanddyn.c index 293c43b775..e45a96fb53 100644 --- a/src/video/wayland/SDL_waylanddyn.c +++ b/src/video/wayland/SDL_waylanddyn.c @@ -36,7 +36,7 @@ SDL_ELF_NOTE_DLOPEN( ); #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL SDL_ELF_NOTE_DLOPEN( - "wayland-egl", + "wayland", "Support for Wayland video", SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL @@ -44,7 +44,7 @@ SDL_ELF_NOTE_DLOPEN( #endif #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR SDL_ELF_NOTE_DLOPEN( - "wayland-cursor", + "wayland", "Support for Wayland video", SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR @@ -52,7 +52,7 @@ SDL_ELF_NOTE_DLOPEN( #endif #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON SDL_ELF_NOTE_DLOPEN( - "wayland-xkbcommon", + "wayland", "Support for Wayland video", SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON @@ -60,7 +60,7 @@ SDL_ELF_NOTE_DLOPEN( #endif #ifdef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR SDL_ELF_NOTE_DLOPEN( - "wayland-libdecor", + "wayland", "Support for Wayland video", SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR diff --git a/src/video/x11/SDL_x11dyn.c b/src/video/x11/SDL_x11dyn.c index 08f09ce82d..efab3f72b4 100644 --- a/src/video/x11/SDL_x11dyn.c +++ b/src/video/x11/SDL_x11dyn.c @@ -32,7 +32,8 @@ #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC -typedef struct { +typedef struct +{ SDL_SharedObject *lib; const char *libname; } x11dynlib; @@ -46,7 +47,7 @@ SDL_ELF_NOTE_DLOPEN( #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT SDL_ELF_NOTE_DLOPEN( - "x11-xcursor", + "x11", "Support for video through X11 backend", SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT @@ -57,7 +58,7 @@ SDL_ELF_NOTE_DLOPEN( #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR SDL_ELF_NOTE_DLOPEN( - "x11-xext", + "x11", "Support for video through X11 backend", SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR @@ -68,7 +69,7 @@ SDL_ELF_NOTE_DLOPEN( #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 SDL_ELF_NOTE_DLOPEN( - "x11-xinput2", + "x11", "Support for video through X11 backend", SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 @@ -79,7 +80,7 @@ SDL_ELF_NOTE_DLOPEN( #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES SDL_ELF_NOTE_DLOPEN( - "x11-xfixes", + "x11", "Support for video through X11 backend", SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES @@ -90,7 +91,7 @@ SDL_ELF_NOTE_DLOPEN( #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR SDL_ELF_NOTE_DLOPEN( - "x11-xrandr", + "x11", "Support for video through X11 backend", SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR @@ -101,7 +102,7 @@ SDL_ELF_NOTE_DLOPEN( #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS SDL_ELF_NOTE_DLOPEN( - "x11-xss", + "x11", "Support for video through X11 backend", SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS @@ -112,7 +113,7 @@ SDL_ELF_NOTE_DLOPEN( #ifdef SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST SDL_ELF_NOTE_DLOPEN( - "x11-xtest", + "x11", "Support for video through X11 backend", SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, SDL_VIDEO_DRIVER_X11_DYNAMIC_XTEST diff --git a/src/video/x11/SDL_x11vulkan.c b/src/video/x11/SDL_x11vulkan.c index aac560293b..c6851fe080 100644 --- a/src/video/x11/SDL_x11vulkan.c +++ b/src/video/x11/SDL_x11vulkan.c @@ -43,7 +43,14 @@ SDL_ELF_NOTE_DLOPEN( "x11-vulkan", "Support for vulkan on X11", SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, - DEFAULT_VULKAN, DEFAULT_X11_XCB + DEFAULT_VULKAN +); + +SDL_ELF_NOTE_DLOPEN( + "x11-vulkan", + "Support for vulkan on X11", + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, + DEFAULT_X11_XCB ); /* From 5610b6aedf9e44824d007b526e2fc4904c9582c5 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 22 May 2025 19:29:00 +0200 Subject: [PATCH 5/5] audio-pipewire: back to suggested --- src/audio/pipewire/SDL_pipewire.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/audio/pipewire/SDL_pipewire.c b/src/audio/pipewire/SDL_pipewire.c index 320a326013..fede5fbf35 100644 --- a/src/audio/pipewire/SDL_pipewire.c +++ b/src/audio/pipewire/SDL_pipewire.c @@ -96,7 +96,7 @@ static int (*PIPEWIRE_pw_properties_setf)(struct pw_properties *, const char *, SDL_ELF_NOTE_DLOPEN( "audio-libpipewire", "Support for audio through libpipewire", - SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED, + SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED, SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC );