Compare commits
11 commits
13e6d63c12
...
47b5b8d98c
Author | SHA1 | Date | |
---|---|---|---|
![]() |
47b5b8d98c | ||
![]() |
49680cc6b9 | ||
13ecc1e481 | |||
2502352180 | |||
9d2681ecc9 | |||
428f136a75 | |||
ecc99ce9ab | |||
2f82b63e6a | |||
43c41e4db5 | |||
10dd003d0f | |||
37e0b80766 |
321 changed files with 2029 additions and 1952 deletions
|
@ -1,6 +1,7 @@
|
||||||
#!/bin/sh -e
|
#!/bin/sh -e
|
||||||
|
|
||||||
HEADER="$(cat "$PWD/.ci/license/header.txt")"
|
HEADER="$(cat "$PWD/.ci/license/header.txt")"
|
||||||
|
HEADER_HASH="$(cat "$PWD/.ci/license/header-hash.txt")"
|
||||||
|
|
||||||
echo "Getting branch changes"
|
echo "Getting branch changes"
|
||||||
|
|
||||||
|
@ -13,41 +14,86 @@ FILES=`git diff-tree --no-commit-id --name-only ${RANGE} -r`
|
||||||
|
|
||||||
echo "Done"
|
echo "Done"
|
||||||
|
|
||||||
|
check_header() {
|
||||||
|
CONTENT="`head -n3 < $1`"
|
||||||
|
case "$CONTENT" in
|
||||||
|
"$HEADER"*) ;;
|
||||||
|
*) BAD_FILES="$BAD_FILES $1" ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
check_cmake_header() {
|
||||||
|
CONTENT="`head -n3 < $1`"
|
||||||
|
|
||||||
|
case "$CONTENT" in
|
||||||
|
"$HEADER_HASH"*) ;;
|
||||||
|
*)
|
||||||
|
BAD_CMAKE="$BAD_CMAKE $1" ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
for file in $FILES; do
|
for file in $FILES; do
|
||||||
[ -f "$file" ] || continue
|
[ -f "$file" ] || continue
|
||||||
|
|
||||||
|
if [ `basename -- "$file"` = "CMakeLists.txt" ]; then
|
||||||
|
check_cmake_header "$file"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
EXTENSION="${file##*.}"
|
EXTENSION="${file##*.}"
|
||||||
case "$EXTENSION" in
|
case "$EXTENSION" in
|
||||||
kts|kt|cpp|h)
|
kts|kt|cpp|h)
|
||||||
CONTENT="`cat $file`"
|
check_header "$file"
|
||||||
case "$CONTENT" in
|
;;
|
||||||
"$HEADER"*) ;;
|
cmake)
|
||||||
*) BAD_FILES="$BAD_FILES $file" ;;
|
check_cmake_header "$file"
|
||||||
esac
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ "$BAD_FILES" = "" ]; then
|
if [ "$BAD_FILES" = "" ] && [ "$BAD_CMAKE" = "" ]; then
|
||||||
echo
|
echo
|
||||||
echo "All good."
|
echo "All good."
|
||||||
|
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "The following files have incorrect license headers:"
|
if [ "$BAD_FILES" != "" ]; then
|
||||||
echo
|
echo "The following source files have incorrect license headers:"
|
||||||
|
echo
|
||||||
|
|
||||||
for file in $BAD_FILES; do echo $file; done
|
for file in $BAD_FILES; do echo $file; done
|
||||||
|
|
||||||
cat << EOF
|
cat << EOF
|
||||||
|
|
||||||
The following license header should be added to the start of all offending files:
|
The following license header should be added to the start of all offending SOURCE files:
|
||||||
|
|
||||||
=== BEGIN ===
|
=== BEGIN ===
|
||||||
$HEADER
|
$HEADER
|
||||||
=== END ===
|
=== END ===
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$BAD_CMAKE" != "" ]; then
|
||||||
|
echo "The following CMake files have incorrect license headers:"
|
||||||
|
echo
|
||||||
|
|
||||||
|
for file in $BAD_CMAKE; do echo $file; done
|
||||||
|
|
||||||
|
cat << EOF
|
||||||
|
|
||||||
|
The following license header should be added to the start of all offending CMake files:
|
||||||
|
|
||||||
|
=== BEGIN ===
|
||||||
|
$HEADER_HASH
|
||||||
|
=== END ===
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat << EOF
|
||||||
If some of the code in this PR is not being contributed by the original author,
|
If some of the code in this PR is not being contributed by the original author,
|
||||||
the files which have been exclusively changed by that code can be ignored.
|
the files which have been exclusively changed by that code can be ignored.
|
||||||
If this happens, this PR requirement can be bypassed once all other files are addressed.
|
If this happens, this PR requirement can be bypassed once all other files are addressed.
|
||||||
|
@ -70,6 +116,17 @@ if [ "$FIX" = "true" ]; then
|
||||||
git add $file
|
git add $file
|
||||||
done
|
done
|
||||||
|
|
||||||
|
for file in $BAD_CMAKE; do
|
||||||
|
cat $file > $file.bak
|
||||||
|
|
||||||
|
cat .ci/license/header-hash.txt > $file
|
||||||
|
echo >> $file
|
||||||
|
cat $file.bak >> $file
|
||||||
|
|
||||||
|
rm $file.bak
|
||||||
|
|
||||||
|
git add $file
|
||||||
|
done
|
||||||
echo "License headers fixed."
|
echo "License headers fixed."
|
||||||
|
|
||||||
if [ "$COMMIT" = "true" ]; then
|
if [ "$COMMIT" = "true" ]; then
|
||||||
|
|
2
.ci/license/header-hash.txt
Normal file
2
.ci/license/header-hash.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
@ -104,6 +104,7 @@ cmake .. -G Ninja \
|
||||||
-DYUZU_USE_QT_WEB_ENGINE=$WEBENGINE \
|
-DYUZU_USE_QT_WEB_ENGINE=$WEBENGINE \
|
||||||
-DYUZU_USE_FASTER_LD=ON \
|
-DYUZU_USE_FASTER_LD=ON \
|
||||||
-DYUZU_ENABLE_LTO=ON \
|
-DYUZU_ENABLE_LTO=ON \
|
||||||
|
-DDYNARMIC_ENABLE_LTO=ON \
|
||||||
"${EXTRA_CMAKE_FLAGS[@]}"
|
"${EXTRA_CMAKE_FLAGS[@]}"
|
||||||
|
|
||||||
ninja -j${NPROC}
|
ninja -j${NPROC}
|
||||||
|
|
|
@ -1,58 +1,45 @@
|
||||||
#!/bin/bash -e
|
#!/bin/bash -ex
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2025 eden Emulator Project
|
# SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
if [ "$DEVEL" != "true" ]; then
|
if [ "$COMPILER" == "clang" ]
|
||||||
export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DENABLE_QT_UPDATE_CHECKER=ON)
|
then
|
||||||
|
EXTRA_CMAKE_FLAGS+=(
|
||||||
|
-DCMAKE_CXX_COMPILER=clang-cl
|
||||||
|
-DCMAKE_C_COMPILER=clang-cl
|
||||||
|
-DCMAKE_CXX_FLAGS="-O3"
|
||||||
|
-DCMAKE_C_FLAGS="-O3"
|
||||||
|
)
|
||||||
|
|
||||||
|
BUILD_TYPE="RelWithDebInfo"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$CCACHE" = "true" ]; then
|
[ -z "$WINDEPLOYQT" ] && { echo "WINDEPLOYQT environment variable required."; exit 1; }
|
||||||
export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DUSE_CCACHE=ON)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$BUNDLE_QT" = "true" ]; then
|
echo $EXTRA_CMAKE_FLAGS
|
||||||
export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DYUZU_USE_BUNDLED_QT=ON)
|
|
||||||
else
|
|
||||||
export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DYUZU_USE_BUNDLED_QT=OFF)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$BUILD_TYPE" ]; then
|
|
||||||
export BUILD_TYPE="Release"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$WINDEPLOYQT" == "" ]; then
|
|
||||||
echo "You must supply the WINDEPLOYQT environment variable."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$USE_WEBENGINE" = "true" ]; then
|
|
||||||
WEBENGINE=ON
|
|
||||||
else
|
|
||||||
WEBENGINE=OFF
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$USE_MULTIMEDIA" = "false" ]; then
|
|
||||||
MULTIMEDIA=OFF
|
|
||||||
else
|
|
||||||
MULTIMEDIA=ON
|
|
||||||
fi
|
|
||||||
|
|
||||||
export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@)
|
|
||||||
|
|
||||||
mkdir -p build && cd build
|
mkdir -p build && cd build
|
||||||
cmake .. -G Ninja \
|
cmake .. -G Ninja \
|
||||||
-DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
|
-DCMAKE_BUILD_TYPE="${BUILD_TYPE:-Release}" \
|
||||||
-DENABLE_QT_TRANSLATION=ON \
|
-DENABLE_QT_TRANSLATION=ON \
|
||||||
-DUSE_DISCORD_PRESENCE=ON \
|
-DUSE_DISCORD_PRESENCE=ON \
|
||||||
-DYUZU_USE_BUNDLED_SDL2=ON \
|
-DYUZU_USE_BUNDLED_SDL2=ON \
|
||||||
|
-DBUILD_TESTING=OFF \
|
||||||
-DYUZU_TESTS=OFF \
|
-DYUZU_TESTS=OFF \
|
||||||
|
-DDYNARMIC_TESTS=OFF \
|
||||||
-DYUZU_CMD=OFF \
|
-DYUZU_CMD=OFF \
|
||||||
-DYUZU_ROOM_STANDALONE=OFF \
|
-DYUZU_ROOM_STANDALONE=OFF \
|
||||||
-DYUZU_USE_QT_MULTIMEDIA=$MULTIMEDIA \
|
-DYUZU_USE_QT_MULTIMEDIA=${USE_MULTIMEDIA:-false} \
|
||||||
-DYUZU_USE_QT_WEB_ENGINE=$WEBENGINE \
|
-DYUZU_USE_QT_WEB_ENGINE=${USE_WEBENGINE:-false} \
|
||||||
-DYUZU_ENABLE_LTO=ON \
|
-DYUZU_ENABLE_LTO=ON \
|
||||||
"${EXTRA_CMAKE_FLAGS[@]}"
|
-DCMAKE_EXE_LINKER_FLAGS=" /LTCG" \
|
||||||
|
-DDYNARMIC_ENABLE_LTO=ON \
|
||||||
|
-DYUZU_USE_BUNDLED_QT=${BUNDLE_QT:-false} \
|
||||||
|
-DUSE_CCACHE=${CCACHE:-false} \
|
||||||
|
-DENABLE_QT_UPDATE_CHECKER=${DEVEL:-true} \
|
||||||
|
"${EXTRA_CMAKE_FLAGS[@]}" \
|
||||||
|
"$@"
|
||||||
|
|
||||||
ninja
|
ninja
|
||||||
|
|
||||||
|
@ -61,4 +48,5 @@ rm -f bin/*.pdb
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
$WINDEPLOYQT --release --no-compiler-runtime --no-opengl-sw --no-system-dxc-compiler --no-system-d3d-compiler --dir pkg bin/eden.exe
|
$WINDEPLOYQT --release --no-compiler-runtime --no-opengl-sw --no-system-dxc-compiler --no-system-d3d-compiler --dir pkg bin/eden.exe
|
||||||
|
|
||||||
cp bin/* pkg
|
cp bin/* pkg
|
||||||
|
|
6
.gitmodules
vendored
6
.gitmodules
vendored
|
@ -1,6 +0,0 @@
|
||||||
# SPDX-FileCopyrightText: 2014 Citra Emulator Project
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
[submodule "libusb"]
|
|
||||||
path = externals/libusb/libusb
|
|
||||||
url = https://github.com/libusb/libusb.git
|
|
13
.patch/boost/0001-clang-cl.patch
Normal file
13
.patch/boost/0001-clang-cl.patch
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
diff --git a/libs/cobalt/include/boost/cobalt/concepts.hpp b/libs/cobalt/include/boost/cobalt/concepts.hpp
|
||||||
|
index d49f2ec..a9bdb80 100644
|
||||||
|
--- a/libs/cobalt/include/boost/cobalt/concepts.hpp
|
||||||
|
+++ b/libs/cobalt/include/boost/cobalt/concepts.hpp
|
||||||
|
@@ -62,7 +62,7 @@ struct enable_awaitables
|
||||||
|
template <typename T>
|
||||||
|
concept with_get_executor = requires (T& t)
|
||||||
|
{
|
||||||
|
- {t.get_executor()} -> asio::execution::executor;
|
||||||
|
+ t.get_executor();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
11
.patch/boost/0002-use-marmasm.patch
Normal file
11
.patch/boost/0002-use-marmasm.patch
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
--- a/libs/context/CMakeLists.txt 2025-09-08 00:42:31.303651800 -0400
|
||||||
|
+++ b/libs/context/CMakeLists.txt 2025-09-08 00:42:40.592184300 -0400
|
||||||
|
@@ -146,7 +146,7 @@
|
||||||
|
set(ASM_LANGUAGE ASM)
|
||||||
|
endif()
|
||||||
|
elseif(BOOST_CONTEXT_ASSEMBLER STREQUAL armasm)
|
||||||
|
- set(ASM_LANGUAGE ASM_ARMASM)
|
||||||
|
+ set(ASM_LANGUAGE ASM_MARMASM)
|
||||||
|
else()
|
||||||
|
set(ASM_LANGUAGE ASM_MASM)
|
||||||
|
endif()
|
14
.patch/boost/0003-armasm-options.patch
Normal file
14
.patch/boost/0003-armasm-options.patch
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
diff --git a/libs/context/CMakeLists.txt b/libs/context/CMakeLists.txt
|
||||||
|
index 8210f65..0e59dd7 100644
|
||||||
|
--- a/libs/context/CMakeLists.txt
|
||||||
|
+++ b/libs/context/CMakeLists.txt
|
||||||
|
@@ -186,7 +186,8 @@ if(BOOST_CONTEXT_IMPLEMENTATION STREQUAL "fcontext")
|
||||||
|
set_property(SOURCE ${ASM_SOURCES} APPEND PROPERTY COMPILE_OPTIONS "/safeseh")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
- else() # masm
|
||||||
|
+ # armasm doesn't support most of these options
|
||||||
|
+ elseif(NOT BOOST_CONTEXT_ASSEMBLER STREQUAL armasm) # masm
|
||||||
|
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
|
set_property(SOURCE ${ASM_SOURCES} APPEND PROPERTY COMPILE_OPTIONS "-x" "assembler-with-cpp")
|
||||||
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
|
@ -1,47 +0,0 @@
|
||||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
|
||||||
index 8c1761f..52c4ca4 100644
|
|
||||||
--- a/CMakeLists.txt
|
|
||||||
+++ b/CMakeLists.txt
|
|
||||||
@@ -69,42 +69,3 @@ endif()
|
|
||||||
if(CPP_JWT_BUILD_EXAMPLES)
|
|
||||||
add_subdirectory(examples)
|
|
||||||
endif()
|
|
||||||
-
|
|
||||||
-# ##############################################################################
|
|
||||||
-# INSTALL
|
|
||||||
-# ##############################################################################
|
|
||||||
-
|
|
||||||
-include(GNUInstallDirs)
|
|
||||||
-include(CMakePackageConfigHelpers)
|
|
||||||
-set(CPP_JWT_CONFIG_INSTALL_DIR ${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME})
|
|
||||||
-
|
|
||||||
-install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets)
|
|
||||||
-install(
|
|
||||||
- EXPORT ${PROJECT_NAME}Targets
|
|
||||||
- DESTINATION ${CPP_JWT_CONFIG_INSTALL_DIR}
|
|
||||||
- NAMESPACE ${PROJECT_NAME}::
|
|
||||||
- COMPONENT dev)
|
|
||||||
-configure_package_config_file(cmake/Config.cmake.in ${PROJECT_NAME}Config.cmake
|
|
||||||
- INSTALL_DESTINATION ${CPP_JWT_CONFIG_INSTALL_DIR}
|
|
||||||
- NO_SET_AND_CHECK_MACRO)
|
|
||||||
-write_basic_package_version_file(${PROJECT_NAME}ConfigVersion.cmake
|
|
||||||
- COMPATIBILITY SameMajorVersion
|
|
||||||
- ARCH_INDEPENDENT)
|
|
||||||
-install(
|
|
||||||
- FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
|
|
||||||
- ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
|
|
||||||
- DESTINATION ${CPP_JWT_CONFIG_INSTALL_DIR}
|
|
||||||
- COMPONENT dev)
|
|
||||||
-
|
|
||||||
-if(NOT CPP_JWT_USE_VENDORED_NLOHMANN_JSON)
|
|
||||||
- set(CPP_JWT_VENDORED_NLOHMANN_JSON_INSTALL_PATTERN PATTERN "json" EXCLUDE)
|
|
||||||
-endif()
|
|
||||||
-install(
|
|
||||||
- DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/jwt/
|
|
||||||
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/jwt
|
|
||||||
- COMPONENT dev
|
|
||||||
- FILES_MATCHING
|
|
||||||
- PATTERN "*.hpp"
|
|
||||||
- PATTERN "*.ipp"
|
|
||||||
- PATTERN "test" EXCLUDE
|
|
||||||
- ${CPP_JWT_VENDORED_NLOHMANN_JSON_INSTALL_PATTERN})
|
|
|
@ -1,13 +0,0 @@
|
||||||
diff --git a/include/jwt/algorithm.hpp b/include/jwt/algorithm.hpp
|
|
||||||
index 0e3b843..1156e6a 100644
|
|
||||||
--- a/include/jwt/algorithm.hpp
|
|
||||||
+++ b/include/jwt/algorithm.hpp
|
|
||||||
@@ -64,6 +64,8 @@ using verify_func_t = verify_result_t (*) (const jwt::string_view key,
|
|
||||||
const jwt::string_view head,
|
|
||||||
const jwt::string_view jwt_sign);
|
|
||||||
|
|
||||||
+verify_result_t is_secret_a_public_key(const jwt::string_view secret);
|
|
||||||
+
|
|
||||||
namespace algo {
|
|
||||||
|
|
||||||
//Me: TODO: All these can be done using code generaion.
|
|
|
@ -1,10 +0,0 @@
|
||||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
|
||||||
index 5dad9e9..760a1b2 100644
|
|
||||||
--- a/CMakeLists.txt
|
|
||||||
+++ b/CMakeLists.txt
|
|
||||||
@@ -1,4 +1,4 @@
|
|
||||||
-cmake_minimum_required (VERSION 3.2.0)
|
|
||||||
+cmake_minimum_required (VERSION 3.10)
|
|
||||||
project (DiscordRPC)
|
|
||||||
|
|
||||||
include(GNUInstallDirs)
|
|
|
@ -1,40 +0,0 @@
|
||||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
|
||||||
index 760a1b2..540d643 100644
|
|
||||||
--- a/CMakeLists.txt
|
|
||||||
+++ b/CMakeLists.txt
|
|
||||||
@@ -12,20 +12,6 @@ file(GLOB_RECURSE ALL_SOURCE_FILES
|
|
||||||
src/*.cpp src/*.h src/*.c
|
|
||||||
)
|
|
||||||
|
|
||||||
-# Set CLANG_FORMAT_SUFFIX if you are using custom clang-format, e.g. clang-format-5.0
|
|
||||||
-find_program(CLANG_FORMAT_CMD clang-format${CLANG_FORMAT_SUFFIX})
|
|
||||||
-
|
|
||||||
-if (CLANG_FORMAT_CMD)
|
|
||||||
- add_custom_target(
|
|
||||||
- clangformat
|
|
||||||
- COMMAND ${CLANG_FORMAT_CMD}
|
|
||||||
- -i -style=file -fallback-style=none
|
|
||||||
- ${ALL_SOURCE_FILES}
|
|
||||||
- DEPENDS
|
|
||||||
- ${ALL_SOURCE_FILES}
|
|
||||||
- )
|
|
||||||
-endif(CLANG_FORMAT_CMD)
|
|
||||||
-
|
|
||||||
# thirdparty stuff
|
|
||||||
execute_process(
|
|
||||||
COMMAND mkdir ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty
|
|
||||||
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
|
|
||||||
index 290d761..cd2cc92 100644
|
|
||||||
--- a/src/CMakeLists.txt
|
|
||||||
+++ b/src/CMakeLists.txt
|
|
||||||
@@ -120,10 +120,6 @@ if (${BUILD_SHARED_LIBS})
|
|
||||||
target_compile_definitions(discord-rpc PRIVATE -DDISCORD_BUILDING_SDK)
|
|
||||||
endif(${BUILD_SHARED_LIBS})
|
|
||||||
|
|
||||||
-if (CLANG_FORMAT_CMD)
|
|
||||||
- add_dependencies(discord-rpc clangformat)
|
|
||||||
-endif(CLANG_FORMAT_CMD)
|
|
||||||
-
|
|
||||||
# install
|
|
||||||
|
|
||||||
install(
|
|
|
@ -1,31 +0,0 @@
|
||||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
|
||||||
index 540d643..5d12f3d 100644
|
|
||||||
--- a/CMakeLists.txt
|
|
||||||
+++ b/CMakeLists.txt
|
|
||||||
@@ -17,12 +17,14 @@ execute_process(
|
|
||||||
COMMAND mkdir ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty
|
|
||||||
ERROR_QUIET
|
|
||||||
)
|
|
||||||
+# new commit that fixes c++17
|
|
||||||
+set(RAPIDJSON_SHA 3b2441b87f99ab65f37b141a7b548ebadb607b96)
|
|
||||||
|
|
||||||
-find_file(RAPIDJSONTEST NAMES rapidjson rapidjson-1.1.0 PATHS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty CMAKE_FIND_ROOT_PATH_BOTH)
|
|
||||||
+find_file(RAPIDJSONTEST NAMES rapidjson rapidjson-${RAPIDJSON_SHA} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty CMAKE_FIND_ROOT_PATH_BOTH)
|
|
||||||
if (NOT RAPIDJSONTEST)
|
|
||||||
message("no rapidjson, download")
|
|
||||||
- set(RJ_TAR_FILE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/v1.1.0.tar.gz)
|
|
||||||
- file(DOWNLOAD https://github.com/miloyip/rapidjson/archive/v1.1.0.tar.gz ${RJ_TAR_FILE})
|
|
||||||
+ set(RJ_TAR_FILE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/${RAPIDJSON_SHA}.tar.gz)
|
|
||||||
+ file(DOWNLOAD https://github.com/miloyip/rapidjson/archive/${RAPIDJSON_SHA}.tar.gz ${RJ_TAR_FILE})
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E tar xzf ${RJ_TAR_FILE}
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty
|
|
||||||
@@ -30,7 +32,7 @@ if (NOT RAPIDJSONTEST)
|
|
||||||
file(REMOVE ${RJ_TAR_FILE})
|
|
||||||
endif(NOT RAPIDJSONTEST)
|
|
||||||
|
|
||||||
-find_file(RAPIDJSON NAMES rapidjson rapidjson-1.1.0 PATHS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty CMAKE_FIND_ROOT_PATH_BOTH)
|
|
||||||
+find_file(RAPIDJSON NAMES rapidjson rapidjson-${RAPIDJSON_SHA} PATHS ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty CMAKE_FIND_ROOT_PATH_BOTH)
|
|
||||||
|
|
||||||
add_library(rapidjson STATIC IMPORTED ${RAPIDJSON})
|
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
From e59d30b7b12e1d04cc2fc9c6219e35bda447c17e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Lizzie <159065448+Lizzie841@users.noreply.github.com>
|
|
||||||
Date: Fri, 16 May 2025 04:12:13 +0100
|
|
||||||
Subject: [PATCH] Update CMakeLists.txt
|
|
||||||
|
|
||||||
---
|
|
||||||
CMakeLists.txt | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
|
||||||
index b5f4c4f..c5c6f31 100644
|
|
||||||
--- a/CMakeLists.txt
|
|
||||||
+++ b/CMakeLists.txt
|
|
||||||
@@ -24,7 +24,7 @@ target_include_directories(
|
|
||||||
|
|
||||||
target_compile_features(unordered_dense INTERFACE cxx_std_17)
|
|
||||||
|
|
||||||
-if(_unordered_dense_is_toplevel_project)
|
|
||||||
+if(_unordered_dense_is_toplevel_project OR UNORDERED_DENSE_INSTALL)
|
|
||||||
# locations are provided by GNUInstallDirs
|
|
||||||
install(
|
|
||||||
TARGETS unordered_dense
|
|
270
CMakeLists.txt
270
CMakeLists.txt
|
@ -15,6 +15,21 @@ elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
||||||
set(PLATFORM_LINUX ON)
|
set(PLATFORM_LINUX ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
|
set(CXX_CLANG ON)
|
||||||
|
if (MSVC)
|
||||||
|
set(CXX_CLANG_CL ON)
|
||||||
|
endif()
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
|
set(CXX_GCC ON)
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
|
set(CXX_CL ON)
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
|
||||||
|
set(CXX_ICC ON)
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
||||||
|
set(CXX_APPLE ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
||||||
if (PLATFORM_SUN)
|
if (PLATFORM_SUN)
|
||||||
|
@ -29,6 +44,77 @@ if (PLATFORM_SUN)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Detect current compilation architecture and create standard definitions
|
||||||
|
# =======================================================================
|
||||||
|
|
||||||
|
include(CheckSymbolExists)
|
||||||
|
function(detect_architecture symbol arch)
|
||||||
|
if (NOT DEFINED ARCHITECTURE)
|
||||||
|
set(CMAKE_REQUIRED_QUIET 1)
|
||||||
|
check_symbol_exists("${symbol}" "" ARCHITECTURE_${arch})
|
||||||
|
unset(CMAKE_REQUIRED_QUIET)
|
||||||
|
|
||||||
|
# The output variable needs to be unique across invocations otherwise
|
||||||
|
# CMake's crazy scope rules will keep it defined
|
||||||
|
if (ARCHITECTURE_${arch})
|
||||||
|
set(ARCHITECTURE "${arch}" PARENT_SCOPE)
|
||||||
|
set(ARCHITECTURE_${arch} 1 PARENT_SCOPE)
|
||||||
|
add_definitions(-DARCHITECTURE_${arch}=1)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
if (NOT ENABLE_GENERIC)
|
||||||
|
if (MSVC)
|
||||||
|
detect_architecture("_M_AMD64" x86_64)
|
||||||
|
detect_architecture("_M_IX86" x86)
|
||||||
|
detect_architecture("_M_ARM" arm)
|
||||||
|
detect_architecture("_M_ARM64" arm64)
|
||||||
|
else()
|
||||||
|
detect_architecture("__x86_64__" x86_64)
|
||||||
|
detect_architecture("__i386__" x86)
|
||||||
|
detect_architecture("__arm__" arm)
|
||||||
|
detect_architecture("__aarch64__" arm64)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT DEFINED ARCHITECTURE)
|
||||||
|
set(ARCHITECTURE "GENERIC")
|
||||||
|
set(ARCHITECTURE_GENERIC 1)
|
||||||
|
add_definitions(-DARCHITECTURE_GENERIC=1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Target architecture: ${ARCHITECTURE}")
|
||||||
|
|
||||||
|
if (MSVC AND ARCHITECTURE_x86)
|
||||||
|
message(FATAL_ERROR "Attempting to build with the x86 environment is not supported. \
|
||||||
|
This can typically happen if you used the Developer Command Prompt from the start menu;\
|
||||||
|
instead, run vcvars64.bat directly, located at C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvars64.bat")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (CXX_CLANG_CL)
|
||||||
|
add_compile_options(
|
||||||
|
# clang-cl prints literally 10000+ warnings without this
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-unused-command-line-argument>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-unsafe-buffer-usage>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-unused-value>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-extra-semi-stmt>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-sign-conversion>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-reserved-identifier>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-deprecated-declarations>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-cast-function-type-mismatch>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:/EHsc> # thanks microsoft
|
||||||
|
)
|
||||||
|
|
||||||
|
if (ARCHITECTURE_x86_64)
|
||||||
|
add_compile_options(
|
||||||
|
# Required CPU features for amd64
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-msse4.1>
|
||||||
|
$<$<COMPILE_LANGUAGE:C,CXX>:-mcx16>
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm)
|
set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm)
|
||||||
|
|
||||||
include(DownloadExternals)
|
include(DownloadExternals)
|
||||||
|
@ -36,7 +122,7 @@ include(CMakeDependentOption)
|
||||||
include(CTest)
|
include(CTest)
|
||||||
|
|
||||||
# Disable Warnings as Errors for MSVC
|
# Disable Warnings as Errors for MSVC
|
||||||
if (MSVC)
|
if (CXX_CL)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX-")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX-")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -48,17 +134,17 @@ endif()
|
||||||
# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion
|
# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion
|
||||||
CMAKE_DEPENDENT_OPTION(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF)
|
CMAKE_DEPENDENT_OPTION(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF)
|
||||||
|
|
||||||
set(EXT_DEFAULT ON)
|
set(EXT_DEFAULT OFF)
|
||||||
|
|
||||||
if (PLATFORM_FREEBSD)
|
if (MSVC OR ANDROID)
|
||||||
set(EXT_DEFAULT OFF)
|
set(EXT_DEFAULT ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ${EXT_DEFAULT} "ENABLE_SDL2;NOT MSVC" OFF)
|
CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ${EXT_DEFAULT} "ENABLE_SDL2;NOT MSVC" OFF)
|
||||||
|
|
||||||
cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF)
|
cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF)
|
||||||
|
|
||||||
option(ENABLE_OPENGL "Enable OpenGL" ON)
|
cmake_dependent_option(ENABLE_OPENGL "Enable OpenGL" ON "NOT WIN32 OR NOT ARCHITECTURE_arm64" OFF)
|
||||||
mark_as_advanced(FORCE ENABLE_OPENGL)
|
mark_as_advanced(FORCE ENABLE_OPENGL)
|
||||||
|
|
||||||
option(ENABLE_QT "Enable the Qt frontend" ON)
|
option(ENABLE_QT "Enable the Qt frontend" ON)
|
||||||
|
@ -67,14 +153,13 @@ option(ENABLE_QT_UPDATE_CHECKER "Enable update checker for the Qt frontend" OFF)
|
||||||
|
|
||||||
CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
|
CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
|
||||||
|
|
||||||
option(YUZU_USE_CPM "Use CPM to fetch Eden dependencies if needed" ON)
|
option(YUZU_USE_CPM "Use CPM to fetch system dependencies (fmt, boost, etc) if needed. Externals will still be fetched." ${EXT_DEFAULT})
|
||||||
|
|
||||||
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
||||||
option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF)
|
option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF)
|
||||||
|
|
||||||
option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" ${EXT_DEFAULT})
|
option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" ${EXT_DEFAULT})
|
||||||
option(YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" ${EXT_DEFAULT})
|
option(YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES "Use Vulkan Utility Headers from externals" ${EXT_DEFAULT})
|
||||||
option(YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES "Use Vulkan-Utility-Libraries from externals" ${EXT_DEFAULT})
|
|
||||||
option(YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS "Use SPIRV-Tools from externals" ${EXT_DEFAULT})
|
option(YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS "Use SPIRV-Tools from externals" ${EXT_DEFAULT})
|
||||||
|
|
||||||
option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF)
|
option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF)
|
||||||
|
@ -93,10 +178,12 @@ option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}")
|
||||||
|
|
||||||
option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ${EXT_DEFAULT})
|
option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ${EXT_DEFAULT})
|
||||||
|
|
||||||
|
# TODO(crueter): CI this?
|
||||||
option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON)
|
option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON)
|
||||||
|
|
||||||
option(FORCE_DOWNLOAD_WIN_BUNDLES "Forcefully download bundled Windows dependencies (useful for CI)" OFF)
|
option(FORCE_DOWNLOAD_WIN_BUNDLES "Forcefully download bundled Windows dependencies (useful for CI)" OFF)
|
||||||
|
|
||||||
|
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
|
||||||
if (YUZU_USE_CPM AND ENABLE_SDL2)
|
if (YUZU_USE_CPM AND ENABLE_SDL2)
|
||||||
option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}")
|
option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}")
|
||||||
endif()
|
endif()
|
||||||
|
@ -105,22 +192,20 @@ CMAKE_DEPENDENT_OPTION(YUZU_ROOM "Enable dedicated room functionality" ON "NOT A
|
||||||
|
|
||||||
CMAKE_DEPENDENT_OPTION(YUZU_ROOM_STANDALONE "Enable standalone room executable" ON "YUZU_ROOM" OFF)
|
CMAKE_DEPENDENT_OPTION(YUZU_ROOM_STANDALONE "Enable standalone room executable" ON "YUZU_ROOM" OFF)
|
||||||
|
|
||||||
CMAKE_DEPENDENT_OPTION(YUZU_CMD "Compile the eden-cli executable" ON "NOT ANDROID" OFF)
|
CMAKE_DEPENDENT_OPTION(YUZU_CMD "Compile the eden-cli executable" ON "ENABLE_SDL2;NOT ANDROID" OFF)
|
||||||
|
|
||||||
CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF)
|
CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF)
|
||||||
|
|
||||||
option(YUZU_CHECK_SUBMODULES "Check if submodules are present" ${EXT_DEFAULT})
|
|
||||||
|
|
||||||
option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF)
|
option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF)
|
||||||
|
|
||||||
option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON)
|
option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON)
|
||||||
|
|
||||||
option(YUZU_ENABLE_PORTABLE "Allow yuzu to enable portable mode if a user folder is found in the CWD" ON)
|
|
||||||
|
|
||||||
CMAKE_DEPENDENT_OPTION(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF)
|
CMAKE_DEPENDENT_OPTION(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF)
|
||||||
|
|
||||||
CMAKE_DEPENDENT_OPTION(USE_SYSTEM_MOLTENVK "Use the system MoltenVK lib (instead of the bundled one)" OFF "APPLE" OFF)
|
CMAKE_DEPENDENT_OPTION(USE_SYSTEM_MOLTENVK "Use the system MoltenVK lib (instead of the bundled one)" OFF "APPLE" OFF)
|
||||||
|
|
||||||
|
set(YUZU_TZDB_PATH "" CACHE STRING "Path to a pre-downloaded timezone database")
|
||||||
|
|
||||||
set(DEFAULT_ENABLE_OPENSSL ON)
|
set(DEFAULT_ENABLE_OPENSSL ON)
|
||||||
if (ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN)
|
if (ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN)
|
||||||
# - Windows defaults to the Schannel backend.
|
# - Windows defaults to the Schannel backend.
|
||||||
|
@ -194,53 +279,6 @@ if(EXISTS ${PROJECT_SOURCE_DIR}/hooks/pre-commit AND NOT EXISTS ${PROJECT_SOURCE
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Sanity check : Check that all submodules are present
|
|
||||||
# =======================================================================
|
|
||||||
|
|
||||||
function(check_submodules_present)
|
|
||||||
file(READ "${PROJECT_SOURCE_DIR}/.gitmodules" gitmodules)
|
|
||||||
string(REGEX MATCHALL "path *= *[^ \t\r\n]*" gitmodules ${gitmodules})
|
|
||||||
foreach(module ${gitmodules})
|
|
||||||
string(REGEX REPLACE "path *= *" "" module ${module})
|
|
||||||
|
|
||||||
file(GLOB RESULT "${PROJECT_SOURCE_DIR}/${module}/*")
|
|
||||||
list(LENGTH RESULT RES_LEN)
|
|
||||||
if(RES_LEN EQUAL 0)
|
|
||||||
message(FATAL_ERROR "Git submodule ${module} not found. "
|
|
||||||
"Please run: \ngit submodule update --init --recursive")
|
|
||||||
endif()
|
|
||||||
if (EXISTS "${PROJECT_SOURCE_DIR}/${module}/.git")
|
|
||||||
set(SUBMODULE_DIR "${PROJECT_SOURCE_DIR}/${module}")
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND git rev-parse --short=10 HEAD
|
|
||||||
WORKING_DIRECTORY ${SUBMODULE_DIR}
|
|
||||||
OUTPUT_VARIABLE SUBMODULE_SHA
|
|
||||||
)
|
|
||||||
|
|
||||||
# would probably be better to do string parsing, but whatever
|
|
||||||
execute_process(
|
|
||||||
COMMAND git remote get-url origin
|
|
||||||
WORKING_DIRECTORY ${SUBMODULE_DIR}
|
|
||||||
OUTPUT_VARIABLE SUBMODULE_URL
|
|
||||||
)
|
|
||||||
|
|
||||||
string(REGEX REPLACE "\n|\r" "" SUBMODULE_SHA ${SUBMODULE_SHA})
|
|
||||||
string(REGEX REPLACE "\n|\r|\\.git" "" SUBMODULE_URL ${SUBMODULE_URL})
|
|
||||||
|
|
||||||
get_filename_component(SUBMODULE_NAME ${SUBMODULE_DIR} NAME)
|
|
||||||
|
|
||||||
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${SUBMODULE_NAME})
|
|
||||||
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${SUBMODULE_SHA})
|
|
||||||
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${SUBMODULE_URL})
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
if(EXISTS ${PROJECT_SOURCE_DIR}/.gitmodules AND YUZU_CHECK_SUBMODULES)
|
|
||||||
check_submodules_present()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
configure_file(${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.qrc
|
configure_file(${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.qrc
|
||||||
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc
|
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc
|
||||||
COPYONLY)
|
COPYONLY)
|
||||||
|
@ -262,69 +300,21 @@ if (NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.
|
||||||
file(WRITE ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json "")
|
file(WRITE ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json "")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Detect current compilation architecture and create standard definitions
|
|
||||||
# =======================================================================
|
|
||||||
|
|
||||||
include(CheckSymbolExists)
|
|
||||||
function(detect_architecture symbol arch)
|
|
||||||
if (NOT DEFINED ARCHITECTURE)
|
|
||||||
set(CMAKE_REQUIRED_QUIET 1)
|
|
||||||
check_symbol_exists("${symbol}" "" ARCHITECTURE_${arch})
|
|
||||||
unset(CMAKE_REQUIRED_QUIET)
|
|
||||||
|
|
||||||
# The output variable needs to be unique across invocations otherwise
|
|
||||||
# CMake's crazy scope rules will keep it defined
|
|
||||||
if (ARCHITECTURE_${arch})
|
|
||||||
set(ARCHITECTURE "${arch}" PARENT_SCOPE)
|
|
||||||
set(ARCHITECTURE_${arch} 1 PARENT_SCOPE)
|
|
||||||
add_definitions(-DARCHITECTURE_${arch}=1)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
if (NOT ENABLE_GENERIC)
|
|
||||||
if (MSVC)
|
|
||||||
detect_architecture("_M_AMD64" x86_64)
|
|
||||||
detect_architecture("_M_IX86" x86)
|
|
||||||
detect_architecture("_M_ARM" arm)
|
|
||||||
detect_architecture("_M_ARM64" arm64)
|
|
||||||
else()
|
|
||||||
detect_architecture("__x86_64__" x86_64)
|
|
||||||
detect_architecture("__i386__" x86)
|
|
||||||
detect_architecture("__arm__" arm)
|
|
||||||
detect_architecture("__aarch64__" arm64)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT DEFINED ARCHITECTURE)
|
|
||||||
set(ARCHITECTURE "GENERIC")
|
|
||||||
set(ARCHITECTURE_GENERIC 1)
|
|
||||||
add_definitions(-DARCHITECTURE_GENERIC=1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
message(STATUS "Target architecture: ${ARCHITECTURE}")
|
|
||||||
|
|
||||||
if (MSVC AND ARCHITECTURE_x86)
|
|
||||||
message(FATAL_ERROR "Attempting to build with the x86 environment is not supported. \
|
|
||||||
This can typically happen if you used the Developer Command Prompt from the start menu;\
|
|
||||||
instead, run vcvars64.bat directly, located at C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvars64.bat")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
add_definitions(-DYUZU_UNIX=1)
|
add_compile_definitions(YUZU_UNIX=1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX))
|
if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX))
|
||||||
set(HAS_NCE 1)
|
set(HAS_NCE 1)
|
||||||
add_definitions(-DHAS_NCE=1)
|
add_compile_definitions(HAS_NCE=1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (YUZU_ROOM)
|
if (YUZU_ROOM)
|
||||||
add_definitions(-DYUZU_ROOM)
|
add_compile_definitions(YUZU_ROOM)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Build/optimization presets
|
# Build/optimization presets
|
||||||
if (PLATFORM_LINUX)
|
if (PLATFORM_LINUX OR CXX_CLANG)
|
||||||
if (ARCHITECTURE_x86_64)
|
if (ARCHITECTURE_x86_64)
|
||||||
set(YUZU_BUILD_PRESET "custom" CACHE STRING "Build preset to use. One of: custom, generic, v3, zen2, zen4, native")
|
set(YUZU_BUILD_PRESET "custom" CACHE STRING "Build preset to use. One of: custom, generic, v3, zen2, zen4, native")
|
||||||
if (${YUZU_BUILD_PRESET} STREQUAL "generic")
|
if (${YUZU_BUILD_PRESET} STREQUAL "generic")
|
||||||
|
@ -391,6 +381,7 @@ if (YUZU_USE_CPM)
|
||||||
|
|
||||||
# boost
|
# boost
|
||||||
set(BOOST_INCLUDE_LIBRARIES algorithm icl pool container heap asio headers process filesystem crc variant)
|
set(BOOST_INCLUDE_LIBRARIES algorithm icl pool container heap asio headers process filesystem crc variant)
|
||||||
|
|
||||||
AddJsonPackage(boost)
|
AddJsonPackage(boost)
|
||||||
|
|
||||||
# really annoying thing where boost::headers doesn't work with cpm
|
# really annoying thing where boost::headers doesn't work with cpm
|
||||||
|
@ -400,13 +391,10 @@ if (YUZU_USE_CPM)
|
||||||
if (Boost_ADDED)
|
if (Boost_ADDED)
|
||||||
if (MSVC OR ANDROID)
|
if (MSVC OR ANDROID)
|
||||||
add_compile_definitions(YUZU_BOOST_v1)
|
add_compile_definitions(YUZU_BOOST_v1)
|
||||||
else()
|
|
||||||
message(WARNING "Using bundled Boost on a non-MSVC or Android system is not recommended. You are strongly encouraged to install Boost through your system's package manager.")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT MSVC)
|
if (NOT MSVC OR CXX_CLANG)
|
||||||
# boost sucks
|
# boost sucks
|
||||||
# Solaris (and probably other NIXes) need explicit pthread definition
|
|
||||||
if (PLATFORM_SUN)
|
if (PLATFORM_SUN)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthreads")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthreads")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthreads")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthreads")
|
||||||
|
@ -459,6 +447,14 @@ if (YUZU_USE_CPM)
|
||||||
|
|
||||||
# Opus
|
# Opus
|
||||||
AddJsonPackage(opus)
|
AddJsonPackage(opus)
|
||||||
|
|
||||||
|
if (Opus_ADDED)
|
||||||
|
if (MSVC AND CXX_CLANG)
|
||||||
|
target_compile_options(opus PRIVATE
|
||||||
|
-Wno-implicit-function-declaration
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
# Enforce the search mode of non-required packages for better and shorter failure messages
|
# Enforce the search mode of non-required packages for better and shorter failure messages
|
||||||
find_package(fmt 8 REQUIRED)
|
find_package(fmt 8 REQUIRED)
|
||||||
|
@ -471,6 +467,7 @@ else()
|
||||||
find_package(Opus 1.3 MODULE REQUIRED)
|
find_package(Opus 1.3 MODULE REQUIRED)
|
||||||
find_package(ZLIB 1.2 REQUIRED)
|
find_package(ZLIB 1.2 REQUIRED)
|
||||||
find_package(zstd 1.5 REQUIRED MODULE)
|
find_package(zstd 1.5 REQUIRED MODULE)
|
||||||
|
find_package(Boost 1.79.0 REQUIRED headers context system fiber)
|
||||||
|
|
||||||
if (YUZU_TESTS)
|
if (YUZU_TESTS)
|
||||||
find_package(Catch2 3.0.1 REQUIRED)
|
find_package(Catch2 3.0.1 REQUIRED)
|
||||||
|
@ -489,16 +486,12 @@ if(NOT TARGET Boost::headers)
|
||||||
AddJsonPackage(boost_headers)
|
AddJsonPackage(boost_headers)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ENABLE_LIBUSB)
|
|
||||||
if (PLATFORM_FREEBSD)
|
|
||||||
find_package(libusb MODULE)
|
|
||||||
else()
|
|
||||||
find_package(libusb 1.0.24 MODULE)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# DiscordRPC
|
# DiscordRPC
|
||||||
if (USE_DISCORD_PRESENCE)
|
if (USE_DISCORD_PRESENCE)
|
||||||
|
if (ARCHITECTURE_arm64)
|
||||||
|
add_compile_definitions(RAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN)
|
||||||
|
endif()
|
||||||
|
|
||||||
AddJsonPackage(discord-rpc)
|
AddJsonPackage(discord-rpc)
|
||||||
|
|
||||||
target_include_directories(discord-rpc INTERFACE ${discord-rpc_SOURCE_DIR}/include)
|
target_include_directories(discord-rpc INTERFACE ${discord-rpc_SOURCE_DIR}/include)
|
||||||
|
@ -601,11 +594,15 @@ endfunction()
|
||||||
add_subdirectory(externals)
|
add_subdirectory(externals)
|
||||||
|
|
||||||
# pass targets from externals
|
# pass targets from externals
|
||||||
find_package(VulkanHeaders)
|
|
||||||
find_package(VulkanUtilityLibraries)
|
find_package(VulkanUtilityLibraries)
|
||||||
|
find_package(libusb)
|
||||||
find_package(VulkanMemoryAllocator)
|
find_package(VulkanMemoryAllocator)
|
||||||
find_package(SPIRV-Tools)
|
find_package(SPIRV-Tools)
|
||||||
|
|
||||||
|
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
||||||
|
find_package(xbyak)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (ENABLE_WEB_SERVICE)
|
if (ENABLE_WEB_SERVICE)
|
||||||
find_package(httplib)
|
find_package(httplib)
|
||||||
endif()
|
endif()
|
||||||
|
@ -736,7 +733,7 @@ if (APPLE)
|
||||||
list(APPEND PLATFORM_LIBRARIES ${ICONV_LIBRARY})
|
list(APPEND PLATFORM_LIBRARIES ${ICONV_LIBRARY})
|
||||||
elseif (WIN32)
|
elseif (WIN32)
|
||||||
# Target Windows 10
|
# Target Windows 10
|
||||||
add_definitions(-D_WIN32_WINNT=0x0A00 -DWINVER=0x0A00)
|
add_compile_definitions(_WIN32_WINNT=0x0A00 WINVER=0x0A00)
|
||||||
set(PLATFORM_LIBRARIES winmm ws2_32 iphlpapi)
|
set(PLATFORM_LIBRARIES winmm ws2_32 iphlpapi)
|
||||||
if (MINGW)
|
if (MINGW)
|
||||||
# PSAPI is the Process Status API
|
# PSAPI is the Process Status API
|
||||||
|
@ -806,6 +803,27 @@ if (MSVC AND CMAKE_GENERATOR STREQUAL "Ninja")
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Adjustments for clang-cl
|
||||||
|
if (MSVC AND CXX_CLANG)
|
||||||
|
if (ARCHITECTURE_x86_64)
|
||||||
|
set(FILE_ARCH x86_64)
|
||||||
|
elseif (ARCHITECTURE_arm64)
|
||||||
|
set(FILE_ARCH aarch64)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "clang-cl: Unsupported architecture ${ARCHITECTURE}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
AddJsonPackage(llvm-mingw)
|
||||||
|
set(LIB_PATH "${llvm-mingw_SOURCE_DIR}/libclang_rt.builtins-${FILE_ARCH}.a")
|
||||||
|
|
||||||
|
add_library(llvm-mingw-runtime STATIC IMPORTED)
|
||||||
|
set_target_properties(llvm-mingw-runtime PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${LIB_PATH}"
|
||||||
|
)
|
||||||
|
|
||||||
|
link_libraries(llvm-mingw-runtime)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (YUZU_USE_FASTER_LD AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
if (YUZU_USE_FASTER_LD AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
# We will assume that if the compiler is GCC, it will attempt to use ld.bfd by default.
|
# We will assume that if the compiler is GCC, it will attempt to use ld.bfd by default.
|
||||||
# Try to pick a faster linker.
|
# Try to pick a faster linker.
|
||||||
|
|
|
@ -11,10 +11,11 @@
|
||||||
# Future crueter: Wow this was a lie and a half, at this point I might as well make my own CPN
|
# Future crueter: Wow this was a lie and a half, at this point I might as well make my own CPN
|
||||||
# haha just kidding... unless?
|
# haha just kidding... unless?
|
||||||
|
|
||||||
|
# TODO(crueter): Remember to get more than 6 hours of sleep whenever making giant cmake changes
|
||||||
if (MSVC OR ANDROID)
|
if (MSVC OR ANDROID)
|
||||||
set(BUNDLED_DEFAULT OFF)
|
|
||||||
else()
|
|
||||||
set(BUNDLED_DEFAULT ON)
|
set(BUNDLED_DEFAULT ON)
|
||||||
|
else()
|
||||||
|
set(BUNDLED_DEFAULT OFF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
option(CPMUTIL_FORCE_BUNDLED
|
option(CPMUTIL_FORCE_BUNDLED
|
||||||
|
@ -26,8 +27,7 @@ option(CPMUTIL_FORCE_SYSTEM
|
||||||
cmake_minimum_required(VERSION 3.22)
|
cmake_minimum_required(VERSION 3.22)
|
||||||
include(CPM)
|
include(CPM)
|
||||||
|
|
||||||
# TODO(crueter): Better solution for separate cpmfiles e.g. per-directory
|
set(CPMUTIL_JSON_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json")
|
||||||
set(CPMUTIL_JSON_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json" CACHE STRING "Location of cpmfile.json")
|
|
||||||
|
|
||||||
if (EXISTS ${CPMUTIL_JSON_FILE})
|
if (EXISTS ${CPMUTIL_JSON_FILE})
|
||||||
file(READ ${CPMUTIL_JSON_FILE} CPMFILE_CONTENT)
|
file(READ ${CPMUTIL_JSON_FILE} CPMFILE_CONTENT)
|
||||||
|
@ -148,11 +148,32 @@ function(AddJsonPackage)
|
||||||
get_json_element("${object}" tag tag "")
|
get_json_element("${object}" tag tag "")
|
||||||
get_json_element("${object}" artifact artifact "")
|
get_json_element("${object}" artifact artifact "")
|
||||||
get_json_element("${object}" git_version git_version "")
|
get_json_element("${object}" git_version git_version "")
|
||||||
|
get_json_element("${object}" git_host git_host "")
|
||||||
get_json_element("${object}" source_subdir source_subdir "")
|
get_json_element("${object}" source_subdir source_subdir "")
|
||||||
get_json_element("${object}" bundled bundled "unset")
|
get_json_element("${object}" bundled bundled "unset")
|
||||||
get_json_element("${object}" find_args find_args "")
|
get_json_element("${object}" find_args find_args "")
|
||||||
get_json_element("${object}" raw_patches patches "")
|
get_json_element("${object}" raw_patches patches "")
|
||||||
|
|
||||||
|
# okay here comes the fun part: REPLACEMENTS!
|
||||||
|
# first: tag gets %VERSION% replaced if applicable, with either git_version (preferred) or version
|
||||||
|
# second: artifact gets %VERSION% and %TAG% replaced accordingly (same rules for VERSION)
|
||||||
|
|
||||||
|
if (git_version)
|
||||||
|
set(version_replace ${git_version})
|
||||||
|
else()
|
||||||
|
set(version_replace ${version})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# TODO(crueter): fmt module for cmake
|
||||||
|
if (tag)
|
||||||
|
string(REPLACE "%VERSION%" "${version_replace}" tag ${tag})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (artifact)
|
||||||
|
string(REPLACE "%VERSION%" "${version_replace}" artifact ${artifact})
|
||||||
|
string(REPLACE "%TAG%" "${tag}" artifact ${artifact})
|
||||||
|
endif()
|
||||||
|
|
||||||
# format patchdir
|
# format patchdir
|
||||||
if (raw_patches)
|
if (raw_patches)
|
||||||
math(EXPR range "${raw_patches_LENGTH} - 1")
|
math(EXPR range "${raw_patches_LENGTH} - 1")
|
||||||
|
@ -201,6 +222,8 @@ function(AddJsonPackage)
|
||||||
SOURCE_SUBDIR "${source_subdir}"
|
SOURCE_SUBDIR "${source_subdir}"
|
||||||
|
|
||||||
GIT_VERSION ${git_version}
|
GIT_VERSION ${git_version}
|
||||||
|
GIT_HOST ${git_host}
|
||||||
|
|
||||||
ARTIFACT ${artifact}
|
ARTIFACT ${artifact}
|
||||||
TAG ${tag}
|
TAG ${tag}
|
||||||
)
|
)
|
||||||
|
@ -240,6 +263,7 @@ function(AddPackage)
|
||||||
NAME
|
NAME
|
||||||
VERSION
|
VERSION
|
||||||
GIT_VERSION
|
GIT_VERSION
|
||||||
|
GIT_HOST
|
||||||
|
|
||||||
REPO
|
REPO
|
||||||
TAG
|
TAG
|
||||||
|
@ -272,11 +296,17 @@ function(AddPackage)
|
||||||
option(${PKG_ARGS_NAME}_FORCE_SYSTEM "Force the system package for ${PKG_ARGS_NAME}")
|
option(${PKG_ARGS_NAME}_FORCE_SYSTEM "Force the system package for ${PKG_ARGS_NAME}")
|
||||||
option(${PKG_ARGS_NAME}_FORCE_BUNDLED "Force the bundled package for ${PKG_ARGS_NAME}")
|
option(${PKG_ARGS_NAME}_FORCE_BUNDLED "Force the bundled package for ${PKG_ARGS_NAME}")
|
||||||
|
|
||||||
|
if (NOT DEFINED PKG_ARGS_GIT_HOST)
|
||||||
|
set(git_host github.com)
|
||||||
|
else()
|
||||||
|
set(git_host ${PKG_ARGS_GIT_HOST})
|
||||||
|
endif()
|
||||||
|
|
||||||
if (DEFINED PKG_ARGS_URL)
|
if (DEFINED PKG_ARGS_URL)
|
||||||
set(pkg_url ${PKG_ARGS_URL})
|
set(pkg_url ${PKG_ARGS_URL})
|
||||||
|
|
||||||
if (DEFINED PKG_ARGS_REPO)
|
if (DEFINED PKG_ARGS_REPO)
|
||||||
set(pkg_git_url https://github.com/${PKG_ARGS_REPO})
|
set(pkg_git_url https://${git_host}/${PKG_ARGS_REPO})
|
||||||
else()
|
else()
|
||||||
if (DEFINED PKG_ARGS_GIT_URL)
|
if (DEFINED PKG_ARGS_GIT_URL)
|
||||||
set(pkg_git_url ${PKG_ARGS_GIT_URL})
|
set(pkg_git_url ${PKG_ARGS_GIT_URL})
|
||||||
|
@ -285,7 +315,7 @@ function(AddPackage)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
elseif (DEFINED PKG_ARGS_REPO)
|
elseif (DEFINED PKG_ARGS_REPO)
|
||||||
set(pkg_git_url https://github.com/${PKG_ARGS_REPO})
|
set(pkg_git_url https://${git_host}/${PKG_ARGS_REPO})
|
||||||
|
|
||||||
if (DEFINED PKG_ARGS_TAG)
|
if (DEFINED PKG_ARGS_TAG)
|
||||||
set(pkg_key ${PKG_ARGS_TAG})
|
set(pkg_key ${PKG_ARGS_TAG})
|
||||||
|
@ -316,25 +346,23 @@ function(AddPackage)
|
||||||
|
|
||||||
cpm_utils_message(STATUS ${PKG_ARGS_NAME} "Download URL is ${pkg_url}")
|
cpm_utils_message(STATUS ${PKG_ARGS_NAME} "Download URL is ${pkg_url}")
|
||||||
|
|
||||||
if (DEFINED PKG_ARGS_GIT_VERSION)
|
|
||||||
set(git_version ${PKG_ARGS_GIT_VERSION})
|
|
||||||
elseif(DEFINED PKG_ARGS_VERSION)
|
|
||||||
set(git_version ${PKG_ARGS_VERSION})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT DEFINED PKG_ARGS_KEY)
|
if (NOT DEFINED PKG_ARGS_KEY)
|
||||||
if (DEFINED PKG_ARGS_SHA)
|
if (DEFINED PKG_ARGS_SHA)
|
||||||
string(SUBSTRING ${PKG_ARGS_SHA} 0 4 pkg_key)
|
string(SUBSTRING ${PKG_ARGS_SHA} 0 4 pkg_key)
|
||||||
cpm_utils_message(DEBUG ${PKG_ARGS_NAME}
|
cpm_utils_message(DEBUG ${PKG_ARGS_NAME}
|
||||||
"No custom key defined, using ${pkg_key} from sha")
|
"No custom key defined, using ${pkg_key} from sha")
|
||||||
elseif (DEFINED git_version)
|
elseif(DEFINED PKG_ARGS_GIT_VERSION)
|
||||||
set(pkg_key ${git_version})
|
set(pkg_key ${PKG_ARGS_GIT_VERSION})
|
||||||
cpm_utils_message(DEBUG ${PKG_ARGS_NAME}
|
cpm_utils_message(DEBUG ${PKG_ARGS_NAME}
|
||||||
"No custom key defined, using ${pkg_key}")
|
"No custom key defined, using ${pkg_key}")
|
||||||
elseif (DEFINED PKG_ARGS_TAG)
|
elseif (DEFINED PKG_ARGS_TAG)
|
||||||
set(pkg_key ${PKG_ARGS_TAG})
|
set(pkg_key ${PKG_ARGS_TAG})
|
||||||
cpm_utils_message(DEBUG ${PKG_ARGS_NAME}
|
cpm_utils_message(DEBUG ${PKG_ARGS_NAME}
|
||||||
"No custom key defined, using ${pkg_key}")
|
"No custom key defined, using ${pkg_key}")
|
||||||
|
elseif (DEFINED PKG_ARGS_VERSION)
|
||||||
|
set(pkg_key ${PKG_ARGS_VERSION})
|
||||||
|
cpm_utils_message(DEBUG ${PKG_ARGS_NAME}
|
||||||
|
"No custom key defined, using ${pkg_key}")
|
||||||
else()
|
else()
|
||||||
cpm_utils_message(WARNING ${PKG_ARGS_NAME}
|
cpm_utils_message(WARNING ${PKG_ARGS_NAME}
|
||||||
"Could not determine cache key, using CPM defaults")
|
"Could not determine cache key, using CPM defaults")
|
||||||
|
@ -445,12 +473,15 @@ function(AddPackage)
|
||||||
if (DEFINED PKG_ARGS_SHA)
|
if (DEFINED PKG_ARGS_SHA)
|
||||||
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS
|
||||||
${PKG_ARGS_SHA})
|
${PKG_ARGS_SHA})
|
||||||
elseif(DEFINED git_version)
|
elseif (DEFINED PKG_ARGS_GIT_VERSION)
|
||||||
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS
|
||||||
${git_version})
|
${PKG_ARGS_GIT_VERSION})
|
||||||
elseif (DEFINED PKG_ARGS_TAG)
|
elseif (DEFINED PKG_ARGS_TAG)
|
||||||
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS
|
||||||
${PKG_ARGS_TAG})
|
${PKG_ARGS_TAG})
|
||||||
|
elseif(DEFINED PKG_ARGS_VERSION)
|
||||||
|
set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS
|
||||||
|
${PKG_ARGS_VERSION})
|
||||||
else()
|
else()
|
||||||
cpm_utils_message(WARNING ${PKG_ARGS_NAME}
|
cpm_utils_message(WARNING ${PKG_ARGS_NAME}
|
||||||
"Package has no specified sha, tag, or version")
|
"Package has no specified sha, tag, or version")
|
||||||
|
@ -495,6 +526,7 @@ function(add_ci_package key)
|
||||||
set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}_SOURCE_DIR} PARENT_SCOPE)
|
set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}_SOURCE_DIR} PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
# TODO(crueter): we could do an AddMultiArchPackage, multiplatformpackage?
|
||||||
# name is the artifact name, package is for find_package override
|
# name is the artifact name, package is for find_package override
|
||||||
function(AddCIPackage)
|
function(AddCIPackage)
|
||||||
set(oneValueArgs
|
set(oneValueArgs
|
||||||
|
|
|
@ -11,10 +11,17 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var versi
|
||||||
set(package_repo "no_platform")
|
set(package_repo "no_platform")
|
||||||
set(package_extension "no_platform")
|
set(package_extension "no_platform")
|
||||||
|
|
||||||
|
# TODO(crueter): Need to convert ffmpeg to a CI.
|
||||||
if (WIN32 OR FORCE_WIN_ARCHIVES)
|
if (WIN32 OR FORCE_WIN_ARCHIVES)
|
||||||
set(CACHE_KEY "windows")
|
if (ARCHITECTURE_arm64)
|
||||||
set(package_repo "ext-windows-bin/raw/master/")
|
set(CACHE_KEY "windows")
|
||||||
set(package_extension ".7z")
|
set(package_repo "ext-windows-arm64-bin/raw/master/")
|
||||||
|
set(package_extension ".zip")
|
||||||
|
elseif(ARCHITECTURE_x86_64)
|
||||||
|
set(CACHE_KEY "windows")
|
||||||
|
set(package_repo "ext-windows-bin/raw/master/")
|
||||||
|
set(package_extension ".7z")
|
||||||
|
endif()
|
||||||
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
||||||
set(CACHE_KEY "linux")
|
set(CACHE_KEY "linux")
|
||||||
set(package_repo "ext-linux-bin/raw/master/")
|
set(package_repo "ext-linux-bin/raw/master/")
|
||||||
|
|
17
CMakeModules/Findmbedtls.cmake
Normal file
17
CMakeModules/Findmbedtls.cmake
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
# SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
find_package(PkgConfig QUIET)
|
||||||
|
pkg_search_module(mbedtls QUIET IMPORTED_TARGET mbedtls)
|
||||||
|
find_package_handle_standard_args(mbedtls
|
||||||
|
REQUIRED_VARS mbedtls_LINK_LIBRARIES
|
||||||
|
VERSION_VAR mbedtls_VERSION
|
||||||
|
)
|
||||||
|
|
||||||
|
pkg_search_module(mbedcrypto QUIET IMPORTED_TARGET mbedcrypto)
|
||||||
|
find_package_handle_standard_args(mbedcrypto
|
||||||
|
REQUIRED_VARS mbedcrypto_LINK_LIBRARIES
|
||||||
|
VERSION_VAR mbedcrypto_VERSION
|
||||||
|
)
|
11
CMakeModules/Findsirit.cmake
Normal file
11
CMakeModules/Findsirit.cmake
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
find_package(PkgConfig QUIET)
|
||||||
|
pkg_search_module(sirit QUIET IMPORTED_TARGET sirit)
|
||||||
|
find_package_handle_standard_args(sirit
|
||||||
|
REQUIRED_VARS sirit_LINK_LIBRARIES
|
||||||
|
VERSION_VAR sirit_VERSION
|
||||||
|
)
|
|
@ -35,4 +35,6 @@ set(REPO_NAME "Eden")
|
||||||
set(BUILD_ID ${GIT_BRANCH})
|
set(BUILD_ID ${GIT_BRANCH})
|
||||||
set(BUILD_FULLNAME "${REPO_NAME} ${BUILD_VERSION} ")
|
set(BUILD_FULLNAME "${REPO_NAME} ${BUILD_VERSION} ")
|
||||||
|
|
||||||
|
set(CXX_COMPILER "${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
|
||||||
|
|
||||||
configure_file(scm_rev.cpp.in scm_rev.cpp @ONLY)
|
configure_file(scm_rev.cpp.in scm_rev.cpp @ONLY)
|
||||||
|
|
|
@ -12,16 +12,25 @@ set(__windows_copy_files YES)
|
||||||
|
|
||||||
# Any number of files to copy from SOURCE_DIR to DEST_DIR can be specified after DEST_DIR.
|
# Any number of files to copy from SOURCE_DIR to DEST_DIR can be specified after DEST_DIR.
|
||||||
# This copying happens post-build.
|
# This copying happens post-build.
|
||||||
function(windows_copy_files TARGET SOURCE_DIR DEST_DIR)
|
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
|
||||||
# windows commandline expects the / to be \ so switch them
|
function(windows_copy_files TARGET SOURCE_DIR DEST_DIR)
|
||||||
string(REPLACE "/" "\\\\" SOURCE_DIR ${SOURCE_DIR})
|
# windows commandline expects the / to be \ so switch them
|
||||||
string(REPLACE "/" "\\\\" DEST_DIR ${DEST_DIR})
|
string(REPLACE "/" "\\\\" SOURCE_DIR ${SOURCE_DIR})
|
||||||
|
string(REPLACE "/" "\\\\" DEST_DIR ${DEST_DIR})
|
||||||
|
|
||||||
# /NJH /NJS /NDL /NFL /NC /NS /NP - Silence any output
|
# /NJH /NJS /NDL /NFL /NC /NS /NP - Silence any output
|
||||||
# cmake adds an extra check for command success which doesn't work too well with robocopy
|
# cmake adds an extra check for command success which doesn't work too well with robocopy
|
||||||
# so trick it into thinking the command was successful with the || cmd /c "exit /b 0"
|
# so trick it into thinking the command was successful with the || cmd /c "exit /b 0"
|
||||||
add_custom_command(TARGET ${TARGET} POST_BUILD
|
add_custom_command(TARGET ${TARGET} POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}
|
||||||
COMMAND robocopy ${SOURCE_DIR} ${DEST_DIR} ${ARGN} /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0"
|
COMMAND robocopy ${SOURCE_DIR} ${DEST_DIR} ${ARGN} /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0"
|
||||||
)
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
else()
|
||||||
|
function(windows_copy_files TARGET SOURCE_DIR DEST_DIR)
|
||||||
|
add_custom_command(TARGET ${TARGET} POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}
|
||||||
|
COMMAND cp -ra ${SOURCE_DIR}/. ${DEST_DIR}
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
endif()
|
||||||
|
|
|
@ -63,6 +63,7 @@ If you would like to contribute, we are open to new developers and pull requests
|
||||||
* **Solaris**: [Solaris Building Guide](./docs/build/Solaris.md)
|
* **Solaris**: [Solaris Building Guide](./docs/build/Solaris.md)
|
||||||
* **FreeBSD**: [FreeBSD Building Guide](./docs/build/FreeBSD.md)
|
* **FreeBSD**: [FreeBSD Building Guide](./docs/build/FreeBSD.md)
|
||||||
* **macOS**: [macOS Building Guide](./docs/build/macOS.md)
|
* **macOS**: [macOS Building Guide](./docs/build/macOS.md)
|
||||||
|
* **OpenBSD**: [OpenBSD Building Guide](./docs/build/OpenBSD.md)
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
|
|
38
cpmfile.json
38
cpmfile.json
|
@ -10,11 +10,16 @@
|
||||||
"boost": {
|
"boost": {
|
||||||
"package": "Boost",
|
"package": "Boost",
|
||||||
"repo": "boostorg/boost",
|
"repo": "boostorg/boost",
|
||||||
"tag": "boost-1.88.0",
|
"tag": "boost-%VERSION%",
|
||||||
"artifact": "boost-1.88.0-cmake.7z",
|
"artifact": "%TAG%-cmake.tar.xz",
|
||||||
"hash": "e5b049e5b61964480ca816395f63f95621e66cb9bcf616a8b10e441e0e69f129e22443acb11e77bc1e8170f8e4171b9b7719891efc43699782bfcd4b3a365f01",
|
"hash": "4fb7f6fde92762305aad8754d7643cd918dd1f3f67e104e9ab385b18c73178d72a17321354eb203b790b6702f2cf6d725a5d6e2dfbc63b1e35f9eb59fb42ece9",
|
||||||
"git_version": "1.88.0",
|
"git_version": "1.89.0",
|
||||||
"version": "1.57"
|
"version": "1.57",
|
||||||
|
"patches": [
|
||||||
|
"0001-clang-cl.patch",
|
||||||
|
"0002-use-marmasm.patch",
|
||||||
|
"0003-armasm-options.patch"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"fmt": {
|
"fmt": {
|
||||||
"repo": "fmtlib/fmt",
|
"repo": "fmtlib/fmt",
|
||||||
|
@ -77,16 +82,13 @@
|
||||||
},
|
},
|
||||||
"opus": {
|
"opus": {
|
||||||
"package": "Opus",
|
"package": "Opus",
|
||||||
"repo": "xiph/opus",
|
"repo": "crueter/opus",
|
||||||
"sha": "5ded705cf4",
|
"sha": "ab19c44fad",
|
||||||
"hash": "0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203",
|
"hash": "79d0d015b19e74ce6076197fc32b86fe91d724a0b5a79e86adfc4bdcb946ece384e252adbbf742b74d03040913b70bb0e9556eafa59ef20e42d2f3f4d6f2859a",
|
||||||
"version": "1.3",
|
"version": "1.3",
|
||||||
"find_args": "MODULE",
|
"find_args": "MODULE",
|
||||||
"options": [
|
"options": [
|
||||||
"OPUS_BUILD_TESTING OFF",
|
"OPUS_PRESUME_NEON ON"
|
||||||
"OPUS_BUILD_PROGRAMS OFF",
|
|
||||||
"OPUS_INSTALL_PKG_CONFIG_MODULE OFF",
|
|
||||||
"OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"cubeb": {
|
"cubeb": {
|
||||||
|
@ -103,8 +105,8 @@
|
||||||
},
|
},
|
||||||
"boost_headers": {
|
"boost_headers": {
|
||||||
"repo": "boostorg/headers",
|
"repo": "boostorg/headers",
|
||||||
"sha": "0456900fad",
|
"sha": "95930ca8f5",
|
||||||
"hash": "50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3",
|
"hash": "d1dece16f3b209109de02123c537bfe1adf07a62b16c166367e7e5d62e0f7c323bf804c89b3192dd6871bc58a9d879d25a1cc3f7b9da0e497cf266f165816e2a",
|
||||||
"bundled": true
|
"bundled": true
|
||||||
},
|
},
|
||||||
"discord-rpc": {
|
"discord-rpc": {
|
||||||
|
@ -143,5 +145,13 @@
|
||||||
"version": "2.32.8",
|
"version": "2.32.8",
|
||||||
"min_version": "2.26.4",
|
"min_version": "2.26.4",
|
||||||
"cmake_filename": "sdl2"
|
"cmake_filename": "sdl2"
|
||||||
|
},
|
||||||
|
"llvm-mingw": {
|
||||||
|
"repo": "misc/llvm-mingw",
|
||||||
|
"git_host": "git.crueter.xyz",
|
||||||
|
"tag": "20250828",
|
||||||
|
"version": "20250828",
|
||||||
|
"artifact": "clang-rt-builtins.tar.zst",
|
||||||
|
"hash": "d902392caf94e84f223766e2cc51ca5fab6cae36ab8dc6ef9ef6a683ab1c483bfcfe291ef0bd38ab16a4ecc4078344fa8af72da2f225ab4c378dee23f6186181"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
12
docs/CPM.md
12
docs/CPM.md
|
@ -23,7 +23,7 @@ CPMUtil is a wrapper around CPM that aims to reduce boilerplate and add useful u
|
||||||
|
|
||||||
- `NAME` (required): The package name (must be the same as the `find_package` name if applicable)
|
- `NAME` (required): The package name (must be the same as the `find_package` name if applicable)
|
||||||
- `VERSION`: The minimum version of this package that can be used on the system
|
- `VERSION`: The minimum version of this package that can be used on the system
|
||||||
- `GIT_VERSION`: The version found within git, only used for identification
|
- `GIT_VERSION`: The "version" found within git
|
||||||
- `URL`: The URL to fetch.
|
- `URL`: The URL to fetch.
|
||||||
- `REPO`: The GitHub repo to use (`owner/repo`).
|
- `REPO`: The GitHub repo to use (`owner/repo`).
|
||||||
* Only GitHub is supported for now, though other platforms will see support at some point
|
* Only GitHub is supported for now, though other platforms will see support at some point
|
||||||
|
@ -71,8 +71,9 @@ Hashing strategies, descending order of precedence:
|
||||||
- `KEY`: Custom cache key to use (stored as `.cache/cpm/${packagename_lower}/${key}`)
|
- `KEY`: Custom cache key to use (stored as `.cache/cpm/${packagename_lower}/${key}`)
|
||||||
* Default is based on, in descending order of precedence:
|
* Default is based on, in descending order of precedence:
|
||||||
- First 4 characters of the sha
|
- First 4 characters of the sha
|
||||||
- `GIT_VERSION`, or `VERSION` if not specified
|
- `GIT_VERSION`
|
||||||
- Tag
|
- Tag
|
||||||
|
- `VERSION`
|
||||||
- Otherwise, CPM defaults will be used. This is not recommended as it doesn't produce reproducible caches
|
- Otherwise, CPM defaults will be used. This is not recommended as it doesn't produce reproducible caches
|
||||||
- `DOWNLOAD_ONLY`: Whether or not to configure the downloaded package via CMake
|
- `DOWNLOAD_ONLY`: Whether or not to configure the downloaded package via CMake
|
||||||
* Useful to turn `OFF` if the project doesn't use CMake
|
* Useful to turn `OFF` if the project doesn't use CMake
|
||||||
|
@ -232,12 +233,9 @@ In order: OpenSSL CI, Boost (tag + artifact), discord-rpc (sha + options + patch
|
||||||
To include CPMUtil:
|
To include CPMUtil:
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json)
|
|
||||||
include(CPMUtil)
|
include(CPMUtil)
|
||||||
```
|
```
|
||||||
|
|
||||||
You may omit the first line if you are not utilizing cpmfile.
|
|
||||||
|
|
||||||
## Prefetching
|
## Prefetching
|
||||||
|
|
||||||
- To prefetch a CPM dependency (requires cpmfile):
|
- To prefetch a CPM dependency (requires cpmfile):
|
||||||
|
@ -245,8 +243,8 @@ You may omit the first line if you are not utilizing cpmfile.
|
||||||
- To prefetch all CPM dependencies:
|
- To prefetch all CPM dependencies:
|
||||||
* `tools/cpm-fetch-all.sh`
|
* `tools/cpm-fetch-all.sh`
|
||||||
|
|
||||||
Currently, `cpm-fetch.sh` defines the following directories for cpmfiles:
|
Currently, `cpm-fetch.sh` defines the following directories for cpmfiles (max depth of 2, so subdirs are caught as well):
|
||||||
|
|
||||||
`externals src/yuzu/externals externals/ffmpeg src/dynarmic/externals externals/nx_tzdb`
|
`externals src/yuzu src/dynarmic .`
|
||||||
|
|
||||||
Whenever you add a new cpmfile, update the script accordingly
|
Whenever you add a new cpmfile, update the script accordingly
|
|
@ -6,6 +6,7 @@
|
||||||
* **Solaris**: [Solaris Building Guide](./build/Solaris.md)
|
* **Solaris**: [Solaris Building Guide](./build/Solaris.md)
|
||||||
* **FreeBSD**: [FreeBSD Building Guide](./build/FreeBSD.md)
|
* **FreeBSD**: [FreeBSD Building Guide](./build/FreeBSD.md)
|
||||||
* **macOS**: [macOS Building Guide](./build/macOS.md)
|
* **macOS**: [macOS Building Guide](./build/macOS.md)
|
||||||
|
* **OpenBSD**: [OpenBSD Building Guide](./build/OpenBSD.md)
|
||||||
|
|
||||||
# CPM
|
# CPM
|
||||||
|
|
||||||
|
|
11
docs/User.md
Normal file
11
docs/User.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
# User configuration
|
||||||
|
|
||||||
|
## Configuration directories
|
||||||
|
|
||||||
|
Eden will store configuration in the following directories:
|
||||||
|
|
||||||
|
- **Windows**: `%AppData%\Roaming`.
|
||||||
|
- **Android**: Data is stored internally.
|
||||||
|
- **Linux, macOS, FreeBSD, Solaris, OpenBSD**: `$XDG_DATA_HOME`, `$XDG_CACHE_HOME`, `$XDG_CONFIG_HOME`.
|
||||||
|
|
||||||
|
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.
|
12
docs/build/FreeBSD.md
vendored
12
docs/build/FreeBSD.md
vendored
|
@ -1,13 +1,7 @@
|
||||||
## One word of caution before proceeding.
|
Eden is not currently available as a port on FreeBSD, though it is in the works. For now, the recommended method of usage is to compile it yourself. Check back often, as the build process frequently changes.
|
||||||
|
|
||||||
This is not the usual or preferred way to build programs on FreeBSD.
|
|
||||||
As of writing there is no official fresh port available for Eden, but it is in the works.
|
|
||||||
After it is available you can find a link to the eden-emu fresh port here and on Escary's github repo.
|
|
||||||
See this build as an AppImage alternative for FreeBSD.
|
|
||||||
|
|
||||||
## Dependencies.
|
## Dependencies.
|
||||||
Before we start we need some dependencies.
|
Eden needs the following dependencies:
|
||||||
These dependencies are generally needed to build Eden on FreeBSD.
|
|
||||||
|
|
||||||
```
|
```
|
||||||
devel/cmake
|
devel/cmake
|
||||||
|
@ -22,6 +16,8 @@ devel/autoconf
|
||||||
devel/pkgconf
|
devel/pkgconf
|
||||||
devel/qt6-base
|
devel/qt6-base
|
||||||
|
|
||||||
|
net/enet
|
||||||
|
|
||||||
multimedia/ffnvcodec-headers
|
multimedia/ffnvcodec-headers
|
||||||
multimedia/ffmpeg
|
multimedia/ffmpeg
|
||||||
|
|
||||||
|
|
10
docs/build/OpenBSD.md
vendored
Normal file
10
docs/build/OpenBSD.md
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# Building for OpenBSD
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkg_add -u
|
||||||
|
pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gmake llvm-19.1.7p3 qt6 jq
|
||||||
|
git --recursive https://git.eden-emu.dev/eden-emu/eden
|
||||||
|
cmake -DCMAKE_C_COMPILER=clang-19 -DCMAKE_CXX_COMPILER=clang++-19 -DDYNARMIC_USE_PRECOMPILED_HEADERS=OFF -DCMAKE_BUILD_TYPE=Debug -DENABLE_QT=OFF -DENABLE_OPENSSL=OFF -DENABLE_WEB_SERVICE=OFF -B /usr/obj/eden
|
||||||
|
```
|
||||||
|
|
||||||
|
- Modify `externals/ffmpeg/CMakeFiles/ffmpeg-build/build.make` to use `-j$(nproc)` instead of just `-j`.
|
65
docs/build/macOS.md
vendored
65
docs/build/macOS.md
vendored
|
@ -1,43 +1,36 @@
|
||||||
Please note this article is intended for development, and eden on macOS is not currently ready for regular use.
|
Please note this article is intended for development, and Eden on macOS is not currently ready for regular use.
|
||||||
|
|
||||||
This article was written for developers. eden support for macOS is not ready for casual use.
|
This article was written for developers. Eden support for macOS is not ready for casual use.
|
||||||
|
|
||||||
## Method I: ninja
|
|
||||||
---
|
|
||||||
If you are compiling on Intel Mac or are using a Rosetta Homebrew installation, you must replace all references of `/opt/homebrew` to `/usr/local`.
|
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
Install dependencies from Homebrew:
|
Install dependencies from Homebrew:
|
||||||
```sh
|
```sh
|
||||||
brew install autoconf automake boost ccache ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@6 sdl2 speexdsp zlib zlib zstd cmake Catch2 molten-vk vulkan-loader
|
brew install autoconf automake boost ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@6 sdl2 speexdsp zlib zstd cmake Catch2 molten-vk vulkan-loader spirv-tools
|
||||||
```
|
```
|
||||||
|
|
||||||
Clone the repo
|
If you are compiling on Intel Mac, or are using a Rosetta Homebrew installation, you must replace all references of `/opt/homebrew` with `/usr/local`.
|
||||||
|
|
||||||
|
Now, clone the repo:
|
||||||
```sh
|
```sh
|
||||||
git clone --recursive https://git.eden-emu.dev/eden-emu/eden
|
git clone --recursive https://git.eden-emu.dev/eden-emu/eden
|
||||||
|
|
||||||
cd eden
|
cd eden
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Method I: ninja
|
||||||
|
|
||||||
|
---
|
||||||
Build for release
|
Build for release
|
||||||
```sh
|
```sh
|
||||||
mkdir build && cd build
|
|
||||||
|
|
||||||
export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
|
export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
|
||||||
|
|
||||||
export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib
|
export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib
|
||||||
|
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=ON -DENABLE_LIBUSB=OFF -DCLANG_FORMAT=ON -DSDL2_DISABLE_INSTALL=ON -DSDL_ALTIVEC=ON
|
||||||
cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=ON -DENABLE_LIBUSB=OFF -DCLANG_FORMAT=ON -DSDL2_DISABLE_INSTALL=ON -DSDL_ALTIVEC=ON
|
|
||||||
|
|
||||||
ninja
|
ninja
|
||||||
```
|
```
|
||||||
|
|
||||||
You may also want to include support for Discord Rich Presence by adding `-DUSE_DISCORD_PRESENCE=ON` after `cmake ..`
|
You may also want to include support for Discord Rich Presence by adding `-DUSE_DISCORD_PRESENCE=ON`
|
||||||
|
|
||||||
Build with debug symbols (vcpkg is not currently used due to broken boost-context library):
|
|
||||||
```sh
|
```sh
|
||||||
mkdir build && cd build
|
|
||||||
export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
|
export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
|
||||||
cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF
|
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF
|
||||||
ninja
|
ninja
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -49,40 +42,20 @@ bin/eden.app/Contents/MacOS/eden
|
||||||
## Method II: Xcode
|
## Method II: Xcode
|
||||||
|
|
||||||
---
|
---
|
||||||
If you are compiling on Intel Mac or are using a Rosetta Homebrew installation, you must replace all references of `/opt/homebrew` to `/usr/local`.
|
|
||||||
|
|
||||||
Install dependencies from Homebrew:
|
|
||||||
```sh
|
|
||||||
brew install autoconf automake boost ccache ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@6 sdl2 speexdsp zlib zlib zstd cmake Catch2 molten-vk vulkan-loader
|
|
||||||
```
|
|
||||||
|
|
||||||
Clone the repo
|
|
||||||
```sh
|
|
||||||
git clone --recursive https://git.eden-emu.dev/eden-emu/eden
|
|
||||||
|
|
||||||
cd eden
|
|
||||||
```
|
|
||||||
|
|
||||||
Build for release
|
Build for release
|
||||||
```sh
|
```sh
|
||||||
mkdir build && cd build
|
|
||||||
|
|
||||||
export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
|
export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
|
||||||
|
|
||||||
export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib
|
export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib
|
||||||
|
# Only if having errors about Xcode 15.0
|
||||||
cmake .. -GXcode -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=ON -DENABLE_LIBUSB=OFF -DCLANG_FORMAT=ON -DSDL2_DISABLE_INSTALL=ON -DSDL_ALTIVEC=ON
|
sudo /usr/bin/xcode-select --switch /Users/admin/Downloads/Xcode.ap
|
||||||
|
cmake -B build -GXcode -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=ON -DENABLE_LIBUSB=OFF -DCLANG_FORMAT=ON -DSDL2_DISABLE_INSTALL=ON -DSDL_ALTIVEC=ON
|
||||||
xcodebuild build -project eden.xcodeproj -scheme "eden" -configuration "RelWithDebInfo"
|
xcodebuild build -project yuzu.xcodeproj -scheme "yuzu" -configuration "RelWithDebInfo"
|
||||||
```
|
```
|
||||||
|
|
||||||
You may also want to include support for Discord Rich Presence by adding `-DUSE_DISCORD_PRESENCE=ON` after `cmake ..`
|
Build with debug symbols:
|
||||||
|
|
||||||
Build with debug symbols (vcpkg is not currently used due to broken boost-context library):
|
|
||||||
```sh
|
```sh
|
||||||
mkdir build && cd build
|
|
||||||
export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
|
export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
|
||||||
cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF
|
cmake -B build -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF
|
||||||
ninja
|
ninja
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
52
externals/CMakeLists.txt
vendored
52
externals/CMakeLists.txt
vendored
|
@ -1,3 +1,6 @@
|
||||||
|
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
# SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
@ -7,8 +10,6 @@
|
||||||
# TODO(crueter): A lot of this should be moved to the root.
|
# TODO(crueter): A lot of this should be moved to the root.
|
||||||
# otherwise we have to do weird shenanigans with library linking and stuff
|
# otherwise we have to do weird shenanigans with library linking and stuff
|
||||||
|
|
||||||
# Explicitly include CPMUtil here since we have a separate cpmfile for externals
|
|
||||||
set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json)
|
|
||||||
include(CPMUtil)
|
include(CPMUtil)
|
||||||
|
|
||||||
# Explicitly declare this option here to propagate to the oaknut CPM call
|
# Explicitly declare this option here to propagate to the oaknut CPM call
|
||||||
|
@ -33,7 +34,7 @@ endif()
|
||||||
|
|
||||||
# Xbyak (also used by Dynarmic, so needs to be added first)
|
# Xbyak (also used by Dynarmic, so needs to be added first)
|
||||||
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
||||||
if (PLATFORM_SUN)
|
if (PLATFORM_SUN OR PLATFORM_OPENBSD)
|
||||||
AddJsonPackage(xbyak_sun)
|
AddJsonPackage(xbyak_sun)
|
||||||
else()
|
else()
|
||||||
AddJsonPackage(xbyak)
|
AddJsonPackage(xbyak)
|
||||||
|
@ -62,12 +63,19 @@ if (mbedtls_ADDED)
|
||||||
if (NOT MSVC)
|
if (NOT MSVC)
|
||||||
target_compile_options(mbedcrypto PRIVATE
|
target_compile_options(mbedcrypto PRIVATE
|
||||||
-Wno-unused-but-set-variable
|
-Wno-unused-but-set-variable
|
||||||
-Wno-string-concatenation)
|
-Wno-string-concatenation
|
||||||
|
)
|
||||||
|
elseif(CXX_CLANG)
|
||||||
|
foreach(TARGET mbedtls mbedcrypto mbedx509)
|
||||||
|
target_compile_options(${TARGET} PRIVATE
|
||||||
|
-w
|
||||||
|
)
|
||||||
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# libusb
|
# libusb
|
||||||
if (ENABLE_LIBUSB AND NOT TARGET libusb::usb)
|
if (ENABLE_LIBUSB)
|
||||||
add_subdirectory(libusb)
|
add_subdirectory(libusb)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -83,6 +91,8 @@ if(MSVC AND USE_CCACHE AND sirit_ADDED)
|
||||||
list(FILTER _opts EXCLUDE REGEX "/Zi")
|
list(FILTER _opts EXCLUDE REGEX "/Zi")
|
||||||
list(APPEND _opts "/Z7")
|
list(APPEND _opts "/Z7")
|
||||||
set_target_properties(sirit PROPERTIES COMPILE_OPTIONS "${_opts}")
|
set_target_properties(sirit PROPERTIES COMPILE_OPTIONS "${_opts}")
|
||||||
|
elseif(MSVC AND CXX_CLANG)
|
||||||
|
target_compile_options(sirit PRIVATE -Wno-error=unused-command-line-argument)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# httplib
|
# httplib
|
||||||
|
@ -107,21 +117,17 @@ if (YUZU_USE_BUNDLED_FFMPEG)
|
||||||
set(FFmpeg_INCLUDE_DIR "${FFmpeg_INCLUDE_DIR}" PARENT_SCOPE)
|
set(FFmpeg_INCLUDE_DIR "${FFmpeg_INCLUDE_DIR}" PARENT_SCOPE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Vulkan-Headers
|
# VulkanUtilityHeaders - pulls in headers and utility libs
|
||||||
|
|
||||||
# TODO(crueter): Vk1.4 impl
|
|
||||||
|
|
||||||
AddJsonPackage(
|
AddJsonPackage(
|
||||||
NAME vulkan-headers
|
NAME vulkan-utility-headers
|
||||||
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_HEADERS}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Vulkan-Utility-Libraries
|
|
||||||
AddJsonPackage(
|
|
||||||
NAME vulkan-utility-libraries
|
|
||||||
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES}
|
BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# small hack
|
||||||
|
if (NOT VulkanUtilityLibraries_ADDED)
|
||||||
|
find_package(VulkanHeaders 1.3.274 REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
# SPIRV Tools
|
# SPIRV Tools
|
||||||
AddJsonPackage(
|
AddJsonPackage(
|
||||||
NAME spirv-tools
|
NAME spirv-tools
|
||||||
|
@ -139,8 +145,16 @@ add_subdirectory(nx_tzdb)
|
||||||
# VMA
|
# VMA
|
||||||
AddJsonPackage(vulkan-memory-allocator)
|
AddJsonPackage(vulkan-memory-allocator)
|
||||||
|
|
||||||
if (VulkanMemoryAllocator_ADDED AND MSVC)
|
if (VulkanMemoryAllocator_ADDED)
|
||||||
target_compile_options(VulkanMemoryAllocator INTERFACE /wd4189)
|
if (CXX_CLANG)
|
||||||
|
target_compile_options(VulkanMemoryAllocator INTERFACE
|
||||||
|
-Wno-unused-variable
|
||||||
|
)
|
||||||
|
elseif(MSVC)
|
||||||
|
target_compile_options(VulkanMemoryAllocator INTERFACE
|
||||||
|
/wd4189
|
||||||
|
)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT TARGET LLVM::Demangle)
|
if (NOT TARGET LLVM::Demangle)
|
||||||
|
@ -239,7 +253,7 @@ if (YUZU_CRASH_DUMPS AND NOT TARGET libbreakpad_client)
|
||||||
file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/client/mac/*.cc ${breakpad_SOURCE_DIR}/src/common/mac/*.cc)
|
file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/client/mac/*.cc ${breakpad_SOURCE_DIR}/src/common/mac/*.cc)
|
||||||
list(APPEND LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/common/mac/MachIPC.mm)
|
list(APPEND LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/common/mac/MachIPC.mm)
|
||||||
else()
|
else()
|
||||||
target_compile_definitions(libbreakpad_client PUBLIC -DHAVE_A_OUT_H)
|
target_compile_definitions(libbreakpad_client PUBLIC HAVE_A_OUT_H)
|
||||||
file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/client/linux/*.cc ${breakpad_SOURCE_DIR}/src/common/linux/*.cc)
|
file(GLOB_RECURSE LIBBREAKPAD_CLIENT_SOURCES ${breakpad_SOURCE_DIR}/src/client/linux/*.cc ${breakpad_SOURCE_DIR}/src/common/linux/*.cc)
|
||||||
endif()
|
endif()
|
||||||
list(APPEND LIBBREAKPAD_CLIENT_SOURCES ${LIBBREAKPAD_COMMON_SOURCES})
|
list(APPEND LIBBREAKPAD_CLIENT_SOURCES ${LIBBREAKPAD_COMMON_SOURCES})
|
||||||
|
|
48
externals/cpmfile.json
vendored
48
externals/cpmfile.json
vendored
|
@ -1,11 +1,9 @@
|
||||||
{
|
{
|
||||||
"mbedtls": {
|
"mbedtls": {
|
||||||
"repo": "Mbed-TLS/mbedtls",
|
"repo": "eden-emulator/mbedtls",
|
||||||
"sha": "8c88150ca1",
|
"sha": "ce4f81f4a9",
|
||||||
"hash": "769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966",
|
"hash": "f2e7f887651b28745e508149214d409fd7cfdb92cb94b4146b47ff1e0fc09e47143f203ac18e34c2c1814b5bd031d04c74828676c0d4342920a2ddb7fd35e9a5",
|
||||||
"patches": [
|
"find_args": "MODULE"
|
||||||
"0001-cmake-version.patch"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"spirv-headers": {
|
"spirv-headers": {
|
||||||
"package": "SPIRV-Headers",
|
"package": "SPIRV-Headers",
|
||||||
|
@ -17,6 +15,7 @@
|
||||||
"repo": "eden-emulator/sirit",
|
"repo": "eden-emulator/sirit",
|
||||||
"sha": "db1f1e8ab5",
|
"sha": "db1f1e8ab5",
|
||||||
"hash": "73eb3a042848c63a10656545797e85f40d142009dfb7827384548a385e1e28e1ac72f42b25924ce530d58275f8638554281e884d72f9c7aaf4ed08690a414b05",
|
"hash": "73eb3a042848c63a10656545797e85f40d142009dfb7827384548a385e1e28e1ac72f42b25924ce530d58275f8638554281e884d72f9c7aaf4ed08690a414b05",
|
||||||
|
"find_args": "MODULE",
|
||||||
"options": [
|
"options": [
|
||||||
"SIRIT_USE_SYSTEM_SPIRV_HEADERS ON"
|
"SIRIT_USE_SYSTEM_SPIRV_HEADERS ON"
|
||||||
]
|
]
|
||||||
|
@ -28,32 +27,21 @@
|
||||||
},
|
},
|
||||||
"cpp-jwt": {
|
"cpp-jwt": {
|
||||||
"version": "1.4",
|
"version": "1.4",
|
||||||
"repo": "arun11299/cpp-jwt",
|
"repo": "crueter/cpp-jwt",
|
||||||
"sha": "a54fa08a3b",
|
"sha": "9eaea6328f",
|
||||||
"hash": "a90f7e594ada0c7e49d5ff9211c71097534e7742a8e44bf0851b0362642a7271d53f5d83d04eeaae2bad17ef3f35e09e6818434d8eaefa038f3d1f7359d0969a",
|
"hash": "e237d92c59ebbf0dc8ac0bae3bc80340e1e9cf430e1c1c9638443001118e16de2b3e9036ac4b98105427667b0386d97831415170b68c432438dcad9ef8052de7",
|
||||||
"find_args": "CONFIG",
|
"find_args": "CONFIG",
|
||||||
"options": [
|
"options": [
|
||||||
"CPP_JWT_BUILD_EXAMPLES OFF",
|
|
||||||
"CPP_JWT_BUILD_TESTS OFF",
|
|
||||||
"CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF"
|
"CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF"
|
||||||
],
|
|
||||||
"patches": [
|
|
||||||
"0001-no-install.patch",
|
|
||||||
"0002-missing-decl.patch"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"vulkan-headers": {
|
"vulkan-utility-headers": {
|
||||||
"package": "VulkanHeaders",
|
|
||||||
"version": "1.3.274",
|
|
||||||
"repo": "KhronosGroup/Vulkan-Headers",
|
|
||||||
"sha": "89268a6d17",
|
|
||||||
"hash": "3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8"
|
|
||||||
},
|
|
||||||
"vulkan-utility-libraries": {
|
|
||||||
"package": "VulkanUtilityLibraries",
|
"package": "VulkanUtilityLibraries",
|
||||||
"repo": "KhronosGroup/Vulkan-Utility-Libraries",
|
"repo": "scripts/VulkanUtilityHeaders",
|
||||||
"sha": "df2e358152",
|
"tag": "1.4.326",
|
||||||
"hash": "3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79"
|
"artifact": "VulkanUtilityHeaders.tar.zst",
|
||||||
|
"git_host": "git.crueter.xyz",
|
||||||
|
"hash": "5924629755cb1605c4aa4eee20ef7957a9dd8d61e4df548be656d98054f2730c4109693c1bd35811f401f4705d2ccff9fc849be32b0d8480bc3f73541a5e0964"
|
||||||
},
|
},
|
||||||
"vulkan-memory-allocator": {
|
"vulkan-memory-allocator": {
|
||||||
"package": "VulkanMemoryAllocator",
|
"package": "VulkanMemoryAllocator",
|
||||||
|
@ -111,12 +99,6 @@
|
||||||
"repo": "martinus/unordered_dense",
|
"repo": "martinus/unordered_dense",
|
||||||
"sha": "73f3cbb237",
|
"sha": "73f3cbb237",
|
||||||
"hash": "c08c03063938339d61392b687562909c1a92615b6ef39ec8df19ea472aa6b6478e70d7d5e33d4a27b5d23f7806daf57fe1bacb8124c8a945c918c7663a9e8532",
|
"hash": "c08c03063938339d61392b687562909c1a92615b6ef39ec8df19ea472aa6b6478e70d7d5e33d4a27b5d23f7806daf57fe1bacb8124c8a945c918c7663a9e8532",
|
||||||
"find_args": "CONFIG",
|
"find_args": "CONFIG"
|
||||||
"options": [
|
|
||||||
"UNORDERED_DENSE_INSTALL OFF"
|
|
||||||
],
|
|
||||||
"patches": [
|
|
||||||
"0001-cmake.patch"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
2
externals/ffmpeg/CMakeLists.txt
vendored
2
externals/ffmpeg/CMakeLists.txt
vendored
|
@ -1,8 +1,6 @@
|
||||||
# SPDX-FileCopyrightText: 2021 yuzu Emulator Project
|
# SPDX-FileCopyrightText: 2021 yuzu Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
# Explicitly include CPMUtil here since we have a separate cpmfile for ffmpeg
|
|
||||||
set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json)
|
|
||||||
include(CPMUtil)
|
include(CPMUtil)
|
||||||
|
|
||||||
if (NOT WIN32 AND NOT ANDROID)
|
if (NOT WIN32 AND NOT ANDROID)
|
||||||
|
|
66
externals/libusb/CMakeLists.txt
vendored
66
externals/libusb/CMakeLists.txt
vendored
|
@ -1,7 +1,15 @@
|
||||||
# SPDX-FileCopyrightText: 2020 yuzu Emulator Project
|
# SPDX-FileCopyrightText: 2020 yuzu Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
if (MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") OR APPLE)
|
include(CPMUtil)
|
||||||
|
|
||||||
|
AddJsonPackage(libusb)
|
||||||
|
|
||||||
|
if (NOT libusb_ADDED)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (MINGW OR PLATFORM_LINUX OR APPLE)
|
||||||
set(LIBUSB_FOUND ON CACHE BOOL "libusb is present" FORCE)
|
set(LIBUSB_FOUND ON CACHE BOOL "libusb is present" FORCE)
|
||||||
set(LIBUSB_VERSION "1.0.24" CACHE STRING "libusb version string" FORCE)
|
set(LIBUSB_VERSION "1.0.24" CACHE STRING "libusb version string" FORCE)
|
||||||
|
|
||||||
|
@ -19,8 +27,8 @@ if (MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux") OR APPLE)
|
||||||
message(FATAL_ERROR "Required program `libtoolize` not found.")
|
message(FATAL_ERROR "Required program `libtoolize` not found.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(LIBUSB_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/libusb")
|
set(LIBUSB_PREFIX "${libusb_BINARY_DIR}")
|
||||||
set(LIBUSB_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libusb")
|
set(LIBUSB_SRC_DIR "${libusb_SOURCE_DIR}")
|
||||||
|
|
||||||
# Workarounds for MSYS/MinGW
|
# Workarounds for MSYS/MinGW
|
||||||
if (MSYS)
|
if (MSYS)
|
||||||
|
@ -118,27 +126,27 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_library(usb
|
add_library(usb
|
||||||
libusb/libusb/core.c
|
${libusb_SOURCE_DIR}/libusb/core.c
|
||||||
libusb/libusb/core.c
|
${libusb_SOURCE_DIR}/libusb/core.c
|
||||||
libusb/libusb/descriptor.c
|
${libusb_SOURCE_DIR}/libusb/descriptor.c
|
||||||
libusb/libusb/hotplug.c
|
${libusb_SOURCE_DIR}/libusb/hotplug.c
|
||||||
libusb/libusb/io.c
|
${libusb_SOURCE_DIR}/libusb/io.c
|
||||||
libusb/libusb/strerror.c
|
${libusb_SOURCE_DIR}/libusb/strerror.c
|
||||||
libusb/libusb/sync.c
|
${libusb_SOURCE_DIR}/libusb/sync.c
|
||||||
)
|
)
|
||||||
set_target_properties(usb PROPERTIES VERSION 1.0.24)
|
set_target_properties(usb PROPERTIES VERSION 1.0.24)
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_include_directories(usb
|
target_include_directories(usb
|
||||||
BEFORE
|
BEFORE
|
||||||
PUBLIC
|
PUBLIC
|
||||||
libusb/libusb
|
${libusb_SOURCE_DIR}/libusb
|
||||||
|
|
||||||
PRIVATE
|
PRIVATE
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}"
|
"${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
)
|
)
|
||||||
|
|
||||||
if (NOT MINGW)
|
if (NOT MINGW)
|
||||||
target_include_directories(usb BEFORE PRIVATE libusb/msvc)
|
target_include_directories(usb BEFORE PRIVATE ${libusb_SOURCE_DIR}/msvc)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
else()
|
else()
|
||||||
|
@ -148,7 +156,7 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
BEFORE
|
BEFORE
|
||||||
|
|
||||||
PUBLIC
|
PUBLIC
|
||||||
libusb/libusb
|
${libusb_SOURCE_DIR}/libusb
|
||||||
|
|
||||||
PRIVATE
|
PRIVATE
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}"
|
"${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
@ -157,15 +165,15 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
|
|
||||||
if(WIN32 OR CYGWIN)
|
if(WIN32 OR CYGWIN)
|
||||||
target_sources(usb PRIVATE
|
target_sources(usb PRIVATE
|
||||||
libusb/libusb/os/threads_windows.c
|
${libusb_SOURCE_DIR}/libusb/os/threads_windows.c
|
||||||
libusb/libusb/os/windows_winusb.c
|
${libusb_SOURCE_DIR}/libusb/os/windows_winusb.c
|
||||||
libusb/libusb/os/windows_usbdk.c
|
${libusb_SOURCE_DIR}/libusb/os/windows_usbdk.c
|
||||||
libusb/libusb/os/windows_common.c
|
${libusb_SOURCE_DIR}/libusb/os/windows_common.c
|
||||||
)
|
)
|
||||||
set(OS_WINDOWS TRUE)
|
set(OS_WINDOWS TRUE)
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
target_sources(usb PRIVATE
|
target_sources(usb PRIVATE
|
||||||
libusb/libusb/os/darwin_usb.c
|
${libusb_SOURCE_DIR}/libusb/os/darwin_usb.c
|
||||||
)
|
)
|
||||||
find_library(COREFOUNDATION_LIBRARY CoreFoundation)
|
find_library(COREFOUNDATION_LIBRARY CoreFoundation)
|
||||||
find_library(IOKIT_LIBRARY IOKit)
|
find_library(IOKIT_LIBRARY IOKit)
|
||||||
|
@ -178,20 +186,20 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
set(OS_DARWIN TRUE)
|
set(OS_DARWIN TRUE)
|
||||||
elseif(ANDROID)
|
elseif(ANDROID)
|
||||||
target_sources(usb PRIVATE
|
target_sources(usb PRIVATE
|
||||||
libusb/libusb/os/linux_usbfs.c
|
${libusb_SOURCE_DIR}/libusb/os/linux_usbfs.c
|
||||||
libusb/libusb/os/linux_netlink.c
|
${libusb_SOURCE_DIR}/libusb/os/linux_netlink.c
|
||||||
)
|
)
|
||||||
find_library(LOG_LIBRARY log)
|
find_library(LOG_LIBRARY log)
|
||||||
target_link_libraries(usb PRIVATE ${LOG_LIBRARY})
|
target_link_libraries(usb PRIVATE ${LOG_LIBRARY})
|
||||||
set(OS_LINUX TRUE)
|
set(OS_LINUX TRUE)
|
||||||
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
target_sources(usb PRIVATE
|
target_sources(usb PRIVATE
|
||||||
libusb/libusb/os/linux_usbfs.c
|
${libusb_SOURCE_DIR}/libusb/os/linux_usbfs.c
|
||||||
)
|
)
|
||||||
find_package(Libudev)
|
find_package(Libudev)
|
||||||
if(LIBUDEV_FOUND)
|
if(LIBUDEV_FOUND)
|
||||||
target_sources(usb PRIVATE
|
target_sources(usb PRIVATE
|
||||||
libusb/libusb/os/linux_udev.c
|
${libusb_SOURCE_DIR}/libusb/os/linux_udev.c
|
||||||
)
|
)
|
||||||
target_link_libraries(usb PRIVATE "${LIBUDEV_LIBRARIES}")
|
target_link_libraries(usb PRIVATE "${LIBUDEV_LIBRARIES}")
|
||||||
target_include_directories(usb PRIVATE "${LIBUDEV_INCLUDE_DIR}")
|
target_include_directories(usb PRIVATE "${LIBUDEV_INCLUDE_DIR}")
|
||||||
|
@ -199,26 +207,26 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
set(USE_UDEV TRUE)
|
set(USE_UDEV TRUE)
|
||||||
else()
|
else()
|
||||||
target_sources(usb PRIVATE
|
target_sources(usb PRIVATE
|
||||||
libusb/libusb/os/linux_netlink.c
|
${libusb_SOURCE_DIR}/libusb/os/linux_netlink.c
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
set(OS_LINUX TRUE)
|
set(OS_LINUX TRUE)
|
||||||
elseif(${CMAKE_SYSTEM_NAME} MATCHES "NetBSD")
|
elseif(${CMAKE_SYSTEM_NAME} MATCHES "NetBSD")
|
||||||
target_sources(usb PRIVATE
|
target_sources(usb PRIVATE
|
||||||
libusb/libusb/os/netbsd_usb.c
|
${libusb_SOURCE_DIR}/libusb/os/netbsd_usb.c
|
||||||
)
|
)
|
||||||
set(OS_NETBSD TRUE)
|
set(OS_NETBSD TRUE)
|
||||||
elseif(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
|
elseif(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD")
|
||||||
target_sources(usb PRIVATE
|
target_sources(usb PRIVATE
|
||||||
libusb/libusb/os/openbsd_usb.c
|
${libusb_SOURCE_DIR}/libusb/os/openbsd_usb.c
|
||||||
)
|
)
|
||||||
set(OS_OPENBSD TRUE)
|
set(OS_OPENBSD TRUE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
target_sources(usb PRIVATE
|
target_sources(usb PRIVATE
|
||||||
libusb/libusb/os/events_posix.c
|
${libusb_SOURCE_DIR}/libusb/os/events_posix.c
|
||||||
libusb/libusb/os/threads_posix.c
|
${libusb_SOURCE_DIR}/libusb/os/threads_posix.c
|
||||||
)
|
)
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
if(THREADS_HAVE_PTHREAD_ARG)
|
if(THREADS_HAVE_PTHREAD_ARG)
|
||||||
|
@ -230,8 +238,8 @@ else() # MINGW OR (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
set(THREADS_POSIX TRUE)
|
set(THREADS_POSIX TRUE)
|
||||||
elseif(WIN32)
|
elseif(WIN32)
|
||||||
target_sources(usb PRIVATE
|
target_sources(usb PRIVATE
|
||||||
libusb/libusb/os/events_windows.c
|
${libusb_SOURCE_DIR}/libusb/os/events_windows.c
|
||||||
libusb/libusb/os/threads_windows.c
|
${libusb_SOURCE_DIR}/libusb/os/threads_windows.c
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
8
externals/libusb/cpmfile.json
vendored
Normal file
8
externals/libusb/cpmfile.json
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"libusb": {
|
||||||
|
"repo": "libusb/libusb",
|
||||||
|
"sha": "c060e9ce30",
|
||||||
|
"hash": "44647357ba1179020cfa6674d809fc35cf6f89bff1c57252fe3a610110f5013ad678fc6eb5918e751d4384c30e2fe678868dbffc5f85736157e546cb9d10accc",
|
||||||
|
"find_args": "MODULE"
|
||||||
|
}
|
||||||
|
}
|
1
externals/libusb/libusb
vendored
1
externals/libusb/libusb
vendored
|
@ -1 +0,0 @@
|
||||||
Subproject commit c060e9ce30ac2e3ffb49d94209c4dae77b6642f7
|
|
11
externals/nx_tzdb/CMakeLists.txt
vendored
11
externals/nx_tzdb/CMakeLists.txt
vendored
|
@ -4,8 +4,6 @@
|
||||||
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
# Explicitly include CPMUtil here since we have a separate cpmfile for nx_tzdb
|
|
||||||
set(CPMUTIL_JSON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cpmfile.json)
|
|
||||||
include(CPMUtil)
|
include(CPMUtil)
|
||||||
|
|
||||||
set(NX_TZDB_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include")
|
set(NX_TZDB_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include")
|
||||||
|
@ -35,9 +33,12 @@ if (CAN_BUILD_NX_TZDB AND NOT YUZU_DOWNLOAD_TIME_ZONE_DATA)
|
||||||
set(NX_TZDB_TZ_DIR "${NX_TZDB_BASE_DIR}/zoneinfo")
|
set(NX_TZDB_TZ_DIR "${NX_TZDB_BASE_DIR}/zoneinfo")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# TODO(crueter): This is a terrible solution, but MSVC fails to link without it
|
if(NOT YUZU_TZDB_PATH STREQUAL "")
|
||||||
# Need to investigate further but I still can't reproduce...
|
set(NX_TZDB_BASE_DIR "${YUZU_TZDB_PATH}")
|
||||||
if (MSVC)
|
set(NX_TZDB_TZ_DIR "${NX_TZDB_BASE_DIR}/zoneinfo")
|
||||||
|
elseif (MSVC)
|
||||||
|
# TODO(crueter): This is a terrible solution, but MSVC fails to link without it
|
||||||
|
# Need to investigate further but I still can't reproduce...
|
||||||
set(NX_TZDB_VERSION "250725")
|
set(NX_TZDB_VERSION "250725")
|
||||||
set(NX_TZDB_ARCHIVE "${CPM_SOURCE_CACHE}/nx_tzdb/${NX_TZDB_VERSION}.zip")
|
set(NX_TZDB_ARCHIVE "${CPM_SOURCE_CACHE}/nx_tzdb/${NX_TZDB_VERSION}.zip")
|
||||||
|
|
||||||
|
|
5
externals/nx_tzdb/cpmfile.json
vendored
5
externals/nx_tzdb/cpmfile.json
vendored
|
@ -1,7 +1,10 @@
|
||||||
{
|
{
|
||||||
"tzdb": {
|
"tzdb": {
|
||||||
"package": "nx_tzdb",
|
"package": "nx_tzdb",
|
||||||
"url": "https://github.com/crueter/tzdb_to_nx/releases/download/250725/250725.zip",
|
"repo": "misc/tzdb_to_nx",
|
||||||
|
"git_host": "git.crueter.xyz",
|
||||||
|
"artifact": "%VERSION%.zip",
|
||||||
|
"tag": "%VERSION%",
|
||||||
"hash": "8f60b4b29f285e39c0443f3d5572a73780f3dbfcfd5b35004451fadad77f3a215b2e2aa8d0fffe7e348e2a7b0660882b35228b6178dda8804a14ce44509fd2ca",
|
"hash": "8f60b4b29f285e39c0443f3d5572a73780f3dbfcfd5b35004451fadad77f3a215b2e2aa8d0fffe7e348e2a7b0660882b35228b6178dda8804a14ce44509fd2ca",
|
||||||
"version": "250725"
|
"version": "250725"
|
||||||
}
|
}
|
||||||
|
|
22
externals/sse2neon/sse2neon.h
vendored
22
externals/sse2neon/sse2neon.h
vendored
|
@ -183,7 +183,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compiler barrier */
|
/* Compiler barrier */
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
#define SSE2NEON_BARRIER() _ReadWriteBarrier()
|
#define SSE2NEON_BARRIER() _ReadWriteBarrier()
|
||||||
#else
|
#else
|
||||||
#define SSE2NEON_BARRIER() \
|
#define SSE2NEON_BARRIER() \
|
||||||
|
@ -859,7 +859,7 @@ FORCE_INLINE uint64x2_t _sse2neon_vmull_p64(uint64x1_t _a, uint64x1_t _b)
|
||||||
{
|
{
|
||||||
poly64_t a = vget_lane_p64(vreinterpret_p64_u64(_a), 0);
|
poly64_t a = vget_lane_p64(vreinterpret_p64_u64(_a), 0);
|
||||||
poly64_t b = vget_lane_p64(vreinterpret_p64_u64(_b), 0);
|
poly64_t b = vget_lane_p64(vreinterpret_p64_u64(_b), 0);
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
__n64 a1 = {a}, b1 = {b};
|
__n64 a1 = {a}, b1 = {b};
|
||||||
return vreinterpretq_u64_p128(vmull_p64(a1, b1));
|
return vreinterpretq_u64_p128(vmull_p64(a1, b1));
|
||||||
#else
|
#else
|
||||||
|
@ -1770,7 +1770,7 @@ FORCE_INLINE void _mm_free(void *addr)
|
||||||
FORCE_INLINE uint64_t _sse2neon_get_fpcr(void)
|
FORCE_INLINE uint64_t _sse2neon_get_fpcr(void)
|
||||||
{
|
{
|
||||||
uint64_t value;
|
uint64_t value;
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
value = _ReadStatusReg(ARM64_FPCR);
|
value = _ReadStatusReg(ARM64_FPCR);
|
||||||
#else
|
#else
|
||||||
__asm__ __volatile__("mrs %0, FPCR" : "=r"(value)); /* read */
|
__asm__ __volatile__("mrs %0, FPCR" : "=r"(value)); /* read */
|
||||||
|
@ -1780,7 +1780,7 @@ FORCE_INLINE uint64_t _sse2neon_get_fpcr(void)
|
||||||
|
|
||||||
FORCE_INLINE void _sse2neon_set_fpcr(uint64_t value)
|
FORCE_INLINE void _sse2neon_set_fpcr(uint64_t value)
|
||||||
{
|
{
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
_WriteStatusReg(ARM64_FPCR, value);
|
_WriteStatusReg(ARM64_FPCR, value);
|
||||||
#else
|
#else
|
||||||
__asm__ __volatile__("msr FPCR, %0" ::"r"(value)); /* write */
|
__asm__ __volatile__("msr FPCR, %0" ::"r"(value)); /* write */
|
||||||
|
@ -2249,7 +2249,7 @@ FORCE_INLINE __m128 _mm_or_ps(__m128 a, __m128 b)
|
||||||
FORCE_INLINE void _mm_prefetch(char const *p, int i)
|
FORCE_INLINE void _mm_prefetch(char const *p, int i)
|
||||||
{
|
{
|
||||||
(void) i;
|
(void) i;
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
switch (i) {
|
switch (i) {
|
||||||
case _MM_HINT_NTA:
|
case _MM_HINT_NTA:
|
||||||
__prefetch2(p, 1);
|
__prefetch2(p, 1);
|
||||||
|
@ -4820,7 +4820,7 @@ FORCE_INLINE __m128i _mm_packus_epi16(const __m128i a, const __m128i b)
|
||||||
// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_pause
|
// https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_pause
|
||||||
FORCE_INLINE void _mm_pause(void)
|
FORCE_INLINE void _mm_pause(void)
|
||||||
{
|
{
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
__isb(_ARM64_BARRIER_SY);
|
__isb(_ARM64_BARRIER_SY);
|
||||||
#else
|
#else
|
||||||
__asm__ __volatile__("isb\n");
|
__asm__ __volatile__("isb\n");
|
||||||
|
@ -5716,7 +5716,7 @@ FORCE_INLINE __m128d _mm_undefined_pd(void)
|
||||||
#pragma GCC diagnostic ignored "-Wuninitialized"
|
#pragma GCC diagnostic ignored "-Wuninitialized"
|
||||||
#endif
|
#endif
|
||||||
__m128d a;
|
__m128d a;
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
a = _mm_setzero_pd();
|
a = _mm_setzero_pd();
|
||||||
#endif
|
#endif
|
||||||
return a;
|
return a;
|
||||||
|
@ -8130,7 +8130,7 @@ FORCE_INLINE int _sse2neon_sido_negative(int res, int lb, int imm8, int bound)
|
||||||
|
|
||||||
FORCE_INLINE int _sse2neon_clz(unsigned int x)
|
FORCE_INLINE int _sse2neon_clz(unsigned int x)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
unsigned long cnt = 0;
|
unsigned long cnt = 0;
|
||||||
if (_BitScanReverse(&cnt, x))
|
if (_BitScanReverse(&cnt, x))
|
||||||
return 31 - cnt;
|
return 31 - cnt;
|
||||||
|
@ -8142,7 +8142,7 @@ FORCE_INLINE int _sse2neon_clz(unsigned int x)
|
||||||
|
|
||||||
FORCE_INLINE int _sse2neon_ctz(unsigned int x)
|
FORCE_INLINE int _sse2neon_ctz(unsigned int x)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
unsigned long cnt = 0;
|
unsigned long cnt = 0;
|
||||||
if (_BitScanForward(&cnt, x))
|
if (_BitScanForward(&cnt, x))
|
||||||
return cnt;
|
return cnt;
|
||||||
|
@ -9058,7 +9058,7 @@ FORCE_INLINE __m128i _mm_aeskeygenassist_si128(__m128i a, const int rcon)
|
||||||
// AESE does ShiftRows and SubBytes on A
|
// AESE does ShiftRows and SubBytes on A
|
||||||
uint8x16_t u8 = vaeseq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0));
|
uint8x16_t u8 = vaeseq_u8(vreinterpretq_u8_m128i(a), vdupq_n_u8(0));
|
||||||
|
|
||||||
#ifndef _MSC_VER
|
#if !defined(_MSC_VER) || defined(__clang__)
|
||||||
uint8x16_t dest = {
|
uint8x16_t dest = {
|
||||||
// Undo ShiftRows step from AESE and extract X1 and X3
|
// Undo ShiftRows step from AESE and extract X1 and X3
|
||||||
u8[0x4], u8[0x1], u8[0xE], u8[0xB], // SubBytes(X1)
|
u8[0x4], u8[0x1], u8[0xE], u8[0xB], // SubBytes(X1)
|
||||||
|
@ -9245,7 +9245,7 @@ FORCE_INLINE uint64_t _rdtsc(void)
|
||||||
* bits wide and it is attributed with the flag 'cap_user_time_short'
|
* bits wide and it is attributed with the flag 'cap_user_time_short'
|
||||||
* is true.
|
* is true.
|
||||||
*/
|
*/
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
val = _ReadStatusReg(ARM64_SYSREG(3, 3, 14, 0, 2));
|
val = _ReadStatusReg(ARM64_SYSREG(3, 3, 14, 0, 2));
|
||||||
#else
|
#else
|
||||||
__asm__ __volatile__("mrs %0, cntvct_el0" : "=r"(val));
|
__asm__ __volatile__("mrs %0, cntvct_el0" : "=r"(val));
|
||||||
|
|
|
@ -18,20 +18,20 @@ set_property(DIRECTORY APPEND PROPERTY
|
||||||
COMPILE_DEFINITIONS $<$<CONFIG:Debug>:_DEBUG> $<$<NOT:$<CONFIG:Debug>>:NDEBUG>)
|
COMPILE_DEFINITIONS $<$<CONFIG:Debug>:_DEBUG> $<$<NOT:$<CONFIG:Debug>>:NDEBUG>)
|
||||||
|
|
||||||
# Set compilation flags
|
# Set compilation flags
|
||||||
if (MSVC)
|
if (MSVC AND NOT CXX_CLANG)
|
||||||
set(CMAKE_CONFIGURATION_TYPES Debug Release CACHE STRING "" FORCE)
|
set(CMAKE_CONFIGURATION_TYPES Debug Release CACHE STRING "" FORCE)
|
||||||
|
|
||||||
# Silence "deprecation" warnings
|
# Silence "deprecation" warnings
|
||||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS)
|
add_compile_definitions(_CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE _SCL_SECURE_NO_WARNINGS)
|
||||||
|
|
||||||
# Avoid windows.h junk
|
# Avoid windows.h junk
|
||||||
add_definitions(-DNOMINMAX)
|
add_compile_definitions(NOMINMAX)
|
||||||
|
|
||||||
# Avoid windows.h from including some usually unused libs like winsocks.h, since this might cause some redefinition errors.
|
# Avoid windows.h from including some usually unused libs like winsocks.h, since this might cause some redefinition errors.
|
||||||
add_definitions(-DWIN32_LEAN_AND_MEAN)
|
add_compile_definitions(WIN32_LEAN_AND_MEAN)
|
||||||
|
|
||||||
# Ensure that projects are built with Unicode support.
|
# Ensure that projects are built with Unicode support.
|
||||||
add_definitions(-DUNICODE -D_UNICODE)
|
add_compile_definitions(UNICODE _UNICODE)
|
||||||
|
|
||||||
# /W4 - Level 4 warnings
|
# /W4 - Level 4 warnings
|
||||||
# /MP - Multi-threaded compilation
|
# /MP - Multi-threaded compilation
|
||||||
|
@ -69,10 +69,6 @@ if (MSVC)
|
||||||
/external:anglebrackets # Treats all headers included by #include <header>, where the header file is enclosed in angle brackets (< >), as external headers
|
/external:anglebrackets # Treats all headers included by #include <header>, where the header file is enclosed in angle brackets (< >), as external headers
|
||||||
/external:W0 # Sets the default warning level to 0 for external headers, effectively disabling warnings for them.
|
/external:W0 # Sets the default warning level to 0 for external headers, effectively disabling warnings for them.
|
||||||
|
|
||||||
# Warnings
|
|
||||||
/W4
|
|
||||||
/WX-
|
|
||||||
|
|
||||||
/we4062 # Enumerator 'identifier' in a switch of enum 'enumeration' is not handled
|
/we4062 # Enumerator 'identifier' in a switch of enum 'enumeration' is not handled
|
||||||
/we4189 # 'identifier': local variable is initialized but not referenced
|
/we4189 # 'identifier': local variable is initialized but not referenced
|
||||||
/we4265 # 'class': class has virtual functions, but destructor is not virtual
|
/we4265 # 'class': class has virtual functions, but destructor is not virtual
|
||||||
|
@ -97,6 +93,14 @@ if (MSVC)
|
||||||
/wd4702 # unreachable code (when used with LTO)
|
/wd4702 # unreachable code (when used with LTO)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (NOT CXX_CLANG)
|
||||||
|
add_compile_options(
|
||||||
|
# Warnings
|
||||||
|
/W4
|
||||||
|
/WX-
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (USE_CCACHE OR YUZU_USE_PRECOMPILED_HEADERS)
|
if (USE_CCACHE OR YUZU_USE_PRECOMPILED_HEADERS)
|
||||||
# when caching, we need to use /Z7 to downgrade debug info to use an older but more cacheable format
|
# when caching, we need to use /Z7 to downgrade debug info to use an older but more cacheable format
|
||||||
# Precompiled headers are deleted if not using /Z7. See https://github.com/nanoant/CMakePCHCompiler/issues/21
|
# Precompiled headers are deleted if not using /Z7. See https://github.com/nanoant/CMakePCHCompiler/issues/21
|
||||||
|
@ -118,9 +122,13 @@ if (MSVC)
|
||||||
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG /MANIFEST:NO" CACHE STRING "" FORCE)
|
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG /MANIFEST:NO" CACHE STRING "" FORCE)
|
||||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
|
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG /MANIFEST:NO /INCREMENTAL:NO /OPT:REF,ICF" CACHE STRING "" FORCE)
|
||||||
else()
|
else()
|
||||||
add_compile_options(
|
if (NOT MSVC)
|
||||||
-fwrapv
|
add_compile_options(
|
||||||
|
-fwrapv
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_compile_options(
|
||||||
-Werror=all
|
-Werror=all
|
||||||
-Werror=extra
|
-Werror=extra
|
||||||
-Werror=missing-declarations
|
-Werror=missing-declarations
|
||||||
|
@ -133,14 +141,19 @@ else()
|
||||||
-Wno-missing-field-initializers
|
-Wno-missing-field-initializers
|
||||||
)
|
)
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES Clang OR CMAKE_CXX_COMPILER_ID MATCHES IntelLLVM) # Clang or AppleClang
|
if (CXX_CLANG OR CXX_ICC) # Clang or AppleClang
|
||||||
|
if (NOT MSVC)
|
||||||
|
add_compile_options(
|
||||||
|
-Werror=shadow-uncaptured-local
|
||||||
|
-Werror=implicit-fallthrough
|
||||||
|
-Werror=type-limits
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
add_compile_options(
|
add_compile_options(
|
||||||
-Wno-braced-scalar-init
|
-Wno-braced-scalar-init
|
||||||
-Wno-unused-private-field
|
-Wno-unused-private-field
|
||||||
-Wno-nullability-completeness
|
-Wno-nullability-completeness
|
||||||
-Werror=shadow-uncaptured-local
|
|
||||||
-Werror=implicit-fallthrough
|
|
||||||
-Werror=type-limits
|
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -148,12 +161,12 @@ else()
|
||||||
add_compile_options("-mcx16")
|
add_compile_options("-mcx16")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (APPLE AND CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
if (APPLE AND CXX_CLANG)
|
||||||
add_compile_options("-stdlib=libc++")
|
add_compile_options("-stdlib=libc++")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# GCC bugs
|
# GCC bugs
|
||||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "11" AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "11" AND CXX_GCC)
|
||||||
# These diagnostics would be great if they worked, but are just completely broken
|
# These diagnostics would be great if they worked, but are just completely broken
|
||||||
# and produce bogus errors on external libraries like fmt.
|
# and produce bogus errors on external libraries like fmt.
|
||||||
add_compile_options(
|
add_compile_options(
|
||||||
|
@ -169,15 +182,15 @@ else()
|
||||||
# glibc, which may default to 32 bits. glibc allows this to be configured
|
# glibc, which may default to 32 bits. glibc allows this to be configured
|
||||||
# by setting _FILE_OFFSET_BITS.
|
# by setting _FILE_OFFSET_BITS.
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR MINGW)
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR MINGW)
|
||||||
add_definitions(-D_FILE_OFFSET_BITS=64)
|
add_compile_definitions(_FILE_OFFSET_BITS=64)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (MINGW)
|
if (MINGW)
|
||||||
add_definitions(-DMINGW_HAS_SECURE_API)
|
add_compile_definitions(MINGW_HAS_SECURE_API)
|
||||||
add_compile_options("-msse4.1")
|
add_compile_options("-msse4.1")
|
||||||
|
|
||||||
if (MINGW_STATIC_BUILD)
|
if (MINGW_STATIC_BUILD)
|
||||||
add_definitions(-DQT_STATICPLUGIN)
|
add_compile_definitions(QT_STATICPLUGIN)
|
||||||
add_compile_options("-static")
|
add_compile_options("-static")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -179,7 +179,8 @@ android {
|
||||||
"-DCMAKE_EXPORT_COMPILE_COMMANDS=ON",
|
"-DCMAKE_EXPORT_COMPILE_COMMANDS=ON",
|
||||||
"-DBUILD_TESTING=OFF",
|
"-DBUILD_TESTING=OFF",
|
||||||
"-DYUZU_TESTS=OFF",
|
"-DYUZU_TESTS=OFF",
|
||||||
"-DDYNARMIC_TESTS=OFF"
|
"-DDYNARMIC_TESTS=OFF",
|
||||||
|
"-DDYNARMIC_ENABLE_LTO=ON"
|
||||||
)
|
)
|
||||||
|
|
||||||
abiFilters("arm64-v8a")
|
abiFilters("arm64-v8a")
|
||||||
|
|
|
@ -17,7 +17,7 @@ add_library(yuzu-android SHARED
|
||||||
|
|
||||||
set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR})
|
set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR})
|
||||||
|
|
||||||
target_link_libraries(yuzu-android PRIVATE audio_core common core input_common frontend_common Vulkan::Headers GPUOpen::VulkanMemoryAllocator)
|
target_link_libraries(yuzu-android PRIVATE audio_core common core input_common frontend_common video_core)
|
||||||
target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad jnigraphics log)
|
target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad jnigraphics log)
|
||||||
if (ARCHITECTURE_arm64)
|
if (ARCHITECTURE_arm64)
|
||||||
target_link_libraries(yuzu-android PRIVATE adrenotools)
|
target_link_libraries(yuzu-android PRIVATE adrenotools)
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
# SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -229,9 +232,10 @@ endif()
|
||||||
target_include_directories(audio_core PRIVATE ${OPUS_INCLUDE_DIRS})
|
target_include_directories(audio_core PRIVATE ${OPUS_INCLUDE_DIRS})
|
||||||
target_link_libraries(audio_core PUBLIC common core opus)
|
target_link_libraries(audio_core PUBLIC common core opus)
|
||||||
|
|
||||||
if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)
|
# what?
|
||||||
target_link_libraries(audio_core PRIVATE dynarmic::dynarmic)
|
# if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64)
|
||||||
endif()
|
# target_link_libraries(audio_core PRIVATE dynarmic::dynarmic)
|
||||||
|
# endif()
|
||||||
|
|
||||||
if (ENABLE_CUBEB)
|
if (ENABLE_CUBEB)
|
||||||
target_sources(audio_core PRIVATE
|
target_sources(audio_core PRIVATE
|
||||||
|
@ -240,7 +244,7 @@ if (ENABLE_CUBEB)
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(audio_core PRIVATE cubeb)
|
target_link_libraries(audio_core PRIVATE cubeb)
|
||||||
target_compile_definitions(audio_core PRIVATE -DHAVE_CUBEB=1)
|
target_compile_definitions(audio_core PRIVATE HAVE_CUBEB=1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ENABLE_SDL2)
|
if (ENABLE_SDL2)
|
||||||
|
|
|
@ -193,7 +193,7 @@ void AudioRenderer::Main(std::stop_token stop_token) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
max_time = std::min(command_buffer.time_limit, max_time);
|
max_time = (std::min)(command_buffer.time_limit, max_time);
|
||||||
command_list_processor.SetProcessTimeMax(max_time);
|
command_list_processor.SetProcessTimeMax(max_time);
|
||||||
|
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
|
|
|
@ -73,9 +73,9 @@ constexpr s32 HighestVoicePriority = 0;
|
||||||
constexpr u32 BufferAlignment = 0x40;
|
constexpr u32 BufferAlignment = 0x40;
|
||||||
constexpr u32 WorkbufferAlignment = 0x1000;
|
constexpr u32 WorkbufferAlignment = 0x1000;
|
||||||
constexpr s32 FinalMixId = 0;
|
constexpr s32 FinalMixId = 0;
|
||||||
constexpr s32 InvalidDistanceFromFinalMix = std::numeric_limits<s32>::min();
|
constexpr s32 InvalidDistanceFromFinalMix = (std::numeric_limits<s32>::min)();
|
||||||
constexpr s32 UnusedSplitterId = -1;
|
constexpr s32 UnusedSplitterId = -1;
|
||||||
constexpr s32 UnusedMixId = std::numeric_limits<s32>::max();
|
constexpr s32 UnusedMixId = (std::numeric_limits<s32>::max)();
|
||||||
constexpr u32 InvalidNodeId = 0xF0000000;
|
constexpr u32 InvalidNodeId = 0xF0000000;
|
||||||
constexpr s32 InvalidProcessOrder = -1;
|
constexpr s32 InvalidProcessOrder = -1;
|
||||||
constexpr u32 MaxBiquadFilters = 2;
|
constexpr u32 MaxBiquadFilters = 2;
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -13,7 +16,7 @@
|
||||||
#include "common/polyfill_ranges.h"
|
#include "common/polyfill_ranges.h"
|
||||||
|
|
||||||
namespace AudioCore {
|
namespace AudioCore {
|
||||||
constexpr u32 CurrentRevision = 15;
|
constexpr u32 CurrentRevision = 16;
|
||||||
|
|
||||||
enum class SupportTags {
|
enum class SupportTags {
|
||||||
CommandProcessingTimeEstimatorVersion4,
|
CommandProcessingTimeEstimatorVersion4,
|
||||||
|
@ -54,6 +57,7 @@ constexpr u32 GetRevisionNum(u32 user_revision) {
|
||||||
user_revision -= Common::MakeMagic('R', 'E', 'V', '0');
|
user_revision -= Common::MakeMagic('R', 'E', 'V', '0');
|
||||||
user_revision >>= 24;
|
user_revision >>= 24;
|
||||||
}
|
}
|
||||||
|
|
||||||
return user_revision;
|
return user_revision;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ public:
|
||||||
*/
|
*/
|
||||||
void RegisterBuffers(boost::container::static_vector<AudioBuffer, N>& out_buffers) {
|
void RegisterBuffers(boost::container::static_vector<AudioBuffer, N>& out_buffers) {
|
||||||
std::scoped_lock l{lock};
|
std::scoped_lock l{lock};
|
||||||
const s32 to_register{std::min(std::min(appended_count, BufferAppendLimit),
|
const s32 to_register{(std::min)((std::min)(appended_count, BufferAppendLimit),
|
||||||
BufferAppendLimit - registered_count)};
|
BufferAppendLimit - registered_count)};
|
||||||
|
|
||||||
for (s32 i = 0; i < to_register; i++) {
|
for (s32 i = 0; i < to_register; i++) {
|
||||||
|
@ -175,7 +175,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t buffers_to_flush{
|
size_t buffers_to_flush{
|
||||||
std::min(static_cast<u32>(registered_count + appended_count), max_buffers)};
|
(std::min)(static_cast<u32>(registered_count + appended_count), max_buffers)};
|
||||||
if (buffers_to_flush == 0) {
|
if (buffers_to_flush == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ u32 AudioDevice::ListAudioDeviceName(std::span<AudioDeviceName> out_buffer) cons
|
||||||
names = device_names;
|
names = device_names;
|
||||||
}
|
}
|
||||||
|
|
||||||
const u32 out_count{static_cast<u32>(std::min(out_buffer.size(), names.size()))};
|
const u32 out_count{static_cast<u32>((std::min)(out_buffer.size(), names.size()))};
|
||||||
for (u32 i = 0; i < out_count; i++) {
|
for (u32 i = 0; i < out_count; i++) {
|
||||||
out_buffer[i] = names[i];
|
out_buffer[i] = names[i];
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ u32 AudioDevice::ListAudioDeviceName(std::span<AudioDeviceName> out_buffer) cons
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 AudioDevice::ListAudioOutputDeviceName(std::span<AudioDeviceName> out_buffer) const {
|
u32 AudioDevice::ListAudioOutputDeviceName(std::span<AudioDeviceName> out_buffer) const {
|
||||||
const u32 out_count{static_cast<u32>(std::min(out_buffer.size(), output_device_names.size()))};
|
const u32 out_count{static_cast<u32>((std::min)(out_buffer.size(), output_device_names.size()))};
|
||||||
|
|
||||||
for (u32 i = 0; i < out_count; i++) {
|
for (u32 i = 0; i < out_count; i++) {
|
||||||
out_buffer[i] = output_device_names[i];
|
out_buffer[i] = output_device_names[i];
|
||||||
|
|
|
@ -43,7 +43,7 @@ void BehaviorInfo::AppendError(const ErrorInfo& error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void BehaviorInfo::CopyErrorInfo(std::span<ErrorInfo> out_errors, u32& out_count) const {
|
void BehaviorInfo::CopyErrorInfo(std::span<ErrorInfo> out_errors, u32& out_count) const {
|
||||||
out_count = std::min(error_count, MaxErrors);
|
out_count = (std::min)(error_count, MaxErrors);
|
||||||
|
|
||||||
for (size_t i = 0; i < MaxErrors; i++) {
|
for (size_t i = 0; i < MaxErrors; i++) {
|
||||||
if (i < out_count) {
|
if (i < out_count) {
|
||||||
|
|
|
@ -464,7 +464,7 @@ void CommandBuffer::GenerateDeviceSinkCommand(const s32 node_id, const s16 buffe
|
||||||
s16 max_input{0};
|
s16 max_input{0};
|
||||||
for (u32 i = 0; i < parameter.input_count; i++) {
|
for (u32 i = 0; i < parameter.input_count; i++) {
|
||||||
cmd.inputs[i] = buffer_offset + parameter.inputs[i];
|
cmd.inputs[i] = buffer_offset + parameter.inputs[i];
|
||||||
max_input = std::max(max_input, cmd.inputs[i]);
|
max_input = (std::max)(max_input, cmd.inputs[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state.upsampler_info != nullptr) {
|
if (state.upsampler_info != nullptr) {
|
||||||
|
|
|
@ -56,11 +56,11 @@ public:
|
||||||
// Voices
|
// Voices
|
||||||
u64 voice_size{0};
|
u64 voice_size{0};
|
||||||
if (behavior.IsWaveBufferVer2Supported()) {
|
if (behavior.IsWaveBufferVer2Supported()) {
|
||||||
voice_size = std::max(std::max(sizeof(AdpcmDataSourceVersion2Command),
|
voice_size = (std::max)((std::max)(sizeof(AdpcmDataSourceVersion2Command),
|
||||||
sizeof(PcmInt16DataSourceVersion2Command)),
|
sizeof(PcmInt16DataSourceVersion2Command)),
|
||||||
sizeof(PcmFloatDataSourceVersion2Command));
|
sizeof(PcmFloatDataSourceVersion2Command));
|
||||||
} else {
|
} else {
|
||||||
voice_size = std::max(std::max(sizeof(AdpcmDataSourceVersion1Command),
|
voice_size = (std::max)((std::max)(sizeof(AdpcmDataSourceVersion1Command),
|
||||||
sizeof(PcmInt16DataSourceVersion1Command)),
|
sizeof(PcmInt16DataSourceVersion1Command)),
|
||||||
sizeof(PcmFloatDataSourceVersion1Command));
|
sizeof(PcmFloatDataSourceVersion1Command));
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ public:
|
||||||
|
|
||||||
// Sinks
|
// Sinks
|
||||||
size +=
|
size +=
|
||||||
params.sinks * std::max(sizeof(DeviceSinkCommand), sizeof(CircularBufferSinkCommand));
|
params.sinks * (std::max)(sizeof(DeviceSinkCommand), sizeof(CircularBufferSinkCommand));
|
||||||
|
|
||||||
// Performance
|
// Performance
|
||||||
size += (params.effects + params.voices + params.sinks + params.sub_mixes + 1 +
|
size += (params.effects + params.voices + params.sinks + params.sub_mixes + 1 +
|
||||||
|
|
|
@ -29,8 +29,8 @@ constexpr std::array<u8, 3> PitchBySrcQuality = {4, 8, 4};
|
||||||
template <typename T>
|
template <typename T>
|
||||||
static u32 DecodePcm(Core::Memory::Memory& memory, std::span<s16> out_buffer,
|
static u32 DecodePcm(Core::Memory::Memory& memory, std::span<s16> out_buffer,
|
||||||
const DecodeArg& req) {
|
const DecodeArg& req) {
|
||||||
constexpr s32 min{std::numeric_limits<s16>::min()};
|
constexpr s32 min{(std::numeric_limits<s16>::min)()};
|
||||||
constexpr s32 max{std::numeric_limits<s16>::max()};
|
constexpr s32 max{(std::numeric_limits<s16>::max)()};
|
||||||
|
|
||||||
if (req.buffer == 0 || req.buffer_size == 0) {
|
if (req.buffer == 0 || req.buffer_size == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -41,7 +41,7 @@ static u32 DecodePcm(Core::Memory::Memory& memory, std::span<s16> out_buffer,
|
||||||
}
|
}
|
||||||
|
|
||||||
auto samples_to_decode{
|
auto samples_to_decode{
|
||||||
std::min(req.samples_to_read, req.end_offset - req.start_offset - req.offset)};
|
(std::min)(req.samples_to_read, req.end_offset - req.start_offset - req.offset)};
|
||||||
u32 channel_count{static_cast<u32>(req.channel_count)};
|
u32 channel_count{static_cast<u32>(req.channel_count)};
|
||||||
|
|
||||||
switch (req.channel_count) {
|
switch (req.channel_count) {
|
||||||
|
@ -55,7 +55,7 @@ static u32 DecodePcm(Core::Memory::Memory& memory, std::span<s16> out_buffer,
|
||||||
if constexpr (std::is_floating_point_v<T>) {
|
if constexpr (std::is_floating_point_v<T>) {
|
||||||
for (u32 i = 0; i < samples_to_decode; i++) {
|
for (u32 i = 0; i < samples_to_decode; i++) {
|
||||||
auto sample{static_cast<s32>(samples[i * channel_count + req.target_channel] *
|
auto sample{static_cast<s32>(samples[i * channel_count + req.target_channel] *
|
||||||
std::numeric_limits<s16>::max())};
|
(std::numeric_limits<s16>::max)())};
|
||||||
out_buffer[i] = static_cast<s16>(std::clamp(sample, min, max));
|
out_buffer[i] = static_cast<s16>(std::clamp(sample, min, max));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -79,7 +79,7 @@ static u32 DecodePcm(Core::Memory::Memory& memory, std::span<s16> out_buffer,
|
||||||
if constexpr (std::is_floating_point_v<T>) {
|
if constexpr (std::is_floating_point_v<T>) {
|
||||||
for (u32 i = 0; i < samples_to_decode; i++) {
|
for (u32 i = 0; i < samples_to_decode; i++) {
|
||||||
auto sample{static_cast<s32>(samples[i * channel_count + req.target_channel] *
|
auto sample{static_cast<s32>(samples[i * channel_count + req.target_channel] *
|
||||||
std::numeric_limits<s16>::max())};
|
(std::numeric_limits<s16>::max)())};
|
||||||
out_buffer[i] = static_cast<s16>(std::clamp(sample, min, max));
|
out_buffer[i] = static_cast<s16>(std::clamp(sample, min, max));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -125,7 +125,7 @@ static u32 DecodeAdpcm(Core::Memory::Memory& memory, std::span<s16> out_buffer,
|
||||||
}
|
}
|
||||||
|
|
||||||
auto start_pos{req.start_offset + req.offset};
|
auto start_pos{req.start_offset + req.offset};
|
||||||
auto samples_to_process{std::min(req.end_offset - start_pos, req.samples_to_read)};
|
auto samples_to_process{(std::min)(req.end_offset - start_pos, req.samples_to_read)};
|
||||||
if (samples_to_process == 0) {
|
if (samples_to_process == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -139,7 +139,7 @@ static u32 DecodeAdpcm(Core::Memory::Memory& memory, std::span<s16> out_buffer,
|
||||||
position_in_frame += 2;
|
position_in_frame += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto size{std::max((samples_to_process / 8U) * SamplesPerFrame, 8U)};
|
const auto size{(std::max)((samples_to_process / 8U) * SamplesPerFrame, 8U)};
|
||||||
Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::UnsafeRead> wavebuffer(
|
Core::Memory::CpuGuestMemory<u8, Core::Memory::GuestMemoryFlags::UnsafeRead> wavebuffer(
|
||||||
memory, req.buffer + position_in_frame / 2, size);
|
memory, req.buffer + position_in_frame / 2, size);
|
||||||
|
|
||||||
|
@ -260,7 +260,7 @@ void DecodeFromWaveBuffers(Core::Memory::Memory& memory, const DecodeFromWaveBuf
|
||||||
auto max_remaining_sample_count{
|
auto max_remaining_sample_count{
|
||||||
((Common::FixedPoint<17, 15>(TempBufferSize) - fraction) / sample_rate_ratio)
|
((Common::FixedPoint<17, 15>(TempBufferSize) - fraction) / sample_rate_ratio)
|
||||||
.to_uint_floor()};
|
.to_uint_floor()};
|
||||||
max_remaining_sample_count = std::min(max_remaining_sample_count, remaining_sample_count);
|
max_remaining_sample_count = (std::min)(max_remaining_sample_count, remaining_sample_count);
|
||||||
|
|
||||||
auto wavebuffers_consumed{voice_state.wave_buffers_consumed};
|
auto wavebuffers_consumed{voice_state.wave_buffers_consumed};
|
||||||
auto wavebuffer_index{voice_state.wave_buffer_index};
|
auto wavebuffer_index{voice_state.wave_buffer_index};
|
||||||
|
@ -273,7 +273,7 @@ void DecodeFromWaveBuffers(Core::Memory::Memory& memory, const DecodeFromWaveBuf
|
||||||
std::array<s16, TempBufferSize> temp_buffer{};
|
std::array<s16, TempBufferSize> temp_buffer{};
|
||||||
|
|
||||||
while (remaining_sample_count > 0) {
|
while (remaining_sample_count > 0) {
|
||||||
const auto samples_to_write{std::min(remaining_sample_count, max_remaining_sample_count)};
|
const auto samples_to_write{(std::min)(remaining_sample_count, max_remaining_sample_count)};
|
||||||
const auto samples_to_read{
|
const auto samples_to_read{
|
||||||
(fraction + samples_to_write * sample_rate_ratio).to_uint_floor()};
|
(fraction + samples_to_write * sample_rate_ratio).to_uint_floor()};
|
||||||
|
|
||||||
|
|
|
@ -86,7 +86,7 @@ static u32 WriteAuxBufferDsp(Core::Memory::Memory& memory, CpuAddr send_info_,
|
||||||
u32 write_count{write_count_};
|
u32 write_count{write_count_};
|
||||||
u32 read_pos{0};
|
u32 read_pos{0};
|
||||||
while (write_count > 0) {
|
while (write_count > 0) {
|
||||||
u32 to_write{std::min(count_max - target_write_offset, write_count)};
|
u32 to_write{(std::min)(count_max - target_write_offset, write_count)};
|
||||||
if (to_write > 0) {
|
if (to_write > 0) {
|
||||||
const auto write_addr = send_buffer + target_write_offset * sizeof(s32);
|
const auto write_addr = send_buffer + target_write_offset * sizeof(s32);
|
||||||
memory.WriteBlockUnsafe(write_addr, &input[read_pos], to_write * sizeof(s32));
|
memory.WriteBlockUnsafe(write_addr, &input[read_pos], to_write * sizeof(s32));
|
||||||
|
@ -157,7 +157,7 @@ static u32 ReadAuxBufferDsp(Core::Memory::Memory& memory, CpuAddr return_info_,
|
||||||
u32 read_count{read_count_};
|
u32 read_count{read_count_};
|
||||||
u32 write_pos{0};
|
u32 write_pos{0};
|
||||||
while (read_count > 0) {
|
while (read_count > 0) {
|
||||||
u32 to_read{std::min(count_max - target_read_offset, read_count)};
|
u32 to_read{(std::min)(count_max - target_read_offset, read_count)};
|
||||||
if (to_read > 0) {
|
if (to_read > 0) {
|
||||||
const auto read_addr = return_buffer + target_read_offset * sizeof(s32);
|
const auto read_addr = return_buffer + target_read_offset * sizeof(s32);
|
||||||
memory.ReadBlockUnsafe(read_addr, &output[write_pos], to_read * sizeof(s32));
|
memory.ReadBlockUnsafe(read_addr, &output[write_pos], to_read * sizeof(s32));
|
||||||
|
|
|
@ -20,8 +20,8 @@ namespace AudioCore::Renderer {
|
||||||
void ApplyBiquadFilterFloat(std::span<s32> output, std::span<const s32> input,
|
void ApplyBiquadFilterFloat(std::span<s32> output, std::span<const s32> input,
|
||||||
std::array<s16, 3>& b_, std::array<s16, 2>& a_,
|
std::array<s16, 3>& b_, std::array<s16, 2>& a_,
|
||||||
VoiceState::BiquadFilterState& state, const u32 sample_count) {
|
VoiceState::BiquadFilterState& state, const u32 sample_count) {
|
||||||
constexpr f64 min{std::numeric_limits<s32>::min()};
|
constexpr f64 min{(std::numeric_limits<s32>::min)()};
|
||||||
constexpr f64 max{std::numeric_limits<s32>::max()};
|
constexpr f64 max{(std::numeric_limits<s32>::max)()};
|
||||||
std::array<f64, 3> b{Common::FixedPoint<50, 14>::from_base(b_[0]).to_double(),
|
std::array<f64, 3> b{Common::FixedPoint<50, 14>::from_base(b_[0]).to_double(),
|
||||||
Common::FixedPoint<50, 14>::from_base(b_[1]).to_double(),
|
Common::FixedPoint<50, 14>::from_base(b_[1]).to_double(),
|
||||||
Common::FixedPoint<50, 14>::from_base(b_[2]).to_double()};
|
Common::FixedPoint<50, 14>::from_base(b_[2]).to_double()};
|
||||||
|
@ -61,8 +61,8 @@ void ApplyBiquadFilterFloat(std::span<s32> output, std::span<const s32> input,
|
||||||
static void ApplyBiquadFilterInt(std::span<s32> output, std::span<const s32> input,
|
static void ApplyBiquadFilterInt(std::span<s32> output, std::span<const s32> input,
|
||||||
std::array<s16, 3>& b, std::array<s16, 2>& a,
|
std::array<s16, 3>& b, std::array<s16, 2>& a,
|
||||||
VoiceState::BiquadFilterState& state, const u32 sample_count) {
|
VoiceState::BiquadFilterState& state, const u32 sample_count) {
|
||||||
constexpr s64 min{std::numeric_limits<s32>::min()};
|
constexpr s64 min{(std::numeric_limits<s32>::min)()};
|
||||||
constexpr s64 max{std::numeric_limits<s32>::max()};
|
constexpr s64 max{(std::numeric_limits<s32>::max)()};
|
||||||
|
|
||||||
for (u32 i = 0; i < sample_count; i++) {
|
for (u32 i = 0; i < sample_count; i++) {
|
||||||
const s64 in_sample{input[i]};
|
const s64 in_sample{input[i]};
|
||||||
|
|
|
@ -79,7 +79,7 @@ static u32 WriteAuxBufferDsp(Core::Memory::Memory& memory, const CpuAddr send_in
|
||||||
u32 write_count{write_count_};
|
u32 write_count{write_count_};
|
||||||
u32 write_pos{0};
|
u32 write_pos{0};
|
||||||
while (write_count > 0) {
|
while (write_count > 0) {
|
||||||
u32 to_write{std::min(count_max - target_write_offset, write_count)};
|
u32 to_write{(std::min)(count_max - target_write_offset, write_count)};
|
||||||
|
|
||||||
if (to_write > 0) {
|
if (to_write > 0) {
|
||||||
memory.WriteBlockUnsafe(send_buffer + target_write_offset * sizeof(s32),
|
memory.WriteBlockUnsafe(send_buffer + target_write_offset * sizeof(s32),
|
||||||
|
|
|
@ -76,9 +76,9 @@ static void UpdateI3dl2ReverbEffectParameter(const I3dl2ReverbInfo::ParameterVer
|
||||||
|
|
||||||
state.dry_gain = params.dry_gain;
|
state.dry_gain = params.dry_gain;
|
||||||
Common::FixedPoint<50, 14> early_gain{
|
Common::FixedPoint<50, 14> early_gain{
|
||||||
std::min(params.room_gain + params.reflection_gain, 5000.0f) / 2000.0f};
|
(std::min)(params.room_gain + params.reflection_gain, 5000.0f) / 2000.0f};
|
||||||
state.early_gain = pow_10(early_gain.to_float());
|
state.early_gain = pow_10(early_gain.to_float());
|
||||||
Common::FixedPoint<50, 14> late_gain{std::min(params.room_gain + params.reverb_gain, 5000.0f) /
|
Common::FixedPoint<50, 14> late_gain{(std::min)(params.room_gain + params.reverb_gain, 5000.0f) /
|
||||||
2000.0f};
|
2000.0f};
|
||||||
state.late_gain = pow_10(late_gain.to_float());
|
state.late_gain = pow_10(late_gain.to_float());
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ static void UpdateI3dl2ReverbEffectParameter(const I3dl2ReverbInfo::ParameterVer
|
||||||
const Common::FixedPoint<50, 14> c{
|
const Common::FixedPoint<50, 14> c{
|
||||||
std::sqrt(std::pow(b.to_float(), 2.0f) + (std::pow(a.to_float(), 2.0f) * -4.0f))};
|
std::sqrt(std::pow(b.to_float(), 2.0f) + (std::pow(a.to_float(), 2.0f) * -4.0f))};
|
||||||
|
|
||||||
state.lowpass_1 = std::min(((b - c) / (a * 2.0f)).to_float(), 0.99723f);
|
state.lowpass_1 = (std::min)(((b - c) / (a * 2.0f)).to_float(), 0.99723f);
|
||||||
state.lowpass_2 = 1.0f - state.lowpass_1;
|
state.lowpass_2 = 1.0f - state.lowpass_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,8 +50,8 @@ static void ApplyLightLimiterEffect(const LightLimiterInfo::ParameterVersion2& p
|
||||||
std::span<std::span<const s32>> inputs,
|
std::span<std::span<const s32>> inputs,
|
||||||
std::span<std::span<s32>> outputs, const u32 sample_count,
|
std::span<std::span<s32>> outputs, const u32 sample_count,
|
||||||
LightLimiterInfo::StatisticsInternal* statistics) {
|
LightLimiterInfo::StatisticsInternal* statistics) {
|
||||||
constexpr s64 min{std::numeric_limits<s32>::min()};
|
constexpr s64 min{(std::numeric_limits<s32>::min)()};
|
||||||
constexpr s64 max{std::numeric_limits<s32>::max()};
|
constexpr s64 max{(std::numeric_limits<s32>::max)()};
|
||||||
|
|
||||||
const auto recip_estimate = [](f64 a) -> f64 {
|
const auto recip_estimate = [](f64 a) -> f64 {
|
||||||
s32 q, s;
|
s32 q, s;
|
||||||
|
@ -117,9 +117,9 @@ static void ApplyLightLimiterEffect(const LightLimiterInfo::ParameterVersion2& p
|
||||||
|
|
||||||
if (statistics) {
|
if (statistics) {
|
||||||
statistics->channel_max_sample[channel] =
|
statistics->channel_max_sample[channel] =
|
||||||
std::max(statistics->channel_max_sample[channel], abs_sample.to_float());
|
(std::max)(statistics->channel_max_sample[channel], abs_sample.to_float());
|
||||||
statistics->channel_compression_gain_min[channel] =
|
statistics->channel_compression_gain_min[channel] =
|
||||||
std::min(statistics->channel_compression_gain_min[channel],
|
(std::min)(statistics->channel_compression_gain_min[channel],
|
||||||
state.compression_gain[channel].to_float());
|
state.compression_gain[channel].to_float());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,7 +94,7 @@ static void UpdateReverbEffectParameter(const ReverbInfo::ParameterVersion2& par
|
||||||
for (u32 i = 0; i < ReverbInfo::MaxDelayTaps; i++) {
|
for (u32 i = 0; i < ReverbInfo::MaxDelayTaps; i++) {
|
||||||
auto early_delay{
|
auto early_delay{
|
||||||
((pre_delay_time + EarlyDelayTimes[params.early_mode][i]) * sample_rate).to_int()};
|
((pre_delay_time + EarlyDelayTimes[params.early_mode][i]) * sample_rate).to_int()};
|
||||||
early_delay = std::min(early_delay, state.pre_delay_line.sample_count_max);
|
early_delay = (std::min)(early_delay, state.pre_delay_line.sample_count_max);
|
||||||
state.early_delay_times[i] = early_delay + 1;
|
state.early_delay_times[i] = early_delay + 1;
|
||||||
state.early_gains[i] = Common::FixedPoint<50, 14>::from_base(params.early_gain) *
|
state.early_gains[i] = Common::FixedPoint<50, 14>::from_base(params.early_gain) *
|
||||||
EarlyDelayGains[params.early_mode][i];
|
EarlyDelayGains[params.early_mode][i];
|
||||||
|
@ -107,7 +107,7 @@ static void UpdateReverbEffectParameter(const ReverbInfo::ParameterVersion2& par
|
||||||
|
|
||||||
auto pre_time{
|
auto pre_time{
|
||||||
((pre_delay_time + EarlyDelayTimes[params.early_mode][10]) * sample_rate).to_int()};
|
((pre_delay_time + EarlyDelayTimes[params.early_mode][10]) * sample_rate).to_int()};
|
||||||
state.pre_delay_time = std::min(pre_time, state.pre_delay_line.sample_count_max);
|
state.pre_delay_time = (std::min)(pre_time, state.pre_delay_line.sample_count_max);
|
||||||
|
|
||||||
if (!unk_initialized) {
|
if (!unk_initialized) {
|
||||||
unk_value = cos((1280.0f / sample_rate).to_float());
|
unk_value = cos((1280.0f / sample_rate).to_float());
|
||||||
|
@ -117,13 +117,13 @@ static void UpdateReverbEffectParameter(const ReverbInfo::ParameterVersion2& par
|
||||||
for (u32 i = 0; i < ReverbInfo::MaxDelayLines; i++) {
|
for (u32 i = 0; i < ReverbInfo::MaxDelayLines; i++) {
|
||||||
const auto fdn_delay{(FdnDelayTimes[params.late_mode][i] * sample_rate).to_int()};
|
const auto fdn_delay{(FdnDelayTimes[params.late_mode][i] * sample_rate).to_int()};
|
||||||
state.fdn_delay_lines[i].sample_count =
|
state.fdn_delay_lines[i].sample_count =
|
||||||
std::min(fdn_delay, state.fdn_delay_lines[i].sample_count_max);
|
(std::min)(fdn_delay, state.fdn_delay_lines[i].sample_count_max);
|
||||||
state.fdn_delay_lines[i].buffer_end =
|
state.fdn_delay_lines[i].buffer_end =
|
||||||
&state.fdn_delay_lines[i].buffer[state.fdn_delay_lines[i].sample_count - 1];
|
&state.fdn_delay_lines[i].buffer[state.fdn_delay_lines[i].sample_count - 1];
|
||||||
|
|
||||||
const auto decay_delay{(DecayDelayTimes[params.late_mode][i] * sample_rate).to_int()};
|
const auto decay_delay{(DecayDelayTimes[params.late_mode][i] * sample_rate).to_int()};
|
||||||
state.decay_delay_lines[i].sample_count =
|
state.decay_delay_lines[i].sample_count =
|
||||||
std::min(decay_delay, state.decay_delay_lines[i].sample_count_max);
|
(std::min)(decay_delay, state.decay_delay_lines[i].sample_count_max);
|
||||||
state.decay_delay_lines[i].buffer_end =
|
state.decay_delay_lines[i].buffer_end =
|
||||||
&state.decay_delay_lines[i].buffer[state.decay_delay_lines[i].sample_count - 1];
|
&state.decay_delay_lines[i].buffer[state.decay_delay_lines[i].sample_count - 1];
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ void DepopForMixBuffersCommand::Dump(
|
||||||
}
|
}
|
||||||
|
|
||||||
void DepopForMixBuffersCommand::Process(const AudioRenderer::CommandListProcessor& processor) {
|
void DepopForMixBuffersCommand::Process(const AudioRenderer::CommandListProcessor& processor) {
|
||||||
auto end_index{std::min(processor.buffer_count, input + count)};
|
auto end_index{(std::min)(processor.buffer_count, input + count)};
|
||||||
std::span<s32> depop_buff{reinterpret_cast<s32*>(depop_buffer), end_index};
|
std::span<s32> depop_buff{reinterpret_cast<s32*>(depop_buffer), end_index};
|
||||||
|
|
||||||
for (u32 index = input; index < end_index; index++) {
|
for (u32 index = input; index < end_index; index++) {
|
||||||
|
|
|
@ -215,7 +215,7 @@ auto UpsampleCommand::Dump([[maybe_unused]] const AudioRenderer::CommandListProc
|
||||||
|
|
||||||
void UpsampleCommand::Process(const AudioRenderer::CommandListProcessor& processor) {
|
void UpsampleCommand::Process(const AudioRenderer::CommandListProcessor& processor) {
|
||||||
const auto info{reinterpret_cast<UpsamplerInfo*>(upsampler_info)};
|
const auto info{reinterpret_cast<UpsamplerInfo*>(upsampler_info)};
|
||||||
const auto input_count{std::min(info->input_count, buffer_count)};
|
const auto input_count{(std::min)(info->input_count, buffer_count)};
|
||||||
const std::span<const s16> inputs_{reinterpret_cast<const s16*>(inputs), input_count};
|
const std::span<const s16> inputs_{reinterpret_cast<const s16*>(inputs), input_count};
|
||||||
|
|
||||||
for (u32 i = 0; i < input_count; i++) {
|
for (u32 i = 0; i < input_count; i++) {
|
||||||
|
|
|
@ -21,8 +21,8 @@ void CircularBufferSinkCommand::Dump(
|
||||||
}
|
}
|
||||||
|
|
||||||
void CircularBufferSinkCommand::Process(const AudioRenderer::CommandListProcessor& processor) {
|
void CircularBufferSinkCommand::Process(const AudioRenderer::CommandListProcessor& processor) {
|
||||||
constexpr s32 min{std::numeric_limits<s16>::min()};
|
constexpr s32 min{(std::numeric_limits<s16>::min)()};
|
||||||
constexpr s32 max{std::numeric_limits<s16>::max()};
|
constexpr s32 max{(std::numeric_limits<s16>::max)()};
|
||||||
|
|
||||||
std::array<s16, TargetSampleCount * MaxChannels> output{};
|
std::array<s16, TargetSampleCount * MaxChannels> output{};
|
||||||
for (u32 channel = 0; channel < input_count; channel++) {
|
for (u32 channel = 0; channel < input_count; channel++) {
|
||||||
|
|
|
@ -20,8 +20,8 @@ void DeviceSinkCommand::Dump([[maybe_unused]] const AudioRenderer::CommandListPr
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeviceSinkCommand::Process(const AudioRenderer::CommandListProcessor& processor) {
|
void DeviceSinkCommand::Process(const AudioRenderer::CommandListProcessor& processor) {
|
||||||
constexpr s32 min = std::numeric_limits<s16>::min();
|
constexpr s32 min = (std::numeric_limits<s16>::min)();
|
||||||
constexpr s32 max = std::numeric_limits<s16>::max();
|
constexpr s32 max = (std::numeric_limits<s16>::max)();
|
||||||
|
|
||||||
auto stream{processor.GetOutputSinkStream()};
|
auto stream{processor.GetOutputSinkStream()};
|
||||||
stream->SetSystemChannels(input_count);
|
stream->SetSystemChannels(input_count);
|
||||||
|
|
|
@ -126,7 +126,7 @@ bool MixContext::TSortInfo(const SplitterContext& splitter_context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto sorted_results{node_states.GetSortedResuls()};
|
auto sorted_results{node_states.GetSortedResuls()};
|
||||||
const auto result_size{std::min(count, static_cast<s32>(sorted_results.second))};
|
const auto result_size{(std::min)(count, static_cast<s32>(sorted_results.second))};
|
||||||
for (s32 i = 0; i < result_size; i++) {
|
for (s32 i = 0; i < result_size; i++) {
|
||||||
sorted_mix_infos[i] = &mix_infos[sorted_results.first[i]];
|
sorted_mix_infos[i] = &mix_infos[sorted_results.first[i]];
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,9 +168,9 @@ protected:
|
||||||
/// Node id for this sink
|
/// Node id for this sink
|
||||||
u32 node_id{};
|
u32 node_id{};
|
||||||
/// State buffer for this sink
|
/// State buffer for this sink
|
||||||
std::array<u8, std::max(sizeof(DeviceState), sizeof(CircularBufferState))> state{};
|
std::array<u8, (std::max)(sizeof(DeviceState), sizeof(CircularBufferState))> state{};
|
||||||
/// Parameter buffer for this sink
|
/// Parameter buffer for this sink
|
||||||
std::array<u8, std::max(sizeof(DeviceInParameter), sizeof(CircularBufferInParameter))>
|
std::array<u8, (std::max)(sizeof(DeviceInParameter), sizeof(CircularBufferInParameter))>
|
||||||
parameter{};
|
parameter{};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -170,7 +170,7 @@ void SplitterContext::RecomposeDestination(SplitterInfo& out_info,
|
||||||
|
|
||||||
auto dest_count{info_header->destination_count};
|
auto dest_count{info_header->destination_count};
|
||||||
if (!splitter_bug_fixed) {
|
if (!splitter_bug_fixed) {
|
||||||
dest_count = std::min(dest_count, GetDestCountPerInfoForCompat());
|
dest_count = (std::min)(dest_count, GetDestCountPerInfoForCompat());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dest_count == 0) {
|
if (dest_count == 0) {
|
||||||
|
|
|
@ -718,7 +718,7 @@ u64 System::GenerateCommand(std::span<u8> in_command_buffer,
|
||||||
|
|
||||||
const auto estimated_time{start_estimated_time - end_estimated_time};
|
const auto estimated_time{start_estimated_time - end_estimated_time};
|
||||||
|
|
||||||
const auto time_limit{static_cast<u32>(std::max(dsp_time_limit + estimated_time, 0.0f))};
|
const auto time_limit{static_cast<u32>((std::max)(dsp_time_limit + estimated_time, 0.0f))};
|
||||||
num_voices_dropped =
|
num_voices_dropped =
|
||||||
DropVoices(command_buffer, static_cast<u32>(start_estimated_time), time_limit);
|
DropVoices(command_buffer, static_cast<u32>(start_estimated_time), time_limit);
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ public:
|
||||||
minimum_latency = TargetSampleCount * 2;
|
minimum_latency = TargetSampleCount * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
minimum_latency = std::max(minimum_latency, TargetSampleCount * 2);
|
minimum_latency = (std::max)(minimum_latency, TargetSampleCount * 2);
|
||||||
|
|
||||||
LOG_INFO(Service_Audio,
|
LOG_INFO(Service_Audio,
|
||||||
"Opening cubeb stream {} type {} with: rate {} channels {} (system channels {}) "
|
"Opening cubeb stream {} type {} with: rate {} channels {} (system channels {}) "
|
||||||
|
@ -372,7 +372,7 @@ u32 GetCubebLatency() {
|
||||||
LOG_CRITICAL(Audio_Sink, "Error getting minimum latency, error: {}", latency_error);
|
LOG_CRITICAL(Audio_Sink, "Error getting minimum latency, error: {}", latency_error);
|
||||||
latency = TargetSampleCount * 2;
|
latency = TargetSampleCount * 2;
|
||||||
}
|
}
|
||||||
latency = std::max(latency, TargetSampleCount * 2);
|
latency = (std::max)(latency, TargetSampleCount * 2);
|
||||||
cubeb_destroy(ctx);
|
cubeb_destroy(ctx);
|
||||||
return latency;
|
return latency;
|
||||||
}
|
}
|
||||||
|
@ -426,7 +426,7 @@ bool IsCubebSuitable() {
|
||||||
LOG_ERROR(Audio_Sink, "Cubeb could not get min latency, it is not suitable.");
|
LOG_ERROR(Audio_Sink, "Cubeb could not get min latency, it is not suitable.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
latency = std::max(latency, TargetSampleCount * 2);
|
latency = (std::max)(latency, TargetSampleCount * 2);
|
||||||
|
|
||||||
// Test opening a device with standard parameters
|
// Test opening a device with standard parameters
|
||||||
cubeb_devid output_device{0};
|
cubeb_devid output_device{0};
|
||||||
|
|
|
@ -31,8 +31,8 @@ void SinkStream::AppendBuffer(SinkBuffer& buffer, std::span<s16> samples) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr s32 min{std::numeric_limits<s16>::min()};
|
constexpr s32 min{(std::numeric_limits<s16>::min)()};
|
||||||
constexpr s32 max{std::numeric_limits<s16>::max()};
|
constexpr s32 max{(std::numeric_limits<s16>::max)()};
|
||||||
|
|
||||||
auto yuzu_volume{Settings::Volume()};
|
auto yuzu_volume{Settings::Volume()};
|
||||||
if (yuzu_volume > 1.0f) {
|
if (yuzu_volume > 1.0f) {
|
||||||
|
@ -123,8 +123,8 @@ void SinkStream::AppendBuffer(SinkBuffer& buffer, std::span<s16> samples) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<s16> SinkStream::ReleaseBuffer(u64 num_samples) {
|
std::vector<s16> SinkStream::ReleaseBuffer(u64 num_samples) {
|
||||||
constexpr s32 min = std::numeric_limits<s16>::min();
|
constexpr s32 min = (std::numeric_limits<s16>::min)();
|
||||||
constexpr s32 max = std::numeric_limits<s16>::max();
|
constexpr s32 max = (std::numeric_limits<s16>::max)();
|
||||||
|
|
||||||
auto samples{samples_buffer.Pop(num_samples)};
|
auto samples{samples_buffer.Pop(num_samples)};
|
||||||
|
|
||||||
|
|
|
@ -162,10 +162,6 @@ add_library(
|
||||||
zstd_compression.h
|
zstd_compression.h
|
||||||
)
|
)
|
||||||
|
|
||||||
if(YUZU_ENABLE_PORTABLE)
|
|
||||||
add_compile_definitions(YUZU_ENABLE_PORTABLE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_sources(common PRIVATE windows/timer_resolution.cpp
|
target_sources(common PRIVATE windows/timer_resolution.cpp
|
||||||
windows/timer_resolution.h)
|
windows/timer_resolution.h)
|
||||||
|
@ -241,7 +237,7 @@ else()
|
||||||
)
|
)
|
||||||
|
|
||||||
# Get around GCC failing with intrinsics in Debug
|
# Get around GCC failing with intrinsics in Debug
|
||||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_BUILD_TYPE MATCHES "Debug")
|
if(CXX_GCC AND CMAKE_BUILD_TYPE MATCHES "Debug")
|
||||||
set_property(
|
set_property(
|
||||||
SOURCE stb.cpp
|
SOURCE stb.cpp
|
||||||
APPEND
|
APPEND
|
||||||
|
@ -249,7 +245,7 @@ else()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
if(CXX_CLANG)
|
||||||
target_compile_options(common PRIVATE -fsized-deallocation
|
target_compile_options(common PRIVATE -fsized-deallocation
|
||||||
-Werror=unreachable-code-aggressive)
|
-Werror=unreachable-code-aggressive)
|
||||||
target_compile_definitions(
|
target_compile_definitions(
|
||||||
|
|
|
@ -27,8 +27,8 @@ public:
|
||||||
|
|
||||||
// If we are, join with them, ensuring we stay in bounds.
|
// If we are, join with them, ensuring we stay in bounds.
|
||||||
if (it != m_free_regions.end()) {
|
if (it != m_free_regions.end()) {
|
||||||
start_address = std::min(start_address, it->lower());
|
start_address = (std::min)(start_address, it->lower());
|
||||||
end_address = std::max(end_address, it->upper());
|
end_address = (std::max)(end_address, it->upper());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Free the relevant region.
|
// Free the relevant region.
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
#define PORTABLE_DIR "user"
|
#define PORTABLE_DIR "user"
|
||||||
|
|
||||||
// Sub-directories contained within a yuzu data directory
|
// Sub-directories contained within a yuzu data directory
|
||||||
|
|
||||||
#define AMIIBO_DIR "amiibo"
|
#define AMIIBO_DIR "amiibo"
|
||||||
#define CACHE_DIR "cache"
|
#define CACHE_DIR "cache"
|
||||||
#define CONFIG_DIR "config"
|
#define CONFIG_DIR "config"
|
||||||
|
@ -28,11 +27,12 @@
|
||||||
#define SHADER_DIR "shader"
|
#define SHADER_DIR "shader"
|
||||||
#define TAS_DIR "tas"
|
#define TAS_DIR "tas"
|
||||||
#define ICONS_DIR "icons"
|
#define ICONS_DIR "icons"
|
||||||
|
|
||||||
|
// Compatibility with other emulators
|
||||||
#define CITRON_DIR "citron"
|
#define CITRON_DIR "citron"
|
||||||
#define SUDACHI_DIR "sudachi"
|
#define SUDACHI_DIR "sudachi"
|
||||||
#define YUZU_DIR "yuzu"
|
#define YUZU_DIR "yuzu"
|
||||||
#define SUYU_DIR "suyu"
|
#define SUYU_DIR "suyu"
|
||||||
|
|
||||||
// yuzu-specific files
|
// yuzu-specific files
|
||||||
|
|
||||||
#define LOG_FILE "eden_log.txt"
|
#define LOG_FILE "eden_log.txt"
|
||||||
|
|
|
@ -101,61 +101,53 @@ public:
|
||||||
legacy_paths.insert_or_assign(legacy_path, new_path);
|
legacy_paths.insert_or_assign(legacy_path, new_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// In non-android devices, the current directory will first search for "user"
|
||||||
|
/// if such directory (and it must be a directory) is found, that takes priority
|
||||||
|
/// over the global configuration directory (in other words, portable directories
|
||||||
|
/// take priority over the global ones, always)
|
||||||
|
/// On Android, the behaviour is to look for the current directory only.
|
||||||
void Reinitialize(fs::path eden_path = {}) {
|
void Reinitialize(fs::path eden_path = {}) {
|
||||||
fs::path eden_path_cache;
|
fs::path eden_path_cache;
|
||||||
fs::path eden_path_config;
|
fs::path eden_path_config;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#ifdef YUZU_ENABLE_PORTABLE
|
// User directory takes priority over global %AppData% directory
|
||||||
eden_path = GetExeDirectory() / PORTABLE_DIR;
|
eden_path = GetExeDirectory() / PORTABLE_DIR;
|
||||||
#endif
|
if (!Exists(eden_path) || !IsDir(eden_path)) {
|
||||||
if (!IsDir(eden_path)) {
|
|
||||||
eden_path = GetAppDataRoamingDirectory() / EDEN_DIR;
|
eden_path = GetAppDataRoamingDirectory() / EDEN_DIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
eden_path_cache = eden_path / CACHE_DIR;
|
eden_path_cache = eden_path / CACHE_DIR;
|
||||||
eden_path_config = eden_path / CONFIG_DIR;
|
eden_path_config = eden_path / CONFIG_DIR;
|
||||||
|
|
||||||
#define LEGACY_PATH(titleName, upperName) GenerateLegacyPath(LegacyPath::titleName##Dir, GetAppDataRoamingDirectory() / upperName##_DIR); \
|
#define LEGACY_PATH(titleName, upperName) GenerateLegacyPath(LegacyPath::titleName##Dir, GetAppDataRoamingDirectory() / upperName##_DIR); \
|
||||||
GenerateLegacyPath(LegacyPath::titleName##ConfigDir, GetAppDataRoamingDirectory() / upperName##_DIR / CONFIG_DIR); \
|
GenerateLegacyPath(LegacyPath::titleName##ConfigDir, GetAppDataRoamingDirectory() / upperName##_DIR / CONFIG_DIR); \
|
||||||
GenerateLegacyPath(LegacyPath::titleName##CacheDir, GetAppDataRoamingDirectory() / upperName##_DIR / CACHE_DIR);
|
GenerateLegacyPath(LegacyPath::titleName##CacheDir, GetAppDataRoamingDirectory() / upperName##_DIR / CACHE_DIR);
|
||||||
|
|
||||||
LEGACY_PATH(Citron, CITRON)
|
LEGACY_PATH(Citron, CITRON)
|
||||||
LEGACY_PATH(Sudachi, SUDACHI)
|
LEGACY_PATH(Sudachi, SUDACHI)
|
||||||
LEGACY_PATH(Yuzu, YUZU)
|
LEGACY_PATH(Yuzu, YUZU)
|
||||||
LEGACY_PATH(Suyu, SUYU)
|
LEGACY_PATH(Suyu, SUYU)
|
||||||
#undef LEGACY_PATH
|
#undef LEGACY_PATH
|
||||||
|
|
||||||
#elif ANDROID
|
#elif ANDROID
|
||||||
ASSERT(!eden_path.empty());
|
ASSERT(!eden_path.empty());
|
||||||
eden_path_cache = eden_path / CACHE_DIR;
|
eden_path_cache = eden_path / CACHE_DIR;
|
||||||
eden_path_config = eden_path / CONFIG_DIR;
|
eden_path_config = eden_path / CONFIG_DIR;
|
||||||
#else
|
#else
|
||||||
#ifdef YUZU_ENABLE_PORTABLE
|
|
||||||
eden_path = GetCurrentDir() / PORTABLE_DIR;
|
eden_path = GetCurrentDir() / PORTABLE_DIR;
|
||||||
#endif
|
if (!Exists(eden_path) || !IsDir(eden_path)) {
|
||||||
if (Exists(eden_path) && IsDir(eden_path)) {
|
|
||||||
eden_path_cache = eden_path / CACHE_DIR;
|
|
||||||
eden_path_config = eden_path / CONFIG_DIR;
|
|
||||||
} else {
|
|
||||||
eden_path = GetDataDirectory("XDG_DATA_HOME") / EDEN_DIR;
|
eden_path = GetDataDirectory("XDG_DATA_HOME") / EDEN_DIR;
|
||||||
eden_path_cache = GetDataDirectory("XDG_CACHE_HOME") / EDEN_DIR;
|
eden_path_cache = GetDataDirectory("XDG_CACHE_HOME") / EDEN_DIR;
|
||||||
eden_path_config = GetDataDirectory("XDG_CONFIG_HOME") / EDEN_DIR;
|
eden_path_config = GetDataDirectory("XDG_CONFIG_HOME") / EDEN_DIR;
|
||||||
|
} else {
|
||||||
|
eden_path_cache = eden_path / CACHE_DIR;
|
||||||
|
eden_path_config = eden_path / CONFIG_DIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define LEGACY_PATH(titleName, upperName) GenerateLegacyPath(LegacyPath::titleName##Dir, GetDataDirectory("XDG_DATA_HOME") / upperName##_DIR); \
|
#define LEGACY_PATH(titleName, upperName) GenerateLegacyPath(LegacyPath::titleName##Dir, GetDataDirectory("XDG_DATA_HOME") / upperName##_DIR); \
|
||||||
GenerateLegacyPath(LegacyPath::titleName##ConfigDir, GetDataDirectory("XDG_CONFIG_HOME") / upperName##_DIR); \
|
GenerateLegacyPath(LegacyPath::titleName##ConfigDir, GetDataDirectory("XDG_CONFIG_HOME") / upperName##_DIR); \
|
||||||
GenerateLegacyPath(LegacyPath::titleName##CacheDir, GetDataDirectory("XDG_CACHE_HOME") / upperName##_DIR);
|
GenerateLegacyPath(LegacyPath::titleName##CacheDir, GetDataDirectory("XDG_CACHE_HOME") / upperName##_DIR);
|
||||||
|
|
||||||
LEGACY_PATH(Citron, CITRON)
|
LEGACY_PATH(Citron, CITRON)
|
||||||
LEGACY_PATH(Sudachi, SUDACHI)
|
LEGACY_PATH(Sudachi, SUDACHI)
|
||||||
LEGACY_PATH(Yuzu, YUZU)
|
LEGACY_PATH(Yuzu, YUZU)
|
||||||
LEGACY_PATH(Suyu, SUYU)
|
LEGACY_PATH(Suyu, SUYU)
|
||||||
|
|
||||||
#undef LEGACY_PATH
|
#undef LEGACY_PATH
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GenerateEdenPath(EdenPath::EdenDir, eden_path);
|
GenerateEdenPath(EdenPath::EdenDir, eden_path);
|
||||||
GenerateEdenPath(EdenPath::AmiiboDir, eden_path / AMIIBO_DIR);
|
GenerateEdenPath(EdenPath::AmiiboDir, eden_path / AMIIBO_DIR);
|
||||||
GenerateEdenPath(EdenPath::CacheDir, eden_path_cache);
|
GenerateEdenPath(EdenPath::CacheDir, eden_path_cache);
|
||||||
|
@ -492,9 +484,9 @@ std::string GetParentPath(std::string_view path) {
|
||||||
std::size_t name_index;
|
std::size_t name_index;
|
||||||
|
|
||||||
if (name_bck_index == std::string_view::npos || name_fwd_index == std::string_view::npos) {
|
if (name_bck_index == std::string_view::npos || name_fwd_index == std::string_view::npos) {
|
||||||
name_index = std::min(name_bck_index, name_fwd_index);
|
name_index = (std::min)(name_bck_index, name_fwd_index);
|
||||||
} else {
|
} else {
|
||||||
name_index = std::max(name_bck_index, name_fwd_index);
|
name_index = (std::max)(name_bck_index, name_fwd_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::string(path.substr(0, name_index));
|
return std::string(path.substr(0, name_index));
|
||||||
|
@ -514,7 +506,7 @@ std::string_view GetPathWithoutTop(std::string_view path) {
|
||||||
|
|
||||||
const auto name_bck_index = path.find('\\');
|
const auto name_bck_index = path.find('\\');
|
||||||
const auto name_fwd_index = path.find('/');
|
const auto name_fwd_index = path.find('/');
|
||||||
return path.substr(std::min(name_bck_index, name_fwd_index) + 1);
|
return path.substr((std::min)(name_bck_index, name_fwd_index) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Common::FS
|
} // namespace Common::FS
|
||||||
|
|
|
@ -144,8 +144,7 @@ void HeapTracker::Protect(size_t virtual_offset, size_t size, MemoryPermission p
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clamp to end.
|
// Clamp to end.
|
||||||
next = std::min(next, end);
|
next = (std::min)(next, end);
|
||||||
|
|
||||||
// Reprotect, if we need to.
|
// Reprotect, if we need to.
|
||||||
if (should_protect) {
|
if (should_protect) {
|
||||||
m_buffer.Protect(cur, next - cur, perm);
|
m_buffer.Protect(cur, next - cur, perm);
|
||||||
|
@ -211,8 +210,8 @@ void HeapTracker::RebuildSeparateHeapAddressSpace() {
|
||||||
// Despite being worse in theory, this has proven to be better in practice than more
|
// Despite being worse in theory, this has proven to be better in practice than more
|
||||||
// regularly dumping a smaller amount, because it significantly reduces average case
|
// regularly dumping a smaller amount, because it significantly reduces average case
|
||||||
// lock contention.
|
// lock contention.
|
||||||
const size_t desired_count = std::min(m_resident_map_count, m_max_resident_map_count) / 2;
|
std::size_t const desired_count = (std::min)(m_resident_map_count, m_max_resident_map_count) / 2;
|
||||||
const size_t evict_count = m_resident_map_count - desired_count;
|
std::size_t const evict_count = m_resident_map_count - desired_count;
|
||||||
auto it = m_resident_mappings.begin();
|
auto it = m_resident_mappings.begin();
|
||||||
|
|
||||||
for (size_t i = 0; i < evict_count && it != m_resident_mappings.end(); i++) {
|
for (size_t i = 0; i < evict_count && it != m_resident_mappings.end(); i++) {
|
||||||
|
|
|
@ -199,8 +199,8 @@ public:
|
||||||
std::scoped_lock lock{placeholder_mutex};
|
std::scoped_lock lock{placeholder_mutex};
|
||||||
auto [it, end] = placeholders.equal_range({virtual_offset, virtual_end});
|
auto [it, end] = placeholders.equal_range({virtual_offset, virtual_end});
|
||||||
while (it != end) {
|
while (it != end) {
|
||||||
const size_t offset = std::max(it->lower(), virtual_offset);
|
const size_t offset = (std::max)(it->lower(), virtual_offset);
|
||||||
const size_t protect_length = std::min(it->upper(), virtual_end) - offset;
|
const size_t protect_length = (std::min)(it->upper(), virtual_end) - offset;
|
||||||
DWORD old_flags{};
|
DWORD old_flags{};
|
||||||
if (!VirtualProtect(virtual_base + offset, protect_length, new_flags, &old_flags)) {
|
if (!VirtualProtect(virtual_base + offset, protect_length, new_flags, &old_flags)) {
|
||||||
LOG_CRITICAL(HW_Memory, "Failed to change virtual memory protect rules");
|
LOG_CRITICAL(HW_Memory, "Failed to change virtual memory protect rules");
|
||||||
|
@ -266,8 +266,8 @@ private:
|
||||||
}
|
}
|
||||||
const size_t placeholder_begin = it->lower();
|
const size_t placeholder_begin = it->lower();
|
||||||
const size_t placeholder_end = it->upper();
|
const size_t placeholder_end = it->upper();
|
||||||
const size_t unmap_begin = std::max(virtual_offset, placeholder_begin);
|
const size_t unmap_begin = (std::max)(virtual_offset, placeholder_begin);
|
||||||
const size_t unmap_end = std::min(virtual_offset + length, placeholder_end);
|
const size_t unmap_end = (std::min)(virtual_offset + length, placeholder_end);
|
||||||
ASSERT(unmap_begin >= placeholder_begin && unmap_begin < placeholder_end);
|
ASSERT(unmap_begin >= placeholder_begin && unmap_begin < placeholder_end);
|
||||||
ASSERT(unmap_end <= placeholder_end && unmap_end > placeholder_begin);
|
ASSERT(unmap_end <= placeholder_end && unmap_end > placeholder_begin);
|
||||||
|
|
||||||
|
@ -655,8 +655,8 @@ private:
|
||||||
*virtual_offset = 0;
|
*virtual_offset = 0;
|
||||||
*length = 0;
|
*length = 0;
|
||||||
} else {
|
} else {
|
||||||
*virtual_offset = std::max(intended_start, address_space_start);
|
*virtual_offset = (std::max)(intended_start, address_space_start);
|
||||||
*length = std::min(intended_end, address_space_end) - *virtual_offset;
|
*length = (std::min)(intended_end, address_space_end) - *virtual_offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ constexpr const char* TrimSourcePath(std::string_view source) {
|
||||||
const auto rfind = [source](const std::string_view match) {
|
const auto rfind = [source](const std::string_view match) {
|
||||||
return source.rfind(match) == source.npos ? 0 : (source.rfind(match) + match.size());
|
return source.rfind(match) == source.npos ? 0 : (source.rfind(match) + match.size());
|
||||||
};
|
};
|
||||||
auto idx = std::max({rfind("src/"), rfind("src\\"), rfind("../"), rfind("..\\")});
|
auto idx = (std::max)({rfind("src/"), rfind("src\\"), rfind("../"), rfind("..\\")});
|
||||||
return source.data() + idx;
|
return source.data() + idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -85,10 +85,10 @@ struct Rectangle {
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] constexpr bool Intersect(const Rectangle<T>& with, Rectangle<T>* result) const {
|
[[nodiscard]] constexpr bool Intersect(const Rectangle<T>& with, Rectangle<T>* result) const {
|
||||||
result->left = std::max(left, with.left);
|
result->left = (std::max)(left, with.left);
|
||||||
result->top = std::max(top, with.top);
|
result->top = (std::max)(top, with.top);
|
||||||
result->right = std::min(right, with.right);
|
result->right = (std::min)(right, with.right);
|
||||||
result->bottom = std::min(bottom, with.bottom);
|
result->bottom = (std::min)(bottom, with.bottom);
|
||||||
return !result->IsEmpty();
|
return !result->IsEmpty();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -25,9 +25,9 @@ template <typename T>
|
||||||
inline bool CanAddWithoutOverflow(T lhs, T rhs) {
|
inline bool CanAddWithoutOverflow(T lhs, T rhs) {
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
if (lhs >= 0 && rhs >= 0) {
|
if (lhs >= 0 && rhs >= 0) {
|
||||||
return WrappingAdd(lhs, rhs) >= std::max(lhs, rhs);
|
return WrappingAdd(lhs, rhs) >= (std::max)(lhs, rhs);
|
||||||
} else if (lhs < 0 && rhs < 0) {
|
} else if (lhs < 0 && rhs < 0) {
|
||||||
return WrappingAdd(lhs, rhs) <= std::min(lhs, rhs);
|
return WrappingAdd(lhs, rhs) <= (std::min)(lhs, rhs);
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit RangeMap(ValueT null_value_) : null_value{null_value_} {
|
explicit RangeMap(ValueT null_value_) : null_value{null_value_} {
|
||||||
container.emplace(std::numeric_limits<KeyT>::min(), null_value);
|
container.emplace((std::numeric_limits<KeyT>::min)(), null_value);
|
||||||
};
|
};
|
||||||
~RangeMap() = default;
|
~RangeMap() = default;
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ private:
|
||||||
}
|
}
|
||||||
const auto it_end = std::next(it);
|
const auto it_end = std::next(it);
|
||||||
if (it_end == container.end()) {
|
if (it_end == container.end()) {
|
||||||
return std::numeric_limits<KeyT>::max() - address;
|
return (std::numeric_limits<KeyT>::max)() - address;
|
||||||
}
|
}
|
||||||
return it_end->first - address;
|
return it_end->first - address;
|
||||||
}
|
}
|
||||||
|
|
|
@ -274,7 +274,7 @@ void OverlapRangeSet<AddressType>::Subtract(AddressType base_address, size_t siz
|
||||||
|
|
||||||
template <typename AddressType>
|
template <typename AddressType>
|
||||||
void OverlapRangeSet<AddressType>::DeleteAll(AddressType base_address, size_t size) {
|
void OverlapRangeSet<AddressType>::DeleteAll(AddressType base_address, size_t size) {
|
||||||
m_impl->template Subtract<false>(base_address, size, std::numeric_limits<s32>::max(),
|
m_impl->template Subtract<false>(base_address, size, (std::numeric_limits<s32>::max)(),
|
||||||
[](AddressType, AddressType) {});
|
[](AddressType, AddressType) {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ class RingBuffer {
|
||||||
// T must be safely memcpy-able and have a trivial default constructor.
|
// T must be safely memcpy-able and have a trivial default constructor.
|
||||||
static_assert(std::is_trivial_v<T>);
|
static_assert(std::is_trivial_v<T>);
|
||||||
// Ensure capacity is sensible.
|
// Ensure capacity is sensible.
|
||||||
static_assert(capacity < std::numeric_limits<std::size_t>::max() / 2);
|
static_assert(capacity < (std::numeric_limits<std::size_t>::max)() / 2);
|
||||||
static_assert((capacity & (capacity - 1)) == 0, "capacity must be a power of two");
|
static_assert((capacity & (capacity - 1)) == 0, "capacity must be a power of two");
|
||||||
// Ensure lock-free.
|
// Ensure lock-free.
|
||||||
static_assert(std::atomic_size_t::is_always_lock_free);
|
static_assert(std::atomic_size_t::is_always_lock_free);
|
||||||
|
@ -43,9 +43,9 @@ public:
|
||||||
std::lock_guard lock(rb_mutex);
|
std::lock_guard lock(rb_mutex);
|
||||||
|
|
||||||
const std::size_t slots_free = capacity + read_index - write_index;
|
const std::size_t slots_free = capacity + read_index - write_index;
|
||||||
const std::size_t push_count = std::min(slot_count, slots_free);
|
const std::size_t push_count = (std::min)(slot_count, slots_free);
|
||||||
const std::size_t pos = write_index % capacity;
|
const std::size_t pos = write_index % capacity;
|
||||||
const std::size_t first_copy = std::min(capacity - pos, push_count);
|
const std::size_t first_copy = (std::min)(capacity - pos, push_count);
|
||||||
const std::size_t second_copy = push_count - first_copy;
|
const std::size_t second_copy = push_count - first_copy;
|
||||||
|
|
||||||
const char* in = static_cast<const char*>(new_slots);
|
const char* in = static_cast<const char*>(new_slots);
|
||||||
|
@ -69,9 +69,9 @@ public:
|
||||||
std::lock_guard lock(rb_mutex);
|
std::lock_guard lock(rb_mutex);
|
||||||
|
|
||||||
const std::size_t slots_filled = write_index - read_index;
|
const std::size_t slots_filled = write_index - read_index;
|
||||||
const std::size_t pop_count = std::min(slots_filled, max_slots);
|
const std::size_t pop_count = (std::min)(slots_filled, max_slots);
|
||||||
const std::size_t pos = read_index % capacity;
|
const std::size_t pos = read_index % capacity;
|
||||||
const std::size_t first_copy = std::min(capacity - pos, pop_count);
|
const std::size_t first_copy = (std::min)(capacity - pos, pop_count);
|
||||||
const std::size_t second_copy = pop_count - first_copy;
|
const std::size_t second_copy = pop_count - first_copy;
|
||||||
|
|
||||||
char* out = static_cast<char*>(output);
|
char* out = static_cast<char*>(output);
|
||||||
|
@ -84,7 +84,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<T> Pop(std::size_t max_slots = ~std::size_t(0)) {
|
std::vector<T> Pop(std::size_t max_slots = ~std::size_t(0)) {
|
||||||
std::vector<T> out(std::min(max_slots, capacity));
|
std::vector<T> out((std::min)(max_slots, capacity));
|
||||||
const std::size_t count = Pop(out.data(), out.size());
|
const std::size_t count = Pop(out.data(), out.size());
|
||||||
out.resize(count);
|
out.resize(count);
|
||||||
return out;
|
return out;
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
|
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2014 Citra Emulator Project
|
// SPDX-FileCopyrightText: 2014 Citra Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include "common/scm_rev.h"
|
#include "common/scm_rev.h"
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <string>
|
|
||||||
#include <fmt/ranges.h>
|
|
||||||
|
|
||||||
#define GIT_REV "@GIT_REV@"
|
#define GIT_REV "@GIT_REV@"
|
||||||
#define GIT_BRANCH "@GIT_BRANCH@"
|
#define GIT_BRANCH "@GIT_BRANCH@"
|
||||||
#define GIT_DESC "@GIT_DESC@"
|
#define GIT_DESC "@GIT_DESC@"
|
||||||
|
@ -18,64 +17,21 @@
|
||||||
#define TITLE_BAR_FORMAT_IDLE "@TITLE_BAR_FORMAT_IDLE@"
|
#define TITLE_BAR_FORMAT_IDLE "@TITLE_BAR_FORMAT_IDLE@"
|
||||||
#define TITLE_BAR_FORMAT_RUNNING "@TITLE_BAR_FORMAT_RUNNING@"
|
#define TITLE_BAR_FORMAT_RUNNING "@TITLE_BAR_FORMAT_RUNNING@"
|
||||||
#define IS_DEV_BUILD @IS_DEV_BUILD@
|
#define IS_DEV_BUILD @IS_DEV_BUILD@
|
||||||
|
#define COMPILER_ID "@CXX_COMPILER@"
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
const char* g_scm_rev;
|
constexpr const char g_scm_rev[] = GIT_REV;
|
||||||
const char* g_scm_branch;
|
constexpr const char g_scm_branch[] = GIT_BRANCH;
|
||||||
const char* g_scm_desc;
|
constexpr const char g_scm_desc[] = GIT_DESC;
|
||||||
const char g_build_name[] = BUILD_NAME;
|
constexpr const char g_build_name[] = BUILD_NAME;
|
||||||
const char g_build_date[] = BUILD_DATE;
|
constexpr const char g_build_date[] = BUILD_DATE;
|
||||||
const char g_build_fullname[] = BUILD_FULLNAME;
|
constexpr const char g_build_fullname[] = BUILD_FULLNAME;
|
||||||
const char g_build_version[] = BUILD_VERSION;
|
constexpr const char g_build_version[] = BUILD_VERSION;
|
||||||
const char g_build_id[] = BUILD_ID;
|
constexpr const char g_build_id[] = BUILD_ID;
|
||||||
const char g_title_bar_format_idle[] = TITLE_BAR_FORMAT_IDLE;
|
constexpr const char g_title_bar_format_idle[] = TITLE_BAR_FORMAT_IDLE;
|
||||||
const char g_title_bar_format_running[] = TITLE_BAR_FORMAT_RUNNING;
|
constexpr const char g_title_bar_format_running[] = TITLE_BAR_FORMAT_RUNNING;
|
||||||
const bool g_is_dev_build = IS_DEV_BUILD;
|
constexpr const bool g_is_dev_build = IS_DEV_BUILD;
|
||||||
|
constexpr const char g_compiler_id[] = COMPILER_ID;
|
||||||
|
|
||||||
/// Anonymizes SCM data
|
|
||||||
/// This is quite weak. But better than nothing.
|
|
||||||
class scm_encrypt {
|
|
||||||
std::string m_scm_rev, m_scm_branch, m_scm_desc;
|
|
||||||
|
|
||||||
public:
|
|
||||||
scm_encrypt() {
|
|
||||||
// Get a key that is easy to obtain when asking the person directly but (usually) hard to
|
|
||||||
// guess
|
|
||||||
std::string key;
|
|
||||||
#ifdef __linux__
|
|
||||||
if (!std::getline(std::ifstream("/proc/sys/kernel/hostname"), key))
|
|
||||||
key = "linux_error_key";
|
|
||||||
#else
|
|
||||||
// Not a good fallback, but better than nothing I guess?
|
|
||||||
key = g_build_date;
|
|
||||||
#endif
|
|
||||||
// Copy strings in place
|
|
||||||
m_scm_rev = GIT_REV;
|
|
||||||
m_scm_branch = GIT_BRANCH;
|
|
||||||
m_scm_desc = GIT_DESC;
|
|
||||||
// XOR each string with key
|
|
||||||
auto key_it = key.begin();
|
|
||||||
for (auto& string : {&m_scm_rev, &m_scm_branch, &m_scm_desc}) {
|
|
||||||
for (auto& c : *string) {
|
|
||||||
c ^= *key_it;
|
|
||||||
if (++key_it == key.end())
|
|
||||||
key_it = key.begin();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Make each string human-readable
|
|
||||||
for (auto& string : {&m_scm_rev, &m_scm_branch, &m_scm_desc}) {
|
|
||||||
const std::string original = *string;
|
|
||||||
string->clear();
|
|
||||||
for (const auto c : original) {
|
|
||||||
string->append(fmt::format("{:x}", unsigned(c)));
|
|
||||||
}
|
|
||||||
string->pop_back();
|
|
||||||
}
|
|
||||||
// Set pointers
|
|
||||||
g_scm_rev = m_scm_rev.c_str();
|
|
||||||
g_scm_branch = m_scm_branch.c_str();
|
|
||||||
g_scm_desc = m_scm_desc.c_str();
|
|
||||||
}
|
|
||||||
} scm_encrypt_instance;
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2014 Citra Emulator Project
|
// SPDX-FileCopyrightText: 2014 Citra Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -5,9 +8,9 @@
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
extern const char* g_scm_rev;
|
extern const char g_scm_rev[];
|
||||||
extern const char* g_scm_branch;
|
extern const char g_scm_branch[];
|
||||||
extern const char* g_scm_desc;
|
extern const char g_scm_desc[];
|
||||||
extern const char g_build_name[];
|
extern const char g_build_name[];
|
||||||
extern const char g_build_date[];
|
extern const char g_build_date[];
|
||||||
extern const char g_build_fullname[];
|
extern const char g_build_fullname[];
|
||||||
|
@ -17,5 +20,6 @@ extern const char g_title_bar_format_idle[];
|
||||||
extern const char g_title_bar_format_running[];
|
extern const char g_title_bar_format_running[];
|
||||||
extern const char g_shader_cache_version[];
|
extern const char g_shader_cache_version[];
|
||||||
extern const bool g_is_dev_build;
|
extern const bool g_is_dev_build;
|
||||||
|
extern const char g_compiler_id[];
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|
|
@ -37,14 +37,14 @@ struct ResolutionScalingInfo {
|
||||||
if (value == 0) {
|
if (value == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return std::max((value * static_cast<s32>(up_scale)) >> static_cast<s32>(down_shift), 1);
|
return (std::max)((value * static_cast<s32>(up_scale)) >> static_cast<s32>(down_shift), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 ScaleUp(u32 value) const {
|
u32 ScaleUp(u32 value) const {
|
||||||
if (value == 0U) {
|
if (value == 0U) {
|
||||||
return 0U;
|
return 0U;
|
||||||
}
|
}
|
||||||
return std::max((value * up_scale) >> down_shift, 1U);
|
return (std::max)((value * up_scale) >> down_shift, 1U);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -612,8 +612,8 @@ struct Values {
|
||||||
false, true, &custom_rtc_enabled};
|
false, true, &custom_rtc_enabled};
|
||||||
SwitchableSetting<s64, true> custom_rtc_offset{linkage,
|
SwitchableSetting<s64, true> custom_rtc_offset{linkage,
|
||||||
0,
|
0,
|
||||||
std::numeric_limits<int>::min(),
|
(std::numeric_limits<int>::min)(),
|
||||||
std::numeric_limits<int>::max(),
|
(std::numeric_limits<int>::max)(),
|
||||||
"custom_rtc_offset",
|
"custom_rtc_offset",
|
||||||
Category::System,
|
Category::System,
|
||||||
Specialization::Countable,
|
Specialization::Countable,
|
||||||
|
|
|
@ -223,7 +223,7 @@ public:
|
||||||
if constexpr (std::is_enum_v<Type>) {
|
if constexpr (std::is_enum_v<Type>) {
|
||||||
return EnumMetadata<Type>::Index();
|
return EnumMetadata<Type>::Index();
|
||||||
} else {
|
} else {
|
||||||
return std::numeric_limits<u32>::max();
|
return (std::numeric_limits<u32>::max)();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,14 +237,14 @@ public:
|
||||||
|
|
||||||
[[nodiscard]] std::string MinVal() const override final {
|
[[nodiscard]] std::string MinVal() const override final {
|
||||||
if constexpr (std::is_arithmetic_v<Type> && !ranged) {
|
if constexpr (std::is_arithmetic_v<Type> && !ranged) {
|
||||||
return this->ToString(std::numeric_limits<Type>::min());
|
return this->ToString((std::numeric_limits<Type>::min)());
|
||||||
} else {
|
} else {
|
||||||
return this->ToString(minimum);
|
return this->ToString(minimum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[[nodiscard]] std::string MaxVal() const override final {
|
[[nodiscard]] std::string MaxVal() const override final {
|
||||||
if constexpr (std::is_arithmetic_v<Type> && !ranged) {
|
if constexpr (std::is_arithmetic_v<Type> && !ranged) {
|
||||||
return this->ToString(std::numeric_limits<Type>::max());
|
return this->ToString((std::numeric_limits<Type>::max)());
|
||||||
} else {
|
} else {
|
||||||
return this->ToString(maximum);
|
return this->ToString(maximum);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
struct SlotId {
|
struct SlotId {
|
||||||
static constexpr u32 INVALID_INDEX = std::numeric_limits<u32>::max();
|
static constexpr u32 INVALID_INDEX = (std::numeric_limits<u32>::max)();
|
||||||
|
|
||||||
constexpr auto operator<=>(const SlotId&) const noexcept = default;
|
constexpr auto operator<=>(const SlotId&) const noexcept = default;
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,7 @@ void SetCurrentThreadPriority(ThreadPriority new_priority) {
|
||||||
const auto scheduling_type = SCHED_OTHER;
|
const auto scheduling_type = SCHED_OTHER;
|
||||||
s32 max_prio = sched_get_priority_max(scheduling_type);
|
s32 max_prio = sched_get_priority_max(scheduling_type);
|
||||||
s32 min_prio = sched_get_priority_min(scheduling_type);
|
s32 min_prio = sched_get_priority_min(scheduling_type);
|
||||||
u32 level = std::max(static_cast<u32>(new_priority) + 1, 4U);
|
u32 level = (std::max)(static_cast<u32>(new_priority) + 1, 4U);
|
||||||
|
|
||||||
struct sched_param params;
|
struct sched_param params;
|
||||||
if (max_prio > min_prio) {
|
if (max_prio > min_prio) {
|
||||||
|
@ -101,7 +101,7 @@ void SetCurrentThreadName(const char* name) {
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
// Linux limits thread names to 15 characters and will outright reject any
|
// Linux limits thread names to 15 characters and will outright reject any
|
||||||
// attempt to set a longer name with ERANGE.
|
// attempt to set a longer name with ERANGE.
|
||||||
std::string truncated(name, std::min(strlen(name), static_cast<size_t>(15)));
|
std::string truncated(name, (std::min)(strlen(name), static_cast<size_t>(15)));
|
||||||
if (int e = pthread_setname_np(pthread_self(), truncated.c_str())) {
|
if (int e = pthread_setname_np(pthread_self(), truncated.c_str())) {
|
||||||
errno = e;
|
errno = e;
|
||||||
LOG_ERROR(Common, "Failed to set thread name to '{}': {}", truncated, GetLastErrorMsg());
|
LOG_ERROR(Common, "Failed to set thread name to '{}': {}", truncated, GetLastErrorMsg());
|
||||||
|
|
|
@ -124,7 +124,7 @@ public:
|
||||||
this->state.data[3] = ParamTmat;
|
this->state.data[3] = ParamTmat;
|
||||||
|
|
||||||
{
|
{
|
||||||
const int num_init_iterations = std::max(seed_count + 1, MinimumInitIterations) - 1;
|
const int num_init_iterations = (std::max)(seed_count + 1, MinimumInitIterations) - 1;
|
||||||
|
|
||||||
GenerateInitialValuePlus(&this->state, 0, seed_count);
|
GenerateInitialValuePlus(&this->state, 0, seed_count);
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace Common {
|
||||||
|
|
||||||
// This function multiplies 2 u64 values and divides it by a u64 value.
|
// This function multiplies 2 u64 values and divides it by a u64 value.
|
||||||
[[nodiscard]] static inline u64 MultiplyAndDivide64(u64 a, u64 b, u64 d) {
|
[[nodiscard]] static inline u64 MultiplyAndDivide64(u64 a, u64 b, u64 d) {
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
u128 r{};
|
u128 r{};
|
||||||
r[0] = _umul128(a, b, &r[1]);
|
r[0] = _umul128(a, b, &r[1]);
|
||||||
u64 remainder;
|
u64 remainder;
|
||||||
|
@ -41,7 +41,7 @@ namespace Common {
|
||||||
// This function multiplies 2 u64 values and produces a u128 value;
|
// This function multiplies 2 u64 values and produces a u128 value;
|
||||||
[[nodiscard]] static inline u128 Multiply64Into128(u64 a, u64 b) {
|
[[nodiscard]] static inline u128 Multiply64Into128(u64 a, u64 b) {
|
||||||
u128 result;
|
u128 result;
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
result[0] = _umul128(a, b, &result[1]);
|
result[0] = _umul128(a, b, &result[1]);
|
||||||
#else
|
#else
|
||||||
unsigned __int128 tmp = a;
|
unsigned __int128 tmp = a;
|
||||||
|
@ -65,7 +65,7 @@ namespace Common {
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
// This one is bit more inaccurate.
|
// This one is bit more inaccurate.
|
||||||
return MultiplyAndDivide64(std::numeric_limits<u64>::max(), numerator, divisor);
|
return MultiplyAndDivide64((std::numeric_limits<u64>::max)(), numerator, divisor);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ constexpr auto PauseCycles = 100'000U;
|
||||||
|
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && !defined(__clang__)
|
||||||
__forceinline static void TPAUSE() {
|
__forceinline static void TPAUSE() {
|
||||||
static constexpr auto RequestC02State = 0U;
|
static constexpr auto RequestC02State = 0U;
|
||||||
_tpause(RequestC02State, FencedRDTSC() + PauseCycles);
|
_tpause(RequestC02State, FencedRDTSC() + PauseCycles);
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
# SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -1155,7 +1158,7 @@ add_library(core STATIC
|
||||||
|
|
||||||
if (ENABLE_WIFI_SCAN)
|
if (ENABLE_WIFI_SCAN)
|
||||||
# find_package(libiw REQUIRED)
|
# find_package(libiw REQUIRED)
|
||||||
target_compile_definitions(core PRIVATE -DENABLE_WIFI_SCAN)
|
target_compile_definitions(core PRIVATE ENABLE_WIFI_SCAN)
|
||||||
target_link_libraries(core PRIVATE iw)
|
target_link_libraries(core PRIVATE iw)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -1184,6 +1187,7 @@ else()
|
||||||
-Wno-cast-function-type
|
-Wno-cast-function-type
|
||||||
|
|
||||||
$<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation>
|
$<$<CXX_COMPILER_ID:Clang>:-fsized-deallocation>
|
||||||
|
$<$<CXX_COMPILER_ID:Clang>:-Wno-cast-function-type-mismatch>
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -1196,13 +1200,13 @@ else()
|
||||||
target_link_libraries(core PUBLIC Boost::headers)
|
target_link_libraries(core PUBLIC Boost::headers)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries(core PRIVATE fmt::fmt nlohmann_json::nlohmann_json mbedtls RenderDoc::API)
|
target_link_libraries(core PRIVATE fmt::fmt nlohmann_json::nlohmann_json RenderDoc::API mbedtls mbedcrypto)
|
||||||
if (MINGW)
|
if (MINGW)
|
||||||
target_link_libraries(core PRIVATE ${MSWSOCK_LIBRARY})
|
target_link_libraries(core PRIVATE ${MSWSOCK_LIBRARY})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ENABLE_WEB_SERVICE)
|
if (ENABLE_WEB_SERVICE)
|
||||||
target_compile_definitions(core PUBLIC -DENABLE_WEB_SERVICE)
|
target_compile_definitions(core PUBLIC ENABLE_WEB_SERVICE)
|
||||||
target_link_libraries(core PUBLIC web_service)
|
target_link_libraries(core PUBLIC web_service)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
@ -283,9 +283,9 @@ Loader::AppLoader::Modules FindModules(Kernel::KProcess* process) {
|
||||||
// Ignore leading directories.
|
// Ignore leading directories.
|
||||||
char* path_pointer = module_path.path.data();
|
char* path_pointer = module_path.path.data();
|
||||||
char* path_end =
|
char* path_end =
|
||||||
path_pointer + std::min(PathLengthMax, module_path.path_length);
|
path_pointer + (std::min)(PathLengthMax, module_path.path_length);
|
||||||
|
|
||||||
for (s32 i = 0; i < std::min(PathLengthMax, module_path.path_length) &&
|
for (s32 i = 0; i < (std::min)(PathLengthMax, module_path.path_length) &&
|
||||||
module_path.path[i] != '\0';
|
module_path.path[i] != '\0';
|
||||||
i++) {
|
i++) {
|
||||||
if (module_path.path[i] == '/' || module_path.path[i] == '\\') {
|
if (module_path.path[i] == '/' || module_path.path[i] == '\\') {
|
||||||
|
|
|
@ -58,6 +58,8 @@ CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1
|
||||||
_mm_lfence();
|
_mm_lfence();
|
||||||
#elif defined(ARCHITECTURE_x86_64)
|
#elif defined(ARCHITECTURE_x86_64)
|
||||||
asm volatile("mfence\n\tlfence\n\t" : : : "memory");
|
asm volatile("mfence\n\tlfence\n\t" : : : "memory");
|
||||||
|
#elif defined(_MSC_VER) && defined(ARCHITECTURE_arm64)
|
||||||
|
_Memory_barrier();
|
||||||
#elif defined(ARCHITECTURE_arm64)
|
#elif defined(ARCHITECTURE_arm64)
|
||||||
asm volatile("dsb sy\n\t" : : : "memory");
|
asm volatile("dsb sy\n\t" : : : "memory");
|
||||||
#else
|
#else
|
||||||
|
@ -75,6 +77,8 @@ CallbackOrAccessOneWord DynarmicCP15::CompileSendOneWord(bool two, unsigned opc1
|
||||||
_mm_mfence();
|
_mm_mfence();
|
||||||
#elif defined(ARCHITECTURE_x86_64)
|
#elif defined(ARCHITECTURE_x86_64)
|
||||||
asm volatile("mfence\n\t" : : : "memory");
|
asm volatile("mfence\n\t" : : : "memory");
|
||||||
|
#elif defined(_MSC_VER) && defined(ARCHITECTURE_arm64)
|
||||||
|
_Memory_barrier();
|
||||||
#elif defined(ARCHITECTURE_arm64)
|
#elif defined(ARCHITECTURE_arm64)
|
||||||
asm volatile("dmb sy\n\t" : : : "memory");
|
asm volatile("dmb sy\n\t" : : : "memory");
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -4,9 +4,14 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <span>
|
||||||
|
|
||||||
|
#include "core/hle/kernel/k_thread.h"
|
||||||
|
#include "core/memory.h"
|
||||||
|
#include "common/logging/log.h"
|
||||||
#include "core/arm/nce/visitor_base.h"
|
#include "core/arm/nce/visitor_base.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/core_timing.h"
|
#include "core/core_timing.h"
|
||||||
#include "core/hle/kernel/svc.h"
|
#include "core/hle/kernel/svc.h"
|
||||||
|
#include "core/memory.h"
|
||||||
|
#include "core/hle/kernel/k_thread.h"
|
||||||
|
|
||||||
namespace Core::NCE {
|
namespace Core::NCE {
|
||||||
|
|
||||||
|
|
|
@ -185,7 +185,7 @@ struct System::Impl {
|
||||||
|
|
||||||
Service::PSC::Time::LocationName name{};
|
Service::PSC::Time::LocationName name{};
|
||||||
auto new_name = Settings::GetTimeZoneString(Settings::values.time_zone_index.GetValue());
|
auto new_name = Settings::GetTimeZoneString(Settings::values.time_zone_index.GetValue());
|
||||||
std::memcpy(name.data(), new_name.data(), std::min(name.size(), new_name.size()));
|
std::memcpy(name.data(), new_name.data(), (std::min)(name.size(), new_name.size()));
|
||||||
|
|
||||||
timezone_service->SetDeviceLocationName(name);
|
timezone_service->SetDeviceLocationName(name);
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -31,6 +34,10 @@
|
||||||
#include "core/hle/service/filesystem/filesystem.h"
|
#include "core/hle/service/filesystem/filesystem.h"
|
||||||
#include "core/loader/loader.h"
|
#include "core/loader/loader.h"
|
||||||
|
|
||||||
|
#ifndef MBEDTLS_CMAC_C
|
||||||
|
#error mbedtls was compiled without CMAC support. Check your USE flags (Gentoo) or contact your package maintainer.
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Core::Crypto {
|
namespace Core::Crypto {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
|
|
@ -34,8 +34,8 @@ std::size_t XTSEncryptionLayer::Read(u8* data, std::size_t length, std::size_t o
|
||||||
buffer.resize(XTS_SECTOR_SIZE);
|
buffer.resize(XTS_SECTOR_SIZE);
|
||||||
cipher.XTSTranscode(buffer.data(), buffer.size(), buffer.data(), offset / XTS_SECTOR_SIZE,
|
cipher.XTSTranscode(buffer.data(), buffer.size(), buffer.data(), offset / XTS_SECTOR_SIZE,
|
||||||
XTS_SECTOR_SIZE, Op::Decrypt);
|
XTS_SECTOR_SIZE, Op::Decrypt);
|
||||||
std::memcpy(data, buffer.data(), std::min(buffer.size(), length));
|
std::memcpy(data, buffer.data(), (std::min)(buffer.size(), length));
|
||||||
return std::min(buffer.size(), length);
|
return (std::min)(buffer.size(), length);
|
||||||
}
|
}
|
||||||
|
|
||||||
// offset does not fall on block boundary (0x4000)
|
// offset does not fall on block boundary (0x4000)
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include <boost/version.hpp>
|
#include <boost/version.hpp>
|
||||||
|
|
||||||
#if BOOST_VERSION > 108300 && (!defined(_WINDOWS) && !defined(ANDROID)) || defined(YUZU_BOOST_v1)
|
#if BOOST_VERSION > 108400 && (!defined(_WINDOWS) && !defined(ANDROID)) || defined(YUZU_BOOST_v1)
|
||||||
#define USE_BOOST_v1
|
#define USE_BOOST_v1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -664,7 +664,7 @@ void GDBStub::HandleRcmd(const std::vector<u8>& command) {
|
||||||
|
|
||||||
if (svc_mem_info.state != Kernel::Svc::MemoryState::Inaccessible ||
|
if (svc_mem_info.state != Kernel::Svc::MemoryState::Inaccessible ||
|
||||||
svc_mem_info.base_address + svc_mem_info.size - 1 !=
|
svc_mem_info.base_address + svc_mem_info.size - 1 !=
|
||||||
std::numeric_limits<u64>::max()) {
|
(std::numeric_limits<u64>::max)()) {
|
||||||
const char* state = GetMemoryStateName(svc_mem_info.state);
|
const char* state = GetMemoryStateName(svc_mem_info.state);
|
||||||
const char* perm = GetMemoryPermissionString(svc_mem_info);
|
const char* perm = GetMemoryPermissionString(svc_mem_info);
|
||||||
const char l = True(svc_mem_info.attribute & MemoryAttribute::Locked) ? 'L' : '-';
|
const char l = True(svc_mem_info.attribute & MemoryAttribute::Locked) ? 'L' : '-';
|
||||||
|
@ -710,7 +710,7 @@ std::vector<char>::const_iterator GDBStub::CommandEnd() const {
|
||||||
const auto end{std::find(current_command.begin(), current_command.end(), GDB_STUB_END)};
|
const auto end{std::find(current_command.begin(), current_command.end(), GDB_STUB_END)};
|
||||||
|
|
||||||
// Require the checksum to be present
|
// Require the checksum to be present
|
||||||
return std::min(end + 2, current_command.end());
|
return (std::min)(end + 2, current_command.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<std::string> GDBStub::DetachCommand() {
|
std::optional<std::string> GDBStub::DetachCommand() {
|
||||||
|
|
|
@ -12,7 +12,7 @@ static T HexToValue(std::string_view hex) {
|
||||||
static_assert(std::is_trivially_copyable_v<T>);
|
static_assert(std::is_trivially_copyable_v<T>);
|
||||||
T value{};
|
T value{};
|
||||||
const auto mem{Common::HexStringToVector(hex, false)};
|
const auto mem{Common::HexStringToVector(hex, false)};
|
||||||
std::memcpy(&value, mem.data(), std::min(mem.size(), sizeof(T)));
|
std::memcpy(&value, mem.data(), (std::min)(mem.size(), sizeof(T)));
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -388,7 +388,7 @@ void DeviceMemoryManager<Traits>::WalkBlock(DAddr addr, std::size_t size, auto o
|
||||||
while (remaining_size) {
|
while (remaining_size) {
|
||||||
const size_t next_pages = static_cast<std::size_t>(continuity_tracker[page_index]);
|
const size_t next_pages = static_cast<std::size_t>(continuity_tracker[page_index]);
|
||||||
const std::size_t copy_amount =
|
const std::size_t copy_amount =
|
||||||
std::min((next_pages << Memory::YUZU_PAGEBITS) - page_offset, remaining_size);
|
(std::min)((next_pages << Memory::YUZU_PAGEBITS) - page_offset, remaining_size);
|
||||||
const auto current_vaddr =
|
const auto current_vaddr =
|
||||||
static_cast<u64>((page_index << Memory::YUZU_PAGEBITS) + page_offset);
|
static_cast<u64>((page_index << Memory::YUZU_PAGEBITS) + page_offset);
|
||||||
SCOPE_EXIT{
|
SCOPE_EXIT{
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue