Use the Microsoft provided GameInputCreate() function (#15797)

It does better version checking and has better compatibility.

This also fixes a crash in GameInputRedist.dll when attempting to load v3 when v2 is installed on the system. In this case, a thread is created in GameInputCreate() which is not cleaned up when the object is released, and can crash later with a NULL pointer dereference.
This commit is contained in:
Sam Lantinga
2026-06-10 12:57:43 -07:00
committed by GitHub
parent 10620ec33e
commit 36f621842b
11 changed files with 124 additions and 62 deletions

View File

@@ -12,7 +12,6 @@ from typing import Optional
logger = logging.getLogger(__name__)
WINDOWS_GAMEINPUT_VERSION = "v3.3.195.0 "
class AppleArch(Enum):
Aarch64 = "aarch64"
@@ -222,7 +221,8 @@ class JobDetails:
msys2_packages: list[str] = dataclasses.field(default_factory=list)
cygwin_packages: list[str] = dataclasses.field(default_factory=list)
werror: bool = True
microsoft_gameinput_version: str = ""
microsoft_gameinput: bool = False
microsoft_gameinput_arch: str = ""
msvc_vcvars_arch: str = ""
msvc_vcvars_sdk: str = ""
msvc_project: str = ""
@@ -293,7 +293,8 @@ class JobDetails:
"android-mk": self.android_mk,
"werror": self.werror,
"sudo": self.sudo,
"microsoft-gameinput-version": self.microsoft_gameinput_version,
"microsoft-gameinput": self.microsoft_gameinput,
"microsoft-gameinput-arch": self.microsoft_gameinput_arch,
"msvc-vcvars-arch": self.msvc_vcvars_arch,
"msvc-vcvars-sdk": self.msvc_vcvars_sdk,
"msvc-project": self.msvc_project,
@@ -445,9 +446,14 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool, ctest_args
job.setup_libusb_arch = "x86"
case MsvcArch.X64:
job.setup_libusb_arch = "x64"
job.microsoft_gameinput_version = WINDOWS_GAMEINPUT_VERSION
job.cflags.append("-I$GAMEINPUT_INCLUDE")
job.cxxflags.append("-I$GAMEINPUT_INCLUDE")
job.microsoft_gameinput = True
match spec.msvc_arch:
case MsvcArch.X64:
job.microsoft_gameinput_arch = "x64"
case MsvcArch.Arm64:
job.microsoft_gameinput_arch = "arm64"
job.cflags.append("-I$GAMEINPUT_INCLUDE")
job.cxxflags.append("-I$GAMEINPUT_INCLUDE")
case SdlPlatform.Linux:
if spec.name.startswith("Ubuntu"):
assert spec.os.value.startswith("ubuntu-")
@@ -775,7 +781,7 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool, ctest_args
job.msys2_packages.append(f"{msys2_env}-clang-tools-extra")
if job.ccache:
job.msys2_packages.append(f"{msys2_env}-ccache")
job.microsoft_gameinput_version = WINDOWS_GAMEINPUT_VERSION
job.microsoft_gameinput = True
job.cflags.append("-I$GAMEINPUT_INCLUDE")
job.cxxflags.append("-I$GAMEINPUT_INCLUDE")
case SdlPlatform.Cygwin:

View File

@@ -173,14 +173,12 @@ jobs:
done
done
- name: 'Set up Microsoft.GameInput headers'
if: ${{ matrix.platform.microsoft-gameinput-version != '' }}
if: ${{ !!matrix.platform.microsoft-gameinput }}
run: |
python build-scripts/download-gameinput-headers.py \
--version ${{ matrix.platform.microsoft-gameinput-version }} \
-o $HOME/gameinput
echo "GAMEINPUT_INCLUDE=$(cygpath -w "$HOME/gameinput")" >>$GITHUB_ENV
echo "INCLUDE=$INCLUDE;$(cygpath -w "$HOME/gameinput")" >>$GITHUB_ENV
python build-scripts/download-gameinput-sdk.py -o $HOME/gameinput
echo "GAMEINPUT_INCLUDE=$(cygpath -w "$HOME/gameinput/include")" >>$GITHUB_ENV
echo "INCLUDE=$(cygpath -w "$HOME/gameinput/include");$INCLUDE" >>$GITHUB_ENV
${{ (!!matrix.platform.microsoft-gameinput-arch && format('echo "LIB=$(cygpath -w "$HOME/gameinput/lib/{0}");$LIB" >>$GITHUB_ENV', matrix.platform.microsoft-gameinput-arch)) || '' }}
- name: 'Calculate ccache key'
if: ${{ matrix.platform.ccache }}
id: prepare-restore-ccache
@@ -439,6 +437,7 @@ jobs:
path: |
build/dist/SDL3*
build/include*
build/CMakeFiles/CMakeConfigureLog.yaml
- name: 'Upload minidumps'
uses: actions/upload-artifact@v7
continue-on-error: true