Add support for SDL3 joystick input driver

Made possible by EIREXE, xsellier and the SDL team.

This commit includes statically linked SDL3 for Windows, Linux and macOS.
The vendored copy of SDL3 was setup to only build the required subsystems
for gamepad/joystick support, with some patches to be able to make it as
minimal as possible and reduce the impact on binary size and code size.

Co-authored-by: Álex Román Núñez <eirexe123@gmail.com>
Co-authored-by: Xavier Sellier <xsellier@gmail.com>
Co-authored-by: Rémi Verschelde <rverschelde@gmail.com>
This commit is contained in:
Nintorch
2025-05-28 14:22:20 +05:00
committed by Rémi Verschelde
parent 987832be46
commit 0b3496fb4f
330 changed files with 154930 additions and 1561 deletions

209
drivers/sdl/SCsub Normal file
View File

@@ -0,0 +1,209 @@
#!/usr/bin/env python
from misc.utility.scons_hints import *
Import("env")
env_sdl = env.Clone()
# Thirdparty source files
thirdparty_obj = []
if env["builtin_sdl"]:
thirdparty_dir = "#thirdparty/sdl/"
# Use our own SDL_build_config_private.h.
env_sdl.Prepend(CPPDEFINES=["SDL_PLATFORM_PRIVATE"])
# Common sources.
env_sdl.Prepend(
CPPPATH=[
thirdparty_dir,
thirdparty_dir + "include",
thirdparty_dir + "include/build_config",
".", # SDL_build_config_private.h
]
)
thirdparty_sources = [
"SDL.c",
"SDL_assert.c",
"SDL_error.c",
"SDL_guid.c",
"SDL_hashtable.c",
"SDL_hints.c",
"SDL_list.c",
"SDL_log.c",
"SDL_properties.c",
"SDL_utils.c",
"atomic/SDL_atomic.c",
"atomic/SDL_spinlock.c",
"events/SDL_events.c",
"events/SDL_eventwatch.c",
"haptic/SDL_haptic.c",
"io/SDL_iostream.c",
"joystick/SDL_gamepad.c",
"joystick/SDL_joystick.c",
"joystick/SDL_steam_virtual_gamepad.c",
"joystick/controller_type.c",
"libm/e_atan2.c",
"libm/e_exp.c",
"libm/e_fmod.c",
"libm/e_log.c",
"libm/e_log10.c",
"libm/e_pow.c",
"libm/e_rem_pio2.c",
"libm/e_sqrt.c",
"libm/k_cos.c",
"libm/k_rem_pio2.c",
"libm/k_sin.c",
"libm/k_tan.c",
"libm/s_atan.c",
"libm/s_copysign.c",
"libm/s_cos.c",
"libm/s_fabs.c",
"libm/s_floor.c",
"libm/s_isinf.c",
"libm/s_isinff.c",
"libm/s_isnan.c",
"libm/s_isnanf.c",
"libm/s_modf.c",
"libm/s_scalbn.c",
"libm/s_sin.c",
"libm/s_tan.c",
"sensor/SDL_sensor.c",
"sensor/dummy/SDL_dummysensor.c",
"stdlib/SDL_crc16.c",
"stdlib/SDL_crc32.c",
"stdlib/SDL_getenv.c",
"stdlib/SDL_iconv.c",
"stdlib/SDL_malloc.c",
"stdlib/SDL_memcpy.c",
"stdlib/SDL_memmove.c",
"stdlib/SDL_memset.c",
"stdlib/SDL_mslibc.c",
"stdlib/SDL_murmur3.c",
"stdlib/SDL_qsort.c",
"stdlib/SDL_random.c",
"stdlib/SDL_stdlib.c",
"stdlib/SDL_string.c",
"stdlib/SDL_strtokr.c",
"thread/SDL_thread.c",
"thread/generic/SDL_syscond.c",
"thread/generic/SDL_sysrwlock.c",
"thread/generic/SDL_systhread.c",
"timer/SDL_timer.c",
]
# HIDAPI
thirdparty_sources += [
"hidapi/SDL_hidapi.c",
"joystick/hidapi/SDL_hidapi_combined.c",
"joystick/hidapi/SDL_hidapi_gamecube.c",
"joystick/hidapi/SDL_hidapijoystick.c",
"joystick/hidapi/SDL_hidapi_luna.c",
"joystick/hidapi/SDL_hidapi_ps3.c",
"joystick/hidapi/SDL_hidapi_ps4.c",
"joystick/hidapi/SDL_hidapi_ps5.c",
"joystick/hidapi/SDL_hidapi_rumble.c",
"joystick/hidapi/SDL_hidapi_shield.c",
"joystick/hidapi/SDL_hidapi_stadia.c",
"joystick/hidapi/SDL_hidapi_steam.c",
"joystick/hidapi/SDL_hidapi_steamdeck.c",
"joystick/hidapi/SDL_hidapi_steam_hori.c",
"joystick/hidapi/SDL_hidapi_switch.c",
"joystick/hidapi/SDL_hidapi_wii.c",
"joystick/hidapi/SDL_hidapi_xbox360.c",
"joystick/hidapi/SDL_hidapi_xbox360w.c",
"joystick/hidapi/SDL_hidapi_xboxone.c",
]
# Platform specific sources.
if env["platform"] == "linuxbsd":
# TODO: Check support for BSD systems.
env_sdl.Append(CPPDEFINES=["SDL_PLATFORM_LINUX"])
thirdparty_sources += [
"core/linux/SDL_dbus.c",
"core/linux/SDL_evdev.c",
"core/linux/SDL_evdev_capabilities.c",
"core/linux/SDL_evdev_kbd.c",
"core/linux/SDL_fcitx.c",
"core/linux/SDL_ibus.c",
"core/linux/SDL_ime.c",
"core/linux/SDL_system_theme.c",
"core/linux/SDL_threadprio.c",
"core/linux/SDL_udev.c",
"core/unix/SDL_appid.c",
"core/unix/SDL_poll.c",
"haptic/linux/SDL_syshaptic.c",
"joystick/linux/SDL_sysjoystick.c",
"loadso/dlopen/SDL_sysloadso.c",
"thread/pthread/SDL_syscond.c",
"thread/pthread/SDL_sysmutex.c",
"thread/pthread/SDL_sysrwlock.c",
"thread/pthread/SDL_syssem.c",
"thread/pthread/SDL_systhread.c",
"thread/pthread/SDL_systls.c",
"timer/unix/SDL_systimer.c",
]
elif env["platform"] == "macos":
env_sdl.Append(CPPDEFINES=["SDL_PLATFORM_MACOS"])
thirdparty_sources += [
"core/unix/SDL_appid.c",
"core/unix/SDL_poll.c",
"haptic/darwin/SDL_syshaptic.c",
"joystick/darwin/SDL_iokitjoystick.c",
"joystick/apple/SDL_mfijoystick.m",
"thread/pthread/SDL_syscond.c",
"thread/pthread/SDL_sysmutex.c",
"thread/pthread/SDL_sysrwlock.c",
"thread/pthread/SDL_syssem.c",
"thread/pthread/SDL_systhread.c",
"thread/pthread/SDL_systls.c",
"timer/unix/SDL_systimer.c",
]
elif env["platform"] == "windows":
env_sdl.Append(CPPDEFINES=["SDL_PLATFORM_WINDOWS"])
thirdparty_sources += [
"core/windows/SDL_gameinput.c",
"core/windows/SDL_hid.c",
"core/windows/SDL_immdevice.c",
"core/windows/SDL_windows.c",
"core/windows/SDL_xinput.c",
"core/windows/pch.c",
"haptic/windows/SDL_dinputhaptic.c",
"haptic/windows/SDL_windowshaptic.c",
"joystick/windows/SDL_dinputjoystick.c",
"joystick/windows/SDL_rawinputjoystick.c",
"joystick/windows/SDL_windows_gaming_input.c",
"joystick/windows/SDL_windowsjoystick.c",
"joystick/windows/SDL_xinputjoystick.c",
"thread/windows/SDL_syscond_cv.c",
"thread/windows/SDL_sysmutex.c",
"thread/windows/SDL_sysrwlock_srw.c",
"thread/windows/SDL_syssem.c",
"thread/windows/SDL_systhread.c",
"thread/windows/SDL_systls.c",
"timer/windows/SDL_systimer.c",
]
thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources]
env_thirdparty = env_sdl.Clone()
env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.drivers_sources += thirdparty_obj
# Godot source files
driver_obj = []
env_sdl.add_source_files(driver_obj, "*.cpp")
env.drivers_sources += driver_obj
# Needed to force rebuilding the driver files when the thirdparty library is updated.
env.Depends(driver_obj, thirdparty_obj)