From ce12f50a4613db2a1e8d227c221a223a9e478993 Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 1 Dec 2025 09:33:59 +0000 Subject: [PATCH] sysconf stub cuz crash(?) + some stderrp stuff --- .ci/ps4/build.sh | 14 +- CMakeModules/FindSDL2.cmake | 388 ++++++++++++++++++ docs/user/Basics.md | 1 + src/audio_core/CMakeLists.txt | 4 +- src/common/fs/path_util.cpp | 4 + src/common/host_memory.cpp | 7 +- src/common/memory_detect.cpp | 4 +- src/input_common/CMakeLists.txt | 3 +- src/input_common/drivers/joycon.cpp | 13 +- src/input_common/drivers/joycon.h | 9 +- src/input_common/drivers/sdl_driver.cpp | 39 +- src/input_common/helpers/joycon_driver.cpp | 35 +- .../joycon_protocol/common_protocol.cpp | 52 ++- .../helpers/joycon_protocol/joycon_types.h | 9 +- src/yuzu/CMakeLists.txt | 3 +- src/yuzu_cmd/CMakeLists.txt | 3 +- src/yuzu_cmd/yuzu.cpp | 1 + 17 files changed, 512 insertions(+), 77 deletions(-) create mode 100644 CMakeModules/FindSDL2.cmake diff --git a/.ci/ps4/build.sh b/.ci/ps4/build.sh index 0dda2e9c9a..0bffdca680 100755 --- a/.ci/ps4/build.sh +++ b/.ci/ps4/build.sh @@ -3,8 +3,6 @@ # SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later -OO_PS4_TOOLCHAIN="/home/xerix/src/ps4-sdk/prefix" - [ -f "ps4-toolchain.cmake" ] || cat << EOF >"ps4-toolchain.cmake" set(CMAKE_SYSROOT "$OO_PS4_TOOLCHAIN") set(CMAKE_STAGING_PREFIX "$OO_PS4_TOOLCHAIN") @@ -20,8 +18,8 @@ set(CMAKE_CXX_LINK_FLAGS "-m elf_x86_64 -pie -T $OO_PS4_TOOLCHAIN/link.x --eh-fr set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) set(CMAKE_LINKER ld.lld) -set(CMAKE_C_LINK_EXECUTABLE " -o -lc -lkernel -lSceUserService -lSceSysmodule -lSceNet -lSceLibcInternal $OO_PS4_TOOLCHAIN/lib/crt1.o ") -set(CMAKE_CXX_LINK_EXECUTABLE " -o -lc -lkernel -lc++ -lSceUserService -lSceSysmodule -lSceNet -lSceLibcInternal $OO_PS4_TOOLCHAIN/lib/crt1.o ") +set(CMAKE_C_LINK_EXECUTABLE " -o -lc -lkernel -lSceUserService -lSceSysmodule -lSceNet $OO_PS4_TOOLCHAIN/lib/crt1.o ") +set(CMAKE_CXX_LINK_EXECUTABLE " -o -lc -lkernel -lc++ -lSceUserService -lSceSysmodule -lSceNet $OO_PS4_TOOLCHAIN/lib/crt1.o ") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) @@ -35,14 +33,16 @@ EOF # Normally a platform has a package manager # PS4 does not, atleast not in the normal sense export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@) -cmake -S . -B build -G Ninja \ +cmake -S . -B build -G "Unix Makefiles" \ -DCMAKE_TOOLCHAIN_FILE="ps4-toolchain.cmake" \ -DENABLE_QT_TRANSLATION=OFF \ -DENABLE_CUBEB=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="$ARCH_FLAGS" \ -DCMAKE_C_FLAGS="$ARCH_FLAGS" \ - -DENABLE_SDL2=OFF \ + -DENABLE_SDL2=ON \ + -DENABLE_LIBUSB=OFF \ + -DENABLE_UPDATE_CHECKER=OFF \ -DENABLE_QT=OFF \ -DENABLE_OPENSSL=OFF \ -DENABLE_WEB_SERVICE=OFF \ @@ -51,4 +51,4 @@ cmake -S . -B build -G Ninja \ -DYUZU_USE_EXTERNAL_FFMPEG=ON \ -DYUZU_USE_CPM=ON \ "${EXTRA_CMAKE_FLAGS[@]}" || exit -cmake --build build --parallel +cmake --build build -t yuzu-cmd_pkg -- -j8 diff --git a/CMakeModules/FindSDL2.cmake b/CMakeModules/FindSDL2.cmake new file mode 100644 index 0000000000..2445d36ec5 --- /dev/null +++ b/CMakeModules/FindSDL2.cmake @@ -0,0 +1,388 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +# Copyright 2019 Amine Ben Hassouna +# Copyright 2000-2019 Kitware, Inc. and Contributors +# All rights reserved. + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: + +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. + +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. + +# * Neither the name of Kitware, Inc. nor the names of Contributors +# may be used to endorse or promote products derived from this +# software without specific prior written permission. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#[=======================================================================[.rst: +FindSDL2 +-------- + +Locate SDL2 library + +This module defines the following 'IMPORTED' targets: + +:: + + SDL2::Core + The SDL2 library, if found. + Libraries should link to SDL2::Core + + SDL2::Main + The SDL2main library, if found. + Applications should link to SDL2::Main instead of SDL2::Core + + + +This module will set the following variables in your project: + +:: + + SDL2_LIBRARIES, the name of the library to link against + SDL2_INCLUDE_DIRS, where to find SDL.h + SDL2_FOUND, if false, do not try to link to SDL2 + SDL2MAIN_FOUND, if false, do not try to link to SDL2main + SDL2_VERSION_STRING, human-readable string containing the version of SDL2 + + + +This module responds to the following cache variables: + +:: + + SDL2_PATH + Set a custom SDL2 Library path (default: empty) + + SDL2_NO_DEFAULT_PATH + Disable search SDL2 Library in default path. + If SDL2_PATH (default: ON) + Else (default: OFF) + + SDL2_INCLUDE_DIR + SDL2 headers path. + + SDL2_LIBRARY + SDL2 Library (.dll, .so, .a, etc) path. + + SDL2MAIN_LIBRAY + SDL2main Library (.a) path. + + SDL2_BUILDING_LIBRARY + This flag is useful only when linking to SDL2_LIBRARIES insead of + SDL2::Main. It is required only when building a library that links to + SDL2_LIBRARIES, because only applications need main() (No need to also + link to SDL2main). + If this flag is defined, then no SDL2main will be added to SDL2_LIBRARIES + and no SDL2::Main target will be created. + + +Don't forget to include SDLmain.h and SDLmain.m in your project for the +OS X framework based version. (Other versions link to -lSDL2main which +this module will try to find on your behalf.) Also for OS X, this +module will automatically add the -framework Cocoa on your behalf. + + +Additional Note: If you see an empty SDL2_LIBRARY in your project +configuration, it means CMake did not find your SDL2 library +(SDL2.dll, libsdl2.so, SDL2.framework, etc). Set SDL2_LIBRARY to point +to your SDL2 library, and configure again. Similarly, if you see an +empty SDL2MAIN_LIBRARY, you should set this value as appropriate. These +values are used to generate the final SDL2_LIBRARIES variable and the +SDL2::Core and SDL2::Main targets, but when these values are unset, +SDL2_LIBRARIES, SDL2::Core and SDL2::Main does not get created. + + +$SDL2DIR is an environment variable that would correspond to the +./configure --prefix=$SDL2DIR used in building SDL2. l.e.galup 9-20-02 + + + +Created by Amine Ben Hassouna: + Adapt FindSDL.cmake to SDL2 (FindSDL2.cmake). + Add cache variables for more flexibility: + SDL2_PATH, SDL2_NO_DEFAULT_PATH (for details, see doc above). + Mark 'Threads' as a required dependency for non-OSX systems. + Modernize the FindSDL2.cmake module by creating specific targets: + SDL2::Core and SDL2::Main (for details, see doc above). + + +Original FindSDL.cmake module: + Modified by Eric Wing. Added code to assist with automated building + by using environmental variables and providing a more + controlled/consistent search behavior. Added new modifications to + recognize OS X frameworks and additional Unix paths (FreeBSD, etc). + Also corrected the header search path to follow "proper" SDL + guidelines. Added a search for SDLmain which is needed by some + platforms. Added a search for threads which is needed by some + platforms. Added needed compile switches for MinGW. + +On OSX, this will prefer the Framework version (if found) over others. +People will have to manually change the cache value of SDL2_LIBRARY to +override this selection or set the SDL2_PATH variable or the CMake +environment CMAKE_INCLUDE_PATH to modify the search paths. + +Note that the header path has changed from SDL/SDL.h to just SDL.h +This needed to change because "proper" SDL convention is #include +"SDL.h", not . This is done for portability reasons +because not all systems place things in SDL/ (see FreeBSD). +#]=======================================================================] + +# Define options for searching SDL2 Library in a custom path + +set(SDL2_PATH "" CACHE STRING "Custom SDL2 Library path") + +set(_SDL2_NO_DEFAULT_PATH OFF) +if(SDL2_PATH) + set(_SDL2_NO_DEFAULT_PATH ON) +endif() + +set(SDL2_NO_DEFAULT_PATH ${_SDL2_NO_DEFAULT_PATH} + CACHE BOOL "Disable search SDL2 Library in default path") +unset(_SDL2_NO_DEFAULT_PATH) + +set(SDL2_NO_DEFAULT_PATH_CMD) +if(SDL2_NO_DEFAULT_PATH) + set(SDL2_NO_DEFAULT_PATH_CMD NO_DEFAULT_PATH) +endif() + +# Search for the SDL2 include directory +find_path(SDL2_INCLUDE_DIR SDL.h + HINTS + ENV SDL2DIR + ${SDL2_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES SDL2 + # path suffixes to search inside ENV{SDL2DIR} + include/SDL2 include + PATHS ${SDL2_PATH} + DOC "Where the SDL2 headers can be found" +) + +set(SDL2_INCLUDE_DIRS "${SDL2_INCLUDE_DIR}") + +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(VC_LIB_PATH_SUFFIX lib/x64) +else() + set(VC_LIB_PATH_SUFFIX lib/x86) +endif() + +# SDL-2.0 is the name used by FreeBSD ports... +# don't confuse it for the version number. +find_library(SDL2_LIBRARY + NAMES SDL2 SDL-2.0 + HINTS + ENV SDL2DIR + ${SDL2_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} + PATHS ${SDL2_PATH} + DOC "Where the SDL2 Library can be found" +) + +set(SDL2_LIBRARIES "${SDL2_LIBRARY}") + +if(NOT SDL2_BUILDING_LIBRARY) + if(NOT SDL2_INCLUDE_DIR MATCHES ".framework") + # Non-OS X framework versions expect you to also dynamically link to + # SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms + # seem to provide SDL2main for compatibility even though they don't + # necessarily need it. + + if(SDL2_PATH) + set(SDL2MAIN_LIBRARY_PATHS "${SDL2_PATH}") + endif() + + if(NOT SDL2_NO_DEFAULT_PATH) + set(SDL2MAIN_LIBRARY_PATHS + /sw + /opt/local + /opt/csw + /opt + "${SDL2MAIN_LIBRARY_PATHS}" + ) + endif() + + find_library(SDL2MAIN_LIBRARY + NAMES SDL2main + HINTS + ENV SDL2DIR + ${SDL2_NO_DEFAULT_PATH_CMD} + PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX} + PATHS ${SDL2MAIN_LIBRARY_PATHS} + DOC "Where the SDL2main library can be found" + ) + unset(SDL2MAIN_LIBRARY_PATHS) + endif() +endif() + +# SDL2 may require threads on your system. +# The Apple build may not need an explicit flag because one of the +# frameworks may already provide it. +# But for non-OSX systems, I will use the CMake Threads package. +if(NOT APPLE) + find_package(Threads QUIET) + if(NOT Threads_FOUND) + set(SDL2_THREADS_NOT_FOUND "Could NOT find Threads (Threads is required by SDL2).") + if(SDL2_FIND_REQUIRED) + message(FATAL_ERROR ${SDL2_THREADS_NOT_FOUND}) + else() + if(NOT SDL2_FIND_QUIETLY) + message(STATUS ${SDL2_THREADS_NOT_FOUND}) + endif() + return() + endif() + unset(SDL2_THREADS_NOT_FOUND) + endif() +endif() + +# MinGW needs an additional link flag, -mwindows +# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -mwindows +if(MINGW) + set(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "link flags for MinGW") +endif() + +if(SDL2_LIBRARY) + # For SDL2main + if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY) + list(FIND SDL2_LIBRARIES "${SDL2MAIN_LIBRARY}" _SDL2_MAIN_INDEX) + if(_SDL2_MAIN_INDEX EQUAL -1) + set(SDL2_LIBRARIES "${SDL2MAIN_LIBRARY}" ${SDL2_LIBRARIES}) + endif() + unset(_SDL2_MAIN_INDEX) + endif() + + # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. + # CMake doesn't display the -framework Cocoa string in the UI even + # though it actually is there if I modify a pre-used variable. + # I think it has something to do with the CACHE STRING. + # So I use a temporary variable until the end so I can set the + # "real" variable in one-shot. + if(APPLE) + set(SDL2_LIBRARIES ${SDL2_LIBRARIES} -framework Cocoa) + endif() + + # For threads, as mentioned Apple doesn't need this. + # In fact, there seems to be a problem if I used the Threads package + # and try using this line, so I'm just skipping it entirely for OS X. + if(NOT APPLE) + set(SDL2_LIBRARIES ${SDL2_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) + endif() + + # For MinGW library + if(MINGW) + set(SDL2_LIBRARIES ${MINGW32_LIBRARY} ${SDL2_LIBRARIES}) + endif() + +endif() + +# Read SDL2 version +if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL_version.h") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}") + set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH}) + unset(SDL2_VERSION_MAJOR_LINE) + unset(SDL2_VERSION_MINOR_LINE) + unset(SDL2_VERSION_PATCH_LINE) + unset(SDL2_VERSION_MAJOR) + unset(SDL2_VERSION_MINOR) + unset(SDL2_VERSION_PATCH) +endif() + +include(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 + REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR + VERSION_VAR SDL2_VERSION_STRING) + +if(SDL2MAIN_LIBRARY) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2main + REQUIRED_VARS SDL2MAIN_LIBRARY SDL2_INCLUDE_DIR + VERSION_VAR SDL2_VERSION_STRING) +endif() + + +mark_as_advanced(SDL2_PATH + SDL2_NO_DEFAULT_PATH + SDL2_LIBRARY + SDL2MAIN_LIBRARY + SDL2_INCLUDE_DIR + SDL2_BUILDING_LIBRARY) + + +# SDL2:: targets (SDL2::Core and SDL2::Main) +if(SDL2_FOUND) + + # SDL2::Core target + if(SDL2_LIBRARY AND NOT TARGET SDL2::Core) + add_library(SDL2::Core UNKNOWN IMPORTED) + set_target_properties(SDL2::Core PROPERTIES + IMPORTED_LOCATION "${SDL2_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}") + + if(APPLE) + # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa. + # For more details, please see above. + set_property(TARGET SDL2::Core APPEND PROPERTY + INTERFACE_LINK_OPTIONS -framework Cocoa) + else() + # For threads, as mentioned Apple doesn't need this. + # For more details, please see above. + set_property(TARGET SDL2::Core APPEND PROPERTY + INTERFACE_LINK_LIBRARIES Threads::Threads) + endif() + endif() + + # SDL2::Main target + # Applications should link to SDL2::Main instead of SDL2::Core + # For more details, please see above. + if(NOT SDL2_BUILDING_LIBRARY AND NOT TARGET SDL2::Main) + + if(SDL2_INCLUDE_DIR MATCHES ".framework" OR NOT SDL2MAIN_LIBRARY) + add_library(SDL2::Main INTERFACE IMPORTED) + set_property(TARGET SDL2::Main PROPERTY + INTERFACE_LINK_LIBRARIES SDL2::Core) + elseif(SDL2MAIN_LIBRARY) + # MinGW requires that the mingw32 library is specified before the + # libSDL2main.a static library when linking. + # The SDL2::MainInternal target is used internally to make sure that + # CMake respects this condition. + add_library(SDL2::MainInternal UNKNOWN IMPORTED) + set_property(TARGET SDL2::MainInternal PROPERTY + IMPORTED_LOCATION "${SDL2MAIN_LIBRARY}") + set_property(TARGET SDL2::MainInternal PROPERTY + INTERFACE_LINK_LIBRARIES SDL2::Core) + + add_library(SDL2::Main INTERFACE IMPORTED) + + if(MINGW) + # MinGW needs an additional link flag '-mwindows' and link to mingw32 + set_property(TARGET SDL2::Main PROPERTY + INTERFACE_LINK_LIBRARIES "mingw32" "-mwindows") + endif() + + set_property(TARGET SDL2::Main APPEND PROPERTY + INTERFACE_LINK_LIBRARIES SDL2::MainInternal) + endif() + + endif() +endif() diff --git a/docs/user/Basics.md b/docs/user/Basics.md index 5101f4d9c3..b8719a9310 100644 --- a/docs/user/Basics.md +++ b/docs/user/Basics.md @@ -26,6 +26,7 @@ Eden will store configuration files in the following directories: - **Android**: Data is stored internally. - **Linux, macOS, FreeBSD, Solaris, OpenBSD**: `$XDG_DATA_HOME`, `$XDG_CACHE_HOME`, `$XDG_CONFIG_HOME`. - **HaikuOS**: `/boot/home/config/settings/eden` +- **PlayStation 4**: `/data/eden` If a `user` directory is present in the current working directory, that will override all global configuration directories and the emulator will use that instead. diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt index 90ee460b55..5f03b0bea8 100644 --- a/src/audio_core/CMakeLists.txt +++ b/src/audio_core/CMakeLists.txt @@ -251,8 +251,8 @@ if (ENABLE_SDL2) sink/sdl2_sink.cpp sink/sdl2_sink.h ) - - target_link_libraries(audio_core PRIVATE SDL2::SDL2) + target_include_directories(audio_core PRIVATE ${CMAKE_SYSROOT}/include/SDL2) + target_link_libraries(audio_core PRIVATE SDL2) target_compile_definitions(audio_core PRIVATE HAVE_SDL2) endif() diff --git a/src/common/fs/path_util.cpp b/src/common/fs/path_util.cpp index 8f1fe1402e..84f22e4298 100644 --- a/src/common/fs/path_util.cpp +++ b/src/common/fs/path_util.cpp @@ -130,6 +130,10 @@ public: ASSERT(!eden_path.empty()); eden_path_cache = eden_path / CACHE_DIR; eden_path_config = eden_path / CONFIG_DIR; +#elif defined(__OPENORBIS__) + eden_path = "/data/eden"; + eden_path_cache = eden_path / CACHE_DIR; + eden_path_config = eden_path / CONFIG_DIR; #else eden_path = GetCurrentDir() / PORTABLE_DIR; if (!Exists(eden_path) || !IsDir(eden_path)) { diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp index 5400b97018..c281eea395 100644 --- a/src/common/host_memory.cpp +++ b/src/common/host_memory.cpp @@ -500,9 +500,12 @@ class HostMemory::Impl { public: explicit Impl(size_t backing_size_, size_t virtual_size_) : backing_size{backing_size_}, virtual_size{virtual_size_} { +#ifdef __OPENORBIS__ + +#else long page_size = sysconf(_SC_PAGESIZE); - ASSERT_MSG(page_size == 0x1000, "page size {:#x} is incompatible with 4K paging", - page_size); + ASSERT_MSG(page_size == 0x1000, "page size {:#x} is incompatible with 4K paging", page_size); +#endif // Backing memory initialization #if defined(__sun__) || defined(__HAIKU__) || defined(__NetBSD__) || defined(__DragonFly__) fd = shm_open_anon(O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600); diff --git a/src/common/memory_detect.cpp b/src/common/memory_detect.cpp index 074c02a9c3..8bd544e3e2 100644 --- a/src/common/memory_detect.cpp +++ b/src/common/memory_detect.cpp @@ -43,7 +43,9 @@ static MemoryInfo Detect() { sysctlbyname("vm.swapusage", &vmusage, &sizeof_vmusage, nullptr, 0); mem_info.TotalPhysicalMemory = ramsize; mem_info.TotalSwapMemory = vmusage.xsu_total; -#elif defined(__FreeBSD__) && !defined(__OPENORBIS__) +#elif defined(__OPENORBIS__) + mem_info.TotalPhysicalMemory = mem_info.TotalSwapMemory = 0; +#elif defined(__FreeBSD__) u_long physmem, swap_total; std::size_t sizeof_u_long = sizeof(u_long); // sysctlbyname(const char *, void *, size_t *, const void *, size_t); diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt index 30ccd7e8c1..985eee5ffe 100644 --- a/src/input_common/CMakeLists.txt +++ b/src/input_common/CMakeLists.txt @@ -75,7 +75,8 @@ if (ENABLE_SDL2) helpers/joycon_protocol/rumble.cpp helpers/joycon_protocol/rumble.h ) - target_link_libraries(input_common PRIVATE SDL2::SDL2) + target_include_directories(input_common PRIVATE ${CMAKE_SYSROOT}/include/SDL2) + target_link_libraries(input_common PRIVATE SDL2) target_compile_definitions(input_common PRIVATE HAVE_SDL2) endif() diff --git a/src/input_common/drivers/joycon.cpp b/src/input_common/drivers/joycon.cpp index fb2d75e384..83a57f96a7 100644 --- a/src/input_common/drivers/joycon.cpp +++ b/src/input_common/drivers/joycon.cpp @@ -23,12 +23,14 @@ Joycons::Joycons(const std::string& input_engine_) : InputEngine(input_engine_) return; } LOG_INFO(Input, "Joycon driver Initialization started"); - const int init_res = SDL_hid_init(); - if (init_res == 0) { +#if SDL_VERSION_ATLEAST(2, 26, 4) + int const res = SDL_hid_init(); + if (res == 0) { Setup(); } else { - LOG_ERROR(Input, "Hidapi could not be initialized. failed with error = {}", init_res); + LOG_ERROR(Input, "Hidapi could not be initialized. failed with error = {}", res); } +#endif } Joycons::~Joycons() { @@ -55,7 +57,9 @@ void Joycons::Reset() { } device->Stop(); } +#if SDL_VERSION_ATLEAST(2, 26, 4) SDL_hid_exit(); +#endif } void Joycons::Setup() { @@ -80,9 +84,9 @@ void Joycons::Setup() { } void Joycons::ScanThread(std::stop_token stop_token) { +#if SDL_VERSION_ATLEAST(2, 26, 4) constexpr u16 nintendo_vendor_id = 0x057e; Common::SetCurrentThreadName("JoyconScanThread"); - do { SDL_hid_device_info* devs = SDL_hid_enumerate(nintendo_vendor_id, 0x0); SDL_hid_device_info* cur_dev = devs; @@ -98,6 +102,7 @@ void Joycons::ScanThread(std::stop_token stop_token) { SDL_hid_free_enumeration(devs); } while (Common::StoppableTimedWait(stop_token, std::chrono::seconds{5})); +#endif } bool Joycons::IsDeviceNew(SDL_hid_device_info* device_info) const { diff --git a/src/input_common/drivers/joycon.h b/src/input_common/drivers/joycon.h index 112e970e15..cc07958a0f 100644 --- a/src/input_common/drivers/joycon.h +++ b/src/input_common/drivers/joycon.h @@ -6,7 +6,14 @@ #include #include #include -#include + +#include +#if SDL_VERSION_ATLEAST(2, 26, 4) +# include +#else +struct SDL_hid_device; +struct SDL_hid_device_info; +#endif #include "input_common/input_engine.h" diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index b527668052..b23ce11b55 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -42,6 +42,7 @@ public: } void EnableMotion() { +#if SDL_VERSION_ATLEAST(2, 26, 4) if (!sdl_controller) { return; } @@ -58,12 +59,14 @@ public: if (has_gyro) { SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_GYRO, SDL_TRUE); } +#endif } bool HasMotion() const { return has_gyro || has_accel; } +#if SDL_VERSION_ATLEAST(2, 26, 4) bool UpdateMotion(SDL_ControllerSensorEvent event) { constexpr float gravity_constant = 9.80665f; std::scoped_lock lock{mutex}; @@ -105,6 +108,7 @@ public: motion.delta_timestamp = time_difference * 1000; return true; } +#endif const BasicMotion& GetMotion() const { return motion; @@ -149,13 +153,15 @@ public: } bool HasHDRumble() const { +#if SDL_VERSION_ATLEAST(2, 26, 4) if (sdl_controller) { - const auto type = SDL_GameControllerGetType(sdl_controller.get()); + auto const type = SDL_GameControllerGetType(sdl_controller.get()); return (type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO) || (type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT) || (type == SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT) || (type == SDL_CONTROLLER_TYPE_PS5); } +#endif return false; } @@ -252,26 +258,21 @@ public: } std::string GetControllerName() const { +#if SDL_VERSION_ATLEAST(2, 26, 4) if (sdl_controller) { switch (SDL_GameControllerGetType(sdl_controller.get())) { - case SDL_CONTROLLER_TYPE_XBOX360: - return "Xbox 360 Controller"; - case SDL_CONTROLLER_TYPE_XBOXONE: - return "Xbox One Controller"; - case SDL_CONTROLLER_TYPE_PS3: - return "DualShock 3 Controller"; - case SDL_CONTROLLER_TYPE_PS4: - return "DualShock 4 Controller"; - case SDL_CONTROLLER_TYPE_PS5: - return "DualSense Controller"; + case SDL_CONTROLLER_TYPE_XBOX360: return "Xbox 360 Controller"; + case SDL_CONTROLLER_TYPE_XBOXONE: return "Xbox One Controller"; + case SDL_CONTROLLER_TYPE_PS3: return "DualShock 3 Controller"; + case SDL_CONTROLLER_TYPE_PS4: return "DualShock 4 Controller"; + case SDL_CONTROLLER_TYPE_PS5: return "DualSense Controller"; default: + if (auto const name = SDL_GameControllerName(sdl_controller.get()); name) + return name; break; } - const auto name = SDL_GameControllerName(sdl_controller.get()); - if (name) { - return name; - } } +#endif if (sdl_joystick) { const auto name = SDL_JoystickName(sdl_joystick.get()); @@ -456,6 +457,7 @@ void SDLDriver::HandleGameControllerEvent(const SDL_Event& event) { } break; } +#if SDL_VERSION_ATLEAST(2, 26, 4) case SDL_CONTROLLERSENSORUPDATE: { if (auto joystick = GetSDLJoystickBySDLID(event.csensor.which)) { if (joystick->UpdateMotion(event.csensor)) { @@ -472,6 +474,7 @@ void SDLDriver::HandleGameControllerEvent(const SDL_Event& event) { } break; } +#endif case SDL_JOYDEVICEREMOVED: LOG_DEBUG(Input, "Controller removed with Instance_ID {}", event.jdevice.which); CloseJoystick(SDL_JoystickFromInstanceID(event.jdevice.which)); @@ -489,6 +492,7 @@ void SDLDriver::CloseJoysticks() { } SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_engine_)) { +#if SDL_VERSION_ATLEAST(2, 26, 4) // Set our application name. Currently passed to DBus by SDL and visible to the user through // their desktop environment. SDL_SetHint(SDL_HINT_APP_NAME, "Eden"); @@ -531,6 +535,7 @@ SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_en // Disable hidapi driver for xbox. Already default on Windows, this causes conflict with native // driver on Linux. SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_XBOX, "0"); +#endif // If the frontend is going to manage the event loop, then we don't start one here start_thread = SDL_WasInit(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER) == 0; @@ -835,6 +840,7 @@ ButtonBindings SDLDriver::GetDefaultButtonBinding( auto slr_button = SDL_CONTROLLER_BUTTON_LEFTSHOULDER; auto srr_button = SDL_CONTROLLER_BUTTON_RIGHTSHOULDER; +#if SDL_VERSION_ATLEAST(2, 26, 4) if (joystick->IsJoyconLeft()) { sll_button = SDL_CONTROLLER_BUTTON_PADDLE2; srl_button = SDL_CONTROLLER_BUTTON_PADDLE4; @@ -843,6 +849,7 @@ ButtonBindings SDLDriver::GetDefaultButtonBinding( slr_button = SDL_CONTROLLER_BUTTON_PADDLE3; srr_button = SDL_CONTROLLER_BUTTON_PADDLE1; } +#endif return { std::pair{Settings::NativeButton::A, SDL_CONTROLLER_BUTTON_B}, @@ -864,7 +871,9 @@ ButtonBindings SDLDriver::GetDefaultButtonBinding( {Settings::NativeButton::SLRight, slr_button}, {Settings::NativeButton::SRRight, srr_button}, {Settings::NativeButton::Home, SDL_CONTROLLER_BUTTON_GUIDE}, +#if SDL_VERSION_ATLEAST(2, 26, 4) {Settings::NativeButton::Screenshot, SDL_CONTROLLER_BUTTON_MISC1}, +#endif }; } diff --git a/src/input_common/helpers/joycon_driver.cpp b/src/input_common/helpers/joycon_driver.cpp index 0dd1c958a2..10c2878cea 100644 --- a/src/input_common/helpers/joycon_driver.cpp +++ b/src/input_common/helpers/joycon_driver.cpp @@ -38,8 +38,8 @@ Common::Input::DriverResult JoyconDriver::RequestDeviceAccess(SDL_hid_device_inf return Common::Input::DriverResult::UnsupportedControllerType; } - hidapi_handle->handle = - SDL_hid_open(device_info->vendor_id, device_info->product_id, device_info->serial_number); +#if SDL_VERSION_ATLEAST(2, 26, 4) + hidapi_handle->handle = SDL_hid_open(device_info->vendor_id, device_info->product_id, device_info->serial_number); std::memcpy(&handle_serial_number, device_info->serial_number, 15); if (!hidapi_handle->handle) { LOG_ERROR(Input, "Yuzu can't gain access to this device: ID {:04X}:{:04X}.", @@ -48,6 +48,9 @@ Common::Input::DriverResult JoyconDriver::RequestDeviceAccess(SDL_hid_device_inf } SDL_hid_set_nonblocking(hidapi_handle->handle, 1); return Common::Input::DriverResult::Success; +#else + return Common::Input::DriverResult::UnsupportedControllerType; +#endif } Common::Input::DriverResult JoyconDriver::InitializeDevice() { @@ -138,8 +141,6 @@ void JoyconDriver::InputThread(std::stop_token stop_token) { Common::SetCurrentThreadName("JoyconInput"); input_thread_running = true; - // Max update rate is 5ms, ensure we are always able to read a bit faster - constexpr int ThreadDelay = 3; std::vector buffer(MaxBufferSize); while (!stop_token.stop_requested()) { @@ -150,14 +151,17 @@ void JoyconDriver::InputThread(std::stop_token stop_token) { continue; } +#if SDL_VERSION_ATLEAST(2, 26, 4) + // Max update rate is 5ms, ensure we are always able to read a bit faster + int constexpr thread_delay = 3; // By disabling the input thread we can ensure custom commands will succeed as no package is // skipped if (!disable_input_thread) { - status = SDL_hid_read_timeout(hidapi_handle->handle, buffer.data(), buffer.size(), - ThreadDelay); + status = SDL_hid_read_timeout(hidapi_handle->handle, buffer.data(), buffer.size(), thread_delay); } else { - std::this_thread::sleep_for(std::chrono::milliseconds(ThreadDelay)); + std::this_thread::sleep_for(std::chrono::milliseconds(thread_delay)); } +#endif if (IsPayloadCorrect(status, buffer)) { OnNewData(buffer); @@ -690,19 +694,18 @@ void JoyconDriver::SetCallbacks(const JoyconCallbacks& callbacks) { joycon_poller->SetCallbacks(callbacks); } -Common::Input::DriverResult JoyconDriver::GetDeviceType(SDL_hid_device_info* device_info, - ControllerType& controller_type) { +Common::Input::DriverResult JoyconDriver::GetDeviceType(SDL_hid_device_info* device_info, ControllerType& controller_type) { +#if SDL_VERSION_ATLEAST(2, 26, 4) static constexpr std::array, 6> supported_devices{ std::pair{0x2006, ControllerType::Left}, {0x2007, ControllerType::Right}, {0x2009, ControllerType::Pro}, }; - constexpr u16 nintendo_vendor_id = 0x057e; + constexpr u16 nintendo_vendor_id = 0x057e; controller_type = ControllerType::None; - if (device_info->vendor_id != nintendo_vendor_id) { + if (device_info->vendor_id != nintendo_vendor_id) return Common::Input::DriverResult::UnsupportedControllerType; - } for (const auto& [product_id, type] : supported_devices) { if (device_info->product_id == static_cast(product_id)) { @@ -710,16 +713,20 @@ Common::Input::DriverResult JoyconDriver::GetDeviceType(SDL_hid_device_info* dev return Common::Input::DriverResult::Success; } } +#endif return Common::Input::DriverResult::UnsupportedControllerType; } -Common::Input::DriverResult JoyconDriver::GetSerialNumber(SDL_hid_device_info* device_info, - SerialNumber& serial_number) { +Common::Input::DriverResult JoyconDriver::GetSerialNumber(SDL_hid_device_info* device_info, SerialNumber& serial_number) { +#if SDL_VERSION_ATLEAST(2, 26, 4) if (device_info->serial_number == nullptr) { return Common::Input::DriverResult::Unknown; } std::memcpy(&serial_number, device_info->serial_number, 15); return Common::Input::DriverResult::Success; +#else + return Common::Input::DriverResult::Unknown; +#endif } } // namespace InputCommon::Joycon diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.cpp b/src/input_common/helpers/joycon_protocol/common_protocol.cpp index a6eecf9802..669e89f064 100644 --- a/src/input_common/helpers/joycon_protocol/common_protocol.cpp +++ b/src/input_common/helpers/joycon_protocol/common_protocol.cpp @@ -15,11 +15,15 @@ u8 JoyconCommonProtocol::GetCounter() { } void JoyconCommonProtocol::SetBlocking() { +#if SDL_VERSION_ATLEAST(2, 26, 4) SDL_hid_set_nonblocking(hidapi_handle->handle, 0); +#endif } void JoyconCommonProtocol::SetNonBlocking() { +#if SDL_VERSION_ATLEAST(2, 26, 4) SDL_hid_set_nonblocking(hidapi_handle->handle, 1); +#endif } Common::Input::DriverResult JoyconCommonProtocol::GetDeviceType(ControllerType& controller_type) { @@ -35,26 +39,23 @@ Common::Input::DriverResult JoyconCommonProtocol::GetDeviceType(ControllerType& return result; } -Common::Input::DriverResult JoyconCommonProtocol::CheckDeviceAccess( - SDL_hid_device_info* device_info) { +Common::Input::DriverResult JoyconCommonProtocol::CheckDeviceAccess(SDL_hid_device_info* device_info) { ControllerType controller_type{ControllerType::None}; const auto result = GetDeviceType(controller_type); - if (result != Common::Input::DriverResult::Success || controller_type == ControllerType::None) { return Common::Input::DriverResult::UnsupportedControllerType; } - - hidapi_handle->handle = - SDL_hid_open(device_info->vendor_id, device_info->product_id, device_info->serial_number); - +#if SDL_VERSION_ATLEAST(2, 26, 4) + hidapi_handle->handle = SDL_hid_open(device_info->vendor_id, device_info->product_id, device_info->serial_number); if (!hidapi_handle->handle) { - LOG_ERROR(Input, "Yuzu can't gain access to this device: ID {:04X}:{:04X}.", - device_info->vendor_id, device_info->product_id); + LOG_ERROR(Input, "Yuzu can't gain access to this device: ID {:04X}:{:04X}.", device_info->vendor_id, device_info->product_id); return Common::Input::DriverResult::HandleInUse; } - SetNonBlocking(); return Common::Input::DriverResult::Success; +#else + return Common::Input::DriverResult::UnsupportedControllerType; +#endif } Common::Input::DriverResult JoyconCommonProtocol::SetReportMode(ReportMode report_mode) { @@ -63,21 +64,21 @@ Common::Input::DriverResult JoyconCommonProtocol::SetReportMode(ReportMode repor } Common::Input::DriverResult JoyconCommonProtocol::SendRawData(std::span buffer) { - const auto result = SDL_hid_write(hidapi_handle->handle, buffer.data(), buffer.size()); - - if (result == -1) { +#if SDL_VERSION_ATLEAST(2, 26, 4) + auto const result = SDL_hid_write(hidapi_handle->handle, buffer.data(), buffer.size()); + if (result == -1) return Common::Input::DriverResult::ErrorWritingData; - } - return Common::Input::DriverResult::Success; +#else + return Common::Input::DriverResult::ErrorWritingData; +#endif } -Common::Input::DriverResult JoyconCommonProtocol::GetSubCommandResponse( - SubCommand sc, SubCommandResponse& output) { +Common::Input::DriverResult JoyconCommonProtocol::GetSubCommandResponse(SubCommand sc, SubCommandResponse& output) { +#if SDL_VERSION_ATLEAST(2, 26, 4) constexpr int timeout_mili = 66; constexpr int MaxTries = 10; int tries = 0; - do { int result = SDL_hid_read_timeout(hidapi_handle->handle, reinterpret_cast(&output), sizeof(SubCommandResponse), timeout_mili); @@ -88,9 +89,8 @@ Common::Input::DriverResult JoyconCommonProtocol::GetSubCommandResponse( if (tries++ > MaxTries) { return Common::Input::DriverResult::Timeout; } - } while (output.input_report.report_mode != ReportMode::SUBCMD_REPLY && - output.sub_command != sc); - + } while (output.input_report.report_mode != ReportMode::SUBCMD_REPLY && output.sub_command != sc); +#endif return Common::Input::DriverResult::Success; } @@ -218,12 +218,11 @@ Common::Input::DriverResult JoyconCommonProtocol::ConfigureMCU(const MCUConfig& return result; } -Common::Input::DriverResult JoyconCommonProtocol::GetMCUDataResponse(ReportMode report_mode, - MCUCommandResponse& output) { +Common::Input::DriverResult JoyconCommonProtocol::GetMCUDataResponse(ReportMode report_mode, MCUCommandResponse& output) { +#if SDL_VERSION_ATLEAST(2, 26, 4) constexpr int TimeoutMili = 200; constexpr int MaxTries = 9; int tries = 0; - do { int result = SDL_hid_read_timeout(hidapi_handle->handle, reinterpret_cast(&output), sizeof(MCUCommandResponse), TimeoutMili); @@ -234,9 +233,8 @@ Common::Input::DriverResult JoyconCommonProtocol::GetMCUDataResponse(ReportMode if (tries++ > MaxTries) { return Common::Input::DriverResult::Timeout; } - } while (output.input_report.report_mode != report_mode || - output.mcu_report == MCUReport::EmptyAwaitingCmd); - + } while (output.input_report.report_mode != report_mode || output.mcu_report == MCUReport::EmptyAwaitingCmd); +#endif return Common::Input::DriverResult::Success; } diff --git a/src/input_common/helpers/joycon_protocol/joycon_types.h b/src/input_common/helpers/joycon_protocol/joycon_types.h index 792f124e14..9be84b36a2 100644 --- a/src/input_common/helpers/joycon_protocol/joycon_types.h +++ b/src/input_common/helpers/joycon_protocol/joycon_types.h @@ -10,7 +10,14 @@ #include #include -#include + +#include +#if SDL_VERSION_ATLEAST(2, 26, 4) +# include +#else +struct SDL_hid_device; +struct SDL_hid_device_info; +#endif #include "common/bit_field.h" #include "common/common_funcs.h" diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 8abeb90086..b23ce33ed3 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -438,7 +438,8 @@ if (YUZU_USE_BUNDLED_QT) endif() if (ENABLE_SDL2) - target_link_libraries(yuzu PRIVATE SDL2::SDL2) + target_include_directories(yuzu PRIVATE ${CMAKE_SYSROOT}/include/SDL2) + target_link_libraries(yuzu PRIVATE SDL2) target_compile_definitions(yuzu PRIVATE HAVE_SDL2) endif() diff --git a/src/yuzu_cmd/CMakeLists.txt b/src/yuzu_cmd/CMakeLists.txt index 8e275bb1a0..431c85679b 100644 --- a/src/yuzu_cmd/CMakeLists.txt +++ b/src/yuzu_cmd/CMakeLists.txt @@ -42,7 +42,8 @@ target_link_libraries(yuzu-cmd PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads) create_resource("../../dist/yuzu.bmp" "yuzu_cmd/yuzu_icon.h" "yuzu_icon") target_include_directories(yuzu-cmd PRIVATE ${RESOURCES_DIR}) -target_link_libraries(yuzu-cmd PRIVATE SDL2::SDL2) +target_include_directories(yuzu-cmd PRIVATE ${CMAKE_SYSROOT}/include/SDL2) +target_link_libraries(yuzu-cmd PRIVATE SDL2) if(UNIX AND NOT APPLE) install(TARGETS yuzu-cmd) diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index a1e65d3e8e..4414d0b23a 100644 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -59,6 +59,7 @@ STUB_WEAK(ZSTD_trace_compress_begin) STUB_WEAK(ZSTD_trace_compress_end) STUB_WEAK(ZSTD_trace_decompress_begin) STUB_WEAK(ZSTD_trace_decompress_end) +FILE* __stderrp = stdout; # undef STUB_WEAK #endif #ifdef _WIN32