Compare commits

..

1 Commits

Author SHA1 Message Date
Elad e9ad8a9219 Update SPULLVMRecompiler.cpp 2026-03-30 13:32:45 +03:00
652 changed files with 8545 additions and 24647 deletions
+1 -1
View File
@@ -35,7 +35,7 @@ cmake .. \
-DUSE_SYSTEM_CURL=ON \ -DUSE_SYSTEM_CURL=ON \
-DUSE_SDL=ON \ -DUSE_SDL=ON \
-DUSE_SYSTEM_SDL=ON \ -DUSE_SYSTEM_SDL=ON \
-DUSE_SYSTEM_FFMPEG=ON \ -DUSE_SYSTEM_FFMPEG=OFF \
-DUSE_SYSTEM_OPENCV=ON \ -DUSE_SYSTEM_OPENCV=ON \
-DUSE_DISCORD_RPC=ON \ -DUSE_DISCORD_RPC=ON \
-DOpenGL_GL_PREFERENCE=LEGACY \ -DOpenGL_GL_PREFERENCE=LEGACY \
+1 -1
View File
@@ -46,7 +46,7 @@ cmake .. \
-DUSE_SYSTEM_CURL=ON \ -DUSE_SYSTEM_CURL=ON \
-DUSE_SDL=ON \ -DUSE_SDL=ON \
-DUSE_SYSTEM_SDL=ON \ -DUSE_SYSTEM_SDL=ON \
-DUSE_SYSTEM_FFMPEG=ON \ -DUSE_SYSTEM_FFMPEG=OFF \
-DUSE_SYSTEM_OPENCV=ON \ -DUSE_SYSTEM_OPENCV=ON \
-DUSE_DISCORD_RPC=ON \ -DUSE_DISCORD_RPC=ON \
-DOpenGL_GL_PREFERENCE=LEGACY \ -DOpenGL_GL_PREFERENCE=LEGACY \
+45 -10
View File
@@ -13,18 +13,31 @@ export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
export HOMEBREW_NO_ENV_HINTS=1 export HOMEBREW_NO_ENV_HINTS=1
export HOMEBREW_NO_INSTALL_CLEANUP=1 export HOMEBREW_NO_INSTALL_CLEANUP=1
brew update
brew install -f --overwrite --quiet ccache "llvm@$LLVM_COMPILER_VER" brew install -f --overwrite --quiet ccache "llvm@$LLVM_COMPILER_VER"
brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER" brew link -f --overwrite --quiet "llvm@$LLVM_COMPILER_VER"
brew install -f --overwrite --quiet googletest opencv@4 sdl3 vulkan-headers vulkan-loader molten-vk if [ "$AARCH64" -eq 1 ]; then
brew unlink --quiet ffmpeg fmt qtbase qtsvg qtdeclarative protobuf || true brew install -f --overwrite --quiet googletest opencv@4 sdl3 vulkan-headers vulkan-loader molten-vk
brew unlink --quiet ffmpeg fmt qtbase qtsvg qtdeclarative protobuf || true
else
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
arch -x86_64 /usr/local/bin/brew install -f --overwrite --quiet python@3.14 opencv@4 "llvm@$LLVM_COMPILER_VER" sdl3 vulkan-headers vulkan-loader molten-vk
arch -x86_64 /usr/local/bin/brew unlink --quiet ffmpeg qtbase qtsvg qtdeclarative protobuf || true
fi
export CXX=clang++ export CXX=clang++
export CC=clang export CC=clang
export BREW_PATH; export BREW_PATH;
BREW_PATH="$(brew --prefix)" if [ "$AARCH64" -eq 1 ]; then
export BREW_BIN="$BREW_PATH/bin" BREW_PATH="$(brew --prefix)"
export BREW_SBIN="$BREW_PATH/sbin" export BREW_BIN="/opt/homebrew/bin"
export BREW_SBIN="/opt/homebrew/sbin"
else
BREW_PATH="$("/usr/local/bin/brew" --prefix)"
export BREW_BIN="/usr/local/bin"
export BREW_SBIN="/usr/local/sbin"
fi
export WORKDIR; export WORKDIR;
WORKDIR="$(pwd)" WORKDIR="$(pwd)"
@@ -55,7 +68,7 @@ ditto "/tmp/Qt/$QT_VER" "qt-downloader/$QT_VER"
export Qt6_DIR="$WORKDIR/qt-downloader/$QT_VER/clang_64/lib/cmake/Qt$QT_VER_MAIN" export Qt6_DIR="$WORKDIR/qt-downloader/$QT_VER/clang_64/lib/cmake/Qt$QT_VER_MAIN"
export SDL3_DIR="$BREW_PATH/opt/sdl3/lib/cmake/SDL3" export SDL3_DIR="$BREW_PATH/opt/sdl3/lib/cmake/SDL3"
export PATH="$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/bin:$PATH" export PATH="/opt/homebrew/opt/llvm@$LLVM_COMPILER_VER/bin:$PATH"
export LDFLAGS="-L$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/c++ -L$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/unwind -lunwind" export LDFLAGS="-L$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/c++ -L$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER/lib/unwind -lunwind"
export VULKAN_SDK export VULKAN_SDK
@@ -69,13 +82,12 @@ LLVM_DIR="$BREW_PATH/opt/llvm@$LLVM_COMPILER_VER"
git submodule -q update --init --depth=1 --jobs=8 $(awk '/path/ && !/llvm/ && !/opencv/ && !/SDL/ && !/feralinteractive/ { print $3 }' .gitmodules) git submodule -q update --init --depth=1 --jobs=8 $(awk '/path/ && !/llvm/ && !/opencv/ && !/SDL/ && !/feralinteractive/ { print $3 }' .gitmodules)
mkdir build && cd build || exit 1 mkdir build && cd build || exit 1
# The below should be uncommented once bugs with Qt 6 QListWidgets when using the OS 26 visual style are resolved.
# sudo xcode-select -switch /Applications/Xcode_26.3.app/Contents/Developer
if [ "$AARCH64" -eq 1 ]; then
cmake .. \ cmake .. \
-DBUILD_RPCS3_TESTS="${RUN_UNIT_TESTS}" \ -DBUILD_RPCS3_TESTS="${RUN_UNIT_TESTS}" \
-DRUN_RPCS3_TESTS="${RUN_UNIT_TESTS}" \ -DRUN_RPCS3_TESTS="${RUN_UNIT_TESTS}" \
-DCMAKE_OSX_DEPLOYMENT_TARGET=15.0 \ -DCMAKE_OSX_DEPLOYMENT_TARGET=14.4 \
-DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \ -DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \
-DMACOSX_BUNDLE_SHORT_VERSION_STRING="${COMM_TAG}" \ -DMACOSX_BUNDLE_SHORT_VERSION_STRING="${COMM_TAG}" \
-DMACOSX_BUNDLE_BUNDLE_VERSION="${COMM_COUNT}" \ -DMACOSX_BUNDLE_BUNDLE_VERSION="${COMM_COUNT}" \
@@ -90,8 +102,31 @@ cmake .. \
-DUSE_SYSTEM_SDL=ON \ -DUSE_SYSTEM_SDL=ON \
-DUSE_SYSTEM_OPENCV=ON \ -DUSE_SYSTEM_OPENCV=ON \
-G Ninja -G Ninja
else
cmake .. \
-DBUILD_RPCS3_TESTS=OFF \
-DRUN_RPCS3_TESTS=OFF \
-DCMAKE_OSX_ARCHITECTURES=x86_64 \
-DCMAKE_SYSTEM_PROCESSOR=x86_64 \
-DCMAKE_TOOLCHAIN_FILE=buildfiles/cmake/TCDarwinX86_64.cmake \
-DCMAKE_OSX_DEPLOYMENT_TARGET=14.4 \
-DCMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \
-DMACOSX_BUNDLE_SHORT_VERSION_STRING="${COMM_TAG}" \
-DMACOSX_BUNDLE_BUNDLE_VERSION="${COMM_COUNT}"\
-DSTATIC_LINK_LLVM=ON \
-DUSE_SDL=ON \
-DUSE_DISCORD_RPC=ON \
-DUSE_AUDIOUNIT=ON \
-DUSE_SYSTEM_FFMPEG=OFF \
-DUSE_NATIVE_INSTRUCTIONS=OFF \
-DUSE_PRECOMPILED_HEADERS=OFF \
-DUSE_SYSTEM_MVK=ON \
-DUSE_SYSTEM_SDL=ON \
-DUSE_SYSTEM_OPENCV=ON \
-G Ninja
fi
ninja -j4; build_status=$?; ninja; build_status=$?;
cd .. cd ..
-3
View File
@@ -19,9 +19,6 @@ if [ "$DEPLOY_APPIMAGE" = "true" ]; then
APPIMAGE_EXTRACT_AND_RUN=1 linuxdeploy --appdir AppDir --plugin qt --plugin checkrt APPIMAGE_EXTRACT_AND_RUN=1 linuxdeploy --appdir AppDir --plugin qt --plugin checkrt
# Restore App Icon
ln -sr ./AppDir/rpcs3.svg ./AppDir/.DirIcon
# Remove libwayland-client because it has platform-dependent exports and breaks other OSes # Remove libwayland-client because it has platform-dependent exports and breaks other OSes
rm -f ./AppDir/usr/lib/libwayland-client.so* rm -f ./AppDir/usr/lib/libwayland-client.so*
+19 -32
View File
@@ -5,7 +5,7 @@ cd build || exit 1
cd bin cd bin
mkdir -p "rpcs3.app/Contents/Resources/vulkan/icd.d" || true mkdir -p "rpcs3.app/Contents/Resources/vulkan/icd.d" || true
wget https://github.com/KhronosGroup/MoltenVK/releases/download/v1.4.2-rc1/MoltenVK-macos-privateapi.tar wget https://github.com/KhronosGroup/MoltenVK/releases/download/v1.4.1/MoltenVK-macos-privateapi.tar
tar -xvf MoltenVK-macos-privateapi.tar tar -xvf MoltenVK-macos-privateapi.tar
cp "MoltenVK/MoltenVK/dynamic/dylib/macOS/libMoltenVK.dylib" "rpcs3.app/Contents/Frameworks/libMoltenVK.dylib" cp "MoltenVK/MoltenVK/dynamic/dylib/macOS/libMoltenVK.dylib" "rpcs3.app/Contents/Frameworks/libMoltenVK.dylib"
cp "MoltenVK/MoltenVK/dynamic/dylib/macOS/MoltenVK_icd.json" "rpcs3.app/Contents/Resources/vulkan/icd.d/MoltenVK_icd.json" cp "MoltenVK/MoltenVK/dynamic/dylib/macOS/MoltenVK_icd.json" "rpcs3.app/Contents/Resources/vulkan/icd.d/MoltenVK_icd.json"
@@ -27,18 +27,21 @@ rm -rf "rpcs3.app/Contents/Frameworks/QtPdf.framework" \
# Download translations # Download translations
mkdir -p "rpcs3.app/Contents/translations" mkdir -p "rpcs3.app/Contents/translations"
ZIP_URL="https://github.com/RPCS3/rpcs3_translations/releases/latest/download/RPCS3-languages.zip" ZIP_URL=$(curl -fsSL "https://api.github.com/repos/RPCS3/rpcs3_translations/releases/latest" \
echo "Downloading translations from: $ZIP_URL" | grep "browser_download_url" \
if curl -fsSL "$ZIP_URL" -o "translations.zip"; then | grep "RPCS3-languages.zip" \
echo "Successfully downloaded translations." | cut -d '"' -f 4)
if unzip -o translations.zip -d "rpcs3.app/Contents/translations" >/dev/null 2>&1; then if [ -z "$ZIP_URL" ]; then
rm -f translations.zip echo "Failed to find RPCS3-languages.zip in the latest release. Continuing without translations."
else
echo "Failed to extract translations.zip. Continuing without translations."
rm -f translations.zip
fi
else else
echo "Warning: Failed to download translations. Skipping..." echo "Downloading translations from: $ZIP_URL"
curl -L -o translations.zip "$ZIP_URL" || {
echo "Failed to download translations.zip. Continuing without translations."
exit 0
}
unzip -o translations.zip -d "rpcs3.app/Contents/translations" >/dev/null 2>&1 || \
echo "Failed to extract translations.zip. Continuing without translations."
rm -f translations.zip
fi fi
# Copy Qt translations manually # Copy Qt translations manually
@@ -52,25 +55,9 @@ rm -f rpcs3.app/Contents/translations/qt_help_*.qm || true
mv rpcs3.app RPCS3_.app mv rpcs3.app RPCS3_.app
mv RPCS3_.app RPCS3.app mv RPCS3_.app RPCS3.app
# Hack to fix rpath issues # Hack
BIN="RPCS3.app/Contents/MacOS/rpcs3" install_name_tool -delete_rpath /opt/homebrew/lib RPCS3.app/Contents/MacOS/rpcs3 || true
install_name_tool -delete_rpath /opt/homebrew/lib $BIN || true install_name_tool -delete_rpath /usr/local/lib RPCS3.app/Contents/MacOS/rpcs3 || true
install_name_tool -delete_rpath /usr/local/lib $BIN || true
# Fix dylib IDs
for lib in RPCS3.app/Contents/Frameworks/*.dylib; do
name=$(basename "$lib")
install_name_tool -id "@rpath/$name" "$lib"
done
# Rewrite any hardcoded Homebrew paths to use @rpath
find "RPCS3.app/Contents/" -type f \( -perm +111 -o -name "*.dylib" \) | while read -r bin; do
otool -L "$bin" | grep -E "/opt/homebrew|/usr/local" | awk '{print $1}' | while read -r dep; do
base=$(basename "$dep")
echo "Fixing $dep -> @rpath/$base in $bin"
install_name_tool -change "$dep" "@rpath/$base" "$bin"
done
done
# NOTE: "--deep" is deprecated # NOTE: "--deep" is deprecated
codesign --deep -fs - RPCS3.app codesign --deep -fs - RPCS3.app
@@ -79,7 +66,7 @@ echo "[InternetShortcut]" > Quickstart.url
echo "URL=https://rpcs3.net/quickstart" >> Quickstart.url echo "URL=https://rpcs3.net/quickstart" >> Quickstart.url
echo "IconIndex=0" >> Quickstart.url echo "IconIndex=0" >> Quickstart.url
if [ "$(arch)" = "arm64" ]; then if [ "$AARCH64" -eq 1 ]; then
ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos_aarch64.7z" ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos_aarch64.7z"
else else
ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos.7z" ARCHIVE_FILEPATH="$BUILD_ARTIFACTSTAGINGDIRECTORY/rpcs3-v${LVER}_macos.7z"
-1
View File
@@ -24,7 +24,6 @@ mkdir ./bin/config
mkdir ./bin/config/input_configs mkdir ./bin/config/input_configs
curl -fsSL 'https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt' 1> ./bin/config/input_configs/gamecontrollerdb.txt curl -fsSL 'https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt' 1> ./bin/config/input_configs/gamecontrollerdb.txt
curl -fsSL 'https://rpcs3.net/compatibility?api=v1&export' | iconv -f ISO-8859-1 -t UTF-8 1> ./bin/GuiConfigs/compat_database.dat curl -fsSL 'https://rpcs3.net/compatibility?api=v1&export' | iconv -f ISO-8859-1 -t UTF-8 1> ./bin/GuiConfigs/compat_database.dat
curl -fsSL 'https://api.rpcs3.net/config/?api=v1' | iconv -f ISO-8859-1 -t UTF-8 1> ./bin/GuiConfigs/config_database.dat
# Download translations # Download translations
mkdir -p ./bin/share/qt6/translations mkdir -p ./bin/share/qt6/translations
-1
View File
@@ -14,7 +14,6 @@ mkdir ./bin/config
mkdir ./bin/config/input_configs mkdir ./bin/config/input_configs
curl -fsSL 'https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt' 1> ./bin/config/input_configs/gamecontrollerdb.txt curl -fsSL 'https://raw.githubusercontent.com/gabomdq/SDL_GameControllerDB/master/gamecontrollerdb.txt' 1> ./bin/config/input_configs/gamecontrollerdb.txt
curl -fsSL 'https://rpcs3.net/compatibility?api=v1&export' | iconv -t UTF-8 1> ./bin/GuiConfigs/compat_database.dat curl -fsSL 'https://rpcs3.net/compatibility?api=v1&export' | iconv -t UTF-8 1> ./bin/GuiConfigs/compat_database.dat
curl -fsSL 'https://api.rpcs3.net/config/?api=v1' | iconv -t UTF-8 1> ./bin/GuiConfigs/config_database.dat
# Download translations # Download translations
mkdir -p ./bin/qt6/translations mkdir -p ./bin/qt6/translations
+2 -2
View File
@@ -16,7 +16,7 @@ QT_MM_URL="${QT_HOST}${QT_PREFIX}addons.qtmultimedia.${QT_PREFIX_2}qtmultimedia$
QT_SVG_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qtsvg${QT_SUFFIX}" QT_SVG_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qtsvg${QT_SUFFIX}"
QT_TRANSLATIONS_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qttranslations${QT_SUFFIX}" QT_TRANSLATIONS_URL="${QT_HOST}${QT_PREFIX}${QT_PREFIX_2}qttranslations${QT_SUFFIX}"
LLVMLIBS_URL="https://github.com/RPCS3/llvm-mirror/releases/download/custom-build-win-${LLVM_VER}/llvmlibs_mt.7z" LLVMLIBS_URL="https://github.com/RPCS3/llvm-mirror/releases/download/custom-build-win-${LLVM_VER}/llvmlibs_mt.7z"
VULKAN_SDK_URL="https://www.dropbox.com/scl/fi/olpvqk4346ig7i8btadk5/vulkansdk-windows-X64-${VULKAN_VER}.exe?rlkey=huvssch6sy904qkg8ti9p65br&st=pztptdin&dl=1" VULKAN_SDK_URL="https://www.dropbox.com/scl/fi/sjjh0fc4ld281pjbl2xzu/VulkanSDK-${VULKAN_VER}-Installer.exe?rlkey=f6wzc0lvms5vwkt2z3qabfv9d&dl=1"
CCACHE_URL="https://github.com/ccache/ccache/releases/download/v4.12.3/ccache-4.12.3-windows-x86_64.zip" CCACHE_URL="https://github.com/ccache/ccache/releases/download/v4.12.3/ccache-4.12.3-windows-x86_64.zip"
DEP_URLS=" \ DEP_URLS=" \
@@ -88,7 +88,7 @@ for url in $DEP_URLS; do
*qt*) checksum=$(curl -fL "${url}.sha1"); algo="sha1"; outDir="$QTDIR/" ;; *qt*) checksum=$(curl -fL "${url}.sha1"); algo="sha1"; outDir="$QTDIR/" ;;
*llvm*) checksum=$(curl -fL "${url}.sha256"); algo="sha256"; outDir="./build/lib_ext/Release-x64" ;; *llvm*) checksum=$(curl -fL "${url}.sha256"); algo="sha256"; outDir="./build/lib_ext/Release-x64" ;;
*ccache*) checksum=$CCACHE_SHA; algo="sha256"; outDir="$CCACHE_BIN_DIR" ;; *ccache*) checksum=$CCACHE_SHA; algo="sha256"; outDir="$CCACHE_BIN_DIR" ;;
*vulkansdk*) *Vulkan*)
# Vulkan setup needs to be run in batch environment # Vulkan setup needs to be run in batch environment
# Need to subshell this or else it doesn't wait # Need to subshell this or else it doesn't wait
download_and_verify "$url" "$VULKAN_SDK_SHA" "sha256" "$fileName" download_and_verify "$url" "$VULKAN_SDK_SHA" "sha256" "$fileName"
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
Windows_Build: Windows_Build:
if: github.event_name == 'workflow_dispatch' if: github.event_name == 'workflow_dispatch'
name: LLVM Windows (MSVC) name: LLVM Windows (MSVC)
runs-on: windows-2025-vs2026 runs-on: windows-2025
env: env:
COMPILER: msvc COMPILER: msvc
CCACHE_SHA: '859141059ac950e1e8cd042c66f842f26b9e3a62a1669a69fe6ba180cb58bbdf' CCACHE_SHA: '859141059ac950e1e8cd042c66f842f26b9e3a62a1669a69fe6ba180cb58bbdf'
+16 -15
View File
@@ -30,23 +30,23 @@ jobs:
matrix: matrix:
include: include:
- os: ubuntu-24.04 - os: ubuntu-24.04
docker_img: "rpcs3/rpcs3-ci-jammy:1.14" docker_img: "rpcs3/rpcs3-ci-jammy:1.10"
build_sh: "/rpcs3/.ci/build-linux.sh" build_sh: "/rpcs3/.ci/build-linux.sh"
compiler: clang compiler: clang
UPLOAD_COMMIT_HASH: d812f1254a1157c80fd402f94446310560f54e5f UPLOAD_COMMIT_HASH: d812f1254a1157c80fd402f94446310560f54e5f
UPLOAD_REPO_FULL_NAME: "rpcs3/rpcs3-binaries-linux" UPLOAD_REPO_FULL_NAME: "rpcs3/rpcs3-binaries-linux"
- os: ubuntu-24.04 - os: ubuntu-24.04
docker_img: "rpcs3/rpcs3-ci-jammy:1.14" docker_img: "rpcs3/rpcs3-ci-jammy:1.10"
build_sh: "/rpcs3/.ci/build-linux.sh" build_sh: "/rpcs3/.ci/build-linux.sh"
compiler: gcc compiler: gcc
- os: ubuntu-24.04-arm - os: ubuntu-24.04-arm
docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.14" docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.10"
build_sh: "/rpcs3/.ci/build-linux-aarch64.sh" build_sh: "/rpcs3/.ci/build-linux-aarch64.sh"
compiler: clang compiler: clang
UPLOAD_COMMIT_HASH: a1d35836e8d45bfc6f63c26f0a3e5d46ef622fe1 UPLOAD_COMMIT_HASH: a1d35836e8d45bfc6f63c26f0a3e5d46ef622fe1
UPLOAD_REPO_FULL_NAME: "rpcs3/rpcs3-binaries-linux-arm64" UPLOAD_REPO_FULL_NAME: "rpcs3/rpcs3-binaries-linux-arm64"
- os: ubuntu-24.04-arm - os: ubuntu-24.04-arm
docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.14" docker_img: "rpcs3/rpcs3-ci-jammy-aarch64:1.10"
build_sh: "/rpcs3/.ci/build-linux-aarch64.sh" build_sh: "/rpcs3/.ci/build-linux-aarch64.sh"
compiler: gcc compiler: gcc
name: RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} name: RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }}
@@ -123,24 +123,25 @@ jobs:
matrix: matrix:
include: include:
- name: Intel - name: Intel
runs-on: macos-15-intel AARCH64: 0
UPLOAD_COMMIT_HASH: 51ae32f468089a8169aaf1567de355ff4a3e0842 UPLOAD_COMMIT_HASH: 51ae32f468089a8169aaf1567de355ff4a3e0842
UPLOAD_REPO_FULL_NAME: rpcs3/rpcs3-binaries-mac UPLOAD_REPO_FULL_NAME: rpcs3/rpcs3-binaries-mac
- name: Apple Silicon - name: Apple Silicon
runs-on: macos-15 AARCH64: 1
UPLOAD_COMMIT_HASH: 8e21bdbc40711a3fccd18fbf17b742348b0f4281 UPLOAD_COMMIT_HASH: 8e21bdbc40711a3fccd18fbf17b742348b0f4281
UPLOAD_REPO_FULL_NAME: rpcs3/rpcs3-binaries-mac-arm64 UPLOAD_REPO_FULL_NAME: rpcs3/rpcs3-binaries-mac-arm64
name: RPCS3 Mac ${{ matrix.name }} name: RPCS3 Mac ${{ matrix.name }}
runs-on: ${{ matrix.runs-on }} runs-on: macos-14
env: env:
CCACHE_DIR: /tmp/ccache_dir CCACHE_DIR: /tmp/ccache_dir
QT_VER: '6.11.1' QT_VER: '6.11.0'
QT_VER_MAIN: '6' QT_VER_MAIN: '6'
LLVM_COMPILER_VER: '21' LLVM_COMPILER_VER: '21'
RELEASE_MESSAGE: ../GitHubReleaseMessage.txt RELEASE_MESSAGE: ../GitHubReleaseMessage.txt
UPLOAD_COMMIT_HASH: ${{ matrix.UPLOAD_COMMIT_HASH }} UPLOAD_COMMIT_HASH: ${{ matrix.UPLOAD_COMMIT_HASH }}
UPLOAD_REPO_FULL_NAME: ${{ matrix.UPLOAD_REPO_FULL_NAME }} UPLOAD_REPO_FULL_NAME: ${{ matrix.UPLOAD_REPO_FULL_NAME }}
RUN_UNIT_TESTS: ${{ matrix.name == 'Apple Silicon' && (github.event_name == 'pull_request' && 'ON') || 'OFF' }} AARCH64: ${{ matrix.AARCH64 }}
RUN_UNIT_TESTS: github.event_name == 'pull_request' && 'ON' || 'OFF'
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@main uses: actions/checkout@main
@@ -208,16 +209,16 @@ jobs:
# Only run push event on master branch of main repo, but run all PRs # Only run push event on master branch of main repo, but run all PRs
if: github.event_name != 'push' || (github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master') if: github.event_name != 'push' || (github.repository == 'RPCS3/rpcs3' && github.ref_name == 'master')
name: RPCS3 Windows name: RPCS3 Windows
runs-on: windows-2025-vs2026 runs-on: windows-2025
env: env:
COMPILER: msvc COMPILER: msvc
QT_VER_MAIN: '6' QT_VER_MAIN: '6'
QT_VER: '6.11.1' QT_VER: '6.11.0'
QT_VER_MSVC: 'msvc2022' QT_VER_MSVC: 'msvc2022'
QT_DATE: '202605090529' QT_DATE: '202603180535'
LLVM_VER: '19.1.7' LLVM_VER: '19.1.7'
VULKAN_VER: '1.4.341.1' VULKAN_VER: '1.3.268.0'
VULKAN_SDK_SHA: 'bcf2d75aa9556889ab974858666e20b3655b6055a0db704ccb47279ff33b5bfe' VULKAN_SDK_SHA: '8459ef49bd06b697115ddd3d97c9aec729e849cd775f5be70897718a9b3b9db5'
CCACHE_SHA: '859141059ac950e1e8cd042c66f842f26b9e3a62a1669a69fe6ba180cb58bbdf' CCACHE_SHA: '859141059ac950e1e8cd042c66f842f26b9e3a62a1669a69fe6ba180cb58bbdf'
CCACHE_BIN_DIR: 'C:\ccache_bin' CCACHE_BIN_DIR: 'C:\ccache_bin'
CCACHE_DIR: 'C:\ccache' CCACHE_DIR: 'C:\ccache'
@@ -234,7 +235,7 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- name: Setup NuGet - name: Setup NuGet
uses: nuget/setup-nuget@v4 uses: nuget/setup-nuget@v2
- name: Restore NuGet packages - name: Restore NuGet packages
run: nuget restore rpcs3.sln run: nuget restore rpcs3.sln
+15 -15
View File
@@ -7,24 +7,24 @@ if(USE_SYSTEM_CURL)
target_link_libraries(3rdparty_libcurl INTERFACE CURL::libcurl) target_link_libraries(3rdparty_libcurl INTERFACE CURL::libcurl)
else() else()
message(STATUS "RPCS3: building libcurl + wolfssl submodules") message(STATUS "RPCS3: building libcurl + wolfssl submodules")
set(BUILD_CURL_EXE OFF CACHE INTERNAL "") set(BUILD_CURL_EXE OFF CACHE BOOL "Set to ON to build curl executable.")
set(BUILD_STATIC_CURL OFF CACHE INTERNAL "") set(BUILD_STATIC_CURL OFF CACHE BOOL "Set to ON to build curl executable with static libcurl.")
set(BUILD_STATIC_LIBS ON CACHE INTERNAL "") set(BUILD_STATIC_LIBS ON CACHE BOOL "Set to ON to build static libcurl.")
set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "") set(BUILD_SHARED_LIBS OFF CACHE BOOL "Set to ON to build shared libcurl.")
find_package(WolfSSL REQUIRED) find_package(WolfSSL REQUIRED)
set(CURL_USE_WOLFSSL ON CACHE INTERNAL "") set(CURL_USE_WOLFSSL ON CACHE BOOL "enable wolfSSL for SSL/TLS")
set(CURL_USE_OPENSSL OFF CACHE INTERNAL "") set(CURL_USE_OPENSSL OFF CACHE BOOL "Use OpenSSL code. Experimental")
set(HTTP_ONLY ON CACHE INTERNAL "") set(HTTP_ONLY ON CACHE BOOL "disables all protocols except HTTP (This overrides all CURL_DISABLE_* options)")
set(USE_LIBIDN2 OFF CACHE INTERNAL "") # Disabled because MacOS CI doesn't work otherwise set(USE_LIBIDN2 OFF CACHE BOOL "Use libidn2 for IDN support") # Disabled because MacOS CI doesn't work otherwise
set(CURL_CA_PATH "none" CACHE INTERNAL "") set(CURL_CA_PATH "none" CACHE STRING "Location of default CA path. Set 'none' to disable or 'auto' for auto-detection. Defaults to 'auto'.")
set(CURL_DISABLE_INSTALL ON CACHE INTERNAL "") option(CURL_DISABLE_INSTALL "Disable installation targets" ON)
if(WIN32) if(WIN32)
set(ENABLE_UNICODE ON CACHE INTERNAL "") set(ENABLE_UNICODE ON CACHE BOOL "enable Unicode")
endif() endif()
set(CURL_USE_LIBSSH2 OFF CACHE INTERNAL "") set(CURL_USE_LIBSSH2 OFF CACHE BOOL "Use libSSH2")
set(CURL_USE_LIBPSL OFF CACHE INTERNAL "") set(CURL_USE_LIBPSL OFF CACHE BOOL "Use libPSL")
set(BUILD_TESTING OFF CACHE INTERNAL "") option(BUILD_TESTING "Build tests" OFF)
set(BUILD_EXAMPLES OFF CACHE INTERNAL "") option(BUILD_EXAMPLES "Build libcurl examples" OFF)
add_subdirectory(curl EXCLUDE_FROM_ALL) add_subdirectory(curl EXCLUDE_FROM_ALL)
+9 -37
View File
@@ -66,21 +66,17 @@
<ClCompile Include="curl\lib\asyn-thrdd.c" /> <ClCompile Include="curl\lib\asyn-thrdd.c" />
<ClCompile Include="curl\lib\bufq.c" /> <ClCompile Include="curl\lib\bufq.c" />
<ClCompile Include="curl\lib\bufref.c" /> <ClCompile Include="curl\lib\bufref.c" />
<ClCompile Include="curl\lib\cf-dns.c" />
<ClCompile Include="curl\lib\cf-h1-proxy.c" /> <ClCompile Include="curl\lib\cf-h1-proxy.c" />
<ClCompile Include="curl\lib\cf-h2-proxy.c" /> <ClCompile Include="curl\lib\cf-h2-proxy.c" />
<ClCompile Include="curl\lib\cf-haproxy.c" /> <ClCompile Include="curl\lib\cf-haproxy.c" />
<ClCompile Include="curl\lib\cf-https-connect.c" /> <ClCompile Include="curl\lib\cf-https-connect.c" />
<ClCompile Include="curl\lib\cf-ip-happy.c" /> <ClCompile Include="curl\lib\cf-ip-happy.c" />
<ClCompile Include="curl\lib\cf-recvbuf.c" />
<ClCompile Include="curl\lib\cf-setup.c" />
<ClCompile Include="curl\lib\cf-socket.c" /> <ClCompile Include="curl\lib\cf-socket.c" />
<ClCompile Include="curl\lib\cfilters.c" /> <ClCompile Include="curl\lib\cfilters.c" />
<ClCompile Include="curl\lib\conncache.c" /> <ClCompile Include="curl\lib\conncache.c" />
<ClCompile Include="curl\lib\connect.c" /> <ClCompile Include="curl\lib\connect.c" />
<ClCompile Include="curl\lib\content_encoding.c" /> <ClCompile Include="curl\lib\content_encoding.c" />
<ClCompile Include="curl\lib\cookie.c" /> <ClCompile Include="curl\lib\cookie.c" />
<ClCompile Include="curl\lib\creds.c" />
<ClCompile Include="curl\lib\cshutdn.c" /> <ClCompile Include="curl\lib\cshutdn.c" />
<ClCompile Include="curl\lib\curlx\base64.c" /> <ClCompile Include="curl\lib\curlx\base64.c" />
<ClCompile Include="curl\lib\curlx\basename.c" /> <ClCompile Include="curl\lib\curlx\basename.c" />
@@ -111,6 +107,7 @@
<ClCompile Include="curl\lib\curl_memrchr.c" /> <ClCompile Include="curl\lib\curl_memrchr.c" />
<ClCompile Include="curl\lib\curl_ntlm_core.c" /> <ClCompile Include="curl\lib\curl_ntlm_core.c" />
<ClCompile Include="curl\lib\curl_range.c" /> <ClCompile Include="curl\lib\curl_range.c" />
<ClCompile Include="curl\lib\curl_rtmp.c" />
<ClCompile Include="curl\lib\curl_sasl.c" /> <ClCompile Include="curl\lib\curl_sasl.c" />
<ClCompile Include="curl\lib\curl_sha512_256.c" /> <ClCompile Include="curl\lib\curl_sha512_256.c" />
<ClCompile Include="curl\lib\curl_share.c" /> <ClCompile Include="curl\lib\curl_share.c" />
@@ -121,7 +118,6 @@
<ClCompile Include="curl\lib\cw-pause.c" /> <ClCompile Include="curl\lib\cw-pause.c" />
<ClCompile Include="curl\lib\dict.c" /> <ClCompile Include="curl\lib\dict.c" />
<ClCompile Include="curl\lib\dllmain.c" /> <ClCompile Include="curl\lib\dllmain.c" />
<ClCompile Include="curl\lib\dnscache.c" />
<ClCompile Include="curl\lib\doh.c" /> <ClCompile Include="curl\lib\doh.c" />
<ClCompile Include="curl\lib\dynhds.c" /> <ClCompile Include="curl\lib\dynhds.c" />
<ClCompile Include="curl\lib\easy.c" /> <ClCompile Include="curl\lib\easy.c" />
@@ -170,14 +166,12 @@
<ClCompile Include="curl\lib\multi_ev.c" /> <ClCompile Include="curl\lib\multi_ev.c" />
<ClCompile Include="curl\lib\multi_ntfy.c" /> <ClCompile Include="curl\lib\multi_ntfy.c" />
<ClCompile Include="curl\lib\netrc.c" /> <ClCompile Include="curl\lib\netrc.c" />
<ClCompile Include="curl\lib\noproxy.c" />
<ClCompile Include="curl\lib\openldap.c" /> <ClCompile Include="curl\lib\openldap.c" />
<ClCompile Include="curl\lib\parsedate.c" /> <ClCompile Include="curl\lib\parsedate.c" />
<ClCompile Include="curl\lib\peer.c" />
<ClCompile Include="curl\lib\pingpong.c" /> <ClCompile Include="curl\lib\pingpong.c" />
<ClCompile Include="curl\lib\pop3.c" /> <ClCompile Include="curl\lib\pop3.c" />
<ClCompile Include="curl\lib\progress.c" /> <ClCompile Include="curl\lib\progress.c" />
<ClCompile Include="curl\lib\protocol.c" />
<ClCompile Include="curl\lib\proxy.c" />
<ClCompile Include="curl\lib\psl.c" /> <ClCompile Include="curl\lib\psl.c" />
<ClCompile Include="curl\lib\rand.c" /> <ClCompile Include="curl\lib\rand.c" />
<ClCompile Include="curl\lib\ratelimit.c" /> <ClCompile Include="curl\lib\ratelimit.c" />
@@ -201,8 +195,6 @@
<ClCompile Include="curl\lib\system_win32.c" /> <ClCompile Include="curl\lib\system_win32.c" />
<ClCompile Include="curl\lib\telnet.c" /> <ClCompile Include="curl\lib\telnet.c" />
<ClCompile Include="curl\lib\tftp.c" /> <ClCompile Include="curl\lib\tftp.c" />
<ClCompile Include="curl\lib\thrdpool.c" />
<ClCompile Include="curl\lib\thrdqueue.c" />
<ClCompile Include="curl\lib\transfer.c" /> <ClCompile Include="curl\lib\transfer.c" />
<ClCompile Include="curl\lib\uint-bset.c" /> <ClCompile Include="curl\lib\uint-bset.c" />
<ClCompile Include="curl\lib\uint-hash.c" /> <ClCompile Include="curl\lib\uint-hash.c" />
@@ -212,19 +204,13 @@
<ClCompile Include="curl\lib\urlapi.c" /> <ClCompile Include="curl\lib\urlapi.c" />
<ClCompile Include="curl\lib\vauth\gsasl.c" /> <ClCompile Include="curl\lib\vauth\gsasl.c" />
<ClCompile Include="curl\lib\version.c" /> <ClCompile Include="curl\lib\version.c" />
<ClCompile Include="curl\lib\vquic\capsule.c" /> <ClCompile Include="curl\lib\vquic\curl_ngtcp2.c" />
<ClCompile Include="curl\lib\vquic\cf-capsule.c" /> <ClCompile Include="curl\lib\vquic\curl_quiche.c" />
<ClCompile Include="curl\lib\vquic\cf-ngtcp2-cmn.c" />
<ClCompile Include="curl\lib\vquic\cf-ngtcp2-proxy.c" />
<ClCompile Include="curl\lib\vquic\cf-ngtcp2.c" />
<ClCompile Include="curl\lib\vquic\cf-quiche.c" />
<ClCompile Include="curl\lib\vquic\vquic-tls.c" />
<ClCompile Include="curl\lib\vssh\vssh.c" /> <ClCompile Include="curl\lib\vssh\vssh.c" />
<ClCompile Include="curl\lib\vtls\apple.c" /> <ClCompile Include="curl\lib\vtls\apple.c" />
<ClCompile Include="curl\lib\vtls\cipher_suite.c" /> <ClCompile Include="curl\lib\vtls\cipher_suite.c" />
<ClCompile Include="curl\lib\vtls\hostcheck.c" /> <ClCompile Include="curl\lib\vtls\hostcheck.c" />
<ClCompile Include="curl\lib\vtls\rustls.c" /> <ClCompile Include="curl\lib\vtls\rustls.c" />
<ClCompile Include="curl\lib\vtls\vtls_config.c" />
<ClCompile Include="curl\lib\vtls\vtls_scache.c" /> <ClCompile Include="curl\lib\vtls\vtls_scache.c" />
<ClCompile Include="curl\lib\vtls\vtls_spack.c" /> <ClCompile Include="curl\lib\vtls\vtls_spack.c" />
<ClCompile Include="curl\lib\vtls\x509asn1.c" /> <ClCompile Include="curl\lib\vtls\x509asn1.c" />
@@ -269,14 +255,11 @@
<ClInclude Include="curl\lib\asyn.h" /> <ClInclude Include="curl\lib\asyn.h" />
<ClInclude Include="curl\lib\bufq.h" /> <ClInclude Include="curl\lib\bufq.h" />
<ClInclude Include="curl\lib\bufref.h" /> <ClInclude Include="curl\lib\bufref.h" />
<ClInclude Include="curl\lib\cf-dns.h" />
<ClInclude Include="curl\lib\cf-h1-proxy.h" /> <ClInclude Include="curl\lib\cf-h1-proxy.h" />
<ClInclude Include="curl\lib\cf-h2-proxy.h" /> <ClInclude Include="curl\lib\cf-h2-proxy.h" />
<ClInclude Include="curl\lib\cf-haproxy.h" /> <ClInclude Include="curl\lib\cf-haproxy.h" />
<ClInclude Include="curl\lib\cf-https-connect.h" /> <ClInclude Include="curl\lib\cf-https-connect.h" />
<ClInclude Include="curl\lib\cf-ip-happy.h" /> <ClInclude Include="curl\lib\cf-ip-happy.h" />
<ClInclude Include="curl\lib\cf-recvbuf.h" />
<ClInclude Include="curl\lib\cf-setup.h" />
<ClInclude Include="curl\lib\cf-socket.h" /> <ClInclude Include="curl\lib\cf-socket.h" />
<ClInclude Include="curl\lib\cfilters.h" /> <ClInclude Include="curl\lib\cfilters.h" />
<ClInclude Include="curl\lib\config-mac.h" /> <ClInclude Include="curl\lib\config-mac.h" />
@@ -288,11 +271,11 @@
<ClInclude Include="curl\lib\connect.h" /> <ClInclude Include="curl\lib\connect.h" />
<ClInclude Include="curl\lib\content_encoding.h" /> <ClInclude Include="curl\lib\content_encoding.h" />
<ClInclude Include="curl\lib\cookie.h" /> <ClInclude Include="curl\lib\cookie.h" />
<ClInclude Include="curl\lib\creds.h" />
<ClInclude Include="curl\lib\cshutdn.h" /> <ClInclude Include="curl\lib\cshutdn.h" />
<ClInclude Include="curl\lib\curlx\base64.h" /> <ClInclude Include="curl\lib\curlx\base64.h" />
<ClInclude Include="curl\lib\curlx\basename.h" /> <ClInclude Include="curl\lib\curlx\basename.h" />
<ClInclude Include="curl\lib\curlx\binmode.h" /> <ClInclude Include="curl\lib\curlx\binmode.h" />
<ClInclude Include="curl\lib\curlx\curlx.h" />
<ClInclude Include="curl\lib\curlx\dynbuf.h" /> <ClInclude Include="curl\lib\curlx\dynbuf.h" />
<ClInclude Include="curl\lib\curlx\fopen.h" /> <ClInclude Include="curl\lib\curlx\fopen.h" />
<ClInclude Include="curl\lib\curlx\inet_ntop.h" /> <ClInclude Include="curl\lib\curlx\inet_ntop.h" />
@@ -326,6 +309,7 @@
<ClInclude Include="curl\lib\curl_ntlm_core.h" /> <ClInclude Include="curl\lib\curl_ntlm_core.h" />
<ClInclude Include="curl\lib\curl_printf.h" /> <ClInclude Include="curl\lib\curl_printf.h" />
<ClInclude Include="curl\lib\curl_range.h" /> <ClInclude Include="curl\lib\curl_range.h" />
<ClInclude Include="curl\lib\curl_rtmp.h" />
<ClInclude Include="curl\lib\curl_sasl.h" /> <ClInclude Include="curl\lib\curl_sasl.h" />
<ClInclude Include="curl\lib\curl_setup.h" /> <ClInclude Include="curl\lib\curl_setup.h" />
<ClInclude Include="curl\lib\curl_setup_once.h" /> <ClInclude Include="curl\lib\curl_setup_once.h" />
@@ -338,7 +322,6 @@
<ClInclude Include="curl\lib\cw-out.h" /> <ClInclude Include="curl\lib\cw-out.h" />
<ClInclude Include="curl\lib\cw-pause.h" /> <ClInclude Include="curl\lib\cw-pause.h" />
<ClInclude Include="curl\lib\dict.h" /> <ClInclude Include="curl\lib\dict.h" />
<ClInclude Include="curl\lib\dnscache.h" />
<ClInclude Include="curl\lib\doh.h" /> <ClInclude Include="curl\lib\doh.h" />
<ClInclude Include="curl\lib\dynhds.h" /> <ClInclude Include="curl\lib\dynhds.h" />
<ClInclude Include="curl\lib\easyif.h" /> <ClInclude Include="curl\lib\easyif.h" />
@@ -349,7 +332,6 @@
<ClInclude Include="curl\lib\file.h" /> <ClInclude Include="curl\lib\file.h" />
<ClInclude Include="curl\lib\fileinfo.h" /> <ClInclude Include="curl\lib\fileinfo.h" />
<ClInclude Include="curl\lib\formdata.h" /> <ClInclude Include="curl\lib\formdata.h" />
<ClInclude Include="curl\lib\ftp-int.h" />
<ClInclude Include="curl\lib\ftp.h" /> <ClInclude Include="curl\lib\ftp.h" />
<ClInclude Include="curl\lib\ftplistparser.h" /> <ClInclude Include="curl\lib\ftplistparser.h" />
<ClInclude Include="curl\lib\functypes.h" /> <ClInclude Include="curl\lib\functypes.h" />
@@ -381,13 +363,11 @@
<ClInclude Include="curl\lib\multi_ev.h" /> <ClInclude Include="curl\lib\multi_ev.h" />
<ClInclude Include="curl\lib\multi_ntfy.h" /> <ClInclude Include="curl\lib\multi_ntfy.h" />
<ClInclude Include="curl\lib\netrc.h" /> <ClInclude Include="curl\lib\netrc.h" />
<ClInclude Include="curl\lib\noproxy.h" />
<ClInclude Include="curl\lib\parsedate.h" /> <ClInclude Include="curl\lib\parsedate.h" />
<ClInclude Include="curl\lib\peer.h" />
<ClInclude Include="curl\lib\pingpong.h" /> <ClInclude Include="curl\lib\pingpong.h" />
<ClInclude Include="curl\lib\pop3.h" /> <ClInclude Include="curl\lib\pop3.h" />
<ClInclude Include="curl\lib\progress.h" /> <ClInclude Include="curl\lib\progress.h" />
<ClInclude Include="curl\lib\protocol.h" />
<ClInclude Include="curl\lib\proxy.h" />
<ClInclude Include="curl\lib\psl.h" /> <ClInclude Include="curl\lib\psl.h" />
<ClInclude Include="curl\lib\rand.h" /> <ClInclude Include="curl\lib\rand.h" />
<ClInclude Include="curl\lib\ratelimit.h" /> <ClInclude Include="curl\lib\ratelimit.h" />
@@ -415,8 +395,6 @@
<ClInclude Include="curl\lib\system_win32.h" /> <ClInclude Include="curl\lib\system_win32.h" />
<ClInclude Include="curl\lib\telnet.h" /> <ClInclude Include="curl\lib\telnet.h" />
<ClInclude Include="curl\lib\tftp.h" /> <ClInclude Include="curl\lib\tftp.h" />
<ClInclude Include="curl\lib\thrdpool.h" />
<ClInclude Include="curl\lib\thrdqueue.h" />
<ClInclude Include="curl\lib\transfer.h" /> <ClInclude Include="curl\lib\transfer.h" />
<ClInclude Include="curl\lib\uint-bset.h" /> <ClInclude Include="curl\lib\uint-bset.h" />
<ClInclude Include="curl\lib\uint-hash.h" /> <ClInclude Include="curl\lib\uint-hash.h" />
@@ -425,13 +403,8 @@
<ClInclude Include="curl\lib\url.h" /> <ClInclude Include="curl\lib\url.h" />
<ClInclude Include="curl\lib\urlapi-int.h" /> <ClInclude Include="curl\lib\urlapi-int.h" />
<ClInclude Include="curl\lib\urldata.h" /> <ClInclude Include="curl\lib\urldata.h" />
<ClInclude Include="curl\lib\vquic\capsule.h" /> <ClInclude Include="curl\lib\vquic\curl_ngtcp2.h" />
<ClInclude Include="curl\lib\vquic\cf-capsule.h" /> <ClInclude Include="curl\lib\vquic\curl_quiche.h" />
<ClInclude Include="curl\lib\vquic\cf-ngtcp2-cmn.h" />
<ClInclude Include="curl\lib\vquic\cf-ngtcp2-proxy.h" />
<ClInclude Include="curl\lib\vquic\cf-ngtcp2.h" />
<ClInclude Include="curl\lib\vquic\cf-quiche.h" />
<ClInclude Include="curl\lib\vquic\vquic-tls.h" />
<ClInclude Include="curl\lib\vquic\vquic_int.h" /> <ClInclude Include="curl\lib\vquic\vquic_int.h" />
<ClInclude Include="curl\lib\vssh\vssh.h" /> <ClInclude Include="curl\lib\vssh\vssh.h" />
<ClInclude Include="curl\lib\vtls\apple.h" /> <ClInclude Include="curl\lib\vtls\apple.h" />
@@ -439,7 +412,6 @@
<ClInclude Include="curl\lib\vtls\hostcheck.h" /> <ClInclude Include="curl\lib\vtls\hostcheck.h" />
<ClInclude Include="curl\lib\vtls\rustls.h" /> <ClInclude Include="curl\lib\vtls\rustls.h" />
<ClInclude Include="curl\lib\vtls\schannel_int.h" /> <ClInclude Include="curl\lib\vtls\schannel_int.h" />
<ClInclude Include="curl\lib\vtls\vtls_config.h" />
<ClInclude Include="curl\lib\vtls\vtls_int.h" /> <ClInclude Include="curl\lib\vtls\vtls_int.h" />
<ClInclude Include="curl\lib\vtls\vtls_scache.h" /> <ClInclude Include="curl\lib\vtls\vtls_scache.h" />
<ClInclude Include="curl\lib\vtls\vtls_spack.h" /> <ClInclude Include="curl\lib\vtls\vtls_spack.h" />
+27 -111
View File
@@ -66,6 +66,9 @@
<ClCompile Include="curl\lib\curl_range.c"> <ClCompile Include="curl\lib\curl_range.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="curl\lib\curl_rtmp.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\curl_sasl.c"> <ClCompile Include="curl\lib\curl_sasl.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@@ -366,6 +369,9 @@
<ClCompile Include="curl\lib\headers.c"> <ClCompile Include="curl\lib\headers.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="curl\lib\noproxy.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\ws.c"> <ClCompile Include="curl\lib\ws.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@@ -381,6 +387,12 @@
<ClCompile Include="curl\lib\cf-socket.c"> <ClCompile Include="curl\lib\cf-socket.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="curl\lib\vquic\curl_ngtcp2.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\vquic\curl_quiche.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\http1.c"> <ClCompile Include="curl\lib\http1.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@@ -540,60 +552,6 @@
<ClCompile Include="curl\lib\curlx\strdup.c"> <ClCompile Include="curl\lib\curlx\strdup.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="curl\lib\cf-dns.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\dnscache.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\protocol.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\thrdpool.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\thrdqueue.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\vtls\vtls_config.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\vquic\capsule.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\vquic\cf-capsule.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\vquic\cf-ngtcp2.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\vquic\cf-ngtcp2-cmn.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\vquic\cf-ngtcp2-proxy.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\vquic\cf-quiche.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\vquic\vquic-tls.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\cf-recvbuf.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\cf-setup.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\creds.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\peer.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="curl\lib\proxy.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="curl\include\curl\curl.h"> <ClInclude Include="curl\include\curl\curl.h">
@@ -710,6 +668,9 @@
<ClInclude Include="curl\lib\curl_range.h"> <ClInclude Include="curl\lib\curl_range.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="curl\lib\curl_rtmp.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\curl_sasl.h"> <ClInclude Include="curl\lib\curl_sasl.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -974,6 +935,9 @@
<ClInclude Include="curl\lib\functypes.h"> <ClInclude Include="curl\lib\functypes.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="curl\lib\noproxy.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\ws.h"> <ClInclude Include="curl\lib\ws.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -989,6 +953,12 @@
<ClInclude Include="curl\lib\cf-socket.h"> <ClInclude Include="curl\lib\cf-socket.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="curl\lib\vquic\curl_ngtcp2.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\vquic\curl_quiche.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\vquic\vquic_int.h"> <ClInclude Include="curl\lib\vquic\vquic_int.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -1070,6 +1040,9 @@
<ClInclude Include="curl\lib\curlx\base64.h"> <ClInclude Include="curl\lib\curlx\base64.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="curl\lib\curlx\curlx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\curlx\dynbuf.h"> <ClInclude Include="curl\lib\curlx\dynbuf.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -1148,63 +1121,6 @@
<ClInclude Include="curl\lib\curlx\strdup.h"> <ClInclude Include="curl\lib\curlx\strdup.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="curl\lib\cf-dns.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\dnscache.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\ftp-int.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\protocol.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\thrdpool.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\thrdqueue.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\vtls\vtls_config.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\vquic\capsule.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\vquic\cf-capsule.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\vquic\cf-ngtcp2.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\vquic\cf-ngtcp2-cmn.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\vquic\cf-ngtcp2-proxy.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\vquic\cf-quiche.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\vquic\vquic-tls.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\cf-recvbuf.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\cf-setup.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\creds.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\peer.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="curl\lib\proxy.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="curl\lib\libcurl.rc"> <ResourceCompile Include="curl\lib\libcurl.rc">
+4 -4
View File
@@ -13,17 +13,17 @@
<ItemGroup> <ItemGroup>
<ClInclude Include="fusion\Fusion\Fusion.h" /> <ClInclude Include="fusion\Fusion\Fusion.h" />
<ClInclude Include="fusion\Fusion\FusionAhrs.h" /> <ClInclude Include="fusion\Fusion\FusionAhrs.h" />
<ClInclude Include="fusion\Fusion\FusionBias.h" /> <ClInclude Include="fusion\Fusion\FusionAxes.h" />
<ClInclude Include="fusion\Fusion\FusionCalibration.h" />
<ClInclude Include="fusion\Fusion\FusionCompass.h" /> <ClInclude Include="fusion\Fusion\FusionCompass.h" />
<ClInclude Include="fusion\Fusion\FusionConvention.h" /> <ClInclude Include="fusion\Fusion\FusionConvention.h" />
<ClInclude Include="fusion\Fusion\FusionMath.h" /> <ClInclude Include="fusion\Fusion\FusionMath.h" />
<ClInclude Include="fusion\Fusion\FusionModel.h" /> <ClInclude Include="fusion\Fusion\FusionOffset.h" />
<ClInclude Include="fusion\Fusion\FusionRemap.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="fusion\Fusion\FusionAhrs.c" /> <ClCompile Include="fusion\Fusion\FusionAhrs.c" />
<ClCompile Include="fusion\Fusion\FusionBias.c" />
<ClCompile Include="fusion\Fusion\FusionCompass.c" /> <ClCompile Include="fusion\Fusion\FusionCompass.c" />
<ClCompile Include="fusion\Fusion\FusionOffset.c" />
</ItemGroup> </ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<RootNamespace>Fusion</RootNamespace> <RootNamespace>Fusion</RootNamespace>
+4 -4
View File
@@ -8,12 +8,12 @@
<ItemGroup> <ItemGroup>
<ClInclude Include="fusion\Fusion\Fusion.h" /> <ClInclude Include="fusion\Fusion\Fusion.h" />
<ClInclude Include="fusion\Fusion\FusionAhrs.h" /> <ClInclude Include="fusion\Fusion\FusionAhrs.h" />
<ClInclude Include="fusion\Fusion\FusionAxes.h" />
<ClInclude Include="fusion\Fusion\FusionCalibration.h" />
<ClInclude Include="fusion\Fusion\FusionCompass.h" /> <ClInclude Include="fusion\Fusion\FusionCompass.h" />
<ClInclude Include="fusion\Fusion\FusionConvention.h" /> <ClInclude Include="fusion\Fusion\FusionConvention.h" />
<ClInclude Include="fusion\Fusion\FusionMath.h" /> <ClInclude Include="fusion\Fusion\FusionMath.h" />
<ClInclude Include="fusion\Fusion\FusionBias.h" /> <ClInclude Include="fusion\Fusion\FusionOffset.h" />
<ClInclude Include="fusion\Fusion\FusionModel.h" />
<ClInclude Include="fusion\Fusion\FusionRemap.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="fusion\Fusion\FusionAhrs.c"> <ClCompile Include="fusion\Fusion\FusionAhrs.c">
@@ -22,7 +22,7 @@
<ClCompile Include="fusion\Fusion\FusionCompass.c"> <ClCompile Include="fusion\Fusion\FusionCompass.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="fusion\Fusion\FusionBias.c"> <ClCompile Include="fusion\Fusion\FusionOffset.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
-5
View File
@@ -54,9 +54,6 @@
<ClCompile Condition="'$(Configuration)'=='Release'"> <ClCompile Condition="'$(Configuration)'=='Release'">
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile> </ClCompile>
<ClCompile Condition="'$(EnableLibUsbWindowsHotplug)' == 'true'">
<PreprocessorDefinitions>LIBUSB_WINDOWS_HOTPLUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Lib> <Lib>
<OutputFile>$(OutDir)libusb-1.0.lib</OutputFile> <OutputFile>$(OutDir)libusb-1.0.lib</OutputFile>
</Lib> </Lib>
@@ -67,7 +64,6 @@
<ClCompile Include="libusb\libusb\hotplug.c" /> <ClCompile Include="libusb\libusb\hotplug.c" />
<ClCompile Include="libusb\libusb\io.c" /> <ClCompile Include="libusb\libusb\io.c" />
<ClCompile Include="libusb\libusb\os\events_windows.c" /> <ClCompile Include="libusb\libusb\os\events_windows.c" />
<ClCompile Condition="'$(EnableLibUsbWindowsHotplug)' == 'true'" Include="libusb\libusb\os\windows_hotplug.c" />
<ClCompile Include="libusb\libusb\strerror.c" /> <ClCompile Include="libusb\libusb\strerror.c" />
<ClCompile Include="libusb\libusb\sync.c" /> <ClCompile Include="libusb\libusb\sync.c" />
<ClCompile Include="libusb\libusb\os\threads_windows.c" /> <ClCompile Include="libusb\libusb\os\threads_windows.c" />
@@ -76,7 +72,6 @@
<ClCompile Include="libusb\libusb\os\windows_winusb.c" /> <ClCompile Include="libusb\libusb\os\windows_winusb.c" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Condition="'$(EnableLibUsbWindowsHotplug)' == 'true'" Include="libusb\libusb\os\windows_hotplug.h" />
<ClInclude Include="libusb\msvc\config.h" /> <ClInclude Include="libusb\msvc\config.h" />
<ClInclude Include="libusb\libusb\hotplug.h" /> <ClInclude Include="libusb\libusb\hotplug.h" />
<ClInclude Include="libusb\libusb\libusb.h" /> <ClInclude Include="libusb\libusb\libusb.h" />
+7 -10
View File
@@ -164,17 +164,14 @@ namespace pine
return IPCBuffer{ 5, MakeFailIPC(ret_buffer) }; return IPCBuffer{ 5, MakeFailIPC(ret_buffer) };
}; };
const auto write_string = [&](std::string_view str) const auto write_string = [&](const std::string& str)
{ {
if (!SafetyChecks(buf_cnt, 0, ret_cnt, str.size() + 1 + sizeof(u32), buf_size)) if (!SafetyChecks(buf_cnt, 0, ret_cnt, str.size() + 1 + sizeof(u32), buf_size))
return false; return false;
ToArray(ret_buffer, ::narrow<u32>(str.size() + 1), ret_cnt); ToArray(ret_buffer, ::narrow<u32>(str.size() + 1), ret_cnt);
ret_cnt += sizeof(u32); ret_cnt += sizeof(u32);
if (str.size()) memcpy(&ret_buffer[ret_cnt], str.data(), str.size());
{ ret_cnt += str.size();
std::memcpy(&ret_buffer[ret_cnt], str.data(), str.size());
ret_cnt += str.size();
}
ret_buffer[ret_cnt++] = '\0'; ret_buffer[ret_cnt++] = '\0';
return true; return true;
}; };
@@ -515,7 +512,7 @@ namespace pine
*/ */
static inline bool SafetyChecks(usz command_len, usz command_size, usz reply_len, usz reply_size = 0, usz buf_size = MAX_IPC_SIZE - 1) static inline bool SafetyChecks(usz command_len, usz command_size, usz reply_len, usz reply_size = 0, usz buf_size = MAX_IPC_SIZE - 1)
{ {
const bool res = ((command_len + command_size) > buf_size || bool res = ((command_len + command_size) > buf_size ||
(reply_len + reply_size) >= MAX_IPC_RETURN_SIZE); (reply_len + reply_size) >= MAX_IPC_RETURN_SIZE);
if (res) [[unlikely]] if (res) [[unlikely]]
return false; return false;
@@ -527,8 +524,8 @@ namespace pine
pine_server() noexcept pine_server() noexcept
{ {
#ifdef _WIN32 #ifdef _WIN32
WSADATA wsa {}; WSADATA wsa;
struct sockaddr_in server {}; struct sockaddr_in server;
m_sock = INVALID_SOCKET; m_sock = INVALID_SOCKET;
m_msgsock = INVALID_SOCKET; m_msgsock = INVALID_SOCKET;
@@ -582,7 +579,7 @@ namespace pine
fmt::append(m_socket_name, ".%d", slot); fmt::append(m_socket_name, ".%d", slot);
} }
struct sockaddr_un server {}; struct sockaddr_un server;
m_sock = socket(AF_UNIX, SOCK_STREAM, 0); m_sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (m_sock < 0) if (m_sock < 0)
+3 -6
View File
@@ -119,8 +119,7 @@ echo -e "\n\nResult:\n"
# Find the max length of the paths (before '->') # Find the max length of the paths (before '->')
max_len=0 max_len=0
while read -r line; do while IFS='->' read -r left _; do
left="${line%%->*}"
len=$(echo -n "$left" | wc -c) len=$(echo -n "$left" | wc -c)
if (( len > max_len )); then if (( len > max_len )); then
max_len=$len max_len=$len
@@ -128,10 +127,8 @@ while read -r line; do
done < "$resultfile" done < "$resultfile"
# Print with padding so '->' lines up # Print with padding so '->' lines up
while read -r line; do while IFS='->' read -r left right; do
left="${line%%->*}" right=$(echo "$right" | sed 's/^[[:space:]]*>*[[:space:]]*//')
right="${line#*->}"
right=$(echo "$right" | sed 's/^[[:space:]]*//')
printf "%-${max_len}s -> %s\n" "$left" "$right" printf "%-${max_len}s -> %s\n" "$left" "$right"
done < "$resultfile" done < "$resultfile"
+16 -15
View File
@@ -4,22 +4,23 @@ if(USE_SYSTEM_WOLFSSL)
add_library(wolfssl INTERFACE) add_library(wolfssl INTERFACE)
target_link_libraries(wolfssl INTERFACE PkgConfig::WolfSSL) target_link_libraries(wolfssl INTERFACE PkgConfig::WolfSSL)
else() else()
set(WOLFSSL_TLS13 OFF CACHE INTERNAL "") option(WOLFSSL_TLS13 "Enable wolfSSL TLS v1.3 (default: enabled)" OFF)
set(WOLFSSL_SHA3 ON CACHE INTERNAL "") set(WOLFSSL_SHA3 ON CACHE STRING "Enable wolfSSL SHA-3 support (default: enabled on x86_64/aarch64)")
set(WOLFSSL_SHAKE256 ON CACHE INTERNAL "") set(WOLFSSL_SHAKE256 ON CACHE STRING "Enable wolfSSL SHAKE256 support (default: enabled on x86_64/aarch64)")
set(WOLFSSL_BASE64_ENCODE OFF CACHE INTERNAL "") option(WOLFSSL_BASE64_ENCODE "Enable Base64 encoding (default: enabled on x86_64)" OFF)
set(WOLFSSL_DES3 ON CACHE INTERNAL "") option(WOLFSSL_DES3 "Enable DES3 (default: disabled)" ON)
set(WOLFSSL_PWDBASED ON CACHE INTERNAL "") option(WOLFSSL_PWDBASED "Enable PWDBASED (default: disabled)" ON)
set(WOLFSSL_FAST_MATH ON CACHE INTERNAL "") option(WOLFSSL_FAST_MATH "Enable fast math ops (default: disabled)" ON)
set(WOLFSSL_EXAMPLES OFF CACHE INTERNAL "") option(WOLFSSL_EXAMPLES "Enable examples (default: enabled)" OFF)
set(WOLFSSL_CRYPT_TESTS OFF CACHE INTERNAL "") option(WOLFSSL_CRYPT_TESTS "Enable Crypt Bench/Test (default: enabled)" OFF)
set(WOLFSSL_ASYNC_THREADS OFF CACHE INTERNAL "") option(WOLFSSL_ASYNC_THREADS "Enable Asynchronous Threading (default: enabled)" OFF)
set(WOLFSSL_BUILD_OUT_OF_TREE ON CACHE INTERNAL "") option(WOLFSSL_BUILD_OUT_OF_TREE "Don't generate files in the source tree (default: yes)" ON)
set(WOLFSSL_SNI ON CACHE INTERNAL "") option(WOLFSSL_SNI "Enable SNI (default: disabled)" ON)
set(WOLFSSL_OPENSSLEXTRA ON CACHE INTERNAL "") option(WOLFSSL_OPENSSLEXTRA "Enable extra OpenSSL API, size+ (default: disabled)" ON)
set(WOLFSSL_ALT_CERT_CHAINS ON CACHE INTERNAL "") option(WOLFSSL_HARDEN "Enable Hardened build, Enables Timing Resistance and Blinding (default: enabled)" OFF)
option(WOLFSSL_ALT_CERT_CHAINS "Enable support for Alternate certification chains (default: disabled)" ON)
add_subdirectory(wolfssl EXCLUDE_FROM_ALL) add_subdirectory(wolfssl EXCLUDE_FROM_ALL)
target_compile_definitions(wolfssl PUBLIC WOLFSSL_DES_ECB HAVE_WRITE_DUP FP_MAX_BITS=8192 WOLFSSL_USE_OPTIONS_H) target_compile_definitions(wolfssl PUBLIC WOLFSSL_DES_ECB HAVE_WRITE_DUP FP_MAX_BITS=8192 WOLFSSL_NO_OPTIONS_H)
endif() endif()
-3
View File
@@ -46,9 +46,6 @@
#define HAVE_AESGCM #define HAVE_AESGCM
#define HAVE_SUPPORTED_CURVES #define HAVE_SUPPORTED_CURVES
#define HAVE_TLS_EXTENSIONS #define HAVE_TLS_EXTENSIONS
#define HAVE_HKDF
#define WC_RSA_PSS
#define WOLFSSL_TLS13
#define HAVE_ECC #define HAVE_ECC
#define ECC_SHAMIR #define ECC_SHAMIR
#define ECC_TIMING_RESISTANT #define ECC_TIMING_RESISTANT
+5 -103
View File
@@ -71,40 +71,15 @@
</ClCompile> </ClCompile>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="wolfssl\src\bio.c" />
<ClCompile Include="wolfssl\src\conf.c" />
<ClCompile Include="wolfssl\src\crl.c" /> <ClCompile Include="wolfssl\src\crl.c" />
<ClCompile Include="wolfssl\src\dtls.c" />
<ClCompile Include="wolfssl\src\dtls13.c" />
<ClCompile Include="wolfssl\src\internal.c" /> <ClCompile Include="wolfssl\src\internal.c" />
<ClCompile Include="wolfssl\src\pk.c" />
<ClCompile Include="wolfssl\src\pk_ec.c" />
<ClCompile Include="wolfssl\src\pk_rsa.c" />
<ClCompile Include="wolfssl\src\quic.c" />
<ClCompile Include="wolfssl\src\sniffer.c" />
<ClCompile Include="wolfssl\src\ssl_api_cert.c" />
<ClCompile Include="wolfssl\src\ssl_api_crl_ocsp.c" />
<ClCompile Include="wolfssl\src\ssl_api_dtls.c" />
<ClCompile Include="wolfssl\src\ssl_api_ext.c" />
<ClCompile Include="wolfssl\src\ssl_api_pk.c" />
<ClCompile Include="wolfssl\src\ssl_asn1.c" /> <ClCompile Include="wolfssl\src\ssl_asn1.c" />
<ClCompile Include="wolfssl\src\ssl_bn.c" />
<ClCompile Include="wolfssl\src\ssl_certman.c" />
<ClCompile Include="wolfssl\src\ssl_crypto.c" />
<ClCompile Include="wolfssl\src\ssl_ech.c" />
<ClCompile Include="wolfssl\src\ssl_load.c" />
<ClCompile Include="wolfssl\src\ssl_misc.c" />
<ClCompile Include="wolfssl\src\ssl_p7p12.c" />
<ClCompile Include="wolfssl\src\ssl_sess.c" />
<ClCompile Include="wolfssl\src\ssl_sk.c" />
<ClCompile Include="wolfssl\src\wolfio.c" /> <ClCompile Include="wolfssl\src\wolfio.c" />
<ClCompile Include="wolfssl\src\keys.c" /> <ClCompile Include="wolfssl\src\keys.c" />
<ClCompile Include="wolfssl\src\ocsp.c" /> <ClCompile Include="wolfssl\src\ocsp.c" />
<ClCompile Include="wolfssl\src\ssl.c" /> <ClCompile Include="wolfssl\src\ssl.c" />
<ClCompile Include="wolfssl\src\tls.c" /> <ClCompile Include="wolfssl\src\tls.c" />
<ClCompile Include="wolfssl\src\tls13.c" /> <ClCompile Include="wolfssl\src\tls13.c" />
<ClCompile Include="wolfssl\src\x509.c" />
<ClCompile Include="wolfssl\src\x509_str.c" />
<ClCompile Include="wolfssl\wolfcrypt\src\aes.c" /> <ClCompile Include="wolfssl\wolfcrypt\src\aes.c" />
<ClCompile Include="wolfssl\wolfcrypt\src\arc4.c" /> <ClCompile Include="wolfssl\wolfcrypt\src\arc4.c" />
<ClCompile Include="wolfssl\wolfcrypt\src\asn.c" /> <ClCompile Include="wolfssl\wolfcrypt\src\asn.c" />
@@ -164,77 +139,6 @@
<ItemGroup> <ItemGroup>
<ClInclude Include="extra\win32\user_settings.h" /> <ClInclude Include="extra\win32\user_settings.h" />
<ClInclude Include="wolfssl\resource.h" /> <ClInclude Include="wolfssl\resource.h" />
<ClInclude Include="wolfssl\wolfssl\callbacks.h" />
<ClInclude Include="wolfssl\wolfssl\certs_test.h" />
<ClInclude Include="wolfssl\wolfssl\certs_test_sm.h" />
<ClInclude Include="wolfssl\wolfssl\crl.h" />
<ClInclude Include="wolfssl\wolfssl\error-ssl.h" />
<ClInclude Include="wolfssl\wolfssl\internal.h" />
<ClInclude Include="wolfssl\wolfssl\ocsp.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\aes.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\asn1.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\asn1t.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\bio.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\bn.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\buffer.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\camellia.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\cmac.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\cms.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\compat_types.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\conf.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\crypto.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\des.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\dh.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\dsa.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ec.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ec25519.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ec448.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ecdh.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ecdsa.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ed25519.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ed448.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\engine.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\err.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\evp.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\fips_rand.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\hmac.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\kdf.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\lhash.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\md4.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\md5.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\modes.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\objects.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\obj_mac.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ocsp.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\opensslconf.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\opensslv.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ossl_typ.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\pem.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\pkcs12.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\pkcs7.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\rand.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\rc4.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ripemd.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\rsa.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\safestack.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\sha.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\sha3.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\srp.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ssl.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ssl23.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\stack.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\tls1.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\txt_db.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\ui.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\x509.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\x509v3.h" />
<ClInclude Include="wolfssl\wolfssl\openssl\x509_vfy.h" />
<ClInclude Include="wolfssl\wolfssl\quic.h" />
<ClInclude Include="wolfssl\wolfssl\sniffer.h" />
<ClInclude Include="wolfssl\wolfssl\sniffer_error.h" />
<ClInclude Include="wolfssl\wolfssl\ssl.h" />
<ClInclude Include="wolfssl\wolfssl\test.h" />
<ClInclude Include="wolfssl\wolfssl\version.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\aes.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\aes.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\arc4.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\arc4.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\asn.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\asn.h" />
@@ -262,6 +166,8 @@
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\ed448.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\ed448.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\error-crypt.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\error-crypt.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\ext_kyber.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\ext_kyber.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\ext_lms.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\ext_xmss.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\falcon.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\falcon.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\fe_448.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\fe_448.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\fe_operations.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\fe_operations.h" />
@@ -274,6 +180,7 @@
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\integer.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\integer.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\kdf.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\kdf.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\kyber.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\kyber.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\lms.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\logging.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\logging.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\md2.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\md2.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\md4.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\md4.h" />
@@ -287,7 +194,6 @@
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\pkcs12.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\pkcs12.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\pkcs7.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\pkcs7.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\poly1305.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\poly1305.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\puf.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\pwdbased.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\pwdbased.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\random.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\random.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\rc2.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\rc2.h" />
@@ -306,6 +212,7 @@
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\sm3.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\sm3.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\sm4.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\sm4.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\sp.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\sp.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\sphincs.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\sp_int.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\sp_int.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\srp.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\srp.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\tfm.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\tfm.h" />
@@ -314,16 +221,12 @@
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_encrypt.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_encrypt.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_kyber.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_kyber.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_lms.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_lms.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_mldsa.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_mlkem.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_pkcs11.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_pkcs11.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_port.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_port.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_she.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_slhdsa.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_xmss.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\wc_xmss.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wolfevent.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\wolfevent.h" />
<ClInclude Include="wolfssl\wolfssl\wolfcrypt\wolfmath.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\wolfmath.h" />
<ClInclude Include="wolfssl\wolfssl\wolfio.h" /> <ClInclude Include="wolfssl\wolfssl\wolfcrypt\xmss.h" />
<CustomBuild Include="wolfssl\wolfcrypt\src\aes_asm.asm"> <CustomBuild Include="wolfssl\wolfcrypt\src\aes_asm.asm">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">false</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DLL Debug|x64'">false</ExcludedFromBuild>
@@ -344,7 +247,6 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ResourceCompile> </ResourceCompile>
<ResourceCompile Include="wolfssl\wolfssl\sniffer_error.rc" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="wolfssl\wolfssl\wolfcrypt\include.am" /> <None Include="wolfssl\wolfssl\wolfcrypt\include.am" />
+7 -7
View File
@@ -20,27 +20,27 @@ The following tools are required to build RPCS3 on Windows 10 or later:
with standalone **CMake** tool. with standalone **CMake** tool.
- [Python 3.6+](https://www.python.org/downloads/) (add to PATH) - [Python 3.6+](https://www.python.org/downloads/) (add to PATH)
- [Qt 6.11.1](https://www.qt.io/download-qt-installer) In case you can't download from the official installer, you can use [Another Qt installer](https://github.com/miurahr/aqtinstall) (In that case you will need to manually add the "qtmultimedia" module when installing Qt) - [Qt 6.11.0](https://www.qt.io/download-qt-installer) In case you can't download from the official installer, you can use [Another Qt installer](https://github.com/miurahr/aqtinstall) (In that case you will need to manually add the "qtmultimedia" module when installing Qt)
- [Vulkan SDK 1.4.341.1](https://vulkan.lunarg.com/sdk/home) (see "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/windows/getting_started.html)). Note that future SDKs may not work. - [Vulkan SDK 1.3.268.0](https://vulkan.lunarg.com/sdk/home) (see "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/windows/getting_started.html)) for now future SDKs don't work. You need precisely 1.3.268.0.
The `sln` solution available only on **Visual Studio** is the preferred building solution. It easily allows to build the **RPCS3** application in `Release` and `Debug` mode. The `sln` solution available only on **Visual Studio** is the preferred building solution. It easily allows to build the **RPCS3** application in `Release` and `Debug` mode.
In order to build **RPCS3** with the `sln` solution (with **Visual Studio**), **Qt** libs need to be detected. To detect the libs: In order to build **RPCS3** with the `sln` solution (with **Visual Studio**), **Qt** libs need to be detected. To detect the libs:
- add and set the `QTDIR` environment variable, e.g. `<QtInstallFolder>\6.11.1\msvc2022_64\` - add and set the `QTDIR` environment variable, e.g. `<QtInstallFolder>\6.11.0\msvc2022_64\`
- or use the [Visual Studio Qt Plugin](https://marketplace.visualstudio.com/items?itemName=TheQtCompany.QtVisualStudioTools2022) - or use the [Visual Studio Qt Plugin](https://marketplace.visualstudio.com/items?itemName=TheQtCompany.QtVisualStudioTools2022)
**NOTE:** If you have issues with the **Visual Studio Qt Plugin**, you may want to uninstall it and install the [Legacy Qt Plugin](https://marketplace.visualstudio.com/items?itemName=TheQtCompany.LEGACYQtVisualStudioTools2022) instead. **NOTE:** If you have issues with the **Visual Studio Qt Plugin**, you may want to uninstall it and install the [Legacy Qt Plugin](https://marketplace.visualstudio.com/items?itemName=TheQtCompany.LEGACYQtVisualStudioTools2022) instead.
In order to build **RPCS3** with the `CMake` solution (with both **Visual Studio** and standalone **CMake** tool): In order to build **RPCS3** with the `CMake` solution (with both **Visual Studio** and standalone **CMake** tool):
- add and set the `Qt6_ROOT` environment variable to the **Qt** libs path, e.g. `<QtInstallFolder>\6.11.1\msvc2022_64\` - add and set the `Qt6_ROOT` environment variable to the **Qt** libs path, e.g. `<QtInstallFolder>\6.11.0\msvc2022_64\`
### Linux ### Linux
These are the essentials tools to build RPCS3 on Linux. Some of them can be installed through your favorite package manager: These are the essentials tools to build RPCS3 on Linux. Some of them can be installed through your favorite package manager:
- Clang 17+ or GCC 13+ - Clang 17+ or GCC 13+
- [CMake 3.28.0+](https://www.cmake.org/download/) - [CMake 3.28.0+](https://www.cmake.org/download/)
- [Qt 6.11.1](https://www.qt.io/download-qt-installer) - [Qt 6.11.0](https://www.qt.io/download-qt-installer)
- [Vulkan SDK 1.4.341.1](https://vulkan.lunarg.com/sdk/home) (See "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/linux/getting_started.html)). Note that future SDKs may not work. - [Vulkan SDK 1.3.268.0](https://vulkan.lunarg.com/sdk/home) (See "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/linux/getting_started.html)) for now future SDKs don't work. You need precisely 1.3.268.0.
- [SDL3](https://github.com/libsdl-org/SDL/releases) (for the FAudio backend) - [SDL3](https://github.com/libsdl-org/SDL/releases) (for the FAudio backend)
**If you have an NVIDIA GPU, you may need to install the libglvnd package.** **If you have an NVIDIA GPU, you may need to install the libglvnd package.**
@@ -123,7 +123,7 @@ Start **Visual Studio**, click on `Open a project or solution` and select the `r
##### Configuring the Qt Plugin (if used) ##### Configuring the Qt Plugin (if used)
1) go to `Extensions->Qt VS Tools->Qt Versions` 1) go to `Extensions->Qt VS Tools->Qt Versions`
2) add the path to your Qt installation with compiler e.g. `<QtInstallFolder>\6.11.1\msvc2022_64`, version will fill in automatically 2) add the path to your Qt installation with compiler e.g. `<QtInstallFolder>\6.11.0\msvc2022_64`, version will fill in automatically
3) go to `Extensions->Qt VS Tools->Options->Legacy Project Format`. (Only available in the **Legacy Qt Plugin**) 3) go to `Extensions->Qt VS Tools->Options->Legacy Project Format`. (Only available in the **Legacy Qt Plugin**)
4) set `Build: Run pre-build setup` to `true`. (Only available in the **Legacy Qt Plugin**) 4) set `Build: Run pre-build setup` to `true`. (Only available in the **Legacy Qt Plugin**)
+2 -2
View File
@@ -94,8 +94,8 @@ if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
endif() endif()
if(APPLE AND CMAKE_OSX_ARCHITECTURES STREQUAL "arm64") if(APPLE AND CMAKE_OSX_ARCHITECTURES STREQUAL "arm64")
list(APPEND CMAKE_PREFIX_PATH "/opt/homebrew") include_directories(/opt/homebrew/include)
list(APPEND CMAKE_SYSTEM_PREFIX_PATH "/opt/homebrew") link_directories(/opt/homebrew/lib)
endif() endif()
if(MSVC) if(MSVC)
+1 -11
View File
@@ -9,7 +9,7 @@ The world's first free and open-source PlayStation 3 emulator/debugger, written
You can find some basic information on our [**website**](https://rpcs3.net/). Game info is being populated on the [**Wiki**](https://wiki.rpcs3.net/). You can find some basic information on our [**website**](https://rpcs3.net/). Game info is being populated on the [**Wiki**](https://wiki.rpcs3.net/).
For discussion about this emulator, PS3 emulation, and game compatibility reports, please visit our [**forums**](https://forums.rpcs3.net) and our [**Discord server**](https://discord.gg/RPCS3). For discussion about this emulator, PS3 emulation, and game compatibility reports, please visit our [**forums**](https://forums.rpcs3.net) and our [**Discord server**](https://discord.gg/RPCS3).
[**Support the Lead Developers on Patreon**](https://rpcs3.net/patreon) [**Support Lead Developers Nekotekina and kd-11 on Patreon**](https://www.patreon.com/Nekotekina)
## Contributing ## Contributing
@@ -23,16 +23,6 @@ If you want to contribute as a developer, please take a look at the following pa
You should also contact any of the developers in the forums or in the Discord server to learn more about the current state of the emulator. You should also contact any of the developers in the forums or in the Discord server to learn more about the current state of the emulator.
### AI Use
Use of AI tools for research and reverse engineering purposes is permitted. However, contributors are expected to fully own and understand all code they submit. Any communication with the team — including code, code comments, and GitHub comments — must come from the human contributor, not an AI agent acting autonomously.
We have unfortunately seen a rise in untested and unverified AI-generated slop being submitted to this project. This wastes maintainer time and, in worse cases, such changes get merged and break functionality for all users. Repeated violations will result in a ban from the repository. Please be respectful of everyone's time.
**Pull requests opened by AI agents or automated tools must include a disclosure in the PR description** stating the scope of AI involvement — which parts were AI-generated and what human testing or review was performed prior to submission. PRs that omit this disclosure may be closed without review.
If you are unsure about your work, open a discussion issue to talk it through with the team, or reach out to a maintainer on [Discord](https://discord.gg/RPCS3).
## Building ## Building
See [BUILDING.md](BUILDING.md) for more information about how to setup an environment to build RPCS3. See [BUILDING.md](BUILDING.md) for more information about how to setup an environment to build RPCS3.
+51 -119
View File
@@ -40,7 +40,7 @@ namespace cfg
owner->m_nodes.emplace_back(this); owner->m_nodes.emplace_back(this);
} }
bool _base::from_string(std::string_view /*value*/, bool /*dynamic*/) bool _base::from_string(std::string_view, bool)
{ {
cfg_log.fatal("cfg::_base::from_string() purecall"); cfg_log.fatal("cfg::_base::from_string() purecall");
return false; return false;
@@ -68,7 +68,7 @@ namespace cfg
// Incrementally load config entries from YAML::Node. // Incrementally load config entries from YAML::Node.
// The config value is preserved if the corresponding YAML node doesn't exist. // The config value is preserved if the corresponding YAML node doesn't exist.
[[nodiscard]] static bool decode(const YAML::Node& data, class _base& rhs, bool dynamic, bool strict); static void decode(const YAML::Node& data, class _base& rhs, bool dynamic = false);
} }
std::vector<std::string> cfg::make_int_range(s64 min, s64 max) std::vector<std::string> cfg::make_int_range(s64 min, s64 max)
@@ -76,11 +76,11 @@ std::vector<std::string> cfg::make_int_range(s64 min, s64 max)
return {std::to_string(min), std::to_string(max)}; return {std::to_string(min), std::to_string(max)};
} }
bool try_to_int64(s64* out, std::string_view value, s64 min, s64 max, std::string_view name) bool try_to_int64(s64* out, std::string_view value, s64 min, s64 max)
{ {
if (value.empty()) if (value.empty())
{ {
if (out) cfg_log.error("cfg::try_to_int64('%s'): called with an empty string", name); if (out) cfg_log.error("cfg::try_to_int64(): called with an empty string");
return false; return false;
} }
@@ -107,7 +107,7 @@ bool try_to_int64(s64* out, std::string_view value, s64 min, s64 max, std::strin
if (ret.ec != std::errc() || ret.ptr != end || (start[0] == '-' && sign < 0)) if (ret.ec != std::errc() || ret.ptr != end || (start[0] == '-' && sign < 0))
{ {
if (out) cfg_log.error("cfg::try_to_int64('%s', '%s'): invalid integer", value, name); if (out) cfg_log.error("cfg::try_to_int64('%s'): invalid integer", value);
return false; return false;
} }
@@ -115,7 +115,7 @@ bool try_to_int64(s64* out, std::string_view value, s64 min, s64 max, std::strin
if (result < min || result > max) if (result < min || result > max)
{ {
if (out) cfg_log.error("cfg::try_to_int64('%s', '%s'): out of bounds (val=%d, min=%d, max=%d)", value, name, result, min, max); if (out) cfg_log.error("cfg::try_to_int64('%s'): out of bounds (val=%d, min=%d, max=%d)", value, result, min, max);
return false; return false;
} }
@@ -128,11 +128,11 @@ std::vector<std::string> cfg::make_uint_range(u64 min, u64 max)
return {std::to_string(min), std::to_string(max)}; return {std::to_string(min), std::to_string(max)};
} }
bool try_to_uint64(u64* out, std::string_view value, u64 min, u64 max, std::string_view name) bool try_to_uint64(u64* out, std::string_view value, u64 min, u64 max)
{ {
if (value.empty()) if (value.empty())
{ {
if (out) cfg_log.error("cfg::try_to_uint64('%s'): called with an empty string", name); if (out) cfg_log.error("cfg::try_to_uint64(): called with an empty string");
return false; return false;
} }
@@ -152,13 +152,13 @@ bool try_to_uint64(u64* out, std::string_view value, u64 min, u64 max, std::stri
if (ret.ec != std::errc() || ret.ptr != end) if (ret.ec != std::errc() || ret.ptr != end)
{ {
if (out) cfg_log.error("cfg::try_to_uint64('%s', '%s'): invalid integer", value, name); if (out) cfg_log.error("cfg::try_to_uint64('%s'): invalid integer", value);
return false; return false;
} }
if (result < min || result > max) if (result < min || result > max)
{ {
if (out) cfg_log.error("cfg::try_to_uint64('%s', '%s'): out of bounds (val=%u, min=%u, max=%u)", value, name, result, min, max); if (out) cfg_log.error("cfg::try_to_uint64('%s'): out of bounds (val=%u, min=%u, max=%u)", value, result, min, max);
return false; return false;
} }
@@ -166,11 +166,11 @@ bool try_to_uint64(u64* out, std::string_view value, u64 min, u64 max, std::stri
return true; return true;
} }
bool try_to_uint128(u128* out, std::string_view value, std::string_view name) bool try_to_uint128(u128* out, std::string_view value)
{ {
if (value.empty()) if (value.empty())
{ {
if (out) cfg_log.error("cfg::try_to_uint128('%s'): called with an empty string", name); if (out) cfg_log.error("cfg::try_to_uint128(): called with an empty string");
return false; return false;
} }
@@ -193,7 +193,7 @@ bool try_to_uint128(u128* out, std::string_view value, std::string_view name)
if (ret.ec != std::errc() || ret.ptr != end) if (ret.ec != std::errc() || ret.ptr != end)
{ {
if (out) cfg_log.error("cfg::try_to_uint128('%s', '%s'): invalid integer", value, name); if (out) cfg_log.error("cfg::try_to_uint128('%s'): invalid integer", value);
return false; return false;
} }
@@ -207,7 +207,7 @@ bool try_to_uint128(u128* out, std::string_view value, std::string_view name)
if (ret.ec != std::errc() || ret.ptr != start_low64) if (ret.ec != std::errc() || ret.ptr != start_low64)
{ {
if (out) cfg_log.error("cfg::try_to_uint128('%s', '%s'): invalid integer", value, name); if (out) cfg_log.error("cfg::try_to_uint128('%s'): invalid integer", value);
return false; return false;
} }
@@ -220,11 +220,11 @@ std::vector<std::string> cfg::make_float_range(f64 min, f64 max)
return {std::to_string(min), std::to_string(max)}; return {std::to_string(min), std::to_string(max)};
} }
bool try_to_float(f64* out, std::string_view value, f64 min, f64 max, std::string_view name) bool try_to_float(f64* out, std::string_view value, f64 min, f64 max)
{ {
if (value.empty()) if (value.empty())
{ {
if (out) cfg_log.error("cfg::try_to_float('%s'): called with an empty string", name); if (out) cfg_log.error("cfg::try_to_float(): called with an empty string");
return false; return false;
} }
@@ -237,13 +237,13 @@ bool try_to_float(f64* out, std::string_view value, f64 min, f64 max, std::strin
if (end_check != str.data() + str.size()) if (end_check != str.data() + str.size())
{ {
if (out) cfg_log.error("cfg::try_to_float('%s', '%s'): invalid float", value, name); if (out) cfg_log.error("cfg::try_to_float('%s'): invalid float", value);
return false; return false;
} }
if (result < min || result > max) if (result < min || result > max)
{ {
if (out) cfg_log.error("cfg::try_to_float('%s', '%s'): out of bounds (val=%f, min=%f, max=%f)", value, name, result, min, max); if (out) cfg_log.error("cfg::try_to_float('%s'): out of bounds (val=%f, min=%f, max=%f)", value, result, min, max);
return false; return false;
} }
@@ -251,8 +251,12 @@ bool try_to_float(f64* out, std::string_view value, f64 min, f64 max, std::strin
return true; return true;
} }
bool try_to_string(std::string* out, f64 value, std::string_view name) bool try_to_string(std::string* out, const f64& value)
{ {
#ifdef __APPLE__
if (out) *out = std::to_string(value);
return true;
#else
std::array<char, 32> str{}; std::array<char, 32> str{};
if (auto [ptr, ec] = std::to_chars(str.data(), str.data() + str.size(), value, std::chars_format::fixed); ec == std::errc()) if (auto [ptr, ec] = std::to_chars(str.data(), str.data() + str.size(), value, std::chars_format::fixed); ec == std::errc())
@@ -262,15 +266,14 @@ bool try_to_string(std::string* out, f64 value, std::string_view name)
} }
else else
{ {
if (out) cfg_log.error("cfg::try_to_string('%s'): could not convert value '%f' to string. error='%s'", name, value, std::make_error_code(ec).message()); if (out) cfg_log.error("cfg::try_to_string(): could not convert value '%f' to string. error='%s'", value, std::make_error_code(ec).message());
return false; return false;
} }
#endif
} }
bool cfg::try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) func, std::string_view value, std::string_view name) bool cfg::try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) func, std::string_view value)
{ {
ensure(func);
u64 max = umax; u64 max = umax;
for (u64 i = 0;; i++) for (u64 i = 0;; i++)
@@ -299,7 +302,7 @@ bool cfg::try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) f
const char* end = start + value.size(); const char* end = start + value.size();
int base = 10; int base = 10;
if (value.size() >= 2 && start[0] == '0' && (start[1] == 'x' || start[1] == 'X')) if (start[0] == '0' && (start[1] == 'x' || start[1] == 'X'))
{ {
// Limited hex support // Limited hex support
base = 16; base = 16;
@@ -310,13 +313,13 @@ bool cfg::try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) f
if (ret.ec != std::errc() || ret.ptr != end) if (ret.ec != std::errc() || ret.ptr != end)
{ {
if (out) cfg_log.error("cfg::try_to_enum_value('%s', '%s'): invalid enum or integer", value, name); if (out) cfg_log.error("cfg::try_to_enum_value('%s'): invalid enum or integer", value);
return false; return false;
} }
if (result > max) if (result > max)
{ {
if (out) cfg_log.error("cfg::try_to_enum_value('%s', '%s'): out of bounds(val=%u, min=0, max=%u)", value, name, result, max); if (out) cfg_log.error("cfg::try_to_enum_value('%s'): out of bounds(val=%u, min=0, max=%u)", value, result, max);
return false; return false;
} }
@@ -465,50 +468,37 @@ void cfg::encode(YAML::Emitter& out, const cfg::_base& rhs)
} }
} }
bool cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic, bool strict) void cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic)
{ {
if (dynamic && !rhs.get_is_dynamic()) if (dynamic && !rhs.get_is_dynamic())
{ {
return true; return;
} }
switch (rhs.get_type()) switch (rhs.get_type())
{ {
case type::node: case type::node:
{ {
if (!data.IsMap()) if (data.IsScalar() || data.IsSequence())
{ {
cfg_log.error("node node is not a map"); return; // ???
return false;
} }
bool success = true;
for (const auto& pair : data) for (const auto& pair : data)
{ {
if (!pair.first.IsScalar()) continue; if (!pair.first.IsScalar()) continue;
// Find the key among existing nodes // Find the key among existing nodes
const auto& nodes = static_cast<node&>(rhs).get_nodes(); for (const auto& node : static_cast<node&>(rhs).get_nodes())
const auto it = std::find_if(nodes.cbegin(), nodes.cend(), [&pair](const auto& node) { return ensure(node)->get_name() == pair.first.Scalar(); });
if (it == nodes.cend())
{ {
if (strict) if (node->get_name() == pair.first.Scalar())
{ {
cfg_log.error("Unknown key found: '%s'", pair.first.Scalar()); decode(pair.second, *node, dynamic);
success = false;
} }
continue;
}
if (!decode(pair.second, *ensure(*it), dynamic, strict) && strict)
{
success = false;
} }
} }
return success; break;
} }
case type::set: case type::set:
{ {
@@ -516,10 +506,7 @@ bool cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic, bool str
if (YAML::convert<decltype(values)>::decode(data, values)) if (YAML::convert<decltype(values)>::decode(data, values))
{ {
if (!rhs.from_list(std::move(values)) && strict) rhs.from_list(std::move(values));
{
return false;
}
} }
break; break;
@@ -529,8 +516,7 @@ bool cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic, bool str
{ {
if (!data.IsMap()) if (!data.IsMap())
{ {
cfg_log.error("map node is not a map"); return;
return false;
} }
map_of_type<std::string> values; map_of_type<std::string> values;
@@ -547,36 +533,22 @@ bool cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic, bool str
} }
case type::log: case type::log:
{ {
if (!data.IsMap()) if (data.IsScalar() || data.IsSequence())
{ {
cfg_log.error("log node is not a map"); return; // ???
return false;
} }
map_of_type<logs::level> values; map_of_type<logs::level> values;
for (const auto& pair : data) for (const auto& pair : data)
{ {
if (!pair.first.IsScalar() || !pair.second.IsScalar()) if (!pair.first.IsScalar() || !pair.second.IsScalar()) continue;
{
if (strict)
{
if (!pair.first.IsScalar())
cfg_log.error("Key in map is not a scalar");
else
cfg_log.error("Value in map is not a scalar. key='%s'", pair.first.Scalar());
return false;
}
continue;
}
u64 value; u64 value;
if (!cfg::try_to_enum_value(&value, &fmt_class_string<logs::level>::format, pair.second.Scalar(), pair.first.Scalar()) && strict) if (cfg::try_to_enum_value(&value, &fmt_class_string<logs::level>::format, pair.second.Scalar()))
{ {
return false; values.emplace(pair.first.Scalar(), static_cast<logs::level>(static_cast<int>(value)));
} }
values.emplace(pair.first.Scalar(), static_cast<logs::level>(static_cast<int>(value)));
} }
static_cast<log_entry&>(rhs).set_map(std::move(values)); static_cast<log_entry&>(rhs).set_map(std::move(values));
@@ -586,43 +558,20 @@ bool cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic, bool str
{ {
if (!data.IsMap()) if (!data.IsMap())
{ {
cfg_log.error("device node is not a map"); return; // ???
return false;
} }
map_of_type<device_info> values; map_of_type<device_info> values;
for (const auto& pair : data) for (const auto& pair : data)
{ {
if (!pair.first.IsScalar() || !pair.second.IsMap()) if (!pair.first.IsScalar() || !pair.second.IsMap()) continue;
{
if (strict)
{
if (!pair.first.IsScalar())
cfg_log.error("Key in device map is not a scalar");
else
cfg_log.error("Value in device map is not a map. key='%s'", pair.first.Scalar());
return false;
}
continue;
}
device_info info{}; device_info info{};
for (const auto& key_value : pair.second) for (const auto& key_value : pair.second)
{ {
if (!key_value.first.IsScalar() || !key_value.second.IsScalar()) if (!key_value.first.IsScalar() || !key_value.second.IsScalar()) continue;
{
if (strict)
{
if (!key_value.first.IsScalar())
cfg_log.error("Key in device info map is not a scalar");
else
cfg_log.error("Value in device map is not a scalar. key='%s'", key_value.first.Scalar());
return false;
}
continue;
}
if (key_value.first.Scalar() == "Path") if (key_value.first.Scalar() == "Path")
info.path = key_value.second.Scalar(); info.path = key_value.second.Scalar();
@@ -649,17 +598,12 @@ bool cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic, bool str
if (YAML::convert<std::string>::decode(data, value)) if (YAML::convert<std::string>::decode(data, value))
{ {
if (!rhs.from_string(value, dynamic) && strict) rhs.from_string(value, dynamic);
{
return false;
}
} }
break; // ??? break; // ???
} }
} }
return true;
} }
std::string cfg::node::to_string() const std::string cfg::node::to_string() const
@@ -676,7 +620,8 @@ bool cfg::node::from_string(std::string_view value, bool dynamic)
if (error.empty()) if (error.empty())
{ {
return cfg::decode(result, *this, dynamic, false); cfg::decode(result, *this, dynamic);
return true;
} }
cfg_log.error("Failed to load node: %s", error); cfg_log.error("Failed to load node: %s", error);
@@ -699,19 +644,6 @@ void cfg::node::restore_defaults()
} }
} }
bool cfg::node::validate(std::string_view value)
{
auto [result, error] = yaml_load(std::string(value));
if (error.empty())
{
return cfg::decode(result, *this, false, true);
}
cfg_log.error("Failed to load node: %s", error);
return false;
}
std::string cfg::map_entry::get_value(std::string_view key) std::string cfg::map_entry::get_value(std::string_view key)
{ {
if (auto it = m_map.find(key); it != m_map.end()) if (auto it = m_map.find(key); it != m_map.end())
@@ -757,7 +689,7 @@ void cfg::log_entry::from_default()
std::pair<u16, u16> cfg::device_info::get_usb_ids() const std::pair<u16, u16> cfg::device_info::get_usb_ids() const
{ {
auto string_to_hex = [](std::string_view str) -> u16 auto string_to_hex = [](const std::string& str) -> u16
{ {
u16 value = 0x0000; u16 value = 0x0000;
if (!str.empty() && std::from_chars(str.data(), str.data() + str.size(), value, 16).ec != std::errc{}) if (!str.empty() && std::from_chars(str.data(), str.data() + str.size(), value, 16).ec != std::errc{})
+9 -17
View File
@@ -25,7 +25,7 @@ namespace cfg
std::vector<std::string> make_float_range(f64 min, f64 max); std::vector<std::string> make_float_range(f64 min, f64 max);
// Internal hack // Internal hack
bool try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) func, std::string_view value, std::string_view name = {}); bool try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) func, std::string_view);
// Internal hack // Internal hack
std::vector<std::string> try_to_enum_list(decltype(&fmt_class_string<int>::format) func); std::vector<std::string> try_to_enum_list(decltype(&fmt_class_string<int>::format) func);
@@ -110,7 +110,7 @@ namespace cfg
} }
// Try to convert from string (optional) // Try to convert from string (optional)
virtual bool from_string(std::string_view value, bool dynamic = false); virtual bool from_string(std::string_view, bool /*dynamic*/ = false);
// Get string list (optional) // Get string list (optional)
virtual std::vector<std::string> to_list() const virtual std::vector<std::string> to_list() const
@@ -161,9 +161,6 @@ namespace cfg
// Restore default members // Restore default members
void restore_defaults() override; void restore_defaults() override;
// Try to convert from string and validate
bool validate(std::string_view value);
}; };
class _bool final : public _base class _bool final : public _base
@@ -304,7 +301,7 @@ namespace cfg
{ {
u64 result; u64 result;
if (try_to_enum_value(&result, &fmt_class_string<T>::format, value, m_name)) if (try_to_enum_value(&result, &fmt_class_string<T>::format, value))
{ {
// No narrowing check, it's hard to do right there // No narrowing check, it's hard to do right there
m_value = static_cast<T>(static_cast<std::underlying_type_t<T>>(result)); m_value = static_cast<T>(static_cast<std::underlying_type_t<T>>(result));
@@ -385,7 +382,7 @@ namespace cfg
bool from_string(std::string_view value, bool /*dynamic*/ = false) override bool from_string(std::string_view value, bool /*dynamic*/ = false) override
{ {
s64 result; s64 result;
if (try_to_int64(&result, value, Min, Max, m_name)) if (try_to_int64(&result, value, Min, Max))
{ {
m_value = static_cast<int_type>(result); m_value = static_cast<int_type>(result);
return true; return true;
@@ -454,7 +451,7 @@ namespace cfg
std::string to_string() const override std::string to_string() const override
{ {
std::string result; std::string result;
if (try_to_string(&result, m_value, m_name)) if (try_to_string(&result, m_value))
{ {
return result; return result;
} }
@@ -465,7 +462,7 @@ namespace cfg
std::string def_to_string() const override std::string def_to_string() const override
{ {
std::string result; std::string result;
if (try_to_string(&result, def, m_name)) if (try_to_string(&result, def))
{ {
return result; return result;
} }
@@ -476,7 +473,7 @@ namespace cfg
bool from_string(std::string_view value, bool /*dynamic*/ = false) override bool from_string(std::string_view value, bool /*dynamic*/ = false) override
{ {
f64 result; f64 result;
if (try_to_float(&result, value, Min, Max, m_name)) if (try_to_float(&result, value, Min, Max))
{ {
m_value = static_cast<float_type>(result); m_value = static_cast<float_type>(result);
return true; return true;
@@ -563,7 +560,7 @@ namespace cfg
bool from_string(std::string_view value, bool /*dynamic*/ = false) override bool from_string(std::string_view value, bool /*dynamic*/ = false) override
{ {
u64 result; u64 result;
if (try_to_uint64(&result, value, Min, Max, m_name)) if (try_to_uint64(&result, value, Min, Max))
{ {
m_value = static_cast<int_type>(result); m_value = static_cast<int_type>(result);
return true; return true;
@@ -649,7 +646,7 @@ namespace cfg
bool from_string(std::string_view value, bool /*dynamic*/ = false) override bool from_string(std::string_view value, bool /*dynamic*/ = false) override
{ {
u128 result; u128 result;
if (try_to_uint128(&result, value, m_name)) if (try_to_uint128(&result, value))
{ {
m_value = result; m_value = result;
return true; return true;
@@ -717,11 +714,6 @@ namespace cfg
m_value = std::string(value); m_value = std::string(value);
return true; return true;
} }
void set(std::string_view value)
{
m_value = std::string(value);
}
}; };
// Simple set entry (TODO: template for various types) // Simple set entry (TODO: template for various types)
+7 -111
View File
@@ -26,7 +26,6 @@ std::string g_android_cache_dir;
#include <cwchar> #include <cwchar>
#include <Windows.h> #include <Windows.h>
#include <winioctl.h>
static std::unique_ptr<wchar_t[]> to_wchar(std::string_view source) static std::unique_ptr<wchar_t[]> to_wchar(std::string_view source)
{ {
@@ -39,17 +38,6 @@ static std::unique_ptr<wchar_t[]> to_wchar(std::string_view source)
// Buffer for max possible output length // Buffer for max possible output length
std::unique_ptr<wchar_t[]> buffer(new wchar_t[buf_size + 8 + 32768]); std::unique_ptr<wchar_t[]> buffer(new wchar_t[buf_size + 8 + 32768]);
// If path points to an optical raw device, copy it AS IS
if (fs::is_optical_raw_device(std::string(source)))
{
ensure(MultiByteToWideChar(CP_UTF8, 0, source.data(), size, buffer.get() + 32768, size)); // "to_wchar"
// Canonicalize wide path (replace '/', ".", "..", \\ repetitions, etc)
ensure(GetFullPathNameW(buffer.get() + 32768, 32768, buffer.get(), nullptr) - 1 < 32768 - 1); // "to_wchar"
return buffer;
}
// Prepend wide path prefix (4 characters) // Prepend wide path prefix (4 characters)
std::memcpy(buffer.get() + 32768, L"\\\\\?\\", 4 * sizeof(wchar_t)); std::memcpy(buffer.get() + 32768, L"\\\\\?\\", 4 * sizeof(wchar_t));
@@ -178,7 +166,6 @@ static fs::error to_error(int e)
case ENOTEMPTY: return fs::error::notempty; case ENOTEMPTY: return fs::error::notempty;
case EROFS: return fs::error::readonly; case EROFS: return fs::error::readonly;
case EISDIR: return fs::error::isdir; case EISDIR: return fs::error::isdir;
case ENOTDIR: return fs::error::notdir;
case ENOSPC: return fs::error::nospace; case ENOSPC: return fs::error::nospace;
case EXDEV: return fs::error::xdev; case EXDEV: return fs::error::xdev;
default: return fs::error::unknown; default: return fs::error::unknown;
@@ -412,12 +399,11 @@ namespace fs
class windows_file final : public file_base class windows_file final : public file_base
{ {
HANDLE m_handle; HANDLE m_handle;
bool m_raw_device;
atomic_t<u64> m_pos {0}; atomic_t<u64> m_pos {0};
public: public:
windows_file(HANDLE handle, bool raw_device = false) windows_file(HANDLE handle)
: m_handle(handle), m_raw_device(raw_device) : m_handle(handle)
{ {
} }
@@ -577,20 +563,11 @@ namespace fs
u64 size() override u64 size() override
{ {
if (!m_raw_device) // NOTE: this can fail if we access a mounted empty drive (e.g. after unmounting an iso).
{ LARGE_INTEGER size;
// NOTE: this can fail if we access a mounted empty drive (e.g. after unmounting an iso). ensure(GetFileSizeEx(m_handle, &size)); // "file::size"
LARGE_INTEGER size;
ensure(GetFileSizeEx(m_handle, &size)); // "file::size" return size.QuadPart;
return size.QuadPart;
}
// For a raw device, we need to use DeviceIoControl.
DISK_GEOMETRY_EX geometry;
ensure(DeviceIoControl(m_handle, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, nullptr, 0, &geometry, sizeof(geometry), nullptr, nullptr));
return geometry.DiskSize.QuadPart;
} }
native_handle get_handle() override native_handle get_handle() override
@@ -1113,55 +1090,6 @@ bool fs::is_symlink(const std::string& path)
return true; return true;
} }
bool fs::is_optical_raw_device([[maybe_unused]] const std::string& path)
{
#ifdef _WIN32
if (path.starts_with("\\\\.\\"))
{
return true;
}
#endif
return false;
}
bool fs::get_optical_raw_device(const std::string& path, std::string* raw_device)
{
if (fs::is_optical_raw_device(path))
{
if (raw_device)
{
*raw_device = path;
}
return true;
}
#ifdef _WIN32
// Skip a useless check to detect an optical raw device if navigating on subfolders (e.g. C:\subfolder_1\subfolder_2\),
// it means we are on a HDD/SSD. A path for an optical drive should include only the drive letter (e.g. E:\)
const size_t drive_delim_pos = path.find_first_of(":");
if (drive_delim_pos != 1 || drive_delim_pos != path.find_last_not_of(delim))
{
return false;
}
const std::string drive_letter = path.substr(0, drive_delim_pos + 1); // e.g. "E:"
const std::string drive_path = drive_letter + "\\"; // e.g. "E:\"
if (GetDriveTypeA(drive_path.c_str()) == DRIVE_CDROM)
{
if (raw_device)
{
*raw_device = "\\\\.\\" + drive_letter;
}
return true;
}
#endif
return false;
}
bool fs::statfs(const std::string& path, fs::device_stat& info) bool fs::statfs(const std::string& path, fs::device_stat& info)
{ {
if (auto device = get_virtual_device(path)) if (auto device = get_virtual_device(path))
@@ -1729,29 +1657,9 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
return; return;
} }
// If path points to an optical raw device, complete the file opening
// (the following GetFileInformationByHandle() would always fail on a raw device).
if (is_optical_raw_device(path))
{
DISK_GEOMETRY_EX geometry;
// Try to retrieve information on content. If it fails, no disc is probably mounted so abort the file opening
if (!DeviceIoControl(handle, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, nullptr, 0, &geometry, sizeof(geometry), nullptr, nullptr))
{
const DWORD last_error = GetLastError();
CloseHandle(handle);
g_tls_error = to_error(last_error);
return;
}
m_file = std::make_unique<windows_file>(handle, true);
return;
}
// Check if the handle is actually valid. // Check if the handle is actually valid.
// This can fail on empty mounted drives (e.g. with ERROR_NOT_READY or ERROR_INVALID_FUNCTION). // This can fail on empty mounted drives (e.g. with ERROR_NOT_READY or ERROR_INVALID_FUNCTION).
BY_HANDLE_FILE_INFORMATION info{}; BY_HANDLE_FILE_INFORMATION info{};
if (!GetFileInformationByHandle(handle, &info)) if (!GetFileInformationByHandle(handle, &info))
{ {
const DWORD last_error = GetLastError(); const DWORD last_error = GetLastError();
@@ -1762,7 +1670,7 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
g_tls_error = fs::error::isdir; g_tls_error = fs::error::isdir;
return; return;
} }
g_tls_error = to_error(last_error); g_tls_error = to_error(last_error);
return; return;
} }
@@ -1964,17 +1872,6 @@ fs::native_handle fs::file::get_handle() const
#endif #endif
} }
bool fs::set_sparse([[maybe_unused]] const fs::file& file)
{
#ifdef _WIN32
FILE_SET_SPARSE_BUFFER sparse{TRUE};
DWORD returned = 0;
return DeviceIoControl(file.get_handle(), FSCTL_SET_SPARSE, &sparse, sizeof(sparse), nullptr, 0, &returned, nullptr) != FALSE;
#else
return true;
#endif
}
fs::file_id fs::file::get_id() const fs::file_id fs::file::get_id() const
{ {
if (m_file) if (m_file)
@@ -2936,7 +2833,6 @@ void fmt_class_string<fs::error>::format(std::string& out, u64 arg)
case fs::error::notempty: return "Not empty"; case fs::error::notempty: return "Not empty";
case fs::error::readonly: return "Read only"; case fs::error::readonly: return "Read only";
case fs::error::isdir: return "Is a directory"; case fs::error::isdir: return "Is a directory";
case fs::error::notdir: return "Not a directory";
case fs::error::toolong: return "Path too long"; case fs::error::toolong: return "Path too long";
case fs::error::nospace: return "Not enough space on the device"; case fs::error::nospace: return "Not enough space on the device";
case fs::error::xdev: return "Device mismatch"; case fs::error::xdev: return "Device mismatch";
-10
View File
@@ -213,12 +213,6 @@ namespace fs
// Check whether the path points to an existing symlink // Check whether the path points to an existing symlink
bool is_symlink(const std::string& path); bool is_symlink(const std::string& path);
// Check whether the path points to a raw device
bool is_optical_raw_device(const std::string& path);
// Check whether the path points to an optical drive. If so, provide the raw device in "raw_device" if requested
bool get_optical_raw_device(const std::string& path, std::string* raw_device = nullptr);
// Get filesystem information // Get filesystem information
bool statfs(const std::string& path, device_stat& info); bool statfs(const std::string& path, device_stat& info);
@@ -496,9 +490,6 @@ namespace fs
} }
}; };
// Enable sparse-file semantics when required by the host platform.
bool set_sparse(const file& file);
class dir final class dir final
{ {
std::unique_ptr<dir_base> m_dir{}; std::unique_ptr<dir_base> m_dir{};
@@ -692,7 +683,6 @@ namespace fs
notempty, notempty,
readonly, readonly,
isdir, isdir,
notdir,
toolong, toolong,
nospace, nospace,
xdev, xdev,
+6 -40
View File
@@ -244,6 +244,7 @@ namespace asmjit
void vec_load_unaligned(u32 esize, const Operand& v, const x86::Mem& src); void vec_load_unaligned(u32 esize, const Operand& v, const x86::Mem& src);
void vec_store_unaligned(u32 esize, const Operand& v, const x86::Mem& dst); void vec_store_unaligned(u32 esize, const Operand& v, const x86::Mem& dst);
void vec_partial_move(u32 esize, const Operand& dst, const Operand& src);
void _vec_binary_op(x86::Inst::Id sse_op, x86::Inst::Id vex_op, x86::Inst::Id evex_op, const Operand& dst, const Operand& lhs, const Operand& rhs); void _vec_binary_op(x86::Inst::Id sse_op, x86::Inst::Id vex_op, x86::Inst::Id evex_op, const Operand& dst, const Operand& lhs, const Operand& rhs);
@@ -433,35 +434,13 @@ namespace asmjit
#endif #endif
} }
#ifdef __APPLE__
struct jit_write_guard
{
jit_write_guard() noexcept
{
pthread_jit_write_protect_np(false);
// Ensure stores are not reordered by the compiler
atomic_fence_acq_rel();
}
~jit_write_guard() noexcept
{
// Ensure stores are not reordered by the compiler
atomic_fence_seq_cst();
pthread_jit_write_protect_np(true);
}
};
#else
#define jit_write_guard [[maybe_unused]] int
#endif
// Build runtime function with asmjit::X86Assembler // Build runtime function with asmjit::X86Assembler
template <typename FT, typename Asm = native_asm, typename F> template <typename FT, typename Asm = native_asm, typename F>
inline FT build_function_asm(std::string_view name, F&& builder, ::jit_runtime* custom_runtime = nullptr, bool reduced_size = false) inline FT build_function_asm(std::string_view name, F&& builder, ::jit_runtime* custom_runtime = nullptr, bool reduced_size = false)
{ {
jit_write_guard jit_guard; #ifdef __APPLE__
pthread_jit_write_protect_np(false);
#endif
using namespace asmjit; using namespace asmjit;
auto& rt = custom_runtime ? *custom_runtime : get_global_runtime(); auto& rt = custom_runtime ? *custom_runtime : get_global_runtime();
@@ -514,10 +493,6 @@ inline FT build_function_asm(std::string_view name, F&& builder, ::jit_runtime*
return reinterpret_cast<FT>(uptr(result)); return reinterpret_cast<FT>(uptr(result));
} }
#if defined(__INTELLISENSE__) && !defined(LLVM_AVAILABLE)
#define LLVM_AVAILABLE
#endif
#ifdef LLVM_AVAILABLE #ifdef LLVM_AVAILABLE
namespace llvm namespace llvm
@@ -546,7 +521,7 @@ class jit_compiler final
atomic_t<usz> m_disk_space = umax; atomic_t<usz> m_disk_space = umax;
public: public:
jit_compiler(const std::unordered_map<std::string, u64>& _link, std::string_view _cpu, u32 flags = 0, std::function<u64(const std::string&)> symbols_cement = {}) noexcept; jit_compiler(const std::unordered_map<std::string, u64>& _link, const std::string& _cpu, u32 flags = 0, std::function<u64(const std::string&)> symbols_cement = {}) noexcept;
jit_compiler& operator=(thread_state) noexcept; jit_compiler& operator=(thread_state) noexcept;
~jit_compiler() noexcept; ~jit_compiler() noexcept;
@@ -564,15 +539,9 @@ public:
// Add module (path to obj cache dir) // Add module (path to obj cache dir)
void add(std::unique_ptr<llvm::Module> _module, const std::string& path); void add(std::unique_ptr<llvm::Module> _module, const std::string& path);
// Returns false after LLVM fatal recovery. The compiler must be discarded.
bool try_add(std::unique_ptr<llvm::Module> _module, const std::string& path, std::string& error);
// Add module (not cached) // Add module (not cached)
void add(std::unique_ptr<llvm::Module> _module); void add(std::unique_ptr<llvm::Module> _module);
// Returns false after LLVM fatal recovery. The compiler must be discarded.
bool try_add(std::unique_ptr<llvm::Module> _module, std::string& error);
// Add object (path to obj file) // Add object (path to obj file)
bool add(const std::string& path); bool add(const std::string& path);
@@ -585,14 +554,11 @@ public:
// Finalize // Finalize
void fin(); void fin();
// Returns false after LLVM fatal recovery. The compiler must be discarded.
bool try_fin(std::string& error);
// Get compiled function address // Get compiled function address
u64 get(const std::string& name); u64 get(const std::string& name);
// Get CPU info // Get CPU info
static std::string cpu(std::string_view _cpu); static std::string cpu(const std::string& _cpu);
// Get system triple (PPU) // Get system triple (PPU)
static std::string triple1(); static std::string triple1();
+4 -4
View File
@@ -122,7 +122,7 @@ static u8* get_jit_memory()
// Reserve 2G memory (magic static) // Reserve 2G memory (magic static)
static void* const s_memory2 = []() -> void* static void* const s_memory2 = []() -> void*
{ {
void* ptr = utils::memory_reserve(0x80000000, true); void* ptr = utils::memory_reserve(0x80000000);
#ifdef CAN_OVERCOMMIT #ifdef CAN_OVERCOMMIT
utils::memory_commit(ptr, 0x80000000); utils::memory_commit(ptr, 0x80000000);
utils::memory_protect(ptr, 0x40000000, utils::protection::wx); utils::memory_protect(ptr, 0x40000000, utils::protection::wx);
@@ -316,10 +316,10 @@ void jit_runtime::finalize() noexcept
#endif #endif
// Reset JIT memory // Reset JIT memory
#ifdef CAN_OVERCOMMIT #ifdef CAN_OVERCOMMIT
utils::memory_reset(get_jit_memory(), 0x80000000, true); utils::memory_reset(get_jit_memory(), 0x80000000);
utils::memory_protect(get_jit_memory(), 0x40000000, utils::protection::wx); utils::memory_protect(get_jit_memory(), 0x40000000, utils::protection::wx);
#else #else
utils::memory_decommit(get_jit_memory(), 0x80000000, true); utils::memory_decommit(get_jit_memory(), 0x80000000);
#endif #endif
s_code_pos = 0; s_code_pos = 0;
@@ -348,7 +348,7 @@ jit_runtime_base& asmjit::get_global_runtime()
{ {
custom_runtime() noexcept custom_runtime() noexcept
{ {
ensure(m_pos.raw() = static_cast<uchar*>(utils::memory_reserve(size, true))); ensure(m_pos.raw() = static_cast<uchar*>(utils::memory_reserve(size)));
// Initialize "end" pointer // Initialize "end" pointer
m_max = m_pos + size; m_max = m_pos + size;
+5 -120
View File
@@ -12,10 +12,6 @@
#include <charconv> #include <charconv>
#if defined(__APPLE__)
#include <pthread.h>
#endif
LOG_CHANNEL(jit_log, "JIT"); LOG_CHANNEL(jit_log, "JIT");
#ifdef LLVM_AVAILABLE #ifdef LLVM_AVAILABLE
@@ -54,44 +50,6 @@ LOG_CHANNEL(jit_log, "JIT");
#include "Emu/CPU/Backends/AArch64/AArch64Common.h" #include "Emu/CPU/Backends/AArch64/AArch64Common.h"
#endif #endif
namespace
{
thread_local std::string* g_llvm_fatal_message = nullptr;
template <typename F>
bool run_recoverable_llvm(F&& func, std::string& error)
{
error.clear();
// Run LLVM codegen in a disposable thread. If LLVM invokes the fatal
// handler, only this helper thread exits.
named_thread worker("LLVM JIT", [&]()
{
#if defined(__APPLE__)
pthread_jit_write_protect_np(false);
#endif
g_llvm_fatal_message = &error;
std::forward<F>(func)();
g_llvm_fatal_message = nullptr;
#if defined(__APPLE__)
pthread_jit_write_protect_np(true);
#endif
});
worker();
const bool result = static_cast<thread_state>(worker) == thread_state::finished;
if (!result && error.empty())
{
error = "LLVM crash recovery invoked";
}
return result;
}
}
const bool jit_initialize = []() -> bool const bool jit_initialize = []() -> bool
{ {
llvm::InitializeNativeTarget(); llvm::InitializeNativeTarget();
@@ -241,7 +199,7 @@ struct MemoryManager1 : llvm::RTDyldMemoryManager
MemoryManager1(std::function<u64(const std::string&)> symbols_cement = {}) noexcept MemoryManager1(std::function<u64(const std::string&)> symbols_cement = {}) noexcept
: m_symbols_cement(std::move(symbols_cement)) : m_symbols_cement(std::move(symbols_cement))
{ {
auto ptr = reinterpret_cast<u8*>(utils::memory_reserve(c_max_size * 3, true)); auto ptr = reinterpret_cast<u8*>(utils::memory_reserve(c_max_size * 3));
m_code_mems = ptr; m_code_mems = ptr;
// ptr += c_max_size; // ptr += c_max_size;
// m_data_ro_mems = ptr; // m_data_ro_mems = ptr;
@@ -260,7 +218,7 @@ struct MemoryManager1 : llvm::RTDyldMemoryManager
// utils::memory_decommit(m_code_mems, how_much(code_ptr)); // utils::memory_decommit(m_code_mems, how_much(code_ptr));
// utils::memory_decommit(m_data_ro_mems, how_much(data_ro_ptr)); // utils::memory_decommit(m_data_ro_mems, how_much(data_ro_ptr));
// utils::memory_decommit(m_data_rw_mems, how_much(data_rw_ptr)); // utils::memory_decommit(m_data_rw_mems, how_much(data_rw_ptr));
utils::memory_decommit(m_code_mems, c_max_size * 3, true); utils::memory_decommit(m_code_mems, c_max_size * 3);
} }
llvm::JITSymbol findSymbol(const std::string& name) override llvm::JITSymbol findSymbol(const std::string& name) override
@@ -551,9 +509,9 @@ public:
} }
}; };
std::string jit_compiler::cpu(std::string_view _cpu) std::string jit_compiler::cpu(const std::string& _cpu)
{ {
std::string m_cpu = std::string(_cpu); std::string m_cpu = _cpu;
if (m_cpu.empty()) if (m_cpu.empty())
{ {
@@ -681,7 +639,7 @@ bool jit_compiler::add_sub_disk_space(ssz space)
}).second; }).second;
} }
jit_compiler::jit_compiler(const std::unordered_map<std::string, u64>& _link, std::string_view _cpu, u32 flags, std::function<u64(const std::string&)> symbols_cement) noexcept jit_compiler::jit_compiler(const std::unordered_map<std::string, u64>& _link, const std::string& _cpu, u32 flags, std::function<u64(const std::string&)> symbols_cement) noexcept
: m_context(new llvm::LLVMContext) : m_context(new llvm::LLVMContext)
, m_cpu(cpu(_cpu)) , m_cpu(cpu(_cpu))
{ {
@@ -691,13 +649,6 @@ jit_compiler::jit_compiler(const std::unordered_map<std::string, u64>& _link, st
llvm::install_fatal_error_handler([](void*, const char* msg, bool) llvm::install_fatal_error_handler([](void*, const char* msg, bool)
{ {
const std::string_view out = msg ? msg : ""; const std::string_view out = msg ? msg : "";
if (g_llvm_fatal_message)
{
*g_llvm_fatal_message = out;
thread_ctrl::silent_exit();
}
fmt::throw_exception("LLVM Emergency Exit Invoked: '%s'", out); fmt::throw_exception("LLVM Emergency Exit Invoked: '%s'", out);
}, nullptr); }, nullptr);
@@ -750,15 +701,6 @@ jit_compiler::jit_compiler(const std::unordered_map<std::string, u64>& _link, st
else else
attributes.push_back("-dotprod"); attributes.push_back("-dotprod");
// The recompilers emit i8mm intrinsics (e.g. ummla) gated on utils::has_i8mm().
// The JIT target features must advertise i8mm too, otherwise the backend fails
// with "Cannot select: intrinsic %llvm.aarch64.neon.ummla" whenever the resolved
// -mcpu does not already imply it (e.g. the cortex-a78 fallback on Apple silicon).
if (utils::has_i8mm())
attributes.push_back("+i8mm");
else
attributes.push_back("-i8mm");
if (utils::has_sve()) if (utils::has_sve())
attributes.push_back("+sve"); attributes.push_back("+sve");
else else
@@ -846,33 +788,6 @@ void jit_compiler::add(std::unique_ptr<llvm::Module> _module, const std::string&
} }
} }
bool jit_compiler::try_add(std::unique_ptr<llvm::Module> _module, const std::string& path, std::string& error)
{
ObjectCache cache{path, this};
m_engine->setObjectCache(&cache);
const auto ptr = _module.get();
m_engine->addModule(std::move(_module));
if (!run_recoverable_llvm([&]()
{
m_engine->generateCodeForModule(ptr);
}, error))
{
return false;
}
m_engine->setObjectCache(nullptr);
for (auto& func : ptr->functions())
{
// Delete IR to lower memory consumption
func.deleteBody();
}
return true;
}
void jit_compiler::add(std::unique_ptr<llvm::Module> _module) void jit_compiler::add(std::unique_ptr<llvm::Module> _module)
{ {
const auto ptr = _module.get(); const auto ptr = _module.get();
@@ -886,28 +801,6 @@ void jit_compiler::add(std::unique_ptr<llvm::Module> _module)
} }
} }
bool jit_compiler::try_add(std::unique_ptr<llvm::Module> _module, std::string& error)
{
const auto ptr = _module.get();
m_engine->addModule(std::move(_module));
if (!run_recoverable_llvm([&]()
{
m_engine->generateCodeForModule(ptr);
}, error))
{
return false;
}
for (auto& func : ptr->functions())
{
// Delete IR to lower memory consumption
func.deleteBody();
}
return true;
}
bool jit_compiler::add(const std::string& path) bool jit_compiler::add(const std::string& path)
{ {
auto cache = ObjectCache::load(path); auto cache = ObjectCache::load(path);
@@ -959,14 +852,6 @@ void jit_compiler::fin()
m_engine->finalizeObject(); m_engine->finalizeObject();
} }
bool jit_compiler::try_fin(std::string& error)
{
return run_recoverable_llvm([&]()
{
m_engine->finalizeObject();
}, error);
}
u64 jit_compiler::get(const std::string& name) u64 jit_compiler::get(const std::string& name)
{ {
return m_engine->getGlobalValueAddress(name); return m_engine->getGlobalValueAddress(name);
-14
View File
@@ -630,13 +630,6 @@ namespace fmt
thread_ctrl::emergency_exit(out); thread_ctrl::emergency_exit(out);
} }
[[noreturn]] void raw_verify_error(std::source_location loc, std::source_location propagated_loc, const char8_t* msg, usz object)
{
std::string out;
fmt::append(out, "%s (object: 0x%x)%s%s", msg ? msg : u8"Verification failed", object, loc, propagated_loc);
thread_ctrl::emergency_exit(out);
}
[[noreturn]] void raw_range_error(std::source_location loc, std::string_view index, usz container_size) [[noreturn]] void raw_range_error(std::source_location loc, std::string_view index, usz container_size)
{ {
std::string out; std::string out;
@@ -928,13 +921,6 @@ std::string_view fmt::trim_front_sv(std::string_view source, std::string_view va
void fmt::trim_back(std::string& source, std::string_view values) void fmt::trim_back(std::string& source, std::string_view values)
{ {
const usz index = source.find_last_not_of(values); const usz index = source.find_last_not_of(values);
if (index == source.npos)
{
source.clear();
return;
}
source.resize(index + 1); source.resize(index + 1);
} }
+5 -5
View File
@@ -23,19 +23,19 @@ inline void strcpy_trunc(D&& dst, const T& src)
} }
// Convert string to signed integer // Convert string to signed integer
bool try_to_int64(s64* out, std::string_view value, s64 min, s64 max, std::string_view name = {}); bool try_to_int64(s64* out, std::string_view value, s64 min, s64 max);
// Convert string to unsigned integer // Convert string to unsigned integer
bool try_to_uint64(u64* out, std::string_view value, u64 min, u64 max, std::string_view name = {}); bool try_to_uint64(u64* out, std::string_view value, u64 min, u64 max);
// Convert string to unsigned int128_t // Convert string to unsigned int128_t
bool try_to_uint128(u128* out, std::string_view value, std::string_view name = {}); bool try_to_uint128(u128* out, std::string_view value);
// Convert string to float // Convert string to float
bool try_to_float(f64* out, std::string_view value, f64 min, f64 max, std::string_view name = {}); bool try_to_float(f64* out, std::string_view value, f64 min, f64 max);
// Convert float to string locale independent // Convert float to string locale independent
bool try_to_string(std::string* out, f64 value, std::string_view name = {}); bool try_to_string(std::string* out, const f64& value);
// Get the file extension of a file path ("png", "jpg", etc.) // Get the file extension of a file path ("png", "jpg", etc.)
std::string get_file_extension(const std::string& file_path); std::string get_file_extension(const std::string& file_path);
+25 -213
View File
@@ -25,7 +25,6 @@
#include <process.h> #include <process.h>
#include <sysinfoapi.h> #include <sysinfoapi.h>
#include "stack_trace.h"
#include "util/dyn_lib.hpp" #include "util/dyn_lib.hpp"
DYNAMIC_IMPORT_RENAME("Kernel32.dll", SetThreadDescriptionImport, "SetThreadDescription", HRESULT(HANDLE hThread, PCWSTR lpThreadDescription)); DYNAMIC_IMPORT_RENAME("Kernel32.dll", SetThreadDescriptionImport, "SetThreadDescription", HRESULT(HANDLE hThread, PCWSTR lpThreadDescription));
@@ -1384,7 +1383,11 @@ bool handle_access_violation(u32 addr, bool is_writing, bool is_exec, ucontext_t
return false; return false;
} }
bool handled = true; if (a_size != 4)
{
// Might be unimplemented, such as writing MFC proxy EAL+EAH using 64-bit store
break;
}
switch (op) switch (op)
{ {
@@ -1394,37 +1397,14 @@ bool handle_access_violation(u32 addr, bool is_writing, bool is_exec, ucontext_t
case X64OP_LOAD_TEST: case X64OP_LOAD_TEST:
{ {
u32 value; u32 value;
const u32 addr_aligned = addr & -4; if (is_writing || !thread->read_reg(addr, value))
if (addr % 4 + a_size > 4)
{
handled = false;
break;
}
if (is_writing || !thread->read_reg(addr_aligned, value))
{ {
return false; return false;
} }
// Adjust value for 8-bit and 16-bit reads
value >>= ((4 - a_size) * 8) - ((addr % 4) * 8);
value &= a_size == 4 ? u32{umax} : ((1u << (a_size * 8)) - 1);
if (op != X64OP_LOAD_BE) if (op != X64OP_LOAD_BE)
{ {
if (a_size == 4) value = stx::se_storage<u32>::swap(value);
{
value = stx::se_storage<u32>::swap(value);
}
else if (a_size == 2)
{
value = stx::se_storage<u16>::swap(value);
}
else
{
ensure(a_size == 1);
}
} }
if (op == X64OP_LOAD_CMP) if (op == X64OP_LOAD_CMP)
@@ -1459,35 +1439,12 @@ bool handle_access_violation(u32 addr, bool is_writing, bool is_exec, ucontext_t
case X64OP_BEXTR: case X64OP_BEXTR:
{ {
u32 value; u32 value;
const u32 addr_aligned = addr & -4; if (is_writing || !thread->read_reg(addr, value))
if (addr % 4 + a_size > 4)
{
handled = false;
break;
}
if (is_writing || !thread->read_reg(addr_aligned, value))
{ {
return false; return false;
} }
// Adjust value for 8-bit and 16-bit reads value = stx::se_storage<u32>::swap(value);
value >>= ((4 - a_size) * 8) - ((addr % 4) * 8);
value &= a_size == 4 ? u32{umax} : ((1u << (a_size * 8)) - 1);
if (a_size == 4)
{
value = stx::se_storage<u32>::swap(value);
}
else if (a_size == 2)
{
value = stx::se_storage<u16>::swap(value);
}
else
{
ensure(a_size == 1);
}
u64 ctrl; u64 ctrl;
if (!get_x64_reg_value(context, s_tls_reg3, d_size, i_size, ctrl)) if (!get_x64_reg_value(context, s_tls_reg3, d_size, i_size, ctrl))
@@ -1513,13 +1470,6 @@ bool handle_access_violation(u32 addr, bool is_writing, bool is_exec, ucontext_t
case X64OP_STORE: case X64OP_STORE:
case X64OP_STORE_BE: case X64OP_STORE_BE:
{ {
if (a_size != 4)
{
// Might be unimplemented, such as writing MFC proxy EAL+EAH using 64-bit store
handled = false;
break;
}
u64 reg_value; u64 reg_value;
if (!is_writing || !get_x64_reg_value(context, reg, d_size, i_size, reg_value)) if (!is_writing || !get_x64_reg_value(context, reg, d_size, i_size, reg_value))
{ {
@@ -1538,19 +1488,12 @@ bool handle_access_violation(u32 addr, bool is_writing, bool is_exec, ucontext_t
case X64OP_STOS: case X64OP_STOS:
default: default:
{ {
sig_log.error("Invalid or unsupported operation (op=%d, addr=0x%x, reg=%d, d_size=%lld, i_size=%lld, a_size=%d)", +op, addr, +reg, d_size, i_size, a_size); sig_log.error("Invalid or unsupported operation (op=%d, reg=%d, d_size=%lld, i_size=%lld)", +op, +reg, d_size, i_size);
report_opcode(); report_opcode();
return false; return false;
} }
} }
if (!handled)
{
sig_log.error("Invalid or unsupported operation (op=%d, addr=0x%x, reg=%d, d_size=%lld, i_size=%lld, a_size=%d)", +op, addr, +reg, d_size, i_size, a_size);
report_opcode();
break;
}
// skip processed instruction // skip processed instruction
RIP(context) += i_size; RIP(context) += i_size;
g_tls_fault_spu++; g_tls_fault_spu++;
@@ -2038,39 +1981,9 @@ static LONG exception_filter(PEXCEPTION_POINTERS pExp) noexcept
} }
fmt::append(msg, "RPCS3 image base: %p.\n", GetModuleHandle(NULL)); fmt::append(msg, "RPCS3 image base: %p.\n", GetModuleHandle(NULL));
#if defined(ARCH_X64)
fmt::append(msg, "RAX: %016llX RBX: %016llX\n", pExp->ContextRecord->Rax, pExp->ContextRecord->Rbx);
fmt::append(msg, "RCX: %016llX RDX: %016llX\n", pExp->ContextRecord->Rcx, pExp->ContextRecord->Rdx);
fmt::append(msg, "RSI: %016llX RDI: %016llX\n", pExp->ContextRecord->Rsi, pExp->ContextRecord->Rdi);
fmt::append(msg, "RBP: %016llX RSP: %016llX\n", pExp->ContextRecord->Rbp, pExp->ContextRecord->Rsp);
fmt::append(msg, "R8: %016llX R9: %016llX\n", pExp->ContextRecord->R8, pExp->ContextRecord->R9);
fmt::append(msg, "R10: %016llX R11: %016llX\n", pExp->ContextRecord->R10, pExp->ContextRecord->R11);
fmt::append(msg, "R12: %016llX R13: %016llX\n", pExp->ContextRecord->R12, pExp->ContextRecord->R13);
fmt::append(msg, "R14: %016llX R15: %016llX\n", pExp->ContextRecord->R14, pExp->ContextRecord->R15);
fmt::append(msg, "RFLAGS: %08X\n", pExp->ContextRecord->EFlags);
#elif defined(ARCH_ARM64)
for (int i = 0; i < 29; i += 2)
{
if (i + 1 < 29)
fmt::append(msg, "X%-2d: %016llX X%-2d: %016llX\n", i, pExp->ContextRecord->X[i], i + 1, pExp->ContextRecord->X[i + 1]);
else
fmt::append(msg, "X%-2d: %016llX\n", i, pExp->ContextRecord->X[i]);
}
fmt::append(msg, "SP: %016llX FP: %016llX LR: %016llX\n", pExp->ContextRecord->Sp, pExp->ContextRecord->Fp, pExp->ContextRecord->Lr);
fmt::append(msg, "CPSR: %08X\n", pExp->ContextRecord->Cpsr);
#endif
const auto stack_trace = utils::get_backtrace(64, pExp->ContextRecord); // TODO: print registers and the callstack
const auto stack_symbols = utils::get_backtrace_symbols(stack_trace);
msg += "Stack Trace:\n";
for (const auto& symbol : stack_symbols)
{
fmt::append(msg, "%s\n", symbol);
}
sys_log.fatal("\n%s", msg); sys_log.fatal("\n%s", msg);
logs::listener::sync_all(); logs::listener::sync_all();
@@ -2191,37 +2104,6 @@ static void signal_handler(int /*sig*/, siginfo_t* info, void* uct) noexcept
append_thread_name(msg); append_thread_name(msg);
#ifdef __APPLE__
thread_local bool s_tls_is_attempting_recovery = false;
thread_local bool s_tls_last_cause_is_executing = false;
if (reinterpret_cast<u64>(info->si_addr) < 0x10000)
{
// Do not recover from the virtual page of 0x0 (such as nullptr)
}
else if (is_executing || is_writing)
{
if (s_tls_is_attempting_recovery && s_tls_last_cause_is_executing != is_executing)
{
// Cause changed, inform recovery
s_tls_is_attempting_recovery = false;
}
if (!s_tls_is_attempting_recovery)
{
s_tls_last_cause_is_executing = is_executing;
s_tls_is_attempting_recovery = true;
pthread_jit_write_protect_np(is_executing ? true : false);
sys_log.error("\n%s", msg);
sys_log.notice("\n%s", dump_useful_thread_info());
sys_log.error("Attempting recovery using pthread_jit_write_protect_np()");
logs::listener::sync_all();
return;
}
}
#endif
sys_log.fatal("\n%s", msg); sys_log.fatal("\n%s", msg);
sys_log.notice("\n%s", dump_useful_thread_info()); sys_log.notice("\n%s", dump_useful_thread_info());
logs::listener::sync_all(); logs::listener::sync_all();
@@ -2337,7 +2219,6 @@ void thread_base::start()
ensure(::ResumeThread(reinterpret_cast<HANDLE>(+m_thread)) != static_cast<DWORD>(-1)); ensure(::ResumeThread(reinterpret_cast<HANDLE>(+m_thread)) != static_cast<DWORD>(-1));
#elif defined(__APPLE__) #elif defined(__APPLE__)
pthread_attr_t attrs; pthread_attr_t attrs;
pthread_t thread_id{};
struct sched_param sp; struct sched_param sp;
memset(&sp, 0, sizeof(struct sched_param)); memset(&sp, 0, sizeof(struct sched_param));
sp.sched_priority=99; sp.sched_priority=99;
@@ -2347,43 +2228,20 @@ void thread_base::start()
pthread_attr_set_qos_class_np(&attrs, QOS_CLASS_USER_INTERACTIVE, 0); pthread_attr_set_qos_class_np(&attrs, QOS_CLASS_USER_INTERACTIVE, 0);
pthread_attr_setschedpolicy(&attrs, SCHED_RR); pthread_attr_setschedpolicy(&attrs, SCHED_RR);
pthread_attr_setschedparam(&attrs, &sp); pthread_attr_setschedparam(&attrs, &sp);
ensure(pthread_create(&thread_id, &attrs, entry_point, this) == 0); ensure(pthread_create(reinterpret_cast<pthread_t*>(&m_thread.raw()), &attrs, entry_point, this) == 0);
#else #else
pthread_t thread_id{}; ensure(pthread_create(reinterpret_cast<pthread_t*>(&m_thread.raw()), nullptr, entry_point, this) == 0);
ensure(pthread_create(&thread_id, nullptr, entry_point, this) == 0);
#endif
#ifndef _WIN32
// Update m_thread atomically
u64 dest_id = 0;
std::memcpy(&dest_id, &thread_id, sizeof(thread_id));
if (!m_thread && !m_thread.compare_and_swap_test(0, dest_id))
{
ensure(m_thread == dest_id);
}
#endif #endif
} }
void thread_base::initialize(void (*error_cb)()) void thread_base::initialize(void (*error_cb)())
{ {
#ifndef _WIN32 #ifndef _WIN32
#ifdef __APPLE__ #ifdef ANDROID
while (!m_thread) m_thread.release(pthread_self());
{
busy_wait();
}
[[maybe_unused]] u64 new_tid = 0;
#elif defined(ANDROID)
const u64 new_tid = pthread_self();
#else #else
const u64 new_tid = reinterpret_cast<u64>(pthread_self()); m_thread.release(reinterpret_cast<u64>(pthread_self()));
#endif #endif
if (!m_thread && !m_thread.compare_and_swap_test(0, new_tid))
{
ensure(m_thread == new_tid);
}
#endif #endif
// Initialize TLS variables // Initialize TLS variables
@@ -2994,13 +2852,6 @@ void thread_base::exec()
} }
} }
void thread_ctrl::set_name(std::string name)
{
ensure(g_tls_this_thread);
g_tls_this_thread->m_tname.store(make_single<std::string>(name));
g_tls_this_thread->set_name(std::move(name));
}
[[noreturn]] void thread_ctrl::emergency_exit(std::string_view reason) [[noreturn]] void thread_ctrl::emergency_exit(std::string_view reason)
{ {
// Print stacktrace // Print stacktrace
@@ -3071,9 +2922,7 @@ void thread_ctrl::set_name(std::string name)
return false; return false;
}).second) }).second)
{ {
#ifndef __APPLE__
utils::trap(); utils::trap();
#endif
} }
} }
@@ -3101,32 +2950,6 @@ void thread_ctrl::set_name(std::string name)
report_fatal_error(reason); report_fatal_error(reason);
} }
void thread_ctrl::silent_exit() noexcept
{
if (const auto _this = g_tls_this_thread)
{
g_tls_error_callback();
u64 _self = _this->finalize(thread_state::errored);
if (_self == umax)
{
// Unused, detached thread support remnant
delete _this;
}
thread_base::finalize(umax);
}
#ifdef _WIN32
_endthreadex(0);
#else
pthread_exit(nullptr);
#endif
std::abort();
}
void thread_ctrl::detect_cpu_layout() void thread_ctrl::detect_cpu_layout()
{ {
if (!g_native_core_layout.compare_and_swap_test(native_core_arrangement::undefined, native_core_arrangement::generic)) if (!g_native_core_layout.compare_and_swap_test(native_core_arrangement::undefined, native_core_arrangement::generic))
@@ -3584,26 +3407,15 @@ std::pair<void*, usz> thread_ctrl::get_thread_stack()
u64 thread_ctrl::get_tid() u64 thread_ctrl::get_tid()
{ {
static thread_local u64 s_tls_tid = []() -> u64 #ifdef _WIN32
{ return GetCurrentThreadId();
#ifdef _WIN32 #elif defined(ANDROID)
return GetCurrentThreadId(); return static_cast<u64>(pthread_self());
#elif defined(ANDROID) #elif defined(__linux__)
return pthread_gettid_np(pthread_self()); return syscall(SYS_gettid);
#elif defined(__linux__) #else
return syscall(SYS_gettid); return reinterpret_cast<u64>(pthread_self());
#elif defined(__APPLE__) #endif
u64 tid{};
pthread_threadid_np(nullptr, &tid);
return tid;
#elif defined(__FreeBSD__)
return pthread_getthreadid_np();
#else
return static_cast<u64>(pthread_self());
#endif
}();
return s_tls_tid;
} }
bool thread_ctrl::is_main() bool thread_ctrl::is_main()
+12 -10
View File
@@ -129,7 +129,7 @@ public:
const native_entry entry_point; const native_entry entry_point;
// Set name for debugger // Set name for debugger
static void set_name(std::string name); static void set_name(std::string);
private: private:
// Thread handle (platform-specific) // Thread handle (platform-specific)
@@ -232,7 +232,11 @@ public:
} }
// Set current thread name (not recommended) // Set current thread name (not recommended)
static void set_name(std::string name); static void set_name(std::string name)
{
g_tls_this_thread->m_tname.store(make_single<std::string>(name));
g_tls_this_thread->set_name(std::move(name));
}
// Set thread name (not recommended) // Set thread name (not recommended)
template <typename T> template <typename T>
@@ -315,9 +319,6 @@ public:
// Exit. // Exit.
[[noreturn]] static void emergency_exit(std::string_view reason); [[noreturn]] static void emergency_exit(std::string_view reason);
// Exit the current named thread as errored without reporting a fatal error.
[[noreturn]] static void silent_exit() noexcept;
// Get current thread (may be nullptr) // Get current thread (may be nullptr)
static thread_base* get_current() static thread_base* get_current()
{ {
@@ -800,30 +801,31 @@ public:
m_count = 0; m_count = 0;
// Create all threads // Create all threads
for (; m_count < count - 1; m_count++) for (u32 i = 0; i < count - 1; i++)
{ {
// Copy the context // Copy the context
std::remove_cvref_t<Context> context(static_cast<const Context&>(f)); std::remove_cvref_t<Context> context(static_cast<const Context&>(f));
// Perform the check and additional preparations for each context // Perform the check and additional preparations for each context
if (!std::invoke(std::forward<CheckAndPrepare>(check), m_count, context)) if (!std::invoke(std::forward<CheckAndPrepare>(check), i, context))
{ {
return; return;
} }
new (static_cast<void*>(m_threads + m_count)) Thread(std::string(name) + std::to_string(m_count + 1), std::move(context)); m_count++;
new (static_cast<void*>(m_threads + i)) Thread(std::string(name) + std::to_string(i + 1), std::move(context));
} }
// Move the context (if movable) // Move the context (if movable)
std::remove_cvref_t<Context> context(std::forward<Context>(f)); std::remove_cvref_t<Context> context(std::forward<Context>(f));
if (!std::invoke(std::forward<CheckAndPrepare>(check), m_count, context)) if (!std::invoke(std::forward<CheckAndPrepare>(check), m_count - 1, context))
{ {
return; return;
} }
new (static_cast<void*>(m_threads + m_count)) Thread(std::string(name) + std::to_string(m_count + 1), std::move(context));
m_count++; m_count++;
new (static_cast<void*>(m_threads + m_count - 1)) Thread(std::string(name) + std::to_string(m_count - 1), std::move(context));
} }
// Default constructor // Default constructor
+4 -4
View File
@@ -29,7 +29,7 @@ void fmt_class_string<cheat_type>::format(std::string& out, u64 arg)
bool cheat_info::from_str(std::string_view cheat_line) bool cheat_info::from_str(std::string_view cheat_line)
{ {
auto cheat_vec = fmt::split(cheat_line, {"@@@"}, false); const auto cheat_vec = fmt::split(cheat_line, {"@@@"}, false);
s64 val64 = 0; s64 val64 = 0;
if (cheat_vec.size() != 5 || !try_to_int64(&val64, cheat_vec[2], 0, cheat_type_max - 1)) if (cheat_vec.size() != 5 || !try_to_int64(&val64, cheat_vec[2], 0, cheat_type_max - 1))
@@ -38,11 +38,11 @@ bool cheat_info::from_str(std::string_view cheat_line)
return false; return false;
} }
game = std::move(cheat_vec[0]); game = cheat_vec[0];
description = std::move(cheat_vec[1]); description = cheat_vec[1];
type = cheat_type{::narrow<u8>(val64)}; type = cheat_type{::narrow<u8>(val64)};
offset = std::stoul(cheat_vec[3]); offset = std::stoul(cheat_vec[3]);
red_script = std::move(cheat_vec[4]); red_script = cheat_vec[4];
return true; return true;
} }
-4
View File
@@ -1,6 +1,5 @@
#pragma once #pragma once
#include <array>
#include <cmath> #include <cmath>
#include <type_traits> #include <type_traits>
@@ -1028,6 +1027,3 @@ using color1u = color1_base<unsigned int>;
using color1i = color1_base<int>; using color1i = color1_base<int>;
using color1f = color1_base<float>; using color1f = color1_base<float>;
using color1d = color1_base<double>; using color1d = color1_base<double>;
using mat3f = color3_base<float>[3];
static_assert(sizeof(mat3f) == sizeof(float) * 3 * 3);
-13
View File
@@ -10,19 +10,6 @@ rXmlNode::rXmlNode(const pugi::xml_node& node)
handle = node; handle = node;
} }
std::shared_ptr<rXmlNode> rXmlNode::GetChild(std::string_view name)
{
if (handle)
{
if (const pugi::xml_node child = handle.child(name))
{
return std::make_shared<rXmlNode>(child);
}
}
return nullptr;
}
std::shared_ptr<rXmlNode> rXmlNode::GetChildren() std::shared_ptr<rXmlNode> rXmlNode::GetChildren()
{ {
if (handle) if (handle)
-1
View File
@@ -20,7 +20,6 @@ struct rXmlNode
{ {
rXmlNode(); rXmlNode();
rXmlNode(const pugi::xml_node& node); rXmlNode(const pugi::xml_node& node);
std::shared_ptr<rXmlNode> GetChild(std::string_view name);
std::shared_ptr<rXmlNode> GetChildren(); std::shared_ptr<rXmlNode> GetChildren();
std::shared_ptr<rXmlNode> GetNext(); std::shared_ptr<rXmlNode> GetNext();
std::string GetName(); std::string GetName();
+1 -7
View File
@@ -41,13 +41,7 @@ void semaphore_base::imp_wait()
// Add waiter // Add waiter
value += c_waiter; value += c_waiter;
} }
else });
{
return false;
}
return true;
}).first;
if (value & c_value_mask) if (value & c_value_mask)
{ {
+16 -35
View File
@@ -30,61 +30,42 @@ namespace utils
return out.data(); return out.data();
} }
std::vector<void*> get_backtrace(int max_depth, PCONTEXT ctx) std::vector<void*> get_backtrace(int max_depth)
{ {
static struct sym_initer_t
{
sym_initer_t() noexcept
{
SymInitialize(GetCurrentProcess(), NULL, TRUE);
}
~sym_initer_t() noexcept
{
SymCleanup(GetCurrentProcess());
}
} s_initer{};
std::vector<void*> result = {}; std::vector<void*> result = {};
const auto hProcess = ::GetCurrentProcess(); const auto hProcess = ::GetCurrentProcess();
const auto hThread = ::GetCurrentThread(); const auto hThread = ::GetCurrentThread();
CONTEXT context{}; CONTEXT context{};
if (ctx) RtlCaptureContext(&context);
context = *ctx;
else
RtlCaptureContext(&context);
STACKFRAME64 stack = {}; STACKFRAME64 stack = {};
stack.AddrPC.Mode = AddrModeFlat; stack.AddrPC.Mode = AddrModeFlat;
stack.AddrStack.Mode = AddrModeFlat; stack.AddrStack.Mode = AddrModeFlat;
stack.AddrFrame.Mode = AddrModeFlat; stack.AddrFrame.Mode = AddrModeFlat;
#if defined(ARCH_X64) #if defined(ARCH_X64)
const DWORD machineType = IMAGE_FILE_MACHINE_AMD64;
stack.AddrPC.Offset = context.Rip; stack.AddrPC.Offset = context.Rip;
stack.AddrStack.Offset = context.Rsp; stack.AddrStack.Offset = context.Rsp;
stack.AddrFrame.Offset = context.Rbp; stack.AddrFrame.Offset = context.Rbp;
#elif defined(ARCH_ARM64) #elif defined(ARCH_ARM64)
const DWORD machineType = IMAGE_FILE_MACHINE_ARM64;
stack.AddrPC.Offset = context.Pc; stack.AddrPC.Offset = context.Pc;
stack.AddrStack.Offset = context.Sp; stack.AddrStack.Offset = context.Sp;
stack.AddrFrame.Offset = context.Fp; stack.AddrFrame.Offset = context.Fp;
#else
#error "Unsupported architecture"
#endif #endif
while (max_depth--) while (max_depth--)
{ {
if (!StackWalk64( if (!StackWalk64(
machineType, IMAGE_FILE_MACHINE_AMD64,
hProcess, hProcess,
hThread, hThread,
&stack, &stack,
&context, &context,
NULL, NULL,
SymFunctionTableAccess64, SymFunctionTableAccess64,
SymGetModuleBase64, SymGetModuleBase64,
NULL)) NULL))
{ {
break; break;
} }
@@ -119,23 +100,23 @@ namespace utils
if (sym->NameLen) if (sym->NameLen)
{ {
std::string function_name = wstr_to_utf8(sym->Name, static_cast<int>(sym->NameLen)); const auto function_name = wstr_to_utf8(sym->Name, static_cast<int>(sym->NameLen));
// Attempt to get file and line information if available // Attempt to get file and line information if available
DWORD unused2; DWORD unused2;
if (SymGetLineFromAddrW64(hProcess, reinterpret_cast<DWORD64>(pointer), &unused2, &line_info)) if (SymGetLineFromAddrW64(hProcess, reinterpret_cast<DWORD64>(pointer), &unused2, &line_info))
{ {
std::string full_path = fmt::format("%s:%u %s", wstr_to_utf8(line_info.FileName, -1), line_info.LineNumber, function_name); const auto full_path = fmt::format("%s:%u %s", wstr_to_utf8(line_info.FileName, -1), line_info.LineNumber, function_name);
result.push_back(std::move(full_path)); result.push_back(full_path);
} }
else else
{ {
result.push_back(std::move(function_name)); result.push_back(function_name);
} }
} }
else else
{ {
result.push_back(fmt::format("rpcs3@0x%p", pointer)); result.push_back(fmt::format("rpcs3@0xp", pointer));
} }
} }
+2 -12
View File
@@ -2,11 +2,6 @@
#include <util/types.hpp> #include <util/types.hpp>
#include <util/logs.hpp> #include <util/logs.hpp>
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#endif
namespace utils namespace utils
{ {
namespace stack_trace namespace stack_trace
@@ -14,7 +9,7 @@ namespace utils
// Printing utilities // Printing utilities
template <typename T> template <typename T>
concept Logger = requires (T& t, std::string_view msg) concept Logger = requires (T& t, const std::string& msg)
{ {
{ t.print(msg) }; { t.print(msg) };
}; };
@@ -28,19 +23,14 @@ namespace utils
: log(chan) : log(chan)
{} {}
void print(std::string_view s) void print(const std::string& s)
{ {
log.error("%s", s); log.error("%s", s);
} }
}; };
} }
#ifdef _WIN32
std::vector<void*> get_backtrace(int max_depth = 255, PCONTEXT ctx = nullptr);
#else
std::vector<void*> get_backtrace(int max_depth = 255); std::vector<void*> get_backtrace(int max_depth = 255);
#endif
std::vector<std::string> get_backtrace_symbols(const std::vector<void*>& stack); std::vector<std::string> get_backtrace_symbols(const std::vector<void*>& stack);
FORCE_INLINE void print_trace(stack_trace::Logger auto& logger, int max_depth = 255) FORCE_INLINE void print_trace(stack_trace::Logger auto& logger, int max_depth = 255)
-159
View File
@@ -1,159 +0,0 @@
#include "stdafx.h"
#include "stereo_config.h"
#include "Emu/system_config.h"
stereo_config::stereo_matrices::stereo_matrices(const std::array<color3_base<f32>, 3>& l, const std::array<color3_base<f32>, 3>& r)
{
for (usz i = 0; i < 3; i++)
{
left[i] = l[i];
right[i] = r[i];
}
}
atomic_t<bool> stereo_config::s_live_preview_enabled = false;
stereo_config::stereo_matrices stereo_config::m_live_matrices = {};
const std::unordered_map<stereo_render_mode_options, stereo_config::stereo_matrices> stereo_config::m_matrices =
{
{stereo_render_mode_options::anaglyph_red_cyan, stereo_matrices(
{
color3_base<f32>(1, 0, 0),
color3_base<f32>(0, 0, 0),
color3_base<f32>(0, 0, 0)
},
{
color3_base<f32>(0, 0, 0),
color3_base<f32>(0, 1, 0),
color3_base<f32>(0, 0, 1)
}
)},
{stereo_render_mode_options::anaglyph_red_green, stereo_matrices(
{
color3_base<f32>(1, 0, 0),
color3_base<f32>(0, 0, 0),
color3_base<f32>(0, 0, 0)
},
{
color3_base<f32>(0, 0, 0),
color3_base<f32>(0, 1, 0),
color3_base<f32>(0, 0, 0)
}
)},
{stereo_render_mode_options::anaglyph_red_blue, stereo_matrices(
{
color3_base<f32>(1, 0, 0),
color3_base<f32>(0, 0, 0),
color3_base<f32>(0, 0, 0)
},
{
color3_base<f32>(0, 0, 0),
color3_base<f32>(0, 0, 0),
color3_base<f32>(0, 0, 1)
}
)},
{stereo_render_mode_options::anaglyph_magenta_cyan, stereo_matrices(
{
color3_base<f32>(1, 0, 0),
color3_base<f32>(0, 0, 0),
color3_base<f32>(0, 0, 0.5f)
},
{
color3_base<f32>(0, 0, 0),
color3_base<f32>(0, 1, 0),
color3_base<f32>(0, 0, 0.5f)
}
)},
{stereo_render_mode_options::anaglyph_trioscopic, stereo_matrices(
{
color3_base<f32>(0, 0, 0),
color3_base<f32>(0, 1, 0),
color3_base<f32>(0, 0, 0)
},
{
color3_base<f32>(1, 0, 0),
color3_base<f32>(0, 0, 0),
color3_base<f32>(0, 0, 1)
}
)},
{stereo_render_mode_options::anaglyph_amber_blue, stereo_matrices(
{
color3_base<f32>(1, 0, 0),
color3_base<f32>(0, 1, 0),
color3_base<f32>(0, 0, 0)
},
{
color3_base<f32>(0, 0, 1.0f / 3.0f),
color3_base<f32>(0, 0, 1.0f / 3.0f),
color3_base<f32>(0, 0, 1.0f / 3.0f)
}
)},
};
void stereo_config::update_from_config(bool stereo_enabled)
{
m_stereo_mode = stereo_enabled ? g_cfg.video.stereo_render_mode.get() : stereo_render_mode_options::disabled;
if (m_stereo_mode == stereo_render_mode_options::anaglyph_custom)
{
stereo_config::convert_matrix(m_custom_matrices.left, g_cfg.video.custom_anaglyph_matrices.left.get_map());
stereo_config::convert_matrix(m_custom_matrices.right, g_cfg.video.custom_anaglyph_matrices.right.get_map());
}
}
const stereo_config::stereo_matrices& stereo_config::matrices() const
{
if (m_in_emulation && s_live_preview_enabled)
{
return m_live_matrices;
}
switch (m_stereo_mode)
{
case stereo_render_mode_options::disabled:
case stereo_render_mode_options::side_by_side:
case stereo_render_mode_options::over_under:
case stereo_render_mode_options::interlaced:
break;
case stereo_render_mode_options::anaglyph_red_green:
case stereo_render_mode_options::anaglyph_red_blue:
case stereo_render_mode_options::anaglyph_red_cyan:
case stereo_render_mode_options::anaglyph_magenta_cyan:
case stereo_render_mode_options::anaglyph_trioscopic:
case stereo_render_mode_options::anaglyph_amber_blue:
return ::at32(m_matrices, m_stereo_mode);
case stereo_render_mode_options::anaglyph_custom:
return m_custom_matrices;
}
static const stereo_matrices s_left_only_matrices = stereo_matrices(
{
color3_base<float>(1, 0, 0),
color3_base<float>(0, 1, 0),
color3_base<float>(0, 0, 1)
},
{
color3_base<float>(0, 0, 0),
color3_base<float>(0, 0, 0),
color3_base<float>(0, 0, 0)
});
return s_left_only_matrices;
}
std::map<std::string, std::string> stereo_config::get_custom_matrix(bool is_left) const
{
return convert_matrix(is_left ? m_custom_matrices.left : m_custom_matrices.right);
}
std::map<std::string, std::string> stereo_config::convert_matrix(const mat3f& mat)
{
std::map<std::string, std::string> values {};
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
values[fmt::format("%d%d", i, j)] = fmt::format("%f", mat[i].rgb[j]);
}
}
return values;
}
-79
View File
@@ -1,79 +0,0 @@
#pragma once
#include "geometry.h"
#include "Emu/system_config_types.h"
#include "util/atomic.hpp"
#include "Utilities/StrFmt.h"
#include "Utilities/StrUtil.h"
#include <map>
#include <mutex>
struct stereo_config
{
public:
struct stereo_matrices
{
stereo_matrices() = default;
stereo_matrices(const std::array<color3_base<f32>, 3>& l, const std::array<color3_base<f32>, 3>& r);
mat3f left {};
mat3f right {};
};
stereo_config(bool in_emulation) : m_in_emulation(in_emulation) {}
void set_stereo_mode(stereo_render_mode_options mode) { m_stereo_mode = mode; }
stereo_render_mode_options stereo_mode() const { return m_stereo_mode; }
const stereo_matrices& matrices() const;
void update_from_config(bool stereo_enabled);
void set_custom_matrices(const stereo_matrices& matrices) { m_custom_matrices = matrices; }
static void set_live_matrices(const stereo_matrices& matrices) { m_live_matrices = matrices; }
std::map<std::string, std::string> get_custom_matrix(bool is_left) const;
template <typename T>
static void convert_matrix(mat3f& mat, const T& values)
{
mat[0] = {};
mat[1] = {};
mat[2] = {};
if (values.empty())
{
return;
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
const std::string key = fmt::format("%d%d", i, j);
const auto it = values.find(key);
if (it == values.cend()) continue;
const std::string& val_s = it->second;
if (val_s.empty()) continue;
if (f64 val = 0.0f; try_to_float(&val, val_s, -10.0f, 10.0f))
{
mat[i].rgb[j] = static_cast<f32>(val);
}
}
}
}
static std::map<std::string, std::string> convert_matrix(const mat3f& mat);
static atomic_t<bool> s_live_preview_enabled;
private:
stereo_matrices m_custom_matrices {};
stereo_render_mode_options m_stereo_mode = stereo_render_mode_options::disabled;
bool m_in_emulation = false;
static stereo_matrices m_live_matrices;
static const std::unordered_map<stereo_render_mode_options, stereo_matrices> m_matrices;
};
+1 -1
View File
@@ -74,7 +74,7 @@ enum
}; };
#endif #endif
inline int futex(volatile void* uaddr, int futex_op, uint val, const timespec* timeout = nullptr, [[maybe_unused]] uint mask = 0) inline int futex(volatile void* uaddr, int futex_op, uint val, const timespec* timeout = nullptr, uint mask = 0)
{ {
#ifdef __linux__ #ifdef __linux__
return syscall(SYS_futex, uaddr, futex_op, static_cast<int>(val), timeout, nullptr, static_cast<int>(mask)); return syscall(SYS_futex, uaddr, futex_op, static_cast<int>(val), timeout, nullptr, static_cast<int>(mask));
+1 -1
View File
@@ -33,7 +33,7 @@ public:
std::lock_guard lock(mutex); std::lock_guard lock(mutex);
if (std::shared_ptr<void> new_val = std::invoke(func); new_val) if (std::shared_ptr<void> new_val = std::invoke(func); new_val)
{ {
storage.push_back(std::move(new_val)); storage.push_back(new_val);
} }
delete_unused(); delete_unused();
} }
+9 -7
View File
@@ -24,27 +24,29 @@ namespace utils
return (m_hi << 24) | (m_mid << 16) | (m_lo << 8) | ((uint(m_type) & 0xf) << 4) | (m_type_index & 0xf); return (m_hi << 24) | (m_mid << 16) | (m_lo << 8) | ((uint(m_type) & 0xf) << 4) | (m_type_index & 0xf);
} }
std::string version::to_string(bool simple) const std::string version::to_string() const
{ {
std::string version = fmt::format("%d.%d", hi(), mid()); std::string version = std::to_string(hi()) + "." + std::to_string(mid());
if (lo()) if (lo())
{ {
fmt::append(version, ".%d", lo()); version += '.';
version += std::to_string(lo());
} }
if (!simple && type() != version_type::release) if (type() != version_type::release)
{ {
if (!postfix().empty()) if (!postfix().empty())
{ {
fmt::append(version, "-%s", postfix()); version += "-" + postfix();
} }
fmt::append(version, " %s", utils::to_string(type())); version += ' ';
version += utils::to_string(type());
if (type_index() > 1) if (type_index() > 1)
{ {
fmt::append(version, " %d", type_index()); version += " " + std::to_string(type_index());
} }
} }
+4 -4
View File
@@ -23,10 +23,10 @@ namespace utils
uint m_lo; uint m_lo;
version_type m_type = version_type::release; version_type m_type = version_type::release;
uint m_type_index = 1; uint m_type_index = 1;
std::string_view m_postfix; const char* m_postfix;
public: public:
constexpr version(uint hi, uint mid, uint lo, version_type type, uint type_index, std::string_view postfix) constexpr version(uint hi, uint mid, uint lo, version_type type, uint type_index, const char* postfix)
: m_hi(hi) : m_hi(hi)
, m_mid(mid) , m_mid(mid)
, m_lo(lo) , m_lo(lo)
@@ -56,7 +56,7 @@ namespace utils
return m_type; return m_type;
} }
std::string_view postfix() const std::string postfix() const
{ {
return m_postfix; return m_postfix;
} }
@@ -67,7 +67,7 @@ namespace utils
} }
uint to_hex() const; uint to_hex() const;
std::string to_string(bool simple = false) const; std::string to_string() const;
}; };
// Generic version comparison (e.g. 0.0.5 vs 1.3) // Generic version comparison (e.g. 0.0.5 vs 1.3)
@@ -349,24 +349,24 @@ QPushButton:disabled {
} }
QDialog QDialogButtonBox QPushButton:default { QDialog QDialogButtonBox QPushButton {
color: #000000; color: #000000;
background-color: #4CC2FF; background-color: #4CC2FF;
border-color: #5AC7FF; border-color: #5AC7FF;
} }
QDialog QDialogButtonBox QPushButton:default:hover { QDialog QDialogButtonBox QPushButton:hover {
background-color: #48B2E9; background-color: #48B2E9;
border-color: #56B8EB; border-color: #56B8EB;
} }
QDialog QDialogButtonBox QPushButton:default:pressed { QDialog QDialogButtonBox QPushButton:pressed {
color: #22526A; color: #22526A;
background-color: #45A4D5; background-color: #45A4D5;
border-color: #45A4D5; border-color: #45A4D5;
} }
QDialog QDialogButtonBox QPushButton:default:disabled { QDialog QDialogButtonBox QPushButton:disabled {
color: #ABABAB; color: #ABABAB;
background-color: #4C4C4C; background-color: #4C4C4C;
border-color: #4C4C4C; border-color: #4C4C4C;
@@ -614,15 +614,10 @@ QComboBox QAbstractItemView {
QComboBox QAbstractItemView::item { QComboBox QAbstractItemView::item {
color: #FFFFFF; color: #FFFFFF;
padding: 4px 6px; padding: 4px 6px;
margin: 2px 0px;
background-color: transparent; background-color: transparent;
border-radius: 4px; border-radius: 4px;
} }
QComboBox QAbstractItemView::item:hover {
background-color: #383838;
}
QComboBox QAbstractItemView::item:selected { QComboBox QAbstractItemView::item:selected {
background-color: #383838; background-color: #383838;
} }
@@ -647,7 +642,7 @@ QDoubleSpinBox::up-button, QDoubleSpinBox::down-button {
border-radius: 4px; border-radius: 4px;
width: 8px; width: 8px;
height: 8px; height: 8px;
padding: 3px 4px; padding: 3px 4px;
} }
QSpinBox::up-button:hover, QSpinBox::down-button:hover, QSpinBox::up-button:hover, QSpinBox::down-button:hover,
@@ -714,16 +709,6 @@ QSlider::handle:horizontal:disabled {
image: url("GuiConfigs/dark/slider-handle-disabled.svg"); image: url("GuiConfigs/dark/slider-handle-disabled.svg");
} }
QSlider::sub-page:horizontal {
background-color: #4CC2FF;
border-radius: 2px;
height: 4px;
}
QSlider::sub-page:horizontal:disabled {
background-color: #767A7D;
}
/* LINE EDIT */ /* LINE EDIT */
QLineEdit { QLineEdit {
@@ -806,7 +791,7 @@ QMenuBar::item:pressed {
QMenu { QMenu {
background-color: #2C2C2C; background-color: #2C2C2C;
border: 1px solid #3E3E3E; border: 1px solid #131313;
padding: 4px 0px; padding: 4px 0px;
} }
@@ -814,12 +799,12 @@ QMenu::item {
color: #FFFFFF; color: #FFFFFF;
background-color: transparent; background-color: transparent;
border-radius: 4px; border-radius: 4px;
padding: 4px 20px; padding: 8px 20px;
margin: 0px 4px; margin: 0px 4px;
} }
QMenu::item:selected { QMenu::item:selected {
background-color: #353535; background-color: #383838;
} }
QMenu::item:disabled { QMenu::item:disabled {
@@ -829,8 +814,8 @@ QMenu::item:disabled {
QMenu::separator { QMenu::separator {
height: 1px; height: 1px;
background: #3E3E3E; background: #131313;
margin: 4px 8px; margin: 4px 0px;
} }
QMenu::indicator, QMenu::right-arrow { QMenu::indicator, QMenu::right-arrow {
@@ -349,24 +349,24 @@ QPushButton:disabled {
} }
QDialog QDialogButtonBox QPushButton:default { QDialog QDialogButtonBox QPushButton {
color: #FFFFFF; color: #FFFFFF;
background-color: #0067C0; background-color: #0067C0;
border-color: #1473C5; border-color: #1473C5;
} }
QDialog QDialogButtonBox QPushButton:default:hover { QDialog QDialogButtonBox QPushButton:hover {
background-color: #1A76C6; background-color: #1A76C6;
border-color: #2C80CA; border-color: #2C80CA;
} }
QDialog QDialogButtonBox QPushButton:default:pressed { QDialog QDialogButtonBox QPushButton:pressed {
color: #C2DAEF; color: #C2DAEF;
background-color: #3284CB; background-color: #3284CB;
border-color: #3284CB; border-color: #3284CB;
} }
QDialog QDialogButtonBox QPushButton:default:disabled { QDialog QDialogButtonBox QPushButton:disabled {
color: #FFFFFF; color: #FFFFFF;
background-color: #C5C5C5; background-color: #C5C5C5;
border-color: #C5C5C5; border-color: #C5C5C5;
@@ -614,15 +614,10 @@ QComboBox QAbstractItemView {
QComboBox QAbstractItemView::item { QComboBox QAbstractItemView::item {
color: #1B1B1B; color: #1B1B1B;
padding: 4px 6px; padding: 4px 6px;
margin: 2px 0px;
background-color: transparent; background-color: transparent;
border-radius: 4px; border-radius: 4px;
} }
QComboBox QAbstractItemView::item:hover {
background-color: #F0F0F0;
}
QComboBox QAbstractItemView::item:selected { QComboBox QAbstractItemView::item:selected {
background-color: #F0F0F0; background-color: #F0F0F0;
} }
@@ -647,7 +642,7 @@ QDoubleSpinBox::up-button, QDoubleSpinBox::down-button {
border-radius: 4px; border-radius: 4px;
width: 8px; width: 8px;
height: 8px; height: 8px;
padding: 3px 4px; padding: 3px 4px;
} }
QSpinBox::up-button:hover, QSpinBox::down-button:hover, QSpinBox::up-button:hover, QSpinBox::down-button:hover,
@@ -714,16 +709,6 @@ QSlider::handle:horizontal:disabled {
image: url("GuiConfigs/light/slider-handle-disabled.svg"); image: url("GuiConfigs/light/slider-handle-disabled.svg");
} }
QSlider::sub-page:horizontal {
background-color: #1A76C6;
border-radius: 2px;
height: 4px;
}
QSlider::sub-page:horizontal:disabled {
background-color: #868788;
}
/* LINE EDIT */ /* LINE EDIT */
QLineEdit { QLineEdit {
@@ -806,7 +791,7 @@ QMenuBar::item:pressed {
QMenu { QMenu {
background-color: #F9F9F9; background-color: #F9F9F9;
border: 1px solid #E5E5E5; border: 1px solid #EEEEEE;
padding: 4px 0px; padding: 4px 0px;
} }
@@ -814,7 +799,7 @@ QMenu::item {
color: #1B1B1B; color: #1B1B1B;
background-color: transparent; background-color: transparent;
border-radius: 4px; border-radius: 4px;
padding: 4px 20px; padding: 8px 20px;
margin: 0px 4px; margin: 0px 4px;
} }
@@ -829,8 +814,8 @@ QMenu::item:disabled {
QMenu::separator { QMenu::separator {
height: 1px; height: 1px;
background: #E5E5E5; background: #EEEEEE;
margin: 4px 8px; margin: 4px 0px;
} }
QMenu::indicator, QMenu::right-arrow { QMenu::indicator, QMenu::right-arrow {
Binary file not shown.

Before

Width:  |  Height:  |  Size: 999 B

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 484 B

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 504 B

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 503 B

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 399 B

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 477 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 380 B

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Some files were not shown because too many files have changed in this diff Show More