Compare commits
82
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a96677bdf6 | ||
|
|
67f89d0a2b | ||
|
|
f6de8877ec | ||
|
|
7c189b1f17 | ||
|
|
a7947080c0 | ||
|
|
08c82a3781 | ||
|
|
589aea50c2 | ||
|
|
72acd7c9df | ||
|
|
1a70d1158e | ||
|
|
ae915c6516 | ||
|
|
54d573332e | ||
|
|
0204a69f6b | ||
|
|
b2689ff76a | ||
|
|
611940fb80 | ||
|
|
16c0329a2a | ||
|
|
2743716132 | ||
|
|
a744eee993 | ||
|
|
0e24267eb5 | ||
|
|
f4d6043aa4 | ||
|
|
9fb9bd31a3 | ||
|
|
c3828bb0a3 | ||
|
|
40371f0907 | ||
|
|
94f9434564 | ||
|
|
bfaf247d30 | ||
|
|
2287c43b59 | ||
|
|
15cc0f5f91 | ||
|
|
68e0108b1c | ||
|
|
7b3796bc39 | ||
|
|
b5bc6d2cc4 | ||
|
|
0d1d4ea1f9 | ||
|
|
1a48f897f2 | ||
|
|
2b42789de6 | ||
|
|
b9c1da10ba | ||
|
|
56f5a76696 | ||
|
|
c7e8977e60 | ||
|
|
e6ba3612db | ||
|
|
5e77fb314c | ||
|
|
1a2841deb1 | ||
|
|
688637eca8 | ||
|
|
85d1d70ca1 | ||
|
|
09356c709a | ||
|
|
07b9e86d02 | ||
|
|
8e46e5d8b4 | ||
|
|
96292a5b46 | ||
|
|
ffa618c00b | ||
|
|
291b9b3c82 | ||
|
|
ec45117f0f | ||
|
|
0d7aff9c56 | ||
|
|
d31b239288 | ||
|
|
b1cadf0e99 | ||
|
|
c1f67585e6 | ||
|
|
93988e28c0 | ||
|
|
edef6e66e9 | ||
|
|
e3f47809c4 | ||
|
|
f759e7ac59 | ||
|
|
544eb2c5a9 | ||
|
|
30e3eba20a | ||
|
|
f0e85a2a9c | ||
|
|
106af5b46a | ||
|
|
522716ed90 | ||
|
|
a65fbb0211 | ||
|
|
46ec859bd1 | ||
|
|
2a7aa4eae4 | ||
|
|
c31ddf021e | ||
|
|
eaa2a8239f | ||
|
|
d313ecb737 | ||
|
|
64b2af0340 | ||
|
|
58d0702948 | ||
|
|
707717e94b | ||
|
|
a140bba55a | ||
|
|
f4ddacacd0 | ||
|
|
ebba656bdb | ||
|
|
b78c61d67a | ||
|
|
4210aa61e1 | ||
|
|
d8a345d924 | ||
|
|
b8dc9767da | ||
|
|
1ab01b9367 | ||
|
|
ee371ff740 | ||
|
|
ef58dd77ca | ||
|
|
e6a7121904 | ||
|
|
a6ed8ab59d | ||
|
|
bd40d0ded1 |
No files matched your search
@@ -54,6 +54,7 @@ class SdlPlatform(Enum):
|
|||||||
Riscos = "riscos"
|
Riscos = "riscos"
|
||||||
FreeBSD = "freebsd"
|
FreeBSD = "freebsd"
|
||||||
NetBSD = "netbsd"
|
NetBSD = "netbsd"
|
||||||
|
OpenBSD = "openbsd"
|
||||||
|
|
||||||
|
|
||||||
class Msys2Platform(Enum):
|
class Msys2Platform(Enum):
|
||||||
@@ -137,6 +138,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", ),
|
"netbsd": JobSpec(name="NetBSD", os=JobOs.UbuntuLatest, platform=SdlPlatform.NetBSD, artifact="SDL-netbsd-x64", ),
|
||||||
|
"openbsd": JobSpec(name="OpenBSD", os=JobOs.UbuntuLatest, platform=SdlPlatform.OpenBSD, artifact="SDL-openbsd-x64", ),
|
||||||
"freebsd": JobSpec(name="FreeBSD", os=JobOs.UbuntuLatest, platform=SdlPlatform.FreeBSD, artifact="SDL-freebsd-x64", ),
|
"freebsd": JobSpec(name="FreeBSD", os=JobOs.UbuntuLatest, platform=SdlPlatform.FreeBSD, artifact="SDL-freebsd-x64", ),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,6 +176,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)
|
||||||
clang_tidy: bool = True
|
clang_tidy: bool = True
|
||||||
cppflags: list[str] = dataclasses.field(default_factory=list)
|
cppflags: list[str] = dataclasses.field(default_factory=list)
|
||||||
@@ -222,6 +225,7 @@ class JobDetails:
|
|||||||
check_sources: bool = False
|
check_sources: bool = False
|
||||||
setup_python: bool = False
|
setup_python: bool = False
|
||||||
pypi_packages: list[str] = dataclasses.field(default_factory=list)
|
pypi_packages: list[str] = dataclasses.field(default_factory=list)
|
||||||
|
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 = {
|
||||||
@@ -255,6 +259,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,
|
||||||
"clang-tidy": self.clang_tidy,
|
"clang-tidy": self.clang_tidy,
|
||||||
"cmake-arguments": my_shlex_join(self.cmake_arguments),
|
"cmake-arguments": my_shlex_join(self.cmake_arguments),
|
||||||
@@ -289,6 +294,7 @@ class JobDetails:
|
|||||||
"check-sources": self.check_sources,
|
"check-sources": self.check_sources,
|
||||||
"setup-python": self.setup_python,
|
"setup-python": self.setup_python,
|
||||||
"pypi-packages": my_shlex_join(self.pypi_packages),
|
"pypi-packages": my_shlex_join(self.pypi_packages),
|
||||||
|
"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 != ""}
|
||||||
|
|
||||||
@@ -550,6 +556,10 @@ def spec_to_job(spec: JobSpec, key: str, trackmem_symbol_names: bool) -> JobDeta
|
|||||||
"testmultiaudio-apk",
|
"testmultiaudio-apk",
|
||||||
"testsprite-apk",
|
"testsprite-apk",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# -fPIC is required after updating NDK from 21 to 28
|
||||||
|
job.cflags.append("-fPIC")
|
||||||
|
job.cxxflags.append("-fPIC")
|
||||||
case SdlPlatform.Emscripten:
|
case SdlPlatform.Emscripten:
|
||||||
job.clang_tidy = False # clang-tidy does not understand -gsource-map
|
job.clang_tidy = False # clang-tidy does not understand -gsource-map
|
||||||
job.shared = False
|
job.shared = False
|
||||||
@@ -675,13 +685,16 @@ 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.ccache = True
|
job.cmake_generator = "Unix Makefiles"
|
||||||
|
job.cmake_build_arguments.append("-j$(nproc)")
|
||||||
|
job.ccache = False
|
||||||
job.shared = False
|
job.shared = False
|
||||||
job.apt_packages = ["ccache", "ninja-build", "binutils"]
|
job.apt_packages = []
|
||||||
job.clang_tidy = False
|
job.clang_tidy = False
|
||||||
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.ccache = True
|
job.ccache = True
|
||||||
@@ -713,7 +726,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.cpactions = True
|
job.cpactions = True
|
||||||
job.no_cmake = True
|
job.no_cmake = True
|
||||||
job.run_tests = False
|
job.run_tests = False
|
||||||
@@ -737,6 +750,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.4"
|
||||||
|
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 xwayland libxkbcommon libinotify pulseaudio dbus ibus"
|
||||||
case _:
|
case _:
|
||||||
raise ValueError(f"Unsupported platform={spec.platform}")
|
raise ValueError(f"Unsupported platform={spec.platform}")
|
||||||
|
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ jobs:
|
|||||||
id: setup-ndk
|
id: setup-ndk
|
||||||
with:
|
with:
|
||||||
local-cache: true
|
local-cache: true
|
||||||
ndk-version: r21e
|
ndk-version: r28c
|
||||||
- name: 'Configure Android NDK variables'
|
- name: 'Configure Android NDK variables'
|
||||||
if: ${{ matrix.platform.android-ndk }}
|
if: ${{ matrix.platform.android-ndk }}
|
||||||
shell: sh
|
shell: sh
|
||||||
@@ -201,7 +201,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 }} \
|
||||||
@@ -232,9 +232,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: tests
|
id: tests
|
||||||
if: ${{ !matrix.platform.no-cmake && matrix.platform.run-tests }}
|
if: ${{ !matrix.platform.no-cmake && matrix.platform.run-tests }}
|
||||||
@@ -406,6 +406,14 @@ jobs:
|
|||||||
build-scripts/test-versioning.sh
|
build-scripts/test-versioning.sh
|
||||||
python build-scripts/check_android_jni.py
|
python build-scripts/check_android_jni.py
|
||||||
python build-scripts/check_stdlib_usage.py
|
python build-scripts/check_stdlib_usage.py
|
||||||
|
- name: 'Verify alignment of Android test apks'
|
||||||
|
if: ${{ matrix.platform.android-ndk && !matrix.platform.no-cmake }}
|
||||||
|
run: |
|
||||||
|
find ./ -iname '*.apk' | xargs -L1 ./build-scripts/check_elf_alignment.sh
|
||||||
|
- name: 'Verify alignment of Android .so files'
|
||||||
|
if: ${{ matrix.platform.android-ndk && !matrix.platform.no-cmake }}
|
||||||
|
run: |
|
||||||
|
find ./ -iname '*.so' | xargs -L1 ./build-scripts/check_elf_alignment.sh
|
||||||
- name: 'Upload binary package'
|
- name: 'Upload binary package'
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
if: ${{ always() && matrix.platform.artifact != '' && (steps.package.outcome == 'success' || steps.cpactions.outcome == 'success') && (matrix.platform.enable-artifacts || steps.tests.outcome == 'failure') }}
|
if: ${{ always() && matrix.platform.artifact != '' && (steps.package.outcome == 'success' || steps.cpactions.outcome == 'success') && (matrix.platform.enable-artifacts || steps.tests.outcome == 'failure') }}
|
||||||
@@ -428,4 +436,4 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
name: '${{ matrix.platform.artifact }}-apks'
|
name: '${{ matrix.platform.artifact }}-apks'
|
||||||
path: build/test/*.apk
|
path: build/test/*.apk
|
||||||
@@ -535,7 +535,7 @@ jobs:
|
|||||||
uses: nttld/setup-ndk@v1
|
uses: nttld/setup-ndk@v1
|
||||||
with:
|
with:
|
||||||
local-cache: true
|
local-cache: true
|
||||||
ndk-version: r21e
|
ndk-version: r28c
|
||||||
- name: 'Setup Java JDK'
|
- name: 'Setup Java JDK'
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
|
|||||||
+33
-35
@@ -5,7 +5,7 @@ if(NOT DEFINED CMAKE_BUILD_TYPE)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# See docs/release_checklist.md
|
# See docs/release_checklist.md
|
||||||
project(SDL3 LANGUAGES C VERSION "3.2.18")
|
project(SDL3 LANGUAGES C VERSION "3.2.22")
|
||||||
|
|
||||||
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
|
if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR)
|
||||||
set(SDL3_MAINPROJECT ON)
|
set(SDL3_MAINPROJECT ON)
|
||||||
@@ -183,29 +183,6 @@ if(MSVC)
|
|||||||
set(SDL_RELOCATABLE_DEFAULT ON)
|
set(SDL_RELOCATABLE_DEFAULT ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MSVC)
|
|
||||||
if(NOT SDL_LIBC)
|
|
||||||
# Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
|
|
||||||
foreach(flag_var
|
|
||||||
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
|
||||||
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
|
|
||||||
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
|
||||||
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
|
||||||
string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
|
|
||||||
endforeach(flag_var)
|
|
||||||
set(CMAKE_MSVC_RUNTIME_CHECKS "")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(MSVC_CLANG)
|
|
||||||
# clang-cl treats /W4 as '-Wall -Wextra' -- we don't need -Wextra
|
|
||||||
foreach(flag_var
|
|
||||||
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
|
||||||
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
|
|
||||||
string(REGEX REPLACE "/W4" "/W3" ${flag_var} "${${flag_var}}")
|
|
||||||
endforeach(flag_var)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(SDL_SHARED_DEFAULT ON)
|
set(SDL_SHARED_DEFAULT ON)
|
||||||
set(SDL_STATIC_DEFAULT ON)
|
set(SDL_STATIC_DEFAULT ON)
|
||||||
|
|
||||||
@@ -424,6 +401,29 @@ if(SDL_PRESEED)
|
|||||||
SDL_Preseed_CMakeCache()
|
SDL_Preseed_CMakeCache()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
if(NOT SDL_LIBC)
|
||||||
|
# Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
|
||||||
|
foreach(flag_var
|
||||||
|
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
||||||
|
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
|
||||||
|
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
|
||||||
|
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
||||||
|
string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
|
||||||
|
endforeach(flag_var)
|
||||||
|
set(CMAKE_MSVC_RUNTIME_CHECKS "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MSVC_CLANG)
|
||||||
|
# clang-cl treats /W4 as '-Wall -Wextra' -- we don't need -Wextra
|
||||||
|
foreach(flag_var
|
||||||
|
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
|
||||||
|
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
|
||||||
|
string(REGEX REPLACE "/W4" "/W3" ${flag_var} "${${flag_var}}")
|
||||||
|
endforeach(flag_var)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
if(SDL_SHARED)
|
if(SDL_SHARED)
|
||||||
add_library(SDL3-shared SHARED)
|
add_library(SDL3-shared SHARED)
|
||||||
add_library(SDL3::SDL3-shared ALIAS SDL3-shared)
|
add_library(SDL3::SDL3-shared ALIAS SDL3-shared)
|
||||||
@@ -761,19 +761,14 @@ if(SDL_ASSEMBLY)
|
|||||||
if(SDL_SSE4_2)
|
if(SDL_SSE4_2)
|
||||||
cmake_push_check_state()
|
cmake_push_check_state()
|
||||||
if(USE_GCC OR USE_CLANG OR USE_INTELCC)
|
if(USE_GCC OR USE_CLANG OR USE_INTELCC)
|
||||||
string(APPEND CMAKE_REQUIRED_FLAGS " -msse4.2 -mcrc32")
|
string(APPEND CMAKE_REQUIRED_FLAGS " -msse4.2")
|
||||||
endif()
|
endif()
|
||||||
check_c_source_compiles("
|
check_c_source_compiles("
|
||||||
#include <nmmintrin.h>
|
#include <nmmintrin.h>
|
||||||
unsigned calc_crc32c(const char *text, unsigned len) {
|
__m128i bitmask;
|
||||||
unsigned crc32c = ~0;
|
char data[16];
|
||||||
for (; len >= 4; len -= 4, text += 4) {
|
|
||||||
crc32c = (unsigned)_mm_crc32_u32(crc32c, *(unsigned*)text);
|
|
||||||
}
|
|
||||||
return crc32c;
|
|
||||||
}
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
calc_crc32c(\"SDL_SSE4\",8);
|
bitmask = _mm_cmpgt_epi64(_mm_set1_epi64x(0), _mm_loadu_si128((void*)data));
|
||||||
return 0;
|
return 0;
|
||||||
}" COMPILER_SUPPORTS_SSE4_2)
|
}" COMPILER_SUPPORTS_SSE4_2)
|
||||||
cmake_pop_check_state()
|
cmake_pop_check_state()
|
||||||
@@ -1060,8 +1055,10 @@ if(SDL_LIBC)
|
|||||||
cmake_push_check_state()
|
cmake_push_check_state()
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
string(APPEND CMAKE_REQUIRED_FLAGS " -we4244 -WX") # 'conversion' conversion from 'type1' to 'type2', possible loss of data
|
string(APPEND CMAKE_REQUIRED_FLAGS " -we4244 -WX") # 'conversion' conversion from 'type1' to 'type2', possible loss of data
|
||||||
else()
|
elseif(HAVE_GCC_WFLOAT_CONVERSION)
|
||||||
string(APPEND CMAKE_REQUIRED_FLAGS " -Wfloat-conversion -Werror")
|
string(APPEND CMAKE_REQUIRED_FLAGS " -Wfloat-conversion -Werror")
|
||||||
|
else()
|
||||||
|
string(APPEND CMAKE_REQUIRED_FLAGS " -Wconversion -Werror")
|
||||||
endif()
|
endif()
|
||||||
foreach(math_fn isinf isnan)
|
foreach(math_fn isinf isnan)
|
||||||
string(TOUPPER "${math_fn}" MATH_FN)
|
string(TOUPPER "${math_fn}" MATH_FN)
|
||||||
@@ -1099,6 +1096,7 @@ if(SDL_LIBC)
|
|||||||
check_symbol_exists(gethostname "unistd.h" HAVE_GETHOSTNAME)
|
check_symbol_exists(gethostname "unistd.h" HAVE_GETHOSTNAME)
|
||||||
check_symbol_exists(getpagesize "unistd.h" HAVE_GETPAGESIZE)
|
check_symbol_exists(getpagesize "unistd.h" HAVE_GETPAGESIZE)
|
||||||
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(gmtime_r "time.h" HAVE_GMTIME_R)
|
check_symbol_exists(gmtime_r "time.h" HAVE_GMTIME_R)
|
||||||
@@ -2960,7 +2958,7 @@ if(WINDOWS)
|
|||||||
sdl_glob_sources("${SDL3_SOURCE_DIR}/src/process/windows/*.c")
|
sdl_glob_sources("${SDL3_SOURCE_DIR}/src/process/windows/*.c")
|
||||||
set(SDL_PROCESS_WINDOWS 1)
|
set(SDL_PROCESS_WINDOWS 1)
|
||||||
set(HAVE_SDL_PROCESS TRUE)
|
set(HAVE_SDL_PROCESS TRUE)
|
||||||
else()
|
elseif(NOT ANDROID)
|
||||||
check_c_source_compiles("
|
check_c_source_compiles("
|
||||||
#include <spawn.h>
|
#include <spawn.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|||||||
@@ -19,10 +19,10 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>FMWK</string>
|
<string>FMWK</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>3.2.18</string>
|
<string>3.2.22</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>SDLX</string>
|
<string>SDLX</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>3.2.18</string>
|
<string>3.2.22</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
@@ -3086,7 +3086,7 @@
|
|||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
DEPLOYMENT_POSTPROCESSING = YES;
|
DEPLOYMENT_POSTPROCESSING = YES;
|
||||||
DYLIB_COMPATIBILITY_VERSION = 201.0.0;
|
DYLIB_COMPATIBILITY_VERSION = 201.0.0;
|
||||||
DYLIB_CURRENT_VERSION = 201.18.0;
|
DYLIB_CURRENT_VERSION = 201.22.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;
|
||||||
@@ -3121,7 +3121,7 @@
|
|||||||
"@loader_path/Frameworks",
|
"@loader_path/Frameworks",
|
||||||
);
|
);
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||||
MARKETING_VERSION = 3.2.18;
|
MARKETING_VERSION = 3.2.22;
|
||||||
OTHER_LDFLAGS = "$(CONFIG_FRAMEWORK_LDFLAGS)";
|
OTHER_LDFLAGS = "$(CONFIG_FRAMEWORK_LDFLAGS)";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL3;
|
PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL3;
|
||||||
PRODUCT_NAME = SDL3;
|
PRODUCT_NAME = SDL3;
|
||||||
@@ -3150,7 +3150,7 @@
|
|||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
DYLIB_COMPATIBILITY_VERSION = 201.0.0;
|
DYLIB_COMPATIBILITY_VERSION = 201.0.0;
|
||||||
DYLIB_CURRENT_VERSION = 201.18.0;
|
DYLIB_CURRENT_VERSION = 201.22.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;
|
||||||
@@ -3182,7 +3182,7 @@
|
|||||||
"@loader_path/Frameworks",
|
"@loader_path/Frameworks",
|
||||||
);
|
);
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
MACOSX_DEPLOYMENT_TARGET = 10.13;
|
||||||
MARKETING_VERSION = 3.2.18;
|
MARKETING_VERSION = 3.2.22;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
OTHER_LDFLAGS = "$(CONFIG_FRAMEWORK_LDFLAGS)";
|
OTHER_LDFLAGS = "$(CONFIG_FRAMEWORK_LDFLAGS)";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL3;
|
PRODUCT_BUNDLE_IDENTIFIER = org.libsdl.SDL3;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Title SDL 3.2.18
|
Title SDL 3.2.22
|
||||||
Version 1
|
Version 1
|
||||||
Description SDL Library for macOS (http://www.libsdl.org)
|
Description SDL Library for macOS (http://www.libsdl.org)
|
||||||
DefaultLocation /Library/Frameworks
|
DefaultLocation /Library/Frameworks
|
||||||
|
|||||||
@@ -7,4 +7,4 @@
|
|||||||
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
|
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
|
||||||
|
|
||||||
# Min runtime API level
|
# Min runtime API level
|
||||||
APP_PLATFORM=android-16
|
APP_PLATFORM=android-21
|
||||||
@@ -61,7 +61,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh
|
|||||||
private static final String TAG = "SDL";
|
private static final String TAG = "SDL";
|
||||||
private static final int SDL_MAJOR_VERSION = 3;
|
private static final int SDL_MAJOR_VERSION = 3;
|
||||||
private static final int SDL_MINOR_VERSION = 2;
|
private static final int SDL_MINOR_VERSION = 2;
|
||||||
private static final int SDL_MICRO_VERSION = 18;
|
private static final int SDL_MICRO_VERSION = 22;
|
||||||
/*
|
/*
|
||||||
// Display InputType.SOURCE/CLASS of events and devices
|
// Display InputType.SOURCE/CLASS of events and devices
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -542,6 +542,7 @@ class AndroidApiVersion:
|
|||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return f"<{self.name} ({'.'.join(str(v) for v in self.ints)})>"
|
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):
|
||||||
@@ -1013,6 +1014,7 @@ class Releaser:
|
|||||||
android_devel_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"
|
||||||
@@ -1023,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",
|
||||||
@@ -1530,7 +1535,7 @@ def main(argv=None) -> int:
|
|||||||
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}"
|
android_api_path = Path(args.android_home) / f"platforms/{args.android_api.name}"
|
||||||
if not android_api_path.is_dir():
|
if not android_api_path.is_dir():
|
||||||
parser.error(f"Android API directory does not exist ({android_api_path})")
|
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}")
|
||||||
|
|||||||
Executable
+127
@@ -0,0 +1,127 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
progname="${0##*/}"
|
||||||
|
progname="${progname%.sh}"
|
||||||
|
|
||||||
|
# usage: check_elf_alignment.sh [path to *.so files|path to *.apk]
|
||||||
|
|
||||||
|
cleanup_trap() {
|
||||||
|
if [ -n "${tmp}" -a -d "${tmp}" ]; then
|
||||||
|
rm -rf ${tmp}
|
||||||
|
fi
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "Host side script to check the ELF alignment of shared libraries."
|
||||||
|
echo "Shared libraries are reported ALIGNED when their ELF regions are"
|
||||||
|
echo "16 KB or 64 KB aligned. Otherwise they are reported as UNALIGNED."
|
||||||
|
echo
|
||||||
|
echo "Usage: ${progname} [input-path|input-APK|input-APEX]"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ ${#} -ne 1 ]; then
|
||||||
|
usage
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
case ${1} in
|
||||||
|
--help | -h | -\?)
|
||||||
|
usage
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
dir="${1}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if ! [ -f "${dir}" -o -d "${dir}" ]; then
|
||||||
|
echo "Invalid file: ${dir}" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${dir}" == *.apk ]]; then
|
||||||
|
trap 'cleanup_trap' EXIT
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Recursively analyzing $dir"
|
||||||
|
echo
|
||||||
|
|
||||||
|
if { zipalign --help 2>&1 | grep -q "\-P <pagesize_kb>"; }; then
|
||||||
|
echo "=== APK zip-alignment ==="
|
||||||
|
zipalign -v -c -P 16 4 "${dir}" | egrep 'lib/arm64-v8a|lib/x86_64|Verification'
|
||||||
|
echo "========================="
|
||||||
|
else
|
||||||
|
echo "NOTICE: Zip alignment check requires build-tools version 35.0.0-rc3 or higher."
|
||||||
|
echo " You can install the latest build-tools by running the below command"
|
||||||
|
echo " and updating your \$PATH:"
|
||||||
|
echo
|
||||||
|
echo " sdkmanager \"build-tools;35.0.0-rc3\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
dir_filename=$(basename "${dir}")
|
||||||
|
tmp=$(mktemp -d -t "${dir_filename%.apk}_out_XXXXX")
|
||||||
|
unzip "${dir}" lib/* -d "${tmp}" >/dev/null 2>&1
|
||||||
|
dir="${tmp}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${dir}" == *.apex ]]; then
|
||||||
|
trap 'cleanup_trap' EXIT
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Recursively analyzing $dir"
|
||||||
|
echo
|
||||||
|
|
||||||
|
dir_filename=$(basename "${dir}")
|
||||||
|
tmp=$(mktemp -d -t "${dir_filename%.apex}_out_XXXXX")
|
||||||
|
deapexer extract "${dir}" "${tmp}" || { echo "Failed to deapex." && exit 1; }
|
||||||
|
dir="${tmp}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
RED="\e[31m"
|
||||||
|
GREEN="\e[32m"
|
||||||
|
ENDCOLOR="\e[0m"
|
||||||
|
|
||||||
|
unaligned_libs=()
|
||||||
|
unaligned_critical_libs=()
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "=== ELF alignment ==="
|
||||||
|
|
||||||
|
matches="$(find "${dir}" -type f)"
|
||||||
|
IFS=$'\n'
|
||||||
|
for match in $matches; do
|
||||||
|
# We could recursively call this script or rewrite it to though.
|
||||||
|
[[ "${match}" == *".apk" ]] && echo "WARNING: doesn't recursively inspect .apk file: ${match}"
|
||||||
|
[[ "${match}" == *".apex" ]] && echo "WARNING: doesn't recursively inspect .apex file: ${match}"
|
||||||
|
|
||||||
|
[[ $(file "${match}") == *"ELF"* ]] || continue
|
||||||
|
|
||||||
|
res="$(objdump -p "${match}" | grep LOAD | awk '{ print $NF }' | head -1)"
|
||||||
|
if [[ $res =~ 2\*\*(1[4-9]|[2-9][0-9]|[1-9][0-9]{2,}) ]]; then
|
||||||
|
echo -e "${match}: ${GREEN}ALIGNED${ENDCOLOR} ($res)"
|
||||||
|
else
|
||||||
|
unaligned_libs+=("${match}")
|
||||||
|
# Check if this is a critical architecture (arm64-v8a or x86_64)
|
||||||
|
if [[ "${match}" == *"arm64-v8a"* ]] || [[ "${match}" == *"x86_64"* ]]; then
|
||||||
|
unaligned_critical_libs+=("${match}")
|
||||||
|
echo -e "${match}: ${RED}UNALIGNED${ENDCOLOR} ($res)"
|
||||||
|
else
|
||||||
|
echo -e "${match}: UNALIGNED ($res)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ${#unaligned_libs[@]} -gt 0 ]; then
|
||||||
|
echo -e "Found ${#unaligned_libs[@]} unaligned libs (only arm64-v8a/x86_64 libs need to be aligned).${ENDCOLOR}"
|
||||||
|
fi
|
||||||
|
echo "====================="
|
||||||
|
|
||||||
|
# Exit with appropriate code: 1 if critical unaligned libs found, 0 otherwise
|
||||||
|
if [ ${#unaligned_critical_libs[@]} -gt 0 ]; then
|
||||||
|
echo -e "${RED}Found ${#unaligned_critical_libs[@]} critical unaligned libs.${ENDCOLOR}"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}ELF Verification Successful${ENDCOLOR}"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
@@ -183,7 +183,7 @@
|
|||||||
],
|
],
|
||||||
"api-minimum": 21,
|
"api-minimum": 21,
|
||||||
"api-target": 35,
|
"api-target": 35,
|
||||||
"ndk-minimum": 21,
|
"ndk-minimum": 28,
|
||||||
"aar-files": {
|
"aar-files": {
|
||||||
"": [
|
"": [
|
||||||
"android-project/app/proguard-rules.pro:proguard.txt",
|
"android-project/app/proguard-rules.pro:proguard.txt",
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# libtool assumes that the compiler can handle the -fPIC flag
|
|
||||||
# This isn't always true (for example, nasm can't handle it)
|
|
||||||
command=""
|
|
||||||
while [ $# -gt 0 ]; do
|
|
||||||
case "$1" in
|
|
||||||
-?PIC)
|
|
||||||
# Ignore -fPIC and -DPIC options
|
|
||||||
;;
|
|
||||||
-fno-common)
|
|
||||||
# Ignore -fPIC and -DPIC options
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
command="$command $1"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
echo $command
|
|
||||||
exec $command
|
|
||||||
+1
-1
@@ -20,7 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main include header for the SDL library, version 3.2.18
|
* Main include header for the SDL library, version 3.2.22
|
||||||
*
|
*
|
||||||
* It is almost always best to include just this one header instead of
|
* It is almost always best to include just this one header instead of
|
||||||
* picking out individual headers included here. There are exceptions to
|
* picking out individual headers included here. There are exceptions to
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define SDL_TriggerBreakpoint() TriggerABreakpointInAPlatformSpecificManner
|
#define SDL_TriggerBreakpoint() TriggerABreakpointInAPlatformSpecificManner
|
||||||
|
|
||||||
#elif defined(_MSC_VER) && _MSC_VER >= 1310
|
#elif defined(__MINGW32__) || (defined(_MSC_VER) && _MSC_VER >= 1310)
|
||||||
/* Don't include intrin.h here because it contains C++ code */
|
/* Don't include intrin.h here because it contains C++ code */
|
||||||
extern void __cdecl __debugbreak(void);
|
extern void __cdecl __debugbreak(void);
|
||||||
#define SDL_TriggerBreakpoint() __debugbreak()
|
#define SDL_TriggerBreakpoint() __debugbreak()
|
||||||
@@ -362,7 +362,7 @@ extern SDL_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 = { false, 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. */ \
|
||||||
|
|||||||
@@ -942,7 +942,10 @@ extern SDL_DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID devid);
|
|||||||
* Binding a stream to a device will set its output format for playback
|
* Binding a stream to a device will set its output format for playback
|
||||||
* devices, and its input format for recording devices, so they match the
|
* devices, and its input format for recording devices, so they match the
|
||||||
* device's settings. The caller is welcome to change the other end of the
|
* device's settings. The caller is welcome to change the other end of the
|
||||||
* stream's format at any time with SDL_SetAudioStreamFormat().
|
* stream's format at any time with SDL_SetAudioStreamFormat(). If the other
|
||||||
|
* end of the stream's format has never been set (the audio stream was created
|
||||||
|
* with a NULL audio spec), this function will set it to match the device
|
||||||
|
* end's format.
|
||||||
*
|
*
|
||||||
* \param devid an audio device to bind a stream to.
|
* \param devid an audio device to bind a stream to.
|
||||||
* \param streams an array of audio streams to bind.
|
* \param streams an array of audio streams to bind.
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ typedef struct SDL_CameraSpec
|
|||||||
int width; /**< Frame width */
|
int width; /**< Frame width */
|
||||||
int height; /**< Frame height */
|
int height; /**< Frame height */
|
||||||
int framerate_numerator; /**< Frame rate numerator ((num / denom) == FPS, (denom / num) == duration in seconds) */
|
int framerate_numerator; /**< Frame rate numerator ((num / denom) == FPS, (denom / num) == duration in seconds) */
|
||||||
int framerate_denominator; /**< Frame rate demoninator ((num / denom) == FPS, (denom / num) == duration in seconds) */
|
int framerate_denominator; /**< Frame rate denominator ((num / denom) == FPS, (denom / num) == duration in seconds) */
|
||||||
} SDL_CameraSpec;
|
} SDL_CameraSpec;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetClipboardText(const char *text);
|
|||||||
/**
|
/**
|
||||||
* Get UTF-8 text from the clipboard.
|
* Get UTF-8 text from the clipboard.
|
||||||
*
|
*
|
||||||
* This functions returns an empty string if there was not enough memory left
|
* This function returns an empty string if there is not enough memory left
|
||||||
* for a copy of the clipboard's content.
|
* for a copy of the clipboard's content.
|
||||||
*
|
*
|
||||||
* \returns the clipboard text on success or an empty string on failure; call
|
* \returns the clipboard text on success or an empty string on failure; call
|
||||||
@@ -155,7 +155,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetPrimarySelectionText(const char *text);
|
|||||||
/**
|
/**
|
||||||
* Get UTF-8 text from the primary selection.
|
* Get UTF-8 text from the primary selection.
|
||||||
*
|
*
|
||||||
* This functions returns an empty string if there was not enough memory left
|
* This function returns an empty string if there is not enough memory left
|
||||||
* for a copy of the primary selection's content.
|
* for a copy of the primary selection's content.
|
||||||
*
|
*
|
||||||
* \returns the primary selection text on success or an empty string on
|
* \returns the primary selection text on success or an empty string on
|
||||||
@@ -194,15 +194,15 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasPrimarySelectionText(void);
|
|||||||
* clipboard is cleared or new data is set. The clipboard is automatically
|
* clipboard is cleared or new data is set. The clipboard is automatically
|
||||||
* cleared in SDL_Quit().
|
* cleared in SDL_Quit().
|
||||||
*
|
*
|
||||||
* \param userdata a pointer to provided user data.
|
* \param userdata a pointer to the provided user data.
|
||||||
* \param mime_type the requested mime-type.
|
* \param mime_type the requested mime-type.
|
||||||
* \param size a pointer filled in with the length of the returned data.
|
* \param size a pointer filled in with the length of the returned data.
|
||||||
* \returns a pointer to the data for the provided mime-type. Returning NULL
|
* \returns a pointer to the data for the provided mime-type. Returning NULL
|
||||||
* or setting length to 0 will cause no data to be sent to the
|
* or setting the length to 0 will cause no data to be sent to the
|
||||||
* "receiver". It is up to the receiver to handle this. Essentially
|
* "receiver". It is up to the receiver to handle this. Essentially
|
||||||
* returning no data is more or less undefined behavior and may cause
|
* returning no data is more or less undefined behavior and may cause
|
||||||
* breakage in receiving applications. The returned data will not be
|
* breakage in receiving applications. The returned data will not be
|
||||||
* freed so it needs to be retained and dealt with internally.
|
* freed, so it needs to be retained and dealt with internally.
|
||||||
*
|
*
|
||||||
* \since This function is available since SDL 3.2.0.
|
* \since This function is available since SDL 3.2.0.
|
||||||
*
|
*
|
||||||
@@ -211,10 +211,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasPrimarySelectionText(void);
|
|||||||
typedef const void *(SDLCALL *SDL_ClipboardDataCallback)(void *userdata, const char *mime_type, size_t *size);
|
typedef const void *(SDLCALL *SDL_ClipboardDataCallback)(void *userdata, const char *mime_type, size_t *size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback function that will be called when the clipboard is cleared, or new
|
* Callback function that will be called when the clipboard is cleared, or when new
|
||||||
* data is set.
|
* data is set.
|
||||||
*
|
*
|
||||||
* \param userdata a pointer to provided user data.
|
* \param userdata a pointer to the provided user data.
|
||||||
*
|
*
|
||||||
* \since This function is available since SDL 3.2.0.
|
* \since This function is available since SDL 3.2.0.
|
||||||
*
|
*
|
||||||
@@ -231,7 +231,7 @@ typedef void (SDLCALL *SDL_ClipboardCleanupCallback)(void *userdata);
|
|||||||
* respond with the data for the requested mime-type.
|
* respond with the data for the requested mime-type.
|
||||||
*
|
*
|
||||||
* The size of text data does not include any terminator, and the text does
|
* The size of text data does not include any terminator, and the text does
|
||||||
* not need to be null terminated (e.g. you can directly copy a portion of a
|
* not need to be null-terminated (e.g., you can directly copy a portion of a
|
||||||
* document).
|
* document).
|
||||||
*
|
*
|
||||||
* \param callback a function pointer to the function that provides the
|
* \param callback a function pointer to the function that provides the
|
||||||
@@ -239,7 +239,7 @@ typedef void (SDLCALL *SDL_ClipboardCleanupCallback)(void *userdata);
|
|||||||
* \param cleanup a function pointer to the function that cleans up the
|
* \param cleanup a function pointer to the function that cleans up the
|
||||||
* clipboard data.
|
* clipboard data.
|
||||||
* \param userdata an opaque pointer that will be forwarded to the callbacks.
|
* \param userdata an opaque pointer that will be forwarded to the callbacks.
|
||||||
* \param mime_types a list of mime-types that are being offered.
|
* \param mime_types a list of mime-types that are being offered. SDL copies the given list.
|
||||||
* \param num_mime_types the number of mime-types in the mime_types list.
|
* \param num_mime_types the number of mime-types in the mime_types list.
|
||||||
* \returns true on success or false on failure; call SDL_GetError() for more
|
* \returns true on success or false on failure; call SDL_GetError() for more
|
||||||
* information.
|
* information.
|
||||||
@@ -269,10 +269,10 @@ extern SDL_DECLSPEC bool SDLCALL SDL_SetClipboardData(SDL_ClipboardDataCallback
|
|||||||
extern SDL_DECLSPEC bool SDLCALL SDL_ClearClipboardData(void);
|
extern SDL_DECLSPEC bool SDLCALL SDL_ClearClipboardData(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the data from clipboard for a given mime type.
|
* Get the data from the clipboard for a given mime type.
|
||||||
*
|
*
|
||||||
* The size of text data does not include the terminator, but the text is
|
* The size of text data does not include the terminator, but the text is
|
||||||
* guaranteed to be null terminated.
|
* guaranteed to be null-terminated.
|
||||||
*
|
*
|
||||||
* \param mime_type the mime type to read from the clipboard.
|
* \param mime_type the mime type to read from the clipboard.
|
||||||
* \param size a pointer filled in with the length of the returned data.
|
* \param size a pointer filled in with the length of the returned data.
|
||||||
@@ -292,8 +292,8 @@ extern SDL_DECLSPEC void * SDLCALL SDL_GetClipboardData(const char *mime_type, s
|
|||||||
/**
|
/**
|
||||||
* Query whether there is data in the clipboard for the provided mime type.
|
* Query whether there is data in the clipboard for the provided mime type.
|
||||||
*
|
*
|
||||||
* \param mime_type the mime type to check for data for.
|
* \param mime_type the mime type to check for data.
|
||||||
* \returns true if there exists data in clipboard for the provided mime type,
|
* \returns true if data exists in the clipboard for the provided mime type,
|
||||||
* false if it does not.
|
* false if it does not.
|
||||||
*
|
*
|
||||||
* \threadsafety This function should only be called on the main thread.
|
* \threadsafety This function should only be called on the main thread.
|
||||||
@@ -310,7 +310,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_HasClipboardData(const char *mime_type);
|
|||||||
*
|
*
|
||||||
* \param num_mime_types a pointer filled with the number of mime types, may
|
* \param num_mime_types a pointer filled with the number of mime types, may
|
||||||
* be NULL.
|
* be NULL.
|
||||||
* \returns a null terminated array of strings with mime types, or NULL on
|
* \returns a null-terminated array of strings with mime types, or NULL on
|
||||||
* failure; call SDL_GetError() for more information. This should be
|
* failure; call SDL_GetError() for more information. This should be
|
||||||
* freed with SDL_free() when it is no longer needed.
|
* freed with SDL_free() when it is no longer needed.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ _m_prefetch(void *__P)
|
|||||||
* \sa SDL_BIG_ENDIAN
|
* \sa SDL_BIG_ENDIAN
|
||||||
*/
|
*/
|
||||||
#define SDL_BYTEORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN
|
#define SDL_BYTEORDER SDL_LIL_ENDIAN___or_maybe___SDL_BIG_ENDIAN
|
||||||
#elif defined(SDL_PLATFORM_LINUX)
|
#elif defined(SDL_PLATFORM_LINUX) || defined(__GLIBC__)
|
||||||
#include <endian.h>
|
#include <endian.h>
|
||||||
#define SDL_BYTEORDER __BYTE_ORDER
|
#define SDL_BYTEORDER __BYTE_ORDER
|
||||||
#elif defined(SDL_PLATFORM_SOLARIS)
|
#elif defined(SDL_PLATFORM_SOLARIS)
|
||||||
|
|||||||
@@ -224,8 +224,8 @@
|
|||||||
* - `drawIndirectFirstInstance`
|
* - `drawIndirectFirstInstance`
|
||||||
*
|
*
|
||||||
* **D3D12:** Supported on Windows 10 or newer, Xbox One (GDK), and Xbox
|
* **D3D12:** Supported on Windows 10 or newer, Xbox One (GDK), and Xbox
|
||||||
* Series X|S (GDK). Requires a GPU that supports DirectX 12 Feature Level
|
* Series X|S (GDK). Requires a GPU that supports DirectX 12 Feature Level 11_0 and
|
||||||
* 11_1.
|
* Resource Binding Tier 2 or above.
|
||||||
*
|
*
|
||||||
* **Metal:** Supported on macOS 10.14+ and iOS/tvOS 13.0+. Hardware
|
* **Metal:** Supported on macOS 10.14+ and iOS/tvOS 13.0+. Hardware
|
||||||
* requirements vary by operating system:
|
* requirements vary by operating system:
|
||||||
@@ -1091,7 +1091,7 @@ typedef enum SDL_GPUCompareOp
|
|||||||
SDL_GPU_COMPAREOP_LESS_OR_EQUAL, /**< The comparison evaluates reference <= test. */
|
SDL_GPU_COMPAREOP_LESS_OR_EQUAL, /**< The comparison evaluates reference <= test. */
|
||||||
SDL_GPU_COMPAREOP_GREATER, /**< The comparison evaluates reference > test. */
|
SDL_GPU_COMPAREOP_GREATER, /**< The comparison evaluates reference > test. */
|
||||||
SDL_GPU_COMPAREOP_NOT_EQUAL, /**< The comparison evaluates reference != test. */
|
SDL_GPU_COMPAREOP_NOT_EQUAL, /**< The comparison evaluates reference != test. */
|
||||||
SDL_GPU_COMPAREOP_GREATER_OR_EQUAL, /**< The comparison evalutes reference >= test. */
|
SDL_GPU_COMPAREOP_GREATER_OR_EQUAL, /**< The comparison evaluates reference >= test. */
|
||||||
SDL_GPU_COMPAREOP_ALWAYS /**< The comparison always evaluates true. */
|
SDL_GPU_COMPAREOP_ALWAYS /**< The comparison always evaluates true. */
|
||||||
} SDL_GPUCompareOp;
|
} SDL_GPUCompareOp;
|
||||||
|
|
||||||
@@ -1549,7 +1549,7 @@ typedef struct SDL_GPUSamplerCreateInfo
|
|||||||
typedef struct SDL_GPUVertexBufferDescription
|
typedef struct SDL_GPUVertexBufferDescription
|
||||||
{
|
{
|
||||||
Uint32 slot; /**< The binding slot of the vertex buffer. */
|
Uint32 slot; /**< The binding slot of the vertex buffer. */
|
||||||
Uint32 pitch; /**< The byte pitch between consecutive elements of the vertex buffer. */
|
Uint32 pitch; /**< The size of a single element + the offset between elements. */
|
||||||
SDL_GPUVertexInputRate input_rate; /**< Whether attribute addressing is a function of the vertex index or instance index. */
|
SDL_GPUVertexInputRate input_rate; /**< Whether attribute addressing is a function of the vertex index or instance index. */
|
||||||
Uint32 instance_step_rate; /**< Reserved for future use. Must be set to 0. */
|
Uint32 instance_step_rate; /**< Reserved for future use. Must be set to 0. */
|
||||||
} SDL_GPUVertexBufferDescription;
|
} SDL_GPUVertexBufferDescription;
|
||||||
@@ -2648,7 +2648,7 @@ extern SDL_DECLSPEC void SDLCALL SDL_InsertGPUDebugLabel(
|
|||||||
const char *text);
|
const char *text);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begins a debug group with an arbitary name.
|
* Begins a debug group with an arbitrary name.
|
||||||
*
|
*
|
||||||
* Used for denoting groups of calls when viewing the command buffer
|
* Used for denoting groups of calls when viewing the command buffer
|
||||||
* callstream in a graphics debugging tool.
|
* callstream in a graphics debugging tool.
|
||||||
|
|||||||
@@ -595,7 +595,7 @@ extern "C" {
|
|||||||
* A variable that limits what CPU features are available.
|
* A variable that limits what CPU features are available.
|
||||||
*
|
*
|
||||||
* By default, SDL marks all features the current CPU supports as available.
|
* By default, SDL marks all features the current CPU supports as available.
|
||||||
* This hint allows to limit these to a subset.
|
* This hint allows the enabled features to be limited to a subset.
|
||||||
*
|
*
|
||||||
* When the hint is unset, or empty, SDL will enable all detected CPU
|
* When the hint is unset, or empty, SDL will enable all detected CPU
|
||||||
* features.
|
* features.
|
||||||
|
|||||||
@@ -2612,7 +2612,7 @@ extern SDL_DECLSPEC bool SDLCALL SDL_RenderDebugText(SDL_Renderer *renderer, flo
|
|||||||
* Draw debug text to an SDL_Renderer.
|
* Draw debug text to an SDL_Renderer.
|
||||||
*
|
*
|
||||||
* This function will render a printf()-style format string to a renderer.
|
* This function will render a printf()-style format string to a renderer.
|
||||||
* Note that this is a convinence function for debugging, with severe
|
* Note that this is a convenience function for debugging, with severe
|
||||||
* limitations, and is not intended to be used for production apps and games.
|
* limitations, and is not intended to be used for production apps and games.
|
||||||
*
|
*
|
||||||
* For the full list of limitations and other useful information, see
|
* For the full list of limitations and other useful information, see
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ typedef enum SDL_Scancode
|
|||||||
|
|
||||||
SDL_SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO
|
SDL_SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO
|
||||||
* keyboards have over ANSI ones,
|
* keyboards have over ANSI ones,
|
||||||
* located between left shift and Y.
|
* located between left shift and Z.
|
||||||
* Produces GRAVE ACCENT and TILDE in a
|
* Produces GRAVE ACCENT and TILDE in a
|
||||||
* US or UK Mac layout, REVERSE SOLIDUS
|
* US or UK Mac layout, REVERSE SOLIDUS
|
||||||
* (backslash) and VERTICAL LINE in a
|
* (backslash) and VERTICAL LINE in a
|
||||||
|
|||||||
@@ -138,7 +138,8 @@ typedef enum SDL_SensorType
|
|||||||
SDL_SENSOR_ACCEL_L, /**< Accelerometer for left Joy-Con controller and Wii nunchuk */
|
SDL_SENSOR_ACCEL_L, /**< Accelerometer for left Joy-Con controller and Wii nunchuk */
|
||||||
SDL_SENSOR_GYRO_L, /**< Gyroscope for left Joy-Con controller */
|
SDL_SENSOR_GYRO_L, /**< Gyroscope for left Joy-Con controller */
|
||||||
SDL_SENSOR_ACCEL_R, /**< Accelerometer for right Joy-Con controller */
|
SDL_SENSOR_ACCEL_R, /**< Accelerometer for right Joy-Con controller */
|
||||||
SDL_SENSOR_GYRO_R /**< Gyroscope for right Joy-Con controller */
|
SDL_SENSOR_GYRO_R, /**< Gyroscope for right Joy-Con controller */
|
||||||
|
SDL_SENSOR_COUNT
|
||||||
} SDL_SensorType;
|
} SDL_SensorType;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3426,7 +3426,7 @@ extern SDL_DECLSPEC size_t SDLCALL SDL_utf8strnlen(const char *str, size_t bytes
|
|||||||
* Convert an integer into a string.
|
* Convert an integer into a string.
|
||||||
*
|
*
|
||||||
* This requires a radix to specified for string format. Specifying 10
|
* This requires a radix to specified for string format. Specifying 10
|
||||||
* produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2
|
* produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2
|
||||||
* to 36.
|
* to 36.
|
||||||
*
|
*
|
||||||
* Note that this function will overflow a buffer if `str` is not large enough
|
* Note that this function will overflow a buffer if `str` is not large enough
|
||||||
@@ -3454,7 +3454,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_itoa(int value, char *str, int radix);
|
|||||||
* Convert an unsigned integer into a string.
|
* Convert an unsigned integer into a string.
|
||||||
*
|
*
|
||||||
* This requires a radix to specified for string format. Specifying 10
|
* This requires a radix to specified for string format. Specifying 10
|
||||||
* produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2
|
* produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2
|
||||||
* to 36.
|
* to 36.
|
||||||
*
|
*
|
||||||
* Note that this function will overflow a buffer if `str` is not large enough
|
* Note that this function will overflow a buffer if `str` is not large enough
|
||||||
@@ -3482,7 +3482,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_uitoa(unsigned int value, char *str, int
|
|||||||
* Convert a long integer into a string.
|
* Convert a long integer into a string.
|
||||||
*
|
*
|
||||||
* This requires a radix to specified for string format. Specifying 10
|
* This requires a radix to specified for string format. Specifying 10
|
||||||
* produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2
|
* produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2
|
||||||
* to 36.
|
* to 36.
|
||||||
*
|
*
|
||||||
* Note that this function will overflow a buffer if `str` is not large enough
|
* Note that this function will overflow a buffer if `str` is not large enough
|
||||||
@@ -3510,7 +3510,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_ltoa(long value, char *str, int radix);
|
|||||||
* Convert an unsigned long integer into a string.
|
* Convert an unsigned long integer into a string.
|
||||||
*
|
*
|
||||||
* This requires a radix to specified for string format. Specifying 10
|
* This requires a radix to specified for string format. Specifying 10
|
||||||
* produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2
|
* produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2
|
||||||
* to 36.
|
* to 36.
|
||||||
*
|
*
|
||||||
* Note that this function will overflow a buffer if `str` is not large enough
|
* Note that this function will overflow a buffer if `str` is not large enough
|
||||||
@@ -3540,7 +3540,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *str, int
|
|||||||
* Convert a long long integer into a string.
|
* Convert a long long integer into a string.
|
||||||
*
|
*
|
||||||
* This requires a radix to specified for string format. Specifying 10
|
* This requires a radix to specified for string format. Specifying 10
|
||||||
* produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2
|
* produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2
|
||||||
* to 36.
|
* to 36.
|
||||||
*
|
*
|
||||||
* Note that this function will overflow a buffer if `str` is not large enough
|
* Note that this function will overflow a buffer if `str` is not large enough
|
||||||
@@ -3568,7 +3568,7 @@ extern SDL_DECLSPEC char * SDLCALL SDL_lltoa(long long value, char *str, int rad
|
|||||||
* Convert an unsigned long long integer into a string.
|
* Convert an unsigned long long integer into a string.
|
||||||
*
|
*
|
||||||
* This requires a radix to specified for string format. Specifying 10
|
* This requires a radix to specified for string format. Specifying 10
|
||||||
* produces a decimal number, 16 hexidecimal, etc. Must be in the range of 2
|
* produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2
|
||||||
* to 36.
|
* to 36.
|
||||||
*
|
*
|
||||||
* Note that this function will overflow a buffer if `str` is not large enough
|
* Note that this function will overflow a buffer if `str` is not large enough
|
||||||
@@ -3923,7 +3923,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str
|
|||||||
extern SDL_DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen);
|
extern SDL_DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Searches a string for the first occurence of any character contained in a
|
* Searches a string for the first occurrence of any character contained in a
|
||||||
* breakset, and returns a pointer from the string to that character.
|
* breakset, and returns a pointer from the string to that character.
|
||||||
*
|
*
|
||||||
* \param str The null-terminated string to be searched. Must not be NULL, and
|
* \param str The null-terminated string to be searched. Must not be NULL, and
|
||||||
@@ -3931,7 +3931,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *st
|
|||||||
* \param breakset A null-terminated string containing the list of characters
|
* \param breakset A null-terminated string containing the list of characters
|
||||||
* to look for. Must not be NULL, and must not overlap with
|
* to look for. Must not be NULL, and must not overlap with
|
||||||
* `str`.
|
* `str`.
|
||||||
* \returns A pointer to the location, in str, of the first occurence of a
|
* \returns A pointer to the location, in str, of the first occurrence of a
|
||||||
* character present in the breakset, or NULL if none is found.
|
* character present in the breakset, or NULL if none is found.
|
||||||
*
|
*
|
||||||
* \threadsafety It is safe to call this function from any thread.
|
* \threadsafety It is safe to call this function from any thread.
|
||||||
@@ -5821,7 +5821,7 @@ extern SDL_DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd);
|
|||||||
* This function converts text between encodings, reading from and writing to
|
* This function converts text between encodings, reading from and writing to
|
||||||
* a buffer.
|
* a buffer.
|
||||||
*
|
*
|
||||||
* It returns the number of succesful conversions on success. On error,
|
* It returns the number of successful conversions on success. On error,
|
||||||
* SDL_ICONV_E2BIG is returned when the output buffer is too small, or
|
* SDL_ICONV_E2BIG is returned when the output buffer is too small, or
|
||||||
* SDL_ICONV_EILSEQ is returned when an invalid input sequence is encountered,
|
* SDL_ICONV_EILSEQ is returned when an invalid input sequence is encountered,
|
||||||
* or SDL_ICONV_EINVAL is returned when an incomplete input sequence is
|
* or SDL_ICONV_EINVAL is returned when an incomplete input sequence is
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ extern "C" {
|
|||||||
*
|
*
|
||||||
* \since This macro is available since SDL 3.2.0.
|
* \since This macro is available since SDL 3.2.0.
|
||||||
*/
|
*/
|
||||||
#define SDL_MICRO_VERSION 18
|
#define SDL_MICRO_VERSION 22
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This macro turns the version numbers into a numeric value.
|
* This macro turns the version numbers into a numeric value.
|
||||||
|
|||||||
@@ -1473,7 +1473,7 @@ extern SDL_DECLSPEC SDL_Window * SDLCALL SDL_GetWindowParent(SDL_Window *window)
|
|||||||
* - `SDL_PROP_WINDOW_COCOA_WINDOW_POINTER`: the `(__unsafe_unretained)`
|
* - `SDL_PROP_WINDOW_COCOA_WINDOW_POINTER`: the `(__unsafe_unretained)`
|
||||||
* NSWindow associated with the window
|
* NSWindow associated with the window
|
||||||
* - `SDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER`: the NSInteger tag
|
* - `SDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER`: the NSInteger tag
|
||||||
* assocated with metal views on the window
|
* associated with metal views on the window
|
||||||
*
|
*
|
||||||
* On OpenVR:
|
* On OpenVR:
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -174,6 +174,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_ST_MTIM 1
|
#cmakedefine HAVE_ST_MTIM 1
|
||||||
#cmakedefine HAVE_SETJMP 1
|
#cmakedefine HAVE_SETJMP 1
|
||||||
|
|||||||
@@ -111,6 +111,9 @@ typedef unsigned int uintptr_t;
|
|||||||
# define SDL_DISABLE_AVX 1
|
# define SDL_DISABLE_AVX 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define HAVE_STDARG_H 1
|
||||||
|
#define HAVE_STDDEF_H 1
|
||||||
|
|
||||||
/* This can be disabled to avoid C runtime dependencies and manifest requirements */
|
/* This can be disabled to avoid C runtime dependencies and manifest requirements */
|
||||||
#ifndef HAVE_LIBC
|
#ifndef HAVE_LIBC
|
||||||
#define HAVE_LIBC 1
|
#define HAVE_LIBC 1
|
||||||
@@ -122,8 +125,6 @@ typedef unsigned int uintptr_t;
|
|||||||
#define HAVE_LIMITS_H 1
|
#define HAVE_LIMITS_H 1
|
||||||
#define HAVE_MATH_H 1
|
#define HAVE_MATH_H 1
|
||||||
#define HAVE_SIGNAL_H 1
|
#define HAVE_SIGNAL_H 1
|
||||||
#define HAVE_STDARG_H 1
|
|
||||||
#define HAVE_STDDEF_H 1
|
|
||||||
#define HAVE_STDIO_H 1
|
#define HAVE_STDIO_H 1
|
||||||
#define HAVE_STDLIB_H 1
|
#define HAVE_STDLIB_H 1
|
||||||
#define HAVE_STRING_H 1
|
#define HAVE_STRING_H 1
|
||||||
@@ -153,7 +154,6 @@ typedef unsigned int uintptr_t;
|
|||||||
#define HAVE_STRCMP 1
|
#define HAVE_STRCMP 1
|
||||||
#define HAVE_STRNCMP 1
|
#define HAVE_STRNCMP 1
|
||||||
#define HAVE_STRPBRK 1
|
#define HAVE_STRPBRK 1
|
||||||
#define HAVE_VSSCANF 1
|
|
||||||
#define HAVE_VSNPRINTF 1
|
#define HAVE_VSNPRINTF 1
|
||||||
#define HAVE_ACOS 1
|
#define HAVE_ACOS 1
|
||||||
#define HAVE_ASIN 1
|
#define HAVE_ASIN 1
|
||||||
@@ -211,10 +211,7 @@ typedef unsigned int uintptr_t;
|
|||||||
#if _MSC_VER >= 1400
|
#if _MSC_VER >= 1400
|
||||||
#define HAVE__FSEEKI64 1
|
#define HAVE__FSEEKI64 1
|
||||||
#endif
|
#endif
|
||||||
#endif /* _MSC_VER */
|
#endif /* _MSC_VER */
|
||||||
#else
|
|
||||||
#define HAVE_STDARG_H 1
|
|
||||||
#define HAVE_STDDEF_H 1
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Enable various audio drivers */
|
/* Enable various audio drivers */
|
||||||
|
|||||||
+14
-4
@@ -1153,7 +1153,10 @@ bool SDL_PlaybackAudioThreadIterate(SDL_AudioDevice *device)
|
|||||||
// We should have updated this elsewhere if the format changed!
|
// We should have updated this elsewhere if the format changed!
|
||||||
SDL_assert(SDL_AudioSpecsEqual(&stream->dst_spec, &device->spec, NULL, NULL));
|
SDL_assert(SDL_AudioSpecsEqual(&stream->dst_spec, &device->spec, NULL, NULL));
|
||||||
|
|
||||||
|
SDL_assert(stream->src_spec.format != SDL_AUDIO_UNKNOWN);
|
||||||
|
|
||||||
const int br = SDL_GetAtomicInt(&logdev->paused) ? 0 : SDL_GetAudioStreamDataAdjustGain(stream, device_buffer, buffer_size, logdev->gain);
|
const int br = SDL_GetAtomicInt(&logdev->paused) ? 0 : SDL_GetAudioStreamDataAdjustGain(stream, device_buffer, buffer_size, logdev->gain);
|
||||||
|
|
||||||
if (br < 0) { // Probably OOM. Kill the audio device; the whole thing is likely dying soon anyhow.
|
if (br < 0) { // Probably OOM. Kill the audio device; the whole thing is likely dying soon anyhow.
|
||||||
failed = true;
|
failed = true;
|
||||||
SDL_memset(device_buffer, device->silence_value, buffer_size); // just supply silence to the device before we die.
|
SDL_memset(device_buffer, device->silence_value, buffer_size); // just supply silence to the device before we die.
|
||||||
@@ -1195,6 +1198,8 @@ bool SDL_PlaybackAudioThreadIterate(SDL_AudioDevice *device)
|
|||||||
// We should have updated this elsewhere if the format changed!
|
// We should have updated this elsewhere if the format changed!
|
||||||
SDL_assert(SDL_AudioSpecsEqual(&stream->dst_spec, &outspec, NULL, NULL));
|
SDL_assert(SDL_AudioSpecsEqual(&stream->dst_spec, &outspec, NULL, NULL));
|
||||||
|
|
||||||
|
SDL_assert(stream->src_spec.format != SDL_AUDIO_UNKNOWN);
|
||||||
|
|
||||||
/* this will hold a lock on `stream` while getting. We don't explicitly lock the streams
|
/* this will hold a lock on `stream` while getting. We don't explicitly lock the streams
|
||||||
for iterating here because the binding linked list can only change while the device lock is held.
|
for iterating here because the binding linked list can only change while the device lock is held.
|
||||||
(we _do_ lock the stream during binding/unbinding to make sure that two threads can't try to bind
|
(we _do_ lock the stream during binding/unbinding to make sure that two threads can't try to bind
|
||||||
@@ -1330,6 +1335,7 @@ bool SDL_RecordingAudioThreadIterate(SDL_AudioDevice *device)
|
|||||||
SDL_assert(stream->src_spec.format == ((logdev->postmix || (logdev->gain != 1.0f)) ? SDL_AUDIO_F32 : device->spec.format));
|
SDL_assert(stream->src_spec.format == ((logdev->postmix || (logdev->gain != 1.0f)) ? SDL_AUDIO_F32 : device->spec.format));
|
||||||
SDL_assert(stream->src_spec.channels == device->spec.channels);
|
SDL_assert(stream->src_spec.channels == device->spec.channels);
|
||||||
SDL_assert(stream->src_spec.freq == device->spec.freq);
|
SDL_assert(stream->src_spec.freq == device->spec.freq);
|
||||||
|
SDL_assert(stream->dst_spec.format != SDL_AUDIO_UNKNOWN);
|
||||||
|
|
||||||
void *final_buf = output_buffer;
|
void *final_buf = output_buffer;
|
||||||
|
|
||||||
@@ -1975,10 +1981,6 @@ bool SDL_BindAudioStreams(SDL_AudioDeviceID devid, SDL_AudioStream * const *stre
|
|||||||
} else if (logdev->simplified) {
|
} else if (logdev->simplified) {
|
||||||
result = SDL_SetError("Cannot change stream bindings on device opened with SDL_OpenAudioDeviceStream");
|
result = SDL_SetError("Cannot change stream bindings on device opened with SDL_OpenAudioDeviceStream");
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// !!! FIXME: We'll set the device's side's format below, but maybe we should refuse to bind a stream if the app's side doesn't have a format set yet.
|
|
||||||
// !!! FIXME: Actually, why do we allow there to be an invalid format, again?
|
|
||||||
|
|
||||||
// make sure start of list is sane.
|
// make sure start of list is sane.
|
||||||
SDL_assert(!logdev->bound_streams || (logdev->bound_streams->prev_binding == NULL));
|
SDL_assert(!logdev->bound_streams || (logdev->bound_streams->prev_binding == NULL));
|
||||||
|
|
||||||
@@ -2013,9 +2015,17 @@ bool SDL_BindAudioStreams(SDL_AudioDeviceID devid, SDL_AudioStream * const *stre
|
|||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
// Now that everything is verified, chain everything together.
|
// Now that everything is verified, chain everything together.
|
||||||
|
const bool recording = device->recording;
|
||||||
for (int i = 0; i < num_streams; i++) {
|
for (int i = 0; i < num_streams; i++) {
|
||||||
SDL_AudioStream *stream = streams[i];
|
SDL_AudioStream *stream = streams[i];
|
||||||
if (stream) { // shouldn't be NULL, but just in case...
|
if (stream) { // shouldn't be NULL, but just in case...
|
||||||
|
// if the stream never had its non-device-end format set, just set it to the device end's format.
|
||||||
|
if (recording && (stream->dst_spec.format == SDL_AUDIO_UNKNOWN)) {
|
||||||
|
SDL_copyp(&stream->dst_spec, &device->spec);
|
||||||
|
} else if (!recording && (stream->src_spec.format == SDL_AUDIO_UNKNOWN)) {
|
||||||
|
SDL_copyp(&stream->src_spec, &device->spec);
|
||||||
|
}
|
||||||
|
|
||||||
stream->bound_device = logdev;
|
stream->bound_device = logdev;
|
||||||
stream->prev_binding = NULL;
|
stream->prev_binding = NULL;
|
||||||
stream->next_binding = logdev->bound_streams;
|
stream->next_binding = logdev->bound_streams;
|
||||||
|
|||||||
@@ -537,8 +537,10 @@ static void SDL_TARGETING("ssse3") SDL_Convert_Swap32_SSSE3(Uint32* dst, const U
|
|||||||
// behavior. However, the compiler support for this pragma is bad.
|
// behavior. However, the compiler support for this pragma is bad.
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
#if __clang_major__ >= 12
|
#if __clang_major__ >= 12
|
||||||
|
#if defined(__aarch64__)
|
||||||
#pragma STDC FENV_ACCESS ON
|
#pragma STDC FENV_ACCESS ON
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
#pragma fenv_access (on)
|
#pragma fenv_access (on)
|
||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
@@ -814,8 +816,10 @@ static void SDL_Convert_Swap32_NEON(Uint32* dst, const Uint32* src, int num_samp
|
|||||||
|
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
#if __clang_major__ >= 12
|
#if __clang_major__ >= 12
|
||||||
|
#if defined(__aarch64__)
|
||||||
#pragma STDC FENV_ACCESS DEFAULT
|
#pragma STDC FENV_ACCESS DEFAULT
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
#pragma fenv_access (off)
|
#pragma fenv_access (off)
|
||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
|
|||||||
@@ -2114,8 +2114,8 @@ bool SDL_LoadWAV_IO(SDL_IOStream *src, bool closeio, SDL_AudioSpec *spec, Uint8
|
|||||||
result = WaveLoad(src, &file, spec, audio_buf, audio_len);
|
result = WaveLoad(src, &file, spec, audio_buf, audio_len);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
SDL_free(*audio_buf);
|
SDL_free(*audio_buf);
|
||||||
audio_buf = NULL;
|
*audio_buf = NULL;
|
||||||
audio_len = 0;
|
*audio_len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
|
|||||||
@@ -420,7 +420,8 @@ static bool UpdateAudioSession(SDL_AudioDevice *device, bool open, bool allow_pl
|
|||||||
|
|
||||||
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;
|
||||||
|
|||||||
@@ -426,28 +426,33 @@ static void OPENSLES_DestroyPCMPlayer(SDL_AudioDevice *device)
|
|||||||
|
|
||||||
static bool OPENSLES_CreatePCMPlayer(SDL_AudioDevice *device)
|
static bool OPENSLES_CreatePCMPlayer(SDL_AudioDevice *device)
|
||||||
{
|
{
|
||||||
/* 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) {
|
||||||
const SDL_AudioFormat *closefmts = SDL_ClosestAudioFormats(device->spec.format);
|
const SDL_AudioFormat *closefmts = SDL_ClosestAudioFormats(device->spec.format);
|
||||||
SDL_AudioFormat test_format;
|
SDL_AudioFormat test_format;
|
||||||
while ((test_format = *(closefmts++)) != 0) {
|
while ((test_format = *(closefmts++)) != 0) {
|
||||||
if (SDL_AUDIO_ISSIGNED(test_format)) {
|
switch (test_format) {
|
||||||
|
case SDL_AUDIO_U8:
|
||||||
|
case SDL_AUDIO_S16LE:
|
||||||
|
case SDL_AUDIO_F32:
|
||||||
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 = SDL_AUDIO_S16;
|
test_format = SDL_AUDIO_S16LE;
|
||||||
}
|
}
|
||||||
device->spec.format = test_format;
|
device->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
|
||||||
device->spec.format = SDL_AUDIO_S16;
|
device->spec.format = SDL_AUDIO_S16LE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the fragment size as size in bytes
|
// Update the fragment size as size in bytes
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ static bool PSPAUDIO_PlayDevice(SDL_AudioDevice *device, const Uint8 *buffer, in
|
|||||||
} else {
|
} else {
|
||||||
rc = sceAudioOutputPannedBlocking(device->hidden->channel, PSP_AUDIO_VOLUME_MAX, PSP_AUDIO_VOLUME_MAX, (void *) buffer);
|
rc = sceAudioOutputPannedBlocking(device->hidden->channel, PSP_AUDIO_VOLUME_MAX, PSP_AUDIO_VOLUME_MAX, (void *) buffer);
|
||||||
}
|
}
|
||||||
return (rc == 0);
|
return (rc >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool PSPAUDIO_WaitDevice(SDL_AudioDevice *device)
|
static bool PSPAUDIO_WaitDevice(SDL_AudioDevice *device)
|
||||||
|
|||||||
@@ -814,7 +814,7 @@ static void ANDROIDCAMERA_Deinitialize(void)
|
|||||||
static bool ANDROIDCAMERA_Init(SDL_CameraDriverImpl *impl)
|
static bool ANDROIDCAMERA_Init(SDL_CameraDriverImpl *impl)
|
||||||
{
|
{
|
||||||
// !!! FIXME: slide this off into a subroutine
|
// !!! FIXME: slide this off into a subroutine
|
||||||
// system libraries are in android-24 and later; we currently target android-16 and later, so check if they exist at runtime.
|
// system libraries are in android-24 and later; we currently target android-21 and later, so check if they exist at runtime.
|
||||||
void *libcamera2 = dlopen("libcamera2ndk.so", RTLD_NOW | RTLD_LOCAL);
|
void *libcamera2 = dlopen("libcamera2ndk.so", RTLD_NOW | RTLD_LOCAL);
|
||||||
if (!libcamera2) {
|
if (!libcamera2) {
|
||||||
SDL_Log("CAMERA: libcamera2ndk.so can't be loaded: %s", dlerror());
|
SDL_Log("CAMERA: libcamera2ndk.so can't be loaded: %s", dlerror());
|
||||||
|
|||||||
@@ -1080,7 +1080,8 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeAddTouch)(
|
|||||||
{
|
{
|
||||||
const char *utfname = (*env)->GetStringUTFChars(env, name, NULL);
|
const char *utfname = (*env)->GetStringUTFChars(env, name, NULL);
|
||||||
|
|
||||||
SDL_AddTouch((SDL_TouchID)touchId, SDL_TOUCH_DEVICE_DIRECT, utfname);
|
SDL_AddTouch(Android_ConvertJavaTouchID(touchId),
|
||||||
|
SDL_TOUCH_DEVICE_DIRECT, utfname);
|
||||||
|
|
||||||
(*env)->ReleaseStringUTFChars(env, name, utfname);
|
(*env)->ReleaseStringUTFChars(env, name, utfname);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include "SDL_fcitx.h"
|
#include "SDL_fcitx.h"
|
||||||
#include "../../video/SDL_sysvideo.h"
|
#include "../../video/SDL_sysvideo.h"
|
||||||
#include "../../events/SDL_keyboard_c.h"
|
#include "../../events/SDL_keyboard_c.h"
|
||||||
|
#include "../../core/unix/SDL_appid.h"
|
||||||
#include "SDL_dbus.h"
|
#include "SDL_dbus.h"
|
||||||
|
|
||||||
#ifdef SDL_VIDEO_DRIVER_X11
|
#ifdef SDL_VIDEO_DRIVER_X11
|
||||||
@@ -53,32 +54,14 @@ typedef struct FcitxClient
|
|||||||
|
|
||||||
static FcitxClient fcitx_client;
|
static FcitxClient fcitx_client;
|
||||||
|
|
||||||
static char *GetAppName(void)
|
static const char *GetAppName(void)
|
||||||
{
|
{
|
||||||
#if defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_FREEBSD)
|
const char *exe_name = SDL_GetExeName();
|
||||||
char *spot;
|
if (exe_name) {
|
||||||
char procfile[1024];
|
return exe_name;
|
||||||
char linkfile[1024];
|
|
||||||
int linksize;
|
|
||||||
|
|
||||||
#ifdef SDL_PLATFORM_LINUX
|
|
||||||
(void)SDL_snprintf(procfile, sizeof(procfile), "/proc/%d/exe", getpid());
|
|
||||||
#elif defined(SDL_PLATFORM_FREEBSD)
|
|
||||||
(void)SDL_snprintf(procfile, sizeof(procfile), "/proc/%d/file", getpid());
|
|
||||||
#endif
|
|
||||||
linksize = readlink(procfile, linkfile, sizeof(linkfile) - 1);
|
|
||||||
if (linksize > 0) {
|
|
||||||
linkfile[linksize] = '\0';
|
|
||||||
spot = SDL_strrchr(linkfile, '/');
|
|
||||||
if (spot) {
|
|
||||||
return SDL_strdup(spot + 1);
|
|
||||||
} else {
|
|
||||||
return SDL_strdup(linkfile);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif // SDL_PLATFORM_LINUX || SDL_PLATFORM_FREEBSD
|
|
||||||
|
|
||||||
return SDL_strdup("SDL_App");
|
return "SDL_App";
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t Fcitx_GetPreeditString(SDL_DBusContext *dbus,
|
static size_t Fcitx_GetPreeditString(SDL_DBusContext *dbus,
|
||||||
@@ -281,7 +264,7 @@ static bool FcitxCreateInputContext(SDL_DBusContext *dbus, const char *appname,
|
|||||||
|
|
||||||
static bool FcitxClientCreateIC(FcitxClient *client)
|
static bool FcitxClientCreateIC(FcitxClient *client)
|
||||||
{
|
{
|
||||||
char *appname = GetAppName();
|
const char *appname = GetAppName();
|
||||||
char *ic_path = NULL;
|
char *ic_path = NULL;
|
||||||
SDL_DBusContext *dbus = client->dbus;
|
SDL_DBusContext *dbus = client->dbus;
|
||||||
|
|
||||||
@@ -290,8 +273,6 @@ static bool FcitxClientCreateIC(FcitxClient *client)
|
|||||||
ic_path = NULL; // just in case.
|
ic_path = NULL; // just in case.
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_free(appname);
|
|
||||||
|
|
||||||
if (ic_path) {
|
if (ic_path) {
|
||||||
SDL_free(client->ic_path);
|
SDL_free(client->ic_path);
|
||||||
client->ic_path = SDL_strdup(ic_path);
|
client->ic_path = SDL_strdup(ic_path);
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 3,2,18,0
|
FILEVERSION 3,2,22,0
|
||||||
PRODUCTVERSION 3,2,18,0
|
PRODUCTVERSION 3,2,22,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", "3, 2, 18, 0\0"
|
VALUE "FileVersion", "3, 2, 22, 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", "SDL3.dll\0"
|
VALUE "OriginalFilename", "SDL3.dll\0"
|
||||||
VALUE "ProductName", "Simple DirectMedia Layer\0"
|
VALUE "ProductName", "Simple DirectMedia Layer\0"
|
||||||
VALUE "ProductVersion", "3, 2, 18, 0\0"
|
VALUE "ProductVersion", "3, 2, 22, 0\0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ static char *search_path_for_binary(const char *bin)
|
|||||||
char *envr;
|
char *envr;
|
||||||
size_t alloc_size;
|
size_t alloc_size;
|
||||||
char *exe = NULL;
|
char *exe = NULL;
|
||||||
char *start = envr;
|
char *start;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
if (!envr_real) {
|
if (!envr_real) {
|
||||||
@@ -86,7 +86,7 @@ static char *search_path_for_binary(const char *bin)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
envr = SDL_strdup(envr_real);
|
start = envr = SDL_strdup(envr_real);
|
||||||
if (!envr) {
|
if (!envr) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-3
@@ -1785,6 +1785,8 @@ SDL_GPURenderPass *SDL_BeginGPURenderPass(
|
|||||||
commandBufferHeader->render_pass.num_color_targets = num_color_targets;
|
commandBufferHeader->render_pass.num_color_targets = num_color_targets;
|
||||||
if (depth_stencil_target_info != NULL) {
|
if (depth_stencil_target_info != NULL) {
|
||||||
commandBufferHeader->render_pass.depth_stencil_target = depth_stencil_target_info->texture;
|
commandBufferHeader->render_pass.depth_stencil_target = depth_stencil_target_info->texture;
|
||||||
|
} else {
|
||||||
|
commandBufferHeader->render_pass.depth_stencil_target = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2248,14 +2250,14 @@ void SDL_DrawGPUIndexedPrimitivesIndirect(
|
|||||||
void SDL_EndGPURenderPass(
|
void SDL_EndGPURenderPass(
|
||||||
SDL_GPURenderPass *render_pass)
|
SDL_GPURenderPass *render_pass)
|
||||||
{
|
{
|
||||||
CommandBufferCommonHeader *commandBufferCommonHeader;
|
|
||||||
commandBufferCommonHeader = (CommandBufferCommonHeader *)RENDERPASS_COMMAND_BUFFER;
|
|
||||||
|
|
||||||
if (render_pass == NULL) {
|
if (render_pass == NULL) {
|
||||||
SDL_InvalidParamError("render_pass");
|
SDL_InvalidParamError("render_pass");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CommandBufferCommonHeader *commandBufferCommonHeader;
|
||||||
|
commandBufferCommonHeader = (CommandBufferCommonHeader *)RENDERPASS_COMMAND_BUFFER;
|
||||||
|
|
||||||
if (RENDERPASS_DEVICE->debug_mode) {
|
if (RENDERPASS_DEVICE->debug_mode) {
|
||||||
CHECK_RENDERPASS
|
CHECK_RENDERPASS
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,8 +109,8 @@
|
|||||||
#define DXGI_GET_DEBUG_INTERFACE_FUNC "DXGIGetDebugInterface"
|
#define DXGI_GET_DEBUG_INTERFACE_FUNC "DXGIGetDebugInterface"
|
||||||
#define D3D12_GET_DEBUG_INTERFACE_FUNC "D3D12GetDebugInterface"
|
#define D3D12_GET_DEBUG_INTERFACE_FUNC "D3D12GetDebugInterface"
|
||||||
#define WINDOW_PROPERTY_DATA "SDL_GPUD3D12WindowPropertyData"
|
#define WINDOW_PROPERTY_DATA "SDL_GPUD3D12WindowPropertyData"
|
||||||
#define D3D_FEATURE_LEVEL_CHOICE D3D_FEATURE_LEVEL_11_1
|
#define D3D_FEATURE_LEVEL_CHOICE D3D_FEATURE_LEVEL_11_0
|
||||||
#define D3D_FEATURE_LEVEL_CHOICE_STR "11_1"
|
#define D3D_FEATURE_LEVEL_CHOICE_STR "11_0"
|
||||||
#define MAX_ROOT_SIGNATURE_PARAMETERS 64
|
#define MAX_ROOT_SIGNATURE_PARAMETERS 64
|
||||||
#define D3D12_FENCE_UNSIGNALED_VALUE 0
|
#define D3D12_FENCE_UNSIGNALED_VALUE 0
|
||||||
#define D3D12_FENCE_SIGNAL_VALUE 1
|
#define D3D12_FENCE_SIGNAL_VALUE 1
|
||||||
@@ -1194,7 +1194,6 @@ struct D3D12UniformBuffer
|
|||||||
D3D12Buffer *buffer;
|
D3D12Buffer *buffer;
|
||||||
Uint32 writeOffset;
|
Uint32 writeOffset;
|
||||||
Uint32 drawOffset;
|
Uint32 drawOffset;
|
||||||
Uint32 currentBlockSize;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Forward function declarations
|
// Forward function declarations
|
||||||
@@ -1441,6 +1440,8 @@ static void D3D12_INTERNAL_ReleaseTextureContainer(
|
|||||||
container->textures[i]);
|
container->textures[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_DestroyProperties(container->header.info.props);
|
||||||
|
|
||||||
// Containers are just client handles, so we can destroy immediately
|
// Containers are just client handles, so we can destroy immediately
|
||||||
if (container->debugName) {
|
if (container->debugName) {
|
||||||
SDL_free(container->debugName);
|
SDL_free(container->debugName);
|
||||||
@@ -4496,7 +4497,6 @@ static D3D12UniformBuffer *D3D12_INTERNAL_AcquireUniformBufferFromPool(
|
|||||||
|
|
||||||
SDL_UnlockMutex(renderer->acquireUniformBufferLock);
|
SDL_UnlockMutex(renderer->acquireUniformBufferLock);
|
||||||
|
|
||||||
uniformBuffer->currentBlockSize = 0;
|
|
||||||
uniformBuffer->drawOffset = 0;
|
uniformBuffer->drawOffset = 0;
|
||||||
uniformBuffer->writeOffset = 0;
|
uniformBuffer->writeOffset = 0;
|
||||||
|
|
||||||
@@ -4535,6 +4535,7 @@ static void D3D12_INTERNAL_PushUniformData(
|
|||||||
Uint32 length)
|
Uint32 length)
|
||||||
{
|
{
|
||||||
D3D12UniformBuffer *uniformBuffer;
|
D3D12UniformBuffer *uniformBuffer;
|
||||||
|
Uint32 blockSize;
|
||||||
|
|
||||||
if (shaderStage == SDL_GPU_SHADERSTAGE_VERTEX) {
|
if (shaderStage == SDL_GPU_SHADERSTAGE_VERTEX) {
|
||||||
if (commandBuffer->vertexUniformBuffers[slotIndex] == NULL) {
|
if (commandBuffer->vertexUniformBuffers[slotIndex] == NULL) {
|
||||||
@@ -4559,13 +4560,13 @@ static void D3D12_INTERNAL_PushUniformData(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
uniformBuffer->currentBlockSize =
|
blockSize =
|
||||||
D3D12_INTERNAL_Align(
|
D3D12_INTERNAL_Align(
|
||||||
length,
|
length,
|
||||||
256);
|
256);
|
||||||
|
|
||||||
// If there is no more room, acquire a new uniform buffer
|
// If there is no more room, acquire a new uniform buffer
|
||||||
if (uniformBuffer->writeOffset + uniformBuffer->currentBlockSize >= UNIFORM_BUFFER_SIZE) {
|
if (uniformBuffer->writeOffset + blockSize >= UNIFORM_BUFFER_SIZE) {
|
||||||
ID3D12Resource_Unmap(
|
ID3D12Resource_Unmap(
|
||||||
uniformBuffer->buffer->handle,
|
uniformBuffer->buffer->handle,
|
||||||
0,
|
0,
|
||||||
@@ -4595,7 +4596,7 @@ static void D3D12_INTERNAL_PushUniformData(
|
|||||||
data,
|
data,
|
||||||
length);
|
length);
|
||||||
|
|
||||||
uniformBuffer->writeOffset += uniformBuffer->currentBlockSize;
|
uniformBuffer->writeOffset += blockSize;
|
||||||
|
|
||||||
if (shaderStage == SDL_GPU_SHADERSTAGE_VERTEX) {
|
if (shaderStage == SDL_GPU_SHADERSTAGE_VERTEX) {
|
||||||
commandBuffer->needVertexUniformBufferBind[slotIndex] = true;
|
commandBuffer->needVertexUniformBufferBind[slotIndex] = true;
|
||||||
@@ -8352,6 +8353,7 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this)
|
|||||||
IDXGIFactory4 *factory4;
|
IDXGIFactory4 *factory4;
|
||||||
IDXGIFactory6 *factory6;
|
IDXGIFactory6 *factory6;
|
||||||
IDXGIAdapter1 *adapter;
|
IDXGIAdapter1 *adapter;
|
||||||
|
bool supports_64UAVs = false;
|
||||||
|
|
||||||
// Can we load D3D12?
|
// Can we load D3D12?
|
||||||
|
|
||||||
@@ -8440,12 +8442,39 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_COMPILE_TIME_ASSERT(featurelevel, D3D_FEATURE_LEVEL_CHOICE < D3D_FEATURE_LEVEL_11_1);
|
||||||
|
|
||||||
|
// Check feature level 11_1 first, guarantees 64+ UAVs unlike 11_0 Tier1
|
||||||
res = D3D12CreateDeviceFunc(
|
res = D3D12CreateDeviceFunc(
|
||||||
(IUnknown *)adapter,
|
(IUnknown *)adapter,
|
||||||
D3D_FEATURE_LEVEL_CHOICE,
|
D3D_FEATURE_LEVEL_11_1,
|
||||||
D3D_GUID(D3D_IID_ID3D12Device),
|
D3D_GUID(D3D_IID_ID3D12Device),
|
||||||
(void **)&device);
|
(void **)&device);
|
||||||
|
|
||||||
|
if (SUCCEEDED(res)) {
|
||||||
|
supports_64UAVs = true;
|
||||||
|
} else {
|
||||||
|
res = D3D12CreateDeviceFunc(
|
||||||
|
(IUnknown *)adapter,
|
||||||
|
D3D_FEATURE_LEVEL_CHOICE,
|
||||||
|
D3D_GUID(D3D_IID_ID3D12Device),
|
||||||
|
(void **)&device);
|
||||||
|
|
||||||
|
if (SUCCEEDED(res)) {
|
||||||
|
D3D12_FEATURE_DATA_D3D12_OPTIONS featureOptions;
|
||||||
|
SDL_zero(featureOptions);
|
||||||
|
|
||||||
|
res = ID3D12Device_CheckFeatureSupport(
|
||||||
|
device,
|
||||||
|
D3D12_FEATURE_D3D12_OPTIONS,
|
||||||
|
&featureOptions,
|
||||||
|
sizeof(featureOptions));
|
||||||
|
if (SUCCEEDED(res) && featureOptions.ResourceBindingTier >= D3D12_RESOURCE_BINDING_TIER_2) {
|
||||||
|
supports_64UAVs = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (SUCCEEDED(res)) {
|
if (SUCCEEDED(res)) {
|
||||||
ID3D12Device_Release(device);
|
ID3D12Device_Release(device);
|
||||||
}
|
}
|
||||||
@@ -8455,6 +8484,11 @@ static bool D3D12_PrepareDriver(SDL_VideoDevice *_this)
|
|||||||
SDL_UnloadObject(d3d12Dll);
|
SDL_UnloadObject(d3d12Dll);
|
||||||
SDL_UnloadObject(dxgiDll);
|
SDL_UnloadObject(dxgiDll);
|
||||||
|
|
||||||
|
if (!supports_64UAVs) {
|
||||||
|
SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "D3D12: Tier 2 Resource binding is not supported");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (FAILED(res)) {
|
if (FAILED(res)) {
|
||||||
SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "D3D12: Could not create D3D12Device with feature level " D3D_FEATURE_LEVEL_CHOICE_STR);
|
SDL_LogWarn(SDL_LOG_CATEGORY_GPU, "D3D12: Could not create D3D12Device with feature level " D3D_FEATURE_LEVEL_CHOICE_STR);
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -888,6 +888,7 @@ static void METAL_INTERNAL_DestroyTextureContainer(
|
|||||||
container->textures[i]->handle = nil;
|
container->textures[i]->handle = nil;
|
||||||
SDL_free(container->textures[i]);
|
SDL_free(container->textures[i]);
|
||||||
}
|
}
|
||||||
|
SDL_DestroyProperties(container->header.info.props);
|
||||||
if (container->debugName != NULL) {
|
if (container->debugName != NULL) {
|
||||||
SDL_free(container->debugName);
|
SDL_free(container->debugName);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1108,6 +1108,7 @@ typedef struct VulkanCommandBuffer
|
|||||||
VulkanFenceHandle *inFlightFence;
|
VulkanFenceHandle *inFlightFence;
|
||||||
bool autoReleaseFence;
|
bool autoReleaseFence;
|
||||||
|
|
||||||
|
bool swapchainRequested;
|
||||||
bool isDefrag; // Whether this CB was created for defragging
|
bool isDefrag; // Whether this CB was created for defragging
|
||||||
} VulkanCommandBuffer;
|
} VulkanCommandBuffer;
|
||||||
|
|
||||||
@@ -1277,13 +1278,20 @@ static inline const char *VkErrorMessages(VkResult code)
|
|||||||
#undef ERR_TO_STR
|
#undef ERR_TO_STR
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SET_ERROR_AND_RETURN(fmt, msg, ret) \
|
#define SET_ERROR(fmt, msg) \
|
||||||
do { \
|
do { \
|
||||||
if (renderer->debugMode) { \
|
if (renderer->debugMode) { \
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_GPU, fmt, msg); \
|
SDL_LogError(SDL_LOG_CATEGORY_GPU, fmt, msg); \
|
||||||
} \
|
} \
|
||||||
SDL_SetError((fmt), (msg)); \
|
SDL_SetError((fmt), (msg)); \
|
||||||
return ret; \
|
} while (0)
|
||||||
|
|
||||||
|
#define SET_STRING_ERROR(msg) SET_ERROR("%s", msg)
|
||||||
|
|
||||||
|
#define SET_ERROR_AND_RETURN(fmt, msg, ret) \
|
||||||
|
do { \
|
||||||
|
SET_ERROR(fmt, msg); \
|
||||||
|
return ret; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define SET_STRING_ERROR_AND_RETURN(msg, ret) SET_ERROR_AND_RETURN("%s", msg, ret)
|
#define SET_STRING_ERROR_AND_RETURN(msg, ret) SET_ERROR_AND_RETURN("%s", msg, ret)
|
||||||
@@ -6081,7 +6089,6 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
|||||||
colorAttachmentReferences[colorAttachmentReferenceCount].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
colorAttachmentReferences[colorAttachmentReferenceCount].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
attachmentDescriptionCount += 1;
|
attachmentDescriptionCount += 1;
|
||||||
colorAttachmentReferenceCount += 1;
|
|
||||||
|
|
||||||
if (colorTargetInfos[i].store_op == SDL_GPU_STOREOP_RESOLVE || colorTargetInfos[i].store_op == SDL_GPU_STOREOP_RESOLVE_AND_STORE) {
|
if (colorTargetInfos[i].store_op == SDL_GPU_STOREOP_RESOLVE || colorTargetInfos[i].store_op == SDL_GPU_STOREOP_RESOLVE_AND_STORE) {
|
||||||
VulkanTextureContainer *resolveContainer = (VulkanTextureContainer *)colorTargetInfos[i].resolve_texture;
|
VulkanTextureContainer *resolveContainer = (VulkanTextureContainer *)colorTargetInfos[i].resolve_texture;
|
||||||
@@ -6096,12 +6103,16 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass(
|
|||||||
attachmentDescriptions[attachmentDescriptionCount].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
attachmentDescriptions[attachmentDescriptionCount].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
attachmentDescriptions[attachmentDescriptionCount].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
attachmentDescriptions[attachmentDescriptionCount].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
resolveReferences[resolveReferenceCount].attachment = attachmentDescriptionCount;
|
resolveReferences[colorAttachmentReferenceCount].attachment = attachmentDescriptionCount;
|
||||||
resolveReferences[resolveReferenceCount].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
resolveReferences[colorAttachmentReferenceCount].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||||
|
|
||||||
attachmentDescriptionCount += 1;
|
attachmentDescriptionCount += 1;
|
||||||
resolveReferenceCount += 1;
|
resolveReferenceCount += 1;
|
||||||
|
} else {
|
||||||
|
resolveReferences[colorAttachmentReferenceCount].attachment = VK_ATTACHMENT_UNUSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
colorAttachmentReferenceCount += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
|
||||||
@@ -6951,6 +6962,8 @@ static void VULKAN_ReleaseTexture(
|
|||||||
VULKAN_INTERNAL_ReleaseTexture(renderer, vulkanTextureContainer->textures[i]);
|
VULKAN_INTERNAL_ReleaseTexture(renderer, vulkanTextureContainer->textures[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_DestroyProperties(vulkanTextureContainer->header.info.props);
|
||||||
|
|
||||||
// Containers are just client handles, so we can destroy immediately
|
// Containers are just client handles, so we can destroy immediately
|
||||||
if (vulkanTextureContainer->debugName != NULL) {
|
if (vulkanTextureContainer->debugName != NULL) {
|
||||||
SDL_free(vulkanTextureContainer->debugName);
|
SDL_free(vulkanTextureContainer->debugName);
|
||||||
@@ -8592,7 +8605,7 @@ static void VULKAN_INTERNAL_BindComputeDescriptorSets(
|
|||||||
dynamicOffsetCount,
|
dynamicOffsetCount,
|
||||||
dynamicOffsets);
|
dynamicOffsets);
|
||||||
|
|
||||||
commandBuffer->needNewVertexUniformOffsets = false;
|
commandBuffer->needNewComputeUniformOffsets = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void VULKAN_DispatchCompute(
|
static void VULKAN_DispatchCompute(
|
||||||
@@ -9395,6 +9408,8 @@ static bool VULKAN_INTERNAL_AllocateCommandBuffer(
|
|||||||
commandBuffer->usedUniformBuffers = SDL_malloc(
|
commandBuffer->usedUniformBuffers = SDL_malloc(
|
||||||
commandBuffer->usedUniformBufferCapacity * sizeof(VulkanUniformBuffer *));
|
commandBuffer->usedUniformBufferCapacity * sizeof(VulkanUniformBuffer *));
|
||||||
|
|
||||||
|
commandBuffer->swapchainRequested = false;
|
||||||
|
|
||||||
// Pool it!
|
// Pool it!
|
||||||
|
|
||||||
vulkanCommandPool->inactiveCommandBuffers[vulkanCommandPool->inactiveCommandBufferCount] = commandBuffer;
|
vulkanCommandPool->inactiveCommandBuffers[vulkanCommandPool->inactiveCommandBufferCount] = commandBuffer;
|
||||||
@@ -9577,6 +9592,7 @@ static SDL_GPUCommandBuffer *VULKAN_AcquireCommandBuffer(
|
|||||||
|
|
||||||
commandBuffer->autoReleaseFence = true;
|
commandBuffer->autoReleaseFence = true;
|
||||||
|
|
||||||
|
commandBuffer->swapchainRequested = false;
|
||||||
commandBuffer->isDefrag = 0;
|
commandBuffer->isDefrag = 0;
|
||||||
|
|
||||||
/* Reset the command buffer here to avoid resets being called
|
/* Reset the command buffer here to avoid resets being called
|
||||||
@@ -9925,6 +9941,14 @@ static bool VULKAN_INTERNAL_AcquireSwapchainTexture(
|
|||||||
SET_STRING_ERROR_AND_RETURN("Cannot acquire a swapchain texture from an unclaimed window!", false);
|
SET_STRING_ERROR_AND_RETURN("Cannot acquire a swapchain texture from an unclaimed window!", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The command buffer is flagged for cleanup when the swapchain is requested as a cleanup timing mechanism
|
||||||
|
vulkanCommandBuffer->swapchainRequested = true;
|
||||||
|
|
||||||
|
if (window->flags & SDL_WINDOW_HIDDEN) {
|
||||||
|
// Edge case, texture is filled in with NULL but not an error
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// If window data marked as needing swapchain recreate, try to recreate
|
// If window data marked as needing swapchain recreate, try to recreate
|
||||||
if (windowData->needsSwapchainRecreate) {
|
if (windowData->needsSwapchainRecreate) {
|
||||||
Uint32 recreateSwapchainResult = VULKAN_INTERNAL_RecreateSwapchain(renderer, windowData);
|
Uint32 recreateSwapchainResult = VULKAN_INTERNAL_RecreateSwapchain(renderer, windowData);
|
||||||
@@ -9942,13 +9966,6 @@ static bool VULKAN_INTERNAL_AcquireSwapchainTexture(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (swapchainTextureWidth) {
|
|
||||||
*swapchainTextureWidth = windowData->width;
|
|
||||||
}
|
|
||||||
if (swapchainTextureHeight) {
|
|
||||||
*swapchainTextureHeight = windowData->height;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (windowData->inFlightFences[windowData->frameCounter] != NULL) {
|
if (windowData->inFlightFences[windowData->frameCounter] != NULL) {
|
||||||
if (block) {
|
if (block) {
|
||||||
// If we are blocking, just wait for the fence!
|
// If we are blocking, just wait for the fence!
|
||||||
@@ -10000,6 +10017,14 @@ static bool VULKAN_INTERNAL_AcquireSwapchainTexture(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (swapchainTextureWidth) {
|
||||||
|
*swapchainTextureWidth = windowData->width;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (swapchainTextureHeight) {
|
||||||
|
*swapchainTextureHeight = windowData->height;
|
||||||
|
}
|
||||||
|
|
||||||
swapchainTextureContainer = &windowData->textureContainers[swapchainImageIndex];
|
swapchainTextureContainer = &windowData->textureContainers[swapchainImageIndex];
|
||||||
|
|
||||||
// We need a special execution dependency with pWaitDstStageMask or image transition can start before acquire finishes
|
// We need a special execution dependency with pWaitDstStageMask or image transition can start before acquire finishes
|
||||||
@@ -10377,6 +10402,7 @@ static void VULKAN_INTERNAL_CleanCommandBuffer(
|
|||||||
commandBuffer->presentDataCount = 0;
|
commandBuffer->presentDataCount = 0;
|
||||||
commandBuffer->waitSemaphoreCount = 0;
|
commandBuffer->waitSemaphoreCount = 0;
|
||||||
commandBuffer->signalSemaphoreCount = 0;
|
commandBuffer->signalSemaphoreCount = 0;
|
||||||
|
commandBuffer->swapchainRequested = false;
|
||||||
|
|
||||||
// Reset defrag state
|
// Reset defrag state
|
||||||
|
|
||||||
@@ -10474,11 +10500,18 @@ static bool VULKAN_Wait(
|
|||||||
VkResult result;
|
VkResult result;
|
||||||
Sint32 i;
|
Sint32 i;
|
||||||
|
|
||||||
|
SDL_LockMutex(renderer->submitLock);
|
||||||
|
|
||||||
result = renderer->vkDeviceWaitIdle(renderer->logicalDevice);
|
result = renderer->vkDeviceWaitIdle(renderer->logicalDevice);
|
||||||
|
|
||||||
CHECK_VULKAN_ERROR_AND_RETURN(result, vkDeviceWaitIdle, false);
|
if (result != VK_SUCCESS) {
|
||||||
|
if (renderer->debugMode) {
|
||||||
SDL_LockMutex(renderer->submitLock);
|
SDL_LogError(SDL_LOG_CATEGORY_GPU, "%s %s", "vkDeviceWaitIdle", VkErrorMessages(result));
|
||||||
|
}
|
||||||
|
SDL_SetError("%s %s", "vkDeviceWaitIdle", VkErrorMessages(result));
|
||||||
|
SDL_UnlockMutex(renderer->submitLock);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) {
|
for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) {
|
||||||
commandBuffer = renderer->submittedCommandBuffers[i];
|
commandBuffer = renderer->submittedCommandBuffers[i];
|
||||||
@@ -10533,7 +10566,7 @@ static bool VULKAN_Submit(
|
|||||||
VulkanTextureSubresource *swapchainTextureSubresource;
|
VulkanTextureSubresource *swapchainTextureSubresource;
|
||||||
VulkanMemorySubAllocator *allocator;
|
VulkanMemorySubAllocator *allocator;
|
||||||
bool performCleanups =
|
bool performCleanups =
|
||||||
(renderer->claimedWindowCount > 0 && vulkanCommandBuffer->presentDataCount > 0) ||
|
(renderer->claimedWindowCount > 0 && vulkanCommandBuffer->swapchainRequested) ||
|
||||||
renderer->claimedWindowCount == 0;
|
renderer->claimedWindowCount == 0;
|
||||||
|
|
||||||
SDL_LockMutex(renderer->submitLock);
|
SDL_LockMutex(renderer->submitLock);
|
||||||
@@ -11694,9 +11727,10 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S
|
|||||||
renderer->allowedFramesInFlight = 2;
|
renderer->allowedFramesInFlight = 2;
|
||||||
|
|
||||||
if (!VULKAN_INTERNAL_PrepareVulkan(renderer)) {
|
if (!VULKAN_INTERNAL_PrepareVulkan(renderer)) {
|
||||||
|
SET_STRING_ERROR("Failed to initialize Vulkan!");
|
||||||
SDL_free(renderer);
|
SDL_free(renderer);
|
||||||
SDL_Vulkan_UnloadLibrary();
|
SDL_Vulkan_UnloadLibrary();
|
||||||
SET_STRING_ERROR_AND_RETURN("Failed to initialize Vulkan!", NULL);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_LogInfo(SDL_LOG_CATEGORY_GPU, "SDL_GPU Driver: Vulkan");
|
SDL_LogInfo(SDL_LOG_CATEGORY_GPU, "SDL_GPU Driver: Vulkan");
|
||||||
@@ -11722,9 +11756,10 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S
|
|||||||
|
|
||||||
if (!VULKAN_INTERNAL_CreateLogicalDevice(
|
if (!VULKAN_INTERNAL_CreateLogicalDevice(
|
||||||
renderer)) {
|
renderer)) {
|
||||||
|
SET_STRING_ERROR("Failed to create logical device!");
|
||||||
SDL_free(renderer);
|
SDL_free(renderer);
|
||||||
SDL_Vulkan_UnloadLibrary();
|
SDL_Vulkan_UnloadLibrary();
|
||||||
SET_STRING_ERROR_AND_RETURN("Failed to create logical device!", NULL);
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: just move this into this function
|
// FIXME: just move this into this function
|
||||||
|
|||||||
@@ -1117,13 +1117,12 @@ bool SDL_SYS_HapticResume(SDL_Haptic *haptic)
|
|||||||
*/
|
*/
|
||||||
bool SDL_SYS_HapticStopAll(SDL_Haptic *haptic)
|
bool SDL_SYS_HapticStopAll(SDL_Haptic *haptic)
|
||||||
{
|
{
|
||||||
int i, ret;
|
int i;
|
||||||
|
|
||||||
// Linux does not support this natively so we have to loop.
|
// Linux does not support this natively so we have to loop.
|
||||||
for (i = 0; i < haptic->neffects; i++) {
|
for (i = 0; i < haptic->neffects; i++) {
|
||||||
if (haptic->effects[i].hweffect != NULL) {
|
if (haptic->effects[i].hweffect != NULL) {
|
||||||
ret = SDL_SYS_HapticStopEffect(haptic, &haptic->effects[i]);
|
if (!SDL_SYS_HapticStopEffect(haptic, &haptic->effects[i])) {
|
||||||
if (ret < 0) {
|
|
||||||
return SDL_SetError("Haptic: Error while trying to stop all playing effects.");
|
return SDL_SetError("Haptic: Error while trying to stop all playing effects.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-18
@@ -260,19 +260,19 @@ static int get_usage(uint8_t *report_descriptor, size_t size,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (key_cmd == 0x4) {
|
if (key_cmd == 0x4) {
|
||||||
*usage_page = get_bytes(report_descriptor, size, data_len, i);
|
*usage_page = (unsigned short)get_bytes(report_descriptor, size, data_len, i);
|
||||||
usage_page_found = 1;
|
usage_page_found = 1;
|
||||||
//printf("Usage Page: %x\n", (uint32_t)*usage_page);
|
//printf("Usage Page: %x\n", (uint32_t)*usage_page);
|
||||||
}
|
}
|
||||||
if (key_cmd == 0x8) {
|
if (key_cmd == 0x8) {
|
||||||
if (data_len == 4) { /* Usages 5.5 / Usage Page 6.2.2.7 */
|
if (data_len == 4) { /* Usages 5.5 / Usage Page 6.2.2.7 */
|
||||||
*usage_page = get_bytes(report_descriptor, size, 2, i + 2);
|
*usage_page = (unsigned short)get_bytes(report_descriptor, size, 2, i + 2);
|
||||||
usage_page_found = 1;
|
usage_page_found = 1;
|
||||||
*usage = get_bytes(report_descriptor, size, 2, i);
|
*usage = (unsigned short)get_bytes(report_descriptor, size, 2, i);
|
||||||
usage_found = 1;
|
usage_found = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
*usage = get_bytes(report_descriptor, size, data_len, i);
|
*usage = (unsigned short)get_bytes(report_descriptor, size, data_len, i);
|
||||||
usage_found = 1;
|
usage_found = 1;
|
||||||
}
|
}
|
||||||
//printf("Usage: %x\n", (uint32_t)*usage);
|
//printf("Usage: %x\n", (uint32_t)*usage);
|
||||||
@@ -640,7 +640,7 @@ static int hid_get_report_descriptor_libusb(libusb_device_handle *handle, int in
|
|||||||
/* Get the HID Report Descriptor.
|
/* Get the HID Report Descriptor.
|
||||||
See USB HID Specification, section 7.1.1
|
See USB HID Specification, section 7.1.1
|
||||||
*/
|
*/
|
||||||
int res = libusb_control_transfer(handle, LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_INTERFACE, LIBUSB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_REPORT << 8), interface_num, tmp, expected_report_descriptor_size, 5000);
|
int res = libusb_control_transfer(handle, LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_INTERFACE, LIBUSB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_REPORT << 8), (uint16_t)interface_num, tmp, expected_report_descriptor_size, 5000);
|
||||||
if (res >= 0) {
|
if (res >= 0) {
|
||||||
if (res > (int)buf_size)
|
if (res > (int)buf_size)
|
||||||
res = (int)buf_size;
|
res = (int)buf_size;
|
||||||
@@ -1191,7 +1191,7 @@ static void *read_thread(void *param)
|
|||||||
dev->transfer = libusb_alloc_transfer(0);
|
dev->transfer = libusb_alloc_transfer(0);
|
||||||
libusb_fill_interrupt_transfer(dev->transfer,
|
libusb_fill_interrupt_transfer(dev->transfer,
|
||||||
dev->device_handle,
|
dev->device_handle,
|
||||||
dev->input_endpoint,
|
(unsigned char)dev->input_endpoint,
|
||||||
buf,
|
buf,
|
||||||
(int) length,
|
(int) length,
|
||||||
read_callback,
|
read_callback,
|
||||||
@@ -1610,8 +1610,8 @@ int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t
|
|||||||
res = libusb_control_transfer(dev->device_handle,
|
res = libusb_control_transfer(dev->device_handle,
|
||||||
LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT,
|
LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT,
|
||||||
0x09/*HID Set_Report*/,
|
0x09/*HID Set_Report*/,
|
||||||
(2/*HID output*/ << 8) | report_number,
|
(uint16_t)((2/*HID output*/ << 8) | report_number),
|
||||||
dev->interface,
|
(uint16_t)dev->interface,
|
||||||
(unsigned char *)data, (uint16_t)length,
|
(unsigned char *)data, (uint16_t)length,
|
||||||
1000/*timeout millis*/);
|
1000/*timeout millis*/);
|
||||||
|
|
||||||
@@ -1627,7 +1627,7 @@ int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t
|
|||||||
/* Use the interrupt out endpoint */
|
/* Use the interrupt out endpoint */
|
||||||
int actual_length;
|
int actual_length;
|
||||||
res = libusb_interrupt_transfer(dev->device_handle,
|
res = libusb_interrupt_transfer(dev->device_handle,
|
||||||
dev->output_endpoint,
|
(unsigned char)dev->output_endpoint,
|
||||||
(unsigned char*)data,
|
(unsigned char*)data,
|
||||||
(int) length,
|
(int) length,
|
||||||
&actual_length, 1000);
|
&actual_length, 1000);
|
||||||
@@ -1776,8 +1776,8 @@ int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char
|
|||||||
res = libusb_control_transfer(dev->device_handle,
|
res = libusb_control_transfer(dev->device_handle,
|
||||||
LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT,
|
LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT,
|
||||||
0x09/*HID set_report*/,
|
0x09/*HID set_report*/,
|
||||||
(3/*HID feature*/ << 8) | report_number,
|
(uint16_t)((3/*HID feature*/ << 8) | report_number),
|
||||||
dev->interface,
|
(uint16_t)dev->interface,
|
||||||
(unsigned char *)data, (uint16_t)length,
|
(unsigned char *)data, (uint16_t)length,
|
||||||
1000/*timeout millis*/);
|
1000/*timeout millis*/);
|
||||||
|
|
||||||
@@ -1807,8 +1807,8 @@ int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data,
|
|||||||
res = libusb_control_transfer(dev->device_handle,
|
res = libusb_control_transfer(dev->device_handle,
|
||||||
LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_IN,
|
LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_IN,
|
||||||
0x01/*HID get_report*/,
|
0x01/*HID get_report*/,
|
||||||
(3/*HID feature*/ << 8) | report_number,
|
(uint16_t)((3/*HID feature*/ << 8) | report_number),
|
||||||
dev->interface,
|
(uint16_t)dev->interface,
|
||||||
(unsigned char *)data, (uint16_t)length,
|
(unsigned char *)data, (uint16_t)length,
|
||||||
1000/*timeout millis*/);
|
1000/*timeout millis*/);
|
||||||
|
|
||||||
@@ -1837,8 +1837,8 @@ int HID_API_EXPORT HID_API_CALL hid_get_input_report(hid_device *dev, unsigned c
|
|||||||
res = libusb_control_transfer(dev->device_handle,
|
res = libusb_control_transfer(dev->device_handle,
|
||||||
LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_IN,
|
LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_IN,
|
||||||
0x01/*HID get_report*/,
|
0x01/*HID get_report*/,
|
||||||
(1/*HID Input*/ << 8) | report_number,
|
(uint16_t)((1/*HID Input*/ << 8) | report_number),
|
||||||
dev->interface,
|
(uint16_t)dev->interface,
|
||||||
(unsigned char *)data, (uint16_t)length,
|
(unsigned char *)data, (uint16_t)length,
|
||||||
1000/*timeout millis*/);
|
1000/*timeout millis*/);
|
||||||
|
|
||||||
@@ -1930,7 +1930,7 @@ int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index
|
|||||||
{
|
{
|
||||||
wchar_t *str;
|
wchar_t *str;
|
||||||
|
|
||||||
str = get_usb_string(dev->device_handle, string_index);
|
str = get_usb_string(dev->device_handle, (uint8_t)string_index);
|
||||||
if (str) {
|
if (str) {
|
||||||
wcsncpy(string, str, maxlen);
|
wcsncpy(string, str, maxlen);
|
||||||
string[maxlen-1] = L'\0';
|
string[maxlen-1] = L'\0';
|
||||||
@@ -2118,7 +2118,7 @@ uint16_t get_usb_code_for_current_locale(void)
|
|||||||
/* Chop off the encoding part, and make it lower case. */
|
/* Chop off the encoding part, and make it lower case. */
|
||||||
ptr = search_string;
|
ptr = search_string;
|
||||||
while (*ptr) {
|
while (*ptr) {
|
||||||
*ptr = tolower(*ptr);
|
*ptr = (char)tolower(*ptr);
|
||||||
if (*ptr == '.') {
|
if (*ptr == '.') {
|
||||||
*ptr = '\0';
|
*ptr = '\0';
|
||||||
break;
|
break;
|
||||||
@@ -2139,7 +2139,7 @@ uint16_t get_usb_code_for_current_locale(void)
|
|||||||
/* Chop off the variant. Chop it off at the '_'. */
|
/* Chop off the variant. Chop it off at the '_'. */
|
||||||
ptr = search_string;
|
ptr = search_string;
|
||||||
while (*ptr) {
|
while (*ptr) {
|
||||||
*ptr = tolower(*ptr);
|
*ptr = (char)tolower(*ptr);
|
||||||
if (*ptr == '_') {
|
if (*ptr == '_') {
|
||||||
*ptr = '\0';
|
*ptr = '\0';
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -134,7 +134,6 @@ static wchar_t *utf8_to_wchar_t(const char *utf8)
|
|||||||
* Use register_error_str(NULL) to free the error message completely. */
|
* Use register_error_str(NULL) to free the error message completely. */
|
||||||
static void register_error_str(wchar_t **error_str, const char *msg)
|
static void register_error_str(wchar_t **error_str, const char *msg)
|
||||||
{
|
{
|
||||||
free(*error_str);
|
|
||||||
#ifdef HIDAPI_USING_SDL_RUNTIME
|
#ifdef HIDAPI_USING_SDL_RUNTIME
|
||||||
/* Thread-safe error handling */
|
/* Thread-safe error handling */
|
||||||
if (msg) {
|
if (msg) {
|
||||||
@@ -143,6 +142,7 @@ static void register_error_str(wchar_t **error_str, const char *msg)
|
|||||||
SDL_ClearError();
|
SDL_ClearError();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
free(*error_str);
|
||||||
*error_str = utf8_to_wchar_t(msg);
|
*error_str = utf8_to_wchar_t(msg);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -311,7 +311,7 @@ void SDL_PrivateGamepadAdded(SDL_JoystickID instance_id)
|
|||||||
{
|
{
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
|
|
||||||
if (!SDL_gamepads_initialized) {
|
if (!SDL_gamepads_initialized || SDL_IsJoystickBeingAdded()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2683,8 +2683,8 @@ bool SDL_ShouldIgnoreGamepad(Uint16 vendor_id, Uint16 product_id, Uint16 version
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (name && SDL_strcmp(name, "uinput-fpc") == 0) {
|
if (name && SDL_startswith(name, "uinput-")) {
|
||||||
// The Google Pixel fingerprint sensor reports itself as a joystick
|
// The Google Pixel fingerprint sensor, as well as other fingerprint sensors, reports itself as a joystick
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2143,6 +2143,7 @@ void SDL_PrivateJoystickAdded(SDL_JoystickID instance_id)
|
|||||||
SDL_JoystickDriver *driver;
|
SDL_JoystickDriver *driver;
|
||||||
int device_index;
|
int device_index;
|
||||||
int player_index = -1;
|
int player_index = -1;
|
||||||
|
bool is_gamepad;
|
||||||
|
|
||||||
SDL_AssertJoysticksLocked();
|
SDL_AssertJoysticksLocked();
|
||||||
|
|
||||||
@@ -2177,9 +2178,12 @@ void SDL_PrivateJoystickAdded(SDL_JoystickID instance_id)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This might create an automatic gamepad mapping, so wait to send the event
|
||||||
|
is_gamepad = SDL_IsGamepad(instance_id);
|
||||||
|
|
||||||
SDL_joystick_being_added = false;
|
SDL_joystick_being_added = false;
|
||||||
|
|
||||||
if (SDL_IsGamepad(instance_id)) {
|
if (is_gamepad) {
|
||||||
SDL_PrivateGamepadAdded(instance_id);
|
SDL_PrivateGamepadAdded(instance_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -328,6 +328,10 @@ void Android_AddJoystick(int device_id, const char *name, const char *desc, int
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (SDL_ShouldIgnoreJoystick(vendor_id, product_id, 0, name)) {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_JOYSTICK
|
#ifdef DEBUG_JOYSTICK
|
||||||
SDL_Log("Joystick: %s, descriptor %s, vendor = 0x%.4x, product = 0x%.4x, %d axes, %d hats", name, desc, vendor_id, product_id, naxes, nhats);
|
SDL_Log("Joystick: %s, descriptor %s, vendor = 0x%.4x, product = 0x%.4x, %d axes, %d hats", name, desc, vendor_id, product_id, naxes, nhats);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
|
|
||||||
static const ControllerDescription_t arrControllers[] = {
|
static const ControllerDescription_t arrControllers[] = {
|
||||||
{ MAKE_CONTROLLER_ID( 0x0079, 0x181a ), k_eControllerType_PS3Controller, NULL }, // Venom Arcade Stick
|
{ MAKE_CONTROLLER_ID( 0x0079, 0x181a ), k_eControllerType_PS3Controller, NULL }, // Venom Arcade Stick
|
||||||
{ MAKE_CONTROLLER_ID( 0x0079, 0x1844 ), k_eControllerType_PS3Controller, NULL }, // From SDL
|
|
||||||
{ MAKE_CONTROLLER_ID( 0x044f, 0xb315 ), k_eControllerType_PS3Controller, NULL }, // Firestorm Dual Analog 3
|
{ MAKE_CONTROLLER_ID( 0x044f, 0xb315 ), k_eControllerType_PS3Controller, NULL }, // Firestorm Dual Analog 3
|
||||||
{ MAKE_CONTROLLER_ID( 0x044f, 0xd007 ), k_eControllerType_PS3Controller, NULL }, // Thrustmaster wireless 3-1
|
{ MAKE_CONTROLLER_ID( 0x044f, 0xd007 ), k_eControllerType_PS3Controller, NULL }, // Thrustmaster wireless 3-1
|
||||||
{ MAKE_CONTROLLER_ID( 0x046d, 0xcad1 ), k_eControllerType_PS3Controller, NULL }, // Logitech Chillstream
|
{ MAKE_CONTROLLER_ID( 0x046d, 0xcad1 ), k_eControllerType_PS3Controller, NULL }, // Logitech Chillstream
|
||||||
|
|||||||
@@ -305,6 +305,7 @@ static SDL_JoystickID EMSCRIPTEN_JoystickGetDeviceInstanceID(int device_index)
|
|||||||
static bool EMSCRIPTEN_JoystickOpen(SDL_Joystick *joystick, int device_index)
|
static bool EMSCRIPTEN_JoystickOpen(SDL_Joystick *joystick, int device_index)
|
||||||
{
|
{
|
||||||
SDL_joylist_item *item = JoystickByDeviceIndex(device_index);
|
SDL_joylist_item *item = JoystickByDeviceIndex(device_index);
|
||||||
|
bool rumble_available = false;
|
||||||
|
|
||||||
if (!item) {
|
if (!item) {
|
||||||
return SDL_SetError("No such device");
|
return SDL_SetError("No such device");
|
||||||
@@ -323,6 +324,22 @@ static bool EMSCRIPTEN_JoystickOpen(SDL_Joystick *joystick, int device_index)
|
|||||||
joystick->nbuttons = item->nbuttons;
|
joystick->nbuttons = item->nbuttons;
|
||||||
joystick->naxes = item->naxes;
|
joystick->naxes = item->naxes;
|
||||||
|
|
||||||
|
rumble_available = EM_ASM_INT({
|
||||||
|
let gamepads = navigator['getGamepads']();
|
||||||
|
if (!gamepads) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
let gamepad = gamepads[$0];
|
||||||
|
if (!gamepad || !gamepad['vibrationActuator']) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}, item->index);
|
||||||
|
|
||||||
|
if (rumble_available) {
|
||||||
|
SDL_SetBooleanProperty(SDL_GetJoystickProperties(joystick), SDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN, true);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -390,7 +407,29 @@ static SDL_GUID EMSCRIPTEN_JoystickGetDeviceGUID(int device_index)
|
|||||||
|
|
||||||
static bool EMSCRIPTEN_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble)
|
static bool EMSCRIPTEN_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble)
|
||||||
{
|
{
|
||||||
return SDL_Unsupported();
|
SDL_joylist_item *item = (SDL_joylist_item *)joystick->hwdata;
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
bool result = EM_ASM_INT({
|
||||||
|
let gamepads = navigator['getGamepads']();
|
||||||
|
if (!gamepads) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
let gamepad = gamepads[$0];
|
||||||
|
if (!gamepad || !gamepad['vibrationActuator']) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
gamepad['vibrationActuator']['playEffect']('dual-rumble', {
|
||||||
|
'startDelay': 0,
|
||||||
|
'duration': 3000,
|
||||||
|
'weakMagnitude': $1 / 0xFFFF,
|
||||||
|
'strongMagnitude': $2 / 0xFFFF,
|
||||||
|
});
|
||||||
|
return 1;
|
||||||
|
}, item->index, low_frequency_rumble, high_frequency_rumble);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool EMSCRIPTEN_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble)
|
static bool EMSCRIPTEN_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble)
|
||||||
|
|||||||
@@ -471,7 +471,7 @@ bool SDL_SendJoystickVirtualSensorDataInner(SDL_Joystick *joystick, SDL_SensorTy
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
hwdata->sensor_events = sensor_events;
|
hwdata->sensor_events = sensor_events;
|
||||||
hwdata->max_sensor_events = hwdata->max_sensor_events;
|
hwdata->max_sensor_events = new_max_sensor_events;
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualSensorEvent *event = &hwdata->sensor_events[hwdata->num_sensor_events++];
|
VirtualSensorEvent *event = &hwdata->sensor_events[hwdata->num_sensor_events++];
|
||||||
|
|||||||
@@ -3306,10 +3306,6 @@ bool SDL_SetRenderDrawBlendMode(SDL_Renderer *renderer, SDL_BlendMode blendMode)
|
|||||||
return SDL_InvalidParamError("blendMode");
|
return SDL_InvalidParamError("blendMode");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blendMode == SDL_BLENDMODE_INVALID) {
|
|
||||||
return SDL_InvalidParamError("blendMode");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!IsSupportedBlendMode(renderer, blendMode)) {
|
if (!IsSupportedBlendMode(renderer, blendMode)) {
|
||||||
return SDL_Unsupported();
|
return SDL_Unsupported();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1651,6 +1651,8 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
} else {
|
} else {
|
||||||
renderdata->glGenTextures(1, &data->texture_v);
|
renderdata->glGenTextures(1, &data->texture_v);
|
||||||
if (!GL_CheckError("glGenTexures()", renderer)) {
|
if (!GL_CheckError("glGenTexures()", renderer)) {
|
||||||
|
SDL_free(data->pixel_data);
|
||||||
|
SDL_free(data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1665,6 +1667,8 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
} else {
|
} else {
|
||||||
renderdata->glGenTextures(1, &data->texture_u);
|
renderdata->glGenTextures(1, &data->texture_u);
|
||||||
if (!GL_CheckError("glGenTexures()", renderer)) {
|
if (!GL_CheckError("glGenTexures()", renderer)) {
|
||||||
|
SDL_free(data->pixel_data);
|
||||||
|
SDL_free(data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1672,11 +1676,15 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
renderdata->glBindTexture(data->texture_type, data->texture_u);
|
renderdata->glBindTexture(data->texture_type, data->texture_u);
|
||||||
renderdata->glTexImage2D(data->texture_type, 0, format, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, format, type, NULL);
|
renderdata->glTexImage2D(data->texture_type, 0, format, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, format, type, NULL);
|
||||||
if (!GL_CheckError("glTexImage2D()", renderer)) {
|
if (!GL_CheckError("glTexImage2D()", renderer)) {
|
||||||
|
SDL_free(data->pixel_data);
|
||||||
|
SDL_free(data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER, data->texture_u);
|
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER, data->texture_u);
|
||||||
|
|
||||||
if (!SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8)) {
|
if (!SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8)) {
|
||||||
|
SDL_free(data->pixel_data);
|
||||||
|
SDL_free(data);
|
||||||
return SDL_SetError("Unsupported YUV colorspace");
|
return SDL_SetError("Unsupported YUV colorspace");
|
||||||
}
|
}
|
||||||
} else if (data->nv12) {
|
} else if (data->nv12) {
|
||||||
@@ -1686,6 +1694,8 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
} else {
|
} else {
|
||||||
renderdata->glGenTextures(1, &data->texture_u);
|
renderdata->glGenTextures(1, &data->texture_u);
|
||||||
if (!GL_CheckError("glGenTexures()", renderer)) {
|
if (!GL_CheckError("glGenTexures()", renderer)) {
|
||||||
|
SDL_free(data->pixel_data);
|
||||||
|
SDL_free(data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1693,11 +1703,15 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
renderdata->glBindTexture(data->texture_type, data->texture_u);
|
renderdata->glBindTexture(data->texture_type, data->texture_u);
|
||||||
renderdata->glTexImage2D(data->texture_type, 0, GL_LUMINANCE_ALPHA, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
renderdata->glTexImage2D(data->texture_type, 0, GL_LUMINANCE_ALPHA, (texture->w + 1) / 2, (texture->h + 1) / 2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
||||||
if (!GL_CheckError("glTexImage2D()", renderer)) {
|
if (!GL_CheckError("glTexImage2D()", renderer)) {
|
||||||
|
SDL_free(data->pixel_data);
|
||||||
|
SDL_free(data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER, data->texture_u);
|
SDL_SetNumberProperty(SDL_GetTextureProperties(texture), SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER, data->texture_u);
|
||||||
|
|
||||||
if (!SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8)) {
|
if (!SDL_GetYCbCRtoRGBConversionMatrix(texture->colorspace, texture->w, texture->h, 8)) {
|
||||||
|
SDL_free(data->pixel_data);
|
||||||
|
SDL_free(data);
|
||||||
return SDL_SetError("Unsupported YUV colorspace");
|
return SDL_SetError("Unsupported YUV colorspace");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1709,6 +1723,8 @@ static bool GLES2_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, SD
|
|||||||
} else {
|
} else {
|
||||||
renderdata->glGenTextures(1, &data->texture);
|
renderdata->glGenTextures(1, &data->texture);
|
||||||
if (!GL_CheckError("glGenTexures()", renderer)) {
|
if (!GL_CheckError("glGenTexures()", renderer)) {
|
||||||
|
SDL_free(data->pixel_data);
|
||||||
|
SDL_free(data);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,12 @@
|
|||||||
#define environ (*_NSGetEnviron())
|
#define environ (*_NSGetEnviron())
|
||||||
#elif defined(SDL_PLATFORM_FREEBSD)
|
#elif defined(SDL_PLATFORM_FREEBSD)
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#define environ ((char **)dlsym(RTLD_DEFAULT, "environ"))
|
static char **get_environ_rtld(void)
|
||||||
|
{
|
||||||
|
char ***environ_rtld = (char ***)dlsym(RTLD_DEFAULT, "environ");
|
||||||
|
return environ_rtld ? *environ_rtld : NULL;
|
||||||
|
}
|
||||||
|
#define environ (get_environ_rtld())
|
||||||
#else
|
#else
|
||||||
extern char **environ;
|
extern char **environ;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1478,6 +1478,13 @@ DLMALLOC_EXPORT int mspace_mallopt(int, int);
|
|||||||
#endif /* NO_MALLOC_STATS */
|
#endif /* NO_MALLOC_STATS */
|
||||||
#ifndef LACKS_ERRNO_H
|
#ifndef LACKS_ERRNO_H
|
||||||
#include <errno.h> /* for MALLOC_FAILURE_ACTION */
|
#include <errno.h> /* for MALLOC_FAILURE_ACTION */
|
||||||
|
#else /* LACKS_ERRNO_H */
|
||||||
|
#ifndef EINVAL
|
||||||
|
#define EINVAL 22
|
||||||
|
#endif
|
||||||
|
#ifndef ENOMEM
|
||||||
|
#define ENOMEM 12
|
||||||
|
#endif
|
||||||
#endif /* LACKS_ERRNO_H */
|
#endif /* LACKS_ERRNO_H */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#if ABORT_ON_ASSERT_FAILURE
|
#if ABORT_ON_ASSERT_FAILURE
|
||||||
|
|||||||
@@ -42,6 +42,10 @@ void SDL_CancelClipboardData(Uint32 sequence)
|
|||||||
{
|
{
|
||||||
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
||||||
|
|
||||||
|
if (!_this) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (sequence && sequence != _this->clipboard_sequence) {
|
if (sequence && sequence != _this->clipboard_sequence) {
|
||||||
// This clipboard data was already canceled
|
// This clipboard data was already canceled
|
||||||
return;
|
return;
|
||||||
@@ -62,6 +66,10 @@ bool SDL_SaveClipboardMimeTypes(const char **mime_types, size_t num_mime_types)
|
|||||||
{
|
{
|
||||||
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
||||||
|
|
||||||
|
if (!_this) {
|
||||||
|
return SDL_UninitializedVideo();
|
||||||
|
}
|
||||||
|
|
||||||
SDL_FreeClipboardMimeTypes(_this);
|
SDL_FreeClipboardMimeTypes(_this);
|
||||||
|
|
||||||
if (mime_types && num_mime_types > 0) {
|
if (mime_types && num_mime_types > 0) {
|
||||||
@@ -234,13 +242,11 @@ bool SDL_HasClipboardData(const char *mime_type)
|
|||||||
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
SDL_VideoDevice *_this = SDL_GetVideoDevice();
|
||||||
|
|
||||||
if (!_this) {
|
if (!_this) {
|
||||||
SDL_UninitializedVideo();
|
return SDL_UninitializedVideo();
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mime_type) {
|
if (!mime_type) {
|
||||||
SDL_InvalidParamError("mime_type");
|
return SDL_InvalidParamError("mime_type");
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_this->HasClipboardData) {
|
if (_this->HasClipboardData) {
|
||||||
|
|||||||
@@ -1247,7 +1247,7 @@ bool SDL_BlitSurfaceScaled(SDL_Surface *src, const SDL_Rect *srcrect, SDL_Surfac
|
|||||||
// Clip again
|
// Clip again
|
||||||
SDL_GetRectIntersection(clip_rect, &final_dst, &final_dst);
|
SDL_GetRectIntersection(clip_rect, &final_dst, &final_dst);
|
||||||
|
|
||||||
if (final_dst.w == 0 || final_dst.h == 0 ||
|
if (final_dst.w <= 0 || final_dst.h <= 0 ||
|
||||||
final_src.w < 0 || final_src.h < 0) {
|
final_src.w < 0 || final_src.h < 0) {
|
||||||
// No-op.
|
// No-op.
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
+12
-1
@@ -173,6 +173,7 @@ static VideoBootStrap *bootstrap[] = {
|
|||||||
#if defined(SDL_PLATFORM_MACOS) && defined(SDL_VIDEO_DRIVER_COCOA)
|
#if defined(SDL_PLATFORM_MACOS) && defined(SDL_VIDEO_DRIVER_COCOA)
|
||||||
// Support for macOS fullscreen spaces, etc.
|
// Support for macOS fullscreen spaces, etc.
|
||||||
extern bool Cocoa_IsWindowInFullscreenSpace(SDL_Window *window);
|
extern bool Cocoa_IsWindowInFullscreenSpace(SDL_Window *window);
|
||||||
|
extern bool Cocoa_IsWindowInFullscreenSpaceTransition(SDL_Window *window);
|
||||||
extern bool Cocoa_SetWindowFullscreenSpace(SDL_Window *window, bool state, bool blocking);
|
extern bool Cocoa_SetWindowFullscreenSpace(SDL_Window *window, bool state, bool blocking);
|
||||||
extern bool Cocoa_IsShowingModalDialog(SDL_Window *window);
|
extern bool Cocoa_IsShowingModalDialog(SDL_Window *window);
|
||||||
#endif
|
#endif
|
||||||
@@ -1162,7 +1163,7 @@ float SDL_GetDisplayContentScale(SDL_DisplayID displayID)
|
|||||||
|
|
||||||
void SDL_SetWindowHDRProperties(SDL_Window *window, const SDL_HDROutputProperties *HDR, bool send_event)
|
void SDL_SetWindowHDRProperties(SDL_Window *window, const SDL_HDROutputProperties *HDR, bool send_event)
|
||||||
{
|
{
|
||||||
if (window->HDR.HDR_headroom != HDR->HDR_headroom || window->HDR.SDR_white_level != window->HDR.SDR_white_level) {
|
if (window->HDR.HDR_headroom != HDR->HDR_headroom || window->HDR.SDR_white_level != HDR->SDR_white_level) {
|
||||||
SDL_PropertiesID window_props = SDL_GetWindowProperties(window);
|
SDL_PropertiesID window_props = SDL_GetWindowProperties(window);
|
||||||
|
|
||||||
SDL_SetFloatProperty(window_props, SDL_PROP_WINDOW_HDR_HEADROOM_FLOAT, SDL_max(HDR->HDR_headroom, 1.0f));
|
SDL_SetFloatProperty(window_props, SDL_PROP_WINDOW_HDR_HEADROOM_FLOAT, SDL_max(HDR->HDR_headroom, 1.0f));
|
||||||
@@ -2111,6 +2112,16 @@ bool SDL_SetWindowFullscreenMode(SDL_Window *window, const SDL_DisplayMode *mode
|
|||||||
* is in progress. It will be overwritten if a new request is made.
|
* is in progress. It will be overwritten if a new request is made.
|
||||||
*/
|
*/
|
||||||
SDL_copyp(&window->current_fullscreen_mode, &window->requested_fullscreen_mode);
|
SDL_copyp(&window->current_fullscreen_mode, &window->requested_fullscreen_mode);
|
||||||
|
|
||||||
|
#if defined(SDL_PLATFORM_MACOS) && defined(SDL_VIDEO_DRIVER_COCOA)
|
||||||
|
/* If this is called while in the middle of a Cocoa fullscreen spaces transition,
|
||||||
|
* wait until the transition has completed, or the window can wind up in a weird,
|
||||||
|
* broken state if a mode switch occurs while in a fullscreen space.
|
||||||
|
*/
|
||||||
|
if (SDL_strcmp(_this->name, "cocoa") == 0 && Cocoa_IsWindowInFullscreenSpaceTransition(window)) {
|
||||||
|
SDL_SyncWindow(window);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (SDL_WINDOW_FULLSCREEN_VISIBLE(window)) {
|
if (SDL_WINDOW_FULLSCREEN_VISIBLE(window)) {
|
||||||
SDL_UpdateFullscreenMode(window, SDL_FULLSCREEN_OP_UPDATE, true);
|
SDL_UpdateFullscreenMode(window, SDL_FULLSCREEN_OP_UPDATE, true);
|
||||||
SDL_SyncIfRequired(window);
|
SDL_SyncIfRequired(window);
|
||||||
|
|||||||
@@ -47,6 +47,25 @@ void Android_QuitTouch(void)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SDL_TouchID Android_ConvertJavaTouchID(int touchID)
|
||||||
|
{
|
||||||
|
SDL_TouchID retval = touchID;
|
||||||
|
|
||||||
|
if (touchID < 0) {
|
||||||
|
// Touch ID -1 appears when using Android emulator, eg:
|
||||||
|
// adb shell input mouse tap 100 100
|
||||||
|
// adb shell input touchscreen tap 100 100
|
||||||
|
//
|
||||||
|
// Prevent to be -1, since it's used in SDL internal for synthetic events:
|
||||||
|
retval -= 1;
|
||||||
|
} else {
|
||||||
|
// Touch ID 0 is invalid
|
||||||
|
retval += 1;
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
void Android_OnTouch(SDL_Window *window, int touch_device_id_in, int pointer_finger_id_in, int action, float x, float y, float p)
|
void Android_OnTouch(SDL_Window *window, int touch_device_id_in, int pointer_finger_id_in, int action, float x, float y, float p)
|
||||||
{
|
{
|
||||||
SDL_TouchID touchDeviceId = 0;
|
SDL_TouchID touchDeviceId = 0;
|
||||||
@@ -56,11 +75,7 @@ void Android_OnTouch(SDL_Window *window, int touch_device_id_in, int pointer_fin
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Touch device -1 appears when using Android emulator, eg:
|
touchDeviceId = Android_ConvertJavaTouchID(touch_device_id_in);
|
||||||
* adb shell input mouse tap 100 100
|
|
||||||
* adb shell input touchscreen tap 100 100
|
|
||||||
*/
|
|
||||||
touchDeviceId = (SDL_TouchID)(touch_device_id_in + 2);
|
|
||||||
|
|
||||||
// Finger ID should be greater than 0
|
// Finger ID should be greater than 0
|
||||||
fingerId = (SDL_FingerID)(pointer_finger_id_in + 1);
|
fingerId = (SDL_FingerID)(pointer_finger_id_in + 1);
|
||||||
|
|||||||
@@ -25,3 +25,4 @@
|
|||||||
extern void Android_InitTouch(void);
|
extern void Android_InitTouch(void);
|
||||||
extern void Android_QuitTouch(void);
|
extern void Android_QuitTouch(void);
|
||||||
extern void Android_OnTouch(SDL_Window *window, int touch_device_id_in, int pointer_finger_id_in, int action, float x, float y, float p);
|
extern void Android_OnTouch(SDL_Window *window, int touch_device_id_in, int pointer_finger_id_in, int action, float x, float y, float p);
|
||||||
|
extern SDL_TouchID Android_ConvertJavaTouchID(int touchID);
|
||||||
@@ -411,6 +411,19 @@ bool Cocoa_IsWindowInFullscreenSpace(SDL_Window *window)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Cocoa_IsWindowInFullscreenSpaceTransition(SDL_Window *window)
|
||||||
|
{
|
||||||
|
@autoreleasepool {
|
||||||
|
SDL_CocoaWindowData *data = (__bridge SDL_CocoaWindowData *)window->internal;
|
||||||
|
|
||||||
|
if ([data.listener isInFullscreenSpaceTransition]) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool Cocoa_IsWindowZoomed(SDL_Window *window)
|
bool Cocoa_IsWindowZoomed(SDL_Window *window)
|
||||||
{
|
{
|
||||||
SDL_CocoaWindowData *data = (__bridge SDL_CocoaWindowData *)window->internal;
|
SDL_CocoaWindowData *data = (__bridge SDL_CocoaWindowData *)window->internal;
|
||||||
@@ -1199,21 +1212,27 @@ static NSCursor *Cocoa_GetDesiredCursor(void)
|
|||||||
|
|
||||||
ScheduleContextUpdates(_data);
|
ScheduleContextUpdates(_data);
|
||||||
|
|
||||||
/* isZoomed always returns true if the window is not resizable
|
/* The OS can resize the window automatically if the display density
|
||||||
* and fullscreen windows are considered zoomed.
|
* changes while the window is miniaturized or hidden.
|
||||||
*/
|
*/
|
||||||
if ((window->flags & SDL_WINDOW_RESIZABLE) && [nswindow isZoomed] &&
|
if ([nswindow isVisible])
|
||||||
!(window->flags & SDL_WINDOW_FULLSCREEN) && ![self isInFullscreenSpace]) {
|
{
|
||||||
zoomed = YES;
|
/* isZoomed always returns true if the window is not resizable
|
||||||
} else {
|
* and fullscreen windows are considered zoomed.
|
||||||
zoomed = NO;
|
*/
|
||||||
}
|
if ((window->flags & SDL_WINDOW_RESIZABLE) && [nswindow isZoomed] &&
|
||||||
if (!zoomed) {
|
!(window->flags & SDL_WINDOW_FULLSCREEN) && ![self isInFullscreenSpace]) {
|
||||||
SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_RESTORED, 0, 0);
|
zoomed = YES;
|
||||||
} else {
|
} else {
|
||||||
SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_MAXIMIZED, 0, 0);
|
zoomed = NO;
|
||||||
if ([self windowOperationIsPending:PENDING_OPERATION_MINIMIZE]) {
|
}
|
||||||
[nswindow miniaturize:nil];
|
if (!zoomed) {
|
||||||
|
SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_RESTORED, 0, 0);
|
||||||
|
} else {
|
||||||
|
SDL_SendWindowEvent(window, SDL_EVENT_WINDOW_MAXIMIZED, 0, 0);
|
||||||
|
if ([self windowOperationIsPending:PENDING_OPERATION_MINIMIZE]) {
|
||||||
|
[nswindow miniaturize:nil];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1540,7 +1540,7 @@ static SDL_VideoDevice *OPENVR_CreateDevice(void)
|
|||||||
SDL_SetError("Could not get interfaces for the OpenVR System (%s), Overlay (%s) and Input (%s) versions", IVRSystem_Version, IVROverlay_Version, IVRInput_Version);
|
SDL_SetError("Could not get interfaces for the OpenVR System (%s), Overlay (%s) and Input (%s) versions", IVRSystem_Version, IVROverlay_Version, IVRInput_Version);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *hint = SDL_GetHint("SDL_OPENVR_INPUT_PROFILE");
|
hint = SDL_GetHint("SDL_OPENVR_INPUT_PROFILE");
|
||||||
char *loadpath = 0;
|
char *loadpath = 0;
|
||||||
EVRInputError err;
|
EVRInputError err;
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,48 @@
|
|||||||
*/
|
*/
|
||||||
#define PIPE_TIMEOUT_NS SDL_MS_TO_NS(14)
|
#define PIPE_TIMEOUT_NS SDL_MS_TO_NS(14)
|
||||||
|
|
||||||
|
/* sigtimedwait() is an optional part of POSIX.1-2001, and OpenBSD doesn't implement it.
|
||||||
|
* Based on https://comp.unix.programmer.narkive.com/rEDH0sPT/sigtimedwait-implementation
|
||||||
|
*/
|
||||||
|
#ifndef HAVE_SIGTIMEDWAIT
|
||||||
|
#include <errno.h>
|
||||||
|
#include <time.h>
|
||||||
|
static int sigtimedwait(const sigset_t *set, siginfo_t *info, const struct timespec *timeout)
|
||||||
|
{
|
||||||
|
struct timespec elapsed = { 0 }, rem = { 0 };
|
||||||
|
sigset_t pending;
|
||||||
|
|
||||||
|
do {
|
||||||
|
// Check the pending signals, and call sigwait if there is at least one of interest in the set.
|
||||||
|
sigpending(&pending);
|
||||||
|
for (int signo = 1; signo < NSIG; ++signo) {
|
||||||
|
if (sigismember(set, signo) && sigismember(&pending, signo)) {
|
||||||
|
if (!sigwait(set, &signo)) {
|
||||||
|
if (info) {
|
||||||
|
SDL_memset(info, 0, sizeof *info);
|
||||||
|
info->si_signo = signo;
|
||||||
|
}
|
||||||
|
return signo;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timeout->tv_sec || timeout->tv_nsec) {
|
||||||
|
long ns = 20000000L; // 2/100ths of a second
|
||||||
|
nanosleep(&(struct timespec){ 0, ns }, &rem);
|
||||||
|
ns -= rem.tv_nsec;
|
||||||
|
elapsed.tv_sec += (elapsed.tv_nsec + ns) / 1000000000L;
|
||||||
|
elapsed.tv_nsec = (elapsed.tv_nsec + ns) % 1000000000L;
|
||||||
|
}
|
||||||
|
} while (elapsed.tv_sec < timeout->tv_sec || (elapsed.tv_sec == timeout->tv_sec && elapsed.tv_nsec < timeout->tv_nsec));
|
||||||
|
|
||||||
|
errno = EAGAIN;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static ssize_t write_pipe(int fd, const void *buffer, size_t total_length, size_t *pos)
|
static ssize_t write_pipe(int fd, const void *buffer, size_t total_length, size_t *pos)
|
||||||
{
|
{
|
||||||
int ready = 0;
|
int ready = 0;
|
||||||
@@ -76,7 +118,7 @@ static ssize_t write_pipe(int fd, const void *buffer, size_t total_length, size_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sigtimedwait(&sig_set, 0, &zerotime);
|
sigtimedwait(&sig_set, NULL, &zerotime);
|
||||||
|
|
||||||
#ifdef SDL_THREADS_DISABLED
|
#ifdef SDL_THREADS_DISABLED
|
||||||
sigprocmask(SIG_SETMASK, &old_sig_set, NULL);
|
sigprocmask(SIG_SETMASK, &old_sig_set, NULL);
|
||||||
|
|||||||
@@ -215,32 +215,32 @@ static void EnsurePopupPositionIsValid(SDL_Window *window, int *x, int *y)
|
|||||||
int adj_count = 0;
|
int adj_count = 0;
|
||||||
|
|
||||||
/* Per the xdg-positioner spec, child popup windows must intersect or at
|
/* Per the xdg-positioner spec, child popup windows must intersect or at
|
||||||
* least be partially adjacent to the parent window.
|
* least be partially adjoining the parent window.
|
||||||
*
|
*
|
||||||
* Failure to ensure this on a compositor that enforces this restriction
|
* Failure to ensure this on a compositor that enforces this restriction
|
||||||
* can result in behavior ranging from the window being spuriously closed
|
* can result in behavior ranging from the window being spuriously closed
|
||||||
* to a protocol violation.
|
* to a protocol violation.
|
||||||
*/
|
*/
|
||||||
if (*x + window->w < 0) {
|
if (*x + window->w <= 0) {
|
||||||
*x = -window->w;
|
*x = -window->w;
|
||||||
++adj_count;
|
++adj_count;
|
||||||
}
|
}
|
||||||
if (*y + window->h < 0) {
|
if (*y + window->h <= 0) {
|
||||||
*y = -window->h;
|
*y = -window->h;
|
||||||
++adj_count;
|
++adj_count;
|
||||||
}
|
}
|
||||||
if (*x > window->parent->w) {
|
if (*x >= window->parent->w) {
|
||||||
*x = window->parent->w;
|
*x = window->parent->w;
|
||||||
++adj_count;
|
++adj_count;
|
||||||
}
|
}
|
||||||
if (*y > window->parent->h) {
|
if (*y >= window->parent->h) {
|
||||||
*y = window->parent->h;
|
*y = window->parent->h;
|
||||||
++adj_count;
|
++adj_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If adjustment was required on the x and y axes, the popup is aligned with
|
/* If adjustment was required on the x and y axes, the popup is aligned with
|
||||||
* the parent corner-to-corner and is neither overlapping nor adjacent, so it
|
* the parent corner-to-corner and is neither overlapping nor adjoining, so it
|
||||||
* must be nudged by 1 to be considered adjacent.
|
* must be nudged by 1 to be considered adjoining.
|
||||||
*/
|
*/
|
||||||
if (adj_count > 1) {
|
if (adj_count > 1) {
|
||||||
*x += *x < 0 ? 1 : -1;
|
*x += *x < 0 ? 1 : -1;
|
||||||
@@ -2116,12 +2116,6 @@ void Wayland_HideWindow(SDL_VideoDevice *_this, SDL_Window *window)
|
|||||||
wind->server_decoration = NULL;
|
wind->server_decoration = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Be sure to detach after this is done, otherwise ShowWindow crashes!
|
|
||||||
if (wind->shell_surface_type != WAYLAND_SHELL_SURFACE_TYPE_XDG_POPUP) {
|
|
||||||
wl_surface_attach(wind->surface, NULL, 0, 0);
|
|
||||||
wl_surface_commit(wind->surface);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clean up the export handle.
|
// Clean up the export handle.
|
||||||
if (wind->exported) {
|
if (wind->exported) {
|
||||||
zxdg_exported_v2_destroy(wind->exported);
|
zxdg_exported_v2_destroy(wind->exported);
|
||||||
@@ -2159,6 +2153,10 @@ void Wayland_HideWindow(SDL_VideoDevice *_this, SDL_Window *window)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Attach a null buffer to unmap the surface.
|
||||||
|
wl_surface_attach(wind->surface, NULL, 0, 0);
|
||||||
|
wl_surface_commit(wind->surface);
|
||||||
|
|
||||||
SDL_zero(wind->shell_surface);
|
SDL_zero(wind->shell_surface);
|
||||||
wind->show_hide_sync_required = true;
|
wind->show_hide_sync_required = true;
|
||||||
struct wl_callback *cb = wl_display_sync(_this->internal->display);
|
struct wl_callback *cb = wl_display_sync(_this->internal->display);
|
||||||
|
|||||||
@@ -2201,7 +2201,7 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
|
|||||||
|
|
||||||
case WM_NCCALCSIZE:
|
case WM_NCCALCSIZE:
|
||||||
{
|
{
|
||||||
SDL_WindowFlags window_flags = SDL_GetWindowFlags(data->window);
|
SDL_WindowFlags window_flags = data->window->flags;
|
||||||
if (wParam == TRUE && (window_flags & SDL_WINDOW_BORDERLESS) && !(window_flags & SDL_WINDOW_FULLSCREEN)) {
|
if (wParam == TRUE && (window_flags & SDL_WINDOW_BORDERLESS) && !(window_flags & SDL_WINDOW_FULLSCREEN)) {
|
||||||
// When borderless, need to tell windows that the size of the non-client area is 0
|
// When borderless, need to tell windows that the size of the non-client area is 0
|
||||||
NCCALCSIZE_PARAMS *params = (NCCALCSIZE_PARAMS *)lParam;
|
NCCALCSIZE_PARAMS *params = (NCCALCSIZE_PARAMS *)lParam;
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ static bool X11_KeyRepeat(Display *display, XEvent *event)
|
|||||||
return d.found;
|
return d.found;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool X11_IsWheelEvent(Display *display, int button, int *xticks, int *yticks)
|
bool X11_IsWheelEvent(int button, int *xticks, int *yticks)
|
||||||
{
|
{
|
||||||
/* according to the xlib docs, no specific mouse wheel events exist.
|
/* according to the xlib docs, no specific mouse wheel events exist.
|
||||||
However, the defacto standard is that the vertical wheel is X buttons
|
However, the defacto standard is that the vertical wheel is X buttons
|
||||||
@@ -1016,8 +1016,6 @@ void X11_HandleKeyEvent(SDL_VideoDevice *_this, SDL_WindowData *windowdata, SDL_
|
|||||||
void X11_HandleButtonPress(SDL_VideoDevice *_this, SDL_WindowData *windowdata, SDL_MouseID mouseID, int button, float x, float y, unsigned long time)
|
void X11_HandleButtonPress(SDL_VideoDevice *_this, SDL_WindowData *windowdata, SDL_MouseID mouseID, int button, float x, float y, unsigned long time)
|
||||||
{
|
{
|
||||||
SDL_Window *window = windowdata->window;
|
SDL_Window *window = windowdata->window;
|
||||||
const SDL_VideoData *videodata = _this->internal;
|
|
||||||
Display *display = videodata->display;
|
|
||||||
int xticks = 0, yticks = 0;
|
int xticks = 0, yticks = 0;
|
||||||
Uint64 timestamp = X11_GetEventTimestamp(time);
|
Uint64 timestamp = X11_GetEventTimestamp(time);
|
||||||
|
|
||||||
@@ -1031,7 +1029,7 @@ void X11_HandleButtonPress(SDL_VideoDevice *_this, SDL_WindowData *windowdata, S
|
|||||||
SDL_SendMouseMotion(timestamp, window, mouseID, false, x, y);
|
SDL_SendMouseMotion(timestamp, window, mouseID, false, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (X11_IsWheelEvent(display, button, &xticks, &yticks)) {
|
if (X11_IsWheelEvent(button, &xticks, &yticks)) {
|
||||||
SDL_SendMouseWheel(timestamp, window, mouseID, (float)-xticks, (float)yticks, SDL_MOUSEWHEEL_NORMAL);
|
SDL_SendMouseWheel(timestamp, window, mouseID, (float)-xticks, (float)yticks, SDL_MOUSEWHEEL_NORMAL);
|
||||||
} else {
|
} else {
|
||||||
bool ignore_click = false;
|
bool ignore_click = false;
|
||||||
@@ -1063,8 +1061,6 @@ void X11_HandleButtonPress(SDL_VideoDevice *_this, SDL_WindowData *windowdata, S
|
|||||||
void X11_HandleButtonRelease(SDL_VideoDevice *_this, SDL_WindowData *windowdata, SDL_MouseID mouseID, int button, unsigned long time)
|
void X11_HandleButtonRelease(SDL_VideoDevice *_this, SDL_WindowData *windowdata, SDL_MouseID mouseID, int button, unsigned long time)
|
||||||
{
|
{
|
||||||
SDL_Window *window = windowdata->window;
|
SDL_Window *window = windowdata->window;
|
||||||
const SDL_VideoData *videodata = _this->internal;
|
|
||||||
Display *display = videodata->display;
|
|
||||||
// The X server sends a Release event for each Press for wheels. Ignore them.
|
// The X server sends a Release event for each Press for wheels. Ignore them.
|
||||||
int xticks = 0, yticks = 0;
|
int xticks = 0, yticks = 0;
|
||||||
Uint64 timestamp = X11_GetEventTimestamp(time);
|
Uint64 timestamp = X11_GetEventTimestamp(time);
|
||||||
@@ -1072,7 +1068,7 @@ void X11_HandleButtonRelease(SDL_VideoDevice *_this, SDL_WindowData *windowdata,
|
|||||||
#ifdef DEBUG_XEVENTS
|
#ifdef DEBUG_XEVENTS
|
||||||
SDL_Log("window 0x%lx: ButtonRelease (X11 button = %d)", windowdata->xwindow, button);
|
SDL_Log("window 0x%lx: ButtonRelease (X11 button = %d)", windowdata->xwindow, button);
|
||||||
#endif
|
#endif
|
||||||
if (!X11_IsWheelEvent(display, button, &xticks, &yticks)) {
|
if (!X11_IsWheelEvent(button, &xticks, &yticks)) {
|
||||||
if (button > 7) {
|
if (button > 7) {
|
||||||
// see explanation at case ButtonPress
|
// see explanation at case ButtonPress
|
||||||
button -= (8 - SDL_BUTTON_X1);
|
button -= (8 - SDL_BUTTON_X1);
|
||||||
|
|||||||
@@ -36,5 +36,6 @@ extern void X11_HandleButtonRelease(SDL_VideoDevice *_this, SDL_WindowData *wind
|
|||||||
extern SDL_WindowData *X11_FindWindow(SDL_VideoDevice *_this, Window window);
|
extern SDL_WindowData *X11_FindWindow(SDL_VideoDevice *_this, Window window);
|
||||||
extern bool X11_ProcessHitTest(SDL_VideoDevice *_this, SDL_WindowData *data, const float x, const float y, bool force_new_result);
|
extern bool X11_ProcessHitTest(SDL_VideoDevice *_this, SDL_WindowData *data, const float x, const float y, bool force_new_result);
|
||||||
extern bool X11_TriggerHitTestAction(SDL_VideoDevice *_this, SDL_WindowData *data, const float x, const float y);
|
extern bool X11_TriggerHitTestAction(SDL_VideoDevice *_this, SDL_WindowData *data, const float x, const float y);
|
||||||
|
extern bool X11_IsWheelEvent(int button, int *xticks, int *yticks);
|
||||||
|
|
||||||
#endif // SDL_x11events_h_
|
#endif // SDL_x11events_h_
|
||||||
@@ -425,6 +425,14 @@ void X11_HandleXinput2Event(SDL_VideoDevice *_this, XGenericEventCookie *cookie)
|
|||||||
} else {
|
} else {
|
||||||
// Otherwise assume a regular mouse
|
// Otherwise assume a regular mouse
|
||||||
SDL_WindowData *windowdata = xinput2_get_sdlwindowdata(videodata, xev->event);
|
SDL_WindowData *windowdata = xinput2_get_sdlwindowdata(videodata, xev->event);
|
||||||
|
int x_ticks = 0, y_ticks = 0;
|
||||||
|
|
||||||
|
/* Discard wheel events from "Master" devices to avoid duplicates,
|
||||||
|
* as coarse wheel events are stateless and can't be deduplicated.
|
||||||
|
*/
|
||||||
|
if (xev->deviceid != xev->sourceid && X11_IsWheelEvent(button, &x_ticks, &y_ticks)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (down) {
|
if (down) {
|
||||||
X11_HandleButtonPress(_this, windowdata, (SDL_MouseID)xev->sourceid, button,
|
X11_HandleButtonPress(_this, windowdata, (SDL_MouseID)xev->sourceid, button,
|
||||||
|
|||||||
@@ -889,7 +889,7 @@ static int SDLCALL rect_testIntersectRectEmpty(void *arg)
|
|||||||
*/
|
*/
|
||||||
static int SDLCALL rect_testIntersectRectParam(void *arg)
|
static int SDLCALL rect_testIntersectRectParam(void *arg)
|
||||||
{
|
{
|
||||||
SDL_Rect rectA;
|
SDL_Rect rectA = { 0 };
|
||||||
SDL_Rect rectB = { 0 };
|
SDL_Rect rectB = { 0 };
|
||||||
SDL_Rect result;
|
SDL_Rect result;
|
||||||
bool intersection;
|
bool intersection;
|
||||||
@@ -1138,7 +1138,7 @@ static int SDLCALL rect_testHasIntersectionEmpty(void *arg)
|
|||||||
*/
|
*/
|
||||||
static int SDLCALL rect_testHasIntersectionParam(void *arg)
|
static int SDLCALL rect_testHasIntersectionParam(void *arg)
|
||||||
{
|
{
|
||||||
SDL_Rect rectA;
|
SDL_Rect rectA = { 0 };
|
||||||
SDL_Rect rectB = { 0 };
|
SDL_Rect rectB = { 0 };
|
||||||
bool intersection;
|
bool intersection;
|
||||||
|
|
||||||
@@ -1699,7 +1699,7 @@ static int SDLCALL rect_testUnionRectInside(void *arg)
|
|||||||
*/
|
*/
|
||||||
static int SDLCALL rect_testUnionRectParam(void *arg)
|
static int SDLCALL rect_testUnionRectParam(void *arg)
|
||||||
{
|
{
|
||||||
SDL_Rect rectA, rectB = { 0 };
|
SDL_Rect rectA = { 0 }, rectB = { 0 };
|
||||||
SDL_Rect result;
|
SDL_Rect result;
|
||||||
|
|
||||||
/* invalid parameter combinations */
|
/* invalid parameter combinations */
|
||||||
|
|||||||
@@ -989,6 +989,45 @@ static int SDLCALL surface_testBlitInvalid(void *arg)
|
|||||||
return TEST_COMPLETED;
|
return TEST_COMPLETED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int SDLCALL surface_testBlitsWithBadCoordinates(void *arg)
|
||||||
|
{
|
||||||
|
const SDL_Rect rect[8] = {
|
||||||
|
{ SDL_MAX_SINT32, 0, 2, 2 },
|
||||||
|
{ 0, SDL_MAX_SINT32, 2, 2 },
|
||||||
|
{ 0, 0, SDL_MAX_SINT32, 2 },
|
||||||
|
{ 0, 0, 2, SDL_MAX_SINT32 },
|
||||||
|
{ SDL_MIN_SINT32, 0, 2, 2 },
|
||||||
|
{ 0, SDL_MIN_SINT32, 2, 2 },
|
||||||
|
{ 0, 0, SDL_MIN_SINT32, 2 },
|
||||||
|
{ 0, 0, 2, SDL_MIN_SINT32 }
|
||||||
|
};
|
||||||
|
|
||||||
|
SDL_Surface *s;
|
||||||
|
bool result;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
s = SDL_CreateSurface(1, 1, SDL_PIXELFORMAT_RGBA8888);
|
||||||
|
SDLTest_AssertCheck(s != NULL, "Check surface creation");
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
result = SDL_BlitSurface(s, NULL, s, &rect[i]);
|
||||||
|
SDLTest_AssertCheck(result == true, "SDL_BlitSurface(valid, NULL, valid, &rect), result = %s", result ? "true" : "false");
|
||||||
|
|
||||||
|
result = SDL_BlitSurface(s, &rect[i], s, NULL);
|
||||||
|
SDLTest_AssertCheck(result == true, "SDL_BlitSurface(valid, &rect, valid, NULL), result = %s", result ? "true" : "false");
|
||||||
|
|
||||||
|
result = SDL_BlitSurfaceScaled(s, NULL, s, &rect[i], SDL_SCALEMODE_NEAREST);
|
||||||
|
SDLTest_AssertCheck(result == true, "SDL_BlitSurfaceScaled(valid, NULL, valid, &rect, SDL_SCALEMODE_NEAREST), result = %s", result ? "true" : "false");
|
||||||
|
|
||||||
|
result = SDL_BlitSurfaceScaled(s, &rect[i], s, NULL, SDL_SCALEMODE_NEAREST);
|
||||||
|
SDLTest_AssertCheck(result == true, "SDL_BlitSurfaceScaled(valid, &rect, valid, NULL, SDL_SCALEMODE_NEAREST), result = %s", result ? "true" : "false");
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_DestroySurface(s);
|
||||||
|
|
||||||
|
return TEST_COMPLETED;
|
||||||
|
}
|
||||||
|
|
||||||
static int SDLCALL surface_testOverflow(void *arg)
|
static int SDLCALL surface_testOverflow(void *arg)
|
||||||
{
|
{
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
@@ -1664,6 +1703,10 @@ static const SDLTest_TestCaseReference surfaceTestBlitInvalid = {
|
|||||||
surface_testBlitInvalid, "surface_testBlitInvalid", "Tests blitting routines with invalid surfaces.", TEST_ENABLED
|
surface_testBlitInvalid, "surface_testBlitInvalid", "Tests blitting routines with invalid surfaces.", TEST_ENABLED
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const SDLTest_TestCaseReference surfaceTestBlitsWithBadCoordinates = {
|
||||||
|
surface_testBlitsWithBadCoordinates, "surface_testBlitsWithBadCoordinates", "Test blitting routines with bad coordinates.", TEST_ENABLED
|
||||||
|
};
|
||||||
|
|
||||||
static const SDLTest_TestCaseReference surfaceTestOverflow = {
|
static const SDLTest_TestCaseReference surfaceTestOverflow = {
|
||||||
surface_testOverflow, "surface_testOverflow", "Test overflow detection.", TEST_ENABLED
|
surface_testOverflow, "surface_testOverflow", "Test overflow detection.", TEST_ENABLED
|
||||||
};
|
};
|
||||||
@@ -1713,6 +1756,7 @@ static const SDLTest_TestCaseReference *surfaceTests[] = {
|
|||||||
&surfaceTestBlitBlendMod,
|
&surfaceTestBlitBlendMod,
|
||||||
&surfaceTestBlitBlendMul,
|
&surfaceTestBlitBlendMul,
|
||||||
&surfaceTestBlitInvalid,
|
&surfaceTestBlitInvalid,
|
||||||
|
&surfaceTestBlitsWithBadCoordinates,
|
||||||
&surfaceTestOverflow,
|
&surfaceTestOverflow,
|
||||||
&surfaceTestFlip,
|
&surfaceTestFlip,
|
||||||
&surfaceTestPalette,
|
&surfaceTestPalette,
|
||||||
|
|||||||
@@ -679,7 +679,7 @@ void SetupVulkanRenderProperties(VulkanVideoContext *context, SDL_PropertiesID p
|
|||||||
SDL_SetNumberProperty(props, SDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER, context->graphicsQueueFamilyIndex);
|
SDL_SetNumberProperty(props, SDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER, context->graphicsQueueFamilyIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if LIBAVUTIL_VERSION_MAJOR >= 59
|
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(59, 34, 100)
|
||||||
static void AddQueueFamily(AVVulkanDeviceContext *ctx, int idx, int num, VkQueueFlagBits flags)
|
static void AddQueueFamily(AVVulkanDeviceContext *ctx, int idx, int num, VkQueueFlagBits flags)
|
||||||
{
|
{
|
||||||
AVVulkanDeviceQueueFamily *entry = &ctx->qf[ctx->nb_qf++];
|
AVVulkanDeviceQueueFamily *entry = &ctx->qf[ctx->nb_qf++];
|
||||||
@@ -687,7 +687,7 @@ static void AddQueueFamily(AVVulkanDeviceContext *ctx, int idx, int num, VkQueue
|
|||||||
entry->num = num;
|
entry->num = num;
|
||||||
entry->flags = flags;
|
entry->flags = flags;
|
||||||
}
|
}
|
||||||
#endif /* LIBAVUTIL_VERSION_MAJOR */
|
#endif /* LIBAVUTIL_VERSION_INT */
|
||||||
|
|
||||||
void SetupVulkanDeviceContextData(VulkanVideoContext *context, AVVulkanDeviceContext *ctx)
|
void SetupVulkanDeviceContextData(VulkanVideoContext *context, AVVulkanDeviceContext *ctx)
|
||||||
{
|
{
|
||||||
@@ -700,7 +700,7 @@ void SetupVulkanDeviceContextData(VulkanVideoContext *context, AVVulkanDeviceCon
|
|||||||
ctx->nb_enabled_inst_extensions = context->instanceExtensionsCount;
|
ctx->nb_enabled_inst_extensions = context->instanceExtensionsCount;
|
||||||
ctx->enabled_dev_extensions = context->deviceExtensions;
|
ctx->enabled_dev_extensions = context->deviceExtensions;
|
||||||
ctx->nb_enabled_dev_extensions = context->deviceExtensionsCount;
|
ctx->nb_enabled_dev_extensions = context->deviceExtensionsCount;
|
||||||
#if LIBAVUTIL_VERSION_MAJOR >= 59
|
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(59, 34, 100)
|
||||||
AddQueueFamily(ctx, context->graphicsQueueFamilyIndex, context->graphicsQueueCount, VK_QUEUE_GRAPHICS_BIT);
|
AddQueueFamily(ctx, context->graphicsQueueFamilyIndex, context->graphicsQueueCount, VK_QUEUE_GRAPHICS_BIT);
|
||||||
AddQueueFamily(ctx, context->transferQueueFamilyIndex, context->transferQueueCount, VK_QUEUE_TRANSFER_BIT);
|
AddQueueFamily(ctx, context->transferQueueFamilyIndex, context->transferQueueCount, VK_QUEUE_TRANSFER_BIT);
|
||||||
AddQueueFamily(ctx, context->computeQueueFamilyIndex, context->computeQueueCount, VK_QUEUE_COMPUTE_BIT);
|
AddQueueFamily(ctx, context->computeQueueFamilyIndex, context->computeQueueCount, VK_QUEUE_COMPUTE_BIT);
|
||||||
@@ -716,7 +716,7 @@ void SetupVulkanDeviceContextData(VulkanVideoContext *context, AVVulkanDeviceCon
|
|||||||
ctx->nb_encode_queues = 0;
|
ctx->nb_encode_queues = 0;
|
||||||
ctx->queue_family_decode_index = context->decodeQueueFamilyIndex;
|
ctx->queue_family_decode_index = context->decodeQueueFamilyIndex;
|
||||||
ctx->nb_decode_queues = context->decodeQueueCount;
|
ctx->nb_decode_queues = context->decodeQueueCount;
|
||||||
#endif /* LIBAVUTIL_VERSION_MAJOR */
|
#endif /* LIBAVUTIL_VERSION_INT */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int CreateCommandBuffers(VulkanVideoContext *context, SDL_Renderer *renderer)
|
static int CreateCommandBuffers(VulkanVideoContext *context, SDL_Renderer *renderer)
|
||||||
|
|||||||
Reference in new issue
Block a user