Libraries we need to Thunk
Libraries we need for performance reasons
- libGL
- libz
- libpng
- libSSL (mbedTLS and OpenSSL?)
Libraries we need for compatibility reasons
- steam client libraries?
- libGLX?
Add more here
(Removed myself as I'm not in thunks for now)
libm would be interesting
libopenal?
libfmod might be interesting as closed source to closed source thunking support.
libvulkan directly instead of the device drivers. At the very least will resolve a hang in current vulkan thunking but also will mean we don't need to generate a device thunk per driver. A lot of the work for the device drivers can be reused for the libvulkan loader.
After some more thorough investigation on how GLX and EGL are implemented under the hood, it looks like we don't need to thunk X11 or Wayland by doing a secondary connection to the display server for GLX or EGL purposes.
While I thought that doing this on GLX is a bit of a hack, EGL will use parallel connections both for X11 and Wayland to handle eglGetDisplay(EGL_DEFAULT_DISPLAY) and uses dri2_egl_display::own_device to track this.
For X11, see https://github.com/mesa3d/mesa/blob/6f4b5fb67507b607d61ab8316dfa3bbc4bab6498/src/egl/drivers/dri2/platform_x11.c#L1327.
For wayland, see https://github.com/mesa3d/mesa/blob/6f4b5fb67507b607d61ab8316dfa3bbc4bab6498/src/egl/drivers/dri2/platform_wayland.c#L2681.
Also, detecting the platform from the native display is done in an interesting (scary?) way we can reuse, https://github.com/mesa3d/mesa/blob/3415bf0268884bf3c16d495a4e1afd30d67bc71d/src/egl/main/egldisplay.c#L129
Related: #1728
Chromium, and hopefully no one other, buypasses libGLX and directly assembles the GLX X11 requests and sends them over with xcb.
Chromium's Glx::GetFBConfigs that hand assembles the GLX request https://github.com/chromium/chromium/blob/main/ui/gfx/x/generated_protos/glx.cc#L2015
Chromium's Connection::SendRequest that uses xcb to send raw requests
https://github.com/chromium/chromium/blob/main/ui/gfx/x/connection.cc#L529
GLX Wire format: https://www.khronos.org/registry/OpenGL/specs/gl/glxencode1.3.pdf
At least xcb is used and is not bypassed there too.
This makes our GLX thunks... more involved, and may or may not be a problem.
libGLX is still used for most other thinks (and hardware initialization)
Interesting links:
https://xcb.freedesktop.org/opengl/
https://stackoverflow.com/questions/41069032/if-pure-xcb-opengl-is-impossible-then-whats-the-use-of-the-xcb-glx-api-found
Leaving it here as a note, we should also test for libraries brought in through DT_NEEDED for compatibility reasons (see #1880 for an example of why this is a good idea). readelf -d can help is enforce/validate this as part of the build.
While at it, we should validate SONAME as well.
kmp@mangie:~/projects/FEX/build$ readelf -d /lib/x86_64-linux-gnu/libGLX.so
Dynamic section at offset 0x21da0 contains 29 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libGLdispatch.so.0]
0x0000000000000001 (NEEDED) Shared library: [libX11.so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000e (SONAME) Library soname: [libGLX.so.0]