Development:Setting up Thunks
Build instructions
Build dependencies
- g++-x86-64-linux-gnu (For building thunks)
- pkg-config
- libclang-dev
- libssl-dev
- Development packages for thunked libraries:
- libdrm-dev
- libxcb-present-dev
- libxcb-dri2-0-dev
- libxcb-dri3-dev
- libxcb-glx0-dev
- libxcb-shm0-dev
- libxshmfence-dev
Fedora dependencies
- libXext-devel
- libXfixes-devel
- libXrender-devel
- libXrandr-devel
- alsa-lib-devel
- libxcb-devel
- libxshmfence-devel
- libdrm-devel
- xorg-x11-server-devel
Setting CMake to build thunks
Pass in to CMake the option to enable thunk building.
- -DBUILD_THUNKS=True
Configuration
FEXConfig can be used to enable/disable individual libraries.
Advanced configuration
FEX thunk options
- FEX_THUNKHOSTLIBS, -t <Thunk Host Libs Path>, --thunkhostlibs=<Thunk Host Libs path>, JSON: ThunkHostLibs:<Path>
- Folder to find the host-side thunking libraries.
- FEX by default installs these files to: /usr/lib/fex-emu/HostThunks/
- FEX_THUNKGUESTLIBS, -j <Thunk Host Libs Path>, --thunkguestlibs=<Thunk Host Libs path>, JSON: ThunkGuestLibs:<Path>
- Folder to find the guest-side thunking libraries.
- FEX by default installs these files to: /usr/share/fex-emu/GuestThunks/
- FEX_THUNKCONFIG, -k <Thunk Config json path>, --thunkconfig=<Thunk Config json path>, JSON: ThunkConfig:<Path>
- A json file specifying where to overlay the thunks.
- If the filename isn't a path then FEX will search for the file in $HOME/.fex-emu/ThunkConfigs/
How to use Thunks
You can can set the three configuration options to custom paths
- The user can likely set ThunkHostLibs and ThunkGuestLibs to the global install path
- Unless these are set in the ThunkConfig file, these will be unused
- Overriding these to another location is useful for application specific hacks if necessary
Thunks Database format
FEX provides a ThunksDB.json file which allows the user to describe a thunk mapping. $prefix/share/fex-emu/ThunksDB.json
The user can also provide a $HOME/.fex-emu/ThunksDB.json which will overlay the system installed path
This allows the user to configure the thunk file mapping once, since it is unlikely to change between applications. The user can also mix and match ThunksDB and regular thunks configuration if a complex configuration is necessary.
- ThunksDB.json example
{ "DB": { "<User Defined Name>": { "Library": "<Guest Library Name>.so", "Depends": [ "<Other User Defined Name>" ], "Overlay": [ "<System Library Path to library>" ] } } }
Look at the FEX provided library for a real implementation, or just use the provided configuration.
Once the user has a viable ThunksDB provided, now configure FEX with a ThunkConfig filepath with the application thunk configuration.
This thunks configuration file can now enable Thunk definitions using the user defined names.
Per-app overrides
- Filename in $HOME/.fex-emu/AppConfig/Balatro.exe.json
- Change the filename as necessary for your application
{ "ThunksDB": { "GL": 1, "Vulkan": 1 } }
Further notes
Limitations and problems
- For 32-bit applications, libGL is the only library that can use the host variant currently