Compare commits
142
Commits
release-2.32.x
...
SDL2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d9836d15e7 | ||
|
|
3146374e4a | ||
|
|
1d852d1c28 | ||
|
|
6ad5a966ea | ||
|
|
a65111bd2d | ||
|
|
c44d37b5cf | ||
|
|
f36d683b61 | ||
|
|
5bdf7bc625 | ||
|
|
38e0094637 | ||
|
|
ba38fda752 | ||
|
|
14eebdab3c | ||
|
|
686c18026b | ||
|
|
6db23faa44 | ||
|
|
6570d9e23f | ||
|
|
2bb0eb4641 | ||
|
|
afeeef9cf5 | ||
|
|
398bacbac3 | ||
|
|
f9435eab16 | ||
|
|
66ac6f4ea7 | ||
|
|
4151df83fe | ||
|
|
00d4f1c2c4 | ||
|
|
1c19bee000 | ||
|
|
639c7a1e52 | ||
|
|
c9889fb013 | ||
|
|
1edb3283b0 | ||
|
|
3e1cebed3c | ||
|
|
66d87bf0e1 | ||
|
|
235e4870af | ||
|
|
8ef0a07a52 | ||
|
|
26d1eadda3 | ||
|
|
39a0fab4d7 | ||
|
|
67141e5079 | ||
|
|
641201a99a | ||
|
|
7b28fb29bd | ||
|
|
ecb72142fd | ||
|
|
9859c05178 | ||
|
|
07c3b3fb7c | ||
|
|
9343246616 | ||
|
|
b55059b487 | ||
|
|
55b599d693 | ||
|
|
2eb5bff91a | ||
|
|
be6ab7f9a6 | ||
|
|
eb974470ec | ||
|
|
f0e7000f92 | ||
|
|
d2ab01b8bb | ||
|
|
f5246d0181 | ||
|
|
b8c802632b | ||
|
|
1725d6b049 | ||
|
|
5ed21d1ccb | ||
|
|
7a34e14c8e | ||
|
|
1a8e667f3d | ||
|
|
d31d98d436 | ||
|
|
56d43ee296 | ||
|
|
1f21aae242 | ||
|
|
5e85a29e75 | ||
|
|
f201b64ffe | ||
|
|
4f9723ece7 | ||
|
|
53dbe1862e | ||
|
|
e7489a0931 | ||
|
|
4b2aa3f102 | ||
|
|
272b073323 | ||
|
|
d310b5679f | ||
|
|
afc1d9122b | ||
|
|
af2279b286 | ||
|
|
059af5265a | ||
|
|
e610529e84 | ||
|
|
74df61530f | ||
|
|
3c36718348 | ||
|
|
b36252b120 | ||
|
|
ead4a032d3 | ||
|
|
cf1eb95fb1 | ||
|
|
34691de22b | ||
|
|
874ca5a678 | ||
|
|
8d5984464e | ||
|
|
2a6baf50e9 | ||
|
|
6c9c2a9ac2 | ||
|
|
8605624158 | ||
|
|
b537380065 | ||
|
|
b2c3e6fade | ||
|
|
309d1481a4 | ||
|
|
2fb6abb9ad | ||
|
|
cd0cf8b855 | ||
|
|
2bc3ec44b1 | ||
|
|
e4475d1868 | ||
|
|
6a71328638 | ||
|
|
6701f938f7 | ||
|
|
1c09a7117a | ||
|
|
9eb50a906a | ||
|
|
027d46f03a | ||
|
|
3416296366 | ||
|
|
01c3ccd541 | ||
|
|
3c08172d06 | ||
|
|
d0c2d8bc40 | ||
|
|
33eb167da8 | ||
|
|
4b4f6b3e22 | ||
|
|
2163887f29 | ||
|
|
c0f78dee5e | ||
|
|
17e6208c1b | ||
|
|
157f894d5d | ||
|
|
a220e7c422 | ||
|
|
2442c85cb8 | ||
|
|
5b951141d2 | ||
|
|
15fd3fcdc2 | ||
|
|
45b01d16b1 | ||
|
|
433810c58d | ||
|
|
916ddb1ef8 | ||
|
|
1c75cb4f8a | ||
|
|
26e946ef08 | ||
|
|
035518d065 | ||
|
|
40b1eac541 | ||
|
|
bfab0a968f | ||
|
|
f0a8e09f7c | ||
|
|
2e4c12cd2c | ||
|
|
3e47181800 | ||
|
|
8436ce98b4 | ||
|
|
a8f0eb4c33 | ||
|
|
069eb012aa | ||
|
|
7d8a6f1603 | ||
|
|
d63b3376a4 | ||
|
|
52146cf067 | ||
|
|
46a51b4298 | ||
|
|
4f488b9be2 | ||
|
|
f48a96a976 | ||
|
|
39bb71c442 | ||
|
|
177fb9cb6c | ||
|
|
fc536dcb7e | ||
|
|
1caae3e9e4 | ||
|
|
22a87a22ca | ||
|
|
6be87ceb33 | ||
|
|
ab44451578 | ||
|
|
52ac07d327 | ||
|
|
0809be4ec5 | ||
|
|
24693ac285 | ||
|
|
92cadaf917 | ||
|
|
d2eb72fd14 | ||
|
|
b4d733619a | ||
|
|
ed2c004c8a | ||
|
|
6421f12d7f | ||
|
|
ee49025f80 | ||
|
|
5925c27efb | ||
|
|
aa00738a21 | ||
|
|
5330041ea9 |
No files matched your search
@@ -20,7 +20,6 @@ class AppleArch(Enum):
|
|||||||
class MsvcArch(Enum):
|
class MsvcArch(Enum):
|
||||||
X86 = "x86"
|
X86 = "x86"
|
||||||
X64 = "x64"
|
X64 = "x64"
|
||||||
Arm32 = "arm"
|
|
||||||
Arm64 = "arm64"
|
Arm64 = "arm64"
|
||||||
|
|
||||||
|
|
||||||
@@ -28,7 +27,6 @@ class JobOs(Enum):
|
|||||||
WindowsLatest = "windows-latest"
|
WindowsLatest = "windows-latest"
|
||||||
UbuntuLatest = "ubuntu-latest"
|
UbuntuLatest = "ubuntu-latest"
|
||||||
MacosLatest = "macos-latest"
|
MacosLatest = "macos-latest"
|
||||||
Ubuntu20_04 = "ubuntu-20.04"
|
|
||||||
Ubuntu22_04 = "ubuntu-22.04"
|
Ubuntu22_04 = "ubuntu-22.04"
|
||||||
Ubuntu24_04 = "ubuntu-24.04"
|
Ubuntu24_04 = "ubuntu-24.04"
|
||||||
Macos13 = "macos-13"
|
Macos13 = "macos-13"
|
||||||
@@ -51,19 +49,18 @@ class SdlPlatform(Enum):
|
|||||||
Riscos = "riscos"
|
Riscos = "riscos"
|
||||||
FreeBSD = "freebsd"
|
FreeBSD = "freebsd"
|
||||||
NetBSD = "netbsd"
|
NetBSD = "netbsd"
|
||||||
|
OpenBSD = "openbsd"
|
||||||
Watcom = "watcom"
|
Watcom = "watcom"
|
||||||
|
|
||||||
|
|
||||||
class Msys2Platform(Enum):
|
class Msys2Platform(Enum):
|
||||||
Mingw32 = "mingw32"
|
Mingw32 = "mingw32"
|
||||||
Mingw64 = "mingw64"
|
Mingw64 = "mingw64"
|
||||||
Clang32 = "clang32"
|
|
||||||
Clang64 = "clang64"
|
Clang64 = "clang64"
|
||||||
Ucrt64 = "ucrt64"
|
Ucrt64 = "ucrt64"
|
||||||
|
|
||||||
|
|
||||||
class IntelCompiler(Enum):
|
class IntelCompiler(Enum):
|
||||||
Icc = "icc"
|
|
||||||
Icx = "icx"
|
Icx = "icx"
|
||||||
|
|
||||||
|
|
||||||
@@ -99,7 +96,6 @@ class JobSpec:
|
|||||||
msvc_static_crt: bool = False
|
msvc_static_crt: bool = False
|
||||||
clang_cl: bool = False
|
clang_cl: bool = False
|
||||||
gdk: bool = False
|
gdk: bool = False
|
||||||
uwp: bool = False
|
|
||||||
vita_gles: Optional[VitaGLES] = None
|
vita_gles: Optional[VitaGLES] = None
|
||||||
watcom_platform: Optional[WatcomPlatform] = None
|
watcom_platform: Optional[WatcomPlatform] = None
|
||||||
|
|
||||||
@@ -107,7 +103,6 @@ class JobSpec:
|
|||||||
JOB_SPECS = {
|
JOB_SPECS = {
|
||||||
"msys2-mingw32": JobSpec(name="Windows (msys2, mingw32)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-mingw32", msys2_platform=Msys2Platform.Mingw32, ),
|
"msys2-mingw32": JobSpec(name="Windows (msys2, mingw32)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-mingw32", msys2_platform=Msys2Platform.Mingw32, ),
|
||||||
"msys2-mingw64": JobSpec(name="Windows (msys2, mingw64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-mingw64", msys2_platform=Msys2Platform.Mingw64, ),
|
"msys2-mingw64": JobSpec(name="Windows (msys2, mingw64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-mingw64", msys2_platform=Msys2Platform.Mingw64, ),
|
||||||
"msys2-clang32": JobSpec(name="Windows (msys2, clang32)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-mingw32-clang", msys2_platform=Msys2Platform.Clang32, ),
|
|
||||||
"msys2-clang64": JobSpec(name="Windows (msys2, clang64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-mingw64-clang", msys2_platform=Msys2Platform.Clang64, ),
|
"msys2-clang64": JobSpec(name="Windows (msys2, clang64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-mingw64-clang", msys2_platform=Msys2Platform.Clang64, ),
|
||||||
"msys2-ucrt64": JobSpec(name="Windows (msys2, ucrt64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-mingw64-ucrt", msys2_platform=Msys2Platform.Ucrt64, ),
|
"msys2-ucrt64": JobSpec(name="Windows (msys2, ucrt64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msys2, artifact="SDL-mingw64-ucrt", msys2_platform=Msys2Platform.Ucrt64, ),
|
||||||
"msvc-x64": JobSpec(name="Windows (MSVC, x64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-VC-x64", msvc_arch=MsvcArch.X64, msvc_project="VisualC/SDL.sln", ),
|
"msvc-x64": JobSpec(name="Windows (MSVC, x64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-VC-x64", msvc_arch=MsvcArch.X64, msvc_project="VisualC/SDL.sln", ),
|
||||||
@@ -116,15 +111,11 @@ JOB_SPECS = {
|
|||||||
"msvc-static-x64": JobSpec(name="Windows (MSVC, static VCRT, x64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-VC-x64", msvc_arch=MsvcArch.X64, msvc_static_crt=True, ),
|
"msvc-static-x64": JobSpec(name="Windows (MSVC, static VCRT, x64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-VC-x64", msvc_arch=MsvcArch.X64, msvc_static_crt=True, ),
|
||||||
"msvc-clang-x64": JobSpec(name="Windows (MSVC, clang-cl x64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-clang-cl-x64", msvc_arch=MsvcArch.X64, clang_cl=True, ),
|
"msvc-clang-x64": JobSpec(name="Windows (MSVC, clang-cl x64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-clang-cl-x64", msvc_arch=MsvcArch.X64, clang_cl=True, ),
|
||||||
"msvc-clang-x86": JobSpec(name="Windows (MSVC, clang-cl x86)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-clang-cl-x86", msvc_arch=MsvcArch.X86, clang_cl=True, ),
|
"msvc-clang-x86": JobSpec(name="Windows (MSVC, clang-cl x86)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-clang-cl-x86", msvc_arch=MsvcArch.X86, clang_cl=True, ),
|
||||||
"msvc-arm32": JobSpec(name="Windows (MSVC, ARM)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-VC-arm32", msvc_arch=MsvcArch.Arm32, ),
|
|
||||||
"msvc-arm64": JobSpec(name="Windows (MSVC, ARM64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-VC-arm64", msvc_arch=MsvcArch.Arm64, ),
|
"msvc-arm64": JobSpec(name="Windows (MSVC, ARM64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-VC-arm64", msvc_arch=MsvcArch.Arm64, ),
|
||||||
"msvc-uwp-x64": JobSpec(name="UWP (MSVC, x64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-VC-UWP", msvc_arch=MsvcArch.X64, msvc_project="VisualC-WinRT/SDL-UWP.sln", uwp=True, ),
|
|
||||||
"msvc-gdk-x64": JobSpec(name="GDK (MSVC, x64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-VC-GDK", msvc_arch=MsvcArch.X64, msvc_project="VisualC-GDK/SDL.sln", gdk=True, no_cmake=True, ),
|
"msvc-gdk-x64": JobSpec(name="GDK (MSVC, x64)", os=JobOs.WindowsLatest, platform=SdlPlatform.Msvc, artifact="SDL-VC-GDK", msvc_arch=MsvcArch.X64, msvc_project="VisualC-GDK/SDL.sln", gdk=True, no_cmake=True, ),
|
||||||
"ubuntu-20.04": JobSpec(name="Ubuntu 20.04", os=JobOs.Ubuntu20_04, platform=SdlPlatform.Linux, artifact="SDL-ubuntu20.04", autotools=True),
|
|
||||||
"ubuntu-22.04": JobSpec(name="Ubuntu 22.04", os=JobOs.Ubuntu22_04, platform=SdlPlatform.Linux, artifact="SDL-ubuntu22.04", autotools=True),
|
"ubuntu-22.04": JobSpec(name="Ubuntu 22.04", os=JobOs.Ubuntu22_04, platform=SdlPlatform.Linux, artifact="SDL-ubuntu22.04", autotools=True),
|
||||||
"steamrt-sniper": JobSpec(name="Steam Linux Runtime (Sniper)", os=JobOs.UbuntuLatest, platform=SdlPlatform.Linux, artifact="SDL-slrsniper", container="registry.gitlab.steamos.cloud/steamrt/sniper/sdk:beta", ),
|
"steamrt-sniper": JobSpec(name="Steam Linux Runtime (Sniper)", os=JobOs.UbuntuLatest, platform=SdlPlatform.Linux, artifact="SDL-slrsniper", container="registry.gitlab.steamos.cloud/steamrt/sniper/sdk:beta", ),
|
||||||
"ubuntu-intel-icx": JobSpec(name="Ubuntu 20.04 (Intel oneAPI)", os=JobOs.Ubuntu20_04, platform=SdlPlatform.Linux, artifact="SDL-ubuntu20.04-oneapi", intel=IntelCompiler.Icx, ),
|
"ubuntu-intel-icx": JobSpec(name="Ubuntu 22.04 (Intel oneAPI)", os=JobOs.Ubuntu22_04, platform=SdlPlatform.Linux, artifact="SDL-ubuntu22.04-oneapi", intel=IntelCompiler.Icx, ),
|
||||||
"ubuntu-intel-icc": JobSpec(name="Ubuntu 20.04 (Intel Compiler)", os=JobOs.Ubuntu20_04, platform=SdlPlatform.Linux, artifact="SDL-ubuntu20.04-icc", intel=IntelCompiler.Icc, ),
|
|
||||||
"macos-gnu-arm64-x64": JobSpec(name="MacOS (GNU prefix)", os=JobOs.MacosLatest, platform=SdlPlatform.MacOS, artifact="SDL-macos-arm64-x64-gnu",autotools=True, apple_archs={AppleArch.X86_64, AppleArch.ARM64, }, ),
|
"macos-gnu-arm64-x64": JobSpec(name="MacOS (GNU prefix)", os=JobOs.MacosLatest, platform=SdlPlatform.MacOS, artifact="SDL-macos-arm64-x64-gnu",autotools=True, apple_archs={AppleArch.X86_64, AppleArch.ARM64, }, ),
|
||||||
"ios": JobSpec(name="iOS (CMake & xcode)", os=JobOs.MacosLatest, platform=SdlPlatform.Ios, artifact="SDL-ios-arm64", xcode=True, ),
|
"ios": JobSpec(name="iOS (CMake & xcode)", os=JobOs.MacosLatest, platform=SdlPlatform.Ios, artifact="SDL-ios-arm64", xcode=True, ),
|
||||||
"tvos": JobSpec(name="tvOS (CMake & xcode)", os=JobOs.MacosLatest, platform=SdlPlatform.Tvos, artifact="SDL-tvos-arm64", xcode=True, ),
|
"tvos": JobSpec(name="tvOS (CMake & xcode)", os=JobOs.MacosLatest, platform=SdlPlatform.Tvos, artifact="SDL-tvos-arm64", xcode=True, ),
|
||||||
@@ -139,6 +130,7 @@ JOB_SPECS = {
|
|||||||
"vita-pvr": JobSpec(name="Sony PlayStation Vita (GLES w/ PVR_PSP2)", os=JobOs.UbuntuLatest, platform=SdlPlatform.Vita, artifact="SDL-vita-pvr", container="vitasdk/vitasdk:latest", vita_gles=VitaGLES.Pvr, ),
|
"vita-pvr": JobSpec(name="Sony PlayStation Vita (GLES w/ PVR_PSP2)", os=JobOs.UbuntuLatest, platform=SdlPlatform.Vita, artifact="SDL-vita-pvr", container="vitasdk/vitasdk:latest", vita_gles=VitaGLES.Pvr, ),
|
||||||
"riscos": JobSpec(name="RISC OS", os=JobOs.UbuntuLatest, platform=SdlPlatform.Riscos, artifact="SDL-riscos", container="riscosdotinfo/riscos-gccsdk-4.7:latest", ),
|
"riscos": JobSpec(name="RISC OS", os=JobOs.UbuntuLatest, platform=SdlPlatform.Riscos, artifact="SDL-riscos", container="riscosdotinfo/riscos-gccsdk-4.7:latest", ),
|
||||||
"netbsd": JobSpec(name="NetBSD", os=JobOs.UbuntuLatest, platform=SdlPlatform.NetBSD, artifact="SDL-netbsd-x64", autotools=True, ),
|
"netbsd": JobSpec(name="NetBSD", os=JobOs.UbuntuLatest, platform=SdlPlatform.NetBSD, artifact="SDL-netbsd-x64", autotools=True, ),
|
||||||
|
"openbsd": JobSpec(name="OpenBSD", os=JobOs.UbuntuLatest, platform=SdlPlatform.OpenBSD, artifact="SDL-openbsd-x64", autotools=True, ),
|
||||||
"freebsd": JobSpec(name="FreeBSD", os=JobOs.UbuntuLatest, platform=SdlPlatform.FreeBSD, artifact="SDL-freebsd-x64", autotools=True, ),
|
"freebsd": JobSpec(name="FreeBSD", os=JobOs.UbuntuLatest, platform=SdlPlatform.FreeBSD, artifact="SDL-freebsd-x64", autotools=True, ),
|
||||||
"watcom-win32": JobSpec(name="Watcom (Windows)", os=JobOs.WindowsLatest, platform=SdlPlatform.Watcom, artifact="SDL-watcom-win32", no_cmake=True, watcom_platform=WatcomPlatform.Windows ),
|
"watcom-win32": JobSpec(name="Watcom (Windows)", os=JobOs.WindowsLatest, platform=SdlPlatform.Watcom, artifact="SDL-watcom-win32", no_cmake=True, watcom_platform=WatcomPlatform.Windows ),
|
||||||
"watcom-os2": JobSpec(name="Watcom (OS/2)", os=JobOs.WindowsLatest, platform=SdlPlatform.Watcom, artifact="SDL-watcom-win32", no_cmake=True, watcom_platform=WatcomPlatform.OS2 ),
|
"watcom-os2": JobSpec(name="Watcom (OS/2)", os=JobOs.WindowsLatest, platform=SdlPlatform.Watcom, artifact="SDL-watcom-win32", no_cmake=True, watcom_platform=WatcomPlatform.OS2 ),
|
||||||
@@ -181,6 +173,7 @@ class JobDetails:
|
|||||||
brew_packages: list[str] = dataclasses.field(default_factory=list)
|
brew_packages: list[str] = dataclasses.field(default_factory=list)
|
||||||
cmake_toolchain_file: str = ""
|
cmake_toolchain_file: str = ""
|
||||||
cmake_arguments: list[str] = dataclasses.field(default_factory=list)
|
cmake_arguments: list[str] = dataclasses.field(default_factory=list)
|
||||||
|
cmake_generator: str = "Ninja"
|
||||||
cmake_build_arguments: list[str] = dataclasses.field(default_factory=list)
|
cmake_build_arguments: list[str] = dataclasses.field(default_factory=list)
|
||||||
cppflags: list[str] = dataclasses.field(default_factory=list)
|
cppflags: list[str] = dataclasses.field(default_factory=list)
|
||||||
cc: str = ""
|
cc: str = ""
|
||||||
@@ -226,6 +219,7 @@ class JobDetails:
|
|||||||
setup_vita_gles_type: str = ""
|
setup_vita_gles_type: str = ""
|
||||||
check_sources: bool = False
|
check_sources: bool = False
|
||||||
watcom_makefile: str = ""
|
watcom_makefile: str = ""
|
||||||
|
binutils_strings: str = "strings"
|
||||||
|
|
||||||
def to_workflow(self, enable_artifacts: bool) -> dict[str, str|bool]:
|
def to_workflow(self, enable_artifacts: bool) -> dict[str, str|bool]:
|
||||||
data = {
|
data = {
|
||||||
@@ -259,6 +253,7 @@ class JobDetails:
|
|||||||
"cflags": my_shlex_join(self.cppflags + self.cflags),
|
"cflags": my_shlex_join(self.cppflags + self.cflags),
|
||||||
"cxxflags": my_shlex_join(self.cppflags + self.cxxflags),
|
"cxxflags": my_shlex_join(self.cppflags + self.cxxflags),
|
||||||
"ldflags": my_shlex_join(self.ldflags),
|
"ldflags": my_shlex_join(self.ldflags),
|
||||||
|
"cmake-generator": self.cmake_generator,
|
||||||
"cmake-toolchain-file": self.cmake_toolchain_file,
|
"cmake-toolchain-file": self.cmake_toolchain_file,
|
||||||
"cmake-arguments": my_shlex_join(self.cmake_arguments),
|
"cmake-arguments": my_shlex_join(self.cmake_arguments),
|
||||||
"cmake-build-arguments": my_shlex_join(self.cmake_build_arguments),
|
"cmake-build-arguments": my_shlex_join(self.cmake_build_arguments),
|
||||||
@@ -291,6 +286,7 @@ class JobDetails:
|
|||||||
"setup-gdk-folder": self.setup_gdk_folder,
|
"setup-gdk-folder": self.setup_gdk_folder,
|
||||||
"check-sources": self.check_sources,
|
"check-sources": self.check_sources,
|
||||||
"watcom-makefile": self.watcom_makefile,
|
"watcom-makefile": self.watcom_makefile,
|
||||||
|
"binutils-strings": self.binutils_strings,
|
||||||
}
|
}
|
||||||
return {k: v for k, v in data.items() if v != ""}
|
return {k: v for k, v in data.items() if v != ""}
|
||||||
|
|
||||||
@@ -344,10 +340,6 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta
|
|||||||
case IntelCompiler.Icx:
|
case IntelCompiler.Icx:
|
||||||
job.cc = "icx"
|
job.cc = "icx"
|
||||||
job.cxx = "icpx"
|
job.cxx = "icpx"
|
||||||
case IntelCompiler.Icc:
|
|
||||||
job.cc = "icc"
|
|
||||||
job.cxx = "icpc"
|
|
||||||
job.cppflags.append("-diag-disable=10441")
|
|
||||||
case _:
|
case _:
|
||||||
raise ValueError(f"Invalid intel={spec.intel}")
|
raise ValueError(f"Invalid intel={spec.intel}")
|
||||||
job.source_cmd = f"source /opt/intel/oneapi/setvars.sh;"
|
job.source_cmd = f"source /opt/intel/oneapi/setvars.sh;"
|
||||||
@@ -371,10 +363,7 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta
|
|||||||
"-DCMAKE_EXE_LINKER_FLAGS=-DEBUG",
|
"-DCMAKE_EXE_LINKER_FLAGS=-DEBUG",
|
||||||
"-DCMAKE_SHARED_LINKER_FLAGS=-DEBUG",
|
"-DCMAKE_SHARED_LINKER_FLAGS=-DEBUG",
|
||||||
))
|
))
|
||||||
if spec.uwp:
|
job.cmake_arguments.append("'-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded$<$<CONFIG:Debug>:Debug>'")
|
||||||
job.cmake_arguments.append("'-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded$<$<CONFIG:Debug>:Debug>DLL'")
|
|
||||||
else:
|
|
||||||
job.cmake_arguments.append("'-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded$<$<CONFIG:Debug>:Debug>'")
|
|
||||||
|
|
||||||
if spec.clang_cl:
|
if spec.clang_cl:
|
||||||
job.cmake_arguments.extend((
|
job.cmake_arguments.extend((
|
||||||
@@ -406,21 +395,10 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta
|
|||||||
job.msvc_vcvars_arch = "x64_x86"
|
job.msvc_vcvars_arch = "x64_x86"
|
||||||
case MsvcArch.X64:
|
case MsvcArch.X64:
|
||||||
job.msvc_vcvars_arch = "x64"
|
job.msvc_vcvars_arch = "x64"
|
||||||
case MsvcArch.Arm32:
|
|
||||||
job.msvc_vcvars_arch = "x64_arm"
|
|
||||||
job.msvc_vcvars_sdk = "10.0.22621.0" # 10.0.26100.0 dropped ARM32 um and ucrt libraries
|
|
||||||
job.run_tests = False
|
|
||||||
case MsvcArch.Arm64:
|
case MsvcArch.Arm64:
|
||||||
job.msvc_vcvars_arch = "x64_arm64"
|
job.msvc_vcvars_arch = "x64_arm64"
|
||||||
job.run_tests = False
|
job.run_tests = False
|
||||||
if spec.uwp:
|
if spec.gdk:
|
||||||
job.build_tests = False
|
|
||||||
job.cmake_arguments.extend((
|
|
||||||
"-DCMAKE_SYSTEM_NAME=WindowsStore",
|
|
||||||
"-DCMAKE_SYSTEM_VERSION=10.0",
|
|
||||||
))
|
|
||||||
job.msvc_project_flags.append("-p:WindowsTargetPlatformVersion=10.0.17763.0")
|
|
||||||
elif spec.gdk:
|
|
||||||
job.setup_gdk_folder = "VisualC-GDK"
|
job.setup_gdk_folder = "VisualC-GDK"
|
||||||
else:
|
else:
|
||||||
match spec.msvc_arch:
|
match spec.msvc_arch:
|
||||||
@@ -610,11 +588,14 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta
|
|||||||
job.shared_lib = SharedLibType.SO_0
|
job.shared_lib = SharedLibType.SO_0
|
||||||
job.static_lib = StaticLibType.A
|
job.static_lib = StaticLibType.A
|
||||||
case SdlPlatform.N3ds:
|
case SdlPlatform.N3ds:
|
||||||
|
job.cmake_generator = "Unix Makefiles"
|
||||||
|
job.cmake_build_arguments.append("-j$(nproc)")
|
||||||
job.shared = False
|
job.shared = False
|
||||||
job.apt_packages = ["ninja-build", "binutils"]
|
job.apt_packages = []
|
||||||
job.run_tests = False
|
job.run_tests = False
|
||||||
job.cc_from_cmake = True
|
job.cc_from_cmake = True
|
||||||
job.cmake_toolchain_file = "${DEVKITPRO}/cmake/3DS.cmake"
|
job.cmake_toolchain_file = "${DEVKITPRO}/cmake/3DS.cmake"
|
||||||
|
job.binutils_strings = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-strings"
|
||||||
job.static_lib = StaticLibType.A
|
job.static_lib = StaticLibType.A
|
||||||
case SdlPlatform.Msys2:
|
case SdlPlatform.Msys2:
|
||||||
job.shell = "msys2 {0}"
|
job.shell = "msys2 {0}"
|
||||||
@@ -627,7 +608,7 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta
|
|||||||
"clang64": "mingw-w64-clang-x86_64",
|
"clang64": "mingw-w64-clang-x86_64",
|
||||||
"ucrt64": "mingw-w64-ucrt-x86_64",
|
"ucrt64": "mingw-w64-ucrt-x86_64",
|
||||||
}[spec.msys2_platform.value]
|
}[spec.msys2_platform.value]
|
||||||
job.msys2_no_perl = spec.msys2_platform in (Msys2Platform.Mingw32, Msys2Platform.Clang32)
|
job.msys2_no_perl = spec.msys2_platform in (Msys2Platform.Mingw32, )
|
||||||
job.shared_lib = SharedLibType.WIN32
|
job.shared_lib = SharedLibType.WIN32
|
||||||
job.static_lib = StaticLibType.A
|
job.static_lib = StaticLibType.A
|
||||||
case SdlPlatform.Riscos:
|
case SdlPlatform.Riscos:
|
||||||
@@ -646,7 +627,7 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta
|
|||||||
))
|
))
|
||||||
job.cmake_toolchain_file = "/home/riscos/env/toolchain-riscos.cmake"
|
job.cmake_toolchain_file = "/home/riscos/env/toolchain-riscos.cmake"
|
||||||
job.static_lib = StaticLibType.A
|
job.static_lib = StaticLibType.A
|
||||||
case SdlPlatform.FreeBSD | SdlPlatform.NetBSD:
|
case SdlPlatform.FreeBSD | SdlPlatform.NetBSD | SdlPlatform.OpenBSD:
|
||||||
job.build_autotools_tests = False
|
job.build_autotools_tests = False
|
||||||
job.cpactions = True
|
job.cpactions = True
|
||||||
job.no_cmake = True
|
job.no_cmake = True
|
||||||
@@ -657,7 +638,7 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta
|
|||||||
match spec.platform:
|
match spec.platform:
|
||||||
case SdlPlatform.FreeBSD:
|
case SdlPlatform.FreeBSD:
|
||||||
job.cpactions_os = "freebsd"
|
job.cpactions_os = "freebsd"
|
||||||
job.cpactions_version = "14.2"
|
job.cpactions_version = "14.3"
|
||||||
job.cpactions_arch = "x86-64"
|
job.cpactions_arch = "x86-64"
|
||||||
job.cpactions_setup_cmd = "sudo pkg update"
|
job.cpactions_setup_cmd = "sudo pkg update"
|
||||||
job.cpactions_install_cmd = "sudo pkg install -y cmake ninja pkgconf libXcursor libXext libXinerama libXi libXfixes libXrandr libXScrnSaver libXxf86vm wayland wayland-protocols libxkbcommon mesa-libs libglvnd evdev-proto libinotify alsa-lib jackit pipewire pulseaudio sndio dbus zh-fcitx ibus libudev-devd"
|
job.cpactions_install_cmd = "sudo pkg install -y cmake ninja pkgconf libXcursor libXext libXinerama libXi libXfixes libXrandr libXScrnSaver libXxf86vm wayland wayland-protocols libxkbcommon mesa-libs libglvnd evdev-proto libinotify alsa-lib jackit pipewire pulseaudio sndio dbus zh-fcitx ibus libudev-devd"
|
||||||
@@ -671,6 +652,12 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta
|
|||||||
job.cpactions_arch = "x86-64"
|
job.cpactions_arch = "x86-64"
|
||||||
job.cpactions_setup_cmd = "export PATH=\"/usr/pkg/sbin:/usr/pkg/bin:/sbin:$PATH\"; export PKG_CONFIG_PATH=\"/usr/pkg/lib/pkgconfig\";export PKG_PATH=\"https://cdn.netBSD.org/pub/pkgsrc/packages/NetBSD/$(uname -p)/$(uname -r|cut -f \"1 2\" -d.)/All/\";echo \"PKG_PATH=$PKG_PATH\";echo \"uname -a -> \"$(uname -a)\"\";sudo -E sysctl -w security.pax.aslr.enabled=0;sudo -E sysctl -w security.pax.aslr.global=0;sudo -E pkgin clean;sudo -E pkgin update"
|
job.cpactions_setup_cmd = "export PATH=\"/usr/pkg/sbin:/usr/pkg/bin:/sbin:$PATH\"; export PKG_CONFIG_PATH=\"/usr/pkg/lib/pkgconfig\";export PKG_PATH=\"https://cdn.netBSD.org/pub/pkgsrc/packages/NetBSD/$(uname -p)/$(uname -r|cut -f \"1 2\" -d.)/All/\";echo \"PKG_PATH=$PKG_PATH\";echo \"uname -a -> \"$(uname -a)\"\";sudo -E sysctl -w security.pax.aslr.enabled=0;sudo -E sysctl -w security.pax.aslr.global=0;sudo -E pkgin clean;sudo -E pkgin update"
|
||||||
job.cpactions_install_cmd = "sudo -E pkgin -y install cmake dbus pkgconf ninja-build pulseaudio libxkbcommon wayland wayland-protocols libinotify libusb1"
|
job.cpactions_install_cmd = "sudo -E pkgin -y install cmake dbus pkgconf ninja-build pulseaudio libxkbcommon wayland wayland-protocols libinotify libusb1"
|
||||||
|
case SdlPlatform.OpenBSD:
|
||||||
|
job.cpactions_os = "openbsd"
|
||||||
|
job.cpactions_version = "7.7"
|
||||||
|
job.cpactions_arch = "x86-64"
|
||||||
|
job.cpactions_setup_cmd = "sudo pkg_add -u"
|
||||||
|
job.cpactions_install_cmd = "sudo pkg_add cmake ninja pkgconf wayland wayland-protocols libxkbcommon libinotify pulseaudio dbus ibus"
|
||||||
case SdlPlatform.Watcom:
|
case SdlPlatform.Watcom:
|
||||||
match spec.watcom_platform:
|
match spec.watcom_platform:
|
||||||
case WatcomPlatform.OS2:
|
case WatcomPlatform.OS2:
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ jobs:
|
|||||||
#shell: ${{ matrix.platform.shell }}
|
#shell: ${{ matrix.platform.shell }}
|
||||||
run: |
|
run: |
|
||||||
${{ matrix.platform.source-cmd }}
|
${{ matrix.platform.source-cmd }}
|
||||||
${{ matrix.platform.cmake-config-emulator }} cmake -S . -B build -GNinja \
|
${{ matrix.platform.cmake-config-emulator }} cmake -S . -B build -G "${{ matrix.platform.cmake-generator }}" \
|
||||||
-Wdeprecated -Wdev -Werror \
|
-Wdeprecated -Wdev -Werror \
|
||||||
${{ matrix.platform.cmake-toolchain-file != '' && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.platform.cmake-toolchain-file) || '' }} \
|
${{ matrix.platform.cmake-toolchain-file != '' && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.platform.cmake-toolchain-file) || '' }} \
|
||||||
-DSDL_WERROR=${{ matrix.platform.werror }} \
|
-DSDL_WERROR=${{ matrix.platform.werror }} \
|
||||||
@@ -207,9 +207,9 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
echo "This should show us the SDL_REVISION"
|
echo "This should show us the SDL_REVISION"
|
||||||
echo "Shared library:"
|
echo "Shared library:"
|
||||||
${{ (matrix.platform.shared-lib && format('strings build/{0} | grep "Github Workflow"', matrix.platform.shared-lib)) || 'echo "<Shared library not supported by platform>"' }}
|
${{ (matrix.platform.shared-lib && format('{0} build/{1} | grep "Github Workflow"', matrix.platform.binutils-strings, matrix.platform.shared-lib)) || 'echo "<Shared library not supported by platform>"' }}
|
||||||
echo "Static library:"
|
echo "Static library:"
|
||||||
${{ (matrix.platform.static-lib && format('strings build/{0} | grep "Github Workflow"', matrix.platform.static-lib)) || 'echo "<Static library not supported by platform>"' }}
|
${{ (matrix.platform.static-lib && format('{0} build/{1} | grep "Github Workflow"', matrix.platform.binutils-strings, matrix.platform.static-lib)) || 'echo "<Static library not supported by platform>"' }}
|
||||||
- name: 'Run build-time tests (CMake)'
|
- name: 'Run build-time tests (CMake)'
|
||||||
id: cmake-tests
|
id: cmake-tests
|
||||||
if: ${{ !matrix.platform.no-cmake && matrix.platform.run-tests }}
|
if: ${{ !matrix.platform.no-cmake && matrix.platform.run-tests }}
|
||||||
@@ -264,7 +264,7 @@ jobs:
|
|||||||
- name: 'Build (cross-platform-actions, BSD)'
|
- name: 'Build (cross-platform-actions, BSD)'
|
||||||
id: cpactions
|
id: cpactions
|
||||||
if: ${{ matrix.platform.cpactions }}
|
if: ${{ matrix.platform.cpactions }}
|
||||||
uses: cross-platform-actions/action@v0.27.0
|
uses: cross-platform-actions/action@v0.29.0
|
||||||
with:
|
with:
|
||||||
operating_system: '${{ matrix.platform.cpactions-os }}'
|
operating_system: '${{ matrix.platform.cpactions-os }}'
|
||||||
architecture: '${{ matrix.platform.cpactions-arch }}'
|
architecture: '${{ matrix.platform.cpactions-arch }}'
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ jobs:
|
|||||||
|
|
||||||
msvc:
|
msvc:
|
||||||
needs: [src]
|
needs: [src]
|
||||||
runs-on: windows-2019
|
runs-on: windows-2025
|
||||||
outputs:
|
outputs:
|
||||||
VC-x86: ${{ steps.releaser.outputs.VC-x86 }}
|
VC-x86: ${{ steps.releaser.outputs.VC-x86 }}
|
||||||
VC-x64: ${{ steps.releaser.outputs.VC-x64 }}
|
VC-x64: ${{ steps.releaser.outputs.VC-x64 }}
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ manpageheaderfiletext = Defined in %fname%
|
|||||||
# A handful of others we fix up in the header itself with /* WIKI CATEGORY: x */ comments.
|
# A handful of others we fix up in the header itself with /* WIKI CATEGORY: x */ comments.
|
||||||
headercategoryeval = s/\ASDL_config_.*?\.h\Z//; s/\ASDL_test_.*?\.h\Z//; s/\ASDL_?(.*?)\.h\Z/$1/; ucfirst();
|
headercategoryeval = s/\ASDL_config_.*?\.h\Z//; s/\ASDL_test_.*?\.h\Z//; s/\ASDL_?(.*?)\.h\Z/$1/; ucfirst();
|
||||||
|
|
||||||
quickrefenabled = 0 # !!! FIXME: maybe later, but there are probably documentation gaps to fix first.
|
# !!! FIXME: maybe later, but there are probably documentation gaps to fix first.
|
||||||
|
quickrefenabled = 0
|
||||||
quickrefcategoryorder = Init,Hints,Error,Version,Properties,Log,Video,Events,Keyboard,Mouse,Touch,Gesture,GameController,Joystick,Haptic,Audio,Timer,Render,LoadSO,Thread,Mutex,Atomic,Filesystem,RWOPS,Pixels,Surface,Blendmode,Rect,Clipboard,Messagebox,Vulkan,Metal,Platform,Power,Sensor,Bits,Endian,Assert,CPUInfo,Locale,System,Misc,GUID,Main,Stdinc
|
quickrefcategoryorder = Init,Hints,Error,Version,Properties,Log,Video,Events,Keyboard,Mouse,Touch,Gesture,GameController,Joystick,Haptic,Audio,Timer,Render,LoadSO,Thread,Mutex,Atomic,Filesystem,RWOPS,Pixels,Surface,Blendmode,Rect,Clipboard,Messagebox,Vulkan,Metal,Platform,Power,Sensor,Bits,Endian,Assert,CPUInfo,Locale,System,Misc,GUID,Main,Stdinc
|
||||||
quickreftitle = SDL2 API Quick Reference
|
quickreftitle = SDL2 API Quick Reference
|
||||||
quickrefurl = https://libsdl.org/
|
quickrefurl = https://libsdl.org/
|
||||||
|
|||||||
+19
-7
@@ -88,7 +88,7 @@ endif()
|
|||||||
|
|
||||||
# See docs/release_checklist.md
|
# See docs/release_checklist.md
|
||||||
set(SDL_MAJOR_VERSION 2)
|
set(SDL_MAJOR_VERSION 2)
|
||||||
set(SDL_MINOR_VERSION 32)
|
set(SDL_MINOR_VERSION 33)
|
||||||
set(SDL_MICRO_VERSION 0)
|
set(SDL_MICRO_VERSION 0)
|
||||||
set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}")
|
set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}")
|
||||||
|
|
||||||
@@ -755,6 +755,11 @@ if(MSVC)
|
|||||||
if(MSVC_VERSION GREATER 1926 AND CMAKE_GENERATOR_PLATFORM MATCHES "Win32|x64")
|
if(MSVC_VERSION GREATER 1926 AND CMAKE_GENERATOR_PLATFORM MATCHES "Win32|x64")
|
||||||
list(APPEND EXTRA_LDFLAGS_BUILD "-CETCOMPAT")
|
list(APPEND EXTRA_LDFLAGS_BUILD "-CETCOMPAT")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# for VS >= 17.14 targeting ARM64: inline the Interlocked funcs
|
||||||
|
if(MSVC_VERSION GREATER 1943 AND SDL_CPU_ARM64 AND NOT SDL_LIBC)
|
||||||
|
list(APPEND EXTRA_CFLAGS /forceInterlockedFunctions-)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
|
if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
|
||||||
@@ -1094,6 +1099,7 @@ if(SDL_LIBC)
|
|||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
check_symbol_exists(sigaction "signal.h" HAVE_SIGACTION)
|
check_symbol_exists(sigaction "signal.h" HAVE_SIGACTION)
|
||||||
|
check_symbol_exists(sigtimedwait "signal.h" HAVE_SIGTIMEDWAIT)
|
||||||
check_symbol_exists(setjmp "setjmp.h" HAVE_SETJMP)
|
check_symbol_exists(setjmp "setjmp.h" HAVE_SETJMP)
|
||||||
check_symbol_exists(nanosleep "time.h" HAVE_NANOSLEEP)
|
check_symbol_exists(nanosleep "time.h" HAVE_NANOSLEEP)
|
||||||
check_symbol_exists(sysconf "unistd.h" HAVE_SYSCONF)
|
check_symbol_exists(sysconf "unistd.h" HAVE_SYSCONF)
|
||||||
@@ -1465,10 +1471,14 @@ elseif(EMSCRIPTEN)
|
|||||||
elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
|
elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU)
|
||||||
if(SDL_AUDIO)
|
if(SDL_AUDIO)
|
||||||
if(SYSV5 OR SOLARIS OR HPUX)
|
if(SYSV5 OR SOLARIS OR HPUX)
|
||||||
set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
|
# Newer Solaris-based systems, like OpenIndiana, don't have this interface anymore. Check for the header first.
|
||||||
file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
|
check_include_file(sys/audioio.h HAVE_SYS_AUDIOIO_H)
|
||||||
list(APPEND SOURCE_FILES ${SUN_AUDIO_SOURCES})
|
if(HAVE_SYS_AUDIOIO_H)
|
||||||
set(HAVE_SDL_AUDIO TRUE)
|
set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
|
||||||
|
file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
|
||||||
|
list(APPEND SOURCE_FILES ${SUN_AUDIO_SOURCES})
|
||||||
|
set(HAVE_SDL_AUDIO TRUE)
|
||||||
|
endif()
|
||||||
elseif(NETBSD)
|
elseif(NETBSD)
|
||||||
set(SDL_AUDIO_DRIVER_NETBSD 1)
|
set(SDL_AUDIO_DRIVER_NETBSD 1)
|
||||||
file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
|
file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
|
||||||
@@ -1829,8 +1839,10 @@ elseif(WINDOWS)
|
|||||||
set(HAVE_DIRECTX TRUE)
|
set(HAVE_DIRECTX TRUE)
|
||||||
if(NOT MINGW AND NOT USE_WINSDK_DIRECTX)
|
if(NOT MINGW AND NOT USE_WINSDK_DIRECTX)
|
||||||
# TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
|
# TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
|
||||||
target_link_directories(sdl-build-options INTERFACE "$$ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH}")
|
file(TO_CMAKE_PATH "$ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH}" SDL2_TMP_DXSDK_LIB_DIR)
|
||||||
target_include_directories(sdl-build-options INTERFACE "$ENV{DXSDK_DIR}\\Include")
|
target_link_directories(sdl-build-options INTERFACE "${SDL2_TMP_DXSDK_LIB_DIR}")
|
||||||
|
file(TO_CMAKE_PATH "$ENV{DXSDK_DIR}\\Include" SDL2_TMP_DXSDK_INCLUDE_DIR)
|
||||||
|
target_include_directories(sdl-build-options INTERFACE "${SDL2_TMP_DXSDK_INCLUDE_DIR}")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
|
set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
LIBNAME = SDL2
|
LIBNAME = SDL2
|
||||||
MAJOR_VERSION = 2
|
MAJOR_VERSION = 2
|
||||||
MINOR_VERSION = 32
|
MINOR_VERSION = 33
|
||||||
MICRO_VERSION = 0
|
MICRO_VERSION = 0
|
||||||
VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(MICRO_VERSION)
|
VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(MICRO_VERSION)
|
||||||
DESCRIPTION = Simple DirectMedia Layer 2
|
DESCRIPTION = Simple DirectMedia Layer 2
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
LIBNAME = SDL2
|
LIBNAME = SDL2
|
||||||
MAJOR_VERSION = 2
|
MAJOR_VERSION = 2
|
||||||
MINOR_VERSION = 32
|
MINOR_VERSION = 33
|
||||||
MICRO_VERSION = 0
|
MICRO_VERSION = 0
|
||||||
VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(MICRO_VERSION)
|
VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(MICRO_VERSION)
|
||||||
|
|
||||||
|
|||||||
@@ -371,6 +371,7 @@
|
|||||||
<TargetPlatformVersion>10.0.16299.0</TargetPlatformVersion>
|
<TargetPlatformVersion>10.0.16299.0</TargetPlatformVersion>
|
||||||
<TargetPlatformMinVersion>10.0.16299.0</TargetPlatformMinVersion>
|
<TargetPlatformMinVersion>10.0.16299.0</TargetPlatformMinVersion>
|
||||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
|
<WindowsTargetPlatformMinVersion>10.0.0.0</WindowsTargetPlatformMinVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
@@ -391,7 +392,7 @@
|
|||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v143</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
@@ -603,4 +604,4 @@
|
|||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -456,7 +456,10 @@ main(int argc, char *argv[])
|
|||||||
while (!done) {
|
while (!done) {
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
double deltaTime = updateDeltaTime();
|
double deltaTime = updateDeltaTime();
|
||||||
|
SDL_bool hasEvents = SDL_FALSE;
|
||||||
|
|
||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
|
hasEvents = SDL_TRUE;
|
||||||
if (event.type == SDL_QUIT) {
|
if (event.type == SDL_QUIT) {
|
||||||
done = 1;
|
done = 1;
|
||||||
}
|
}
|
||||||
@@ -466,10 +469,17 @@ main(int argc, char *argv[])
|
|||||||
spawnEmitterParticle(x, y);
|
spawnEmitterParticle(x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stepParticles(deltaTime);
|
|
||||||
drawParticles();
|
/* Only update and render if we have active particles or just received events */
|
||||||
SDL_GL_SwapWindow(window);
|
if (num_active_particles > 0 || hasEvents) {
|
||||||
SDL_Delay(1);
|
stepParticles(deltaTime);
|
||||||
|
drawParticles();
|
||||||
|
SDL_GL_SwapWindow(window);
|
||||||
|
SDL_Delay(16); // Target 60 FPS when active
|
||||||
|
} else {
|
||||||
|
/* Idle state - wait for events with longer delay to save CPU */
|
||||||
|
SDL_Delay(100); // Much longer delay when idle
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* delete textures */
|
/* delete textures */
|
||||||
|
|||||||
@@ -19,10 +19,10 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>FMWK</string>
|
<string>FMWK</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>2.32.0</string>
|
<string>2.33.0</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>SDLX</string>
|
<string>SDLX</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>2.32.0</string>
|
<string>2.33.0</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
@@ -9728,8 +9728,8 @@
|
|||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
DEPLOYMENT_POSTPROCESSING = YES;
|
DEPLOYMENT_POSTPROCESSING = YES;
|
||||||
DYLIB_COMPATIBILITY_VERSION = 3201.0.0;
|
DYLIB_COMPATIBILITY_VERSION = 3301.0.0;
|
||||||
DYLIB_CURRENT_VERSION = 3201.0.0;
|
DYLIB_CURRENT_VERSION = 3301.0.0;
|
||||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
GCC_ALTIVEC_EXTENSIONS = YES;
|
GCC_ALTIVEC_EXTENSIONS = YES;
|
||||||
@@ -9770,7 +9770,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CLANG_LINK_OBJC_RUNTIME = NO;
|
CLANG_LINK_OBJC_RUNTIME = NO;
|
||||||
MARKETING_VERSION = 2.32.0;
|
MARKETING_VERSION = 2.33.0;
|
||||||
OTHER_LDFLAGS = "-liconv";
|
OTHER_LDFLAGS = "-liconv";
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
@@ -9813,8 +9813,8 @@
|
|||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
DYLIB_COMPATIBILITY_VERSION = 3201.0.0;
|
DYLIB_COMPATIBILITY_VERSION = 3301.0.0;
|
||||||
DYLIB_CURRENT_VERSION = 3201.0.0;
|
DYLIB_CURRENT_VERSION = 3301.0.0;
|
||||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
ENABLE_TESTABILITY = YES;
|
ENABLE_TESTABILITY = YES;
|
||||||
@@ -9856,7 +9856,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CLANG_LINK_OBJC_RUNTIME = NO;
|
CLANG_LINK_OBJC_RUNTIME = NO;
|
||||||
MARKETING_VERSION = 2.32.0;
|
MARKETING_VERSION = 2.33.0;
|
||||||
OTHER_LDFLAGS = "-liconv";
|
OTHER_LDFLAGS = "-liconv";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
@@ -10062,8 +10062,8 @@
|
|||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
DYLIB_COMPATIBILITY_VERSION = 3201.0.0;
|
DYLIB_COMPATIBILITY_VERSION = 3301.0.0;
|
||||||
DYLIB_CURRENT_VERSION = 3201.0.0;
|
DYLIB_CURRENT_VERSION = 3301.0.0;
|
||||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
@@ -10114,8 +10114,8 @@
|
|||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
DYLIB_COMPATIBILITY_VERSION = 3201.0.0;
|
DYLIB_COMPATIBILITY_VERSION = 3301.0.0;
|
||||||
DYLIB_CURRENT_VERSION = 3201.0.0;
|
DYLIB_CURRENT_VERSION = 3301.0.0;
|
||||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Title SDL 2.32.0
|
Title SDL 2.33.0
|
||||||
Version 1
|
Version 1
|
||||||
Description SDL Library for Mac OS X (http://www.libsdl.org)
|
Description SDL Library for Mac OS X (http://www.libsdl.org)
|
||||||
DefaultLocation /Library/Frameworks
|
DefaultLocation /Library/Frameworks
|
||||||
|
|||||||
@@ -11,15 +11,15 @@ android {
|
|||||||
if (buildAsApplication) {
|
if (buildAsApplication) {
|
||||||
namespace "org.libsdl.app"
|
namespace "org.libsdl.app"
|
||||||
}
|
}
|
||||||
compileSdkVersion 34
|
compileSdkVersion 35
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 19
|
minSdkVersion 21
|
||||||
targetSdkVersion 34
|
targetSdkVersion 35
|
||||||
versionCode 1
|
versionCode 1
|
||||||
versionName "1.0"
|
versionName "1.0"
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
ndkBuild {
|
ndkBuild {
|
||||||
arguments "APP_PLATFORM=android-19"
|
arguments "APP_PLATFORM=android-21"
|
||||||
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
|
||||||
}
|
}
|
||||||
// cmake {
|
// cmake {
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ import java.util.Locale;
|
|||||||
public class SDLActivity extends Activity implements View.OnSystemUiVisibilityChangeListener {
|
public class SDLActivity extends Activity implements View.OnSystemUiVisibilityChangeListener {
|
||||||
private static final String TAG = "SDL";
|
private static final String TAG = "SDL";
|
||||||
private static final int SDL_MAJOR_VERSION = 2;
|
private static final int SDL_MAJOR_VERSION = 2;
|
||||||
private static final int SDL_MINOR_VERSION = 32;
|
private static final int SDL_MINOR_VERSION = 33;
|
||||||
private static final int SDL_MICRO_VERSION = 0;
|
private static final int SDL_MICRO_VERSION = 0;
|
||||||
/*
|
/*
|
||||||
// Display InputType.SOURCE/CLASS of events and devices
|
// Display InputType.SOURCE/CLASS of events and devices
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ buildscript {
|
|||||||
google()
|
google()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:8.1.1'
|
classpath 'com.android.tools.build:gradle:8.6.0'
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#Thu Nov 11 18:20:34 PST 2021
|
#Thu Nov 11 18:20:34 PST 2021
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
+131
-40
@@ -37,6 +37,8 @@ logger = logging.getLogger(__name__)
|
|||||||
GIT_HASH_FILENAME = ".git-hash"
|
GIT_HASH_FILENAME = ".git-hash"
|
||||||
REVISION_TXT = "REVISION.txt"
|
REVISION_TXT = "REVISION.txt"
|
||||||
|
|
||||||
|
RE_ILLEGAL_MINGW_LIBRARIES = re.compile(r"(?:lib)?(?:gcc|(?:std)?c[+][+]|(?:win)?pthread).*", flags=re.I)
|
||||||
|
|
||||||
|
|
||||||
def safe_isotime_to_datetime(str_isotime: str) -> datetime.datetime:
|
def safe_isotime_to_datetime(str_isotime: str) -> datetime.datetime:
|
||||||
try:
|
try:
|
||||||
@@ -339,6 +341,12 @@ class ArchiveFileTree:
|
|||||||
def add_file(self, file: NodeInArchive):
|
def add_file(self, file: NodeInArchive):
|
||||||
self._tree[file.arcpath] = file
|
self._tree[file.arcpath] = file
|
||||||
|
|
||||||
|
def __iter__(self) -> typing.Iterable[NodeInArchive]:
|
||||||
|
yield from self._tree.values()
|
||||||
|
|
||||||
|
def __contains__(self, value: str) -> bool:
|
||||||
|
return value in self._tree
|
||||||
|
|
||||||
def get_latest_mod_time(self) -> datetime.datetime:
|
def get_latest_mod_time(self) -> datetime.datetime:
|
||||||
return max(item.time for item in self._tree.values() if item.time)
|
return max(item.time for item in self._tree.values() if item.time)
|
||||||
|
|
||||||
@@ -526,6 +534,16 @@ class SourceCollector:
|
|||||||
return path_times
|
return path_times
|
||||||
|
|
||||||
|
|
||||||
|
class AndroidApiVersion:
|
||||||
|
def __init__(self, name: str, ints: tuple[int, ...]):
|
||||||
|
self.name = name
|
||||||
|
self.ints = ints
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return f"<{self.name} ({'.'.join(str(v) for v in self.ints)})>"
|
||||||
|
|
||||||
|
ANDROID_ABI_EXTRA_LINK_OPTIONS = {}
|
||||||
|
|
||||||
class Releaser:
|
class Releaser:
|
||||||
def __init__(self, release_info: dict, commit: str, revision: str, root: Path, dist_path: Path, section_printer: SectionPrinter, executer: Executer, cmake_generator: str, deps_path: Path, overwrite: bool, github: bool, fast: bool):
|
def __init__(self, release_info: dict, commit: str, revision: str, root: Path, dist_path: Path, section_printer: SectionPrinter, executer: Executer, cmake_generator: str, deps_path: Path, overwrite: bool, github: bool, fast: bool):
|
||||||
self.release_info = release_info
|
self.release_info = release_info
|
||||||
@@ -586,12 +604,22 @@ class Releaser:
|
|||||||
def create_source_archives(self) -> None:
|
def create_source_archives(self) -> None:
|
||||||
source_collector = SourceCollector(root=self.root, commit=self.commit, executer=self.executer, filter=self._path_filter)
|
source_collector = SourceCollector(root=self.root, commit=self.commit, executer=self.executer, filter=self._path_filter)
|
||||||
print(f"Collecting sources of {self.project}...")
|
print(f"Collecting sources of {self.project}...")
|
||||||
archive_tree = source_collector.get_archive_file_tree()
|
archive_tree: ArchiveFileTree = source_collector.get_archive_file_tree()
|
||||||
latest_mod_time = archive_tree.get_latest_mod_time()
|
latest_mod_time = archive_tree.get_latest_mod_time()
|
||||||
archive_tree.add_file(NodeInArchive.from_text(arcpath=REVISION_TXT, text=f"{self.revision}\n", time=latest_mod_time))
|
archive_tree.add_file(NodeInArchive.from_text(arcpath=REVISION_TXT, text=f"{self.revision}\n", time=latest_mod_time))
|
||||||
archive_tree.add_file(NodeInArchive.from_text(arcpath=f"{GIT_HASH_FILENAME}", text=f"{self.commit}\n", time=latest_mod_time))
|
archive_tree.add_file(NodeInArchive.from_text(arcpath=f"{GIT_HASH_FILENAME}", text=f"{self.commit}\n", time=latest_mod_time))
|
||||||
archive_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["source"].get("files", {}), file_mapping_root=self.root, context=self.get_context(), time=latest_mod_time)
|
archive_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["source"].get("files", {}), file_mapping_root=self.root, context=self.get_context(), time=latest_mod_time)
|
||||||
|
|
||||||
|
if "Makefile.am" in archive_tree:
|
||||||
|
patched_time = latest_mod_time + datetime.timedelta(minutes=1)
|
||||||
|
print(f"Makefile.am detected -> touching aclocal.m4, */Makefile.in, configure")
|
||||||
|
for node_data in archive_tree:
|
||||||
|
arc_name = os.path.basename(node_data.arcpath)
|
||||||
|
arc_name_we, arc_name_ext = os.path.splitext(arc_name)
|
||||||
|
if arc_name in ("aclocal.m4", "configure", "Makefile.in"):
|
||||||
|
print(f"Bumping time of {node_data.arcpath}")
|
||||||
|
node_data.time = patched_time
|
||||||
|
|
||||||
archive_base = f"{self.project}-{self.version}"
|
archive_base = f"{self.project}-{self.version}"
|
||||||
zip_path = self.dist_path / f"{archive_base}.zip"
|
zip_path = self.dist_path / f"{archive_base}.zip"
|
||||||
tgz_path = self.dist_path / f"{archive_base}.tar.gz"
|
tgz_path = self.dist_path / f"{archive_base}.tar.gz"
|
||||||
@@ -668,6 +696,15 @@ class Releaser:
|
|||||||
def git_hash_data(self) -> bytes:
|
def git_hash_data(self) -> bytes:
|
||||||
return f"{self.commit}\n".encode()
|
return f"{self.commit}\n".encode()
|
||||||
|
|
||||||
|
def verify_mingw_library(self, triplet: str, path: Path):
|
||||||
|
objdump_output = self.executer.check_output([f"{triplet}-objdump", "-p", str(path)])
|
||||||
|
libraries = re.findall(r"DLL Name: ([^\n]+)", objdump_output)
|
||||||
|
logger.info("%s (%s) libraries: %r", path, triplet, libraries)
|
||||||
|
illegal_libraries = list(filter(RE_ILLEGAL_MINGW_LIBRARIES.match, libraries))
|
||||||
|
logger.error("Detected 'illegal' libraries: %r", illegal_libraries)
|
||||||
|
if illegal_libraries:
|
||||||
|
raise Exception(f"{path} links to illegal libraries: {illegal_libraries}")
|
||||||
|
|
||||||
def create_mingw_archives(self) -> None:
|
def create_mingw_archives(self) -> None:
|
||||||
build_type = "Release"
|
build_type = "Release"
|
||||||
build_parent_dir = self.root / "build-mingw"
|
build_parent_dir = self.root / "build-mingw"
|
||||||
@@ -764,7 +801,6 @@ class Releaser:
|
|||||||
f"--includedir=${{prefix}}/include",
|
f"--includedir=${{prefix}}/include",
|
||||||
f"--libdir=${{prefix}}/lib",
|
f"--libdir=${{prefix}}/lib",
|
||||||
f"--bindir=${{prefix}}/bin",
|
f"--bindir=${{prefix}}/bin",
|
||||||
f"--exec-prefix=${{prefix}}/bin",
|
|
||||||
f"--host={triplet}",
|
f"--host={triplet}",
|
||||||
f"--build=x86_64-none-linux-gnu",
|
f"--build=x86_64-none-linux-gnu",
|
||||||
"CFLAGS=-O2",
|
"CFLAGS=-O2",
|
||||||
@@ -772,9 +808,10 @@ class Releaser:
|
|||||||
"LDFLAGS=-Wl,-s",
|
"LDFLAGS=-Wl,-s",
|
||||||
] + extra_args, cwd=build_path, env=new_env)
|
] + extra_args, cwd=build_path, env=new_env)
|
||||||
with self.section_printer.group(f"Build MinGW {triplet} (autotools)"):
|
with self.section_printer.group(f"Build MinGW {triplet} (autotools)"):
|
||||||
self.executer.run(["make", "V=1", f"-j{self.cpu_count}"], cwd=build_path, env=new_env)
|
self.executer.run(["make", f"-j{self.cpu_count}"], cwd=build_path, env=new_env)
|
||||||
with self.section_printer.group(f"Install MinGW {triplet} (autotools)"):
|
with self.section_printer.group(f"Install MinGW {triplet} (autotools)"):
|
||||||
self.executer.run(["make", "install"], cwd=build_path, env=new_env)
|
self.executer.run(["make", "install"], cwd=build_path, env=new_env)
|
||||||
|
self.verify_mingw_library(triplet=ARCH_TO_TRIPLET[arch], path=install_path / "bin" / f"{self.project}.dll")
|
||||||
archive_file_tree.add_directory_tree(arc_dir=arc_join(arc_root, triplet), path=install_path, time=self.arc_time)
|
archive_file_tree.add_directory_tree(arc_dir=arc_join(arc_root, triplet), path=install_path, time=self.arc_time)
|
||||||
|
|
||||||
print("Recording arch-dependent extra files for MinGW development archive ...")
|
print("Recording arch-dependent extra files for MinGW development archive ...")
|
||||||
@@ -830,6 +867,7 @@ class Releaser:
|
|||||||
self.executer.run(["cmake", "--build", str(build_path), "--verbose", "--config", build_type], cwd=build_path, env=new_env)
|
self.executer.run(["cmake", "--build", str(build_path), "--verbose", "--config", build_type], cwd=build_path, env=new_env)
|
||||||
with self.section_printer.group(f"Install MinGW {triplet} (CMake)"):
|
with self.section_printer.group(f"Install MinGW {triplet} (CMake)"):
|
||||||
self.executer.run(["cmake", "--install", str(build_path)], cwd=build_path, env=new_env)
|
self.executer.run(["cmake", "--install", str(build_path)], cwd=build_path, env=new_env)
|
||||||
|
self.verify_mingw_library(triplet=ARCH_TO_TRIPLET[arch], path=install_path / "bin" / f"{self.project}.dll")
|
||||||
archive_file_tree.add_directory_tree(arc_dir=arc_join(arc_root, triplet), path=install_path, time=self.arc_time)
|
archive_file_tree.add_directory_tree(arc_dir=arc_join(arc_root, triplet), path=install_path, time=self.arc_time)
|
||||||
|
|
||||||
print("Recording arch-dependent extra files for MinGW development archive ...")
|
print("Recording arch-dependent extra files for MinGW development archive ...")
|
||||||
@@ -857,22 +895,25 @@ class Releaser:
|
|||||||
self.artifacts["mingw-devel-tar-gz"] = tgz_path
|
self.artifacts["mingw-devel-tar-gz"] = tgz_path
|
||||||
self.artifacts["mingw-devel-tar-xz"] = txz_path
|
self.artifacts["mingw-devel-tar-xz"] = txz_path
|
||||||
|
|
||||||
def _detect_android_api(self, android_home: str) -> typing.Optional[int]:
|
def _detect_android_api(self, android_home: str) -> typing.Optional[AndroidApiVersion]:
|
||||||
platform_dirs = list(Path(p) for p in glob.glob(f"{android_home}/platforms/android-*"))
|
platform_dirs = list(Path(p) for p in glob.glob(f"{android_home}/platforms/android-*"))
|
||||||
re_platform = re.compile("android-([0-9]+)")
|
re_platform = re.compile("^android-([0-9]+)(?:-ext([0-9]+))?$")
|
||||||
platform_versions = []
|
platform_versions: list[AndroidApiVersion] = []
|
||||||
for platform_dir in platform_dirs:
|
for platform_dir in platform_dirs:
|
||||||
logger.debug("Found Android Platform SDK: %s", platform_dir)
|
logger.debug("Found Android Platform SDK: %s", platform_dir)
|
||||||
|
if not (platform_dir / "android.jar").is_file():
|
||||||
|
logger.debug("Skipping SDK, missing android.jar")
|
||||||
|
continue
|
||||||
if m:= re_platform.match(platform_dir.name):
|
if m:= re_platform.match(platform_dir.name):
|
||||||
platform_versions.append(int(m.group(1)))
|
platform_versions.append(AndroidApiVersion(name=platform_dir.name, ints=(int(m.group(1)), int(m.group(2) or 0))))
|
||||||
platform_versions.sort()
|
platform_versions.sort(key=lambda v: v.ints)
|
||||||
logger.info("Available platform versions: %s", platform_versions)
|
logger.info("Available platform versions: %s", platform_versions)
|
||||||
platform_versions = list(filter(lambda v: v >= self._android_api_minimum, platform_versions))
|
platform_versions = list(filter(lambda v: v.ints >= self._android_api_minimum.ints, platform_versions))
|
||||||
logger.info("Valid platform versions (>=%d): %s", self._android_api_minimum, platform_versions)
|
logger.info("Valid platform versions (>=%s): %s", self._android_api_minimum.ints, platform_versions)
|
||||||
if not platform_versions:
|
if not platform_versions:
|
||||||
return None
|
return None
|
||||||
android_api = platform_versions[0]
|
android_api = platform_versions[0]
|
||||||
logger.info("Selected API version %d", android_api)
|
logger.info("Selected API version %s", android_api)
|
||||||
return android_api
|
return android_api
|
||||||
|
|
||||||
def _get_prefab_json_text(self) -> str:
|
def _get_prefab_json_text(self) -> str:
|
||||||
@@ -896,8 +937,19 @@ class Releaser:
|
|||||||
return json.dumps(module_json_dict, indent=4)
|
return json.dumps(module_json_dict, indent=4)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def _android_api_minimum(self):
|
def _android_api_minimum(self) -> AndroidApiVersion:
|
||||||
return self.release_info["android"]["api-minimum"]
|
value = self.release_info["android"]["api-minimum"]
|
||||||
|
if isinstance(value, int):
|
||||||
|
ints = (value, )
|
||||||
|
elif isinstance(value, str):
|
||||||
|
ints = tuple(split("."))
|
||||||
|
else:
|
||||||
|
raise ValueError("Invalid android.api-minimum: must be X or X.Y")
|
||||||
|
match len(ints):
|
||||||
|
case 1: name = f"android-{ints[0]}"
|
||||||
|
case 2: name = f"android-{ints[0]}-ext-{ints[1]}"
|
||||||
|
case _: raise ValueError("Invalid android.api-minimum: must be X or X.Y")
|
||||||
|
return AndroidApiVersion(name=name, ints=ints)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def _android_api_target(self):
|
def _android_api_target(self):
|
||||||
@@ -910,7 +962,7 @@ class Releaser:
|
|||||||
def _get_prefab_abi_json_text(self, abi: str, cpp: bool, shared: bool) -> str:
|
def _get_prefab_abi_json_text(self, abi: str, cpp: bool, shared: bool) -> str:
|
||||||
abi_json_dict = {
|
abi_json_dict = {
|
||||||
"abi": abi,
|
"abi": abi,
|
||||||
"api": self._android_api_minimum,
|
"api": self._android_api_minimum.ints[0],
|
||||||
"ndk": self._android_ndk_minimum,
|
"ndk": self._android_ndk_minimum,
|
||||||
"stl": "c++_shared" if cpp else "none",
|
"stl": "c++_shared" if cpp else "none",
|
||||||
"static": not shared,
|
"static": not shared,
|
||||||
@@ -923,7 +975,7 @@ class Releaser:
|
|||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="org.libsdl.android.{self.project}" android:versionCode="1"
|
package="org.libsdl.android.{self.project}" android:versionCode="1"
|
||||||
android:versionName="1.0">
|
android:versionName="1.0">
|
||||||
<uses-sdk android:minSdkVersion="{self._android_api_minimum}"
|
<uses-sdk android:minSdkVersion="{self._android_api_minimum.ints[0]}"
|
||||||
android:targetSdkVersion="{self._android_api_target}" />
|
android:targetSdkVersion="{self._android_api_target}" />
|
||||||
</manifest>
|
</manifest>
|
||||||
""")
|
""")
|
||||||
@@ -933,7 +985,8 @@ class Releaser:
|
|||||||
if not cmake_toolchain_file.exists():
|
if not cmake_toolchain_file.exists():
|
||||||
logger.error("CMake toolchain file does not exist (%s)", cmake_toolchain_file)
|
logger.error("CMake toolchain file does not exist (%s)", cmake_toolchain_file)
|
||||||
raise SystemExit(1)
|
raise SystemExit(1)
|
||||||
aar_path = self.dist_path / f"{self.project}-{self.version}.aar"
|
aar_path = self.root / "build-android" / f"{self.project}-{self.version}.aar"
|
||||||
|
android_dist_path = self.dist_path / f"{self.project}-devel-{self.version}-android.zip"
|
||||||
android_abis = self.release_info["android"]["abis"]
|
android_abis = self.release_info["android"]["abis"]
|
||||||
java_jars_added = False
|
java_jars_added = False
|
||||||
module_data_added = False
|
module_data_added = False
|
||||||
@@ -941,16 +994,27 @@ class Releaser:
|
|||||||
shutil.rmtree(android_deps_path, ignore_errors=True)
|
shutil.rmtree(android_deps_path, ignore_errors=True)
|
||||||
|
|
||||||
for dep, depinfo in self.release_info["android"].get("dependencies", {}).items():
|
for dep, depinfo in self.release_info["android"].get("dependencies", {}).items():
|
||||||
android_aar = self.deps_path / glob.glob(depinfo["artifact"], root_dir=self.deps_path)[0]
|
dep_devel_zip = self.deps_path / glob.glob(depinfo["artifact"], root_dir=self.deps_path)[0]
|
||||||
with self.section_printer.group(f"Extracting Android dependency {dep} ({android_aar.name})"):
|
|
||||||
self.executer.run([sys.executable, str(android_aar), "-o", str(android_deps_path)])
|
dep_extract_path = self.deps_path / f"extract/android/{dep}"
|
||||||
|
shutil.rmtree(dep_extract_path, ignore_errors=True)
|
||||||
|
dep_extract_path.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
with self.section_printer.group(f"Extracting Android dependency {dep} ({dep_devel_zip})"):
|
||||||
|
with zipfile.ZipFile(dep_devel_zip, "r") as zf:
|
||||||
|
zf.extractall(dep_extract_path)
|
||||||
|
|
||||||
|
dep_devel_aar = dep_extract_path / glob.glob("*.aar", root_dir=dep_extract_path)[0]
|
||||||
|
self.executer.run([sys.executable, str(dep_devel_aar), "-o", str(android_deps_path)])
|
||||||
|
|
||||||
for module_name, module_info in self.release_info["android"]["modules"].items():
|
for module_name, module_info in self.release_info["android"]["modules"].items():
|
||||||
assert "type" in module_info and module_info["type"] in ("interface", "library"), f"module {module_name} must have a valid type"
|
assert "type" in module_info and module_info["type"] in ("interface", "library"), f"module {module_name} must have a valid type"
|
||||||
|
|
||||||
archive_file_tree = ArchiveFileTree()
|
aar_file_tree = ArchiveFileTree()
|
||||||
|
android_devel_file_tree = ArchiveFileTree()
|
||||||
|
|
||||||
for android_abi in android_abis:
|
for android_abi in android_abis:
|
||||||
|
extra_link_options = ANDROID_ABI_EXTRA_LINK_OPTIONS.get(android_abi, "")
|
||||||
with self.section_printer.group(f"Building for Android {android_api} {android_abi}"):
|
with self.section_printer.group(f"Building for Android {android_api} {android_abi}"):
|
||||||
build_dir = self.root / "build-android" / f"{android_abi}-build"
|
build_dir = self.root / "build-android" / f"{android_abi}-build"
|
||||||
install_dir = self.root / "install-android" / f"{android_abi}-install"
|
install_dir = self.root / "install-android" / f"{android_abi}-install"
|
||||||
@@ -961,8 +1025,11 @@ class Releaser:
|
|||||||
"cmake",
|
"cmake",
|
||||||
"-S", str(self.root),
|
"-S", str(self.root),
|
||||||
"-B", str(build_dir),
|
"-B", str(build_dir),
|
||||||
f'''-DCMAKE_C_FLAGS="-ffile-prefix-map={self.root}=/src/{self.project}"''',
|
# NDK 21e does not support -ffile-prefix-map
|
||||||
f'''-DCMAKE_CXX_FLAGS="-ffile-prefix-map={self.root}=/src/{self.project}"''',
|
# f'''-DCMAKE_C_FLAGS="-ffile-prefix-map={self.root}=/src/{self.project}"''',
|
||||||
|
# f'''-DCMAKE_CXX_FLAGS="-ffile-prefix-map={self.root}=/src/{self.project}"''',
|
||||||
|
f"-DCMAKE_EXE_LINKER_FLAGS={extra_link_options}",
|
||||||
|
f"-DCMAKE_SHARED_LINKER_FLAGS={extra_link_options}",
|
||||||
f"-DCMAKE_TOOLCHAIN_FILE={cmake_toolchain_file}",
|
f"-DCMAKE_TOOLCHAIN_FILE={cmake_toolchain_file}",
|
||||||
f"-DCMAKE_PREFIX_PATH={str(android_deps_path)}",
|
f"-DCMAKE_PREFIX_PATH={str(android_deps_path)}",
|
||||||
f"-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH",
|
f"-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH",
|
||||||
@@ -999,20 +1066,20 @@ class Releaser:
|
|||||||
assert library.suffix in (".so", ".a")
|
assert library.suffix in (".so", ".a")
|
||||||
assert library.is_file(), f"CMake should have built library '{library}' for module {module_name}"
|
assert library.is_file(), f"CMake should have built library '{library}' for module {module_name}"
|
||||||
arcdir_prefab_libs = f"{arcdir_prefab_module}/libs/android.{android_abi}"
|
arcdir_prefab_libs = f"{arcdir_prefab_module}/libs/android.{android_abi}"
|
||||||
archive_file_tree.add_file(NodeInArchive.from_fs(arcpath=f"{arcdir_prefab_libs}/{library.name}", path=library, time=self.arc_time))
|
aar_file_tree.add_file(NodeInArchive.from_fs(arcpath=f"{arcdir_prefab_libs}/{library.name}", path=library, time=self.arc_time))
|
||||||
archive_file_tree.add_file(NodeInArchive.from_text(arcpath=f"{arcdir_prefab_libs}/abi.json", text=self._get_prefab_abi_json_text(abi=android_abi, cpp=False, shared=library.suffix == ".so"), time=self.arc_time))
|
aar_file_tree.add_file(NodeInArchive.from_text(arcpath=f"{arcdir_prefab_libs}/abi.json", text=self._get_prefab_abi_json_text(abi=android_abi, cpp=False, shared=library.suffix == ".so"), time=self.arc_time))
|
||||||
|
|
||||||
if not module_data_added:
|
if not module_data_added:
|
||||||
library_name = None
|
library_name = None
|
||||||
if module_info["type"] == "library":
|
if module_info["type"] == "library":
|
||||||
library_name = Path(module_info["library"]).stem.removeprefix("lib")
|
library_name = Path(module_info["library"]).stem.removeprefix("lib")
|
||||||
export_libraries = module_info.get("export-libraries", [])
|
export_libraries = module_info.get("export-libraries", [])
|
||||||
archive_file_tree.add_file(NodeInArchive.from_text(arcpath=arc_join(arcdir_prefab_module, "module.json"), text=self._get_prefab_module_json_text(library_name=library_name, export_libraries=export_libraries), time=self.arc_time))
|
aar_file_tree.add_file(NodeInArchive.from_text(arcpath=arc_join(arcdir_prefab_module, "module.json"), text=self._get_prefab_module_json_text(library_name=library_name, export_libraries=export_libraries), time=self.arc_time))
|
||||||
arcdir_prefab_include = f"prefab/modules/{module_name}/include"
|
arcdir_prefab_include = f"prefab/modules/{module_name}/include"
|
||||||
if "includes" in module_info:
|
if "includes" in module_info:
|
||||||
archive_file_tree.add_file_mapping(arc_dir=arcdir_prefab_include, file_mapping=module_info["includes"], file_mapping_root=install_dir, context=self.get_context(), time=self.arc_time)
|
aar_file_tree.add_file_mapping(arc_dir=arcdir_prefab_include, file_mapping=module_info["includes"], file_mapping_root=install_dir, context=self.get_context(), time=self.arc_time)
|
||||||
else:
|
else:
|
||||||
archive_file_tree.add_file(NodeInArchive.from_text(arcpath=arc_join(arcdir_prefab_include, ".keep"), text="\n", time=self.arc_time))
|
aar_file_tree.add_file(NodeInArchive.from_text(arcpath=arc_join(arcdir_prefab_include, ".keep"), text="\n", time=self.arc_time))
|
||||||
module_data_added = True
|
module_data_added = True
|
||||||
|
|
||||||
if not java_jars_added:
|
if not java_jars_added:
|
||||||
@@ -1025,21 +1092,28 @@ class Releaser:
|
|||||||
assert sources_jar_path.is_file(), f"CMake should have archived the java sources into a JAR ({sources_jar_path})"
|
assert sources_jar_path.is_file(), f"CMake should have archived the java sources into a JAR ({sources_jar_path})"
|
||||||
assert doc_jar_path.is_file(), f"CMake should have archived javadoc into a JAR ({doc_jar_path})"
|
assert doc_jar_path.is_file(), f"CMake should have archived javadoc into a JAR ({doc_jar_path})"
|
||||||
|
|
||||||
archive_file_tree.add_file(NodeInArchive.from_fs(arcpath="classes.jar", path=classes_jar_path, time=self.arc_time))
|
aar_file_tree.add_file(NodeInArchive.from_fs(arcpath="classes.jar", path=classes_jar_path, time=self.arc_time))
|
||||||
archive_file_tree.add_file(NodeInArchive.from_fs(arcpath="classes-sources.jar", path=sources_jar_path, time=self.arc_time))
|
aar_file_tree.add_file(NodeInArchive.from_fs(arcpath="classes-sources.jar", path=sources_jar_path, time=self.arc_time))
|
||||||
archive_file_tree.add_file(NodeInArchive.from_fs(arcpath="classes-doc.jar", path=doc_jar_path, time=self.arc_time))
|
aar_file_tree.add_file(NodeInArchive.from_fs(arcpath="classes-doc.jar", path=doc_jar_path, time=self.arc_time))
|
||||||
|
|
||||||
assert ("jars" in self.release_info["android"] and java_jars_added) or "jars" not in self.release_info["android"], "Must have archived java JAR archives"
|
assert ("jars" in self.release_info["android"] and java_jars_added) or "jars" not in self.release_info["android"], "Must have archived java JAR archives"
|
||||||
|
|
||||||
archive_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["android"].get("files", {}), file_mapping_root=self.root, context=self.get_context(), time=self.arc_time)
|
aar_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["android"]["aar-files"], file_mapping_root=self.root, context=self.get_context(), time=self.arc_time)
|
||||||
|
|
||||||
archive_file_tree.add_file(NodeInArchive.from_text(arcpath="prefab/prefab.json", text=self._get_prefab_json_text(), time=self.arc_time))
|
aar_file_tree.add_file(NodeInArchive.from_text(arcpath="prefab/prefab.json", text=self._get_prefab_json_text(), time=self.arc_time))
|
||||||
archive_file_tree.add_file(NodeInArchive.from_text(arcpath="AndroidManifest.xml", text=self._get_android_manifest_text(), time=self.arc_time))
|
aar_file_tree.add_file(NodeInArchive.from_text(arcpath="AndroidManifest.xml", text=self._get_android_manifest_text(), time=self.arc_time))
|
||||||
|
|
||||||
with Archiver(zip_path=aar_path) as archiver:
|
with Archiver(zip_path=aar_path) as archiver:
|
||||||
archive_file_tree.add_to_archiver(archive_base="", archiver=archiver)
|
aar_file_tree.add_to_archiver(archive_base="", archiver=archiver)
|
||||||
archiver.add_git_hash(arcdir="", commit=self.commit, time=self.arc_time)
|
archiver.add_git_hash(arcdir="", commit=self.commit, time=self.arc_time)
|
||||||
self.artifacts[f"android-aar"] = aar_path
|
|
||||||
|
android_devel_file_tree.add_file(NodeInArchive.from_fs(arcpath=aar_path.name, path=aar_path))
|
||||||
|
android_devel_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["android"]["files"], file_mapping_root=self.root, context=self.get_context(), time=self.arc_time)
|
||||||
|
with Archiver(zip_path=android_dist_path) as archiver:
|
||||||
|
android_devel_file_tree.add_to_archiver(archive_base="", archiver=archiver)
|
||||||
|
archiver.add_git_hash(arcdir="", commit=self.commit, time=self.arc_time)
|
||||||
|
|
||||||
|
self.artifacts[f"android-aar"] = android_dist_path
|
||||||
|
|
||||||
def download_dependencies(self):
|
def download_dependencies(self):
|
||||||
shutil.rmtree(self.deps_path, ignore_errors=True)
|
shutil.rmtree(self.deps_path, ignore_errors=True)
|
||||||
@@ -1076,7 +1150,7 @@ class Releaser:
|
|||||||
assert len(msvc_matches) == 1, f"Exactly one archive matches msvc {dep} dependency: {msvc_matches}"
|
assert len(msvc_matches) == 1, f"Exactly one archive matches msvc {dep} dependency: {msvc_matches}"
|
||||||
if "android" in self.release_info:
|
if "android" in self.release_info:
|
||||||
android_matches = glob.glob(self.release_info["android"]["dependencies"][dep]["artifact"], root_dir=self.deps_path)
|
android_matches = glob.glob(self.release_info["android"]["dependencies"][dep]["artifact"], root_dir=self.deps_path)
|
||||||
assert len(android_matches) == 1, f"Exactly one archive matches msvc {dep} dependency: {msvc_matches}"
|
assert len(android_matches) == 1, f"Exactly one archive matches msvc {dep} dependency: {android_matches}"
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _arch_to_vs_platform(arch: str, configuration: str="Release") -> VsArchPlatformConfig:
|
def _arch_to_vs_platform(arch: str, configuration: str="Release") -> VsArchPlatformConfig:
|
||||||
@@ -1202,6 +1276,10 @@ class Releaser:
|
|||||||
platform_context = self.get_context(extra_context=arch_platform.extra_context())
|
platform_context = self.get_context(extra_context=arch_platform.extra_context())
|
||||||
|
|
||||||
build_type = "Release"
|
build_type = "Release"
|
||||||
|
extra_context = {
|
||||||
|
"ARCH": arch_platform.arch,
|
||||||
|
"PLATFORM": arch_platform.platform,
|
||||||
|
}
|
||||||
|
|
||||||
built_paths = set(install_path / configure_text(f, context=platform_context) for file_mapping in (self.release_info["msvc"]["cmake"]["files-lib"], self.release_info["msvc"]["cmake"]["files-devel"]) for files_list in file_mapping.values() for f in files_list)
|
built_paths = set(install_path / configure_text(f, context=platform_context) for file_mapping in (self.release_info["msvc"]["cmake"]["files-lib"], self.release_info["msvc"]["cmake"]["files-devel"]) for files_list in file_mapping.values() for f in files_list)
|
||||||
logger.info("CMake builds these files, to be included in the package: %s", built_paths)
|
logger.info("CMake builds these files, to be included in the package: %s", built_paths)
|
||||||
@@ -1252,7 +1330,7 @@ class Releaser:
|
|||||||
logger.info("Collecting files...")
|
logger.info("Collecting files...")
|
||||||
archive_file_tree = ArchiveFileTree()
|
archive_file_tree = ArchiveFileTree()
|
||||||
archive_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["msvc"]["cmake"]["files-lib"], file_mapping_root=install_path, context=platform_context, time=self.arc_time)
|
archive_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["msvc"]["cmake"]["files-lib"], file_mapping_root=install_path, context=platform_context, time=self.arc_time)
|
||||||
archive_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["msvc"]["files-lib"], file_mapping_root=self.root, context=self.get_context(), time=self.arc_time)
|
archive_file_tree.add_file_mapping(arc_dir="", file_mapping=self.release_info["msvc"]["files-lib"], file_mapping_root=self.root, context=self.get_context(extra_context=extra_context), time=self.arc_time)
|
||||||
|
|
||||||
logger.info("Creating %s", zip_path)
|
logger.info("Creating %s", zip_path)
|
||||||
with Archiver(zip_path=zip_path) as archiver:
|
with Archiver(zip_path=zip_path) as archiver:
|
||||||
@@ -1316,7 +1394,7 @@ def main(argv=None) -> int:
|
|||||||
parser.add_argument("--actions", choices=["download", "source", "android", "mingw", "msvc", "dmg"], required=True, nargs="+", dest="actions", help="What to do?")
|
parser.add_argument("--actions", choices=["download", "source", "android", "mingw", "msvc", "dmg"], required=True, nargs="+", dest="actions", help="What to do?")
|
||||||
parser.set_defaults(loglevel=logging.INFO)
|
parser.set_defaults(loglevel=logging.INFO)
|
||||||
parser.add_argument('--vs-year', dest="vs_year", help="Visual Studio year")
|
parser.add_argument('--vs-year', dest="vs_year", help="Visual Studio year")
|
||||||
parser.add_argument('--android-api', type=int, dest="android_api", help="Android API version")
|
parser.add_argument('--android-api', dest="android_api", help="Android API version")
|
||||||
parser.add_argument('--android-home', dest="android_home", default=os.environ.get("ANDROID_HOME"), help="Android Home folder")
|
parser.add_argument('--android-home', dest="android_home", default=os.environ.get("ANDROID_HOME"), help="Android Home folder")
|
||||||
parser.add_argument('--android-ndk-home', dest="android_ndk_home", default=os.environ.get("ANDROID_NDK_HOME"), help="Android NDK Home folder")
|
parser.add_argument('--android-ndk-home', dest="android_ndk_home", default=os.environ.get("ANDROID_NDK_HOME"), help="Android NDK Home folder")
|
||||||
parser.add_argument('--cmake-generator', dest="cmake_generator", default="Ninja", help="CMake Generator")
|
parser.add_argument('--cmake-generator', dest="cmake_generator", default="Ninja", help="CMake Generator")
|
||||||
@@ -1443,14 +1521,27 @@ def main(argv=None) -> int:
|
|||||||
if args.android_api is None:
|
if args.android_api is None:
|
||||||
with section_printer.group("Detect Android APIS"):
|
with section_printer.group("Detect Android APIS"):
|
||||||
args.android_api = releaser._detect_android_api(android_home=args.android_home)
|
args.android_api = releaser._detect_android_api(android_home=args.android_home)
|
||||||
if args.android_api is None or not (Path(args.android_home) / f"platforms/android-{args.android_api}").is_dir():
|
else:
|
||||||
|
try:
|
||||||
|
android_api_ints = tuple(int(v) for v in args.android_api.split("."))
|
||||||
|
match len(android_api_ints):
|
||||||
|
case 1: android_api_name = f"android-{android_api_ints[0]}"
|
||||||
|
case 2: android_api_name = f"android-{android_api_ints[0]}-ext-{android_api_ints[1]}"
|
||||||
|
case _: raise ValueError
|
||||||
|
except ValueError:
|
||||||
|
logger.error("Invalid --android-api, must be a 'X' or 'X.Y' version")
|
||||||
|
args.android_api = AndroidApiVersion(ints=android_api_ints, name=android_api_name)
|
||||||
|
if args.android_api is None:
|
||||||
parser.error("Invalid --android-api, and/or could not be detected")
|
parser.error("Invalid --android-api, and/or could not be detected")
|
||||||
|
android_api_path = Path(args.android_home) / f"platforms/{args.android_api.name}"
|
||||||
|
if not android_api_path.is_dir():
|
||||||
|
logger.warning(f"Android API directory does not exist ({android_api_path})")
|
||||||
with section_printer.group("Android arguments"):
|
with section_printer.group("Android arguments"):
|
||||||
print(f"android_home = {args.android_home}")
|
print(f"android_home = {args.android_home}")
|
||||||
print(f"android_ndk_home = {args.android_ndk_home}")
|
print(f"android_ndk_home = {args.android_ndk_home}")
|
||||||
print(f"android_api = {args.android_api}")
|
print(f"android_api = {args.android_api}")
|
||||||
releaser.create_android_archives(
|
releaser.create_android_archives(
|
||||||
android_api=args.android_api,
|
android_api=args.android_api.ints[0],
|
||||||
android_home=args.android_home,
|
android_home=args.android_home,
|
||||||
android_ndk_home=args.android_ndk_home,
|
android_ndk_home=args.android_ndk_home,
|
||||||
)
|
)
|
||||||
|
|||||||
Vendored
+10
-7
@@ -1,10 +1,10 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Attempt to guess a canonical system name.
|
# Attempt to guess a canonical system name.
|
||||||
# Copyright 1992-2024 Free Software Foundation, Inc.
|
# Copyright 1992-2025 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# shellcheck disable=SC2006,SC2268 # see below for rationale
|
# shellcheck disable=SC2006,SC2268 # see below for rationale
|
||||||
|
|
||||||
timestamp='2024-07-27'
|
timestamp='2025-07-10'
|
||||||
|
|
||||||
# This file is free software; you can redistribute it and/or modify it
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
# under the terms of the GNU General Public License as published by
|
# under the terms of the GNU General Public License as published by
|
||||||
@@ -60,7 +60,7 @@ version="\
|
|||||||
GNU config.guess ($timestamp)
|
GNU config.guess ($timestamp)
|
||||||
|
|
||||||
Originally written by Per Bothner.
|
Originally written by Per Bothner.
|
||||||
Copyright 1992-2024 Free Software Foundation, Inc.
|
Copyright 1992-2025 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This is free software; see the source for copying conditions. There is NO
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||||
@@ -1597,8 +1597,11 @@ EOF
|
|||||||
*:Unleashed:*:*)
|
*:Unleashed:*:*)
|
||||||
GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
|
GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
|
||||||
;;
|
;;
|
||||||
*:Ironclad:*:*)
|
x86_64:[Ii]ronclad:*:*|i?86:[Ii]ronclad:*:*)
|
||||||
GUESS=$UNAME_MACHINE-unknown-ironclad
|
GUESS=$UNAME_MACHINE-pc-ironclad-mlibc
|
||||||
|
;;
|
||||||
|
*:[Ii]ronclad:*:*)
|
||||||
|
GUESS=$UNAME_MACHINE-unknown-ironclad-mlibc
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@@ -1808,8 +1811,8 @@ fi
|
|||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
# Local variables:
|
# Local variables:
|
||||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
# eval: (add-hook 'before-save-hook 'time-stamp nil t)
|
||||||
# time-stamp-start: "timestamp='"
|
# time-stamp-start: "timestamp='"
|
||||||
# time-stamp-format: "%:y-%02m-%02d"
|
# time-stamp-format: "%Y-%02m-%02d"
|
||||||
# time-stamp-end: "'"
|
# time-stamp-end: "'"
|
||||||
# End:
|
# End:
|
||||||
Vendored
+19
-9
@@ -1,10 +1,10 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Configuration validation subroutine script.
|
# Configuration validation subroutine script.
|
||||||
# Copyright 1992-2024 Free Software Foundation, Inc.
|
# Copyright 1992-2025 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# shellcheck disable=SC2006,SC2268,SC2162 # see below for rationale
|
# shellcheck disable=SC2006,SC2268,SC2162 # see below for rationale
|
||||||
|
|
||||||
timestamp='2024-05-27'
|
timestamp='2025-07-10'
|
||||||
|
|
||||||
# This file is free software; you can redistribute it and/or modify it
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
# under the terms of the GNU General Public License as published by
|
# under the terms of the GNU General Public License as published by
|
||||||
@@ -76,7 +76,7 @@ Report bugs and patches to <config-patches@gnu.org>."
|
|||||||
version="\
|
version="\
|
||||||
GNU config.sub ($timestamp)
|
GNU config.sub ($timestamp)
|
||||||
|
|
||||||
Copyright 1992-2024 Free Software Foundation, Inc.
|
Copyright 1992-2025 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This is free software; see the source for copying conditions. There is NO
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||||
@@ -145,6 +145,7 @@ case $1 in
|
|||||||
| kfreebsd*-gnu* \
|
| kfreebsd*-gnu* \
|
||||||
| knetbsd*-gnu* \
|
| knetbsd*-gnu* \
|
||||||
| kopensolaris*-gnu* \
|
| kopensolaris*-gnu* \
|
||||||
|
| ironclad-* \
|
||||||
| linux-* \
|
| linux-* \
|
||||||
| managarm-* \
|
| managarm-* \
|
||||||
| netbsd*-eabi* \
|
| netbsd*-eabi* \
|
||||||
@@ -242,7 +243,6 @@ case $1 in
|
|||||||
| rombug \
|
| rombug \
|
||||||
| semi \
|
| semi \
|
||||||
| sequent* \
|
| sequent* \
|
||||||
| siemens \
|
|
||||||
| sgi* \
|
| sgi* \
|
||||||
| siemens \
|
| siemens \
|
||||||
| sim \
|
| sim \
|
||||||
@@ -261,7 +261,7 @@ case $1 in
|
|||||||
basic_machine=$field1-$field2
|
basic_machine=$field1-$field2
|
||||||
basic_os=
|
basic_os=
|
||||||
;;
|
;;
|
||||||
zephyr*)
|
tock* | zephyr*)
|
||||||
basic_machine=$field1-unknown
|
basic_machine=$field1-unknown
|
||||||
basic_os=$field2
|
basic_os=$field2
|
||||||
;;
|
;;
|
||||||
@@ -1194,7 +1194,7 @@ case $cpu-$vendor in
|
|||||||
xscale-* | xscalee[bl]-*)
|
xscale-* | xscalee[bl]-*)
|
||||||
cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
|
cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
|
||||||
;;
|
;;
|
||||||
arm64-* | aarch64le-*)
|
arm64-* | aarch64le-* | arm64_32-*)
|
||||||
cpu=aarch64
|
cpu=aarch64
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -1321,6 +1321,7 @@ case $cpu-$vendor in
|
|||||||
| i960 \
|
| i960 \
|
||||||
| ia16 \
|
| ia16 \
|
||||||
| ia64 \
|
| ia64 \
|
||||||
|
| intelgt \
|
||||||
| ip2k \
|
| ip2k \
|
||||||
| iq2000 \
|
| iq2000 \
|
||||||
| javascript \
|
| javascript \
|
||||||
@@ -1522,6 +1523,10 @@ EOF
|
|||||||
kernel=nto
|
kernel=nto
|
||||||
os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
|
os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
|
||||||
;;
|
;;
|
||||||
|
ironclad*)
|
||||||
|
kernel=ironclad
|
||||||
|
os=`echo "$basic_os" | sed -e 's|ironclad|mlibc|'`
|
||||||
|
;;
|
||||||
linux*)
|
linux*)
|
||||||
kernel=linux
|
kernel=linux
|
||||||
os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
|
os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
|
||||||
@@ -1976,6 +1981,7 @@ case $os in
|
|||||||
| atheos* \
|
| atheos* \
|
||||||
| auroraux* \
|
| auroraux* \
|
||||||
| aux* \
|
| aux* \
|
||||||
|
| banan_os* \
|
||||||
| beos* \
|
| beos* \
|
||||||
| bitrig* \
|
| bitrig* \
|
||||||
| bme* \
|
| bme* \
|
||||||
@@ -2022,7 +2028,6 @@ case $os in
|
|||||||
| ios* \
|
| ios* \
|
||||||
| iris* \
|
| iris* \
|
||||||
| irix* \
|
| irix* \
|
||||||
| ironclad* \
|
|
||||||
| isc* \
|
| isc* \
|
||||||
| its* \
|
| its* \
|
||||||
| l4re* \
|
| l4re* \
|
||||||
@@ -2118,6 +2123,7 @@ case $os in
|
|||||||
| sysv* \
|
| sysv* \
|
||||||
| tenex* \
|
| tenex* \
|
||||||
| tirtos* \
|
| tirtos* \
|
||||||
|
| tock* \
|
||||||
| toppers* \
|
| toppers* \
|
||||||
| tops10* \
|
| tops10* \
|
||||||
| tops20* \
|
| tops20* \
|
||||||
@@ -2214,6 +2220,8 @@ case $kernel-$os-$obj in
|
|||||||
;;
|
;;
|
||||||
uclinux-uclibc*- | uclinux-gnu*- )
|
uclinux-uclibc*- | uclinux-gnu*- )
|
||||||
;;
|
;;
|
||||||
|
ironclad-mlibc*-)
|
||||||
|
;;
|
||||||
managarm-mlibc*- | managarm-kernel*- )
|
managarm-mlibc*- | managarm-kernel*- )
|
||||||
;;
|
;;
|
||||||
windows*-msvc*-)
|
windows*-msvc*-)
|
||||||
@@ -2249,6 +2257,8 @@ case $kernel-$os-$obj in
|
|||||||
;;
|
;;
|
||||||
*-eabi*- | *-gnueabi*-)
|
*-eabi*- | *-gnueabi*-)
|
||||||
;;
|
;;
|
||||||
|
ios*-simulator- | tvos*-simulator- | watchos*-simulator- )
|
||||||
|
;;
|
||||||
none--*)
|
none--*)
|
||||||
# None (no kernel, i.e. freestanding / bare metal),
|
# None (no kernel, i.e. freestanding / bare metal),
|
||||||
# can be paired with an machine code file format
|
# can be paired with an machine code file format
|
||||||
@@ -2347,8 +2357,8 @@ echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}"
|
|||||||
exit
|
exit
|
||||||
|
|
||||||
# Local variables:
|
# Local variables:
|
||||||
# eval: (add-hook 'before-save-hook 'time-stamp)
|
# eval: (add-hook 'before-save-hook 'time-stamp nil t)
|
||||||
# time-stamp-start: "timestamp='"
|
# time-stamp-start: "timestamp='"
|
||||||
# time-stamp-format: "%:y-%02m-%02d"
|
# time-stamp-format: "%Y-%02m-%02d"
|
||||||
# time-stamp-end: "'"
|
# time-stamp-end: "'"
|
||||||
# End:
|
# End:
|
||||||
@@ -966,7 +966,7 @@ macro(CheckPTHREAD)
|
|||||||
if(CMAKE_C_COMPILER_ID MATCHES "SunPro")
|
if(CMAKE_C_COMPILER_ID MATCHES "SunPro")
|
||||||
set(PTHREAD_LDFLAGS "-mt -lpthread")
|
set(PTHREAD_LDFLAGS "-mt -lpthread")
|
||||||
else()
|
else()
|
||||||
set(PTHREAD_LDFLAGS "-pthread -lposix4")
|
set(PTHREAD_LDFLAGS "-pthread")
|
||||||
endif()
|
endif()
|
||||||
elseif(SYSV5)
|
elseif(SYSV5)
|
||||||
set(PTHREAD_CFLAGS "-D_REENTRANT -Kthread")
|
set(PTHREAD_CFLAGS "-D_REENTRANT -Kthread")
|
||||||
|
|||||||
@@ -3515,7 +3515,7 @@ orig_CFLAGS="$CFLAGS"
|
|||||||
|
|
||||||
# See docs/release_checklist.md
|
# See docs/release_checklist.md
|
||||||
SDL_MAJOR_VERSION=2
|
SDL_MAJOR_VERSION=2
|
||||||
SDL_MINOR_VERSION=32
|
SDL_MINOR_VERSION=33
|
||||||
SDL_MICRO_VERSION=0
|
SDL_MICRO_VERSION=0
|
||||||
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
|
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
|
||||||
|
|
||||||
@@ -19755,6 +19755,12 @@ if test "x$ac_cv_func_sigaction" = xyes
|
|||||||
then :
|
then :
|
||||||
printf "%s\n" "#define HAVE_SIGACTION 1" >>confdefs.h
|
printf "%s\n" "#define HAVE_SIGACTION 1" >>confdefs.h
|
||||||
|
|
||||||
|
fi
|
||||||
|
ac_fn_c_check_func "$LINENO" "sigtimedwait" "ac_cv_func_sigtimedwait"
|
||||||
|
if test "x$ac_cv_func_sigtimedwait" = xyes
|
||||||
|
then :
|
||||||
|
printf "%s\n" "#define HAVE_SIGTIMEDWAIT 1" >>confdefs.h
|
||||||
|
|
||||||
fi
|
fi
|
||||||
ac_fn_c_check_func "$LINENO" "setjmp" "ac_cv_func_setjmp"
|
ac_fn_c_check_func "$LINENO" "setjmp" "ac_cv_func_setjmp"
|
||||||
if test "x$ac_cv_func_setjmp" = xyes
|
if test "x$ac_cv_func_setjmp" = xyes
|
||||||
@@ -22422,7 +22428,6 @@ printf %s "checking for NAS audio support... " >&6; }
|
|||||||
have_nas=yes
|
have_nas=yes
|
||||||
NAS_CFLAGS="-I/usr/X11R6/include/"
|
NAS_CFLAGS="-I/usr/X11R6/include/"
|
||||||
NAS_LIBS="-L/usr/X11R6/lib -laudio -lXt"
|
NAS_LIBS="-L/usr/X11R6/lib -laudio -lXt"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_nas" >&5
|
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $have_nas" >&5
|
||||||
@@ -28394,7 +28399,8 @@ fi
|
|||||||
|
|
||||||
if test x$hidapi_support = xyes; then
|
if test x$hidapi_support = xyes; then
|
||||||
if test x$have_libusb_h = xyes; then
|
if test x$have_libusb_h = xyes; then
|
||||||
printf "%s\n" "#define HAVE_LIBUSB 1" >>confdefs.h
|
|
||||||
|
printf "%s\n" "#define HAVE_LIBUSB 1" >>confdefs.h
|
||||||
|
|
||||||
EXTRA_CFLAGS="$EXTRA_CFLAGS $LIBUSB_CFLAGS"
|
EXTRA_CFLAGS="$EXTRA_CFLAGS $LIBUSB_CFLAGS"
|
||||||
if test x$require_hidapi_libusb = xyes; then
|
if test x$require_hidapi_libusb = xyes; then
|
||||||
@@ -28741,12 +28747,23 @@ printf "%s\n" "#define SDL_VIDEO_DRIVER_ANDROID 1" >>confdefs.h
|
|||||||
if test x$enable_audio = xyes; then
|
if test x$enable_audio = xyes; then
|
||||||
case $ARCH in
|
case $ARCH in
|
||||||
sysv5|solaris|hpux)
|
sysv5|solaris|hpux)
|
||||||
|
# Newer Solaris-based systems, like OpenIndiana, don't have this interface anymore. Check for the header first.
|
||||||
|
ac_fn_c_check_header_compile "$LINENO" "sys/audioio.h" "ac_cv_header_sys_audioio_h" "$ac_includes_default"
|
||||||
|
if test "x$ac_cv_header_sys_audioio_h" = xyes
|
||||||
|
then :
|
||||||
|
have_sys_audioio_h=yes
|
||||||
|
else $as_nop
|
||||||
|
have_sys_audioio_h=no
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x$have_sys_audioio_h = xyes; then
|
||||||
|
|
||||||
printf "%s\n" "#define SDL_AUDIO_DRIVER_SUNAUDIO 1" >>confdefs.h
|
printf "%s\n" "#define SDL_AUDIO_DRIVER_SUNAUDIO 1" >>confdefs.h
|
||||||
|
|
||||||
SOURCES="$SOURCES $srcdir/src/audio/sun/*.c"
|
SOURCES="$SOURCES $srcdir/src/audio/sun/*.c"
|
||||||
SUMMARY_audio="${SUMMARY_audio} sun"
|
SUMMARY_audio="${SUMMARY_audio} sun"
|
||||||
have_audio=yes
|
have_audio=yes
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
netbsd) # Don't use this on OpenBSD, it's busted.
|
netbsd) # Don't use this on OpenBSD, it's busted.
|
||||||
|
|
||||||
|
|||||||
+11
-8
@@ -12,7 +12,7 @@ orig_CFLAGS="$CFLAGS"
|
|||||||
dnl Set various version strings - taken gratefully from the GTk sources
|
dnl Set various version strings - taken gratefully from the GTk sources
|
||||||
# See docs/release_checklist.md
|
# See docs/release_checklist.md
|
||||||
SDL_MAJOR_VERSION=2
|
SDL_MAJOR_VERSION=2
|
||||||
SDL_MINOR_VERSION=32
|
SDL_MINOR_VERSION=33
|
||||||
SDL_MICRO_VERSION=0
|
SDL_MICRO_VERSION=0
|
||||||
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
|
SDL_VERSION=$SDL_MAJOR_VERSION.$SDL_MINOR_VERSION.$SDL_MICRO_VERSION
|
||||||
|
|
||||||
@@ -359,7 +359,7 @@ dnl Checks for library functions.
|
|||||||
AC_DEFINE(HAVE_MPROTECT, 1, [ ])
|
AC_DEFINE(HAVE_MPROTECT, 1, [ ])
|
||||||
],[]),
|
],[]),
|
||||||
)
|
)
|
||||||
AC_CHECK_FUNCS(malloc calloc realloc free getenv setenv putenv unsetenv bsearch qsort abs bcopy memset memcmp memcpy memmove wcslen wcslcpy wcslcat _wcsdup wcsdup wcsstr wcscmp wcsncmp wcscasecmp _wcsicmp wcsncasecmp _wcsnicmp strlen strlcpy strlcat _strrev _strupr _strlwr index rindex strchr strrchr strstr strtok_r itoa _ltoa _uitoa _ultoa strtod strtol strtoul _i64toa _ui64toa strtoll strtoull atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp strcasestr vsscanf vsnprintf fopen64 fseeko fseeko64 sigaction setjmp nanosleep sysconf sysctlbyname getauxval elf_aux_info poll memfd_create posix_fallocate _Exit)
|
AC_CHECK_FUNCS(malloc calloc realloc free getenv setenv putenv unsetenv bsearch qsort abs bcopy memset memcmp memcpy memmove wcslen wcslcpy wcslcat _wcsdup wcsdup wcsstr wcscmp wcsncmp wcscasecmp _wcsicmp wcsncasecmp _wcsnicmp strlen strlcpy strlcat _strrev _strupr _strlwr index rindex strchr strrchr strstr strtok_r itoa _ltoa _uitoa _ultoa strtod strtol strtoul _i64toa _ui64toa strtoll strtoull atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp strcasestr vsscanf vsnprintf fopen64 fseeko fseeko64 sigaction sigtimedwait setjmp nanosleep sysconf sysctlbyname getauxval elf_aux_info poll memfd_create posix_fallocate _Exit)
|
||||||
|
|
||||||
AC_CHECK_LIB(m, pow, [LIBS="$LIBS -lm"; EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lm"])
|
AC_CHECK_LIB(m, pow, [LIBS="$LIBS -lm"; EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lm"])
|
||||||
AC_CHECK_FUNCS(acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf copysign copysignf cos cosf exp expf fabs fabsf floor floorf trunc truncf fmod fmodf log logf log10 log10f lround lroundf pow powf round roundf scalbn scalbnf sin sinf sqrt sqrtf tan tanf)
|
AC_CHECK_FUNCS(acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf copysign copysignf cos cosf exp expf fabs fabsf floor floorf trunc truncf fmod fmodf log logf log10 log10f lround lroundf pow powf round roundf scalbn scalbnf sin sinf sqrt sqrtf tan tanf)
|
||||||
@@ -1247,7 +1247,6 @@ CheckNAS()
|
|||||||
have_nas=yes
|
have_nas=yes
|
||||||
NAS_CFLAGS="-I/usr/X11R6/include/"
|
NAS_CFLAGS="-I/usr/X11R6/include/"
|
||||||
NAS_LIBS="-L/usr/X11R6/lib -laudio -lXt"
|
NAS_LIBS="-L/usr/X11R6/lib -laudio -lXt"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_MSG_RESULT($have_nas)
|
AC_MSG_RESULT($have_nas)
|
||||||
@@ -3636,7 +3635,7 @@ CheckHIDAPI()
|
|||||||
|
|
||||||
if test x$hidapi_support = xyes; then
|
if test x$hidapi_support = xyes; then
|
||||||
if test x$have_libusb_h = xyes; then
|
if test x$have_libusb_h = xyes; then
|
||||||
AC_DEFINE(HAVE_LIBUSB)
|
AC_DEFINE(HAVE_LIBUSB, 1, [ ])
|
||||||
EXTRA_CFLAGS="$EXTRA_CFLAGS $LIBUSB_CFLAGS"
|
EXTRA_CFLAGS="$EXTRA_CFLAGS $LIBUSB_CFLAGS"
|
||||||
if test x$require_hidapi_libusb = xyes; then
|
if test x$require_hidapi_libusb = xyes; then
|
||||||
EXTRA_LDFLAGS="$EXTRA_LDFLAGS $LIBUSB_LIBS"
|
EXTRA_LDFLAGS="$EXTRA_LDFLAGS $LIBUSB_LIBS"
|
||||||
@@ -3869,10 +3868,14 @@ case "$host" in
|
|||||||
if test x$enable_audio = xyes; then
|
if test x$enable_audio = xyes; then
|
||||||
case $ARCH in
|
case $ARCH in
|
||||||
sysv5|solaris|hpux)
|
sysv5|solaris|hpux)
|
||||||
AC_DEFINE(SDL_AUDIO_DRIVER_SUNAUDIO, 1, [ ])
|
# Newer Solaris-based systems, like OpenIndiana, don't have this interface anymore. Check for the header first.
|
||||||
SOURCES="$SOURCES $srcdir/src/audio/sun/*.c"
|
AC_CHECK_HEADER(sys/audioio.h, have_sys_audioio_h=yes, have_sys_audioio_h=no)
|
||||||
SUMMARY_audio="${SUMMARY_audio} sun"
|
if test x$have_sys_audioio_h = xyes; then
|
||||||
have_audio=yes
|
AC_DEFINE(SDL_AUDIO_DRIVER_SUNAUDIO, 1, [ ])
|
||||||
|
SOURCES="$SOURCES $srcdir/src/audio/sun/*.c"
|
||||||
|
SUMMARY_audio="${SUMMARY_audio} sun"
|
||||||
|
have_audio=yes
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
netbsd) # Don't use this on OpenBSD, it's busted.
|
netbsd) # Don't use this on OpenBSD, it's busted.
|
||||||
AC_DEFINE(SDL_AUDIO_DRIVER_NETBSD, 1, [ ])
|
AC_DEFINE(SDL_AUDIO_DRIVER_NETBSD, 1, [ ])
|
||||||
|
|||||||
+5
-1
@@ -11,7 +11,7 @@ Credit to
|
|||||||
## Building
|
## Building
|
||||||
To build SDL2 library for the PS2, make sure you have the latest PS2Dev status and run:
|
To build SDL2 library for the PS2, make sure you have the latest PS2Dev status and run:
|
||||||
```bash
|
```bash
|
||||||
cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=$PS2DEV/ps2sdk/ps2dev.cmake
|
cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=$PS2DEV/share/ps2dev.cmake
|
||||||
cmake --build build
|
cmake --build build
|
||||||
cmake --install build
|
cmake --install build
|
||||||
```
|
```
|
||||||
@@ -19,6 +19,10 @@ cmake --install build
|
|||||||
## Hints
|
## Hints
|
||||||
The PS2 port has a special Hint for having a dynamic VSYNC. The Hint is `SDL_HINT_PS2_DYNAMIC_VSYNC`.
|
The PS2 port has a special Hint for having a dynamic VSYNC. The Hint is `SDL_HINT_PS2_DYNAMIC_VSYNC`.
|
||||||
If you enabled the dynamic vsync having as well `SDL_RENDERER_PRESENTVSYNC` enabled, then if the app is not able to run at 60 FPS, automatically the `vsync` will be disabled having a better performance, instead of droping FPS to 30.
|
If you enabled the dynamic vsync having as well `SDL_RENDERER_PRESENTVSYNC` enabled, then if the app is not able to run at 60 FPS, automatically the `vsync` will be disabled having a better performance, instead of droping FPS to 30.
|
||||||
|
- `SDL_HINT_PS2_GS_WIDTH`: Width of the framebuffer. Defaults to 640.
|
||||||
|
- `SDL_HINT_PS2_GS_HEIGHT`: Height of the framebuffer. Defaults to 448.
|
||||||
|
- `SDL_HINT_PS2_GS_PROGRESSIVE`: Whether to use progressive, instead of interlaced. Defaults to 0.
|
||||||
|
- `SDL_HINT_PS2_GS_MODE`: Regional standard of the signal. "NTSC" (60hz), "PAL" (50hz) or "" (the console's region, default).
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
If you trying to debug a SDL app through [ps2client](https://github.com/ps2dev/ps2client) you need to avoid the IOP reset, otherwise you will lose the conection with your computer.
|
If you trying to debug a SDL app through [ps2client](https://github.com/ps2dev/ps2client) you need to avoid the IOP reset, otherwise you will lose the conection with your computer.
|
||||||
|
|||||||
+1
-1
@@ -29,7 +29,7 @@ cmake --install build
|
|||||||
|
|
||||||
|
|
||||||
## Compiling a HelloWorld
|
## Compiling a HelloWorld
|
||||||
[PSP Hello World](https://psp-dev.org/doku.php?id=tutorial:hello_world)
|
[PSP Hello World](https://pspdev.github.io/basic_programs.html#hello-world)
|
||||||
|
|
||||||
## To Do
|
## To Do
|
||||||
- PSP Screen Keyboard
|
- PSP Screen Keyboard
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ Works out of box.
|
|||||||
Windows:
|
Windows:
|
||||||
Unfortunately there is no windows support as of yet. Support for Windows 7 is planned, but we currently have no way to test. If you have a Windows 7 WM_TOUCH supported device, and are willing to help test please contact me at jim.tla+sdl_touch@gmail.com
|
Unfortunately there is no windows support as of yet. Support for Windows 7 is planned, but we currently have no way to test. If you have a Windows 7 WM_TOUCH supported device, and are willing to help test please contact me at jim.tla+sdl_touch@gmail.com
|
||||||
|
|
||||||
===========================================================================
|
|
||||||
Events
|
Events
|
||||||
===========================================================================
|
===========================================================================
|
||||||
SDL_FINGERDOWN:
|
SDL_FINGERDOWN:
|
||||||
@@ -39,7 +38,6 @@ Fields:
|
|||||||
Same as SDL_FINGERDOWN.
|
Same as SDL_FINGERDOWN.
|
||||||
|
|
||||||
|
|
||||||
===========================================================================
|
|
||||||
Functions
|
Functions
|
||||||
===========================================================================
|
===========================================================================
|
||||||
SDL provides the ability to access the underlying SDL_Finger structures.
|
SDL provides the ability to access the underlying SDL_Finger structures.
|
||||||
@@ -76,7 +74,6 @@ A SDL_Finger has the following fields:
|
|||||||
The pressure of the touch.
|
The pressure of the touch.
|
||||||
|
|
||||||
|
|
||||||
===========================================================================
|
|
||||||
Notes
|
Notes
|
||||||
===========================================================================
|
===========================================================================
|
||||||
For a complete example see test/testgesture.c
|
For a complete example see test/testgesture.c
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ extern DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *,
|
|||||||
#define SDL_enabled_assert(condition) \
|
#define SDL_enabled_assert(condition) \
|
||||||
do { \
|
do { \
|
||||||
while ( !(condition) ) { \
|
while ( !(condition) ) { \
|
||||||
static struct SDL_AssertData sdl_assert_data = { 0, 0, #condition, 0, 0, 0, 0 }; \
|
static struct SDL_AssertData sdl_assert_data = { 0, 0, #condition, NULL, 0, NULL, NULL }; \
|
||||||
const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_FILE, SDL_LINE); \
|
const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_FILE, SDL_LINE); \
|
||||||
if (sdl_assert_state == SDL_ASSERTION_RETRY) { \
|
if (sdl_assert_state == SDL_ASSERTION_RETRY) { \
|
||||||
continue; /* go again. */ \
|
continue; /* go again. */ \
|
||||||
|
|||||||
+11
-1
@@ -648,7 +648,7 @@ extern DECLSPEC int SDLCALL SDL_GetDefaultAudioInfo(char **name,
|
|||||||
* \param obtained an SDL_AudioSpec structure filled in with the actual output
|
* \param obtained an SDL_AudioSpec structure filled in with the actual output
|
||||||
* format; see SDL_OpenAudio() for more information.
|
* format; see SDL_OpenAudio() for more information.
|
||||||
* \param allowed_changes 0, or one or more flags OR'd together.
|
* \param allowed_changes 0, or one or more flags OR'd together.
|
||||||
* \returns a valid device ID that is > 0 on success or 0 on failure; call
|
* \returns a valid device ID > 0 on success or 0 on failure; call
|
||||||
* SDL_GetError() for more information.
|
* SDL_GetError() for more information.
|
||||||
*
|
*
|
||||||
* For compatibility with SDL 1.2, this will never return 1, since
|
* For compatibility with SDL 1.2, this will never return 1, since
|
||||||
@@ -1059,6 +1059,9 @@ extern DECLSPEC int SDLCALL SDL_AudioStreamGet(SDL_AudioStream *stream, void *bu
|
|||||||
* resample correctly, so this number might be lower than what you expect, or
|
* resample correctly, so this number might be lower than what you expect, or
|
||||||
* even be zero. Add more data or flush the stream if you need the data now.
|
* even be zero. Add more data or flush the stream if you need the data now.
|
||||||
*
|
*
|
||||||
|
* \param stream the audio stream to query.
|
||||||
|
* \returns the number of bytes available.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.7.
|
* \since This function is available since SDL 2.0.7.
|
||||||
*
|
*
|
||||||
* \sa SDL_NewAudioStream
|
* \sa SDL_NewAudioStream
|
||||||
@@ -1078,6 +1081,9 @@ extern DECLSPEC int SDLCALL SDL_AudioStreamAvailable(SDL_AudioStream *stream);
|
|||||||
* audio gaps in the output. Generally this is intended to signal the end of
|
* audio gaps in the output. Generally this is intended to signal the end of
|
||||||
* input, so the complete output becomes available.
|
* input, so the complete output becomes available.
|
||||||
*
|
*
|
||||||
|
* \param stream the audio stream to flush.
|
||||||
|
* \returns 0 on success, otherwise -1.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.7.
|
* \since This function is available since SDL 2.0.7.
|
||||||
*
|
*
|
||||||
* \sa SDL_NewAudioStream
|
* \sa SDL_NewAudioStream
|
||||||
@@ -1092,6 +1098,8 @@ extern DECLSPEC int SDLCALL SDL_AudioStreamFlush(SDL_AudioStream *stream);
|
|||||||
/**
|
/**
|
||||||
* Clear any pending data in the stream without converting it
|
* Clear any pending data in the stream without converting it
|
||||||
*
|
*
|
||||||
|
* \param stream the audio stream to clear.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.7.
|
* \since This function is available since SDL 2.0.7.
|
||||||
*
|
*
|
||||||
* \sa SDL_NewAudioStream
|
* \sa SDL_NewAudioStream
|
||||||
@@ -1106,6 +1114,8 @@ extern DECLSPEC void SDLCALL SDL_AudioStreamClear(SDL_AudioStream *stream);
|
|||||||
/**
|
/**
|
||||||
* Free an audio stream
|
* Free an audio stream
|
||||||
*
|
*
|
||||||
|
* \param stream the audio stream to free.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.7.
|
* \since This function is available since SDL 2.0.7.
|
||||||
*
|
*
|
||||||
* \sa SDL_NewAudioStream
|
* \sa SDL_NewAudioStream
|
||||||
|
|||||||
@@ -193,6 +193,7 @@
|
|||||||
#cmakedefine HAVE_MEMFD_CREATE 1
|
#cmakedefine HAVE_MEMFD_CREATE 1
|
||||||
#cmakedefine HAVE_POSIX_FALLOCATE 1
|
#cmakedefine HAVE_POSIX_FALLOCATE 1
|
||||||
#cmakedefine HAVE_SIGACTION 1
|
#cmakedefine HAVE_SIGACTION 1
|
||||||
|
#cmakedefine HAVE_SIGTIMEDWAIT 1
|
||||||
#cmakedefine HAVE_SA_SIGACTION 1
|
#cmakedefine HAVE_SA_SIGACTION 1
|
||||||
#cmakedefine HAVE_SETJMP 1
|
#cmakedefine HAVE_SETJMP 1
|
||||||
#cmakedefine HAVE_NANOSLEEP 1
|
#cmakedefine HAVE_NANOSLEEP 1
|
||||||
|
|||||||
@@ -195,6 +195,7 @@
|
|||||||
#undef HAVE_FSEEKO
|
#undef HAVE_FSEEKO
|
||||||
#undef HAVE_FSEEKO64
|
#undef HAVE_FSEEKO64
|
||||||
#undef HAVE_SIGACTION
|
#undef HAVE_SIGACTION
|
||||||
|
#undef HAVE_SIGTIMEDWAIT
|
||||||
#undef HAVE_SA_SIGACTION
|
#undef HAVE_SA_SIGACTION
|
||||||
#undef HAVE_SETJMP
|
#undef HAVE_SETJMP
|
||||||
#undef HAVE_NANOSLEEP
|
#undef HAVE_NANOSLEEP
|
||||||
@@ -216,6 +217,7 @@
|
|||||||
#undef HAVE__EXIT
|
#undef HAVE__EXIT
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define HAVE_STDARG_H 1
|
#define HAVE_STDARG_H 1
|
||||||
#define HAVE_STDDEF_H 1
|
#define HAVE_STDDEF_H 1
|
||||||
#define HAVE_STDINT_H 1
|
#define HAVE_STDINT_H 1
|
||||||
|
|||||||
@@ -115,7 +115,8 @@ _m_prefetch(void *__P)
|
|||||||
#include <lasxintrin.h>
|
#include <lasxintrin.h>
|
||||||
#define __LASX__
|
#define __LASX__
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_IMMINTRIN_H) && !defined(SDL_DISABLE_IMMINTRIN_H)
|
#if defined(HAVE_IMMINTRIN_H) && !defined(SDL_DISABLE_IMMINTRIN_H) && \
|
||||||
|
(defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86))
|
||||||
#include <immintrin.h>
|
#include <immintrin.h>
|
||||||
#else
|
#else
|
||||||
#if defined(__MMX__) && !defined(SDL_DISABLE_MMINTRIN_H)
|
#if defined(__MMX__) && !defined(SDL_DISABLE_MMINTRIN_H)
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
|
||||||
/* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version,
|
/* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version,
|
||||||
so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */
|
so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */
|
||||||
#ifdef __clang__
|
#if defined(__clang__) && !_SDL_HAS_BUILTIN(_m_prefetch)
|
||||||
#ifndef __PRFCHWINTRIN_H
|
#ifndef __PRFCHWINTRIN_H
|
||||||
#define __PRFCHWINTRIN_H
|
#define __PRFCHWINTRIN_H
|
||||||
static __inline__ void __attribute__((__always_inline__, __nodebug__))
|
static __inline__ void __attribute__((__always_inline__, __nodebug__))
|
||||||
|
|||||||
@@ -226,6 +226,7 @@ extern DECLSPEC int SDLCALL SDL_GameControllerNumMappings(void);
|
|||||||
/**
|
/**
|
||||||
* Get the mapping at a particular index.
|
* Get the mapping at a particular index.
|
||||||
*
|
*
|
||||||
|
* \param mapping_index mapping index.
|
||||||
* \returns the mapping string. Must be freed with SDL_free(). Returns NULL if
|
* \returns the mapping string. Must be freed with SDL_free(). Returns NULL if
|
||||||
* the index is out of range.
|
* the index is out of range.
|
||||||
*
|
*
|
||||||
@@ -850,6 +851,9 @@ extern DECLSPEC Uint8 SDLCALL SDL_GameControllerGetButton(SDL_GameController *ga
|
|||||||
/**
|
/**
|
||||||
* Get the number of touchpads on a game controller.
|
* Get the number of touchpads on a game controller.
|
||||||
*
|
*
|
||||||
|
* \param gamecontroller a controller.
|
||||||
|
* \returns number of touchpads.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.14.
|
* \since This function is available since SDL 2.0.14.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC int SDLCALL SDL_GameControllerGetNumTouchpads(SDL_GameController *gamecontroller);
|
extern DECLSPEC int SDLCALL SDL_GameControllerGetNumTouchpads(SDL_GameController *gamecontroller);
|
||||||
@@ -858,6 +862,10 @@ extern DECLSPEC int SDLCALL SDL_GameControllerGetNumTouchpads(SDL_GameController
|
|||||||
* Get the number of supported simultaneous fingers on a touchpad on a game
|
* Get the number of supported simultaneous fingers on a touchpad on a game
|
||||||
* controller.
|
* controller.
|
||||||
*
|
*
|
||||||
|
* \param gamecontroller a controller.
|
||||||
|
* \param touchpad a touchpad.
|
||||||
|
* \returns number of supported simultaneous fingers.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.14.
|
* \since This function is available since SDL 2.0.14.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC int SDLCALL SDL_GameControllerGetNumTouchpadFingers(SDL_GameController *gamecontroller, int touchpad);
|
extern DECLSPEC int SDLCALL SDL_GameControllerGetNumTouchpadFingers(SDL_GameController *gamecontroller, int touchpad);
|
||||||
@@ -865,6 +873,15 @@ extern DECLSPEC int SDLCALL SDL_GameControllerGetNumTouchpadFingers(SDL_GameCont
|
|||||||
/**
|
/**
|
||||||
* Get the current state of a finger on a touchpad on a game controller.
|
* Get the current state of a finger on a touchpad on a game controller.
|
||||||
*
|
*
|
||||||
|
* \param gamecontroller a controller.
|
||||||
|
* \param touchpad a touchpad.
|
||||||
|
* \param finger a finger.
|
||||||
|
* \param state a pointer filled with the finger state.
|
||||||
|
* \param x a pointer filled with the x position.
|
||||||
|
* \param y a pointer filled with the y position.
|
||||||
|
* \param pressure a pointer filled with pressure value.
|
||||||
|
* \returns 0 on success or negative on failure.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.14.
|
* \since This function is available since SDL 2.0.14.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC int SDLCALL SDL_GameControllerGetTouchpadFinger(SDL_GameController *gamecontroller, int touchpad, int finger, Uint8 *state, float *x, float *y, float *pressure);
|
extern DECLSPEC int SDLCALL SDL_GameControllerGetTouchpadFinger(SDL_GameController *gamecontroller, int touchpad, int finger, Uint8 *state, float *x, float *y, float *pressure);
|
||||||
|
|||||||
@@ -227,6 +227,7 @@ extern DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_id,
|
|||||||
* platform-specific path name can be used (eg: /dev/hidraw0 on Linux).
|
* platform-specific path name can be used (eg: /dev/hidraw0 on Linux).
|
||||||
*
|
*
|
||||||
* \param path The path name of the device to open.
|
* \param path The path name of the device to open.
|
||||||
|
* \param bExclusive boolean exclusive.
|
||||||
* \returns a pointer to a SDL_hid_device object on success or NULL on
|
* \returns a pointer to a SDL_hid_device object on success or NULL on
|
||||||
* failure.
|
* failure.
|
||||||
*
|
*
|
||||||
|
|||||||
+54
-2
@@ -1262,8 +1262,8 @@ extern "C" {
|
|||||||
*
|
*
|
||||||
* This variable can be set to the following values:
|
* This variable can be set to the following values:
|
||||||
*
|
*
|
||||||
* - "0": RAWINPUT drivers are not used
|
* - "0": RAWINPUT drivers are not used (the default)
|
||||||
* - "1": RAWINPUT drivers are used (the default)
|
* - "1": RAWINPUT drivers are used
|
||||||
*/
|
*/
|
||||||
#define SDL_HINT_JOYSTICK_RAWINPUT "SDL_JOYSTICK_RAWINPUT"
|
#define SDL_HINT_JOYSTICK_RAWINPUT "SDL_JOYSTICK_RAWINPUT"
|
||||||
|
|
||||||
@@ -1423,6 +1423,27 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define SDL_HINT_JOYSTICK_DEVICE "SDL_JOYSTICK_DEVICE"
|
#define SDL_HINT_JOYSTICK_DEVICE "SDL_JOYSTICK_DEVICE"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A variable containing a list of devices and their desired number of haptic
|
||||||
|
* (force feedback) enabled axis.
|
||||||
|
*
|
||||||
|
* The format of the string is a comma separated list of USB VID/PID pairs in
|
||||||
|
* hexadecimal form plus the number of desired axes, e.g.
|
||||||
|
*
|
||||||
|
* `0xAAAA/0xBBBB/1,0xCCCC/0xDDDD/3`
|
||||||
|
*
|
||||||
|
* This hint supports a "wildcard" device that will set the number of haptic
|
||||||
|
* axes on all initialized haptic devices which were not defined explicitly in
|
||||||
|
* this hint.
|
||||||
|
*
|
||||||
|
* `0xFFFF/0xFFFF/1`
|
||||||
|
*
|
||||||
|
* This hint should be set before a controller is opened. The number of haptic
|
||||||
|
* axes won't exceed the number of real axes found on the device.
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_JOYSTICK_HAPTIC_AXES "SDL_JOYSTICK_HAPTIC_AXES"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A variable controlling whether joysticks on Linux will always treat 'hat'
|
* A variable controlling whether joysticks on Linux will always treat 'hat'
|
||||||
* axis inputs (ABS_HAT0X - ABS_HAT3Y) as 8-way digital hats without checking
|
* axis inputs (ABS_HAT0X - ABS_HAT3Y) as 8-way digital hats without checking
|
||||||
@@ -2003,6 +2024,37 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED "SDL_ROG_GAMEPAD_MICE_EXCLUDED"
|
#define SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED "SDL_ROG_GAMEPAD_MICE_EXCLUDED"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Variable controlling the width of the PS2's framebuffer in pixels
|
||||||
|
*
|
||||||
|
* By default, this variable is "640"
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_PS2_GS_WIDTH "SDL_PS2_GS_WIDTH"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Variable controlling the height of the PS2's framebuffer in pixels
|
||||||
|
*
|
||||||
|
* By default, this variable is "448"
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_PS2_GS_HEIGHT "SDL_PS2_GS_HEIGHT"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Variable controlling whether the signal is interlaced or progressive
|
||||||
|
*
|
||||||
|
* - "0": Image is interlaced. (default)
|
||||||
|
* - "1": Image is progressive
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_PS2_GS_PROGRESSIVE "SDL_PS2_GS_PROGRESSIVE"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Variable controlling the video mode of the console
|
||||||
|
*
|
||||||
|
* - "": Console-native. (default)
|
||||||
|
* - "NTSC": 60hz region
|
||||||
|
* - "PAL": 50hz region
|
||||||
|
*/
|
||||||
|
#define SDL_HINT_PS2_GS_MODE "SDL_PS2_GS_MODE"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A variable controlling if VSYNC is automatically disable if doesn't reach
|
* A variable controlling if VSYNC is automatically disable if doesn't reach
|
||||||
* the enough FPS
|
* the enough FPS
|
||||||
|
|||||||
@@ -214,6 +214,9 @@ extern DECLSPEC const char *SDLCALL SDL_JoystickPathForIndex(int device_index);
|
|||||||
* Get the player index of a joystick, or -1 if it's not available This can be
|
* Get the player index of a joystick, or -1 if it's not available This can be
|
||||||
* called before any joysticks are opened.
|
* called before any joysticks are opened.
|
||||||
*
|
*
|
||||||
|
* \param device_index device index.
|
||||||
|
* \returns player index, or -1 if not available.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.9.
|
* \since This function is available since SDL 2.0.9.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC int SDLCALL SDL_JoystickGetDevicePlayerIndex(int device_index);
|
extern DECLSPEC int SDLCALL SDL_JoystickGetDevicePlayerIndex(int device_index);
|
||||||
@@ -356,6 +359,10 @@ extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickFromPlayerIndex(int player_ind
|
|||||||
/**
|
/**
|
||||||
* Attach a new virtual joystick.
|
* Attach a new virtual joystick.
|
||||||
*
|
*
|
||||||
|
* \param type joystick type.
|
||||||
|
* \param naxes number of axes.
|
||||||
|
* \param nbuttons number of buttons.
|
||||||
|
* \param nhats number of hats.
|
||||||
* \returns the joystick's device index, or -1 if an error occurred.
|
* \returns the joystick's device index, or -1 if an error occurred.
|
||||||
*
|
*
|
||||||
* \since This function is available since SDL 2.0.14.
|
* \since This function is available since SDL 2.0.14.
|
||||||
@@ -409,6 +416,7 @@ typedef struct SDL_VirtualJoystickDesc
|
|||||||
/**
|
/**
|
||||||
* Attach a new virtual joystick with extended properties.
|
* Attach a new virtual joystick with extended properties.
|
||||||
*
|
*
|
||||||
|
* \param desc joystick description.
|
||||||
* \returns the joystick's device index, or -1 if an error occurred.
|
* \returns the joystick's device index, or -1 if an error occurred.
|
||||||
*
|
*
|
||||||
* \since This function is available since SDL 2.24.0.
|
* \since This function is available since SDL 2.24.0.
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ typedef struct SDL_Keysym
|
|||||||
{
|
{
|
||||||
SDL_Scancode scancode; /**< SDL physical key code - see SDL_Scancode for details */
|
SDL_Scancode scancode; /**< SDL physical key code - see SDL_Scancode for details */
|
||||||
SDL_Keycode sym; /**< SDL virtual key code - see SDL_Keycode for details */
|
SDL_Keycode sym; /**< SDL virtual key code - see SDL_Keycode for details */
|
||||||
Uint16 mod; /**< current key modifiers */
|
Uint16 mod; /**< current key modifiers - see SDL_Keymod for details */
|
||||||
Uint32 unused;
|
Uint32 unused;
|
||||||
} SDL_Keysym;
|
} SDL_Keysym;
|
||||||
|
|
||||||
@@ -255,7 +255,7 @@ extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name);
|
|||||||
* On some platforms using this function activates the screen keyboard.
|
* On some platforms using this function activates the screen keyboard.
|
||||||
*
|
*
|
||||||
* On desktop platforms, SDL_StartTextInput() is implicitly called on SDL
|
* On desktop platforms, SDL_StartTextInput() is implicitly called on SDL
|
||||||
* window creation which will cause events SDL_TextInputEvent and
|
* video subsystem initialization which will cause SDL_TextInputEvent and
|
||||||
* SDL_TextEditingEvent to begin emitting.
|
* SDL_TextEditingEvent to begin emitting.
|
||||||
*
|
*
|
||||||
* \since This function is available since SDL 2.0.0.
|
* \since This function is available since SDL 2.0.0.
|
||||||
@@ -298,6 +298,9 @@ extern DECLSPEC void SDLCALL SDL_ClearComposition(void);
|
|||||||
/**
|
/**
|
||||||
* Returns if an IME Composite or Candidate window is currently shown.
|
* Returns if an IME Composite or Candidate window is currently shown.
|
||||||
*
|
*
|
||||||
|
* \returns SDL_TRUE if an IME Composite or Candidate window is currently
|
||||||
|
* shown else SDL_FALSE.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.22.
|
* \since This function is available since SDL 2.0.22.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC SDL_bool SDLCALL SDL_IsTextInputShown(void);
|
extern DECLSPEC SDL_bool SDLCALL SDL_IsTextInputShown(void);
|
||||||
|
|||||||
@@ -41,12 +41,18 @@
|
|||||||
*
|
*
|
||||||
* A special exception is the number keys at the top of the keyboard which map
|
* A special exception is the number keys at the top of the keyboard which map
|
||||||
* to SDLK_0...SDLK_9 on AZERTY layouts.
|
* to SDLK_0...SDLK_9 on AZERTY layouts.
|
||||||
|
*
|
||||||
|
* The actual values that might be set for this type are listed in the
|
||||||
|
* SDL_KeyCode (capital C) enumeration.
|
||||||
*/
|
*/
|
||||||
typedef Sint32 SDL_Keycode;
|
typedef Sint32 SDL_Keycode;
|
||||||
|
|
||||||
#define SDLK_SCANCODE_MASK (1<<30)
|
#define SDLK_SCANCODE_MASK (1<<30)
|
||||||
#define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK)
|
#define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The possible values for keycodes.
|
||||||
|
*/
|
||||||
typedef enum SDL_KeyCode
|
typedef enum SDL_KeyCode
|
||||||
{
|
{
|
||||||
SDLK_UNKNOWN = 0,
|
SDLK_UNKNOWN = 0,
|
||||||
|
|||||||
+1
-2
@@ -163,8 +163,7 @@ extern DECLSPEC void SDLCALL SDL_LogResetPriorities(void);
|
|||||||
/**
|
/**
|
||||||
* Log a message with SDL_LOG_CATEGORY_APPLICATION and SDL_LOG_PRIORITY_INFO.
|
* Log a message with SDL_LOG_CATEGORY_APPLICATION and SDL_LOG_PRIORITY_INFO.
|
||||||
*
|
*
|
||||||
* = * \param fmt a printf() style message format string
|
* \param fmt a printf() style message format string.
|
||||||
*
|
|
||||||
* \param ... additional parameters matching % tokens in the `fmt` string, if
|
* \param ... additional parameters matching % tokens in the `fmt` string, if
|
||||||
* any.
|
* any.
|
||||||
*
|
*
|
||||||
|
|||||||
+2
-2
@@ -187,8 +187,8 @@ extern DECLSPEC void SDLCALL SDL_SetMainReady(void);
|
|||||||
* \param name the window class name, in UTF-8 encoding. If NULL, SDL
|
* \param name the window class name, in UTF-8 encoding. If NULL, SDL
|
||||||
* currently uses "SDL_app" but this isn't guaranteed.
|
* currently uses "SDL_app" but this isn't guaranteed.
|
||||||
* \param style the value to use in WNDCLASSEX::style. If `name` is NULL, SDL
|
* \param style the value to use in WNDCLASSEX::style. If `name` is NULL, SDL
|
||||||
* currently uses `(CS_BYTEALIGNCLIENT | CS_OWNDC)` regardless of
|
* currently uses `(CS_BYTEALIGNCLIENT \| CS_OWNDC)` regardless
|
||||||
* what is specified here.
|
* of what is specified here.
|
||||||
* \param hInst the HINSTANCE to use in WNDCLASSEX::hInstance. If zero, SDL
|
* \param hInst the HINSTANCE to use in WNDCLASSEX::hInstance. If zero, SDL
|
||||||
* will use `GetModuleHandle(NULL)` instead.
|
* will use `GetModuleHandle(NULL)` instead.
|
||||||
* \returns 0 on success, -1 on error. SDL_GetError() may have details.
|
* \returns 0 on success, -1 on error. SDL_GetError() may have details.
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ typedef void *SDL_MetalView;
|
|||||||
* The returned handle can be casted directly to a NSView or UIView. To access
|
* The returned handle can be casted directly to a NSView or UIView. To access
|
||||||
* the backing CAMetalLayer, call SDL_Metal_GetLayer().
|
* the backing CAMetalLayer, call SDL_Metal_GetLayer().
|
||||||
*
|
*
|
||||||
|
* \param window the window.
|
||||||
|
* \returns handle NSView or UIView.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.12.
|
* \since This function is available since SDL 2.0.12.
|
||||||
*
|
*
|
||||||
* \sa SDL_Metal_DestroyView
|
* \sa SDL_Metal_DestroyView
|
||||||
@@ -72,6 +75,8 @@ extern DECLSPEC SDL_MetalView SDLCALL SDL_Metal_CreateView(SDL_Window * window);
|
|||||||
* This should be called before SDL_DestroyWindow, if SDL_Metal_CreateView was
|
* This should be called before SDL_DestroyWindow, if SDL_Metal_CreateView was
|
||||||
* called after SDL_CreateWindow.
|
* called after SDL_CreateWindow.
|
||||||
*
|
*
|
||||||
|
* \param view the SDL_MetalView object.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.12.
|
* \since This function is available since SDL 2.0.12.
|
||||||
*
|
*
|
||||||
* \sa SDL_Metal_CreateView
|
* \sa SDL_Metal_CreateView
|
||||||
@@ -81,6 +86,9 @@ extern DECLSPEC void SDLCALL SDL_Metal_DestroyView(SDL_MetalView view);
|
|||||||
/**
|
/**
|
||||||
* Get a pointer to the backing CAMetalLayer for the given view.
|
* Get a pointer to the backing CAMetalLayer for the given view.
|
||||||
*
|
*
|
||||||
|
* \param view the SDL_MetalView object.
|
||||||
|
* \returns a pointer.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.14.
|
* \since This function is available since SDL 2.0.14.
|
||||||
*
|
*
|
||||||
* \sa SDL_Metal_CreateView
|
* \sa SDL_Metal_CreateView
|
||||||
|
|||||||
@@ -106,6 +106,10 @@ typedef struct SDL_FRect
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if point resides inside a rectangle.
|
* Returns true if point resides inside a rectangle.
|
||||||
|
*
|
||||||
|
* \param p the point to test.
|
||||||
|
* \param r the rectangle to test.
|
||||||
|
* \returns SDL_TRUE if `p` is contained by `r`, SDL_FALSE otherwise.
|
||||||
*/
|
*/
|
||||||
SDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r)
|
SDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r)
|
||||||
{
|
{
|
||||||
@@ -115,6 +119,9 @@ SDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the rectangle has no area.
|
* Returns true if the rectangle has no area.
|
||||||
|
*
|
||||||
|
* \param r the rectangle to test.
|
||||||
|
* \returns SDL_TRUE if the rectangle is "empty", SDL_FALSE otherwise.
|
||||||
*/
|
*/
|
||||||
SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r)
|
SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r)
|
||||||
{
|
{
|
||||||
@@ -123,6 +130,10 @@ SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the two rectangles are equal.
|
* Returns true if the two rectangles are equal.
|
||||||
|
*
|
||||||
|
* \param a the first rectangle to test.
|
||||||
|
* \param b the second rectangle to test.
|
||||||
|
* \returns SDL_TRUE if the rectangles are equal, SDL_FALSE otherwise.
|
||||||
*/
|
*/
|
||||||
SDL_FORCE_INLINE SDL_bool SDL_RectEquals(const SDL_Rect *a, const SDL_Rect *b)
|
SDL_FORCE_INLINE SDL_bool SDL_RectEquals(const SDL_Rect *a, const SDL_Rect *b)
|
||||||
{
|
{
|
||||||
@@ -229,6 +240,10 @@ extern DECLSPEC SDL_bool SDLCALL SDL_IntersectRectAndLine(const SDL_Rect *
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if point resides inside a rectangle.
|
* Returns true if point resides inside a rectangle.
|
||||||
|
*
|
||||||
|
* \param p the point to test.
|
||||||
|
* \param r the rectangle to test.
|
||||||
|
* \returns SDL_TRUE if `p` is contained by `r`, SDL_FALSE otherwise.
|
||||||
*/
|
*/
|
||||||
SDL_FORCE_INLINE SDL_bool SDL_PointInFRect(const SDL_FPoint *p, const SDL_FRect *r)
|
SDL_FORCE_INLINE SDL_bool SDL_PointInFRect(const SDL_FPoint *p, const SDL_FRect *r)
|
||||||
{
|
{
|
||||||
@@ -238,6 +253,9 @@ SDL_FORCE_INLINE SDL_bool SDL_PointInFRect(const SDL_FPoint *p, const SDL_FRect
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the rectangle has no area.
|
* Returns true if the rectangle has no area.
|
||||||
|
*
|
||||||
|
* \param r the rectangle to test.
|
||||||
|
* \returns SDL_TRUE if the rectangle is "empty", SDL_FALSE otherwise.
|
||||||
*/
|
*/
|
||||||
SDL_FORCE_INLINE SDL_bool SDL_FRectEmpty(const SDL_FRect *r)
|
SDL_FORCE_INLINE SDL_bool SDL_FRectEmpty(const SDL_FRect *r)
|
||||||
{
|
{
|
||||||
@@ -247,6 +265,11 @@ SDL_FORCE_INLINE SDL_bool SDL_FRectEmpty(const SDL_FRect *r)
|
|||||||
/**
|
/**
|
||||||
* Returns true if the two rectangles are equal, within some given epsilon.
|
* Returns true if the two rectangles are equal, within some given epsilon.
|
||||||
*
|
*
|
||||||
|
* \param a the first rectangle to test.
|
||||||
|
* \param b the second rectangle to test.
|
||||||
|
* \param epsilon the epsilon value for comparison.
|
||||||
|
* \returns SDL_TRUE if the rectangles are equal, SDL_FALSE otherwise.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.22.
|
* \since This function is available since SDL 2.0.22.
|
||||||
*/
|
*/
|
||||||
SDL_FORCE_INLINE SDL_bool SDL_FRectEqualsEpsilon(const SDL_FRect *a, const SDL_FRect *b, const float epsilon)
|
SDL_FORCE_INLINE SDL_bool SDL_FRectEqualsEpsilon(const SDL_FRect *a, const SDL_FRect *b, const float epsilon)
|
||||||
@@ -262,6 +285,10 @@ SDL_FORCE_INLINE SDL_bool SDL_FRectEqualsEpsilon(const SDL_FRect *a, const SDL_F
|
|||||||
/**
|
/**
|
||||||
* Returns true if the two rectangles are equal, using a default epsilon.
|
* Returns true if the two rectangles are equal, using a default epsilon.
|
||||||
*
|
*
|
||||||
|
* \param a the first rectangle to test.
|
||||||
|
* \param b the second rectangle to test.
|
||||||
|
* \returns SDL_TRUE if the rectangles are equal, SDL_FALSE otherwise.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.22.
|
* \since This function is available since SDL 2.0.22.
|
||||||
*/
|
*/
|
||||||
SDL_FORCE_INLINE SDL_bool SDL_FRectEquals(const SDL_FRect *a, const SDL_FRect *b)
|
SDL_FORCE_INLINE SDL_bool SDL_FRectEquals(const SDL_FRect *a, const SDL_FRect *b)
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
* - single pixel lines
|
* - single pixel lines
|
||||||
* - filled rectangles
|
* - filled rectangles
|
||||||
* - texture images
|
* - texture images
|
||||||
|
* - 2D polygons
|
||||||
*
|
*
|
||||||
* The primitives may be drawn in opaque, blended, or additive modes.
|
* The primitives may be drawn in opaque, blended, or additive modes.
|
||||||
*
|
*
|
||||||
@@ -38,7 +39,7 @@
|
|||||||
* may also be stretched with linear interpolation.
|
* may also be stretched with linear interpolation.
|
||||||
*
|
*
|
||||||
* This API is designed to accelerate simple 2D operations. You may want more
|
* This API is designed to accelerate simple 2D operations. You may want more
|
||||||
* functionality such as polygons and particle effects and in that case you
|
* functionality such as 3D polygons and particle effects and in that case you
|
||||||
* should use SDL's OpenGL/Direct3D support or one of the many good 3D
|
* should use SDL's OpenGL/Direct3D support or one of the many good 3D
|
||||||
* engines.
|
* engines.
|
||||||
*
|
*
|
||||||
@@ -244,7 +245,7 @@ extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window * window,
|
|||||||
* \since This function is available since SDL 2.0.0.
|
* \since This function is available since SDL 2.0.0.
|
||||||
*
|
*
|
||||||
* \sa SDL_CreateRenderer
|
* \sa SDL_CreateRenderer
|
||||||
* \sa SDL_CreateWindowRenderer
|
* \sa SDL_CreateWindowAndRenderer
|
||||||
* \sa SDL_DestroyRenderer
|
* \sa SDL_DestroyRenderer
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surface * surface);
|
extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surface * surface);
|
||||||
@@ -787,7 +788,7 @@ extern DECLSPEC int SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer,
|
|||||||
* Get the current render target.
|
* Get the current render target.
|
||||||
*
|
*
|
||||||
* The default render target is the window for which the renderer was created,
|
* The default render target is the window for which the renderer was created,
|
||||||
* and is reported a NULL here.
|
* and is reported as NULL here.
|
||||||
*
|
*
|
||||||
* \param renderer the rendering context.
|
* \param renderer the rendering context.
|
||||||
* \returns the current render target or NULL for the default render target.
|
* \returns the current render target or NULL for the default render target.
|
||||||
|
|||||||
@@ -467,6 +467,11 @@ typedef void (SDLCALL *SDL_free_func)(void *mem);
|
|||||||
/**
|
/**
|
||||||
* Get the original set of SDL memory functions
|
* Get the original set of SDL memory functions
|
||||||
*
|
*
|
||||||
|
* \param malloc_func filled with malloc function.
|
||||||
|
* \param calloc_func filled with calloc function.
|
||||||
|
* \param realloc_func filled with realloc function.
|
||||||
|
* \param free_func filled with free function.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.24.0.
|
* \since This function is available since SDL 2.24.0.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC void SDLCALL SDL_GetOriginalMemoryFunctions(SDL_malloc_func *malloc_func,
|
extern DECLSPEC void SDLCALL SDL_GetOriginalMemoryFunctions(SDL_malloc_func *malloc_func,
|
||||||
@@ -477,6 +482,11 @@ extern DECLSPEC void SDLCALL SDL_GetOriginalMemoryFunctions(SDL_malloc_func *mal
|
|||||||
/**
|
/**
|
||||||
* Get the current set of SDL memory functions
|
* Get the current set of SDL memory functions
|
||||||
*
|
*
|
||||||
|
* \param malloc_func filled with malloc function.
|
||||||
|
* \param calloc_func filled with calloc function.
|
||||||
|
* \param realloc_func filled with realloc function.
|
||||||
|
* \param free_func filled with free function.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.7.
|
* \since This function is available since SDL 2.0.7.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC void SDLCALL SDL_GetMemoryFunctions(SDL_malloc_func *malloc_func,
|
extern DECLSPEC void SDLCALL SDL_GetMemoryFunctions(SDL_malloc_func *malloc_func,
|
||||||
@@ -487,6 +497,13 @@ extern DECLSPEC void SDLCALL SDL_GetMemoryFunctions(SDL_malloc_func *malloc_func
|
|||||||
/**
|
/**
|
||||||
* Replace SDL's memory allocation functions with a custom set
|
* Replace SDL's memory allocation functions with a custom set
|
||||||
*
|
*
|
||||||
|
* \param malloc_func custom malloc function.
|
||||||
|
* \param calloc_func custom calloc function.
|
||||||
|
* \param realloc_func custom realloc function.
|
||||||
|
* \param free_func custom free function.
|
||||||
|
* \returns 0 on success or -1 on failure; call SDL_GetError() for more
|
||||||
|
* information.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.7.
|
* \since This function is available since SDL 2.0.7.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC int SDLCALL SDL_SetMemoryFunctions(SDL_malloc_func malloc_func,
|
extern DECLSPEC int SDLCALL SDL_SetMemoryFunctions(SDL_malloc_func malloc_func,
|
||||||
@@ -497,6 +514,8 @@ extern DECLSPEC int SDLCALL SDL_SetMemoryFunctions(SDL_malloc_func malloc_func,
|
|||||||
/**
|
/**
|
||||||
* Get the number of outstanding (unfreed) allocations
|
* Get the number of outstanding (unfreed) allocations
|
||||||
*
|
*
|
||||||
|
* \returns number of unfreed allocations.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.7.
|
* \since This function is available since SDL 2.0.7.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC int SDLCALL SDL_GetNumAllocations(void);
|
extern DECLSPEC int SDLCALL SDL_GetNumAllocations(void);
|
||||||
@@ -565,6 +584,7 @@ SDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (dwords % 4) {
|
switch (dwords % 4) {
|
||||||
|
default:
|
||||||
case 0: do { *_p++ = _val; SDL_FALLTHROUGH;
|
case 0: do { *_p++ = _val; SDL_FALLTHROUGH;
|
||||||
case 3: *_p++ = _val; SDL_FALLTHROUGH;
|
case 3: *_p++ = _val; SDL_FALLTHROUGH;
|
||||||
case 2: *_p++ = _val; SDL_FALLTHROUGH;
|
case 2: *_p++ = _val; SDL_FALLTHROUGH;
|
||||||
@@ -715,6 +735,12 @@ extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf,
|
|||||||
* This function converts a buffer or string between encodings in one pass,
|
* This function converts a buffer or string between encodings in one pass,
|
||||||
* returning a string that must be freed with SDL_free() or NULL on error.
|
* returning a string that must be freed with SDL_free() or NULL on error.
|
||||||
*
|
*
|
||||||
|
* \param tocode the character encoding of the output string.
|
||||||
|
* \param fromcode the character encoding of data in `inbuf`.
|
||||||
|
* \param inbuf the string to convert to a different encoding.
|
||||||
|
* \param inbytesleft the size of the input string _in bytes_.
|
||||||
|
* \returns a new string, converted to the new encoding, or NULL on error.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.0.
|
* \since This function is available since SDL 2.0.0.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode,
|
extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode,
|
||||||
@@ -750,8 +776,12 @@ size_t wcslcpy(wchar_t *dst, const wchar_t *src, size_t size);
|
|||||||
size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t size);
|
size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t size);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
/* strdup is not ANSI but POSIX, and its prototype might be hidden... */
|
/* strdup is not ANSI but POSIX, and its prototype might be hidden... */
|
||||||
|
/* not for windows: might conflict with string.h where strdup may have
|
||||||
|
* dllimport attribute: https://github.com/libsdl-org/SDL/issues/12948 */
|
||||||
char *strdup(const char *str);
|
char *strdup(const char *str);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Starting LLVM 16, the analyser errors out if these functions do not have
|
/* Starting LLVM 16, the analyser errors out if these functions do not have
|
||||||
their prototype defined (clang-diagnostic-implicit-function-declaration) */
|
their prototype defined (clang-diagnostic-implicit-function-declaration) */
|
||||||
@@ -802,6 +832,11 @@ SDL_FORCE_INLINE void *SDL_memcpy4(SDL_OUT_BYTECAP(dwords*4) void *dst, SDL_IN_B
|
|||||||
*
|
*
|
||||||
* Otherwise store a * b via ret and return 0.
|
* Otherwise store a * b via ret and return 0.
|
||||||
*
|
*
|
||||||
|
* \param a the multiplicand.
|
||||||
|
* \param b the multiplier.
|
||||||
|
* \param ret on non-overflow output, stores the multiplication result.
|
||||||
|
* \returns -1 on overflow, 0 if result is multiplied without overflow.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.24.0.
|
* \since This function is available since SDL 2.24.0.
|
||||||
*/
|
*/
|
||||||
SDL_FORCE_INLINE int SDL_size_mul_overflow (size_t a,
|
SDL_FORCE_INLINE int SDL_size_mul_overflow (size_t a,
|
||||||
@@ -833,6 +868,11 @@ SDL_FORCE_INLINE int _SDL_size_mul_overflow_builtin (size_t a,
|
|||||||
*
|
*
|
||||||
* Otherwise store a + b via ret and return 0.
|
* Otherwise store a + b via ret and return 0.
|
||||||
*
|
*
|
||||||
|
* \param a the first addend.
|
||||||
|
* \param b the second addend.
|
||||||
|
* \param ret on non-overflow output, stores the addition result.
|
||||||
|
* \returns false on overflow, true if result is added without overflow.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.24.0.
|
* \since This function is available since SDL 2.24.0.
|
||||||
*/
|
*/
|
||||||
SDL_FORCE_INLINE int SDL_size_add_overflow (size_t a,
|
SDL_FORCE_INLINE int SDL_size_add_overflow (size_t a,
|
||||||
|
|||||||
+58
-6
@@ -801,15 +801,14 @@ extern DECLSPEC int SDLCALL SDL_FillRect
|
|||||||
extern DECLSPEC int SDLCALL SDL_FillRects
|
extern DECLSPEC int SDLCALL SDL_FillRects
|
||||||
(SDL_Surface * dst, const SDL_Rect * rects, int count, Uint32 color);
|
(SDL_Surface * dst, const SDL_Rect * rects, int count, Uint32 color);
|
||||||
|
|
||||||
/* !!! FIXME: merge this documentation with the wiki */
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs a fast blit from the source surface to the destination surface.
|
* Performs a fast blit from the source surface to the destination surface.
|
||||||
*
|
*
|
||||||
* This assumes that the source and destination rectangles are the same size.
|
* This assumes that the source and destination rectangles are the same size.
|
||||||
* If either `srcrect` or `dstrect` are NULL, the entire surface (`src` or
|
* `dstrect`'s width and height are ignored, only its position is used. If
|
||||||
* `dst`) is copied. The final blit rectangles are saved in `srcrect` and
|
* either `srcrect` or `dstrect` are NULL, the entire surface (`src` or `dst`)
|
||||||
* `dstrect` after all clipping is performed.
|
* is copied. The final blit rectangle is saved in `dstrect` after all
|
||||||
|
* clipping is performed.
|
||||||
*
|
*
|
||||||
* The blit function should not be called on a locked surface.
|
* The blit function should not be called on a locked surface.
|
||||||
*
|
*
|
||||||
@@ -859,7 +858,17 @@ extern DECLSPEC int SDLCALL SDL_FillRects
|
|||||||
* You should call SDL_BlitSurface() unless you know exactly how SDL blitting
|
* You should call SDL_BlitSurface() unless you know exactly how SDL blitting
|
||||||
* works internally and how to use the other blit functions.
|
* works internally and how to use the other blit functions.
|
||||||
*
|
*
|
||||||
* \returns 0 if the blit is successful, otherwise it returns -1.
|
* \param src the SDL_Surface structure to be copied from.
|
||||||
|
* \param srcrect the SDL_Rect structure representing the rectangle to be
|
||||||
|
* copied, or NULL to copy the entire surface.
|
||||||
|
* \param dst the SDL_Surface structure that is the blit target.
|
||||||
|
* \param dstrect the SDL_Rect structure representing the x and y position in
|
||||||
|
* the destination surface, or NULL for (0,0). The width and
|
||||||
|
* height are ignored, and are copied from `srcrect`. If you
|
||||||
|
* want a specific width and height, you should use
|
||||||
|
* SDL_BlitScaled().
|
||||||
|
* \returns 0 if the blit is successful or a negative error code on failure;
|
||||||
|
* call SDL_GetError() for more information.
|
||||||
*/
|
*/
|
||||||
#define SDL_BlitSurface SDL_UpperBlit
|
#define SDL_BlitSurface SDL_UpperBlit
|
||||||
|
|
||||||
@@ -869,6 +878,18 @@ extern DECLSPEC int SDLCALL SDL_FillRects
|
|||||||
* SDL_UpperBlit() has been replaced by SDL_BlitSurface(), which is merely a
|
* SDL_UpperBlit() has been replaced by SDL_BlitSurface(), which is merely a
|
||||||
* macro for this function with a less confusing name.
|
* macro for this function with a less confusing name.
|
||||||
*
|
*
|
||||||
|
* \param src the SDL_Surface structure to be copied from.
|
||||||
|
* \param srcrect the SDL_Rect structure representing the rectangle to be
|
||||||
|
* copied, or NULL to copy the entire surface.
|
||||||
|
* \param dst the SDL_Surface structure that is the blit target.
|
||||||
|
* \param dstrect the SDL_Rect structure representing the x and y position in
|
||||||
|
* the destination surface, or NULL for (0,0). The width and
|
||||||
|
* height are ignored, and are copied from `srcrect`. If you
|
||||||
|
* want a specific width and height, you should use
|
||||||
|
* SDL_BlitScaled().
|
||||||
|
* \returns 0 if the blit is successful or a negative error code on failure;
|
||||||
|
* call SDL_GetError() for more information.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.0.
|
* \since This function is available since SDL 2.0.0.
|
||||||
*
|
*
|
||||||
* \sa SDL_BlitSurface
|
* \sa SDL_BlitSurface
|
||||||
@@ -910,6 +931,13 @@ extern DECLSPEC int SDLCALL SDL_LowerBlit
|
|||||||
*
|
*
|
||||||
* Please use SDL_BlitScaled() instead.
|
* Please use SDL_BlitScaled() instead.
|
||||||
*
|
*
|
||||||
|
* \param src the surface to be copied from.
|
||||||
|
* \param srcrect the rectangle to be copied.
|
||||||
|
* \param dst the surface that is the blit target.
|
||||||
|
* \param dstrect the rectangle that is copied into.
|
||||||
|
* \returns 0 on success or a negative error code on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.0.
|
* \since This function is available since SDL 2.0.0.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface * src,
|
extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface * src,
|
||||||
@@ -920,6 +948,13 @@ extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface * src,
|
|||||||
/**
|
/**
|
||||||
* Perform bilinear scaling between two surfaces of the same format, 32BPP.
|
* Perform bilinear scaling between two surfaces of the same format, 32BPP.
|
||||||
*
|
*
|
||||||
|
* \param src the surface to be copied from.
|
||||||
|
* \param srcrect the rectangle to be copied.
|
||||||
|
* \param dst the surface that is the blit target.
|
||||||
|
* \param dstrect the rectangle that is copied into.
|
||||||
|
* \returns 0 on success or a negative error code on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.16.
|
* \since This function is available since SDL 2.0.16.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC int SDLCALL SDL_SoftStretchLinear(SDL_Surface * src,
|
extern DECLSPEC int SDLCALL SDL_SoftStretchLinear(SDL_Surface * src,
|
||||||
@@ -934,6 +969,15 @@ extern DECLSPEC int SDLCALL SDL_SoftStretchLinear(SDL_Surface * src,
|
|||||||
* SDL_UpperBlitScaled() has been replaced by SDL_BlitScaled(), which is
|
* SDL_UpperBlitScaled() has been replaced by SDL_BlitScaled(), which is
|
||||||
* merely a macro for this function with a less confusing name.
|
* merely a macro for this function with a less confusing name.
|
||||||
*
|
*
|
||||||
|
* \param src the SDL_Surface structure to be copied from.
|
||||||
|
* \param srcrect the SDL_Rect structure representing the rectangle to be
|
||||||
|
* copied, or NULL to copy the entire surface.
|
||||||
|
* \param dst the SDL_Surface structure that is the blit target.
|
||||||
|
* \param dstrect the SDL_Rect structure representing the rectangle that is
|
||||||
|
* copied into, or NULL to copy into the entire surface.
|
||||||
|
* \returns 0 on success or a negative error code on failure; call
|
||||||
|
* SDL_GetError() for more information.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.0.
|
* \since This function is available since SDL 2.0.0.
|
||||||
*
|
*
|
||||||
* \sa SDL_BlitScaled
|
* \sa SDL_BlitScaled
|
||||||
@@ -971,6 +1015,8 @@ extern DECLSPEC int SDLCALL SDL_LowerBlitScaled
|
|||||||
/**
|
/**
|
||||||
* Set the YUV conversion mode
|
* Set the YUV conversion mode
|
||||||
*
|
*
|
||||||
|
* \param mode the YUV conversion mode.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.8.
|
* \since This function is available since SDL 2.0.8.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC void SDLCALL SDL_SetYUVConversionMode(SDL_YUV_CONVERSION_MODE mode);
|
extern DECLSPEC void SDLCALL SDL_SetYUVConversionMode(SDL_YUV_CONVERSION_MODE mode);
|
||||||
@@ -978,6 +1024,8 @@ extern DECLSPEC void SDLCALL SDL_SetYUVConversionMode(SDL_YUV_CONVERSION_MODE mo
|
|||||||
/**
|
/**
|
||||||
* Get the YUV conversion mode
|
* Get the YUV conversion mode
|
||||||
*
|
*
|
||||||
|
* \returns YUV conversion mode.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.8.
|
* \since This function is available since SDL 2.0.8.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC SDL_YUV_CONVERSION_MODE SDLCALL SDL_GetYUVConversionMode(void);
|
extern DECLSPEC SDL_YUV_CONVERSION_MODE SDLCALL SDL_GetYUVConversionMode(void);
|
||||||
@@ -986,6 +1034,10 @@ extern DECLSPEC SDL_YUV_CONVERSION_MODE SDLCALL SDL_GetYUVConversionMode(void);
|
|||||||
* Get the YUV conversion mode, returning the correct mode for the resolution
|
* Get the YUV conversion mode, returning the correct mode for the resolution
|
||||||
* when the current conversion mode is SDL_YUV_CONVERSION_AUTOMATIC
|
* when the current conversion mode is SDL_YUV_CONVERSION_AUTOMATIC
|
||||||
*
|
*
|
||||||
|
* \param width the resolution width.
|
||||||
|
* \param height the resolution height.
|
||||||
|
* \returns YUV conversion mode.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.8.
|
* \since This function is available since SDL 2.0.8.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC SDL_YUV_CONVERSION_MODE SDLCALL SDL_GetYUVConversionModeForResolution(int width, int height);
|
extern DECLSPEC SDL_YUV_CONVERSION_MODE SDLCALL SDL_GetYUVConversionModeForResolution(int width, int height);
|
||||||
|
|||||||
@@ -463,6 +463,7 @@ extern DECLSPEC int SDLCALL SDL_AndroidShowToast(const char* message, int durati
|
|||||||
*
|
*
|
||||||
* \param command user command that must be greater or equal to 0x8000.
|
* \param command user command that must be greater or equal to 0x8000.
|
||||||
* \param param user parameter.
|
* \param param user parameter.
|
||||||
|
* \returns 0 on success, otherwise -1.
|
||||||
*
|
*
|
||||||
* \since This function is available since SDL 2.0.22.
|
* \since This function is available since SDL 2.0.22.
|
||||||
*/
|
*/
|
||||||
@@ -571,6 +572,26 @@ extern DECLSPEC const char * SDLCALL SDL_WinRTGetFSPathUTF8(SDL_WinRT_Path pathT
|
|||||||
*/
|
*/
|
||||||
extern DECLSPEC SDL_WinRT_DeviceFamily SDLCALL SDL_WinRTGetDeviceFamily();
|
extern DECLSPEC SDL_WinRT_DeviceFamily SDLCALL SDL_WinRTGetDeviceFamily();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the protocol activation URI if the app was launched via protocol
|
||||||
|
* activation.
|
||||||
|
*
|
||||||
|
* When a UWP/WinRT app is launched via a custom URI scheme (e.g.,
|
||||||
|
* myapp://action?param=value), this function retrieves the full activation
|
||||||
|
* URI string.
|
||||||
|
*
|
||||||
|
* The URI is only available once per activation - after the first successful
|
||||||
|
* call, subsequent calls will return NULL. This ensures the URI is processed
|
||||||
|
* only once.
|
||||||
|
*
|
||||||
|
* \returns the protocol activation URI as a UTF-8 string that must be freed
|
||||||
|
* with SDL_free(), or NULL if the app was not activated via protocol
|
||||||
|
* or the URI was already retrieved.
|
||||||
|
*
|
||||||
|
* \since This function is available since SDL 2.33.0.
|
||||||
|
*/
|
||||||
|
extern DECLSPEC char * SDLCALL SDL_WinRTGetProtocolActivationURI(void);
|
||||||
|
|
||||||
#endif /* __WINRT__ */
|
#endif /* __WINRT__ */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -99,6 +99,10 @@ extern DECLSPEC SDL_TouchID SDLCALL SDL_GetTouchDevice(int index);
|
|||||||
* Get the touch device name as reported from the driver or NULL if the index
|
* Get the touch device name as reported from the driver or NULL if the index
|
||||||
* is invalid.
|
* is invalid.
|
||||||
*
|
*
|
||||||
|
* \param index the touch device index.
|
||||||
|
* \returns touch device name, or NULL on failure; call SDL_GetError() for
|
||||||
|
* more information.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.22.
|
* \since This function is available since SDL 2.0.22.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC const char* SDLCALL SDL_GetTouchName(int index);
|
extern DECLSPEC const char* SDLCALL SDL_GetTouchName(int index);
|
||||||
@@ -106,6 +110,9 @@ extern DECLSPEC const char* SDLCALL SDL_GetTouchName(int index);
|
|||||||
/**
|
/**
|
||||||
* Get the type of the given touch device.
|
* Get the type of the given touch device.
|
||||||
*
|
*
|
||||||
|
* \param touchID the ID of a touch device.
|
||||||
|
* \returns touch device type.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.10.
|
* \since This function is available since SDL 2.0.10.
|
||||||
*/
|
*/
|
||||||
extern DECLSPEC SDL_TouchDeviceType SDLCALL SDL_GetTouchDeviceType(SDL_TouchID touchID);
|
extern DECLSPEC SDL_TouchDeviceType SDLCALL SDL_GetTouchDeviceType(SDL_TouchID touchID);
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ typedef struct SDL_version
|
|||||||
/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL
|
/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL
|
||||||
*/
|
*/
|
||||||
#define SDL_MAJOR_VERSION 2
|
#define SDL_MAJOR_VERSION 2
|
||||||
#define SDL_MINOR_VERSION 32
|
#define SDL_MINOR_VERSION 33
|
||||||
#define SDL_PATCHLEVEL 0
|
#define SDL_PATCHLEVEL 0
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1008,6 +1008,8 @@ extern DECLSPEC void SDLCALL SDL_GetWindowPosition(SDL_Window * window,
|
|||||||
* \param h the height of the window in pixels, in screen coordinates, must be
|
* \param h the height of the window in pixels, in screen coordinates, must be
|
||||||
* > 0.
|
* > 0.
|
||||||
*
|
*
|
||||||
|
* \threadsafety This function should only be called on the main thread.
|
||||||
|
*
|
||||||
* \since This function is available since SDL 2.0.0.
|
* \since This function is available since SDL 2.0.0.
|
||||||
*
|
*
|
||||||
* \sa SDL_GetWindowSize
|
* \sa SDL_GetWindowSize
|
||||||
@@ -1315,6 +1317,7 @@ extern DECLSPEC int SDLCALL SDL_SetWindowFullscreen(SDL_Window * window,
|
|||||||
/**
|
/**
|
||||||
* Return whether the window has a surface associated with it.
|
* Return whether the window has a surface associated with it.
|
||||||
*
|
*
|
||||||
|
* \param window the window to query.
|
||||||
* \returns SDL_TRUE if there is a surface associated with the window, or
|
* \returns SDL_TRUE if there is a surface associated with the window, or
|
||||||
* SDL_FALSE otherwise.
|
* SDL_FALSE otherwise.
|
||||||
*
|
*
|
||||||
|
|||||||
+15
-18
@@ -42,15 +42,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__EMSCRIPTEN__)
|
#if defined(__EMSCRIPTEN__)
|
||||||
#include <emscripten.h>
|
#include <emscripten.h>
|
||||||
/* older Emscriptens don't have this, but we need to for wasm64 compatibility. */
|
|
||||||
#ifndef MAIN_THREAD_EM_ASM_PTR
|
|
||||||
#ifdef __wasm64__
|
|
||||||
#error You need to upgrade your Emscripten compiler to support wasm64
|
|
||||||
#else
|
|
||||||
#define MAIN_THREAD_EM_ASM_PTR MAIN_THREAD_EM_ASM_INT
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The size of the stack buffer to use for rendering assert messages. */
|
/* The size of the stack buffer to use for rendering assert messages. */
|
||||||
@@ -259,7 +251,7 @@ static SDL_assert_state SDLCALL SDL_PromptAssertion(const SDL_assert_data *data,
|
|||||||
for (;;) {
|
for (;;) {
|
||||||
SDL_bool okay = SDL_TRUE;
|
SDL_bool okay = SDL_TRUE;
|
||||||
/* *INDENT-OFF* */ /* clang-format off */
|
/* *INDENT-OFF* */ /* clang-format off */
|
||||||
char *buf = (char *) MAIN_THREAD_EM_ASM_PTR({
|
int reply = MAIN_THREAD_EM_ASM_INT({
|
||||||
var str =
|
var str =
|
||||||
UTF8ToString($0) + '\n\n' +
|
UTF8ToString($0) + '\n\n' +
|
||||||
'Abort/Retry/Ignore/AlwaysIgnore? [ariA] :';
|
'Abort/Retry/Ignore/AlwaysIgnore? [ariA] :';
|
||||||
@@ -267,26 +259,31 @@ static SDL_assert_state SDLCALL SDL_PromptAssertion(const SDL_assert_data *data,
|
|||||||
if (reply === null) {
|
if (reply === null) {
|
||||||
reply = "i";
|
reply = "i";
|
||||||
}
|
}
|
||||||
return allocate(intArrayFromString(reply), 'i8', ALLOC_NORMAL);
|
return reply.length === 1 ? reply.charCodeAt(0) : -1;
|
||||||
}, message);
|
}, message);
|
||||||
/* *INDENT-ON* */ /* clang-format on */
|
/* *INDENT-ON* */ /* clang-format on */
|
||||||
|
|
||||||
if (SDL_strcmp(buf, "a") == 0) {
|
switch (reply) {
|
||||||
|
case 'a':
|
||||||
state = SDL_ASSERTION_ABORT;
|
state = SDL_ASSERTION_ABORT;
|
||||||
#if 0 /* (currently) no break functionality on Emscripten */
|
#if 0 /* (currently) no break functionality on Emscripten */
|
||||||
} else if (SDL_strcmp(buf, "b") == 0) {
|
case 'b':
|
||||||
state = SDL_ASSERTION_BREAK;
|
state = SDL_ASSERTION_BREAK;
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
} else if (SDL_strcmp(buf, "r") == 0) {
|
case 'r':
|
||||||
state = SDL_ASSERTION_RETRY;
|
state = SDL_ASSERTION_RETRY;
|
||||||
} else if (SDL_strcmp(buf, "i") == 0) {
|
break;
|
||||||
|
case 'i':
|
||||||
state = SDL_ASSERTION_IGNORE;
|
state = SDL_ASSERTION_IGNORE;
|
||||||
} else if (SDL_strcmp(buf, "A") == 0) {
|
break;
|
||||||
|
case 'A':
|
||||||
state = SDL_ASSERTION_ALWAYS_IGNORE;
|
state = SDL_ASSERTION_ALWAYS_IGNORE;
|
||||||
} else {
|
break;
|
||||||
|
default:
|
||||||
okay = SDL_FALSE;
|
okay = SDL_FALSE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
free(buf);
|
|
||||||
|
|
||||||
if (okay) {
|
if (okay) {
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -678,6 +678,7 @@ static int SDLCALL SDL_RunAudio(void *userdata)
|
|||||||
int data_len = 0;
|
int data_len = 0;
|
||||||
Uint8 *data;
|
Uint8 *data;
|
||||||
Uint8 *device_buf_keepsafe = NULL;
|
Uint8 *device_buf_keepsafe = NULL;
|
||||||
|
Uint32 delay;
|
||||||
|
|
||||||
SDL_assert(!device->iscapture);
|
SDL_assert(!device->iscapture);
|
||||||
|
|
||||||
@@ -761,7 +762,7 @@ static int SDLCALL SDL_RunAudio(void *userdata)
|
|||||||
SDL_assert((got <= 0) || (got == device->spec.size));
|
SDL_assert((got <= 0) || (got == device->spec.size));
|
||||||
|
|
||||||
if (data == NULL) { /* device is having issues... */
|
if (data == NULL) { /* device is having issues... */
|
||||||
const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq);
|
delay = ((device->spec.samples * 1000) / device->spec.freq);
|
||||||
SDL_Delay(delay); /* wait for as long as this buffer would have played. Maybe device recovers later? */
|
SDL_Delay(delay); /* wait for as long as this buffer would have played. Maybe device recovers later? */
|
||||||
} else {
|
} else {
|
||||||
if (got != device->spec.size) {
|
if (got != device->spec.size) {
|
||||||
@@ -781,7 +782,7 @@ static int SDLCALL SDL_RunAudio(void *userdata)
|
|||||||
}
|
}
|
||||||
} else if (data == device->work_buffer) {
|
} else if (data == device->work_buffer) {
|
||||||
/* nothing to do; pause like we queued a buffer to play. */
|
/* nothing to do; pause like we queued a buffer to play. */
|
||||||
const Uint32 delay = ((device->spec.samples * 1000) / device->spec.freq);
|
delay = ((device->spec.samples * 1000) / device->spec.freq);
|
||||||
SDL_Delay(delay);
|
SDL_Delay(delay);
|
||||||
} else { /* writing directly to the device. */
|
} else { /* writing directly to the device. */
|
||||||
/* queue this buffer and wait for it to finish playing. */
|
/* queue this buffer and wait for it to finish playing. */
|
||||||
@@ -791,7 +792,11 @@ static int SDLCALL SDL_RunAudio(void *userdata)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Wait for the audio to drain. */
|
/* Wait for the audio to drain. */
|
||||||
SDL_Delay(((device->spec.samples * 1000) / device->spec.freq) * 2);
|
delay = ((device->spec.samples * 1000) / device->spec.freq) * 2;
|
||||||
|
if (delay > 100) {
|
||||||
|
delay = 100;
|
||||||
|
}
|
||||||
|
SDL_Delay(delay);
|
||||||
|
|
||||||
current_audio.impl.ThreadDeinit(device);
|
current_audio.impl.ThreadDeinit(device);
|
||||||
|
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ static int (*ALSA_snd_pcm_hw_params_set_access)(snd_pcm_t *, snd_pcm_hw_params_t
|
|||||||
static int (*ALSA_snd_pcm_hw_params_set_format)(snd_pcm_t *, snd_pcm_hw_params_t *, snd_pcm_format_t);
|
static int (*ALSA_snd_pcm_hw_params_set_format)(snd_pcm_t *, snd_pcm_hw_params_t *, snd_pcm_format_t);
|
||||||
static int (*ALSA_snd_pcm_hw_params_set_channels)(snd_pcm_t *, snd_pcm_hw_params_t *, unsigned int);
|
static int (*ALSA_snd_pcm_hw_params_set_channels)(snd_pcm_t *, snd_pcm_hw_params_t *, unsigned int);
|
||||||
static int (*ALSA_snd_pcm_hw_params_get_channels)(const snd_pcm_hw_params_t *, unsigned int *);
|
static int (*ALSA_snd_pcm_hw_params_get_channels)(const snd_pcm_hw_params_t *, unsigned int *);
|
||||||
|
static int (*ALSA_snd_pcm_hw_params_get_rate)(const snd_pcm_hw_params_t *, unsigned int*, int*);
|
||||||
static int (*ALSA_snd_pcm_hw_params_set_rate_near)(snd_pcm_t *, snd_pcm_hw_params_t *, unsigned int *, int *);
|
static int (*ALSA_snd_pcm_hw_params_set_rate_near)(snd_pcm_t *, snd_pcm_hw_params_t *, unsigned int *, int *);
|
||||||
static int (*ALSA_snd_pcm_hw_params_set_period_size_near)(snd_pcm_t *, snd_pcm_hw_params_t *, snd_pcm_uframes_t *, int *);
|
static int (*ALSA_snd_pcm_hw_params_set_period_size_near)(snd_pcm_t *, snd_pcm_hw_params_t *, snd_pcm_uframes_t *, int *);
|
||||||
static int (*ALSA_snd_pcm_hw_params_get_period_size)(const snd_pcm_hw_params_t *, snd_pcm_uframes_t *, int *);
|
static int (*ALSA_snd_pcm_hw_params_get_period_size)(const snd_pcm_hw_params_t *, snd_pcm_uframes_t *, int *);
|
||||||
@@ -83,6 +84,12 @@ static int (*ALSA_snd_device_name_hint)(int, const char *, void ***);
|
|||||||
static char *(*ALSA_snd_device_name_get_hint)(const void *, const char *);
|
static char *(*ALSA_snd_device_name_get_hint)(const void *, const char *);
|
||||||
static int (*ALSA_snd_device_name_free_hint)(void **);
|
static int (*ALSA_snd_device_name_free_hint)(void **);
|
||||||
static snd_pcm_sframes_t (*ALSA_snd_pcm_avail)(snd_pcm_t *);
|
static snd_pcm_sframes_t (*ALSA_snd_pcm_avail)(snd_pcm_t *);
|
||||||
|
static int (*ALSA_snd_pcm_info)(snd_pcm_t *, snd_pcm_info_t *);
|
||||||
|
static const char *(*ALSA_snd_pcm_info_get_name)(const snd_pcm_info_t *);
|
||||||
|
static int (*ALSA_snd_pcm_info_get_card)(const snd_pcm_info_t *);
|
||||||
|
static int (*ALSA_snd_card_get_name)(int, char **);
|
||||||
|
static int (*ALSA_snd_pcm_info_malloc)(snd_pcm_info_t **);
|
||||||
|
static void (*ALSA_snd_pcm_info_free)(snd_pcm_info_t *);
|
||||||
#ifdef SND_CHMAP_API_VERSION
|
#ifdef SND_CHMAP_API_VERSION
|
||||||
static snd_pcm_chmap_t *(*ALSA_snd_pcm_get_chmap)(snd_pcm_t *);
|
static snd_pcm_chmap_t *(*ALSA_snd_pcm_get_chmap)(snd_pcm_t *);
|
||||||
static int (*ALSA_snd_pcm_chmap_print)(const snd_pcm_chmap_t *map, size_t maxlen, char *buf);
|
static int (*ALSA_snd_pcm_chmap_print)(const snd_pcm_chmap_t *map, size_t maxlen, char *buf);
|
||||||
@@ -132,6 +139,7 @@ static int load_alsa_syms(void)
|
|||||||
SDL_ALSA_SYM(snd_pcm_hw_params_set_format);
|
SDL_ALSA_SYM(snd_pcm_hw_params_set_format);
|
||||||
SDL_ALSA_SYM(snd_pcm_hw_params_set_channels);
|
SDL_ALSA_SYM(snd_pcm_hw_params_set_channels);
|
||||||
SDL_ALSA_SYM(snd_pcm_hw_params_get_channels);
|
SDL_ALSA_SYM(snd_pcm_hw_params_get_channels);
|
||||||
|
SDL_ALSA_SYM(snd_pcm_hw_params_get_rate);
|
||||||
SDL_ALSA_SYM(snd_pcm_hw_params_set_rate_near);
|
SDL_ALSA_SYM(snd_pcm_hw_params_set_rate_near);
|
||||||
SDL_ALSA_SYM(snd_pcm_hw_params_set_period_size_near);
|
SDL_ALSA_SYM(snd_pcm_hw_params_set_period_size_near);
|
||||||
SDL_ALSA_SYM(snd_pcm_hw_params_get_period_size);
|
SDL_ALSA_SYM(snd_pcm_hw_params_get_period_size);
|
||||||
@@ -152,6 +160,12 @@ static int load_alsa_syms(void)
|
|||||||
SDL_ALSA_SYM(snd_device_name_get_hint);
|
SDL_ALSA_SYM(snd_device_name_get_hint);
|
||||||
SDL_ALSA_SYM(snd_device_name_free_hint);
|
SDL_ALSA_SYM(snd_device_name_free_hint);
|
||||||
SDL_ALSA_SYM(snd_pcm_avail);
|
SDL_ALSA_SYM(snd_pcm_avail);
|
||||||
|
SDL_ALSA_SYM(snd_pcm_info);
|
||||||
|
SDL_ALSA_SYM(snd_pcm_info_get_card);
|
||||||
|
SDL_ALSA_SYM(snd_pcm_info_get_name);
|
||||||
|
SDL_ALSA_SYM(snd_card_get_name);
|
||||||
|
SDL_ALSA_SYM(snd_pcm_info_malloc);
|
||||||
|
SDL_ALSA_SYM(snd_pcm_info_free);
|
||||||
#ifdef SND_CHMAP_API_VERSION
|
#ifdef SND_CHMAP_API_VERSION
|
||||||
SDL_ALSA_SYM(snd_pcm_get_chmap);
|
SDL_ALSA_SYM(snd_pcm_get_chmap);
|
||||||
SDL_ALSA_SYM(snd_pcm_chmap_print);
|
SDL_ALSA_SYM(snd_pcm_chmap_print);
|
||||||
@@ -458,6 +472,9 @@ static void ALSA_CloseDevice(_THIS)
|
|||||||
ALSA_snd_pcm_drop() can hang, so don't use that.
|
ALSA_snd_pcm_drop() can hang, so don't use that.
|
||||||
*/
|
*/
|
||||||
Uint32 delay = ((this->spec.samples * 1000) / this->spec.freq) * 2;
|
Uint32 delay = ((this->spec.samples * 1000) / this->spec.freq) * 2;
|
||||||
|
if (delay > 100) {
|
||||||
|
delay = 100;
|
||||||
|
}
|
||||||
SDL_Delay(delay);
|
SDL_Delay(delay);
|
||||||
|
|
||||||
ALSA_snd_pcm_close(this->hidden->pcm_handle);
|
ALSA_snd_pcm_close(this->hidden->pcm_handle);
|
||||||
@@ -466,6 +483,58 @@ static void ALSA_CloseDevice(_THIS)
|
|||||||
SDL_free(this->hidden);
|
SDL_free(this->hidden);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ALSA_GetDefaultAudioInfo(char **name, SDL_AudioSpec *spec, int iscapture)
|
||||||
|
{
|
||||||
|
const char *device = "default";
|
||||||
|
snd_pcm_t *pcm_handle;
|
||||||
|
snd_pcm_info_t *pcm_info;
|
||||||
|
snd_pcm_stream_t stream;
|
||||||
|
int card_index;
|
||||||
|
const char *dev_name;
|
||||||
|
char *card_name = NULL;
|
||||||
|
char final_name[256];
|
||||||
|
|
||||||
|
SDL_zero(final_name);
|
||||||
|
stream = iscapture ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK;
|
||||||
|
|
||||||
|
if (ALSA_snd_pcm_open(&pcm_handle, device, stream, SND_PCM_NONBLOCK) < 0) {
|
||||||
|
return SDL_SetError("ALSA: Couldn't open default device");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ALSA_snd_pcm_info_malloc(&pcm_info) < 0) {
|
||||||
|
ALSA_snd_pcm_close(pcm_handle);
|
||||||
|
return SDL_SetError("ALSA: Couldn't allocate pcm_info");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ALSA_snd_pcm_info(pcm_handle, pcm_info) < 0) {
|
||||||
|
ALSA_snd_pcm_info_free(pcm_info);
|
||||||
|
ALSA_snd_pcm_close(pcm_handle);
|
||||||
|
return SDL_SetError("ALSA: Couldn't get PCM info");
|
||||||
|
}
|
||||||
|
|
||||||
|
card_index = ALSA_snd_pcm_info_get_card(pcm_info);
|
||||||
|
dev_name = ALSA_snd_pcm_info_get_name(pcm_info);
|
||||||
|
|
||||||
|
if (card_index >= 0 && ALSA_snd_card_get_name(card_index, &card_name) >= 0) {
|
||||||
|
SDL_snprintf(final_name, sizeof(final_name), "%s, %s", card_name, dev_name);
|
||||||
|
*name = SDL_strdup(final_name);
|
||||||
|
} else {
|
||||||
|
*name = SDL_strdup(dev_name ? dev_name : "Unknown ALSA Device");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spec) {
|
||||||
|
SDL_zero(*spec);
|
||||||
|
spec->freq = 48000;
|
||||||
|
spec->format = AUDIO_S16SYS;
|
||||||
|
spec->channels = 2;
|
||||||
|
spec->samples = 512;
|
||||||
|
}
|
||||||
|
|
||||||
|
ALSA_snd_pcm_info_free(pcm_info);
|
||||||
|
ALSA_snd_pcm_close(pcm_handle);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int ALSA_set_buffer_size(_THIS, snd_pcm_hw_params_t *params)
|
static int ALSA_set_buffer_size(_THIS, snd_pcm_hw_params_t *params)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
@@ -716,6 +785,16 @@ static void add_device(const int iscapture, const char *name, void *hint, ALSA_D
|
|||||||
char *desc;
|
char *desc;
|
||||||
char *handle = NULL;
|
char *handle = NULL;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
snd_pcm_t *pcm_handle;
|
||||||
|
snd_pcm_stream_t stream;
|
||||||
|
snd_pcm_hw_params_t *hwparams;
|
||||||
|
|
||||||
|
unsigned int freq = 0;
|
||||||
|
int dir;
|
||||||
|
unsigned int channels = 0;
|
||||||
|
snd_pcm_uframes_t samples = 0;
|
||||||
|
|
||||||
|
SDL_AudioSpec spec;
|
||||||
|
|
||||||
if (!dev) {
|
if (!dev) {
|
||||||
return;
|
return;
|
||||||
@@ -755,12 +834,36 @@ static void add_device(const int iscapture, const char *name, void *hint, ALSA_D
|
|||||||
SDL_free(dev);
|
SDL_free(dev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
stream = iscapture ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK;
|
||||||
|
|
||||||
|
if (ALSA_snd_pcm_open(&pcm_handle, handle, stream, SND_PCM_NONBLOCK) < 0) {
|
||||||
|
SDL_free(dev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Note that spec is NULL, because we are required to open the device before
|
snd_pcm_hw_params_alloca(&hwparams);
|
||||||
* acquiring the mix format, making this information inaccessible at
|
ALSA_snd_pcm_hw_params_any(pcm_handle, hwparams);
|
||||||
* enumeration time
|
|
||||||
*/
|
ALSA_snd_pcm_hw_params_get_rate(hwparams, &freq, &dir);
|
||||||
SDL_AddAudioDevice(iscapture, desc, NULL, handle);
|
ALSA_snd_pcm_hw_params_get_channels(hwparams, &channels);
|
||||||
|
ALSA_snd_pcm_hw_params_get_period_size(hwparams, &samples, &dir);
|
||||||
|
|
||||||
|
ALSA_snd_pcm_close(pcm_handle);
|
||||||
|
|
||||||
|
/* Let's fill the spec */
|
||||||
|
|
||||||
|
spec.freq = freq;
|
||||||
|
spec.channels = channels;
|
||||||
|
spec.samples = samples;
|
||||||
|
spec.silence = 0;
|
||||||
|
spec.padding = 0;
|
||||||
|
/* Can't calculate size yet because this is an exploratory device opening
|
||||||
|
* so we don't know the sample format.
|
||||||
|
* Probably AUDIO_S16SYS/SND_PCM_FORMAT_S16_LE would be a good default
|
||||||
|
* if required.*/
|
||||||
|
spec.size = 0;
|
||||||
|
|
||||||
|
SDL_AddAudioDevice(iscapture, desc, &spec, handle);
|
||||||
if (hint) {
|
if (hint) {
|
||||||
free(desc);
|
free(desc);
|
||||||
}
|
}
|
||||||
@@ -975,6 +1078,7 @@ static SDL_bool ALSA_Init(SDL_AudioDriverImpl *impl)
|
|||||||
impl->Deinitialize = ALSA_Deinitialize;
|
impl->Deinitialize = ALSA_Deinitialize;
|
||||||
impl->CaptureFromDevice = ALSA_CaptureFromDevice;
|
impl->CaptureFromDevice = ALSA_CaptureFromDevice;
|
||||||
impl->FlushCapture = ALSA_FlushCapture;
|
impl->FlushCapture = ALSA_FlushCapture;
|
||||||
|
impl->GetDefaultAudioInfo = ALSA_GetDefaultAudioInfo;
|
||||||
|
|
||||||
impl->HasCaptureSupport = SDL_TRUE;
|
impl->HasCaptureSupport = SDL_TRUE;
|
||||||
impl->SupportsNonPow2Samples = SDL_TRUE;
|
impl->SupportsNonPow2Samples = SDL_TRUE;
|
||||||
|
|||||||
@@ -383,7 +383,8 @@ static BOOL update_audio_session(_THIS, SDL_bool open, SDL_bool allow_playandrec
|
|||||||
|
|
||||||
hint = SDL_GetHint(SDL_HINT_AUDIO_CATEGORY);
|
hint = SDL_GetHint(SDL_HINT_AUDIO_CATEGORY);
|
||||||
if (hint) {
|
if (hint) {
|
||||||
if (SDL_strcasecmp(hint, "AVAudioSessionCategoryAmbient") == 0) {
|
if (SDL_strcasecmp(hint, "AVAudioSessionCategoryAmbient") == 0 ||
|
||||||
|
SDL_strcasecmp(hint, "ambient") == 0) {
|
||||||
category = AVAudioSessionCategoryAmbient;
|
category = AVAudioSessionCategoryAmbient;
|
||||||
} else if (SDL_strcasecmp(hint, "AVAudioSessionCategorySoloAmbient") == 0) {
|
} else if (SDL_strcasecmp(hint, "AVAudioSessionCategorySoloAmbient") == 0) {
|
||||||
category = AVAudioSessionCategorySoloAmbient;
|
category = AVAudioSessionCategorySoloAmbient;
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ static int EMSCRIPTENAUDIO_OpenDevice(_THIS, const char *devname)
|
|||||||
if ((SDL2 === undefined) || (SDL2.capture === undefined)) { return; }
|
if ((SDL2 === undefined) || (SDL2.capture === undefined)) { return; }
|
||||||
audioProcessingEvent.outputBuffer.getChannelData(0).fill(0.0);
|
audioProcessingEvent.outputBuffer.getChannelData(0).fill(0.0);
|
||||||
SDL2.capture.currentCaptureBuffer = audioProcessingEvent.inputBuffer;
|
SDL2.capture.currentCaptureBuffer = audioProcessingEvent.inputBuffer;
|
||||||
dynCall('vi', $2, [$3]);
|
dynCall('vp', $2, [$3]);
|
||||||
};
|
};
|
||||||
SDL2.capture.mediaStreamNode.connect(SDL2.capture.scriptProcessorNode);
|
SDL2.capture.mediaStreamNode.connect(SDL2.capture.scriptProcessorNode);
|
||||||
SDL2.capture.scriptProcessorNode.connect(SDL2.audioContext.destination);
|
SDL2.capture.scriptProcessorNode.connect(SDL2.audioContext.destination);
|
||||||
@@ -326,7 +326,7 @@ static int EMSCRIPTENAUDIO_OpenDevice(_THIS, const char *devname)
|
|||||||
SDL2.capture.silenceBuffer.getChannelData(0).fill(0.0);
|
SDL2.capture.silenceBuffer.getChannelData(0).fill(0.0);
|
||||||
var silence_callback = function() {
|
var silence_callback = function() {
|
||||||
SDL2.capture.currentCaptureBuffer = SDL2.capture.silenceBuffer;
|
SDL2.capture.currentCaptureBuffer = SDL2.capture.silenceBuffer;
|
||||||
dynCall('vi', $2, [$3]);
|
dynCall('vp', $2, [$3]);
|
||||||
};
|
};
|
||||||
|
|
||||||
SDL2.capture.silenceTimer = setInterval(silence_callback, ($1 / SDL2.audioContext.sampleRate) * 1000);
|
SDL2.capture.silenceTimer = setInterval(silence_callback, ($1 / SDL2.audioContext.sampleRate) * 1000);
|
||||||
@@ -351,7 +351,7 @@ static int EMSCRIPTENAUDIO_OpenDevice(_THIS, const char *devname)
|
|||||||
SDL2.audio.silenceBuffer = undefined;
|
SDL2.audio.silenceBuffer = undefined;
|
||||||
}
|
}
|
||||||
SDL2.audio.currentOutputBuffer = e['outputBuffer'];
|
SDL2.audio.currentOutputBuffer = e['outputBuffer'];
|
||||||
dynCall('vi', $2, [$3]);
|
dynCall('vp', $2, [$3]);
|
||||||
};
|
};
|
||||||
|
|
||||||
SDL2.audio.scriptProcessorNode['connect'](SDL2.audioContext['destination']);
|
SDL2.audio.scriptProcessorNode['connect'](SDL2.audioContext['destination']);
|
||||||
@@ -369,7 +369,7 @@ static int EMSCRIPTENAUDIO_OpenDevice(_THIS, const char *devname)
|
|||||||
// the buffer that gets filled here just gets ignored, so the app can make progress
|
// the buffer that gets filled here just gets ignored, so the app can make progress
|
||||||
// and/or avoid flooding audio queues until we can actually play audio.
|
// and/or avoid flooding audio queues until we can actually play audio.
|
||||||
SDL2.audio.currentOutputBuffer = SDL2.audio.silenceBuffer;
|
SDL2.audio.currentOutputBuffer = SDL2.audio.silenceBuffer;
|
||||||
dynCall('vi', $2, [$3]);
|
dynCall('vp', $2, [$3]);
|
||||||
SDL2.audio.currentOutputBuffer = undefined;
|
SDL2.audio.currentOutputBuffer = undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -413,27 +413,32 @@ static int openslES_CreatePCMPlayer(_THIS)
|
|||||||
SLresult result;
|
SLresult result;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* If we want to add floating point audio support (requires API level 21)
|
/* according to https://developer.android.com/ndk/guides/audio/opensl/opensl-for-android,
|
||||||
it can be done as described here:
|
Android's OpenSL ES only supports Uint8 and _littleendian_ Sint16.
|
||||||
https://developer.android.com/ndk/guides/audio/opensl/android-extensions.html#floating-point
|
(and float32, with an extension we use, below.) */
|
||||||
*/
|
|
||||||
if (SDL_GetAndroidSDKVersion() >= 21) {
|
if (SDL_GetAndroidSDKVersion() >= 21) {
|
||||||
SDL_AudioFormat test_format;
|
SDL_AudioFormat test_format;
|
||||||
for (test_format = SDL_FirstAudioFormat(this->spec.format); test_format; test_format = SDL_NextAudioFormat()) {
|
for (test_format = SDL_FirstAudioFormat(this->spec.format); test_format; test_format = SDL_NextAudioFormat()) {
|
||||||
if (SDL_AUDIO_ISSIGNED(test_format)) {
|
switch (test_format) {
|
||||||
|
case AUDIO_U8:
|
||||||
|
case AUDIO_S16LSB:
|
||||||
|
case AUDIO_F32LSB:
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!test_format) {
|
if (!test_format) {
|
||||||
/* Didn't find a compatible format : */
|
/* Didn't find a compatible format : */
|
||||||
LOGI("No compatible audio format, using signed 16-bit audio");
|
LOGI("No compatible audio format, using signed 16-bit LE audio");
|
||||||
test_format = AUDIO_S16SYS;
|
test_format = AUDIO_S16LSB;
|
||||||
}
|
}
|
||||||
this->spec.format = test_format;
|
this->spec.format = test_format;
|
||||||
} else {
|
} else {
|
||||||
/* Just go with signed 16-bit audio as it's the most compatible */
|
/* Just go with signed 16-bit audio as it's the most compatible */
|
||||||
this->spec.format = AUDIO_S16SYS;
|
this->spec.format = AUDIO_S16LSB;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the fragment size as size in bytes */
|
/* Update the fragment size as size in bytes */
|
||||||
|
|||||||
@@ -574,6 +574,25 @@ static SDL_bool get_int_param(const struct spa_pod *param, Uint32 key, int *val)
|
|||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SDL_AudioFormat SPAFormatToSDL(enum spa_audio_format spafmt)
|
||||||
|
{
|
||||||
|
switch (spafmt) {
|
||||||
|
#define CHECKFMT(spa,sdl) case SPA_AUDIO_FORMAT_##spa: return AUDIO_##sdl
|
||||||
|
CHECKFMT(U8, U8);
|
||||||
|
CHECKFMT(S8, S8);
|
||||||
|
CHECKFMT(S16_LE, S16LSB);
|
||||||
|
CHECKFMT(S16_BE, S16MSB);
|
||||||
|
CHECKFMT(S32_LE, S32LSB);
|
||||||
|
CHECKFMT(S32_BE, S32MSB);
|
||||||
|
CHECKFMT(F32_LE, F32LSB);
|
||||||
|
CHECKFMT(F32_BE, F32MSB);
|
||||||
|
#undef CHECKFMT
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Interface node callbacks */
|
/* Interface node callbacks */
|
||||||
static void node_event_info(void *object, const struct pw_node_info *info)
|
static void node_event_info(void *object, const struct pw_node_info *info)
|
||||||
{
|
{
|
||||||
@@ -590,7 +609,7 @@ static void node_event_info(void *object, const struct pw_node_info *info)
|
|||||||
|
|
||||||
/* Need to parse the parameters to get the sample rate */
|
/* Need to parse the parameters to get the sample rate */
|
||||||
for (i = 0; i < info->n_params; ++i) {
|
for (i = 0; i < info->n_params; ++i) {
|
||||||
pw_node_enum_params(node->proxy, 0, info->params[i].id, 0, 0, NULL);
|
pw_node_enum_params((struct pw_node*)node->proxy, 0, info->params[i].id, 0, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
hotplug_core_sync(node);
|
hotplug_core_sync(node);
|
||||||
@@ -602,6 +621,15 @@ static void node_event_param(void *object, int seq, uint32_t id, uint32_t index,
|
|||||||
struct node_object *node = object;
|
struct node_object *node = object;
|
||||||
struct io_node *io = node->userdata;
|
struct io_node *io = node->userdata;
|
||||||
|
|
||||||
|
if ((id == SPA_PARAM_Format) && (io->spec.format == 0)) {
|
||||||
|
struct spa_audio_info_raw info;
|
||||||
|
SDL_zero(info);
|
||||||
|
if (spa_format_audio_raw_parse(param, &info) == 0) {
|
||||||
|
/*SDL_Log("Sink Format: %d, Rate: %d Hz, Channels: %d", info.format, info.rate, info.channels);*/
|
||||||
|
io->spec.format = SPAFormatToSDL(info.format);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the default frequency */
|
/* Get the default frequency */
|
||||||
if (io->spec.freq == 0) {
|
if (io->spec.freq == 0) {
|
||||||
get_range_param(param, SPA_FORMAT_AUDIO_rate, &io->spec.freq, NULL, NULL);
|
get_range_param(param, SPA_FORMAT_AUDIO_rate, &io->spec.freq, NULL, NULL);
|
||||||
@@ -719,7 +747,9 @@ static void registry_event_global_callback(void *object, uint32_t id, uint32_t p
|
|||||||
/* Begin setting the node properties */
|
/* Begin setting the node properties */
|
||||||
io->id = id;
|
io->id = id;
|
||||||
io->is_capture = is_capture;
|
io->is_capture = is_capture;
|
||||||
io->spec.format = AUDIO_F32; /* Pipewire uses floats internally, other formats require conversion. */
|
if (io->spec.format == 0) {
|
||||||
|
io->spec.format = AUDIO_S16; /* we'll go conservative here if for some reason the format isn't known. */
|
||||||
|
}
|
||||||
io->name = io->buf;
|
io->name = io->buf;
|
||||||
io->path = io->buf + desc_buffer_len;
|
io->path = io->buf + desc_buffer_len;
|
||||||
SDL_strlcpy(io->buf, node_desc, desc_buffer_len);
|
SDL_strlcpy(io->buf, node_desc, desc_buffer_len);
|
||||||
|
|||||||
@@ -497,7 +497,7 @@ static void PULSEAUDIO_FlushCapture(_THIS)
|
|||||||
{
|
{
|
||||||
struct SDL_PrivateAudioData *h = this->hidden;
|
struct SDL_PrivateAudioData *h = this->hidden;
|
||||||
const void *data = NULL;
|
const void *data = NULL;
|
||||||
size_t nbytes = 0;
|
size_t nbytes = 0, buflen = 0;
|
||||||
|
|
||||||
PULSEAUDIO_pa_threaded_mainloop_lock(pulseaudio_threaded_mainloop);
|
PULSEAUDIO_pa_threaded_mainloop_lock(pulseaudio_threaded_mainloop);
|
||||||
|
|
||||||
@@ -507,19 +507,19 @@ static void PULSEAUDIO_FlushCapture(_THIS)
|
|||||||
h->capturelen = 0;
|
h->capturelen = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (SDL_AtomicGet(&this->enabled) && (PULSEAUDIO_pa_stream_readable_size(h->stream) > 0)) {
|
buflen = PULSEAUDIO_pa_stream_readable_size(h->stream);
|
||||||
|
while (SDL_AtomicGet(&this->enabled) && (buflen > 0)) {
|
||||||
PULSEAUDIO_pa_threaded_mainloop_wait(pulseaudio_threaded_mainloop);
|
PULSEAUDIO_pa_threaded_mainloop_wait(pulseaudio_threaded_mainloop);
|
||||||
if ((PULSEAUDIO_pa_context_get_state(pulseaudio_context) != PA_CONTEXT_READY) || (PULSEAUDIO_pa_stream_get_state(h->stream) != PA_STREAM_READY)) {
|
if ((PULSEAUDIO_pa_context_get_state(pulseaudio_context) != PA_CONTEXT_READY) || (PULSEAUDIO_pa_stream_get_state(h->stream) != PA_STREAM_READY)) {
|
||||||
/*printf("PULSEAUDIO DEVICE FAILURE IN FLUSHCAPTURE!\n");*/
|
/*printf("PULSEAUDIO DEVICE FAILURE IN FLUSHCAPTURE!\n");*/
|
||||||
SDL_OpenedAudioDeviceDisconnected(this);
|
SDL_OpenedAudioDeviceDisconnected(this);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
/* a fragment of audio present before FlushCapture was call is
|
||||||
if (PULSEAUDIO_pa_stream_readable_size(h->stream) > 0) {
|
available! Just drop it. */
|
||||||
/* a new fragment is available! Just dump it. */
|
PULSEAUDIO_pa_stream_peek(h->stream, &data, &nbytes);
|
||||||
PULSEAUDIO_pa_stream_peek(h->stream, &data, &nbytes);
|
PULSEAUDIO_pa_stream_drop(h->stream);
|
||||||
PULSEAUDIO_pa_stream_drop(h->stream); /* drop this fragment. */
|
buflen -= nbytes;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PULSEAUDIO_pa_threaded_mainloop_unlock(pulseaudio_threaded_mainloop);
|
PULSEAUDIO_pa_threaded_mainloop_unlock(pulseaudio_threaded_mainloop);
|
||||||
|
|||||||
@@ -24,18 +24,12 @@
|
|||||||
|
|
||||||
/* Allow access to a raw mixing buffer */
|
/* Allow access to a raw mixing buffer */
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#ifdef __NETBSD__
|
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/audioio.h>
|
#include <sys/audioio.h>
|
||||||
#endif
|
|
||||||
#ifdef __SVR4
|
|
||||||
#include <sys/audioio.h>
|
|
||||||
#else
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "SDL_timer.h"
|
#include "SDL_timer.h"
|
||||||
|
|||||||
@@ -424,9 +424,12 @@ static int device_class(struct udev_device *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_ACCELEROMETER");
|
val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_ACCELEROMETER");
|
||||||
if (SDL_GetHintBoolean(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, SDL_TRUE) &&
|
if (val && SDL_strcmp(val, "1") == 0) {
|
||||||
val && SDL_strcmp(val, "1") == 0) {
|
if (SDL_GetHintBoolean(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, SDL_FALSE)) {
|
||||||
devclass |= SDL_UDEV_DEVICE_JOYSTICK;
|
devclass |= SDL_UDEV_DEVICE_JOYSTICK;
|
||||||
|
} else {
|
||||||
|
devclass |= SDL_UDEV_DEVICE_ACCELEROMETER;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_MOUSE");
|
val = _this->syms.udev_device_get_property_value(dev, "ID_INPUT_MOUSE");
|
||||||
|
|||||||
@@ -199,6 +199,24 @@ static BOOL IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WO
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
BOOL WIN_IsWine(void)
|
||||||
|
{
|
||||||
|
static SDL_bool checked;
|
||||||
|
static SDL_bool is_wine;
|
||||||
|
|
||||||
|
if (!checked) {
|
||||||
|
HMODULE ntdll = LoadLibrary(TEXT("ntdll.dll"));
|
||||||
|
if (ntdll) {
|
||||||
|
if (GetProcAddress(ntdll, "wine_get_version") != NULL) {
|
||||||
|
is_wine = SDL_TRUE;
|
||||||
|
}
|
||||||
|
FreeLibrary(ntdll);
|
||||||
|
}
|
||||||
|
checked = SDL_TRUE;
|
||||||
|
}
|
||||||
|
return is_wine;
|
||||||
|
}
|
||||||
|
|
||||||
BOOL WIN_IsWindowsVistaOrGreater(void)
|
BOOL WIN_IsWindowsVistaOrGreater(void)
|
||||||
{
|
{
|
||||||
#if defined(__WINRT__) || defined(__XBOXONE__) || defined(__XBOXSERIES__)
|
#if defined(__WINRT__) || defined(__XBOXONE__) || defined(__XBOXSERIES__)
|
||||||
|
|||||||
@@ -136,6 +136,9 @@ extern void WIN_CoUninitialize(void);
|
|||||||
extern HRESULT WIN_RoInitialize(void);
|
extern HRESULT WIN_RoInitialize(void);
|
||||||
extern void WIN_RoUninitialize(void);
|
extern void WIN_RoUninitialize(void);
|
||||||
|
|
||||||
|
/* Returns true if we're running on Wine */
|
||||||
|
extern BOOL WIN_IsWine(void);
|
||||||
|
|
||||||
/* Returns SDL_TRUE if we're running on Windows Vista and newer */
|
/* Returns SDL_TRUE if we're running on Windows Vista and newer */
|
||||||
extern BOOL WIN_IsWindowsVistaOrGreater(void);
|
extern BOOL WIN_IsWindowsVistaOrGreater(void);
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,8 @@
|
|||||||
*/
|
*/
|
||||||
#include "../../SDL_internal.h"
|
#include "../../SDL_internal.h"
|
||||||
|
|
||||||
|
/* Standard C++11 includes: */
|
||||||
|
#include <string>
|
||||||
/* Windows includes */
|
/* Windows includes */
|
||||||
#include "ppltasks.h"
|
#include "ppltasks.h"
|
||||||
using namespace concurrency;
|
using namespace concurrency;
|
||||||
@@ -43,6 +45,7 @@ extern "C" {
|
|||||||
#include "SDL_hints.h"
|
#include "SDL_hints.h"
|
||||||
#include "SDL_main.h"
|
#include "SDL_main.h"
|
||||||
#include "SDL_stdinc.h"
|
#include "SDL_stdinc.h"
|
||||||
|
#include "SDL_system.h"
|
||||||
#include "SDL_render.h"
|
#include "SDL_render.h"
|
||||||
#include "../../video/SDL_sysvideo.h"
|
#include "../../video/SDL_sysvideo.h"
|
||||||
#include "../../events/SDL_events_c.h"
|
#include "../../events/SDL_events_c.h"
|
||||||
@@ -80,6 +83,60 @@ extern "C" void D3D11_Trim(SDL_Renderer *);
|
|||||||
// SDL_CreateWindow().
|
// SDL_CreateWindow().
|
||||||
SDL_WinRTApp ^ SDL_WinRTGlobalApp = nullptr;
|
SDL_WinRTApp ^ SDL_WinRTGlobalApp = nullptr;
|
||||||
|
|
||||||
|
// Protocol activation URI storage
|
||||||
|
static Platform::String^ WINRT_ProtocolActivationURI = nullptr;
|
||||||
|
|
||||||
|
// Store launchOnExit URI separately since WINRT_ProtocolActivationURI gets cleared
|
||||||
|
static std::wstring WINRT_LaunchOnExitURI;
|
||||||
|
|
||||||
|
// Helper function to extract and store launchOnExit from protocol URI
|
||||||
|
static void WINRT_ExtractLaunchOnExitURI(Platform::String^ fullUri)
|
||||||
|
{
|
||||||
|
if (fullUri == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::wstring uri(fullUri->Data());
|
||||||
|
|
||||||
|
// Look for launchOnExit parameter in the URI
|
||||||
|
size_t launchPos = uri.find(L"launchOnExit=");
|
||||||
|
if (launchPos == std::wstring::npos)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Extract the launchOnExit URI value
|
||||||
|
launchPos += 13; // Skip past "launchOnExit="
|
||||||
|
size_t endPos = uri.find(L'&', launchPos);
|
||||||
|
if (endPos == std::wstring::npos)
|
||||||
|
endPos = uri.length();
|
||||||
|
|
||||||
|
std::wstring launchUri = uri.substr(launchPos, endPos - launchPos);
|
||||||
|
|
||||||
|
// URL decode the URI (convert %3A to :, etc.)
|
||||||
|
WINRT_LaunchOnExitURI.clear();
|
||||||
|
for (size_t i = 0; i < launchUri.length(); i++) {
|
||||||
|
if (launchUri[i] == L'%' && i + 2 < launchUri.length()) {
|
||||||
|
wchar_t hex[3] = { launchUri[i + 1], launchUri[i + 2], 0 };
|
||||||
|
WINRT_LaunchOnExitURI += (wchar_t)wcstol(hex, nullptr, 16);
|
||||||
|
i += 2;
|
||||||
|
} else {
|
||||||
|
WINRT_LaunchOnExitURI += launchUri[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to launch URI on exit if protocol activation included launchOnExit parameter
|
||||||
|
static void WINRT_LaunchExitUriIfSet()
|
||||||
|
{
|
||||||
|
if (!WINRT_LaunchOnExitURI.empty()) {
|
||||||
|
try {
|
||||||
|
// Launch the URI
|
||||||
|
auto uri = ref new Windows::Foundation::Uri(ref new Platform::String(WINRT_LaunchOnExitURI.c_str()));
|
||||||
|
Windows::System::Launcher::LaunchUriAsync(uri);
|
||||||
|
} catch (...) {
|
||||||
|
// Silently ignore errors during termination
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ref class SDLApplicationSource sealed : Windows::ApplicationModel::Core::IFrameworkViewSource
|
ref class SDLApplicationSource sealed : Windows::ApplicationModel::Core::IFrameworkViewSource
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -107,6 +164,22 @@ int SDL_WinRTInitNonXAMLApp(int (*mainFunction)(int, char **))
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" char* SDL_WinRTGetProtocolActivationURI(void)
|
||||||
|
{
|
||||||
|
if (WINRT_ProtocolActivationURI == nullptr)
|
||||||
|
return nullptr;
|
||||||
|
Platform::String^ uriStr = WINRT_ProtocolActivationURI;
|
||||||
|
const wchar_t* uriWide = uriStr->Data();
|
||||||
|
int uriLen = WideCharToMultiByte(CP_UTF8, 0, uriWide, -1, nullptr, 0, nullptr, nullptr);
|
||||||
|
char* uriUtf8 = (char*)SDL_malloc(uriLen);
|
||||||
|
if (uriUtf8)
|
||||||
|
WideCharToMultiByte(CP_UTF8, 0, uriWide, -1, uriUtf8, uriLen, nullptr, nullptr);
|
||||||
|
|
||||||
|
// Clear after first successful read (only return it once)
|
||||||
|
WINRT_ProtocolActivationURI = nullptr;
|
||||||
|
return uriUtf8;
|
||||||
|
}
|
||||||
|
|
||||||
static void WINRT_ProcessWindowSizeChange() // TODO: Pass an SDL_Window-identifying thing into WINRT_ProcessWindowSizeChange()
|
static void WINRT_ProcessWindowSizeChange() // TODO: Pass an SDL_Window-identifying thing into WINRT_ProcessWindowSizeChange()
|
||||||
{
|
{
|
||||||
CoreWindow ^ coreWindow = CoreWindow::GetForCurrentThread();
|
CoreWindow ^ coreWindow = CoreWindow::GetForCurrentThread();
|
||||||
@@ -164,6 +237,12 @@ SDL_WinRTApp::SDL_WinRTApp() : m_windowClosed(false),
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_WinRTApp::~SDL_WinRTApp()
|
||||||
|
{
|
||||||
|
// Launch exit URI if set (handles protocol activation returning to caller)
|
||||||
|
WINRT_LaunchExitUriIfSet();
|
||||||
|
}
|
||||||
|
|
||||||
void SDL_WinRTApp::Initialize(CoreApplicationView ^ applicationView)
|
void SDL_WinRTApp::Initialize(CoreApplicationView ^ applicationView)
|
||||||
{
|
{
|
||||||
applicationView->Activated +=
|
applicationView->Activated +=
|
||||||
@@ -585,15 +664,29 @@ void SDL_WinRTApp::OnWindowClosed(CoreWindow ^ sender, CoreWindowEventArgs ^ arg
|
|||||||
SDL_Log("%s\n", __FUNCTION__);
|
SDL_Log("%s\n", __FUNCTION__);
|
||||||
#endif
|
#endif
|
||||||
m_windowClosed = true;
|
m_windowClosed = true;
|
||||||
|
WINRT_LaunchExitUriIfSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDL_WinRTApp::OnAppActivated(CoreApplicationView ^ applicationView, IActivatedEventArgs ^ args)
|
void SDL_WinRTApp::OnAppActivated(CoreApplicationView ^ applicationView, IActivatedEventArgs ^ args)
|
||||||
{
|
{
|
||||||
|
if (args->Kind == Windows::ApplicationModel::Activation::ActivationKind::Protocol)
|
||||||
|
{
|
||||||
|
auto protocolArgs = dynamic_cast<Windows::ApplicationModel::Activation::ProtocolActivatedEventArgs^>(args);
|
||||||
|
if (protocolArgs && protocolArgs->Uri)
|
||||||
|
{
|
||||||
|
WINRT_ProtocolActivationURI = protocolArgs->Uri->AbsoluteUri;
|
||||||
|
// Extract and store launchOnExit URI before main URI gets cleared
|
||||||
|
WINRT_ExtractLaunchOnExitURI(WINRT_ProtocolActivationURI);
|
||||||
|
}
|
||||||
|
}
|
||||||
CoreWindow::GetForCurrentThread()->Activate();
|
CoreWindow::GetForCurrentThread()->Activate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDL_WinRTApp::OnSuspending(Platform::Object ^ sender, SuspendingEventArgs ^ args)
|
void SDL_WinRTApp::OnSuspending(Platform::Object ^ sender, SuspendingEventArgs ^ args)
|
||||||
{
|
{
|
||||||
|
// Launch exit URI if set before suspending
|
||||||
|
WINRT_LaunchExitUriIfSet();
|
||||||
|
|
||||||
// Save app state asynchronously after requesting a deferral. Holding a deferral
|
// Save app state asynchronously after requesting a deferral. Holding a deferral
|
||||||
// indicates that the application is busy performing suspending operations. Be
|
// indicates that the application is busy performing suspending operations. Be
|
||||||
// aware that a deferral may not be held indefinitely. After about five seconds,
|
// aware that a deferral may not be held indefinitely. After about five seconds,
|
||||||
@@ -647,6 +740,7 @@ void SDL_WinRTApp::OnResuming(Platform::Object ^ sender, Platform::Object ^ args
|
|||||||
void SDL_WinRTApp::OnExiting(Platform::Object ^ sender, Platform::Object ^ args)
|
void SDL_WinRTApp::OnExiting(Platform::Object ^ sender, Platform::Object ^ args)
|
||||||
{
|
{
|
||||||
SDL_SendAppEvent(SDL_APP_TERMINATING);
|
SDL_SendAppEvent(SDL_APP_TERMINATING);
|
||||||
|
WINRT_LaunchExitUriIfSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void WINRT_LogPointerEvent(const char *header, Windows::UI::Core::PointerEventArgs ^ args, Windows::Foundation::Point transformedPoint)
|
static void WINRT_LogPointerEvent(const char *header, Windows::UI::Core::PointerEventArgs ^ args, Windows::Foundation::Point transformedPoint)
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ ref class SDL_WinRTApp sealed : public Windows::ApplicationModel::Core::IFramewo
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SDL_WinRTApp();
|
SDL_WinRTApp();
|
||||||
|
virtual ~SDL_WinRTApp();
|
||||||
|
|
||||||
// IFrameworkView Methods.
|
// IFrameworkView Methods.
|
||||||
virtual void Initialize(Windows::ApplicationModel::Core::CoreApplicationView ^ applicationView);
|
virtual void Initialize(Windows::ApplicationModel::Core::CoreApplicationView ^ applicationView);
|
||||||
|
|||||||
+17
-12
@@ -50,13 +50,12 @@
|
|||||||
#endif
|
#endif
|
||||||
#if defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))
|
#if defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))
|
||||||
#include <sys/sysctl.h> /* For AltiVec check */
|
#include <sys/sysctl.h> /* For AltiVec check */
|
||||||
#elif defined(__OpenBSD__) && defined(__powerpc__)
|
#elif defined(__OpenBSD__) && defined(__powerpc__) && !defined(HAVE_ELF_AUX_INFO)
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/sysctl.h> /* For AltiVec check */
|
#include <sys/sysctl.h> /* For AltiVec check */
|
||||||
#include <machine/cpu.h>
|
#include <machine/cpu.h>
|
||||||
#elif defined(__FreeBSD__) && defined(__powerpc__)
|
#elif defined(__FreeBSD__) && defined(__powerpc__) && defined(HAVE_ELF_AUX_INFO)
|
||||||
#include <machine/cpu.h>
|
#include <machine/cpu.h>
|
||||||
#include <sys/auxv.h>
|
|
||||||
#elif defined(SDL_ALTIVEC_BLITTERS) && defined(HAVE_SETJMP)
|
#elif defined(SDL_ALTIVEC_BLITTERS) && defined(HAVE_SETJMP)
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
@@ -127,7 +126,11 @@
|
|||||||
#define CPU_CFG2_LSX (1 << 6)
|
#define CPU_CFG2_LSX (1 << 6)
|
||||||
#define CPU_CFG2_LASX (1 << 7)
|
#define CPU_CFG2_LASX (1 << 7)
|
||||||
|
|
||||||
#if defined(SDL_ALTIVEC_BLITTERS) && defined(HAVE_SETJMP) && !defined(__MACOSX__) && !defined(__OpenBSD__) && !defined(__FreeBSD__)
|
#if !defined(SDL_CPUINFO_DISABLED) && \
|
||||||
|
!((defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))) || (defined(__OpenBSD__) && defined(__powerpc__))) && \
|
||||||
|
!(defined(__FreeBSD__) && defined(__powerpc__)) && \
|
||||||
|
!(defined(__LINUX__) && defined(__powerpc__) && defined(HAVE_GETAUXVAL)) && \
|
||||||
|
defined(SDL_ALTIVEC_BLITTERS) && defined(HAVE_SETJMP)
|
||||||
/* This is the brute force way of detecting instruction sets...
|
/* This is the brute force way of detecting instruction sets...
|
||||||
the idea is borrowed from the libmpeg2 library - thanks!
|
the idea is borrowed from the libmpeg2 library - thanks!
|
||||||
*/
|
*/
|
||||||
@@ -339,7 +342,12 @@ static int CPU_haveAltiVec(void)
|
|||||||
{
|
{
|
||||||
volatile int altivec = 0;
|
volatile int altivec = 0;
|
||||||
#ifndef SDL_CPUINFO_DISABLED
|
#ifndef SDL_CPUINFO_DISABLED
|
||||||
#if (defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))) || (defined(__OpenBSD__) && defined(__powerpc__))
|
#if (defined(__FreeBSD__) || defined(__OpenBSD__)) && defined(__powerpc__) && defined(HAVE_ELF_AUX_INFO)
|
||||||
|
unsigned long cpufeatures = 0;
|
||||||
|
elf_aux_info(AT_HWCAP, &cpufeatures, sizeof(cpufeatures));
|
||||||
|
altivec = cpufeatures & PPC_FEATURE_HAS_ALTIVEC;
|
||||||
|
return altivec;
|
||||||
|
#elif (defined(__MACOSX__) && (defined(__ppc__) || defined(__ppc64__))) || (defined(__OpenBSD__) && defined(__powerpc__))
|
||||||
#ifdef __OpenBSD__
|
#ifdef __OpenBSD__
|
||||||
int selectors[2] = { CTL_MACHDEP, CPU_ALTIVEC };
|
int selectors[2] = { CTL_MACHDEP, CPU_ALTIVEC };
|
||||||
#else
|
#else
|
||||||
@@ -351,11 +359,8 @@ static int CPU_haveAltiVec(void)
|
|||||||
if (0 == error) {
|
if (0 == error) {
|
||||||
altivec = (hasVectorUnit != 0);
|
altivec = (hasVectorUnit != 0);
|
||||||
}
|
}
|
||||||
#elif defined(__FreeBSD__) && defined(__powerpc__)
|
#elif defined(__LINUX__) && defined(__powerpc__) && defined(HAVE_GETAUXVAL)
|
||||||
unsigned long cpufeatures = 0;
|
altivec = getauxval(AT_HWCAP) & PPC_FEATURE_HAS_ALTIVEC;
|
||||||
elf_aux_info(AT_HWCAP, &cpufeatures, sizeof(cpufeatures));
|
|
||||||
altivec = cpufeatures & PPC_FEATURE_HAS_ALTIVEC;
|
|
||||||
return altivec;
|
|
||||||
#elif defined(SDL_ALTIVEC_BLITTERS) && defined(HAVE_SETJMP)
|
#elif defined(SDL_ALTIVEC_BLITTERS) && defined(HAVE_SETJMP)
|
||||||
void (*handler)(int sig);
|
void (*handler)(int sig);
|
||||||
handler = signal(SIGILL, illegal_instruction);
|
handler = signal(SIGILL, illegal_instruction);
|
||||||
@@ -483,8 +488,6 @@ static int CPU_haveNEON(void)
|
|||||||
return 0; /* assume anything else from Apple doesn't have NEON. */
|
return 0; /* assume anything else from Apple doesn't have NEON. */
|
||||||
#elif !defined(__arm__)
|
#elif !defined(__arm__)
|
||||||
return 0; /* not an ARM CPU at all. */
|
return 0; /* not an ARM CPU at all. */
|
||||||
#elif defined(__OpenBSD__)
|
|
||||||
return 1; /* OpenBSD only supports ARMv7 CPUs that have NEON. */
|
|
||||||
#elif defined(HAVE_ELF_AUX_INFO)
|
#elif defined(HAVE_ELF_AUX_INFO)
|
||||||
unsigned long hasneon = 0;
|
unsigned long hasneon = 0;
|
||||||
if (elf_aux_info(AT_HWCAP, (void *)&hasneon, (int)sizeof(hasneon)) != 0) {
|
if (elf_aux_info(AT_HWCAP, (void *)&hasneon, (int)sizeof(hasneon)) != 0) {
|
||||||
@@ -521,6 +524,8 @@ static int CPU_haveNEON(void)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#elif defined(__OpenBSD__)
|
||||||
|
return 1; /* OpenBSD only supports ARMv7 CPUs that have NEON. */
|
||||||
#else
|
#else
|
||||||
#warning SDL_HasNEON is not implemented for this ARM platform. Write me.
|
#warning SDL_HasNEON is not implemented for this ARM platform. Write me.
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -872,3 +872,4 @@
|
|||||||
++'_SDL_DestroyWindowSurface'.'SDL2.dll'.'SDL_DestroyWindowSurface'
|
++'_SDL_DestroyWindowSurface'.'SDL2.dll'.'SDL_DestroyWindowSurface'
|
||||||
# ++'_SDL_GDKGetDefaultUser'.'SDL2.dll'.'SDL_GDKGetDefaultUser'
|
# ++'_SDL_GDKGetDefaultUser'.'SDL2.dll'.'SDL_GDKGetDefaultUser'
|
||||||
++'_SDL_GameControllerGetSteamHandle'.'SDL2.dll'.'SDL_GameControllerGetSteamHandle'
|
++'_SDL_GameControllerGetSteamHandle'.'SDL2.dll'.'SDL_GameControllerGetSteamHandle'
|
||||||
|
# ++'_SDL_WinRTGetProtocolActivationURI'.'SDL2.dll'.'SDL_WinRTGetProtocolActivationURI'
|
||||||
@@ -440,19 +440,24 @@ extern SDL_NORETURN void SDL_ExitProcess(int exitcode);
|
|||||||
|
|
||||||
static void SDL_InitDynamicAPILocked(void)
|
static void SDL_InitDynamicAPILocked(void)
|
||||||
{
|
{
|
||||||
|
SDL_DYNAPI_ENTRYFN entry = NULL; /* funcs from here by default. */
|
||||||
|
SDL_bool use_internal = SDL_TRUE;
|
||||||
|
|
||||||
/* this can't use SDL_getenv_REAL, because it might allocate memory before the app can set their allocator */
|
/* this can't use SDL_getenv_REAL, because it might allocate memory before the app can set their allocator */
|
||||||
#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__)
|
#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__)
|
||||||
/* We've always used LoadLibraryA for this, so this has never worked with Unicode paths on Windows. Sorry. */
|
/* We've always used LoadLibraryA for this, so this has never worked with Unicode paths on Windows. Sorry. */
|
||||||
char envbuf[512]; /* overflows will just report as environment variable being unset, but LoadLibraryA has a MAX_PATH of 260 anyhow, apparently. */
|
char envbuf[512]; /* overflows will just report as environment variable being unset, but LoadLibraryA has a MAX_PATH of 260 anyhow, apparently. */
|
||||||
const DWORD rc = GetEnvironmentVariableA(SDL_DYNAMIC_API_ENVVAR, envbuf, (DWORD) sizeof (envbuf));
|
const DWORD rc = GetEnvironmentVariableA(SDL_DYNAMIC_API_ENVVAR, envbuf, (DWORD) sizeof (envbuf));
|
||||||
char *libname = ((rc != 0) && (rc < sizeof (envbuf))) ? envbuf : NULL;
|
char *libname = ((rc != 0) && (rc < sizeof (envbuf))) ? envbuf : NULL;
|
||||||
|
#elif defined(__OS2__)
|
||||||
|
char * libname;
|
||||||
|
if (DosScanEnv(SDL_DYNAMIC_API_ENVVAR, &libname) != NO_ERROR) {
|
||||||
|
libname = NULL;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
char *libname = getenv(SDL_DYNAMIC_API_ENVVAR);
|
char *libname = getenv(SDL_DYNAMIC_API_ENVVAR);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SDL_DYNAPI_ENTRYFN entry = NULL; /* funcs from here by default. */
|
|
||||||
SDL_bool use_internal = SDL_TRUE;
|
|
||||||
|
|
||||||
if (libname) {
|
if (libname) {
|
||||||
while (*libname && !entry) {
|
while (*libname && !entry) {
|
||||||
char *ptr = libname;
|
char *ptr = libname;
|
||||||
|
|||||||
@@ -898,3 +898,4 @@
|
|||||||
#define SDL_DestroyWindowSurface SDL_DestroyWindowSurface_REAL
|
#define SDL_DestroyWindowSurface SDL_DestroyWindowSurface_REAL
|
||||||
#define SDL_GDKGetDefaultUser SDL_GDKGetDefaultUser_REAL
|
#define SDL_GDKGetDefaultUser SDL_GDKGetDefaultUser_REAL
|
||||||
#define SDL_GameControllerGetSteamHandle SDL_GameControllerGetSteamHandle_REAL
|
#define SDL_GameControllerGetSteamHandle SDL_GameControllerGetSteamHandle_REAL
|
||||||
|
#define SDL_WinRTGetProtocolActivationURI SDL_WinRTGetProtocolActivationURI_REAL
|
||||||
@@ -985,3 +985,6 @@ SDL_DYNAPI_PROC(int,SDL_DestroyWindowSurface,(SDL_Window *a),(a),return)
|
|||||||
SDL_DYNAPI_PROC(int,SDL_GDKGetDefaultUser,(XUserHandle *a),(a),return)
|
SDL_DYNAPI_PROC(int,SDL_GDKGetDefaultUser,(XUserHandle *a),(a),return)
|
||||||
#endif
|
#endif
|
||||||
SDL_DYNAPI_PROC(Uint64,SDL_GameControllerGetSteamHandle,(SDL_GameController *a),(a),return)
|
SDL_DYNAPI_PROC(Uint64,SDL_GameControllerGetSteamHandle,(SDL_GameController *a),(a),return)
|
||||||
|
#if defined(__WINRT__)
|
||||||
|
SDL_DYNAPI_PROC(char*,SDL_WinRTGetProtocolActivationURI,(void),(),return)
|
||||||
|
#endif
|
||||||
+11
-28
@@ -738,21 +738,17 @@ static void SDL_CutEvent(SDL_EventEntry *entry)
|
|||||||
|
|
||||||
static int SDL_SendWakeupEvent(void)
|
static int SDL_SendWakeupEvent(void)
|
||||||
{
|
{
|
||||||
|
SDL_Window *wakeup_window;
|
||||||
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
||||||
if (_this == NULL || !_this->SendWakeupEvent) {
|
if (_this == NULL || !_this->SendWakeupEvent) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_LockMutex(_this->wakeup_lock);
|
/* We only want to do this once while waiting for an event, so set it to NULL atomically here */
|
||||||
{
|
wakeup_window = (SDL_Window *)SDL_AtomicSetPtr(&_this->wakeup_window, NULL);
|
||||||
if (_this->wakeup_window) {
|
if (wakeup_window) {
|
||||||
_this->SendWakeupEvent(_this, _this->wakeup_window);
|
_this->SendWakeupEvent(_this, wakeup_window);
|
||||||
|
|
||||||
/* No more wakeup events needed until we enter a new wait */
|
|
||||||
_this->wakeup_window = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SDL_UnlockMutex(_this->wakeup_lock);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1009,18 +1005,7 @@ static int SDL_WaitEventTimeout_Device(_THIS, SDL_Window *wakeup_window, SDL_Eve
|
|||||||
int status;
|
int status;
|
||||||
SDL_PumpEventsInternal(SDL_TRUE);
|
SDL_PumpEventsInternal(SDL_TRUE);
|
||||||
|
|
||||||
SDL_LockMutex(_this->wakeup_lock);
|
status = SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT);
|
||||||
{
|
|
||||||
status = SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT);
|
|
||||||
/* If status == 0 we are going to block so wakeup will be needed. */
|
|
||||||
if (status == 0) {
|
|
||||||
_this->wakeup_window = wakeup_window;
|
|
||||||
} else {
|
|
||||||
_this->wakeup_window = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SDL_UnlockMutex(_this->wakeup_lock);
|
|
||||||
|
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
/* Got an error: return */
|
/* Got an error: return */
|
||||||
break;
|
break;
|
||||||
@@ -1033,8 +1018,6 @@ static int SDL_WaitEventTimeout_Device(_THIS, SDL_Window *wakeup_window, SDL_Eve
|
|||||||
if (timeout > 0) {
|
if (timeout > 0) {
|
||||||
Uint32 elapsed = SDL_GetTicks() - start;
|
Uint32 elapsed = SDL_GetTicks() - start;
|
||||||
if (elapsed >= (Uint32)timeout) {
|
if (elapsed >= (Uint32)timeout) {
|
||||||
/* Set wakeup_window to NULL without holding the lock. */
|
|
||||||
_this->wakeup_window = NULL;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
loop_timeout = (int)((Uint32)timeout - elapsed);
|
loop_timeout = (int)((Uint32)timeout - elapsed);
|
||||||
@@ -1049,9 +1032,9 @@ static int SDL_WaitEventTimeout_Device(_THIS, SDL_Window *wakeup_window, SDL_Eve
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_AtomicSetPtr(&_this->wakeup_window, wakeup_window);
|
||||||
status = _this->WaitEventTimeout(_this, loop_timeout);
|
status = _this->WaitEventTimeout(_this, loop_timeout);
|
||||||
/* Set wakeup_window to NULL without holding the lock. */
|
SDL_AtomicSetPtr(&_this->wakeup_window, NULL);
|
||||||
_this->wakeup_window = NULL;
|
|
||||||
if (status == 0 && poll_interval != SDL_MAX_SINT16 && loop_timeout == poll_interval) {
|
if (status == 0 && poll_interval != SDL_MAX_SINT16 && loop_timeout == poll_interval) {
|
||||||
/* We may have woken up to poll. Try again */
|
/* We may have woken up to poll. Try again */
|
||||||
continue;
|
continue;
|
||||||
@@ -1318,7 +1301,7 @@ Uint8 SDL_EventState(Uint32 type, int state)
|
|||||||
Uint8 lo = (type & 0xff);
|
Uint8 lo = (type & 0xff);
|
||||||
|
|
||||||
if (SDL_disabled_events[hi] &&
|
if (SDL_disabled_events[hi] &&
|
||||||
(SDL_disabled_events[hi]->bits[lo / 32] & (1 << (lo & 31)))) {
|
(SDL_disabled_events[hi]->bits[lo / 32] & (1U << (lo & 31)))) {
|
||||||
current_state = SDL_DISABLE;
|
current_state = SDL_DISABLE;
|
||||||
} else {
|
} else {
|
||||||
current_state = SDL_ENABLE;
|
current_state = SDL_ENABLE;
|
||||||
@@ -1332,11 +1315,11 @@ Uint8 SDL_EventState(Uint32 type, int state)
|
|||||||
}
|
}
|
||||||
/* Out of memory, nothing we can do... */
|
/* Out of memory, nothing we can do... */
|
||||||
if (SDL_disabled_events[hi]) {
|
if (SDL_disabled_events[hi]) {
|
||||||
SDL_disabled_events[hi]->bits[lo / 32] |= (1 << (lo & 31));
|
SDL_disabled_events[hi]->bits[lo / 32] |= (1U << (lo & 31));
|
||||||
SDL_FlushEvent(type);
|
SDL_FlushEvent(type);
|
||||||
}
|
}
|
||||||
} else { // state == SDL_ENABLE
|
} else { // state == SDL_ENABLE
|
||||||
SDL_disabled_events[hi]->bits[lo / 32] &= ~(1 << (lo & 31));
|
SDL_disabled_events[hi]->bits[lo / 32] &= ~(1U << (lo & 31));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef SDL_JOYSTICK_DISABLED
|
#ifndef SDL_JOYSTICK_DISABLED
|
||||||
|
|||||||
@@ -1121,6 +1121,15 @@ int SDL_WarpMouseGlobal(int x, int y)
|
|||||||
|
|
||||||
static SDL_bool ShouldUseRelativeModeWarp(SDL_Mouse *mouse)
|
static SDL_bool ShouldUseRelativeModeWarp(SDL_Mouse *mouse)
|
||||||
{
|
{
|
||||||
|
#ifdef SDL_VIDEO_DRIVER_WAYLAND
|
||||||
|
SDL_VideoDevice *vid = SDL_GetVideoDevice();
|
||||||
|
|
||||||
|
/* Wayland can't warp the mouse, but uses this hint internally to deliver accelerated motion */
|
||||||
|
if (SDL_strcmp(vid->name, "wayland") == 0) {
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!mouse->WarpMouse) {
|
if (!mouse->WarpMouse) {
|
||||||
/* Need this functionality for relative mode warp implementation */
|
/* Need this functionality for relative mode warp implementation */
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
|
|||||||
@@ -49,8 +49,10 @@ static SDL_bool send_foregrounding_pending = SDL_FALSE;
|
|||||||
|
|
||||||
static void SDL_HandleSIG(int sig)
|
static void SDL_HandleSIG(int sig)
|
||||||
{
|
{
|
||||||
/* Reset the signal handler */
|
#ifndef HAVE_SIGACTION
|
||||||
|
/* Reset the signal handler if it was installed with signal() */
|
||||||
(void)signal(sig, SDL_HandleSIG);
|
(void)signal(sig, SDL_HandleSIG);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Send a quit event next time the event loop pumps. */
|
/* Send a quit event next time the event loop pumps. */
|
||||||
/* We can't send it in signal handler; SDL_malloc() might be interrupted! */
|
/* We can't send it in signal handler; SDL_malloc() might be interrupted! */
|
||||||
|
|||||||
@@ -23,6 +23,85 @@
|
|||||||
#include "SDL_syshaptic.h"
|
#include "SDL_syshaptic.h"
|
||||||
#include "SDL_haptic_c.h"
|
#include "SDL_haptic_c.h"
|
||||||
#include "../joystick/SDL_joystick_c.h" /* For SDL_PrivateJoystickValid */
|
#include "../joystick/SDL_joystick_c.h" /* For SDL_PrivateJoystickValid */
|
||||||
|
#include "SDL_hints.h"
|
||||||
|
#include "../SDL_hints_c.h"
|
||||||
|
|
||||||
|
typedef struct SDL_Haptic_VIDPID_Naxes {
|
||||||
|
Uint16 vid;
|
||||||
|
Uint16 pid;
|
||||||
|
Uint16 naxes;
|
||||||
|
} SDL_Haptic_VIDPID_Naxes;
|
||||||
|
|
||||||
|
static void SDL_HapticLoadAxesList(SDL_Haptic_VIDPID_Naxes **entries, int *num_entries)
|
||||||
|
{
|
||||||
|
SDL_Haptic_VIDPID_Naxes entry;
|
||||||
|
const char *spot;
|
||||||
|
int length = 0;
|
||||||
|
|
||||||
|
spot = SDL_GetHint(SDL_HINT_JOYSTICK_HAPTIC_AXES);
|
||||||
|
if (!spot)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while (SDL_sscanf(spot, "0x%hx/0x%hx/%hu%n", &entry.vid, &entry.pid, &entry.naxes, &length) == 3) {
|
||||||
|
SDL_assert(length > 0);
|
||||||
|
spot += length;
|
||||||
|
length = 0;
|
||||||
|
|
||||||
|
if ((*num_entries % 8) == 0) {
|
||||||
|
int new_max = *num_entries + 8;
|
||||||
|
SDL_Haptic_VIDPID_Naxes *new_entries =
|
||||||
|
(SDL_Haptic_VIDPID_Naxes *)SDL_realloc(*entries, new_max * sizeof(**entries));
|
||||||
|
|
||||||
|
// Out of memory, go with what we have already
|
||||||
|
if (!new_entries)
|
||||||
|
break;
|
||||||
|
|
||||||
|
*entries = new_entries;
|
||||||
|
}
|
||||||
|
(*entries)[(*num_entries)++] = entry;
|
||||||
|
|
||||||
|
if (spot[0] == ',')
|
||||||
|
spot++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// /* Return -1 if not found */
|
||||||
|
static int SDL_HapticNaxesListIndex(struct SDL_Haptic_VIDPID_Naxes *entries, int num_entries, Uint16 vid, Uint16 pid)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
if (!entries)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
for (i = 0; i < num_entries; ++i) {
|
||||||
|
if (entries[i].vid == vid && entries[i].pid == pid)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if device needs a custom number of naxes
|
||||||
|
static int SDL_HapticGetNaxes(Uint16 vid, Uint16 pid)
|
||||||
|
{
|
||||||
|
int num_entries = 0, index = 0, naxes = -1;
|
||||||
|
SDL_Haptic_VIDPID_Naxes *naxes_list = NULL;
|
||||||
|
|
||||||
|
SDL_HapticLoadAxesList(&naxes_list, &num_entries);
|
||||||
|
if (!num_entries || !naxes_list)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
// Perform "wildcard" pass
|
||||||
|
index = SDL_HapticNaxesListIndex(naxes_list, num_entries, 0xffff, 0xffff);
|
||||||
|
if (index >= 0)
|
||||||
|
naxes = naxes_list[index].naxes;
|
||||||
|
|
||||||
|
index = SDL_HapticNaxesListIndex(naxes_list, num_entries, vid, pid);
|
||||||
|
if (index >= 0)
|
||||||
|
naxes = naxes_list[index].naxes;
|
||||||
|
|
||||||
|
SDL_free(naxes_list);
|
||||||
|
return naxes;
|
||||||
|
}
|
||||||
|
|
||||||
/* Global for SDL_windowshaptic.c */
|
/* Global for SDL_windowshaptic.c */
|
||||||
#if defined(SDL_HAPTIC_DINPUT) || defined(SDL_HAPTIC_XINPUT)
|
#if defined(SDL_HAPTIC_DINPUT) || defined(SDL_HAPTIC_XINPUT)
|
||||||
@@ -258,6 +337,8 @@ SDL_Haptic *SDL_HapticOpenFromJoystick(SDL_Joystick *joystick)
|
|||||||
{
|
{
|
||||||
SDL_Haptic *haptic;
|
SDL_Haptic *haptic;
|
||||||
SDL_Haptic *hapticlist;
|
SDL_Haptic *hapticlist;
|
||||||
|
int naxes, general_axes;
|
||||||
|
Uint16 vid, pid;
|
||||||
|
|
||||||
/* Make sure there is room. */
|
/* Make sure there is room. */
|
||||||
if (SDL_NumHaptics() <= 0) {
|
if (SDL_NumHaptics() <= 0) {
|
||||||
@@ -314,6 +395,18 @@ SDL_Haptic *SDL_HapticOpenFromJoystick(SDL_Joystick *joystick)
|
|||||||
}
|
}
|
||||||
SDL_UnlockJoysticks();
|
SDL_UnlockJoysticks();
|
||||||
|
|
||||||
|
vid = SDL_JoystickGetVendor(joystick);
|
||||||
|
pid = SDL_JoystickGetProduct(joystick);
|
||||||
|
general_axes = SDL_JoystickNumAxes(joystick);
|
||||||
|
|
||||||
|
naxes = SDL_HapticGetNaxes(vid, pid);
|
||||||
|
if (naxes > 0)
|
||||||
|
haptic->naxes = naxes;
|
||||||
|
|
||||||
|
// Limit to the actual number of axes found on the device
|
||||||
|
if (general_axes >= 0 && naxes > general_axes)
|
||||||
|
haptic->naxes = general_axes;
|
||||||
|
|
||||||
/* Add haptic to list */
|
/* Add haptic to list */
|
||||||
++haptic->ref_count;
|
++haptic->ref_count;
|
||||||
/* Link the haptic in the list */
|
/* Link the haptic in the list */
|
||||||
|
|||||||
+18
-15
@@ -630,11 +630,9 @@ static const SDL_UDEV_Symbols *udev_ctx = NULL;
|
|||||||
|
|
||||||
#ifdef SDL_JOYSTICK_HIDAPI_STEAMXBOX
|
#ifdef SDL_JOYSTICK_HIDAPI_STEAMXBOX
|
||||||
#define HAVE_DRIVER_BACKEND 1
|
#define HAVE_DRIVER_BACKEND 1
|
||||||
#else
|
|
||||||
#define HAVE_DRIVER_BACKEND 0
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAVE_DRIVER_BACKEND
|
#ifdef HAVE_DRIVER_BACKEND
|
||||||
|
|
||||||
/* DRIVER HIDAPI Implementation */
|
/* DRIVER HIDAPI Implementation */
|
||||||
|
|
||||||
@@ -905,7 +903,7 @@ IsInWhitelist(Uint16 vendor, Uint16 product)
|
|||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_PLATFORM_BACKEND) || HAVE_DRIVER_BACKEND
|
#if defined(HAVE_PLATFORM_BACKEND) || defined(HAVE_DRIVER_BACKEND)
|
||||||
#define use_libusb_whitelist_default SDL_TRUE
|
#define use_libusb_whitelist_default SDL_TRUE
|
||||||
#else
|
#else
|
||||||
#define use_libusb_whitelist_default SDL_FALSE
|
#define use_libusb_whitelist_default SDL_FALSE
|
||||||
@@ -951,7 +949,7 @@ static const struct hidapi_backend PLATFORM_Backend = {
|
|||||||
};
|
};
|
||||||
#endif /* HAVE_PLATFORM_BACKEND */
|
#endif /* HAVE_PLATFORM_BACKEND */
|
||||||
|
|
||||||
#if HAVE_DRIVER_BACKEND
|
#ifdef HAVE_DRIVER_BACKEND
|
||||||
static const struct hidapi_backend DRIVER_Backend = {
|
static const struct hidapi_backend DRIVER_Backend = {
|
||||||
(void *)DRIVER_hid_write,
|
(void *)DRIVER_hid_write,
|
||||||
(void *)DRIVER_hid_read_timeout,
|
(void *)DRIVER_hid_read_timeout,
|
||||||
@@ -993,7 +991,7 @@ struct SDL_hid_device_
|
|||||||
};
|
};
|
||||||
static char device_magic;
|
static char device_magic;
|
||||||
|
|
||||||
#if defined(HAVE_PLATFORM_BACKEND) || HAVE_DRIVER_BACKEND || defined(HAVE_LIBUSB)
|
#if defined(HAVE_PLATFORM_BACKEND) || defined(HAVE_DRIVER_BACKEND) || defined(HAVE_LIBUSB)
|
||||||
|
|
||||||
static SDL_hid_device *CreateHIDDeviceWrapper(void *device, const struct hidapi_backend *backend)
|
static SDL_hid_device *CreateHIDDeviceWrapper(void *device, const struct hidapi_backend *backend)
|
||||||
{
|
{
|
||||||
@@ -1019,7 +1017,7 @@ static void DeleteHIDDeviceWrapper(SDL_hid_device *device)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef SDL_HIDAPI_DISABLED
|
#ifndef SDL_HIDAPI_DISABLED
|
||||||
#if defined(HAVE_PLATFORM_BACKEND) || HAVE_DRIVER_BACKEND || defined(HAVE_LIBUSB)
|
#if defined(HAVE_PLATFORM_BACKEND) || defined(HAVE_DRIVER_BACKEND) || defined(HAVE_LIBUSB)
|
||||||
|
|
||||||
#define COPY_IF_EXISTS(var) \
|
#define COPY_IF_EXISTS(var) \
|
||||||
if (pSrc->var != NULL) { \
|
if (pSrc->var != NULL) { \
|
||||||
@@ -1249,12 +1247,12 @@ Uint32 SDL_hid_device_change_count(void)
|
|||||||
|
|
||||||
struct SDL_hid_device_info *SDL_hid_enumerate(unsigned short vendor_id, unsigned short product_id)
|
struct SDL_hid_device_info *SDL_hid_enumerate(unsigned short vendor_id, unsigned short product_id)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_PLATFORM_BACKEND) || HAVE_DRIVER_BACKEND || defined(HAVE_LIBUSB)
|
#if defined(HAVE_PLATFORM_BACKEND) || defined(HAVE_DRIVER_BACKEND) || defined(HAVE_LIBUSB)
|
||||||
#ifdef HAVE_LIBUSB
|
#ifdef HAVE_LIBUSB
|
||||||
struct SDL_hid_device_info *usb_devs = NULL;
|
struct SDL_hid_device_info *usb_devs = NULL;
|
||||||
struct SDL_hid_device_info *usb_dev;
|
struct SDL_hid_device_info *usb_dev;
|
||||||
#endif
|
#endif
|
||||||
#if HAVE_DRIVER_BACKEND
|
#ifdef HAVE_DRIVER_BACKEND
|
||||||
struct SDL_hid_device_info *driver_devs = NULL;
|
struct SDL_hid_device_info *driver_devs = NULL;
|
||||||
struct SDL_hid_device_info *driver_dev;
|
struct SDL_hid_device_info *driver_dev;
|
||||||
#endif
|
#endif
|
||||||
@@ -1309,7 +1307,7 @@ struct SDL_hid_device_info *SDL_hid_enumerate(unsigned short vendor_id, unsigned
|
|||||||
}
|
}
|
||||||
#endif /* HAVE_LIBUSB */
|
#endif /* HAVE_LIBUSB */
|
||||||
|
|
||||||
#if HAVE_DRIVER_BACKEND
|
#ifdef HAVE_DRIVER_BACKEND
|
||||||
driver_devs = DRIVER_hid_enumerate(vendor_id, product_id);
|
driver_devs = DRIVER_hid_enumerate(vendor_id, product_id);
|
||||||
for (driver_dev = driver_devs; driver_dev; driver_dev = driver_dev->next) {
|
for (driver_dev = driver_devs; driver_dev; driver_dev = driver_dev->next) {
|
||||||
new_dev = (struct SDL_hid_device_info *)SDL_malloc(sizeof(struct SDL_hid_device_info));
|
new_dev = (struct SDL_hid_device_info *)SDL_malloc(sizeof(struct SDL_hid_device_info));
|
||||||
@@ -1339,6 +1337,11 @@ struct SDL_hid_device_info *SDL_hid_enumerate(unsigned short vendor_id, unsigned
|
|||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBUSB
|
#ifdef HAVE_LIBUSB
|
||||||
for (usb_dev = usb_devs; usb_dev; usb_dev = usb_dev->next) {
|
for (usb_dev = usb_devs; usb_dev; usb_dev = usb_dev->next) {
|
||||||
|
if (use_libusb_whitelist) {
|
||||||
|
if (!IsInWhitelist(usb_dev->vendor_id, usb_dev->product_id)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (raw_dev->vendor_id == usb_dev->vendor_id &&
|
if (raw_dev->vendor_id == usb_dev->vendor_id &&
|
||||||
raw_dev->product_id == usb_dev->product_id &&
|
raw_dev->product_id == usb_dev->product_id &&
|
||||||
(raw_dev->interface_number < 0 || raw_dev->interface_number == usb_dev->interface_number)) {
|
(raw_dev->interface_number < 0 || raw_dev->interface_number == usb_dev->interface_number)) {
|
||||||
@@ -1347,7 +1350,7 @@ struct SDL_hid_device_info *SDL_hid_enumerate(unsigned short vendor_id, unsigned
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if HAVE_DRIVER_BACKEND
|
#ifdef HAVE_DRIVER_BACKEND
|
||||||
for (driver_dev = driver_devs; driver_dev; driver_dev = driver_dev->next) {
|
for (driver_dev = driver_devs; driver_dev; driver_dev = driver_dev->next) {
|
||||||
if (raw_dev->vendor_id == driver_dev->vendor_id &&
|
if (raw_dev->vendor_id == driver_dev->vendor_id &&
|
||||||
raw_dev->product_id == driver_dev->product_id &&
|
raw_dev->product_id == driver_dev->product_id &&
|
||||||
@@ -1412,7 +1415,7 @@ void SDL_hid_free_enumeration(struct SDL_hid_device_info *devs)
|
|||||||
|
|
||||||
SDL_hid_device *SDL_hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number)
|
SDL_hid_device *SDL_hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_PLATFORM_BACKEND) || HAVE_DRIVER_BACKEND || defined(HAVE_LIBUSB)
|
#if defined(HAVE_PLATFORM_BACKEND) || defined(HAVE_DRIVER_BACKEND) || defined(HAVE_LIBUSB)
|
||||||
void *pDevice = NULL;
|
void *pDevice = NULL;
|
||||||
|
|
||||||
if (SDL_hidapi_refcount == 0 && SDL_hid_init() != 0) {
|
if (SDL_hidapi_refcount == 0 && SDL_hid_init() != 0) {
|
||||||
@@ -1428,7 +1431,7 @@ SDL_hid_device *SDL_hid_open(unsigned short vendor_id, unsigned short product_id
|
|||||||
}
|
}
|
||||||
#endif /* HAVE_PLATFORM_BACKEND */
|
#endif /* HAVE_PLATFORM_BACKEND */
|
||||||
|
|
||||||
#if HAVE_DRIVER_BACKEND
|
#ifdef HAVE_DRIVER_BACKEND
|
||||||
pDevice = DRIVER_hid_open(vendor_id, product_id, serial_number);
|
pDevice = DRIVER_hid_open(vendor_id, product_id, serial_number);
|
||||||
if (pDevice != NULL) {
|
if (pDevice != NULL) {
|
||||||
return CreateHIDDeviceWrapper(pDevice, &DRIVER_Backend);
|
return CreateHIDDeviceWrapper(pDevice, &DRIVER_Backend);
|
||||||
@@ -1451,7 +1454,7 @@ SDL_hid_device *SDL_hid_open(unsigned short vendor_id, unsigned short product_id
|
|||||||
|
|
||||||
SDL_hid_device *SDL_hid_open_path(const char *path, int bExclusive /* = false */)
|
SDL_hid_device *SDL_hid_open_path(const char *path, int bExclusive /* = false */)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_PLATFORM_BACKEND) || HAVE_DRIVER_BACKEND || defined(HAVE_LIBUSB)
|
#if defined(HAVE_PLATFORM_BACKEND) || defined(HAVE_DRIVER_BACKEND) || defined(HAVE_LIBUSB)
|
||||||
void *pDevice = NULL;
|
void *pDevice = NULL;
|
||||||
|
|
||||||
if (SDL_hidapi_refcount == 0 && SDL_hid_init() != 0) {
|
if (SDL_hidapi_refcount == 0 && SDL_hid_init() != 0) {
|
||||||
@@ -1467,7 +1470,7 @@ SDL_hid_device *SDL_hid_open_path(const char *path, int bExclusive /* = false */
|
|||||||
}
|
}
|
||||||
#endif /* HAVE_PLATFORM_BACKEND */
|
#endif /* HAVE_PLATFORM_BACKEND */
|
||||||
|
|
||||||
#if HAVE_DRIVER_BACKEND
|
#ifdef HAVE_DRIVER_BACKEND
|
||||||
pDevice = DRIVER_hid_open_path(path, bExclusive);
|
pDevice = DRIVER_hid_open_path(path, bExclusive);
|
||||||
if (pDevice != NULL) {
|
if (pDevice != NULL) {
|
||||||
return CreateHIDDeviceWrapper(pDevice, &DRIVER_Backend);
|
return CreateHIDDeviceWrapper(pDevice, &DRIVER_Backend);
|
||||||
|
|||||||
@@ -1135,11 +1135,14 @@ int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data,
|
|||||||
|
|
||||||
void HID_API_EXPORT hid_close(hid_device *dev)
|
void HID_API_EXPORT hid_close(hid_device *dev)
|
||||||
{
|
{
|
||||||
|
int disconnected;
|
||||||
|
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Disconnect the report callback before close. */
|
/* Disconnect the report callback before close. */
|
||||||
if (!dev->disconnected) {
|
disconnected = dev->disconnected;
|
||||||
|
if (!disconnected) {
|
||||||
IOHIDDeviceRegisterInputReportCallback(
|
IOHIDDeviceRegisterInputReportCallback(
|
||||||
dev->device_handle, dev->input_report_buf, dev->max_input_report_len,
|
dev->device_handle, dev->input_report_buf, dev->max_input_report_len,
|
||||||
NULL, dev);
|
NULL, dev);
|
||||||
@@ -1163,7 +1166,7 @@ void HID_API_EXPORT hid_close(hid_device *dev)
|
|||||||
/* Close the OS handle to the device, but only if it's not
|
/* Close the OS handle to the device, but only if it's not
|
||||||
been unplugged. If it's been unplugged, then calling
|
been unplugged. If it's been unplugged, then calling
|
||||||
IOHIDDeviceClose() will crash. */
|
IOHIDDeviceClose() will crash. */
|
||||||
if (!dev->disconnected) {
|
if (!disconnected) {
|
||||||
IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeNone);
|
IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeNone);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,10 @@
|
|||||||
#include "../events/SDL_events_c.h"
|
#include "../events/SDL_events_c.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__WIN32__)
|
||||||
|
#include "../core/windows/SDL_windows.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
#if defined(__ANDROID__)
|
||||||
#include "SDL_system.h"
|
#include "SDL_system.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -1984,7 +1988,7 @@ const char *SDL_GameControllerPathForIndex(int joystick_index)
|
|||||||
SDL_GameControllerType SDL_GameControllerTypeForIndex(int joystick_index)
|
SDL_GameControllerType SDL_GameControllerTypeForIndex(int joystick_index)
|
||||||
{
|
{
|
||||||
SDL_JoystickGUID joystick_guid = SDL_JoystickGetDeviceGUID(joystick_index);
|
SDL_JoystickGUID joystick_guid = SDL_JoystickGetDeviceGUID(joystick_index);
|
||||||
const char *mapping = SDL_GameControllerMappingForGUID(joystick_guid);
|
char *mapping = SDL_GameControllerMappingForGUID(joystick_guid);
|
||||||
char *type_string, *comma;
|
char *type_string, *comma;
|
||||||
SDL_GameControllerType type;
|
SDL_GameControllerType type;
|
||||||
if (mapping) {
|
if (mapping) {
|
||||||
@@ -1999,8 +2003,10 @@ SDL_GameControllerType SDL_GameControllerTypeForIndex(int joystick_index)
|
|||||||
} else {
|
} else {
|
||||||
type = SDL_GetGameControllerTypeFromString(type_string);
|
type = SDL_GetGameControllerTypeFromString(type_string);
|
||||||
}
|
}
|
||||||
|
SDL_free(mapping);
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
SDL_free(mapping);
|
||||||
}
|
}
|
||||||
return SDL_GetJoystickGameControllerTypeFromGUID(joystick_guid, SDL_JoystickNameForIndex(joystick_index));
|
return SDL_GetJoystickGameControllerTypeFromGUID(joystick_guid, SDL_JoystickNameForIndex(joystick_index));
|
||||||
}
|
}
|
||||||
@@ -2128,7 +2134,7 @@ SDL_bool SDL_ShouldIgnoreGameController(const char *name, SDL_JoystickGUID guid)
|
|||||||
|
|
||||||
#ifdef __WIN32__
|
#ifdef __WIN32__
|
||||||
if (SDL_GetHintBoolean("SDL_GAMECONTROLLER_ALLOW_STEAM_VIRTUAL_GAMEPAD", SDL_FALSE) &&
|
if (SDL_GetHintBoolean("SDL_GAMECONTROLLER_ALLOW_STEAM_VIRTUAL_GAMEPAD", SDL_FALSE) &&
|
||||||
SDL_GetHintBoolean("STEAM_COMPAT_PROTON", SDL_FALSE)) {
|
WIN_IsWine()) {
|
||||||
/* We are launched by Steam and running under Proton
|
/* We are launched by Steam and running under Proton
|
||||||
* We can't tell whether this controller is a Steam Virtual Gamepad,
|
* We can't tell whether this controller is a Steam Virtual Gamepad,
|
||||||
* so assume that Proton is doing the appropriate filtering of controllers
|
* so assume that Proton is doing the appropriate filtering of controllers
|
||||||
|
|||||||
@@ -31,6 +31,9 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef __LINUX__
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define SDL_HINT_STEAM_VIRTUAL_GAMEPAD_INFO_FILE "SteamVirtualGamepadInfo"
|
#define SDL_HINT_STEAM_VIRTUAL_GAMEPAD_INFO_FILE "SteamVirtualGamepadInfo"
|
||||||
|
|
||||||
@@ -123,6 +126,28 @@ static void AddVirtualGamepadInfo(int slot, SDL_SteamVirtualGamepadInfo *info)
|
|||||||
SDL_zerop(info);
|
SDL_zerop(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __LINUX__
|
||||||
|
static const char *SDL_GetExeName(void)
|
||||||
|
{
|
||||||
|
const char *proc_name = NULL;
|
||||||
|
static char linkfile[1024];
|
||||||
|
int linksize;
|
||||||
|
const char *proc_path = "/proc/self/exe";
|
||||||
|
|
||||||
|
linksize = readlink(proc_path, linkfile, sizeof(linkfile) - 1);
|
||||||
|
if (linksize > 0) {
|
||||||
|
linkfile[linksize] = '\0';
|
||||||
|
proc_name = SDL_strrchr(linkfile, '/');
|
||||||
|
if (proc_name) {
|
||||||
|
++proc_name;
|
||||||
|
} else {
|
||||||
|
proc_name = linkfile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return proc_name;
|
||||||
|
}
|
||||||
|
#endif /* __LINUX__ */
|
||||||
|
|
||||||
void SDL_InitSteamVirtualGamepadInfo(void)
|
void SDL_InitSteamVirtualGamepadInfo(void)
|
||||||
{
|
{
|
||||||
const char *file;
|
const char *file;
|
||||||
@@ -131,6 +156,16 @@ void SDL_InitSteamVirtualGamepadInfo(void)
|
|||||||
|
|
||||||
file = SDL_GetHint(SDL_HINT_STEAM_VIRTUAL_GAMEPAD_INFO_FILE);
|
file = SDL_GetHint(SDL_HINT_STEAM_VIRTUAL_GAMEPAD_INFO_FILE);
|
||||||
if (file && *file) {
|
if (file && *file) {
|
||||||
|
#ifdef __LINUX__
|
||||||
|
/* Older versions of Wine will blacklist the Steam Virtual Gamepad if
|
||||||
|
* it appears to have the real controller's VID/PID, so ignore this.
|
||||||
|
*/
|
||||||
|
const char *exe = SDL_GetExeName();
|
||||||
|
if (exe && SDL_strcmp(exe, "wine64-preloader") == 0) {
|
||||||
|
SDL_LogDebug(SDL_LOG_CATEGORY_INPUT, "Wine launched by Steam, ignoring %s", SDL_HINT_STEAM_VIRTUAL_GAMEPAD_INFO_FILE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
SDL_steam_virtual_gamepad_info_file = SDL_strdup(file);
|
SDL_steam_virtual_gamepad_info_file = SDL_strdup(file);
|
||||||
}
|
}
|
||||||
SDL_UpdateSteamVirtualGamepadInfo();
|
SDL_UpdateSteamVirtualGamepadInfo();
|
||||||
|
|||||||
@@ -40,17 +40,18 @@ static int numjoysticks = 0;
|
|||||||
|
|
||||||
static EM_BOOL Emscripten_JoyStickConnected(int eventType, const EmscriptenGamepadEvent *gamepadEvent, void *userData)
|
static EM_BOOL Emscripten_JoyStickConnected(int eventType, const EmscriptenGamepadEvent *gamepadEvent, void *userData)
|
||||||
{
|
{
|
||||||
|
SDL_joylist_item *item;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
SDL_joylist_item *item;
|
SDL_LockJoysticks();
|
||||||
|
|
||||||
if (JoystickByIndex(gamepadEvent->index) != NULL) {
|
if (JoystickByIndex(gamepadEvent->index) != NULL) {
|
||||||
return 1;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
item = (SDL_joylist_item *)SDL_malloc(sizeof(SDL_joylist_item));
|
item = (SDL_joylist_item *)SDL_malloc(sizeof(SDL_joylist_item));
|
||||||
if (!item) {
|
if (!item) {
|
||||||
return 1;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_zerop(item);
|
SDL_zerop(item);
|
||||||
@@ -59,14 +60,14 @@ static EM_BOOL Emscripten_JoyStickConnected(int eventType, const EmscriptenGamep
|
|||||||
item->name = SDL_CreateJoystickName(0, 0, NULL, gamepadEvent->id);
|
item->name = SDL_CreateJoystickName(0, 0, NULL, gamepadEvent->id);
|
||||||
if (!item->name) {
|
if (!item->name) {
|
||||||
SDL_free(item);
|
SDL_free(item);
|
||||||
return 1;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
item->mapping = SDL_strdup(gamepadEvent->mapping);
|
item->mapping = SDL_strdup(gamepadEvent->mapping);
|
||||||
if (!item->mapping) {
|
if (!item->mapping) {
|
||||||
SDL_free(item->name);
|
SDL_free(item->name);
|
||||||
SDL_free(item);
|
SDL_free(item);
|
||||||
return 1;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
item->naxes = gamepadEvent->numAxes;
|
item->naxes = gamepadEvent->numAxes;
|
||||||
@@ -103,6 +104,9 @@ static EM_BOOL Emscripten_JoyStickConnected(int eventType, const EmscriptenGamep
|
|||||||
SDL_Log("Added joystick with index %d", item->index);
|
SDL_Log("Added joystick with index %d", item->index);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
done:
|
||||||
|
SDL_UnlockJoysticks();
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,6 +115,8 @@ static EM_BOOL Emscripten_JoyStickDisconnected(int eventType, const EmscriptenGa
|
|||||||
SDL_joylist_item *item = SDL_joylist;
|
SDL_joylist_item *item = SDL_joylist;
|
||||||
SDL_joylist_item *prev = NULL;
|
SDL_joylist_item *prev = NULL;
|
||||||
|
|
||||||
|
SDL_LockJoysticks();
|
||||||
|
|
||||||
while (item) {
|
while (item) {
|
||||||
if (item->index == gamepadEvent->index) {
|
if (item->index == gamepadEvent->index) {
|
||||||
break;
|
break;
|
||||||
@@ -120,7 +126,7 @@ static EM_BOOL Emscripten_JoyStickDisconnected(int eventType, const EmscriptenGa
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!item) {
|
if (!item) {
|
||||||
return 1;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item->joystick) {
|
if (item->joystick) {
|
||||||
@@ -148,6 +154,10 @@ static EM_BOOL Emscripten_JoyStickDisconnected(int eventType, const EmscriptenGa
|
|||||||
SDL_free(item->name);
|
SDL_free(item->name);
|
||||||
SDL_free(item->mapping);
|
SDL_free(item->mapping);
|
||||||
SDL_free(item);
|
SDL_free(item);
|
||||||
|
|
||||||
|
done:
|
||||||
|
SDL_UnlockJoysticks();
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -644,13 +644,6 @@ static void RotatePad(int *pX, int *pY, float flAngleInRad)
|
|||||||
*pX = (int)(SDL_cosf(flAngleInRad) * origX - SDL_sinf(flAngleInRad) * origY);
|
*pX = (int)(SDL_cosf(flAngleInRad) * origX - SDL_sinf(flAngleInRad) * origY);
|
||||||
*pY = (int)(SDL_sinf(flAngleInRad) * origX + SDL_cosf(flAngleInRad) * origY);
|
*pY = (int)(SDL_sinf(flAngleInRad) * origX + SDL_cosf(flAngleInRad) * origY);
|
||||||
}
|
}
|
||||||
static void RotatePadShort(short *pX, short *pY, float flAngleInRad)
|
|
||||||
{
|
|
||||||
short int origX = *pX, origY = *pY;
|
|
||||||
|
|
||||||
*pX = (short)(SDL_cosf(flAngleInRad) * origX - SDL_sinf(flAngleInRad) * origY);
|
|
||||||
*pY = (short)(SDL_sinf(flAngleInRad) * origX + SDL_cosf(flAngleInRad) * origY);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// Format the first part of the state packet
|
// Format the first part of the state packet
|
||||||
@@ -774,9 +767,16 @@ static void FormatStatePacketUntilGyro(SteamControllerStateInternal_t *pState, V
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
static bool UpdateBLESteamControllerState(const uint8_t *pData, int nDataSize, SteamControllerStateInternal_t *pState)
|
static bool UpdateBLESteamControllerState(const uint8_t *pData, int nDataSize, SteamControllerStateInternal_t *pState)
|
||||||
{
|
{
|
||||||
const float flRotationAngle = 0.261799f;
|
int nLeftPadX;
|
||||||
|
int nLeftPadY;
|
||||||
|
int nRightPadX;
|
||||||
|
int nRightPadY;
|
||||||
|
int nPadOffset;
|
||||||
uint32_t ucOptionDataMask;
|
uint32_t ucOptionDataMask;
|
||||||
|
|
||||||
|
// 15 degrees in rad
|
||||||
|
const float flRotationAngle = 0.261799f;
|
||||||
|
|
||||||
pState->unPacketNum++;
|
pState->unPacketNum++;
|
||||||
ucOptionDataMask = (*pData++ & 0xF0);
|
ucOptionDataMask = (*pData++ & 0xF0);
|
||||||
ucOptionDataMask |= (uint32_t)(*pData++) << 8;
|
ucOptionDataMask |= (uint32_t)(*pData++) << 8;
|
||||||
@@ -805,7 +805,6 @@ static bool UpdateBLESteamControllerState(const uint8_t *pData, int nDataSize, S
|
|||||||
}
|
}
|
||||||
if (ucOptionDataMask & k_EBLELeftTrackpadChunk) {
|
if (ucOptionDataMask & k_EBLELeftTrackpadChunk) {
|
||||||
int nLength = sizeof(pState->sLeftPadX) + sizeof(pState->sLeftPadY);
|
int nLength = sizeof(pState->sLeftPadX) + sizeof(pState->sLeftPadY);
|
||||||
int nPadOffset;
|
|
||||||
SDL_memcpy(&pState->sLeftPadX, pData, nLength);
|
SDL_memcpy(&pState->sLeftPadX, pData, nLength);
|
||||||
if (pState->ulButtons & STEAM_LEFTPAD_FINGERDOWN_MASK) {
|
if (pState->ulButtons & STEAM_LEFTPAD_FINGERDOWN_MASK) {
|
||||||
nPadOffset = 1000;
|
nPadOffset = 1000;
|
||||||
@@ -813,14 +812,15 @@ static bool UpdateBLESteamControllerState(const uint8_t *pData, int nDataSize, S
|
|||||||
nPadOffset = 0;
|
nPadOffset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
RotatePadShort(&pState->sLeftPadX, &pState->sLeftPadY, -flRotationAngle);
|
nLeftPadX = pState->sLeftPadX;
|
||||||
pState->sLeftPadX = clamp(pState->sLeftPadX + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
nLeftPadY = pState->sLeftPadY;
|
||||||
pState->sLeftPadY = clamp(pState->sLeftPadY + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
RotatePad(&nLeftPadX, &nLeftPadY, -flRotationAngle);
|
||||||
|
pState->sLeftPadX = (short)clamp(nLeftPadX + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
||||||
|
pState->sLeftPadY = (short)clamp(nLeftPadY + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
||||||
pData += nLength;
|
pData += nLength;
|
||||||
}
|
}
|
||||||
if (ucOptionDataMask & k_EBLERightTrackpadChunk) {
|
if (ucOptionDataMask & k_EBLERightTrackpadChunk) {
|
||||||
int nLength = sizeof(pState->sRightPadX) + sizeof(pState->sRightPadY);
|
int nLength = sizeof(pState->sRightPadX) + sizeof(pState->sRightPadY);
|
||||||
int nPadOffset = 0;
|
|
||||||
|
|
||||||
SDL_memcpy(&pState->sRightPadX, pData, nLength);
|
SDL_memcpy(&pState->sRightPadX, pData, nLength);
|
||||||
|
|
||||||
@@ -830,9 +830,11 @@ static bool UpdateBLESteamControllerState(const uint8_t *pData, int nDataSize, S
|
|||||||
nPadOffset = 0;
|
nPadOffset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
RotatePadShort(&pState->sRightPadX, &pState->sRightPadY, flRotationAngle);
|
nRightPadX = pState->sRightPadX;
|
||||||
pState->sRightPadX = clamp(pState->sRightPadX + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
nRightPadY = pState->sRightPadY;
|
||||||
pState->sRightPadY = clamp(pState->sRightPadY + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
RotatePad(&nRightPadX, &nRightPadY, flRotationAngle);
|
||||||
|
pState->sRightPadX = (short)clamp(nRightPadX + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
||||||
|
pState->sRightPadY = (short)clamp(nRightPadY + nPadOffset, SDL_MIN_SINT16, SDL_MAX_SINT16);
|
||||||
pData += nLength;
|
pData += nLength;
|
||||||
}
|
}
|
||||||
if (ucOptionDataMask & k_EBLEIMUAccelChunk) {
|
if (ucOptionDataMask & k_EBLEIMUAccelChunk) {
|
||||||
|
|||||||
@@ -62,9 +62,7 @@
|
|||||||
#define SWITCH_GYRO_SCALE 14.2842f
|
#define SWITCH_GYRO_SCALE 14.2842f
|
||||||
#define SWITCH_ACCEL_SCALE 4096.f
|
#define SWITCH_ACCEL_SCALE 4096.f
|
||||||
|
|
||||||
#define SWITCH_GYRO_SCALE_OFFSET 13371.0f
|
|
||||||
#define SWITCH_GYRO_SCALE_MULT 936.0f
|
#define SWITCH_GYRO_SCALE_MULT 936.0f
|
||||||
#define SWITCH_ACCEL_SCALE_OFFSET 16384.0f
|
|
||||||
#define SWITCH_ACCEL_SCALE_MULT 4.0f
|
#define SWITCH_ACCEL_SCALE_MULT 4.0f
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
@@ -817,6 +815,8 @@ static SDL_bool LoadStickCalibration(SDL_DriverSwitch_Context *ctx)
|
|||||||
SwitchSubcommandInputPacket_t *factory_reply = NULL;
|
SwitchSubcommandInputPacket_t *factory_reply = NULL;
|
||||||
SwitchSPIOpData_t readUserParams;
|
SwitchSPIOpData_t readUserParams;
|
||||||
SwitchSPIOpData_t readFactoryParams;
|
SwitchSPIOpData_t readFactoryParams;
|
||||||
|
const int MAX_ATTEMPTS = 3;
|
||||||
|
int attempt;
|
||||||
|
|
||||||
/* Read User Calibration Info */
|
/* Read User Calibration Info */
|
||||||
readUserParams.unAddress = k_unSPIStickUserCalibrationStartOffset;
|
readUserParams.unAddress = k_unSPIStickUserCalibrationStartOffset;
|
||||||
@@ -829,8 +829,19 @@ static SDL_bool LoadStickCalibration(SDL_DriverSwitch_Context *ctx)
|
|||||||
readFactoryParams.unAddress = k_unSPIStickFactoryCalibrationStartOffset;
|
readFactoryParams.unAddress = k_unSPIStickFactoryCalibrationStartOffset;
|
||||||
readFactoryParams.ucLength = k_unSPIStickFactoryCalibrationLength;
|
readFactoryParams.ucLength = k_unSPIStickFactoryCalibrationLength;
|
||||||
|
|
||||||
if (!WriteSubcommand(ctx, k_eSwitchSubcommandIDs_SPIFlashRead, (uint8_t *)&readFactoryParams, sizeof(readFactoryParams), &factory_reply)) {
|
for (attempt = 0; ; ++attempt) {
|
||||||
return SDL_FALSE;
|
if (!WriteSubcommand(ctx, k_eSwitchSubcommandIDs_SPIFlashRead, (uint8_t *)&readFactoryParams, sizeof(readFactoryParams), &factory_reply)) {
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (factory_reply->stickFactoryCalibration.opData.unAddress == k_unSPIStickFactoryCalibrationStartOffset) {
|
||||||
|
/* We successfully read the calibration data */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attempt == MAX_ATTEMPTS) {
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Automatically select the user calibration if magic bytes are set */
|
/* Automatically select the user calibration if magic bytes are set */
|
||||||
@@ -912,6 +923,8 @@ static SDL_bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
|
|||||||
if (WriteSubcommand(ctx, k_eSwitchSubcommandIDs_SPIFlashRead, (uint8_t *)&readParams, sizeof(readParams), &reply)) {
|
if (WriteSubcommand(ctx, k_eSwitchSubcommandIDs_SPIFlashRead, (uint8_t *)&readParams, sizeof(readParams), &reply)) {
|
||||||
Uint8 *pIMUScale;
|
Uint8 *pIMUScale;
|
||||||
Sint16 sAccelRawX, sAccelRawY, sAccelRawZ, sGyroRawX, sGyroRawY, sGyroRawZ;
|
Sint16 sAccelRawX, sAccelRawY, sAccelRawZ, sGyroRawX, sGyroRawY, sGyroRawZ;
|
||||||
|
Sint16 sAccelSensCoeffX, sAccelSensCoeffY, sAccelSensCoeffZ;
|
||||||
|
Sint16 sGyroSensCoeffX, sGyroSensCoeffY, sGyroSensCoeffZ;
|
||||||
|
|
||||||
/* IMU scale gives us multipliers for converting raw values to real world values */
|
/* IMU scale gives us multipliers for converting raw values to real world values */
|
||||||
pIMUScale = reply->spiReadData.rgucReadData;
|
pIMUScale = reply->spiReadData.rgucReadData;
|
||||||
@@ -920,10 +933,18 @@ static SDL_bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
|
|||||||
sAccelRawY = (pIMUScale[3] << 8) | pIMUScale[2];
|
sAccelRawY = (pIMUScale[3] << 8) | pIMUScale[2];
|
||||||
sAccelRawZ = (pIMUScale[5] << 8) | pIMUScale[4];
|
sAccelRawZ = (pIMUScale[5] << 8) | pIMUScale[4];
|
||||||
|
|
||||||
|
sAccelSensCoeffX = (pIMUScale[7] << 8) | pIMUScale[6];
|
||||||
|
sAccelSensCoeffY = (pIMUScale[9] << 8) | pIMUScale[8];
|
||||||
|
sAccelSensCoeffZ = (pIMUScale[11] << 8) | pIMUScale[10];
|
||||||
|
|
||||||
sGyroRawX = (pIMUScale[13] << 8) | pIMUScale[12];
|
sGyroRawX = (pIMUScale[13] << 8) | pIMUScale[12];
|
||||||
sGyroRawY = (pIMUScale[15] << 8) | pIMUScale[14];
|
sGyroRawY = (pIMUScale[15] << 8) | pIMUScale[14];
|
||||||
sGyroRawZ = (pIMUScale[17] << 8) | pIMUScale[16];
|
sGyroRawZ = (pIMUScale[17] << 8) | pIMUScale[16];
|
||||||
|
|
||||||
|
sGyroSensCoeffX = (pIMUScale[19] << 8) | pIMUScale[18];
|
||||||
|
sGyroSensCoeffY = (pIMUScale[21] << 8) | pIMUScale[20];
|
||||||
|
sGyroSensCoeffZ = (pIMUScale[23] << 8) | pIMUScale[22];
|
||||||
|
|
||||||
/* Check for user calibration data. If it's present and set, it'll override the factory settings */
|
/* Check for user calibration data. If it's present and set, it'll override the factory settings */
|
||||||
readParams.unAddress = k_unSPIIMUUserScaleStartOffset;
|
readParams.unAddress = k_unSPIIMUUserScaleStartOffset;
|
||||||
readParams.ucLength = k_unSPIIMUUserScaleLength;
|
readParams.ucLength = k_unSPIIMUUserScaleLength;
|
||||||
@@ -940,14 +961,14 @@ static SDL_bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Accelerometer scale */
|
/* Accelerometer scale */
|
||||||
ctx->m_IMUScaleData.fAccelScaleX = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawX) * SDL_STANDARD_GRAVITY;
|
ctx->m_IMUScaleData.fAccelScaleX = SWITCH_ACCEL_SCALE_MULT / ((float)sAccelSensCoeffX - (float)sAccelRawX) * SDL_STANDARD_GRAVITY;
|
||||||
ctx->m_IMUScaleData.fAccelScaleY = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawY) * SDL_STANDARD_GRAVITY;
|
ctx->m_IMUScaleData.fAccelScaleY = SWITCH_ACCEL_SCALE_MULT / ((float)sAccelSensCoeffY - (float)sAccelRawY) * SDL_STANDARD_GRAVITY;
|
||||||
ctx->m_IMUScaleData.fAccelScaleZ = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawZ) * SDL_STANDARD_GRAVITY;
|
ctx->m_IMUScaleData.fAccelScaleZ = SWITCH_ACCEL_SCALE_MULT / ((float)sAccelSensCoeffZ - (float)sAccelRawZ) * SDL_STANDARD_GRAVITY;
|
||||||
|
|
||||||
/* Gyro scale */
|
/* Gyro scale */
|
||||||
ctx->m_IMUScaleData.fGyroScaleX = SWITCH_GYRO_SCALE_MULT / (SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawX) * (float)M_PI / 180.0f;
|
ctx->m_IMUScaleData.fGyroScaleX = SWITCH_GYRO_SCALE_MULT / ((float)sGyroSensCoeffX - (float)sGyroRawX) * (float)M_PI / 180.0f;
|
||||||
ctx->m_IMUScaleData.fGyroScaleY = SWITCH_GYRO_SCALE_MULT / (SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawY) * (float)M_PI / 180.0f;
|
ctx->m_IMUScaleData.fGyroScaleY = SWITCH_GYRO_SCALE_MULT / ((float)sGyroSensCoeffY - (float)sGyroRawY) * (float)M_PI / 180.0f;
|
||||||
ctx->m_IMUScaleData.fGyroScaleZ = SWITCH_GYRO_SCALE_MULT / (SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawZ) * (float)M_PI / 180.0f;
|
ctx->m_IMUScaleData.fGyroScaleZ = SWITCH_GYRO_SCALE_MULT / ((float)sGyroSensCoeffZ - (float)sGyroRawZ) * (float)M_PI / 180.0f;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/* Use default values */
|
/* Use default values */
|
||||||
@@ -969,15 +990,17 @@ static Sint16 ApplyStickCalibration(SDL_DriverSwitch_Context *ctx, int nStick, i
|
|||||||
{
|
{
|
||||||
sRawValue -= ctx->m_StickCalData[nStick].axis[nAxis].sCenter;
|
sRawValue -= ctx->m_StickCalData[nStick].axis[nAxis].sCenter;
|
||||||
|
|
||||||
if (sRawValue > ctx->m_StickExtents[nStick].axis[nAxis].sMax) {
|
if (sRawValue >= 0) {
|
||||||
ctx->m_StickExtents[nStick].axis[nAxis].sMax = sRawValue;
|
if (sRawValue > ctx->m_StickExtents[nStick].axis[nAxis].sMax) {
|
||||||
|
ctx->m_StickExtents[nStick].axis[nAxis].sMax = sRawValue;
|
||||||
|
}
|
||||||
|
return (Sint16)HIDAPI_RemapVal(sRawValue, 0, ctx->m_StickExtents[nStick].axis[nAxis].sMax, 0, SDL_MAX_SINT16);
|
||||||
|
} else {
|
||||||
|
if (sRawValue < ctx->m_StickExtents[nStick].axis[nAxis].sMin) {
|
||||||
|
ctx->m_StickExtents[nStick].axis[nAxis].sMin = sRawValue;
|
||||||
|
}
|
||||||
|
return (Sint16)HIDAPI_RemapVal(sRawValue, ctx->m_StickExtents[nStick].axis[nAxis].sMin, 0, SDL_MIN_SINT16, 0);
|
||||||
}
|
}
|
||||||
if (sRawValue < ctx->m_StickExtents[nStick].axis[nAxis].sMin) {
|
|
||||||
ctx->m_StickExtents[nStick].axis[nAxis].sMin = sRawValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Sint16)HIDAPI_RemapVal(sRawValue, ctx->m_StickExtents[nStick].axis[nAxis].sMin, ctx->m_StickExtents[nStick].axis[nAxis].sMax,
|
|
||||||
SDL_MIN_SINT16, SDL_MAX_SINT16);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Sint16 ApplySimpleStickCalibration(SDL_DriverSwitch_Context *ctx, int nStick, int nAxis, Sint16 sRawValue)
|
static Sint16 ApplySimpleStickCalibration(SDL_DriverSwitch_Context *ctx, int nStick, int nAxis, Sint16 sRawValue)
|
||||||
@@ -987,15 +1010,17 @@ static Sint16 ApplySimpleStickCalibration(SDL_DriverSwitch_Context *ctx, int nSt
|
|||||||
|
|
||||||
sRawValue -= usJoystickCenter;
|
sRawValue -= usJoystickCenter;
|
||||||
|
|
||||||
if (sRawValue > ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax) {
|
if (sRawValue >= 0) {
|
||||||
ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax = sRawValue;
|
if (sRawValue > ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax) {
|
||||||
|
ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax = sRawValue;
|
||||||
|
}
|
||||||
|
return (Sint16)HIDAPI_RemapVal(sRawValue, 0, ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax, 0, SDL_MAX_SINT16);
|
||||||
|
} else {
|
||||||
|
if (sRawValue < ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin) {
|
||||||
|
ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin = sRawValue;
|
||||||
|
}
|
||||||
|
return (Sint16)HIDAPI_RemapVal(sRawValue, ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin, 0, SDL_MIN_SINT16, 0);
|
||||||
}
|
}
|
||||||
if (sRawValue < ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin) {
|
|
||||||
ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin = sRawValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (Sint16)HIDAPI_RemapVal(sRawValue, ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin, ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax,
|
|
||||||
SDL_MIN_SINT16, SDL_MAX_SINT16);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SDLCALL SDL_GameControllerButtonReportingHintChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
static void SDLCALL SDL_GameControllerButtonReportingHintChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
|
||||||
@@ -1426,6 +1451,10 @@ static SDL_bool HIDAPI_DriverSwitch_OpenJoystick(SDL_HIDAPI_Device *device, SDL_
|
|||||||
ctx->m_bSyncWrite = SDL_TRUE;
|
ctx->m_bSyncWrite = SDL_TRUE;
|
||||||
|
|
||||||
if (!ctx->m_bInputOnly) {
|
if (!ctx->m_bInputOnly) {
|
||||||
|
#ifdef SDL_PLATFORM_MACOS
|
||||||
|
// Wait for the OS to finish its handshake with the controller
|
||||||
|
SDL_Delay(250);
|
||||||
|
#endif
|
||||||
GetInitialInputMode(ctx);
|
GetInitialInputMode(ctx);
|
||||||
ctx->m_nCurrentInputMode = ctx->m_nInitialInputMode;
|
ctx->m_nCurrentInputMode = ctx->m_nInitialInputMode;
|
||||||
|
|
||||||
|
|||||||
@@ -822,11 +822,12 @@ SDL_bool HIDAPI_JoystickConnected(SDL_HIDAPI_Device *device, SDL_JoystickID *pJo
|
|||||||
|
|
||||||
++SDL_HIDAPI_numjoysticks;
|
++SDL_HIDAPI_numjoysticks;
|
||||||
|
|
||||||
SDL_PrivateJoystickAdded(joystickID);
|
|
||||||
|
|
||||||
if (pJoystickID) {
|
if (pJoystickID) {
|
||||||
*pJoystickID = joystickID;
|
*pJoystickID = joystickID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_PrivateJoystickAdded(joystickID);
|
||||||
|
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -890,10 +891,8 @@ static SDL_HIDAPI_Device *HIDAPI_AddDevice(const struct SDL_hid_device_info *inf
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
device->magic = &SDL_HIDAPI_device_magic;
|
device->magic = &SDL_HIDAPI_device_magic;
|
||||||
device->path = SDL_strdup(info->path);
|
if (info->path) {
|
||||||
if (!device->path) {
|
device->path = SDL_strdup(info->path);
|
||||||
SDL_free(device);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
device->seen = SDL_TRUE;
|
device->seen = SDL_TRUE;
|
||||||
device->vendor_id = info->vendor_id;
|
device->vendor_id = info->vendor_id;
|
||||||
|
|||||||
@@ -908,9 +908,11 @@ static void RAWINPUT_AddDevice(HANDLE hDevice)
|
|||||||
char *product_string = NULL;
|
char *product_string = NULL;
|
||||||
WCHAR string[128];
|
WCHAR string[128];
|
||||||
|
|
||||||
|
string[0] = 0;
|
||||||
if (SDL_HidD_GetManufacturerString(hFile, string, sizeof(string))) {
|
if (SDL_HidD_GetManufacturerString(hFile, string, sizeof(string))) {
|
||||||
manufacturer_string = WIN_StringToUTF8W(string);
|
manufacturer_string = WIN_StringToUTF8W(string);
|
||||||
}
|
}
|
||||||
|
string[0] = 0;
|
||||||
if (SDL_HidD_GetProductString(hFile, string, sizeof(string))) {
|
if (SDL_HidD_GetProductString(hFile, string, sizeof(string))) {
|
||||||
product_string = WIN_StringToUTF8W(string);
|
product_string = WIN_StringToUTF8W(string);
|
||||||
}
|
}
|
||||||
@@ -1025,7 +1027,7 @@ static int RAWINPUT_JoystickInit(void)
|
|||||||
{
|
{
|
||||||
SDL_assert(!SDL_RAWINPUT_inited);
|
SDL_assert(!SDL_RAWINPUT_inited);
|
||||||
|
|
||||||
if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_RAWINPUT, SDL_TRUE)) {
|
if (!SDL_GetHintBoolean(SDL_HINT_JOYSTICK_RAWINPUT, SDL_FALSE)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 2,32,0,0
|
FILEVERSION 2,33,0,0
|
||||||
PRODUCTVERSION 2,32,0,0
|
PRODUCTVERSION 2,33,0,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
FILEFLAGS 0x0L
|
FILEFLAGS 0x0L
|
||||||
FILEOS 0x40004L
|
FILEOS 0x40004L
|
||||||
@@ -23,12 +23,12 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "\0"
|
VALUE "CompanyName", "\0"
|
||||||
VALUE "FileDescription", "SDL\0"
|
VALUE "FileDescription", "SDL\0"
|
||||||
VALUE "FileVersion", "2, 32, 0, 0\0"
|
VALUE "FileVersion", "2, 33, 0, 0\0"
|
||||||
VALUE "InternalName", "SDL\0"
|
VALUE "InternalName", "SDL\0"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2025 Sam Lantinga\0"
|
VALUE "LegalCopyright", "Copyright (C) 2025 Sam Lantinga\0"
|
||||||
VALUE "OriginalFilename", "SDL2.dll\0"
|
VALUE "OriginalFilename", "SDL2.dll\0"
|
||||||
VALUE "ProductName", "Simple DirectMedia Layer\0"
|
VALUE "ProductName", "Simple DirectMedia Layer\0"
|
||||||
VALUE "ProductVersion", "2, 32, 0, 0\0"
|
VALUE "ProductVersion", "2, 33, 0, 0\0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|||||||
@@ -29,6 +29,12 @@
|
|||||||
#include "software/SDL_render_sw_c.h"
|
#include "software/SDL_render_sw_c.h"
|
||||||
#include "../video/SDL_pixels_c.h"
|
#include "../video/SDL_pixels_c.h"
|
||||||
|
|
||||||
|
#if defined(__loongarch__)
|
||||||
|
#if SDL_VIDEO_OPENGL
|
||||||
|
#include "SDL_opengl.h"
|
||||||
|
#endif /* SDL_VIDEO_OPENGL */
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
#if defined(__ANDROID__)
|
||||||
#include "../core/android/SDL_android.h"
|
#include "../core/android/SDL_android.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -954,6 +960,34 @@ static void SDL_CalculateSimulatedVSyncInterval(SDL_Renderer *renderer, SDL_Wind
|
|||||||
}
|
}
|
||||||
#endif /* !SDL_RENDER_DISABLED */
|
#endif /* !SDL_RENDER_DISABLED */
|
||||||
|
|
||||||
|
#if defined(__loongarch__)
|
||||||
|
static SDL_bool SDL_CheckIntegratedGraphics()
|
||||||
|
{
|
||||||
|
SDL_Window *window = SDL_CreateWindow("OpenGL test", -32, -32, 32, 32,
|
||||||
|
SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN);
|
||||||
|
SDL_bool has_lg100_or_lg110 = SDL_FALSE;
|
||||||
|
|
||||||
|
if (window) {
|
||||||
|
SDL_GLContext context = SDL_GL_CreateContext(window);
|
||||||
|
|
||||||
|
if (context) {
|
||||||
|
const GLubyte *(APIENTRY *glGetStringFunc)(GLenum) =
|
||||||
|
SDL_GL_GetProcAddress("glGetString");
|
||||||
|
if (glGetStringFunc) {
|
||||||
|
const char *renderer = (const char*)glGetStringFunc(GL_RENDERER);
|
||||||
|
if (renderer && (SDL_strstr(renderer, "LG110") ||
|
||||||
|
SDL_strstr(renderer, "LG100"))) {
|
||||||
|
has_lg100_or_lg110 = SDL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SDL_GL_DeleteContext(context);
|
||||||
|
}
|
||||||
|
SDL_DestroyWindow(window);
|
||||||
|
}
|
||||||
|
return has_lg100_or_lg110;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
SDL_Renderer *SDL_CreateRenderer(SDL_Window *window, int index, Uint32 flags)
|
SDL_Renderer *SDL_CreateRenderer(SDL_Window *window, int index, Uint32 flags)
|
||||||
{
|
{
|
||||||
#ifndef SDL_RENDER_DISABLED
|
#ifndef SDL_RENDER_DISABLED
|
||||||
@@ -967,6 +1001,14 @@ SDL_Renderer *SDL_CreateRenderer(SDL_Window *window, int index, Uint32 flags)
|
|||||||
Android_ActivityMutex_Lock_Running();
|
Android_ActivityMutex_Lock_Running();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* CPU acceleration runs faster than integrated graphics on Loongson at present. */
|
||||||
|
#if defined(__linux__) && defined(__loongarch__)
|
||||||
|
if (SDL_CheckIntegratedGraphics()) {
|
||||||
|
SDL_SetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION, "0");
|
||||||
|
flags = SDL_RENDERER_SOFTWARE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!window) {
|
if (!window) {
|
||||||
SDL_InvalidParamError("window");
|
SDL_InvalidParamError("window");
|
||||||
goto error;
|
goto error;
|
||||||
|
|||||||
@@ -975,8 +975,8 @@ static int SetDrawState(GLES2_RenderData *data, const SDL_RenderCommand *cmd, co
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (texture) {
|
if (texture) {
|
||||||
SDL_Vertex *verts = (SDL_Vertex *)(((Uint8 *)vertices) + cmd->data.draw.first);
|
uintptr_t base = (uintptr_t)vertices + cmd->data.draw.first; // address of first vertex, or base offset when using VBOs.
|
||||||
data->glVertexAttribPointer(GLES2_ATTRIBUTE_TEXCOORD, 2, GL_FLOAT, GL_FALSE, stride, (const GLvoid *)&verts->tex_coord);
|
data->glVertexAttribPointer(GLES2_ATTRIBUTE_TEXCOORD, 2, GL_FLOAT, GL_FALSE, stride, (const GLvoid *)(base + offsetof(SDL_Vertex, tex_coord)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GLES2_SelectProgram(data, imgsrc, texture ? texture->w : 0, texture ? texture->h : 0) < 0) {
|
if (GLES2_SelectProgram(data, imgsrc, texture ? texture->w : 0, texture ? texture->h : 0) < 0) {
|
||||||
@@ -1009,9 +1009,9 @@ static int SetDrawState(GLES2_RenderData *data, const SDL_RenderCommand *cmd, co
|
|||||||
|
|
||||||
/* all drawing commands use this */
|
/* all drawing commands use this */
|
||||||
{
|
{
|
||||||
SDL_VertexSolid *verts = (SDL_VertexSolid *)(((Uint8 *)vertices) + cmd->data.draw.first);
|
uintptr_t base = (uintptr_t)vertices + cmd->data.draw.first; // address of first vertex, or base offset when using VBOs.
|
||||||
data->glVertexAttribPointer(GLES2_ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, stride, (const GLvoid *)&verts->position);
|
data->glVertexAttribPointer(GLES2_ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, stride, (const GLvoid *)(base + offsetof(SDL_VertexSolid, position)));
|
||||||
data->glVertexAttribPointer(GLES2_ATTRIBUTE_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE /* Normalized */, stride, (const GLvoid *)&verts->color);
|
data->glVertexAttribPointer(GLES2_ATTRIBUTE_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE /* Normalized */, stride, (const GLvoid *)(base + offsetof(SDL_VertexSolid, color)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1200,7 +1200,8 @@ static int GLES2_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd,
|
|||||||
if (data->current_vertex_buffer >= SDL_arraysize(data->vertex_buffers)) {
|
if (data->current_vertex_buffer >= SDL_arraysize(data->vertex_buffers)) {
|
||||||
data->current_vertex_buffer = 0;
|
data->current_vertex_buffer = 0;
|
||||||
}
|
}
|
||||||
vertices = NULL; /* attrib pointers will be offsets into the VBO. */
|
// attrib pointers will be offsets into the VBO.
|
||||||
|
vertices = (void *)(uintptr_t)0; // must be the exact value 0, not NULL (the representation of NULL is not guaranteed to be 0).
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (cmd) {
|
while (cmd) {
|
||||||
@@ -2220,8 +2221,8 @@ SDL_RenderDriver GLES2_RenderDriver = {
|
|||||||
{ "opengles2",
|
{ "opengles2",
|
||||||
(SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),
|
(SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),
|
||||||
4,
|
4,
|
||||||
{ SDL_PIXELFORMAT_BGRA32,
|
{ SDL_PIXELFORMAT_RGBA32,
|
||||||
SDL_PIXELFORMAT_ABGR32,
|
SDL_PIXELFORMAT_BGRA32,
|
||||||
SDL_PIXELFORMAT_BGRX32,
|
SDL_PIXELFORMAT_BGRX32,
|
||||||
SDL_PIXELFORMAT_RGBX32 },
|
SDL_PIXELFORMAT_RGBX32 },
|
||||||
0,
|
0,
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ typedef struct
|
|||||||
static int vsync_sema_id = 0;
|
static int vsync_sema_id = 0;
|
||||||
|
|
||||||
/* PRIVATE METHODS */
|
/* PRIVATE METHODS */
|
||||||
static int vsync_handler(void)
|
static int vsync_handler(int reason)
|
||||||
{
|
{
|
||||||
iSignalSema(vsync_sema_id);
|
iSignalSema(vsync_sema_id);
|
||||||
|
|
||||||
@@ -624,8 +624,42 @@ static int PS2_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, Uint32
|
|||||||
|
|
||||||
gsGlobal = gsKit_init_global_custom(RENDER_QUEUE_OS_POOLSIZE, RENDER_QUEUE_PER_POOLSIZE);
|
gsGlobal = gsKit_init_global_custom(RENDER_QUEUE_OS_POOLSIZE, RENDER_QUEUE_PER_POOLSIZE);
|
||||||
|
|
||||||
gsGlobal->Mode = GS_MODE_NTSC;
|
// GS interlaced/progressive
|
||||||
gsGlobal->Height = 448;
|
if (SDL_GetHintBoolean(SDL_HINT_PS2_GS_PROGRESSIVE, false)) {
|
||||||
|
gsGlobal->Interlace = GS_NONINTERLACED;
|
||||||
|
} else {
|
||||||
|
gsGlobal->Interlace = GS_INTERLACED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// GS width/height
|
||||||
|
gsGlobal->Width = 0;
|
||||||
|
gsGlobal->Height = 0;
|
||||||
|
const char *hint = SDL_GetHint(SDL_HINT_PS2_GS_WIDTH);
|
||||||
|
if (hint) {
|
||||||
|
gsGlobal->Width = SDL_atoi(hint);
|
||||||
|
}
|
||||||
|
hint = SDL_GetHint(SDL_HINT_PS2_GS_HEIGHT);
|
||||||
|
if (hint) {
|
||||||
|
gsGlobal->Height = SDL_atoi(hint);
|
||||||
|
}
|
||||||
|
if (gsGlobal->Width <= 0) {
|
||||||
|
gsGlobal->Width = 640;
|
||||||
|
}
|
||||||
|
if (gsGlobal->Height <= 0) {
|
||||||
|
gsGlobal->Height = 448;
|
||||||
|
}
|
||||||
|
|
||||||
|
// GS region
|
||||||
|
hint = SDL_GetHint(SDL_HINT_PS2_GS_MODE);
|
||||||
|
if (hint) {
|
||||||
|
if (SDL_strcasecmp(SDL_GetHint(SDL_HINT_PS2_GS_MODE), "NTSC") == 0) {
|
||||||
|
gsGlobal->Mode = GS_MODE_NTSC;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SDL_strcasecmp(SDL_GetHint(SDL_HINT_PS2_GS_MODE), "PAL") == 0) {
|
||||||
|
gsGlobal->Mode = GS_MODE_PAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gsGlobal->PSM = GS_PSM_CT24;
|
gsGlobal->PSM = GS_PSM_CT24;
|
||||||
gsGlobal->PSMZ = GS_PSMZ_16S;
|
gsGlobal->PSMZ = GS_PSMZ_16S;
|
||||||
|
|||||||
+178
-16
@@ -76,6 +76,24 @@ typedef struct
|
|||||||
SDL_Texture *texture;
|
SDL_Texture *texture;
|
||||||
} PSP_BlendState;
|
} PSP_BlendState;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
SDL_Rect viewport;
|
||||||
|
SDL_bool viewport_dirty;
|
||||||
|
SDL_bool viewport_is_set;
|
||||||
|
|
||||||
|
SDL_bool cliprect_enabled_dirty;
|
||||||
|
SDL_bool cliprect_enabled;
|
||||||
|
SDL_bool cliprect_dirty;
|
||||||
|
SDL_Rect cliprect;
|
||||||
|
|
||||||
|
float draw_offset_x;
|
||||||
|
float draw_offset_y;
|
||||||
|
|
||||||
|
int drawablew;
|
||||||
|
int drawableh;
|
||||||
|
} PSP_DrawstateCache;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
void *frontbuffer; /**< main screen buffer */
|
void *frontbuffer; /**< main screen buffer */
|
||||||
@@ -91,6 +109,7 @@ typedef struct
|
|||||||
PSP_TextureData *most_recent_target; /**< start of render target LRU double linked list */
|
PSP_TextureData *most_recent_target; /**< start of render target LRU double linked list */
|
||||||
PSP_TextureData *least_recent_target; /**< end of the LRU list */
|
PSP_TextureData *least_recent_target; /**< end of the LRU list */
|
||||||
|
|
||||||
|
PSP_DrawstateCache drawstate;
|
||||||
SDL_bool vblank_not_reached; /**< whether vblank wasn't reached */
|
SDL_bool vblank_not_reached; /**< whether vblank wasn't reached */
|
||||||
} PSP_RenderData;
|
} PSP_RenderData;
|
||||||
|
|
||||||
@@ -1034,10 +1053,105 @@ static void PSP_SetBlendState(PSP_RenderData *data, PSP_BlendState *state)
|
|||||||
*current = *state;
|
*current = *state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ClampCliprectToViewport(SDL_Rect *clip, const SDL_Rect *viewport)
|
||||||
|
{
|
||||||
|
int max_x_v, max_y_v, max_x_c, max_y_c;
|
||||||
|
|
||||||
|
if (clip->x < 0) {
|
||||||
|
clip->w += clip->x;
|
||||||
|
clip->x = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (clip->y < 0) {
|
||||||
|
clip->h += clip->y;
|
||||||
|
clip->y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
max_x_c = clip->x + clip->w;
|
||||||
|
max_y_c = clip->y + clip->h;
|
||||||
|
|
||||||
|
max_x_v = viewport->x + viewport->w;
|
||||||
|
max_y_v = viewport->y + viewport->h;
|
||||||
|
|
||||||
|
if (max_x_c > max_x_v) {
|
||||||
|
clip->w -= (max_x_v - max_x_c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max_y_c > max_y_v) {
|
||||||
|
clip->h -= (max_y_v - max_y_c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetDrawState(PSP_RenderData *data)
|
||||||
|
{
|
||||||
|
if (data->drawstate.viewport_dirty) {
|
||||||
|
SDL_Rect *viewport = &data->drawstate.viewport;
|
||||||
|
/* FIXME: Find a genuine way to make viewport work (right now calling these functions here give no effect) */
|
||||||
|
/*
|
||||||
|
sceGuOffset(2048 - (480 >> 1) + viewport->x, 2048 - (272 >> 1) + viewport->y);
|
||||||
|
sceGuViewport(2048, 2048, viewport->w, viewport->h);
|
||||||
|
*/
|
||||||
|
data->drawstate.draw_offset_x = viewport->x;
|
||||||
|
data->drawstate.draw_offset_y = viewport->y;
|
||||||
|
data->drawstate.viewport_dirty = SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data->drawstate.cliprect_enabled_dirty) {
|
||||||
|
if (!data->drawstate.cliprect_enabled && !data->drawstate.viewport_is_set) {
|
||||||
|
sceGuScissor(0, 0, data->drawstate.drawablew, data->drawstate.drawableh);
|
||||||
|
sceGuEnable(GU_SCISSOR_TEST);
|
||||||
|
}
|
||||||
|
data->drawstate.cliprect_enabled_dirty = SDL_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((data->drawstate.cliprect_enabled || data->drawstate.viewport_is_set) && data->drawstate.cliprect_dirty) {
|
||||||
|
SDL_Rect rect;
|
||||||
|
SDL_Rect *viewport = &data->drawstate.viewport;
|
||||||
|
SDL_copyp(&rect, &data->drawstate.cliprect);
|
||||||
|
if (data->drawstate.viewport_is_set) {
|
||||||
|
ClampCliprectToViewport(&rect, viewport);
|
||||||
|
rect.x += viewport->x;
|
||||||
|
rect.y += viewport->y;
|
||||||
|
}
|
||||||
|
sceGuEnable(GU_SCISSOR_TEST);
|
||||||
|
sceGuScissor(rect.x, rect.y, rect.w, rect.h);
|
||||||
|
data->drawstate.cliprect_dirty = SDL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PSP_VERTICES_FUNK(FunkName, Type) \
|
||||||
|
static const Type *FunkName(const PSP_DrawstateCache *drawstate, Uint8 *gpumem, SDL_RenderCommand *cmd, size_t count) \
|
||||||
|
{ \
|
||||||
|
size_t i; \
|
||||||
|
float off_x, off_y; \
|
||||||
|
Type *verts = (Type *)(gpumem + cmd->data.draw.first); \
|
||||||
|
\
|
||||||
|
if (!drawstate->viewport_is_set) { \
|
||||||
|
return verts; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
off_x = drawstate->draw_offset_x; \
|
||||||
|
off_y = drawstate->draw_offset_y; \
|
||||||
|
\
|
||||||
|
for (i = 0; i < count; ++i) { \
|
||||||
|
verts[i].x += off_x; \
|
||||||
|
verts[i].y += off_y; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
return verts;\
|
||||||
|
}
|
||||||
|
|
||||||
|
PSP_VERTICES_FUNK(PSP_GetVertV, VertV)
|
||||||
|
PSP_VERTICES_FUNK(PSP_GetVertTV, VertTV)
|
||||||
|
PSP_VERTICES_FUNK(PSP_GetVertCV, VertCV)
|
||||||
|
PSP_VERTICES_FUNK(PSP_GetVertTCV, VertTCV)
|
||||||
|
|
||||||
static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
|
static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
|
||||||
{
|
{
|
||||||
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
|
PSP_RenderData *data = (PSP_RenderData *)renderer->driverdata;
|
||||||
Uint8 *gpumem = NULL;
|
Uint8 *gpumem = NULL;
|
||||||
|
int w = 0, h = 0;
|
||||||
|
|
||||||
StartDrawing(renderer);
|
StartDrawing(renderer);
|
||||||
|
|
||||||
/* note that before the renderer interface change, this would do extrememly small
|
/* note that before the renderer interface change, this would do extrememly small
|
||||||
@@ -1052,6 +1166,21 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
}
|
}
|
||||||
SDL_memcpy(gpumem, vertices, vertsize);
|
SDL_memcpy(gpumem, vertices, vertsize);
|
||||||
|
|
||||||
|
if (!data->boundTarget) {
|
||||||
|
SDL_GL_GetDrawableSize(renderer->window, &w, &h);
|
||||||
|
} else {
|
||||||
|
PSP_TextureData *psp_texture = (PSP_TextureData *)data->boundTarget->driverdata;
|
||||||
|
w = psp_texture->width;
|
||||||
|
h = psp_texture->height;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) {
|
||||||
|
data->drawstate.viewport_dirty = SDL_TRUE; /* if the window dimensions changed, invalidate the current viewport, etc. */
|
||||||
|
data->drawstate.cliprect_dirty = SDL_TRUE;
|
||||||
|
data->drawstate.drawablew = w;
|
||||||
|
data->drawstate.drawableh = h;
|
||||||
|
}
|
||||||
|
|
||||||
while (cmd) {
|
while (cmd) {
|
||||||
switch (cmd->command) {
|
switch (cmd->command) {
|
||||||
case SDL_RENDERCMD_SETDRAWCOLOR:
|
case SDL_RENDERCMD_SETDRAWCOLOR:
|
||||||
@@ -1061,22 +1190,42 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
|
|
||||||
case SDL_RENDERCMD_SETVIEWPORT:
|
case SDL_RENDERCMD_SETVIEWPORT:
|
||||||
{
|
{
|
||||||
SDL_Rect *viewport = &cmd->data.viewport.rect;
|
SDL_Rect *viewport = &data->drawstate.viewport;
|
||||||
sceGuOffset(2048 - (viewport->w >> 1), 2048 - (viewport->h >> 1));
|
if (SDL_memcmp(viewport, &cmd->data.viewport.rect, sizeof(cmd->data.viewport.rect)) != 0) {
|
||||||
sceGuViewport(2048, 2048, viewport->w, viewport->h);
|
SDL_copyp(viewport, &cmd->data.viewport.rect);
|
||||||
sceGuScissor(viewport->x, viewport->y, viewport->w, viewport->h);
|
data->drawstate.viewport_dirty = SDL_TRUE;
|
||||||
/* FIXME: We need to update the clip rect too, see https://github.com/libsdl-org/SDL/issues/9094 */
|
data->drawstate.cliprect_dirty = SDL_TRUE;
|
||||||
|
data->drawstate.viewport_is_set = viewport->x != 0 || viewport->y != 0 || viewport->w != data->drawstate.drawablew || viewport->h != data->drawstate.drawableh;
|
||||||
|
if (!data->drawstate.cliprect_enabled) {
|
||||||
|
if (data->drawstate.viewport_is_set) {
|
||||||
|
SDL_copyp(&data->drawstate.cliprect, viewport);
|
||||||
|
data->drawstate.cliprect.x = 0;
|
||||||
|
data->drawstate.cliprect.y = 0;
|
||||||
|
} else {
|
||||||
|
data->drawstate.cliprect_enabled_dirty = SDL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case SDL_RENDERCMD_SETCLIPRECT:
|
case SDL_RENDERCMD_SETCLIPRECT:
|
||||||
{
|
{
|
||||||
const SDL_Rect *rect = &cmd->data.cliprect.rect;
|
const SDL_Rect *rect = &cmd->data.cliprect.rect;
|
||||||
if (cmd->data.cliprect.enabled) {
|
const SDL_Rect *viewport = &data->drawstate.viewport;
|
||||||
sceGuEnable(GU_SCISSOR_TEST);
|
if (data->drawstate.cliprect_enabled != cmd->data.cliprect.enabled) {
|
||||||
sceGuScissor(rect->x, rect->y, rect->w, rect->h);
|
data->drawstate.cliprect_enabled = cmd->data.cliprect.enabled;
|
||||||
} else {
|
data->drawstate.cliprect_enabled_dirty = SDL_TRUE;
|
||||||
sceGuDisable(GU_SCISSOR_TEST);
|
if (!data->drawstate.cliprect_enabled && data->drawstate.viewport_is_set) {
|
||||||
|
SDL_copyp(&data->drawstate.cliprect, viewport);
|
||||||
|
data->drawstate.cliprect.x = 0;
|
||||||
|
data->drawstate.cliprect.y = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SDL_memcmp(&data->drawstate.cliprect, rect, sizeof(*rect)) != 0) {
|
||||||
|
SDL_copyp(&data->drawstate.cliprect, rect);
|
||||||
|
data->drawstate.cliprect_dirty = SDL_TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1087,6 +1236,7 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
const Uint8 g = cmd->data.color.g;
|
const Uint8 g = cmd->data.color.g;
|
||||||
const Uint8 b = cmd->data.color.b;
|
const Uint8 b = cmd->data.color.b;
|
||||||
const Uint8 a = cmd->data.color.a;
|
const Uint8 a = cmd->data.color.a;
|
||||||
|
SetDrawState(data);
|
||||||
sceGuClearColor(GU_RGBA(r, g, b, a));
|
sceGuClearColor(GU_RGBA(r, g, b, a));
|
||||||
sceGuClearStencil(a);
|
sceGuClearStencil(a);
|
||||||
sceGuClear(GU_COLOR_BUFFER_BIT | GU_STENCIL_BUFFER_BIT);
|
sceGuClear(GU_COLOR_BUFFER_BIT | GU_STENCIL_BUFFER_BIT);
|
||||||
@@ -1096,7 +1246,7 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
case SDL_RENDERCMD_DRAW_POINTS:
|
case SDL_RENDERCMD_DRAW_POINTS:
|
||||||
{
|
{
|
||||||
const size_t count = cmd->data.draw.count;
|
const size_t count = cmd->data.draw.count;
|
||||||
const VertV *verts = (VertV *)(gpumem + cmd->data.draw.first);
|
const VertV *verts; /* = (VertV *)(gpumem + cmd->data.draw.first);*/
|
||||||
const Uint8 r = cmd->data.draw.r;
|
const Uint8 r = cmd->data.draw.r;
|
||||||
const Uint8 g = cmd->data.draw.g;
|
const Uint8 g = cmd->data.draw.g;
|
||||||
const Uint8 b = cmd->data.draw.b;
|
const Uint8 b = cmd->data.draw.b;
|
||||||
@@ -1107,6 +1257,8 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
.mode = cmd->data.draw.blend,
|
.mode = cmd->data.draw.blend,
|
||||||
.shadeModel = GU_FLAT
|
.shadeModel = GU_FLAT
|
||||||
};
|
};
|
||||||
|
SetDrawState(data);
|
||||||
|
verts = PSP_GetVertV(&data->drawstate, gpumem, cmd, count);
|
||||||
PSP_SetBlendState(data, &state);
|
PSP_SetBlendState(data, &state);
|
||||||
sceGuDrawArray(GU_POINTS, GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
|
sceGuDrawArray(GU_POINTS, GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
|
||||||
break;
|
break;
|
||||||
@@ -1115,7 +1267,7 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
case SDL_RENDERCMD_DRAW_LINES:
|
case SDL_RENDERCMD_DRAW_LINES:
|
||||||
{
|
{
|
||||||
const size_t count = cmd->data.draw.count;
|
const size_t count = cmd->data.draw.count;
|
||||||
const VertV *verts = (VertV *)(gpumem + cmd->data.draw.first);
|
const VertV *verts; /* = (VertV *)(gpumem + cmd->data.draw.first);*/
|
||||||
const Uint8 r = cmd->data.draw.r;
|
const Uint8 r = cmd->data.draw.r;
|
||||||
const Uint8 g = cmd->data.draw.g;
|
const Uint8 g = cmd->data.draw.g;
|
||||||
const Uint8 b = cmd->data.draw.b;
|
const Uint8 b = cmd->data.draw.b;
|
||||||
@@ -1126,6 +1278,8 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
.mode = cmd->data.draw.blend,
|
.mode = cmd->data.draw.blend,
|
||||||
.shadeModel = GU_FLAT
|
.shadeModel = GU_FLAT
|
||||||
};
|
};
|
||||||
|
SetDrawState(data);
|
||||||
|
verts = PSP_GetVertV(&data->drawstate, gpumem, cmd, count);
|
||||||
PSP_SetBlendState(data, &state);
|
PSP_SetBlendState(data, &state);
|
||||||
sceGuDrawArray(GU_LINE_STRIP, GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
|
sceGuDrawArray(GU_LINE_STRIP, GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
|
||||||
break;
|
break;
|
||||||
@@ -1134,7 +1288,7 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
case SDL_RENDERCMD_FILL_RECTS:
|
case SDL_RENDERCMD_FILL_RECTS:
|
||||||
{
|
{
|
||||||
const size_t count = cmd->data.draw.count;
|
const size_t count = cmd->data.draw.count;
|
||||||
const VertV *verts = (VertV *)(gpumem + cmd->data.draw.first);
|
const VertV *verts; /* = (VertV *)(gpumem + cmd->data.draw.first);*/
|
||||||
const Uint8 r = cmd->data.draw.r;
|
const Uint8 r = cmd->data.draw.r;
|
||||||
const Uint8 g = cmd->data.draw.g;
|
const Uint8 g = cmd->data.draw.g;
|
||||||
const Uint8 b = cmd->data.draw.b;
|
const Uint8 b = cmd->data.draw.b;
|
||||||
@@ -1145,6 +1299,8 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
.mode = cmd->data.draw.blend,
|
.mode = cmd->data.draw.blend,
|
||||||
.shadeModel = GU_FLAT
|
.shadeModel = GU_FLAT
|
||||||
};
|
};
|
||||||
|
SetDrawState(data);
|
||||||
|
verts = PSP_GetVertV(&data->drawstate, gpumem, cmd, 2 * count);
|
||||||
PSP_SetBlendState(data, &state);
|
PSP_SetBlendState(data, &state);
|
||||||
sceGuDrawArray(GU_SPRITES, GU_VERTEX_32BITF | GU_TRANSFORM_2D, 2 * count, 0, verts);
|
sceGuDrawArray(GU_SPRITES, GU_VERTEX_32BITF | GU_TRANSFORM_2D, 2 * count, 0, verts);
|
||||||
break;
|
break;
|
||||||
@@ -1153,7 +1309,7 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
case SDL_RENDERCMD_COPY:
|
case SDL_RENDERCMD_COPY:
|
||||||
{
|
{
|
||||||
const size_t count = cmd->data.draw.count;
|
const size_t count = cmd->data.draw.count;
|
||||||
const VertTV *verts = (VertTV *)(gpumem + cmd->data.draw.first);
|
const VertTV *verts; /*= (VertTV *)(gpumem + cmd->data.draw.first);*/
|
||||||
const Uint8 a = cmd->data.draw.a;
|
const Uint8 a = cmd->data.draw.a;
|
||||||
const Uint8 r = cmd->data.draw.r;
|
const Uint8 r = cmd->data.draw.r;
|
||||||
const Uint8 g = cmd->data.draw.g;
|
const Uint8 g = cmd->data.draw.g;
|
||||||
@@ -1164,6 +1320,8 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
.mode = cmd->data.draw.blend,
|
.mode = cmd->data.draw.blend,
|
||||||
.shadeModel = GU_SMOOTH
|
.shadeModel = GU_SMOOTH
|
||||||
};
|
};
|
||||||
|
SetDrawState(data);
|
||||||
|
verts = PSP_GetVertTV(&data->drawstate, gpumem, cmd, 2 * count);
|
||||||
PSP_SetBlendState(data, &state);
|
PSP_SetBlendState(data, &state);
|
||||||
sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF | GU_VERTEX_32BITF | GU_TRANSFORM_2D, 2 * count, 0, verts);
|
sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF | GU_VERTEX_32BITF | GU_TRANSFORM_2D, 2 * count, 0, verts);
|
||||||
break;
|
break;
|
||||||
@@ -1182,6 +1340,8 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
.mode = cmd->data.draw.blend,
|
.mode = cmd->data.draw.blend,
|
||||||
.shadeModel = GU_SMOOTH
|
.shadeModel = GU_SMOOTH
|
||||||
};
|
};
|
||||||
|
SetDrawState(data);
|
||||||
|
verts = PSP_GetVertTV(&data->drawstate, gpumem, cmd, 4);
|
||||||
PSP_SetBlendState(data, &state);
|
PSP_SetBlendState(data, &state);
|
||||||
sceGuDrawArray(GU_TRIANGLE_FAN, GU_TEXTURE_32BITF | GU_VERTEX_32BITF | GU_TRANSFORM_2D, 4, 0, verts);
|
sceGuDrawArray(GU_TRIANGLE_FAN, GU_TEXTURE_32BITF | GU_VERTEX_32BITF | GU_TRANSFORM_2D, 4, 0, verts);
|
||||||
break;
|
break;
|
||||||
@@ -1190,14 +1350,15 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
case SDL_RENDERCMD_GEOMETRY:
|
case SDL_RENDERCMD_GEOMETRY:
|
||||||
{
|
{
|
||||||
const size_t count = cmd->data.draw.count;
|
const size_t count = cmd->data.draw.count;
|
||||||
|
SetDrawState(data);
|
||||||
if (!cmd->data.draw.texture) {
|
if (!cmd->data.draw.texture) {
|
||||||
const VertCV *verts = (VertCV *)(gpumem + cmd->data.draw.first);
|
const VertCV *verts = PSP_GetVertCV(&data->drawstate, gpumem, cmd, count);
|
||||||
sceGuDisable(GU_TEXTURE_2D);
|
sceGuDisable(GU_TEXTURE_2D);
|
||||||
/* In GU_SMOOTH mode */
|
/* In GU_SMOOTH mode */
|
||||||
sceGuDrawArray(GU_TRIANGLES, GU_COLOR_8888 | GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
|
sceGuDrawArray(GU_TRIANGLES, GU_COLOR_8888 | GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
|
||||||
sceGuEnable(GU_TEXTURE_2D);
|
sceGuEnable(GU_TEXTURE_2D);
|
||||||
} else {
|
} else {
|
||||||
const VertTCV *verts = (VertTCV *)(gpumem + cmd->data.draw.first);
|
const VertTCV *verts; /*= (VertTCV *)(gpumem + cmd->data.draw.first);*/
|
||||||
const Uint8 a = cmd->data.draw.a;
|
const Uint8 a = cmd->data.draw.a;
|
||||||
const Uint8 r = cmd->data.draw.r;
|
const Uint8 r = cmd->data.draw.r;
|
||||||
const Uint8 g = cmd->data.draw.g;
|
const Uint8 g = cmd->data.draw.g;
|
||||||
@@ -1208,6 +1369,7 @@ static int PSP_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, v
|
|||||||
.mode = cmd->data.draw.blend,
|
.mode = cmd->data.draw.blend,
|
||||||
.shadeModel = GU_FLAT
|
.shadeModel = GU_FLAT
|
||||||
};
|
};
|
||||||
|
verts = PSP_GetVertTCV(&data->drawstate, gpumem, cmd, count);
|
||||||
TextureActivate(cmd->data.draw.texture);
|
TextureActivate(cmd->data.draw.texture);
|
||||||
PSP_SetBlendState(data, &state);
|
PSP_SetBlendState(data, &state);
|
||||||
sceGuDrawArray(GU_TRIANGLES, GU_TEXTURE_32BITF | GU_COLOR_8888 | GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
|
sceGuDrawArray(GU_TRIANGLES, GU_TEXTURE_32BITF | GU_COLOR_8888 | GU_VERTEX_32BITF | GU_TRANSFORM_2D, count, 0, verts);
|
||||||
|
|||||||
@@ -826,6 +826,35 @@ static int VITA_GXM_RenderClear(SDL_Renderer *renderer, SDL_RenderCommand *cmd)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ClampCliprectToViewport(SDL_Rect *clip, const SDL_Rect *viewport)
|
||||||
|
{
|
||||||
|
int max_x_v, max_y_v, max_x_c, max_y_c;
|
||||||
|
|
||||||
|
if (clip->x < 0) {
|
||||||
|
clip->w += clip->x;
|
||||||
|
clip->x = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (clip->y < 0) {
|
||||||
|
clip->h += clip->y;
|
||||||
|
clip->y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
max_x_c = clip->x + clip->w;
|
||||||
|
max_y_c = clip->y + clip->h;
|
||||||
|
|
||||||
|
max_x_v = viewport->x + viewport->w;
|
||||||
|
max_y_v = viewport->y + viewport->h;
|
||||||
|
|
||||||
|
if (max_x_c > max_x_v) {
|
||||||
|
clip->w -= (max_x_v - max_x_c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max_y_c > max_y_v) {
|
||||||
|
clip->h -= (max_y_v - max_y_c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd)
|
static int SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd)
|
||||||
{
|
{
|
||||||
SDL_Texture *texture = cmd->data.draw.texture;
|
SDL_Texture *texture = cmd->data.draw.texture;
|
||||||
@@ -868,9 +897,13 @@ static int SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd)
|
|||||||
data->drawstate.cliprect_enabled_dirty = SDL_FALSE;
|
data->drawstate.cliprect_enabled_dirty = SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->drawstate.cliprect_enabled && data->drawstate.cliprect_dirty) {
|
if ((data->drawstate.cliprect_enabled || data->drawstate.viewport_is_set) && data->drawstate.cliprect_dirty) {
|
||||||
const SDL_Rect *rect = &data->drawstate.cliprect;
|
SDL_Rect rect;
|
||||||
set_clip_rectangle(data, rect->x, rect->y, rect->x + rect->w, rect->y + rect->h);
|
SDL_copyp(&rect, &data->drawstate.cliprect);
|
||||||
|
if (data->drawstate.viewport_is_set) {
|
||||||
|
ClampCliprectToViewport(&rect, &data->drawstate.viewport);
|
||||||
|
}
|
||||||
|
set_clip_rectangle(data, rect.x, rect.y, rect.x + rect.w, rect.y + rect.h);
|
||||||
data->drawstate.cliprect_dirty = SDL_FALSE;
|
data->drawstate.cliprect_dirty = SDL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -925,20 +958,27 @@ static int SetDrawState(VITA_GXM_RenderData *data, const SDL_RenderCommand *cmd)
|
|||||||
static int VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
|
static int VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cmd, void *vertices, size_t vertsize)
|
||||||
{
|
{
|
||||||
VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->driverdata;
|
VITA_GXM_RenderData *data = (VITA_GXM_RenderData *)renderer->driverdata;
|
||||||
|
int w, h;
|
||||||
|
|
||||||
StartDrawing(renderer);
|
StartDrawing(renderer);
|
||||||
|
|
||||||
data->drawstate.target = renderer->target;
|
data->drawstate.target = renderer->target;
|
||||||
if (!data->drawstate.target) {
|
if (!data->drawstate.target) {
|
||||||
int w, h;
|
|
||||||
SDL_GL_GetDrawableSize(renderer->window, &w, &h);
|
SDL_GL_GetDrawableSize(renderer->window, &w, &h);
|
||||||
if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) {
|
} else {
|
||||||
data->drawstate.viewport_dirty = SDL_TRUE; // if the window dimensions changed, invalidate the current viewport, etc.
|
if (SDL_QueryTexture(renderer->target, NULL, NULL, &w, &h) < 0) {
|
||||||
data->drawstate.cliprect_dirty = SDL_TRUE;
|
w = data->drawstate.drawablew;
|
||||||
data->drawstate.drawablew = w;
|
h = data->drawstate.drawableh;
|
||||||
data->drawstate.drawableh = h;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((w != data->drawstate.drawablew) || (h != data->drawstate.drawableh)) {
|
||||||
|
data->drawstate.viewport_dirty = SDL_TRUE; // if the window dimensions changed, invalidate the current viewport, etc.
|
||||||
|
data->drawstate.cliprect_dirty = SDL_TRUE;
|
||||||
|
data->drawstate.drawablew = w;
|
||||||
|
data->drawstate.drawableh = h;
|
||||||
|
}
|
||||||
|
|
||||||
while (cmd) {
|
while (cmd) {
|
||||||
switch (cmd->command) {
|
switch (cmd->command) {
|
||||||
|
|
||||||
@@ -949,6 +989,16 @@ static int VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *c
|
|||||||
SDL_copyp(viewport, &cmd->data.viewport.rect);
|
SDL_copyp(viewport, &cmd->data.viewport.rect);
|
||||||
data->drawstate.viewport_dirty = SDL_TRUE;
|
data->drawstate.viewport_dirty = SDL_TRUE;
|
||||||
data->drawstate.cliprect_dirty = SDL_TRUE;
|
data->drawstate.cliprect_dirty = SDL_TRUE;
|
||||||
|
data->drawstate.viewport_is_set = viewport->x != 0 || viewport->y != 0 || viewport->w != data->drawstate.drawablew || viewport->h != data->drawstate.drawableh;
|
||||||
|
if (!data->drawstate.cliprect_enabled) {
|
||||||
|
if (data->drawstate.viewport_is_set) {
|
||||||
|
SDL_copyp(&data->drawstate.cliprect, viewport);
|
||||||
|
data->drawstate.cliprect.x = 0;
|
||||||
|
data->drawstate.cliprect.y = 0;
|
||||||
|
} else {
|
||||||
|
data->drawstate.cliprect_enabled_dirty = SDL_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -956,9 +1006,15 @@ static int VITA_GXM_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *c
|
|||||||
case SDL_RENDERCMD_SETCLIPRECT:
|
case SDL_RENDERCMD_SETCLIPRECT:
|
||||||
{
|
{
|
||||||
const SDL_Rect *rect = &cmd->data.cliprect.rect;
|
const SDL_Rect *rect = &cmd->data.cliprect.rect;
|
||||||
|
const SDL_Rect *viewport = &data->drawstate.viewport;
|
||||||
if (data->drawstate.cliprect_enabled != cmd->data.cliprect.enabled) {
|
if (data->drawstate.cliprect_enabled != cmd->data.cliprect.enabled) {
|
||||||
data->drawstate.cliprect_enabled = cmd->data.cliprect.enabled;
|
data->drawstate.cliprect_enabled = cmd->data.cliprect.enabled;
|
||||||
data->drawstate.cliprect_enabled_dirty = SDL_TRUE;
|
data->drawstate.cliprect_enabled_dirty = SDL_TRUE;
|
||||||
|
if (!data->drawstate.cliprect_enabled && data->drawstate.viewport_is_set) {
|
||||||
|
SDL_copyp(&data->drawstate.cliprect, viewport);
|
||||||
|
data->drawstate.cliprect.x = 0;
|
||||||
|
data->drawstate.cliprect.y = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDL_memcmp(&data->drawstate.cliprect, rect, sizeof(*rect)) != 0) {
|
if (SDL_memcmp(&data->drawstate.cliprect, rect, sizeof(*rect)) != 0) {
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ typedef struct
|
|||||||
{
|
{
|
||||||
SDL_Rect viewport;
|
SDL_Rect viewport;
|
||||||
SDL_bool viewport_dirty;
|
SDL_bool viewport_dirty;
|
||||||
|
SDL_bool viewport_is_set;
|
||||||
SDL_Texture *texture;
|
SDL_Texture *texture;
|
||||||
SDL_Texture *target;
|
SDL_Texture *target;
|
||||||
SDL_Color color;
|
SDL_Color color;
|
||||||
|
|||||||
+36
-7
@@ -81,14 +81,12 @@ static size_t SDL_ScanUnsignedLongLongInternal(const char *text, int count, int
|
|||||||
negative = *text == '-';
|
negative = *text == '-';
|
||||||
++text;
|
++text;
|
||||||
}
|
}
|
||||||
if ((radix == 0 || radix == 16) && *text == '0' && text[1] != '\0') {
|
if ((radix == 0 || radix == 16) && *text == '0' && (text[1] == 'x' || text[1] == 'X')) {
|
||||||
|
text += 2;
|
||||||
|
radix = 16;
|
||||||
|
} else if (radix == 0 && *text == '0' && (text[1] >= '0' && text[1] <= '9')) {
|
||||||
++text;
|
++text;
|
||||||
if (*text == 'x' || *text == 'X') {
|
radix = 8;
|
||||||
radix = 16;
|
|
||||||
++text;
|
|
||||||
} else if (radix == 0) {
|
|
||||||
radix = 8;
|
|
||||||
}
|
|
||||||
} else if (radix == 0) {
|
} else if (radix == 0) {
|
||||||
radix = 10;
|
radix = 10;
|
||||||
}
|
}
|
||||||
@@ -1113,6 +1111,7 @@ static SDL_bool CharacterMatchesSet(char c, const char *set, size_t set_len)
|
|||||||
/* NOLINTNEXTLINE(readability-non-const-parameter) */
|
/* NOLINTNEXTLINE(readability-non-const-parameter) */
|
||||||
int SDL_vsscanf(const char *text, const char *fmt, va_list ap)
|
int SDL_vsscanf(const char *text, const char *fmt, va_list ap)
|
||||||
{
|
{
|
||||||
|
const char *start = text;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
|
||||||
if (!text || !*text) {
|
if (!text || !*text) {
|
||||||
@@ -1383,6 +1382,36 @@ int SDL_vsscanf(const char *text, const char *fmt, va_list ap)
|
|||||||
}
|
}
|
||||||
done = SDL_TRUE;
|
done = SDL_TRUE;
|
||||||
break;
|
break;
|
||||||
|
case 'n':
|
||||||
|
switch (inttype) {
|
||||||
|
case DO_SHORT:
|
||||||
|
{
|
||||||
|
short *valuep = va_arg(ap, short *);
|
||||||
|
*valuep = (short)(text - start);
|
||||||
|
} break;
|
||||||
|
case DO_INT:
|
||||||
|
{
|
||||||
|
int *valuep = va_arg(ap, int *);
|
||||||
|
*valuep = (int)(text - start);
|
||||||
|
} break;
|
||||||
|
case DO_LONG:
|
||||||
|
{
|
||||||
|
long *valuep = va_arg(ap, long *);
|
||||||
|
*valuep = (long)(text - start);
|
||||||
|
} break;
|
||||||
|
case DO_LONGLONG:
|
||||||
|
{
|
||||||
|
long long *valuep = va_arg(ap, long long *);
|
||||||
|
*valuep = (long long)(text - start);
|
||||||
|
} break;
|
||||||
|
case DO_SIZE_T:
|
||||||
|
{
|
||||||
|
size_t *valuep = va_arg(ap, size_t *);
|
||||||
|
*valuep = (size_t)(text - start);
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
done = SDL_TRUE;
|
||||||
|
break;
|
||||||
case '[':
|
case '[':
|
||||||
{
|
{
|
||||||
const char *set = fmt + 1;
|
const char *set = fmt + 1;
|
||||||
|
|||||||
@@ -34,6 +34,8 @@
|
|||||||
#include <pspkerneltypes.h>
|
#include <pspkerneltypes.h>
|
||||||
#include <pspthreadman.h>
|
#include <pspthreadman.h>
|
||||||
|
|
||||||
|
#define PSP_THREAD_NAME_MAX 32
|
||||||
|
|
||||||
static int ThreadEntry(SceSize args, void *argp)
|
static int ThreadEntry(SceSize args, void *argp)
|
||||||
{
|
{
|
||||||
SDL_RunThread(*(SDL_Thread **)argp);
|
SDL_RunThread(*(SDL_Thread **)argp);
|
||||||
@@ -44,6 +46,7 @@ int SDL_SYS_CreateThread(SDL_Thread *thread)
|
|||||||
{
|
{
|
||||||
SceKernelThreadInfo status;
|
SceKernelThreadInfo status;
|
||||||
int priority = 32;
|
int priority = 32;
|
||||||
|
char thread_name[PSP_THREAD_NAME_MAX];
|
||||||
|
|
||||||
/* Set priority of new thread to the same as the current thread */
|
/* Set priority of new thread to the same as the current thread */
|
||||||
status.size = sizeof(SceKernelThreadInfo);
|
status.size = sizeof(SceKernelThreadInfo);
|
||||||
@@ -51,7 +54,12 @@ int SDL_SYS_CreateThread(SDL_Thread *thread)
|
|||||||
priority = status.currentPriority;
|
priority = status.currentPriority;
|
||||||
}
|
}
|
||||||
|
|
||||||
thread->handle = sceKernelCreateThread(thread->name, ThreadEntry,
|
SDL_strlcpy(thread_name, "SDL thread", PSP_THREAD_NAME_MAX);
|
||||||
|
if (thread->name) {
|
||||||
|
SDL_strlcpy(thread_name, thread->name, PSP_THREAD_NAME_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
thread->handle = sceKernelCreateThread(thread_name, ThreadEntry,
|
||||||
priority, thread->stacksize ? ((int)thread->stacksize) : 0x8000,
|
priority, thread->stacksize ? ((int)thread->stacksize) : 0x8000,
|
||||||
PSP_THREAD_ATTR_VFPU, NULL);
|
PSP_THREAD_ATTR_VFPU, NULL);
|
||||||
if (thread->handle < 0) {
|
if (thread->handle < 0) {
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ void SDL_SYS_SetupThread(const char *name)
|
|||||||
inf.dwFlags = 0;
|
inf.dwFlags = 0;
|
||||||
|
|
||||||
/* The debugger catches this, renames the thread, continues on. */
|
/* The debugger catches this, renames the thread, continues on. */
|
||||||
RaiseException(0x406D1388, 0, sizeof(inf) / sizeof(ULONG), (const ULONG_PTR *)&inf);
|
RaiseException(0x406D1388, 0, sizeof(inf) / sizeof(ULONG_PTR), (const ULONG_PTR *)&inf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+67
-2
@@ -412,6 +412,66 @@ static void BlitRGBtoRGBPixelAlphaMMX(SDL_BlitInfo *info)
|
|||||||
|
|
||||||
#endif /* __MMX__ */
|
#endif /* __MMX__ */
|
||||||
|
|
||||||
|
#if defined(__loongarch_sx)
|
||||||
|
|
||||||
|
static void
|
||||||
|
BlitRGBtoRGBPixelAlphaLSX(SDL_BlitInfo * info)
|
||||||
|
{
|
||||||
|
int width = info->dst_w;
|
||||||
|
int height = info->dst_h;
|
||||||
|
Uint32 *srcp = (Uint32 *) info->src;
|
||||||
|
int srcskip = info->src_skip >> 2;
|
||||||
|
Uint32 *dstp = (Uint32 *) info->dst;
|
||||||
|
int dstskip = info->dst_skip >> 2;
|
||||||
|
SDL_PixelFormat *sf = info->src_fmt;
|
||||||
|
Uint32 amask = sf->Amask;
|
||||||
|
Uint32 ashift = sf->Ashift;
|
||||||
|
Uint64 multmask, multmask2;
|
||||||
|
|
||||||
|
__m128i src1, src2, src3, dst1, alpha, alpha2;
|
||||||
|
multmask = 0x00FF;
|
||||||
|
multmask <<= (ashift * 2);
|
||||||
|
multmask2 = 0x00FF00FF00FF00FFULL;
|
||||||
|
|
||||||
|
while (height--) {
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
DUFFS_LOOP4({
|
||||||
|
Uint32 alpha1 = *srcp & amask;
|
||||||
|
if (alpha1 == 0) {
|
||||||
|
/* do nothing */
|
||||||
|
} else if (alpha1 == amask) {
|
||||||
|
*dstp = *srcp;
|
||||||
|
} else {
|
||||||
|
src1 = __lsx_vreplgr2vr_w(*srcp);
|
||||||
|
src1 = __lsx_vinsgr2vr_w(src1, *dstp, 1);
|
||||||
|
src2 = __lsx_vsllwil_hu_bu(src1, 0);
|
||||||
|
|
||||||
|
alpha = __lsx_vreplgr2vr_w(alpha1);
|
||||||
|
alpha = __lsx_vsrl_d(alpha, __lsx_vreplgr2vr_d(ashift));
|
||||||
|
alpha = __lsx_vilvl_h(alpha, alpha);
|
||||||
|
alpha2 = __lsx_vilvl_w(alpha, alpha);
|
||||||
|
alpha = __lsx_vor_v(alpha2, __lsx_vreplgr2vr_d(multmask));
|
||||||
|
alpha2 = __lsx_vxor_v(alpha2, __lsx_vreplgr2vr_d(multmask2));
|
||||||
|
|
||||||
|
src3 = __lsx_vilvl_d(alpha2, alpha);
|
||||||
|
src1 = __lsx_vmul_h(src2, src3);
|
||||||
|
src1 = __lsx_vsrli_h(src1, 8);
|
||||||
|
src2 = __lsx_vilvh_d(src1, src1);
|
||||||
|
src1 = __lsx_vadd_h(src1, src2);
|
||||||
|
dst1 = __lsx_vssrlni_bu_h(src1, src1, 0);
|
||||||
|
__lsx_vstelm_w(dst1, dstp, 0, 0);
|
||||||
|
}
|
||||||
|
++srcp;
|
||||||
|
++dstp;
|
||||||
|
}, width);
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
srcp += srcskip;
|
||||||
|
dstp += dstskip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __loongarch_sx */
|
||||||
|
|
||||||
#ifdef SDL_ARM_SIMD_BLITTERS
|
#ifdef SDL_ARM_SIMD_BLITTERS
|
||||||
void BlitARGBto565PixelAlphaARMSIMDAsm(int32_t w, int32_t h, uint16_t *dst, int32_t dst_stride, uint32_t *src, int32_t src_stride);
|
void BlitARGBto565PixelAlphaARMSIMDAsm(int32_t w, int32_t h, uint16_t *dst, int32_t dst_stride, uint32_t *src, int32_t src_stride);
|
||||||
|
|
||||||
@@ -1456,7 +1516,7 @@ SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface *surface)
|
|||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
if (sf->Rmask == df->Rmask && sf->Gmask == df->Gmask && sf->Bmask == df->Bmask && sf->BytesPerPixel == 4) {
|
if (sf->Rmask == df->Rmask && sf->Gmask == df->Gmask && sf->Bmask == df->Bmask && sf->BytesPerPixel == 4) {
|
||||||
#if defined(__MMX__) || defined(__3dNOW__)
|
#if defined(__MMX__) || defined(__3dNOW__) || defined(__loongarch_sx)
|
||||||
if (sf->Rshift % 8 == 0 && sf->Gshift % 8 == 0 && sf->Bshift % 8 == 0 && sf->Ashift % 8 == 0 && sf->Aloss == 0) {
|
if (sf->Rshift % 8 == 0 && sf->Gshift % 8 == 0 && sf->Bshift % 8 == 0 && sf->Ashift % 8 == 0 && sf->Aloss == 0) {
|
||||||
#ifdef __3dNOW__
|
#ifdef __3dNOW__
|
||||||
if (SDL_Has3DNow()) {
|
if (SDL_Has3DNow()) {
|
||||||
@@ -1467,9 +1527,14 @@ SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface *surface)
|
|||||||
if (SDL_HasMMX()) {
|
if (SDL_HasMMX()) {
|
||||||
return BlitRGBtoRGBPixelAlphaMMX;
|
return BlitRGBtoRGBPixelAlphaMMX;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef __loongarch_sx
|
||||||
|
if (SDL_HasLSX()) {
|
||||||
|
return BlitRGBtoRGBPixelAlphaLSX;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* __MMX__ || __3dNOW__ */
|
#endif /* __MMX__ || __3dNOW__ || __loongarch_sx*/
|
||||||
if (sf->Amask == 0xff000000) {
|
if (sf->Amask == 0xff000000) {
|
||||||
#ifdef SDL_ARM_NEON_BLITTERS
|
#ifdef SDL_ARM_NEON_BLITTERS
|
||||||
if (SDL_HasNEON()) {
|
if (SDL_HasNEON()) {
|
||||||
|
|||||||
@@ -1186,6 +1186,7 @@ EGLSurface *SDL_EGL_CreateSurface(_THIS, NativeWindowType nw)
|
|||||||
/* max 2 key+value pairs, plus terminator. */
|
/* max 2 key+value pairs, plus terminator. */
|
||||||
EGLint attribs[5];
|
EGLint attribs[5];
|
||||||
int attr = 0;
|
int attr = 0;
|
||||||
|
int opaque_ext_idx = -1;
|
||||||
|
|
||||||
EGLSurface *surface;
|
EGLSurface *surface;
|
||||||
|
|
||||||
@@ -1220,6 +1221,7 @@ EGLSurface *SDL_EGL_CreateSurface(_THIS, NativeWindowType nw)
|
|||||||
#ifdef EGL_EXT_present_opaque
|
#ifdef EGL_EXT_present_opaque
|
||||||
if (SDL_EGL_HasExtension(_this, SDL_EGL_DISPLAY_EXTENSION, "EGL_EXT_present_opaque")) {
|
if (SDL_EGL_HasExtension(_this, SDL_EGL_DISPLAY_EXTENSION, "EGL_EXT_present_opaque")) {
|
||||||
const SDL_bool allow_transparent = SDL_GetHintBoolean(SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY, SDL_FALSE);
|
const SDL_bool allow_transparent = SDL_GetHintBoolean(SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY, SDL_FALSE);
|
||||||
|
opaque_ext_idx = attr;
|
||||||
attribs[attr++] = EGL_PRESENT_OPAQUE_EXT;
|
attribs[attr++] = EGL_PRESENT_OPAQUE_EXT;
|
||||||
attribs[attr++] = allow_transparent ? EGL_FALSE : EGL_TRUE;
|
attribs[attr++] = allow_transparent ? EGL_FALSE : EGL_TRUE;
|
||||||
}
|
}
|
||||||
@@ -1231,6 +1233,16 @@ EGLSurface *SDL_EGL_CreateSurface(_THIS, NativeWindowType nw)
|
|||||||
_this->egl_data->egl_display,
|
_this->egl_data->egl_display,
|
||||||
_this->egl_data->egl_config,
|
_this->egl_data->egl_config,
|
||||||
nw, &attribs[0]);
|
nw, &attribs[0]);
|
||||||
|
if (surface == EGL_NO_SURFACE) {
|
||||||
|
/* we had a report of Nvidia drivers that report EGL_BAD_ATTRIBUTE if you try to
|
||||||
|
* use EGL_PRESENT_OPAQUE_EXT, even when EGL_EXT_present_opaque is reported as available.
|
||||||
|
* If we used it, try a second time without this attribute. */
|
||||||
|
if ((_this->egl_data->eglGetError() == EGL_BAD_ATTRIBUTE) && (opaque_ext_idx >= 0)) {
|
||||||
|
SDL_memmove(&attribs[opaque_ext_idx], &attribs[opaque_ext_idx + 2], sizeof (attribs[0]) * ((attr - opaque_ext_idx) - 2));
|
||||||
|
surface = _this->egl_data->eglCreateWindowSurface(_this->egl_data->egl_display, _this->egl_data->egl_config, nw, &attribs[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (surface == EGL_NO_SURFACE) {
|
if (surface == EGL_NO_SURFACE) {
|
||||||
SDL_EGL_SetError("unable to create an EGL window surface", "eglCreateWindowSurface");
|
SDL_EGL_SetError("unable to create an EGL window surface", "eglCreateWindowSurface");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,6 +135,61 @@ DEFINE_SSE_FILLRECT(4, Uint32)
|
|||||||
/* *INDENT-ON* */ /* clang-format on */
|
/* *INDENT-ON* */ /* clang-format on */
|
||||||
#endif /* __SSE__ */
|
#endif /* __SSE__ */
|
||||||
|
|
||||||
|
#if defined(__loongarch_sx)
|
||||||
|
|
||||||
|
#define LSX_BEGIN __m128i c128 = __lsx_vreplgr2vr_w(color);
|
||||||
|
|
||||||
|
#define LSX_WORK \
|
||||||
|
for (i = n / 64; i--;) { \
|
||||||
|
__lsx_vst(c128, p, 0); \
|
||||||
|
__lsx_vst(c128, p, 16); \
|
||||||
|
__lsx_vst(c128, p, 32); \
|
||||||
|
__lsx_vst(c128, p, 48); \
|
||||||
|
p += 64; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DEFINE_LSX_FILLRECT(bpp, type) \
|
||||||
|
static void \
|
||||||
|
SDL_FillRect##bpp##LSX(Uint8 *pixels, int pitch, Uint32 color, int w, int h) \
|
||||||
|
{ \
|
||||||
|
int i, n; \
|
||||||
|
Uint8 *p = NULL; \
|
||||||
|
\
|
||||||
|
LSX_BEGIN; \
|
||||||
|
\
|
||||||
|
while (h--) { \
|
||||||
|
n = w * bpp; \
|
||||||
|
p = pixels; \
|
||||||
|
\
|
||||||
|
if (n > 63) { \
|
||||||
|
int adjust = 16 - ((uintptr_t)p & 15); \
|
||||||
|
if (adjust < 16) { \
|
||||||
|
n -= adjust; \
|
||||||
|
adjust /= bpp; \
|
||||||
|
while (adjust--) { \
|
||||||
|
*((type *)p) = (type)color; \
|
||||||
|
p += bpp; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
LSX_WORK; \
|
||||||
|
} \
|
||||||
|
if (n & 63) { \
|
||||||
|
int remainder = (n & 63); \
|
||||||
|
remainder /= bpp; \
|
||||||
|
while (remainder--) { \
|
||||||
|
*((type *)p) = (type)color; \
|
||||||
|
p += bpp; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
pixels += pitch; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFINE_LSX_FILLRECT(4, Uint32)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static void SDL_FillRect1(Uint8 *pixels, int pitch, Uint32 color, int w, int h)
|
static void SDL_FillRect1(Uint8 *pixels, int pitch, Uint32 color, int w, int h)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
@@ -423,6 +478,13 @@ int SDL_FillRects(SDL_Surface *dst, const SDL_Rect *rects, int count,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __loongarch_sx
|
||||||
|
if (SDL_HasLSX()) {
|
||||||
|
fill_function = SDL_FillRect4LSX;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
fill_function = SDL_FillRect4;
|
fill_function = SDL_FillRect4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,6 @@ SDL_bool SDL_HASINTERSECTION(const RECTTYPE *A, const RECTTYPE *B)
|
|||||||
} else if (!B) {
|
} else if (!B) {
|
||||||
SDL_InvalidParamError("B");
|
SDL_InvalidParamError("B");
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
} else if (SDL_RECTEMPTY(A) || SDL_RECTEMPTY(B)) {
|
|
||||||
return SDL_FALSE; /* Special cases for empty rects */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Horizontal intersection */
|
/* Horizontal intersection */
|
||||||
@@ -79,10 +77,6 @@ SDL_bool SDL_INTERSECTRECT(const RECTTYPE *A, const RECTTYPE *B, RECTTYPE *resul
|
|||||||
} else if (!result) {
|
} else if (!result) {
|
||||||
SDL_InvalidParamError("result");
|
SDL_InvalidParamError("result");
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
} else if (SDL_RECTEMPTY(A) || SDL_RECTEMPTY(B)) { /* Special cases for empty rects */
|
|
||||||
result->w = 0;
|
|
||||||
result->h = 0;
|
|
||||||
return SDL_FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Horizontal intersection */
|
/* Horizontal intersection */
|
||||||
|
|||||||
@@ -355,8 +355,7 @@ struct SDL_VideoDevice
|
|||||||
SDL_bool checked_texture_framebuffer;
|
SDL_bool checked_texture_framebuffer;
|
||||||
SDL_bool is_dummy;
|
SDL_bool is_dummy;
|
||||||
SDL_bool suspend_screensaver;
|
SDL_bool suspend_screensaver;
|
||||||
SDL_Window *wakeup_window;
|
void *wakeup_window;
|
||||||
SDL_mutex *wakeup_lock; /* Initialized only if WaitEventTimeout/SendWakeupEvent are supported */
|
|
||||||
int num_displays;
|
int num_displays;
|
||||||
SDL_VideoDisplay *displays;
|
SDL_VideoDisplay *displays;
|
||||||
SDL_Window *windows;
|
SDL_Window *windows;
|
||||||
@@ -400,6 +399,7 @@ struct SDL_VideoDevice
|
|||||||
int no_error;
|
int no_error;
|
||||||
int retained_backing;
|
int retained_backing;
|
||||||
int driver_loaded;
|
int driver_loaded;
|
||||||
|
int HAS_GL_ARB_color_buffer_float;
|
||||||
char driver_path[256];
|
char driver_path[256];
|
||||||
void *dll_handle;
|
void *dll_handle;
|
||||||
} gl_config;
|
} gl_config;
|
||||||
|
|||||||
+14
-3
@@ -70,6 +70,10 @@
|
|||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef GL_RGBA_FLOAT_MODE_ARB
|
||||||
|
#define GL_RGBA_FLOAT_MODE_ARB 0x8820
|
||||||
|
#endif /* GL_RGBA_FLOAT_MODE_ARB */
|
||||||
|
|
||||||
/* Available video drivers */
|
/* Available video drivers */
|
||||||
static VideoBootStrap *bootstrap[] = {
|
static VideoBootStrap *bootstrap[] = {
|
||||||
#ifdef SDL_VIDEO_DRIVER_COCOA
|
#ifdef SDL_VIDEO_DRIVER_COCOA
|
||||||
@@ -3368,9 +3372,7 @@ void SDL_DestroyWindow(SDL_Window *window)
|
|||||||
_this->current_glwin = NULL;
|
_this->current_glwin = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_this->wakeup_window == window) {
|
SDL_AtomicCASPtr(&_this->wakeup_window, window, NULL);
|
||||||
_this->wakeup_window = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now invalidate magic */
|
/* Now invalidate magic */
|
||||||
window->magic = NULL;
|
window->magic = NULL;
|
||||||
@@ -4038,6 +4040,15 @@ int SDL_GL_GetAttribute(SDL_GLattr attr, int *value)
|
|||||||
*value = _this->gl_config.no_error;
|
*value = _this->gl_config.no_error;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
case SDL_GL_FLOATBUFFERS:
|
||||||
|
{
|
||||||
|
if (_this->gl_config.HAS_GL_ARB_color_buffer_float) {
|
||||||
|
attrib = GL_RGBA_FLOAT_MODE_ARB;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return SDL_SetError("Unknown OpenGL attribute");
|
return SDL_SetError("Unknown OpenGL attribute");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -287,9 +287,21 @@ static void Cocoa_DispatchEvent(NSEvent *theEvent)
|
|||||||
/* The menu bar of SDL apps which don't have the typical .app bundle
|
/* The menu bar of SDL apps which don't have the typical .app bundle
|
||||||
* structure fails to work the first time a window is created (until it's
|
* structure fails to work the first time a window is created (until it's
|
||||||
* de-focused and re-focused), if this call is in Cocoa_RegisterApp instead
|
* de-focused and re-focused), if this call is in Cocoa_RegisterApp instead
|
||||||
* of here. https://bugzilla.libsdl.org/show_bug.cgi?id=3051
|
* of here. https://github.com/libsdl-org/SDL/issues/1913
|
||||||
*/
|
*/
|
||||||
if (!SDL_GetHintBoolean(SDL_HINT_MAC_BACKGROUND_APP, SDL_FALSE)) {
|
|
||||||
|
/* this apparently became unnecessary on macOS 14.0, and will addition pop up a
|
||||||
|
hidden dock if you're moving the mouse during launch, so change the default
|
||||||
|
behaviour there. https://github.com/libsdl-org/SDL/issues/10340
|
||||||
|
(13.6 still needs it, presumably 13.7 does, too.) */
|
||||||
|
SDL_bool background_app_default = SDL_FALSE;
|
||||||
|
#if _SDL_HAS_BUILTIN(__builtin_available)
|
||||||
|
if (@available(macOS 14.0, *)) {
|
||||||
|
background_app_default = SDL_TRUE; /* by default, don't explicitly activate the dock and then us again to force to foreground */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!SDL_GetHintBoolean(SDL_HINT_MAC_BACKGROUND_APP, background_app_default)) {
|
||||||
/* Get more aggressive for Catalina: activate the Dock first so we definitely reset all activation state. */
|
/* Get more aggressive for Catalina: activate the Dock first so we definitely reset all activation state. */
|
||||||
for (NSRunningApplication *i in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.dock"]) {
|
for (NSRunningApplication *i in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.dock"]) {
|
||||||
[i activateWithOptions:NSApplicationActivateIgnoringOtherApps];
|
[i activateWithOptions:NSApplicationActivateIgnoringOtherApps];
|
||||||
|
|||||||
@@ -48,9 +48,6 @@ static void Cocoa_VideoQuit(_THIS);
|
|||||||
static void Cocoa_DeleteDevice(SDL_VideoDevice * device)
|
static void Cocoa_DeleteDevice(SDL_VideoDevice * device)
|
||||||
{ @autoreleasepool
|
{ @autoreleasepool
|
||||||
{
|
{
|
||||||
if (device->wakeup_lock) {
|
|
||||||
SDL_DestroyMutex(device->wakeup_lock);
|
|
||||||
}
|
|
||||||
CFBridgingRelease(device->driverdata);
|
CFBridgingRelease(device->driverdata);
|
||||||
SDL_free(device);
|
SDL_free(device);
|
||||||
}}
|
}}
|
||||||
@@ -76,7 +73,6 @@ static SDL_VideoDevice *Cocoa_CreateDevice(void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
device->driverdata = (void *)CFBridgingRetain(data);
|
device->driverdata = (void *)CFBridgingRetain(data);
|
||||||
device->wakeup_lock = SDL_CreateMutex();
|
|
||||||
|
|
||||||
/* Set the function pointers */
|
/* Set the function pointers */
|
||||||
device->VideoInit = Cocoa_VideoInit;
|
device->VideoInit = Cocoa_VideoInit;
|
||||||
|
|||||||
@@ -855,6 +855,11 @@ static NSCursor *Cocoa_GetDesiredCursor(void)
|
|||||||
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MOVED, x, y);
|
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MOVED, x, y);
|
||||||
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, w, h);
|
SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, w, h);
|
||||||
|
|
||||||
|
/* The OS can resize the window automatically if the display density
|
||||||
|
changes while the window is miniaturized or hidden */
|
||||||
|
if (![nswindow isVisible])
|
||||||
|
return;
|
||||||
|
|
||||||
/* isZoomed always returns true if the window is not resizable */
|
/* isZoomed always returns true if the window is not resizable */
|
||||||
if ((window->flags & SDL_WINDOW_RESIZABLE) && [nswindow isZoomed]) {
|
if ((window->flags & SDL_WINDOW_RESIZABLE) && [nswindow isZoomed]) {
|
||||||
zoomed = YES;
|
zoomed = YES;
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ int Emscripten_UpdateWindowFramebuffer(_THIS, SDL_Window *window, const SDL_Rect
|
|||||||
if (!Module['SDL2']) Module['SDL2'] = {};
|
if (!Module['SDL2']) Module['SDL2'] = {};
|
||||||
var SDL2 = Module['SDL2'];
|
var SDL2 = Module['SDL2'];
|
||||||
if (SDL2.ctxCanvas !== Module['canvas']) {
|
if (SDL2.ctxCanvas !== Module['canvas']) {
|
||||||
SDL2.ctx = Module['createContext'](Module['canvas'], false, true);
|
SDL2.ctx = Browser.createContext(Module['canvas'], false, true);
|
||||||
SDL2.ctxCanvas = Module['canvas'];
|
SDL2.ctxCanvas = Module['canvas'];
|
||||||
}
|
}
|
||||||
if (SDL2.w !== w || SDL2.h !== h || SDL2.imageCtx !== SDL2.ctx) {
|
if (SDL2.w !== w || SDL2.h !== h || SDL2.imageCtx !== SDL2.ctx) {
|
||||||
|
|||||||
Loaded 100 of 119 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user