Compare commits
361 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b8477a470f | |||
| 2f44523e6d | |||
| 2fa5f6f242 | |||
| a86cce5d70 | |||
| 9856f170a7 | |||
| ba35619718 | |||
| 37331d8ead | |||
| d17784b231 | |||
| 18e1b45388 | |||
| 9b083f801c | |||
| f0907d6f96 | |||
| 71d58e3a67 | |||
| 37425d6fcd | |||
| 1f295bba5b | |||
| a50be7a912 | |||
| f9d52ea5b9 | |||
| e192869e15 | |||
| f1be9bbf6c | |||
| d331ff3193 | |||
| 035a187c42 | |||
| 3c37036f7a | |||
| 14b6d6291b | |||
| 5720a32bc5 | |||
| 11f57f259c | |||
| 3fc6375ec5 | |||
| f8e05f8e3c | |||
| 98c0b3a2b1 | |||
| 6423c23a9a | |||
| dece8a69f6 | |||
| 5724d2d4c7 | |||
| b1736b6411 | |||
| 703ec474f5 | |||
| 64a109d28a | |||
| dc2ec17886 | |||
| 1d9dd8d29d | |||
| 8b0e1d6c03 | |||
| f1a9f6263e | |||
| a049c6fd6b | |||
| 9609767c51 | |||
| 86a8e0716f | |||
| b5e9f09972 | |||
| 4d9a167f56 | |||
| b704cc8375 | |||
| e34c956196 | |||
| 7197dd751a | |||
| 0b9e4ffe54 | |||
| 486ba6121d | |||
| 1015c126d7 | |||
| 1caf81811a | |||
| 4c2a11b6d0 | |||
| 8fd3b26308 | |||
| 617d21fa84 | |||
| 4a88ffe250 | |||
| 41b68ef353 | |||
| 72c85744b9 | |||
| c7b5bbd467 | |||
| 082bbc7336 | |||
| 087dccd194 | |||
| 61450335a5 | |||
| 67649d7976 | |||
| 6247969ede | |||
| efd38fa940 | |||
| 551472220e | |||
| 01703b1350 | |||
| e9d785475e | |||
| 9e008996ab | |||
| bcfae17219 | |||
| ddea45160b | |||
| 53f13a9721 | |||
| 3e33f064bf | |||
| aa0afc9a4e | |||
| a0d1cf26d0 | |||
| 01d14aed80 | |||
| 3c4c830e20 | |||
| 0c9c481cee | |||
| 7dae376646 | |||
| ccb89bd76a | |||
| b2317543c8 | |||
| b812ef2771 | |||
| 7618e7f3fb | |||
| b6732fbae9 | |||
| 68fa377d13 | |||
| 7a9561b966 | |||
| c061991c43 | |||
| bdac1d9bfd | |||
| 266c4209c4 | |||
| fb26da1cb0 | |||
| d623720f4d | |||
| 9d4fcbf946 | |||
| 896db3806d | |||
| 691b986e36 | |||
| 5416f60643 | |||
| 67e2e154fa | |||
| 330dea181a | |||
| 7bc673002f | |||
| ae8d1a3a60 | |||
| 27975e9dfd | |||
| bff938ccf5 | |||
| 53f317e076 | |||
| 0a7df9d02e | |||
| 408ffd3d2c | |||
| a211895e28 | |||
| 19763f8973 | |||
| 99d6f9c7a9 | |||
| 63e4ac80bd | |||
| 24983ea329 | |||
| 6cab5b5591 | |||
| c9d2aed286 | |||
| a16cc3ac8a | |||
| ba1699a831 | |||
| 20c69a0e3e | |||
| bdc5ed094b | |||
| 088d22675b | |||
| fc9b3c13e6 | |||
| 14a64e2529 | |||
| f5415fb4ac | |||
| 20076ed57e | |||
| 006b8574ae | |||
| 1de7ac3c67 | |||
| 8d1fc18941 | |||
| 06dc99ab85 | |||
| e4059dfe6a | |||
| 4048b1e515 | |||
| ccb46df905 | |||
| a16d8ba3ea | |||
| a485957130 | |||
| 56d34e0e80 | |||
| 11824b3916 | |||
| 5ca6381624 | |||
| 024b184008 | |||
| 7a105333dc | |||
| 332eb5fbd6 | |||
| 5b0dac797c | |||
| 86ddc00bb1 | |||
| 3107f37864 | |||
| 17f5fec538 | |||
| 03b76b4606 | |||
| a3e8a61547 | |||
| a8d5a8734a | |||
| 10bbb7fa1f | |||
| 8c5f2b249c | |||
| 332c512eed | |||
| d10584ac6c | |||
| d2b761b7de | |||
| 49c5ce30cc | |||
| 95725bf7fc | |||
| 94c62b1eec | |||
| 02febd3f65 | |||
| 497fbb17a8 | |||
| 5ddb1d6649 | |||
| 396c129d41 | |||
| f64a7bb820 | |||
| 4a9be0a8d2 | |||
| bf1756448e | |||
| ed8f60431f | |||
| 6f1f75bc8f | |||
| 963d150e93 | |||
| c1f1b1174d | |||
| 1ddeef71c6 | |||
| b7eefeac8b | |||
| e57f36fc5b | |||
| 32116086b3 | |||
| 878da3b474 | |||
| 73320d4180 | |||
| a1d31f640a | |||
| 9c7230e79f | |||
| 98687d474b | |||
| 7b57b8f2ca | |||
| 55c98bfaef | |||
| e9a45a2f45 | |||
| 2212a131ef | |||
| deacf05769 | |||
| 870224cde0 | |||
| e557c962fb | |||
| 5a3c218239 | |||
| 1e71deb0db | |||
| dea1d01de2 | |||
| e9bea1c742 | |||
| d51bb8b1cc | |||
| aad5283786 | |||
| 66df38957b | |||
| 7cbafd603a | |||
| 3e48c9744b | |||
| a982280400 | |||
| d62983e1a2 | |||
| 90ac24e524 | |||
| 0b2ba98238 | |||
| 916ce7899b | |||
| b978aa6dca | |||
| 6565855005 | |||
| 9f80a55652 | |||
| 9d895e6b15 | |||
| a7acb84b8b | |||
| 8d54453981 | |||
| 452fb59c74 | |||
| ba45daff35 | |||
| b3fb6d7d18 | |||
| 5dc3467337 | |||
| 729757b1dd | |||
| 393f9d329d | |||
| 820390b7ed | |||
| e0790f758e | |||
| 2f333424a6 | |||
| a67b347966 | |||
| dedf09017a | |||
| cd07ab5b5f | |||
| 6892cb1c7e | |||
| b518a9a338 | |||
| 54d078f379 | |||
| b0a0533a4f | |||
| 399f20ae54 | |||
| 554ba9d6a6 | |||
| 2c05e9719d | |||
| cb9e7358d2 | |||
| ae01e1d2c3 | |||
| 2766e5ca6f | |||
| ca0c4f2cc0 | |||
| 70c98fff19 | |||
| b5698ee101 | |||
| 379138af27 | |||
| 1864419561 | |||
| c4a8bb26fb | |||
| a9ddb1d3b3 | |||
| 314670a347 | |||
| ad49c54531 | |||
| 43ac33c2b4 | |||
| 83fdcff178 | |||
| ee4009e123 | |||
| 2decf1ecda | |||
| 1d7fbd6a9a | |||
| 1213708b72 | |||
| 6cc5428d5e | |||
| 8fcebebae3 | |||
| f801dc6558 | |||
| 8716ac554f | |||
| d7b4753007 | |||
| a9b0d25c01 | |||
| 4c7fc8a70a | |||
| f8e9ea45ba | |||
| 1b6c14be8d | |||
| a5bb925a3d | |||
| 6a14849381 | |||
| f93dbb8f49 | |||
| f83b19cecf | |||
| 1e09be19f5 | |||
| c1de0bc28c | |||
| 1a5a0f5eca | |||
| 8b0cd60be9 | |||
| 2239a52e9b | |||
| c9214ce6c0 | |||
| bb9b5e6aff | |||
| 0327ecc5c1 | |||
| ccdea1c4ad | |||
| c22e1e71f0 | |||
| aff63028d4 | |||
| 7a7b168af3 | |||
| bdf6a1c70e | |||
| d1e07434a1 | |||
| c0d823f1d8 | |||
| 8d0947f07f | |||
| 161d8ef47a | |||
| 8c139206d7 | |||
| e3a7fddddf | |||
| 923ba6f3bb | |||
| 729cd9284e | |||
| 140c5bfc3e | |||
| a5f0faefc3 | |||
| 608f8de347 | |||
| 3e8a00d264 | |||
| 7d5a72c9e0 | |||
| 48d0f80a86 | |||
| bd6c187fcd | |||
| 585837a3f0 | |||
| b4e821c28d | |||
| 589ac1c5d4 | |||
| c9e8b87c60 | |||
| 41f5158247 | |||
| d2993474fb | |||
| 77e312fb99 | |||
| cd6ef2958b | |||
| 40f3adc45f | |||
| cfa2d4aaa8 | |||
| bdefeaf6f9 | |||
| 0958c10f88 | |||
| 4adf412049 | |||
| 03332c340d | |||
| 63ecb56b51 | |||
| cbd895a29c | |||
| 9cbe77904d | |||
| a6350d5dd1 | |||
| 19b5b47b26 | |||
| 52a0b38379 | |||
| a4fdbf0a88 | |||
| 3990e2d3e6 | |||
| 53af2dbb3f | |||
| 5bdd1cf837 | |||
| 5dfe3f414d | |||
| 324fa10918 | |||
| aad06faf1f | |||
| 1a3c01154a | |||
| df338f0552 | |||
| e5d0e035d0 | |||
| 6d91a9fe6f | |||
| 935e398930 | |||
| 2afc7cbaaa | |||
| 1b5cf118e7 | |||
| a3a4c0a906 | |||
| 3ae7debc17 | |||
| dab53f4e41 | |||
| 9da7910fc9 | |||
| 3609eb25c9 | |||
| 55c75d2c87 | |||
| ded828dfc9 | |||
| c69c70cf5f | |||
| 7cd79714fa | |||
| 87af905018 | |||
| 7205a93751 | |||
| f8097a428c | |||
| 228988ca2b | |||
| d2b0b019ec | |||
| a5d74c5e96 | |||
| 3e7e077fad | |||
| dbb03ae2d7 | |||
| 06d2c5357b | |||
| c8e7530e37 | |||
| cdffaa1598 | |||
| b836d2497d | |||
| bdd94f053c | |||
| f88c3ae417 | |||
| b09ac19e61 | |||
| 826dc7d5a6 | |||
| fa5a2b6a85 | |||
| 8b8120cfb7 | |||
| e6a3b59229 | |||
| 0eb0b1e1c9 | |||
| 1becd2f788 | |||
| 7c0b93f815 | |||
| fa852c7dbe | |||
| 73ca2119ed | |||
| 86dbb859b7 | |||
| e1e370999e | |||
| 038c708a0a | |||
| c71bc25090 | |||
| 52fe86b56c | |||
| 004ebfdaee | |||
| d0edd44a69 | |||
| ea5e837bd6 | |||
| bbf52f3cea | |||
| d788b12a8e | |||
| 8a9320c4ef | |||
| 5cc9bd7702 | |||
| aa7e2376ec | |||
| ff211a9508 | |||
| 930895a218 | |||
| 3452e18da1 | |||
| b5d4b5a21c | |||
| 2dc798d539 | |||
| 805d52987f | |||
| c2467b7b38 | |||
| 22b8cfd0ba | |||
| 10a55f16cc |
@@ -7,10 +7,10 @@ git submodule -q update --init --depth 1 $(awk '/path/ && !/llvm/ { print $3 }'
|
||||
|
||||
# Prefer newer Clang than in base system (see also .ci/install-freebsd.sh)
|
||||
# libc++ isn't in llvm* packages, so download manually
|
||||
fetch https://github.com/llvm/llvm-project/releases/download/llvmorg-11.0.0/libcxx-11.0.0.src.tar.xz
|
||||
tar xf libcxx-11.0.0.src.tar.xz
|
||||
export CC=clang11 CXX=clang++11
|
||||
export CXXFLAGS="$CXXFLAGS -nostdinc++ -isystem $PWD/libcxx-11.0.0.src/include"
|
||||
fetch https://github.com/llvm/llvm-project/releases/download/llvmorg-12.0.0/libcxx-12.0.0.src.tar.xz
|
||||
tar xf libcxx-12.0.0.src.tar.xz
|
||||
export CC=clang12 CXX=clang++12
|
||||
export CXXFLAGS="$CXXFLAGS -nostdinc++ -D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS -isystem $PWD/libcxx-12.0.0.src/include"
|
||||
|
||||
CONFIGURE_ARGS="
|
||||
-DWITH_LLVM=OFF
|
||||
|
||||
+8
-4
@@ -5,7 +5,9 @@ export QT_BASE_DIR=/opt/qt${QTVERMIN}
|
||||
export PATH=$QT_BASE_DIR/bin:$PATH
|
||||
export LD_LIBRARY_PATH=$QT_BASE_DIR/lib/x86_64-linux-gnu:$QT_BASE_DIR/lib
|
||||
|
||||
cd rpcs3 || exit 1
|
||||
if [ -z "$CIRRUS_CI" ]; then
|
||||
cd rpcs3 || exit 1
|
||||
fi
|
||||
|
||||
# Pull all the submodules except llvm, since it is built separately and we just download that build
|
||||
# Note: Tried to use git submodule status, but it takes over 20 seconds
|
||||
@@ -55,9 +57,11 @@ ninja; build_status=$?;
|
||||
|
||||
cd ..
|
||||
|
||||
# If it compiled succesfully let's deploy depending on the build pipeline (Azure Pipelines).
|
||||
# Azure publishes PRs as artifacts only.
|
||||
{ [ "$IS_AZURE" = "true" ];
|
||||
shellcheck .ci/*.sh
|
||||
|
||||
# If it compiled succesfully let's deploy.
|
||||
# Azure and Cirrus publish PRs as artifacts only.
|
||||
{ [ "$CI_HAS_ARTIFACTS" = "true" ];
|
||||
} && SHOULD_DEPLOY="true" || SHOULD_DEPLOY="false"
|
||||
|
||||
if [ "$build_status" -eq 0 ] && [ "$SHOULD_DEPLOY" = "true" ]; then
|
||||
|
||||
+5
-5
@@ -12,7 +12,6 @@ if [ "$DEPLOY_APPIMAGE" = "true" ]; then
|
||||
./squashfs-root/AppRun ./appdir/usr/share/applications/*.desktop -bundle-non-qt-libs
|
||||
ls ./appdir/usr/lib/
|
||||
rm -r ./appdir/usr/share/doc
|
||||
rm ./appdir/usr/lib/libxcb*
|
||||
cp "$(readlink -f /lib/x86_64-linux-gnu/libnsl.so.1)" ./appdir/usr/lib/libnsl.so.1
|
||||
export PATH=/rpcs3/build/squashfs-root/usr/bin/:${PATH}
|
||||
|
||||
@@ -33,7 +32,8 @@ if [ "$DEPLOY_APPIMAGE" = "true" ]; then
|
||||
printf "#include <bits/stdc++.h>\nint main(){std::make_exception_ptr(0);std::pmr::get_default_resource();}" | $CXX -x c++ -std=c++2a -o ./appdir/usr/optional/checker -
|
||||
|
||||
# Package it up and send it off
|
||||
./squashfs-root/usr/bin/appimagetool /rpcs3/build/appdir
|
||||
./squashfs-root/usr/bin/appimagetool "$APPDIR"
|
||||
|
||||
ls
|
||||
|
||||
COMM_TAG="$(grep 'version{.*}' ../rpcs3/rpcs3_version.cpp | awk -F[\{,] '{printf "%d.%d.%d", $2, $3, $4}')"
|
||||
@@ -43,14 +43,14 @@ if [ "$DEPLOY_APPIMAGE" = "true" ]; then
|
||||
|
||||
mv ./RPCS3*.AppImage "$RPCS3_APPIMAGE"
|
||||
|
||||
# If we're building using Azure Pipelines, let's copy over the AppImage artifact
|
||||
# If we're building using a CI, let's copy over the AppImage artifact
|
||||
if [ -n "$BUILD_ARTIFACTSTAGINGDIRECTORY" ]; then
|
||||
cp "$RPCS3_APPIMAGE" ~/artifacts
|
||||
cp "$RPCS3_APPIMAGE" "$ARTDIR"
|
||||
fi
|
||||
|
||||
FILESIZE=$(stat -c %s ./rpcs3*.AppImage)
|
||||
SHA256SUM=$(sha256sum ./rpcs3*.AppImage | awk '{ print $1 }')
|
||||
echo "${SHA256SUM};${FILESIZE}B" > /rpcs3/GitHubReleaseMessage.txt
|
||||
echo "${SHA256SUM};${FILESIZE}B" > "$RELEASE_MESSAGE"
|
||||
|
||||
fi
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
ARTIFACT_DIR="$BUILD_ARTIFACTSTAGINGDIRECTORY"
|
||||
|
||||
# Remove unecessary files
|
||||
rm -f ./bin/rpcs3.exp ./bin/rpcs3.lib ./bin/rpcs3.pdb
|
||||
rm -f ./bin/rpcs3.exp ./bin/rpcs3.lib ./bin/rpcs3.pdb ./bin/vc_redist.x64.exe
|
||||
|
||||
# Prepare compatibility database for packaging, as well as
|
||||
# certificate for ssl (auto-updater)
|
||||
@@ -20,5 +20,5 @@ sha256sum "$BUILD" | awk '{ print $1 }' | tee "$BUILD.sha256"
|
||||
echo "$(cat "$BUILD.sha256");$(stat -c %s "$BUILD")B" > GitHubReleaseMessage.txt
|
||||
|
||||
# Move files to publishing directory
|
||||
mv -- "$BUILD" "$ARTIFACT_DIR"
|
||||
mv -- "$BUILD.sha256" "$ARTIFACT_DIR"
|
||||
cp -- "$BUILD" "$ARTIFACT_DIR"
|
||||
cp -- "$BUILD.sha256" "$ARTIFACT_DIR"
|
||||
|
||||
+4
-1
@@ -1,10 +1,13 @@
|
||||
# Variables set by Azure Pipelines
|
||||
IS_AZURE
|
||||
CI_HAS_ARTIFACTS
|
||||
BUILD_REASON
|
||||
BUILD_SOURCEVERSION
|
||||
BUILD_ARTIFACTSTAGINGDIRECTORY
|
||||
BUILD_REPOSITORY_NAME
|
||||
BUILD_SOURCEBRANCHNAME
|
||||
APPDIR
|
||||
ARTDIR
|
||||
RELEASE_MESSAGE
|
||||
# Variables for build matrix
|
||||
COMPILER
|
||||
DEPLOY_APPIMAGE
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/bin/sh -e
|
||||
|
||||
# Export variables for later stages of the Azure pipeline
|
||||
# Values done in this manner will appear as environment variables
|
||||
# in later stages.
|
||||
|
||||
# From pure-sh-bible
|
||||
# Setting 'IFS' tells 'read' where to split the string.
|
||||
while IFS='=' read -r key val; do
|
||||
# Skip over lines containing comments.
|
||||
[ "${key##\#*}" ] || continue
|
||||
export "$key"="$val"
|
||||
done < ".ci/azure-vars.env"
|
||||
@@ -24,7 +24,7 @@ curl -s \
|
||||
cat release.json
|
||||
id=$(grep '"id"' release.json | cut -d ':' -f2 | head -n1 | awk '{$1=$1;print}')
|
||||
id=${id%?}
|
||||
echo ${id:?}
|
||||
echo "${id:?}"
|
||||
|
||||
upload_file()
|
||||
{
|
||||
|
||||
@@ -9,7 +9,7 @@ export ASSUME_ALWAYS_YES=true
|
||||
pkg info # debug
|
||||
|
||||
# Prefer newer Clang than in base system (see also .ci/build-freebsd.sh)
|
||||
pkg install llvm11
|
||||
pkg install llvm12
|
||||
|
||||
# Mandatory dependencies (qt5-dbus and qt5-gui are pulled via qt5-widgets)
|
||||
pkg install git ccache cmake ninja qt5-qmake qt5-buildtools qt5-widgets qt5-concurrent glew openal-soft ffmpeg
|
||||
|
||||
@@ -10,7 +10,7 @@ PR_NUMBER="$SYSTEM_PULLREQUEST_PULLREQUESTID"
|
||||
QT_HOST="http://mirrors.ocf.berkeley.edu/qt/"
|
||||
#QT_HOST="http://qt.mirror.constant.com/"
|
||||
QT_URL_VER=$(echo "$QT_VER" | sed "s/\.//g")
|
||||
QT_VER_MSVC_UP=$(echo ${QT_VER_MSVC} | tr '[:lower:]' '[:upper:]')
|
||||
QT_VER_MSVC_UP=$(echo "${QT_VER_MSVC}" | tr '[:lower:]' '[:upper:]')
|
||||
QT_PREFIX="online/qtsdkrepository/windows_x86/desktop/qt${QT_VER_MAIN}_${QT_URL_VER}/qt.qt${QT_VER_MAIN}.${QT_URL_VER}.win64_${QT_VER_MSVC}_64/${QT_VER}-0-${QT_DATE}"
|
||||
QT_SUFFIX="-Windows-Windows_10-${QT_VER_MSVC_UP}-Windows-Windows_10-X86_64.7z"
|
||||
QT_BASE_URL="${QT_HOST}${QT_PREFIX}qtbase${QT_SUFFIX}"
|
||||
@@ -36,7 +36,7 @@ DEP_URLS=" \
|
||||
# Pull all the submodules except llvm, since it is built separately and we just download that build
|
||||
# Note: Tried to use git submodule status, but it takes over 20 seconds
|
||||
# shellcheck disable=SC2046
|
||||
git submodule -q update --init --depth 1 $(awk '/path/ && !/llvm/ { print $3 }' .gitmodules)
|
||||
git submodule -q update --init --depth=1 --jobs=8 $(awk '/path/ && !/llvm/ { print $3 }' .gitmodules)
|
||||
|
||||
# Git bash doesn't have rev, so here it is
|
||||
rev()
|
||||
@@ -76,7 +76,7 @@ for url in $DEP_URLS; do
|
||||
case "$url" in
|
||||
*qt*) checksum=$(curl -L "${url}.sha1"); algo="sha1"; outDir='C:\Qt\' ;;
|
||||
*llvm*) checksum=$(curl -L "${url}.sha256"); algo="sha256"; outDir="." ;;
|
||||
*glslang*) checksum=$(curl -L "${url}.sha256"); algo="sha256"; outDir="./lib/Release - LLVM-x64" ;;
|
||||
*glslang*) checksum=$(curl -L "${url}.sha256"); algo="sha256"; outDir="./lib/Release-x64" ;;
|
||||
*Vulkan*)
|
||||
# Vulkan setup needs to be run in batch environment
|
||||
# Need to subshell this or else it doesn't wait
|
||||
|
||||
+96
-2
@@ -1,5 +1,101 @@
|
||||
env:
|
||||
CIRRUS_CLONE_DEPTH: 0 # Unshallow clone to obtain proper GIT_VERSION
|
||||
BUILD_REPOSITORY_NAME: $CIRRUS_REPO_FULL_NAME
|
||||
SYSTEM_PULLREQUEST_SOURCEBRANCH: $CIRRUS_BRANCH
|
||||
SYSTEM_PULLREQUEST_PULLREQUESTID: $CIRRUS_PR
|
||||
BUILD_SOURCEVERSION: $CIRRUS_CHANGE_IN_REPO
|
||||
# RPCS3_TOKEN: ENCRYPTED[13a0f18de9285e6c880e3aecbb54258245a74872af7d0fcb92447fa1200ceb6a4dc8acc880ddbf5e653d46336563ca72] # Replace this when we're using Cirrus for master releases!!
|
||||
|
||||
windows_task:
|
||||
matrix:
|
||||
- name: Cirrus Windows
|
||||
windows_container:
|
||||
image: cirrusci/windowsservercore:visualstudio2019
|
||||
cpu: 8
|
||||
memory: 16G
|
||||
env:
|
||||
CIRRUS_SHELL: "bash"
|
||||
COMPILER: msvc
|
||||
QT_VER_MAIN: '5'
|
||||
BUILD_ARTIFACTSTAGINGDIRECTORY: ${CIRRUS_WORKING_DIR}\artifacts\
|
||||
QT_VER: '5.15.2'
|
||||
QT_VER_MSVC: 'msvc2019'
|
||||
QT_DATE: '202011130602'
|
||||
QTDIR: C:\Qt\${QT_VER}\${QT_VER_MSVC}_64
|
||||
VULKAN_VER: '1.2.154.1'
|
||||
VULKAN_SDK_SHA: 'b64471f3a720e649c1fae6535ea83b8c642655ebed1485bfdf15bf4d88f746d9'
|
||||
VULKAN_SDK: C:\VulkanSDK\${VULKAN_VER}
|
||||
CACHE_DIR: "./cache"
|
||||
UPLOAD_COMMIT_HASH: 7d09e3be30805911226241afbb14f8cdc2eb054e
|
||||
UPLOAD_REPO_FULL_NAME: "rpcs3/rpcs3-binaries-win"
|
||||
deps_cache:
|
||||
folder: "./cache"
|
||||
#obj_cache:
|
||||
# folder: "./tmp"
|
||||
#obj2_cache:
|
||||
# folder: "./rpcs3/x64"
|
||||
setup_script:
|
||||
- './.ci/get_keys-windows.sh'
|
||||
- './.ci/setup-windows.sh'
|
||||
# - choco install -y python # Needed for SPIRV, use either this or make a new Docker image
|
||||
# spirv_script:
|
||||
# - export PATH=${PATH}:"C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin"
|
||||
# - cd "${CIRRUS_WORKING_DIR}/Vulkan/spirv-tools-build"
|
||||
# - msbuild.exe spirv-tools-build.vcxproj //p:Configuration=Release //m
|
||||
rpcs3_script:
|
||||
- export PATH=${PATH}:"C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin"
|
||||
- msbuild.exe rpcs3.sln //p:Configuration=Release //m
|
||||
deploy_script:
|
||||
- mkdir artifacts
|
||||
- source './.ci/export-cirrus-vars.sh'
|
||||
- './.ci/deploy-windows.sh'
|
||||
artifacts:
|
||||
name: Artifact
|
||||
path: "*.7z*"
|
||||
# push_script: |
|
||||
# if [ "$CIRRUS_REPO_OWNER" = "RPCS3" ] && [ -z "$CIRRUS_PR" ] && [ "$CIRRUS_BRANCH" = "master" ]; then
|
||||
# source './.ci/export-cirrus-vars.sh'
|
||||
# './.ci/github-upload.sh'
|
||||
# fi;
|
||||
|
||||
linux_task:
|
||||
container:
|
||||
image: rpcs3/rpcs3-ci-bionic:1.0
|
||||
cpu: 4
|
||||
memory: 16G
|
||||
env:
|
||||
BUILD_ARTIFACTSTAGINGDIRECTORY: ${CIRRUS_WORKING_DIR}/artifacts
|
||||
CCACHE_DIR: "/tmp/ccache_dir"
|
||||
CCACHE_MAXSIZE: 300M
|
||||
CI_HAS_ARTIFACTS: true
|
||||
UPLOAD_COMMIT_HASH: d812f1254a1157c80fd402f94446310560f54e5f
|
||||
UPLOAD_REPO_FULL_NAME: "rpcs3/rpcs3-binaries-linux"
|
||||
DEPLOY_APPIMAGE: true
|
||||
APPDIR: "./appdir"
|
||||
ARTDIR: ${CIRRUS_WORKING_DIR}/artifacts/
|
||||
RELEASE_MESSAGE: "../GitHubReleaseMessage.txt"
|
||||
ccache_cache:
|
||||
folder: "/tmp/ccache_dir"
|
||||
matrix:
|
||||
- name: Cirrus Linux GCC
|
||||
env:
|
||||
COMPILER: gcc
|
||||
gcc_script:
|
||||
- mkdir artifacts
|
||||
- ".ci/build-linux.sh"
|
||||
- name: Cirrus Linux Clang
|
||||
env:
|
||||
COMPILER: clang
|
||||
clang_script:
|
||||
- mkdir artifacts
|
||||
- ".ci/build-linux.sh"
|
||||
artifacts:
|
||||
name: Artifact
|
||||
path: "artifacts/*"
|
||||
# push_script: |
|
||||
# if [ "$CIRRUS_REPO_OWNER" = "RPCS3" ] && [ -z "$CIRRUS_PR" ] && [ "$CIRRUS_BRANCH" = "master" ] && [ "$COMPILER" = "gcc" ]; then
|
||||
# '.ci/github-upload.sh'
|
||||
# fi;
|
||||
|
||||
freebsd_task:
|
||||
matrix:
|
||||
@@ -13,7 +109,5 @@ freebsd_task:
|
||||
CCACHE_DIR: /tmp/ccache_dir
|
||||
ccache_cache:
|
||||
folder: /tmp/ccache_dir
|
||||
packages_cache:
|
||||
folder: /var/cache/pkg
|
||||
install_script: "sh -ex ./.ci/install-freebsd.sh"
|
||||
script: "./.ci/build-freebsd.sh"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Getting Started
|
||||
|
||||
Before getting started using the emulator, read the [Quickstart Guide](https://rpcs3.net/quickstart) and the [FAQ](https://rpcs3.net/faq). After reading those, if you need support, visit our [Forums](https://forums.rpcs3.net).
|
||||
Before getting started using the emulator, read the [Quickstart Guide](https://rpcs3.net/quickstart). After reading it, if you need support, check out [How to ask for Support](https://github.com/RPCS3/rpcs3/wiki/How-to-ask-for-Support).
|
||||
|
||||
# Issue Reporting
|
||||
|
||||
@@ -8,13 +8,12 @@ Before getting started using the emulator, read the [Quickstart Guide](https://r
|
||||
|
||||
**Before reporting an issue:**
|
||||
- Check if your system matches all the minimum requirements listed in the [Quickstart Guide](https://rpcs3.net/quickstart);
|
||||
- Check if the issue is meaningful for the team (e.g. The Last of Us doesn't work is obvious and therefore useless);
|
||||
- Search older issues/forum threads to see if your issue was already submitted.
|
||||
- Use understandable English. It doesn't need to be perfect, but clear enough to understand your message.
|
||||
- While reporting issues, don't forget to include details about your system (OS, CPU, GPU, etc.), as well as the RPCS3.log file.
|
||||
- Search older issues/forum threads to see if your issue was already submitted;
|
||||
- Use understandable English. It doesn't need to be perfect, but clear enough to understand your message;
|
||||
- While reporting issues, please follow the template for the type of issue you've selected (Regression Report, Bug Report or Feature Request), which is prefilled on the issue's textbox.
|
||||
|
||||
Submitting your test results for Commercial Games must be done on our forums. Please read the [Game Compatibility](https://github.com/RPCS3/rpcs3/wiki/Game-Compatibility) wiki page before doing so.
|
||||
|
||||
# Contributing
|
||||
|
||||
Check the [Coding Style Guidelines](https://github.com/RPCS3/rpcs3/wiki/Coding-Style), [Roadmap](https://github.com/RPCS3/rpcs3/wiki/Roadmap) and [Developer Information](https://github.com/RPCS3/rpcs3/wiki/Developer-Information). If you have any questions, hit us up on our [Discord Server](https://discord.me/RPCS3) in the **#development** channel.
|
||||
Check the [Coding Style Guidelines](https://github.com/RPCS3/rpcs3/wiki/Coding-Style) and [Developer Information](https://github.com/RPCS3/rpcs3/wiki/Developer-Information). If you have any questions, hit us up on our [Discord Server](https://discord.me/RPCS3) in the **#development** channel.
|
||||
|
||||
@@ -15,6 +15,10 @@ Please briefly describe what has stopped working correctly.
|
||||
## Details
|
||||
Please describe the regression as accurately as possible.
|
||||
|
||||
#### 0. Make sure you're running with settings as close to default as possible
|
||||
* **Do NOT enable any emulator game patches when reporting issues**
|
||||
* Only change settings that are required for the game to work
|
||||
|
||||
#### 1. Please provide _exact_ build (or commit) information that introduced the regression you're reporting.
|
||||
* Please see [How to find the build that caused a regression](https://wiki.rpcs3.net/index.php?title=Help:Using_different_versions_of_RPCS3#How_to_find_the_build_that_caused_a_regression.3F) in our wiki.
|
||||
* You can find [History of RPCS3 builds](https://rpcs3.net/compatibility?b) here.
|
||||
@@ -35,12 +39,12 @@ Please describe the regression as accurately as possible.
|
||||
On Windows it will be near the executable.
|
||||
* Attach the log:
|
||||
+ Drag and drop your log file into the issue.
|
||||
+ Or upload it to the cloud, such as Dropbox, Mega etc.
|
||||
+ Or upload it to the cloud, such as Dropbox, Mega etc.
|
||||
|
||||
#### 3. If you describe graphical regression, please provide an RSX capture and a RenderDoc capture that demonstrate it.
|
||||
* To create an RSX capture, use _Create_ _RSX_ _Capture_ under _Utilities_.
|
||||
Captures will be stored in RPCS3 folder → captures.
|
||||
+ Compress your capture with 7z, Rar etc.
|
||||
+ Compress your capture with 7z, Rar etc.
|
||||
And drag and drop it into the issue.
|
||||
+ Or upload it to the cloud, such as Dropbox, Mega etc.
|
||||
* To create a RenderDoc capture, please refer to [RenderDoc's documentation](https://renderdoc.org/docs/how/how_capture_frame.html).
|
||||
@@ -59,4 +63,4 @@ You can find it in _Emulator_ tab in _Settings_.
|
||||
* etc.
|
||||
|
||||
#### Please include.
|
||||
* Anything else you deem to be important
|
||||
* Anything else you deem to be important
|
||||
|
||||
@@ -16,6 +16,10 @@ Please briefly describe what is not working correctly.
|
||||
|
||||
Please describe the problem as accurately as possible.
|
||||
|
||||
#### 0. Make sure you're running with settings as close to default as possible
|
||||
* **Do NOT enable any emulator game patches when reporting issues**
|
||||
* Only change settings that are required for the game to work
|
||||
|
||||
#### 1. Please attach RPCS3's log.
|
||||
* Run the game until you find the issue.
|
||||
* Completely close RPCS3, or move to the next step in case it has crashed.
|
||||
@@ -28,12 +32,12 @@ Please describe the problem as accurately as possible.
|
||||
On Windows it will be near the executable.
|
||||
* Attach the log:
|
||||
+ Drag and drop your log file into the issue.
|
||||
+ Or upload it to the cloud, such as Dropbox, Mega etc.
|
||||
+ Or upload it to the cloud, such as Dropbox, Mega etc.
|
||||
|
||||
#### 2. If you describe graphical issue, please provide an RSX capture and a RenderDoc capture that demonstrate it.
|
||||
* To create an RSX capture, use _Create_ _RSX_ _Capture_ under _Utilities_.
|
||||
Captures will be stored in RPCS3 folder → captures.
|
||||
+ Compress your capture with 7z, Rar etc.
|
||||
+ Compress your capture with 7z, Rar etc.
|
||||
And drag and drop it into the issue.
|
||||
+ Or upload it to the cloud, such as Dropbox, Mega etc.
|
||||
* To create a RenderDoc capture, please refer to [RenderDoc's documentation](https://renderdoc.org/docs/how/how_capture_frame.html).
|
||||
|
||||
+12
-14
@@ -1,20 +1,18 @@
|
||||
## How to test a PR build
|
||||
|
||||
Please take into account, that RPCS3 build usually takes some time (about 20 min), so you can't access a build, if a PR was just submitted.
|
||||
Please take into account, that RPCS3 build usually takes some time (about 15 mins), so you can't access a build if a PR was just submitted.
|
||||
|
||||
- Open a PR you want to test
|
||||
- Scroll to the very bottom and locate "Checks" section
|
||||
- Expand all checks
|
||||
- Scroll to the very bottom and locate the **Checks** section
|
||||
- Click on **Show all checks**
|
||||
You are supposed to see something like this
|
||||

|
||||
- Click on **Linux_Build** or **Windows_Build** __Details__
|
||||
- Click **View more details on Azure Pipelines** at the very bottom
|
||||

|
||||
- Click on *1 artifact produced*
|
||||

|
||||
- Select a build for your OS and click three dots on the right, Click **Download artifacts**
|
||||

|
||||
|
||||
- Congratulations! You are now downloading RPCS3 build for specific PR.
|
||||

|
||||
- Click on __Details__ on either **Cirrus Linux GCC** or **Cirrus Windows**
|
||||
- Click **View more details on Cirrus CI** at the very bottom
|
||||

|
||||
- Click on the download button for **Artifact** on the **Artifacts** block
|
||||

|
||||
|
||||
Please note, that PR builds are not supposed to be stable, because they contain new changesets.
|
||||
- Congratulations! You are now downloading an RPCS3 build for that specific PR.
|
||||
|
||||
__Please note that PR builds are not supposed to be stable because they contain new changesets.__
|
||||
|
||||
+7
-1
@@ -9,7 +9,7 @@
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
*.la
|
||||
# *.a # Commented out since OpenAL Soft's binaries use this extension.
|
||||
*.a
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.suo
|
||||
@@ -45,6 +45,10 @@
|
||||
!/bin
|
||||
/bin/*
|
||||
|
||||
# Audio DLLs
|
||||
!/bin/soft_oal.dll
|
||||
!/bin/xaudio2_9redist.dll
|
||||
|
||||
# Themes
|
||||
!/bin/GuiConfigs/
|
||||
/bin/GuiConfigs/*.ini
|
||||
@@ -65,6 +69,8 @@
|
||||
*.vcxproj.user
|
||||
enc_temp_folder/*
|
||||
CMakeSettings.json
|
||||
*PVS-Studio*
|
||||
PVS/*
|
||||
|
||||
# Ignore other system generated files
|
||||
x64/*
|
||||
|
||||
+1
-1
@@ -53,7 +53,7 @@
|
||||
url = https://github.com/glennrp/libpng.git
|
||||
ignore = dirty
|
||||
[submodule "3rdparty/libusb"]
|
||||
path = 3rdparty/libusb
|
||||
path = 3rdparty/libusb/src
|
||||
url = https://github.com/libusb/libusb.git
|
||||
ignore = dirty
|
||||
[submodule "3rdparty/FAudio"]
|
||||
|
||||
Vendored
+2
-2
@@ -123,7 +123,7 @@ if(CMAKE_SYSTEM MATCHES "DragonFly|FreeBSD")
|
||||
elseif(MSVC)
|
||||
# Windows time.h defines timespec but doesn't add any flag for it, which makes libusb attempt to define it again
|
||||
add_definitions(-DHAVE_STRUCT_TIMESPEC=1)
|
||||
add_subdirectory(libusb_cmake EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(libusb EXCLUDE_FROM_ALL)
|
||||
else()
|
||||
if(USE_SYS_LIBUSB)
|
||||
# we have the system libusb and have selected to use it
|
||||
@@ -132,7 +132,7 @@ else()
|
||||
else()
|
||||
# we don't have the system libusb, so we compile from submodule
|
||||
unset(LIBUSB_LIBRARIES CACHE)
|
||||
add_subdirectory(libusb_cmake EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(libusb EXCLUDE_FROM_ALL)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
Vendored
+1
-1
Submodule 3rdparty/FAudio updated: 9c7d2d1430...398ca114c0
Vendored
+31
-32
@@ -22,7 +22,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** Deprecated macro. */
|
||||
/* Deprecated macros. */
|
||||
#define OPENAL
|
||||
#define ALAPI AL_API
|
||||
#define ALAPIENTRY AL_APIENTRY
|
||||
@@ -30,7 +30,7 @@ extern "C" {
|
||||
#define AL_ILLEGAL_ENUM AL_INVALID_ENUM
|
||||
#define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION
|
||||
|
||||
/** Supported AL version. */
|
||||
/* Supported AL versions. */
|
||||
#define AL_VERSION_1_0
|
||||
#define AL_VERSION_1_1
|
||||
|
||||
@@ -234,7 +234,7 @@ typedef void ALvoid;
|
||||
*/
|
||||
#define AL_SOURCE_STATE 0x1010
|
||||
|
||||
/** Source state value. */
|
||||
/* Source state values. */
|
||||
#define AL_INITIAL 0x1011
|
||||
#define AL_PLAYING 0x1012
|
||||
#define AL_PAUSED 0x1013
|
||||
@@ -300,7 +300,7 @@ typedef void ALvoid;
|
||||
* Source maximum distance.
|
||||
* Type: ALfloat
|
||||
* Range: [0.0 - ]
|
||||
* Default: +inf
|
||||
* Default: FLT_MAX
|
||||
*
|
||||
* The distance above which the source is not attenuated any further with a
|
||||
* clamped distance model, or where attenuation reaches 0.0 gain for linear
|
||||
@@ -330,15 +330,18 @@ typedef void ALvoid;
|
||||
*/
|
||||
#define AL_SOURCE_TYPE 0x1027
|
||||
|
||||
/** Source type value. */
|
||||
/* Source type values. */
|
||||
#define AL_STATIC 0x1028
|
||||
#define AL_STREAMING 0x1029
|
||||
#define AL_UNDETERMINED 0x1030
|
||||
|
||||
/** Buffer format specifier. */
|
||||
/** Unsigned 8-bit mono buffer format. */
|
||||
#define AL_FORMAT_MONO8 0x1100
|
||||
/** Signed 16-bit mono buffer format. */
|
||||
#define AL_FORMAT_MONO16 0x1101
|
||||
/** Unsigned 8-bit stereo buffer format. */
|
||||
#define AL_FORMAT_STEREO8 0x1102
|
||||
/** Signed 16-bit stereo buffer format. */
|
||||
#define AL_FORMAT_STEREO16 0x1103
|
||||
|
||||
/** Buffer frequency (query only). */
|
||||
@@ -350,11 +353,7 @@ typedef void ALvoid;
|
||||
/** Buffer data size (query only). */
|
||||
#define AL_SIZE 0x2004
|
||||
|
||||
/**
|
||||
* Buffer state.
|
||||
*
|
||||
* Not for public use.
|
||||
*/
|
||||
/* Buffer state. Not for public use. */
|
||||
#define AL_UNUSED 0x2010
|
||||
#define AL_PENDING 0x2011
|
||||
#define AL_PROCESSED 0x2012
|
||||
@@ -441,7 +440,7 @@ AL_API void AL_APIENTRY alSpeedOfSound(ALfloat value);
|
||||
#define AL_DISTANCE_MODEL 0xD000
|
||||
AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel);
|
||||
|
||||
/** Distance model value. */
|
||||
/* Distance model values. */
|
||||
#define AL_INVERSE_DISTANCE 0xD001
|
||||
#define AL_INVERSE_DISTANCE_CLAMPED 0xD002
|
||||
#define AL_LINEAR_DISTANCE 0xD003
|
||||
@@ -449,12 +448,12 @@ AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel);
|
||||
#define AL_EXPONENT_DISTANCE 0xD005
|
||||
#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006
|
||||
|
||||
/** Renderer State management. */
|
||||
/* Renderer State management. */
|
||||
AL_API void AL_APIENTRY alEnable(ALenum capability);
|
||||
AL_API void AL_APIENTRY alDisable(ALenum capability);
|
||||
AL_API ALboolean AL_APIENTRY alIsEnabled(ALenum capability);
|
||||
|
||||
/** State retrieval. */
|
||||
/* State retrieval. */
|
||||
AL_API const ALchar* AL_APIENTRY alGetString(ALenum param);
|
||||
AL_API void AL_APIENTRY alGetBooleanv(ALenum param, ALboolean *values);
|
||||
AL_API void AL_APIENTRY alGetIntegerv(ALenum param, ALint *values);
|
||||
@@ -465,25 +464,25 @@ AL_API ALint AL_APIENTRY alGetInteger(ALenum param);
|
||||
AL_API ALfloat AL_APIENTRY alGetFloat(ALenum param);
|
||||
AL_API ALdouble AL_APIENTRY alGetDouble(ALenum param);
|
||||
|
||||
/**
|
||||
* Error retrieval.
|
||||
*
|
||||
* Obtain the first error generated in the AL context since the last check.
|
||||
*/
|
||||
/* Error retrieval. */
|
||||
|
||||
/** Obtain the first error generated in the AL context since the last check. */
|
||||
AL_API ALenum AL_APIENTRY alGetError(void);
|
||||
|
||||
/**
|
||||
* Extension support.
|
||||
*
|
||||
* Query for the presence of an extension, and obtain any appropriate function
|
||||
* pointers and enum values.
|
||||
*/
|
||||
/** Query for the presence of an extension on the AL context. */
|
||||
AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extname);
|
||||
/**
|
||||
* Retrieve the address of a function. The returned function may be context-
|
||||
* specific.
|
||||
*/
|
||||
AL_API void* AL_APIENTRY alGetProcAddress(const ALchar *fname);
|
||||
/**
|
||||
* Retrieve the value of an enum. The returned value may be context-specific.
|
||||
*/
|
||||
AL_API ALenum AL_APIENTRY alGetEnumValue(const ALchar *ename);
|
||||
|
||||
|
||||
/** Set Listener parameters */
|
||||
/* Set Listener parameters */
|
||||
AL_API void AL_APIENTRY alListenerf(ALenum param, ALfloat value);
|
||||
AL_API void AL_APIENTRY alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
|
||||
AL_API void AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values);
|
||||
@@ -491,7 +490,7 @@ AL_API void AL_APIENTRY alListeneri(ALenum param, ALint value);
|
||||
AL_API void AL_APIENTRY alListener3i(ALenum param, ALint value1, ALint value2, ALint value3);
|
||||
AL_API void AL_APIENTRY alListeneriv(ALenum param, const ALint *values);
|
||||
|
||||
/** Get Listener parameters */
|
||||
/* Get Listener parameters */
|
||||
AL_API void AL_APIENTRY alGetListenerf(ALenum param, ALfloat *value);
|
||||
AL_API void AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3);
|
||||
AL_API void AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values);
|
||||
@@ -507,7 +506,7 @@ AL_API void AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources);
|
||||
/** Verify a handle is a valid Source. */
|
||||
AL_API ALboolean AL_APIENTRY alIsSource(ALuint source);
|
||||
|
||||
/** Set Source parameters. */
|
||||
/* Set Source parameters. */
|
||||
AL_API void AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value);
|
||||
AL_API void AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
|
||||
AL_API void AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat *values);
|
||||
@@ -515,7 +514,7 @@ AL_API void AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value);
|
||||
AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3);
|
||||
AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *values);
|
||||
|
||||
/** Get Source parameters. */
|
||||
/* Get Source parameters. */
|
||||
AL_API void AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *value);
|
||||
AL_API void AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3);
|
||||
AL_API void AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *values);
|
||||
@@ -558,7 +557,7 @@ AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer);
|
||||
/** Specifies the data to be copied into a buffer */
|
||||
AL_API void AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq);
|
||||
|
||||
/** Set Buffer parameters, */
|
||||
/* Set Buffer parameters, */
|
||||
AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum param, ALfloat value);
|
||||
AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
|
||||
AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum param, const ALfloat *values);
|
||||
@@ -566,7 +565,7 @@ AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum param, ALint value);
|
||||
AL_API void AL_APIENTRY alBuffer3i(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3);
|
||||
AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum param, const ALint *values);
|
||||
|
||||
/** Get Buffer parameters. */
|
||||
/* Get Buffer parameters. */
|
||||
AL_API void AL_APIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat *value);
|
||||
AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3);
|
||||
AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values);
|
||||
@@ -574,7 +573,7 @@ AL_API void AL_APIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint *value);
|
||||
AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3);
|
||||
AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint *values);
|
||||
|
||||
/** Pointer-to-function type, useful for dynamically getting AL entry points. */
|
||||
/* Pointer-to-function type, useful for dynamically getting AL entry points. */
|
||||
typedef void (AL_APIENTRY *LPALENABLE)(ALenum capability);
|
||||
typedef void (AL_APIENTRY *LPALDISABLE)(ALenum capability);
|
||||
typedef ALboolean (AL_APIENTRY *LPALISENABLED)(ALenum capability);
|
||||
|
||||
Vendored
+54
-21
@@ -22,7 +22,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/** Deprecated macro. */
|
||||
/* Deprecated macros. */
|
||||
#define ALCAPI ALC_API
|
||||
#define ALCAPIENTRY ALC_APIENTRY
|
||||
#define ALC_INVALID 0
|
||||
@@ -89,7 +89,7 @@ typedef void ALCvoid;
|
||||
/** Context attribute: <int> Hz. */
|
||||
#define ALC_REFRESH 0x1008
|
||||
|
||||
/** Context attribute: AL_TRUE or AL_FALSE. */
|
||||
/** Context attribute: AL_TRUE or AL_FALSE synchronous context? */
|
||||
#define ALC_SYNC 0x1009
|
||||
|
||||
/** Context attribute: <int> requested Mono (3D) Sources. */
|
||||
@@ -117,12 +117,14 @@ typedef void ALCvoid;
|
||||
#define ALC_OUT_OF_MEMORY 0xA005
|
||||
|
||||
|
||||
/** Runtime ALC version. */
|
||||
/** Runtime ALC major version. */
|
||||
#define ALC_MAJOR_VERSION 0x1000
|
||||
/** Runtime ALC minor version. */
|
||||
#define ALC_MINOR_VERSION 0x1001
|
||||
|
||||
/** Context attribute list properties. */
|
||||
/** Context attribute list size. */
|
||||
#define ALC_ATTRIBUTES_SIZE 0x1002
|
||||
/** Context attribute list properties. */
|
||||
#define ALC_ALL_ATTRIBUTES 0x1003
|
||||
|
||||
/** String for the default device specifier. */
|
||||
@@ -166,49 +168,80 @@ typedef void ALCvoid;
|
||||
#define ALC_ALL_DEVICES_SPECIFIER 0x1013
|
||||
|
||||
|
||||
/** Context management. */
|
||||
ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint* attrlist);
|
||||
/* Context management. */
|
||||
|
||||
/** Create and attach a context to the given device. */
|
||||
ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint *attrlist);
|
||||
/**
|
||||
* Makes the given context the active process-wide context. Passing NULL clears
|
||||
* the active context.
|
||||
*/
|
||||
ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context);
|
||||
/** Resumes processing updates for the given context. */
|
||||
ALC_API void ALC_APIENTRY alcProcessContext(ALCcontext *context);
|
||||
/** Suspends updates for the given context. */
|
||||
ALC_API void ALC_APIENTRY alcSuspendContext(ALCcontext *context);
|
||||
/** Remove a context from its device and destroys it. */
|
||||
ALC_API void ALC_APIENTRY alcDestroyContext(ALCcontext *context);
|
||||
/** Returns the currently active context. */
|
||||
ALC_API ALCcontext* ALC_APIENTRY alcGetCurrentContext(void);
|
||||
/** Returns the device that a particular context is attached to. */
|
||||
ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *context);
|
||||
|
||||
/** Device management. */
|
||||
/* Device management. */
|
||||
|
||||
/** Opens the named playback device. */
|
||||
ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *devicename);
|
||||
/** Closes the given playback device. */
|
||||
ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device);
|
||||
|
||||
/* Error support. */
|
||||
|
||||
/**
|
||||
* Error support.
|
||||
*
|
||||
* Obtain the most recent Device error.
|
||||
*/
|
||||
/** Obtain the most recent Device error. */
|
||||
ALC_API ALCenum ALC_APIENTRY alcGetError(ALCdevice *device);
|
||||
|
||||
/* Extension support. */
|
||||
|
||||
/**
|
||||
* Extension support.
|
||||
*
|
||||
* Query for the presence of an extension, and obtain any appropriate
|
||||
* function pointers and enum values.
|
||||
* Query for the presence of an extension on the device. Pass a NULL device to
|
||||
* query a device-inspecific extension.
|
||||
*/
|
||||
ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const ALCchar *extname);
|
||||
ALC_API void* ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcname);
|
||||
/**
|
||||
* Retrieve the address of a function. Given a non-NULL device, the returned
|
||||
* function may be device-specific.
|
||||
*/
|
||||
ALC_API ALCvoid* ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcname);
|
||||
/**
|
||||
* Retrieve the value of an enum. Given a non-NULL device, the returned value
|
||||
* may be device-specific.
|
||||
*/
|
||||
ALC_API ALCenum ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *enumname);
|
||||
|
||||
/** Query function. */
|
||||
/* Query functions. */
|
||||
|
||||
/** Returns information about the device, and error strings. */
|
||||
ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum param);
|
||||
/** Returns information about the device and the version of OpenAL. */
|
||||
ALC_API void ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values);
|
||||
|
||||
/** Capture function. */
|
||||
/* Capture functions. */
|
||||
|
||||
/**
|
||||
* Opens the named capture device with the given frequency, format, and buffer
|
||||
* size.
|
||||
*/
|
||||
ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize);
|
||||
/** Closes the given capture device. */
|
||||
ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device);
|
||||
/** Starts capturing samples into the device buffer. */
|
||||
ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device);
|
||||
/** Stops capturing samples. Samples in the device buffer remain available. */
|
||||
ALC_API void ALC_APIENTRY alcCaptureStop(ALCdevice *device);
|
||||
/** Reads samples from the device buffer. */
|
||||
ALC_API void ALC_APIENTRY alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples);
|
||||
|
||||
/** Pointer-to-function type, useful for dynamically getting ALC entry points. */
|
||||
/* Pointer-to-function type, useful for dynamically getting ALC entry points. */
|
||||
typedef ALCcontext* (ALC_APIENTRY *LPALCCREATECONTEXT)(ALCdevice *device, const ALCint *attrlist);
|
||||
typedef ALCboolean (ALC_APIENTRY *LPALCMAKECONTEXTCURRENT)(ALCcontext *context);
|
||||
typedef void (ALC_APIENTRY *LPALCPROCESSCONTEXT)(ALCcontext *context);
|
||||
@@ -220,7 +253,7 @@ typedef ALCdevice* (ALC_APIENTRY *LPALCOPENDEVICE)(const ALCchar *devicename
|
||||
typedef ALCboolean (ALC_APIENTRY *LPALCCLOSEDEVICE)(ALCdevice *device);
|
||||
typedef ALCenum (ALC_APIENTRY *LPALCGETERROR)(ALCdevice *device);
|
||||
typedef ALCboolean (ALC_APIENTRY *LPALCISEXTENSIONPRESENT)(ALCdevice *device, const ALCchar *extname);
|
||||
typedef void* (ALC_APIENTRY *LPALCGETPROCADDRESS)(ALCdevice *device, const ALCchar *funcname);
|
||||
typedef ALCvoid* (ALC_APIENTRY *LPALCGETPROCADDRESS)(ALCdevice *device, const ALCchar *funcname);
|
||||
typedef ALCenum (ALC_APIENTRY *LPALCGETENUMVALUE)(ALCdevice *device, const ALCchar *enumname);
|
||||
typedef const ALCchar* (ALC_APIENTRY *LPALCGETSTRING)(ALCdevice *device, ALCenum param);
|
||||
typedef void (ALC_APIENTRY *LPALCGETINTEGERV)(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values);
|
||||
|
||||
Vendored
+68
-19
@@ -22,17 +22,20 @@
|
||||
#define AL_ALEXT_H
|
||||
|
||||
#include <stddef.h>
|
||||
/* Define int64_t and uint64_t types */
|
||||
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
|
||||
#include <inttypes.h>
|
||||
#elif defined(_WIN32) && defined(__GNUC__)
|
||||
/* Define int64 and uint64 types */
|
||||
#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
|
||||
(defined(__cplusplus) && __cplusplus >= 201103L)
|
||||
#include <stdint.h>
|
||||
typedef int64_t _alsoft_int64_t;
|
||||
typedef uint64_t _alsoft_uint64_t;
|
||||
#elif defined(_WIN32)
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
typedef __int64 _alsoft_int64_t;
|
||||
typedef unsigned __int64 _alsoft_uint64_t;
|
||||
#else
|
||||
/* Fallback if nothing above works */
|
||||
#include <inttypes.h>
|
||||
#include <stdint.h>
|
||||
typedef int64_t _alsoft_int64_t;
|
||||
typedef uint64_t _alsoft_uint64_t;
|
||||
#endif
|
||||
|
||||
#include "alc.h"
|
||||
@@ -158,9 +161,9 @@ extern "C" {
|
||||
|
||||
#ifndef AL_EXT_STATIC_BUFFER
|
||||
#define AL_EXT_STATIC_BUFFER 1
|
||||
typedef ALvoid (AL_APIENTRY*PFNALBUFFERDATASTATICPROC)(const ALint,ALenum,ALvoid*,ALsizei,ALsizei);
|
||||
typedef void (AL_APIENTRY*PFNALBUFFERDATASTATICPROC)(const ALint,ALenum,ALvoid*,ALsizei,ALsizei);
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API ALvoid AL_APIENTRY alBufferDataStatic(const ALint buffer, ALenum format, ALvoid *data, ALsizei len, ALsizei freq);
|
||||
AL_API void AL_APIENTRY alBufferDataStatic(const ALint buffer, ALenum format, ALvoid *data, ALsizei len, ALsizei freq);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -193,9 +196,9 @@ ALC_API ALCcontext* ALC_APIENTRY alcGetThreadContext(void);
|
||||
#define AL_SOFT_buffer_sub_data 1
|
||||
#define AL_BYTE_RW_OFFSETS_SOFT 0x1031
|
||||
#define AL_SAMPLE_RW_OFFSETS_SOFT 0x1032
|
||||
typedef ALvoid (AL_APIENTRY*PFNALBUFFERSUBDATASOFTPROC)(ALuint,ALenum,const ALvoid*,ALsizei,ALsizei);
|
||||
typedef void (AL_APIENTRY*PFNALBUFFERSUBDATASOFTPROC)(ALuint,ALenum,const ALvoid*,ALsizei,ALsizei);
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer,ALenum format,const ALvoid *data,ALsizei offset,ALsizei length);
|
||||
AL_API void AL_APIENTRY alBufferSubDataSOFT(ALuint buffer,ALenum format,const ALvoid *data,ALsizei offset,ALsizei length);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -343,8 +346,8 @@ ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, ALCvoid *buffe
|
||||
#define AL_SOFT_source_latency 1
|
||||
#define AL_SAMPLE_OFFSET_LATENCY_SOFT 0x1200
|
||||
#define AL_SEC_OFFSET_LATENCY_SOFT 0x1201
|
||||
typedef int64_t ALint64SOFT;
|
||||
typedef uint64_t ALuint64SOFT;
|
||||
typedef _alsoft_int64_t ALint64SOFT;
|
||||
typedef _alsoft_uint64_t ALuint64SOFT;
|
||||
typedef void (AL_APIENTRY*LPALSOURCEDSOFT)(ALuint,ALenum,ALdouble);
|
||||
typedef void (AL_APIENTRY*LPALSOURCE3DSOFT)(ALuint,ALenum,ALdouble,ALdouble,ALdouble);
|
||||
typedef void (AL_APIENTRY*LPALSOURCEDVSOFT)(ALuint,ALenum,const ALdouble*);
|
||||
@@ -381,11 +384,11 @@ AL_API void AL_APIENTRY alGetSourcei64vSOFT(ALuint source, ALenum param, ALint64
|
||||
#ifndef AL_SOFT_deferred_updates
|
||||
#define AL_SOFT_deferred_updates 1
|
||||
#define AL_DEFERRED_UPDATES_SOFT 0xC002
|
||||
typedef ALvoid (AL_APIENTRY*LPALDEFERUPDATESSOFT)(void);
|
||||
typedef ALvoid (AL_APIENTRY*LPALPROCESSUPDATESSOFT)(void);
|
||||
typedef void (AL_APIENTRY*LPALDEFERUPDATESSOFT)(void);
|
||||
typedef void (AL_APIENTRY*LPALPROCESSUPDATESSOFT)(void);
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API ALvoid AL_APIENTRY alDeferUpdatesSOFT(void);
|
||||
AL_API ALvoid AL_APIENTRY alProcessUpdatesSOFT(void);
|
||||
AL_API void AL_APIENTRY alDeferUpdatesSOFT(void);
|
||||
AL_API void AL_APIENTRY alProcessUpdatesSOFT(void);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -496,8 +499,8 @@ AL_API const ALchar* AL_APIENTRY alGetStringiSOFT(ALenum pname, ALsizei index);
|
||||
|
||||
#ifndef ALC_SOFT_device_clock
|
||||
#define ALC_SOFT_device_clock 1
|
||||
typedef int64_t ALCint64SOFT;
|
||||
typedef uint64_t ALCuint64SOFT;
|
||||
typedef _alsoft_int64_t ALCint64SOFT;
|
||||
typedef _alsoft_uint64_t ALCuint64SOFT;
|
||||
#define ALC_DEVICE_CLOCK_SOFT 0x1600
|
||||
#define ALC_DEVICE_LATENCY_SOFT 0x1601
|
||||
#define ALC_DEVICE_CLOCK_LATENCY_SOFT 0x1602
|
||||
@@ -530,6 +533,52 @@ ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname,
|
||||
#define AL_N3D_SOFT 0x0002
|
||||
#endif
|
||||
|
||||
#ifndef ALC_SOFT_loopback_bformat
|
||||
#define ALC_SOFT_loopback_bformat 1
|
||||
#define ALC_AMBISONIC_LAYOUT_SOFT 0x1997
|
||||
#define ALC_AMBISONIC_SCALING_SOFT 0x1998
|
||||
#define ALC_AMBISONIC_ORDER_SOFT 0x1999
|
||||
#define ALC_MAX_AMBISONIC_ORDER_SOFT 0x199B
|
||||
|
||||
#define ALC_BFORMAT3D_SOFT 0x1507
|
||||
|
||||
/* Ambisonic layouts */
|
||||
#define ALC_FUMA_SOFT 0x0000
|
||||
#define ALC_ACN_SOFT 0x0001
|
||||
|
||||
/* Ambisonic scalings (normalization) */
|
||||
/*#define ALC_FUMA_SOFT*/
|
||||
#define ALC_SN3D_SOFT 0x0001
|
||||
#define ALC_N3D_SOFT 0x0002
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_effect_target
|
||||
#define AL_SOFT_effect_target
|
||||
#define AL_EFFECTSLOT_TARGET_SOFT 0x199C
|
||||
#endif
|
||||
|
||||
#ifndef AL_SOFT_events
|
||||
#define AL_SOFT_events 1
|
||||
#define AL_EVENT_CALLBACK_FUNCTION_SOFT 0x19A2
|
||||
#define AL_EVENT_CALLBACK_USER_PARAM_SOFT 0x19A3
|
||||
#define AL_EVENT_TYPE_BUFFER_COMPLETED_SOFT 0x19A4
|
||||
#define AL_EVENT_TYPE_SOURCE_STATE_CHANGED_SOFT 0x19A5
|
||||
#define AL_EVENT_TYPE_DISCONNECTED_SOFT 0x19A6
|
||||
typedef void (AL_APIENTRY*ALEVENTPROCSOFT)(ALenum eventType, ALuint object, ALuint param,
|
||||
ALsizei length, const ALchar *message,
|
||||
void *userParam);
|
||||
typedef void (AL_APIENTRY*LPALEVENTCONTROLSOFT)(ALsizei count, const ALenum *types, ALboolean enable);
|
||||
typedef void (AL_APIENTRY*LPALEVENTCALLBACKSOFT)(ALEVENTPROCSOFT callback, void *userParam);
|
||||
typedef void* (AL_APIENTRY*LPALGETPOINTERSOFT)(ALenum pname);
|
||||
typedef void (AL_APIENTRY*LPALGETPOINTERVSOFT)(ALenum pname, void **values);
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API void AL_APIENTRY alEventControlSOFT(ALsizei count, const ALenum *types, ALboolean enable);
|
||||
AL_API void AL_APIENTRY alEventCallbackSOFT(ALEVENTPROCSOFT callback, void *userParam);
|
||||
AL_API void* AL_APIENTRY alGetPointerSOFT(ALenum pname);
|
||||
AL_API void AL_APIENTRY alGetPointervSOFT(ALenum pname, void **values);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
Vendored
+30
-30
@@ -243,41 +243,41 @@ typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTF)(ALuint, ALenum, ALfloat*
|
||||
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTFV)(ALuint, ALenum, ALfloat*);
|
||||
|
||||
#ifdef AL_ALEXT_PROTOTYPES
|
||||
AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects);
|
||||
AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects);
|
||||
AL_API void AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects);
|
||||
AL_API void AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects);
|
||||
AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect);
|
||||
AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint iValue);
|
||||
AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *piValues);
|
||||
AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat flValue);
|
||||
AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *pflValues);
|
||||
AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *piValue);
|
||||
AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *piValues);
|
||||
AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *pflValue);
|
||||
AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *pflValues);
|
||||
AL_API void AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint iValue);
|
||||
AL_API void AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *piValues);
|
||||
AL_API void AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat flValue);
|
||||
AL_API void AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *pflValues);
|
||||
AL_API void AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *piValue);
|
||||
AL_API void AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *piValues);
|
||||
AL_API void AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *pflValue);
|
||||
AL_API void AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *pflValues);
|
||||
|
||||
AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters);
|
||||
AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters);
|
||||
AL_API void AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters);
|
||||
AL_API void AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters);
|
||||
AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter);
|
||||
AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint iValue);
|
||||
AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *piValues);
|
||||
AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat flValue);
|
||||
AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *pflValues);
|
||||
AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *piValue);
|
||||
AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *piValues);
|
||||
AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *pflValue);
|
||||
AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *pflValues);
|
||||
AL_API void AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint iValue);
|
||||
AL_API void AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *piValues);
|
||||
AL_API void AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat flValue);
|
||||
AL_API void AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *pflValues);
|
||||
AL_API void AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *piValue);
|
||||
AL_API void AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *piValues);
|
||||
AL_API void AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *pflValue);
|
||||
AL_API void AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *pflValues);
|
||||
|
||||
AL_API ALvoid AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots);
|
||||
AL_API ALvoid AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint *effectslots);
|
||||
AL_API void AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots);
|
||||
AL_API void AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint *effectslots);
|
||||
AL_API ALboolean AL_APIENTRY alIsAuxiliaryEffectSlot(ALuint effectslot);
|
||||
AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint iValue);
|
||||
AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, const ALint *piValues);
|
||||
AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat flValue);
|
||||
AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, const ALfloat *pflValues);
|
||||
AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint *piValue);
|
||||
AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *piValues);
|
||||
AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat *pflValue);
|
||||
AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *pflValues);
|
||||
AL_API void AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint iValue);
|
||||
AL_API void AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, const ALint *piValues);
|
||||
AL_API void AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat flValue);
|
||||
AL_API void AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, const ALfloat *pflValues);
|
||||
AL_API void AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint *piValue);
|
||||
AL_API void AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *piValues);
|
||||
AL_API void AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat *pflValue);
|
||||
AL_API void AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *pflValues);
|
||||
#endif
|
||||
|
||||
/* Filter ranges and defaults. */
|
||||
|
||||
+80
@@ -1,35 +1,84 @@
|
||||
EXPORTS
|
||||
alAuxiliaryEffectSlotPlaySOFT
|
||||
alAuxiliaryEffectSlotPlayvSOFT
|
||||
alAuxiliaryEffectSlotStopSOFT
|
||||
alAuxiliaryEffectSlotStopvSOFT
|
||||
alAuxiliaryEffectSlotf
|
||||
alAuxiliaryEffectSlotfv
|
||||
alAuxiliaryEffectSloti
|
||||
alAuxiliaryEffectSlotiv
|
||||
alBuffer3f
|
||||
alBuffer3i
|
||||
alBufferCallbackSOFT
|
||||
alBufferData
|
||||
alBufferSamplesSOFT
|
||||
alBufferStorageSOFT
|
||||
alBufferSubDataSOFT
|
||||
alBufferSubSamplesSOFT
|
||||
alBufferf
|
||||
alBufferfv
|
||||
alBufferi
|
||||
alBufferiv
|
||||
alDeferUpdatesSOFT
|
||||
alDeleteAuxiliaryEffectSlots
|
||||
alDeleteBuffers
|
||||
alDeleteEffects
|
||||
alDeleteFilters
|
||||
alDeleteSources
|
||||
alDisable
|
||||
alDistanceModel
|
||||
alDopplerFactor
|
||||
alDopplerVelocity
|
||||
alEffectf
|
||||
alEffectfv
|
||||
alEffecti
|
||||
alEffectiv
|
||||
alEnable
|
||||
alEventCallbackSOFT
|
||||
alEventControlSOFT
|
||||
alFilterf
|
||||
alFilterfv
|
||||
alFilteri
|
||||
alFilteriv
|
||||
alFlushMappedBufferSOFT
|
||||
alGenAuxiliaryEffectSlots
|
||||
alGenBuffers
|
||||
alGenEffects
|
||||
alGenFilters
|
||||
alGenSources
|
||||
alGetAuxiliaryEffectSlotf
|
||||
alGetAuxiliaryEffectSlotfv
|
||||
alGetAuxiliaryEffectSloti
|
||||
alGetAuxiliaryEffectSlotiv
|
||||
alGetBoolean
|
||||
alGetBooleanv
|
||||
alGetBuffer3PtrSOFT
|
||||
alGetBuffer3f
|
||||
alGetBuffer3i
|
||||
alGetBufferPtrSOFT
|
||||
alGetBufferPtrvSOFT
|
||||
alGetBufferSamplesSOFT
|
||||
alGetBufferf
|
||||
alGetBufferfv
|
||||
alGetBufferi
|
||||
alGetBufferiv
|
||||
alGetDouble
|
||||
alGetDoublev
|
||||
alGetEffectf
|
||||
alGetEffectfv
|
||||
alGetEffecti
|
||||
alGetEffectiv
|
||||
alGetEnumValue
|
||||
alGetError
|
||||
alGetFilterf
|
||||
alGetFilterfv
|
||||
alGetFilteri
|
||||
alGetFilteriv
|
||||
alGetFloat
|
||||
alGetFloatv
|
||||
alGetInteger
|
||||
alGetInteger64SOFT
|
||||
alGetInteger64vSOFT
|
||||
alGetIntegerv
|
||||
alGetListener3f
|
||||
alGetListener3i
|
||||
@@ -37,17 +86,30 @@ EXPORTS
|
||||
alGetListenerfv
|
||||
alGetListeneri
|
||||
alGetListeneriv
|
||||
alGetPointerSOFT
|
||||
alGetPointervSOFT
|
||||
alGetProcAddress
|
||||
alGetSource3dSOFT
|
||||
alGetSource3f
|
||||
alGetSource3i
|
||||
alGetSource3i64SOFT
|
||||
alGetSourcedSOFT
|
||||
alGetSourcedvSOFT
|
||||
alGetSourcef
|
||||
alGetSourcefv
|
||||
alGetSourcei
|
||||
alGetSourcei64SOFT
|
||||
alGetSourcei64vSOFT
|
||||
alGetSourceiv
|
||||
alGetString
|
||||
alGetStringiSOFT
|
||||
alIsAuxiliaryEffectSlot
|
||||
alIsBuffer
|
||||
alIsBufferFormatSupportedSOFT
|
||||
alIsEffect
|
||||
alIsEnabled
|
||||
alIsExtensionPresent
|
||||
alIsFilter
|
||||
alIsSource
|
||||
alListener3f
|
||||
alListener3i
|
||||
@@ -55,8 +117,12 @@ EXPORTS
|
||||
alListenerfv
|
||||
alListeneri
|
||||
alListeneriv
|
||||
alMapBufferSOFT
|
||||
alProcessUpdatesSOFT
|
||||
alSource3dSOFT
|
||||
alSource3f
|
||||
alSource3i
|
||||
alSource3i64SOFT
|
||||
alSourcePause
|
||||
alSourcePausev
|
||||
alSourcePlay
|
||||
@@ -67,11 +133,16 @@ EXPORTS
|
||||
alSourceStop
|
||||
alSourceStopv
|
||||
alSourceUnqueueBuffers
|
||||
alSourcedSOFT
|
||||
alSourcedvSOFT
|
||||
alSourcef
|
||||
alSourcefv
|
||||
alSourcei
|
||||
alSourcei64SOFT
|
||||
alSourcei64vSOFT
|
||||
alSourceiv
|
||||
alSpeedOfSound
|
||||
alUnmapBufferSOFT
|
||||
alcCaptureCloseDevice
|
||||
alcCaptureOpenDevice
|
||||
alcCaptureSamples
|
||||
@@ -80,17 +151,26 @@ EXPORTS
|
||||
alcCloseDevice
|
||||
alcCreateContext
|
||||
alcDestroyContext
|
||||
alcDevicePauseSOFT
|
||||
alcDeviceResumeSOFT
|
||||
alcGetContextsDevice
|
||||
alcGetCurrentContext
|
||||
alcGetEnumValue
|
||||
alcGetError
|
||||
alcGetInteger64vSOFT
|
||||
alcGetIntegerv
|
||||
alcGetProcAddress
|
||||
alcGetString
|
||||
alcGetStringiSOFT
|
||||
alcGetThreadContext
|
||||
alcIsExtensionPresent
|
||||
alcIsRenderFormatSupportedSOFT
|
||||
alcLoopbackOpenDeviceSOFT
|
||||
alcMakeContextCurrent
|
||||
alcOpenDevice
|
||||
alcProcessContext
|
||||
alcRenderSamplesSOFT
|
||||
alcResetDeviceSOFT
|
||||
alcSetThreadContext
|
||||
alcSuspendContext
|
||||
alsoft_get_version
|
||||
|
||||
BIN
Binary file not shown.
+10
-9
@@ -18,10 +18,10 @@
|
||||
|
||||
// Current name of the DLL shipped in the same SDK as this header.
|
||||
// The name reflects the current version
|
||||
#define XAUDIO2_DLL_A "xaudio2redist.dll"
|
||||
#define XAUDIO2_DLL_W L"xaudio2redist.dll"
|
||||
#define XAUDIO2D_DLL_A "xaudio2redist.dll"
|
||||
#define XAUDIO2D_DLL_W L"xaudio2redist.dll"
|
||||
#define XAUDIO2_DLL_A "xaudio2_9redist.dll"
|
||||
#define XAUDIO2_DLL_W L"xaudio2_9redist.dll"
|
||||
#define XAUDIO2D_DLL_A "xaudio2_9redist.dll"
|
||||
#define XAUDIO2D_DLL_W L"xaudio2_9redist.dll"
|
||||
|
||||
#ifdef UNICODE
|
||||
#define XAUDIO2_DLL XAUDIO2_DLL_W
|
||||
@@ -446,7 +446,7 @@ DECLARE_INTERFACE_(IXAudio2, IUnknown)
|
||||
// ARGUMENTS:
|
||||
// pCallback - Callback interface to be called during each processing pass.
|
||||
//
|
||||
STDMETHOD(RegisterForCallbacks) (_In_ IXAudio2EngineCallback* pCallback) PURE;
|
||||
STDMETHOD(RegisterForCallbacks) (THIS_ _In_ IXAudio2EngineCallback* pCallback) PURE;
|
||||
|
||||
// NAME: IXAudio2::UnregisterForCallbacks
|
||||
// DESCRIPTION: Removes an existing receiver of XAudio2 engine callbacks.
|
||||
@@ -454,7 +454,7 @@ DECLARE_INTERFACE_(IXAudio2, IUnknown)
|
||||
// ARGUMENTS:
|
||||
// pCallback - Previously registered callback interface to be removed.
|
||||
//
|
||||
STDMETHOD_(void, UnregisterForCallbacks) (_In_ IXAudio2EngineCallback* pCallback) PURE;
|
||||
STDMETHOD_(void, UnregisterForCallbacks) (THIS_ _In_ IXAudio2EngineCallback* pCallback) PURE;
|
||||
|
||||
// NAME: IXAudio2::CreateSourceVoice
|
||||
// DESCRIPTION: Creates and configures a source voice.
|
||||
@@ -1047,6 +1047,8 @@ DECLARE_INTERFACE(IXAudio2VoiceCallback)
|
||||
#define IXAudio2_QueryInterface(This,riid,ppvInterface) ((This)->lpVtbl->QueryInterface(This,riid,ppvInterface))
|
||||
#define IXAudio2_AddRef(This) ((This)->lpVtbl->AddRef(This))
|
||||
#define IXAudio2_Release(This) ((This)->lpVtbl->Release(This))
|
||||
#define IXAudio2_RegisterForCallbacks(This,pCallback) ((This)->lpVtbl->RegisterForCallbacks(This,pCallback))
|
||||
#define IXAudio2_UnregisterForCallbacks(This,pCallback) ((This)->lpVtbl->UnregisterForCallbacks(This,pCallback))
|
||||
#define IXAudio2_CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain) ((This)->lpVtbl->CreateSourceVoice(This,ppSourceVoice,pSourceFormat,Flags,MaxFrequencyRatio,pCallback,pSendList,pEffectChain))
|
||||
#define IXAudio2_CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain) ((This)->lpVtbl->CreateSubmixVoice(This,ppSubmixVoice,InputChannels,InputSampleRate,Flags,ProcessingStage,pSendList,pEffectChain))
|
||||
#define IXAudio2_CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory) ((This)->lpVtbl->CreateMasteringVoice(This,ppMasteringVoice,InputChannels,InputSampleRate,Flags,DeviceId,pEffectChain,StreamCategory))
|
||||
@@ -1215,7 +1217,7 @@ __inline float XAudio2CutoffFrequencyToRadians(float CutoffFrequency, UINT32 Sam
|
||||
{
|
||||
return XAUDIO2_MAX_FILTER_FREQUENCY;
|
||||
}
|
||||
return 2.0f * sinf((float)M_PI * CutoffFrequency / SampleRate);
|
||||
return 2.0f * sinf((float)M_PI * CutoffFrequency / (float)SampleRate);
|
||||
}
|
||||
|
||||
// Convert from radian frequencies back to absolute frequencies in Hertz
|
||||
@@ -1234,7 +1236,7 @@ __inline float XAudio2CutoffFrequencyToOnePoleCoefficient(float CutoffFrequency,
|
||||
{
|
||||
return XAUDIO2_MAX_FILTER_FREQUENCY;
|
||||
}
|
||||
return ( 1.0f - powf(1.0f - 2.0f * CutoffFrequency / SampleRate, 2.0f) );
|
||||
return ( 1.0f - powf(1.0f - 2.0f * CutoffFrequency / (float)SampleRate, 2.0f) );
|
||||
}
|
||||
|
||||
|
||||
@@ -1271,4 +1273,3 @@ XAUDIO2_STDAPI XAudio2Create(_Outptr_ IXAudio2** ppXAudio2, UINT32 Flags X2DEFAU
|
||||
#endif // #ifndef GUID_DEFS_ONLY
|
||||
|
||||
#endif // #ifndef __XAUDIO2_INCLUDED__
|
||||
|
||||
|
||||
BIN
Binary file not shown.
Vendored
+1
-1
Submodule 3rdparty/curl updated: 9d954e49bc...566b74a0e1
Vendored
+13
-9
@@ -1,14 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug - LLVM|x64">
|
||||
<Configuration>Debug - LLVM</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release - LLVM|x64">
|
||||
<Configuration>Release - LLVM</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
@@ -72,6 +64,7 @@
|
||||
<ClCompile Include="curl\lib\asyn-ares.c" />
|
||||
<ClCompile Include="curl\lib\asyn-thread.c" />
|
||||
<ClCompile Include="curl\lib\base64.c" />
|
||||
<ClCompile Include="curl\lib\c-hyper.c" />
|
||||
<ClCompile Include="curl\lib\conncache.c" />
|
||||
<ClCompile Include="curl\lib\connect.c" />
|
||||
<ClCompile Include="curl\lib\content_encoding.c" />
|
||||
@@ -99,6 +92,8 @@
|
||||
<ClCompile Include="curl\lib\dotdot.c" />
|
||||
<ClCompile Include="curl\lib\dynbuf.c" />
|
||||
<ClCompile Include="curl\lib\easy.c" />
|
||||
<ClCompile Include="curl\lib\easygetopt.c" />
|
||||
<ClCompile Include="curl\lib\easyoptions.c" />
|
||||
<ClCompile Include="curl\lib\escape.c" />
|
||||
<ClCompile Include="curl\lib\file.c" />
|
||||
<ClCompile Include="curl\lib\fileinfo.c" />
|
||||
@@ -116,8 +111,10 @@
|
||||
<ClCompile Include="curl\lib\hostip4.c" />
|
||||
<ClCompile Include="curl\lib\hostip6.c" />
|
||||
<ClCompile Include="curl\lib\hostsyn.c" />
|
||||
<ClCompile Include="curl\lib\hsts.c" />
|
||||
<ClCompile Include="curl\lib\http.c" />
|
||||
<ClCompile Include="curl\lib\http2.c" />
|
||||
<ClCompile Include="curl\lib\http_aws_sigv4.c" />
|
||||
<ClCompile Include="curl\lib\http_chunks.c" />
|
||||
<ClCompile Include="curl\lib\http_digest.c" />
|
||||
<ClCompile Include="curl\lib\http_negotiate.c" />
|
||||
@@ -152,7 +149,6 @@
|
||||
<ClCompile Include="curl\lib\rand.c" />
|
||||
<ClCompile Include="curl\lib\rename.c" />
|
||||
<ClCompile Include="curl\lib\rtsp.c" />
|
||||
<ClCompile Include="curl\lib\security.c" />
|
||||
<ClCompile Include="curl\lib\select.c" />
|
||||
<ClCompile Include="curl\lib\sendf.c" />
|
||||
<ClCompile Include="curl\lib\setopt.c" />
|
||||
@@ -179,8 +175,10 @@
|
||||
<ClCompile Include="curl\lib\transfer.c" />
|
||||
<ClCompile Include="curl\lib\url.c" />
|
||||
<ClCompile Include="curl\lib\urlapi.c" />
|
||||
<ClCompile Include="curl\lib\vauth\gsasl.c" />
|
||||
<ClCompile Include="curl\lib\version.c" />
|
||||
<ClCompile Include="curl\lib\version_win32.c" />
|
||||
<ClCompile Include="curl\lib\vtls\rustls.c" />
|
||||
<ClCompile Include="curl\lib\warnless.c" />
|
||||
<ClCompile Include="curl\lib\wildcard.c" />
|
||||
<ClCompile Include="curl\lib\x509asn1.c" />
|
||||
@@ -231,6 +229,7 @@
|
||||
<ClInclude Include="curl\lib\amigaos.h" />
|
||||
<ClInclude Include="curl\lib\arpa_telnet.h" />
|
||||
<ClInclude Include="curl\lib\asyn.h" />
|
||||
<ClInclude Include="curl\lib\c-hyper.h" />
|
||||
<ClInclude Include="curl\lib\config-amigaos.h" />
|
||||
<ClInclude Include="curl\lib\config-dos.h" />
|
||||
<ClInclude Include="curl\lib\config-mac.h" />
|
||||
@@ -257,6 +256,7 @@
|
||||
<ClInclude Include="curl\lib\curl_get_line.h" />
|
||||
<ClInclude Include="curl\lib\curl_gssapi.h" />
|
||||
<ClInclude Include="curl\lib\curl_hmac.h" />
|
||||
<ClInclude Include="curl\lib\curl_krb5.h" />
|
||||
<ClInclude Include="curl\lib\curl_ldap.h" />
|
||||
<ClInclude Include="curl\lib\curl_md4.h" />
|
||||
<ClInclude Include="curl\lib\curl_md5.h" />
|
||||
@@ -281,6 +281,7 @@
|
||||
<ClInclude Include="curl\lib\dotdot.h" />
|
||||
<ClInclude Include="curl\lib\dynbuf.h" />
|
||||
<ClInclude Include="curl\lib\easyif.h" />
|
||||
<ClInclude Include="curl\lib\easyoptions.h" />
|
||||
<ClInclude Include="curl\lib\escape.h" />
|
||||
<ClInclude Include="curl\lib\file.h" />
|
||||
<ClInclude Include="curl\lib\fileinfo.h" />
|
||||
@@ -292,8 +293,10 @@
|
||||
<ClInclude Include="curl\lib\hash.h" />
|
||||
<ClInclude Include="curl\lib\hostcheck.h" />
|
||||
<ClInclude Include="curl\lib\hostip.h" />
|
||||
<ClInclude Include="curl\lib\hsts.h" />
|
||||
<ClInclude Include="curl\lib\http.h" />
|
||||
<ClInclude Include="curl\lib\http2.h" />
|
||||
<ClInclude Include="curl\lib\http_aws_sigv4.h" />
|
||||
<ClInclude Include="curl\lib\http_chunks.h" />
|
||||
<ClInclude Include="curl\lib\http_digest.h" />
|
||||
<ClInclude Include="curl\lib\http_negotiate.h" />
|
||||
@@ -351,6 +354,7 @@
|
||||
<ClInclude Include="curl\lib\urlapi-int.h" />
|
||||
<ClInclude Include="curl\lib\urldata.h" />
|
||||
<ClInclude Include="curl\lib\version_win32.h" />
|
||||
<ClInclude Include="curl\lib\vtls\rustls.h" />
|
||||
<ClInclude Include="curl\lib\warnless.h" />
|
||||
<ClInclude Include="curl\lib\wildcard.h" />
|
||||
<ClInclude Include="curl\lib\x509asn1.h" />
|
||||
|
||||
Vendored
+72
-3
@@ -264,9 +264,6 @@
|
||||
<ClCompile Include="curl\lib\rtsp.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\security.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\select.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
@@ -447,6 +444,42 @@
|
||||
<ClCompile Include="curl\lib\vtls\wolfssl.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\dynbuf.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\mqtt.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\version_win32.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\vquic\vquic.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\vtls\keylog.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\c-hyper.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\easygetopt.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\easyoptions.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\hsts.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\http_aws_sigv4.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\vtls\rustls.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="curl\lib\vauth\gsasl.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="curl\include\curl\curl.h">
|
||||
@@ -902,6 +935,42 @@
|
||||
<ClInclude Include="curl\lib\vtls\wolfssl.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="curl\lib\dynbuf.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="curl\lib\mqtt.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="curl\lib\setup-win32.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="curl\lib\version_win32.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="curl\lib\vquic\vquic.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="curl\lib\vtls\keylog.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="curl\lib\c-hyper.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="curl\lib\curl_krb5.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="curl\lib\easyoptions.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="curl\lib\hsts.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="curl\lib\http_aws_sigv4.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="curl\lib\vtls\rustls.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="curl\lib\libcurl.rc">
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
cmake_minimum_required(VERSION 2.8.4)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
|
||||
|
||||
set(LIBUSB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../libusb/)
|
||||
|
||||
project(libusb)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
|
||||
set(LIBUSB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
||||
|
||||
|
||||
option(WITH_DEBUG_LOG "enable debug logging" OFF)
|
||||
# if debug logging is enabled, by default enable logging
|
||||
option(WITH_LOGGING "if false, disable all logging" ON)
|
||||
Vendored
@@ -2,7 +2,7 @@ include(CheckCXXCompilerFlag)
|
||||
include(CheckIncludeFiles)
|
||||
include(CheckTypeSize)
|
||||
|
||||
if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
|
||||
if (${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
|
||||
if (NOT OS_WINDOWS)
|
||||
# mingw appears to print a bunch of warnings about this
|
||||
check_cxx_compiler_flag("-fvisibility=hidden" HAVE_VISIBILITY)
|
||||
@@ -15,9 +15,9 @@
|
||||
<ProjectGuid>{349EE8F9-7D25-4909-AAF5-FF3FADE72187}</ProjectGuid>
|
||||
<RootNamespace>libusb</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="..\common_default.props" />
|
||||
<Import Project="..\..\common_default.props" />
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<Import Project="..\common_default_macros.props" />
|
||||
<Import Project="..\..\common_default_macros.props" />
|
||||
<PropertyGroup Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
@@ -42,7 +42,7 @@
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalIncludeDirectories>libusb\msvc;libusb\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>src\msvc;src\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WINVER=0x0600;_WIN32_WINNT=0x0600;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
|
||||
<WarningLevel>Level4</WarningLevel>
|
||||
@@ -61,30 +61,30 @@
|
||||
</Lib>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="libusb\libusb\core.c" />
|
||||
<ClCompile Include="libusb\libusb\descriptor.c" />
|
||||
<ClCompile Include="libusb\libusb\hotplug.c" />
|
||||
<ClCompile Include="libusb\libusb\io.c" />
|
||||
<ClCompile Include="libusb\libusb\os\events_windows.c" />
|
||||
<ClCompile Include="libusb\libusb\strerror.c" />
|
||||
<ClCompile Include="libusb\libusb\sync.c" />
|
||||
<ClCompile Include="libusb\libusb\os\threads_windows.c" />
|
||||
<ClCompile Include="libusb\libusb\os\windows_common.c" />
|
||||
<ClCompile Include="libusb\libusb\os\windows_usbdk.c" />
|
||||
<ClCompile Include="libusb\libusb\os\windows_winusb.c" />
|
||||
<ClCompile Include="src\libusb\core.c" />
|
||||
<ClCompile Include="src\libusb\descriptor.c" />
|
||||
<ClCompile Include="src\libusb\hotplug.c" />
|
||||
<ClCompile Include="src\libusb\io.c" />
|
||||
<ClCompile Include="src\libusb\os\events_windows.c" />
|
||||
<ClCompile Include="src\libusb\strerror.c" />
|
||||
<ClCompile Include="src\libusb\sync.c" />
|
||||
<ClCompile Include="src\libusb\os\threads_windows.c" />
|
||||
<ClCompile Include="src\libusb\os\windows_common.c" />
|
||||
<ClCompile Include="src\libusb\os\windows_usbdk.c" />
|
||||
<ClCompile Include="src\libusb\os\windows_winusb.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="libusb\msvc\config.h" />
|
||||
<ClInclude Include="libusb\libusb\hotplug.h" />
|
||||
<ClInclude Include="libusb\libusb\libusb.h" />
|
||||
<ClInclude Include="libusb\libusb\libusbi.h" />
|
||||
<ClInclude Include="libusb\libusb\os\events_windows.h" />
|
||||
<ClInclude Include="libusb\libusb\os\threads_windows.h" />
|
||||
<ClInclude Include="libusb\libusb\version.h" />
|
||||
<ClInclude Include="libusb\libusb\version_nano.h" />
|
||||
<ClInclude Include="libusb\libusb\os\windows_common.h" />
|
||||
<ClInclude Include="libusb\libusb\os\windows_usbdk.h" />
|
||||
<ClInclude Include="libusb\libusb\os\windows_winusb.h" />
|
||||
<ClInclude Include="src\msvc\config.h" />
|
||||
<ClInclude Include="src\libusb\hotplug.h" />
|
||||
<ClInclude Include="src\libusb\libusb.h" />
|
||||
<ClInclude Include="src\libusb\libusbi.h" />
|
||||
<ClInclude Include="src\libusb\os\events_windows.h" />
|
||||
<ClInclude Include="src\libusb\os\threads_windows.h" />
|
||||
<ClInclude Include="src\libusb\version.h" />
|
||||
<ClInclude Include="src\libusb\version_nano.h" />
|
||||
<ClInclude Include="src\libusb\os\windows_common.h" />
|
||||
<ClInclude Include="src\libusb\os\windows_usbdk.h" />
|
||||
<ClInclude Include="src\libusb\os\windows_winusb.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
Vendored
+1
-1
Submodule 3rdparty/pugixml updated: 8bf806c035...08b3433180
Vendored
+345
-130
File diff suppressed because it is too large
Load Diff
Vendored
+206
-77
@@ -1,5 +1,14 @@
|
||||
// stb_truetype.h - v1.21 - public domain
|
||||
// authored from 2009-2016 by Sean Barrett / RAD Game Tools
|
||||
// stb_truetype.h - v1.24 - public domain
|
||||
// authored from 2009-2020 by Sean Barrett / RAD Game Tools
|
||||
//
|
||||
// =======================================================================
|
||||
//
|
||||
// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES
|
||||
//
|
||||
// This library does no range checking of the offsets found in the file,
|
||||
// meaning an attacker can use it to read arbitrary memory.
|
||||
//
|
||||
// =======================================================================
|
||||
//
|
||||
// This library processes TrueType files:
|
||||
// parse files
|
||||
@@ -32,11 +41,11 @@
|
||||
// Daniel Ribeiro Maciel
|
||||
//
|
||||
// Bug/warning reports/fixes:
|
||||
// "Zer" on mollyrocket Fabian "ryg" Giesen
|
||||
// Cass Everitt Martins Mozeiko
|
||||
// stoiko (Haemimont Games) Cap Petschulat
|
||||
// Brian Hook Omar Cornut
|
||||
// Walter van Niftrik github:aloucks
|
||||
// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe
|
||||
// Cass Everitt Martins Mozeiko github:aloucks
|
||||
// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam
|
||||
// Brian Hook Omar Cornut github:vassvik
|
||||
// Walter van Niftrik Ryan Griege
|
||||
// David Gow Peter LaValle
|
||||
// David Given Sergey Popov
|
||||
// Ivan-Assen Ivanov Giumo X. Clanjor
|
||||
@@ -44,11 +53,14 @@
|
||||
// Johan Duparc Thomas Fields
|
||||
// Hou Qiming Derek Vinyard
|
||||
// Rob Loach Cort Stratton
|
||||
// Kenney Phillis Jr. github:oyvindjam
|
||||
// Brian Costabile github:vassvik
|
||||
//
|
||||
// Kenney Phillis Jr. Brian Costabile
|
||||
// Ken Voskuil (kaesve)
|
||||
//
|
||||
// VERSION HISTORY
|
||||
//
|
||||
// 1.24 (2020-02-05) fix warning
|
||||
// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS)
|
||||
// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined
|
||||
// 1.21 (2019-02-25) fix warning
|
||||
// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics()
|
||||
// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod
|
||||
@@ -208,7 +220,7 @@
|
||||
//
|
||||
// Advancing for the next character:
|
||||
// Call GlyphHMetrics, and compute 'current_point += SF * advance'.
|
||||
//
|
||||
//
|
||||
//
|
||||
// ADVANCED USAGE
|
||||
//
|
||||
@@ -333,7 +345,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
//
|
||||
// Output:
|
||||
//
|
||||
@@ -347,9 +359,9 @@ int main(int argc, char **argv)
|
||||
// :@@. M@M
|
||||
// @@@o@@@@
|
||||
// :M@@V:@@.
|
||||
//
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
//
|
||||
// Complete program: print "Hello World!" banner, with bugs
|
||||
//
|
||||
#if 0
|
||||
@@ -650,7 +662,7 @@ STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, cons
|
||||
// Calling these functions in sequence is roughly equivalent to calling
|
||||
// stbtt_PackFontRanges(). If you more control over the packing of multiple
|
||||
// fonts, or if you want to pack custom data into a font texture, take a look
|
||||
// at the source to of stbtt_PackFontRanges() and create a custom version
|
||||
// at the source to of stbtt_PackFontRanges() and create a custom version
|
||||
// using these functions, e.g. call GatherRects multiple times,
|
||||
// building up a single array of rects, then call PackRects once,
|
||||
// then call RenderIntoRects repeatedly. This may result in a
|
||||
@@ -702,7 +714,7 @@ struct stbtt_fontinfo
|
||||
|
||||
int numGlyphs; // number of glyphs, needed for range checking
|
||||
|
||||
int loca,head,glyf,hhea,hmtx,kern,gpos; // table locations as offset from start of .ttf
|
||||
int loca,head,glyf,hhea,hmtx,kern,gpos,svg; // table locations as offset from start of .ttf
|
||||
int index_map; // a cmap mapping for our chosen character encoding
|
||||
int indexToLocFormat; // format needed to map from glyph index to glyph
|
||||
|
||||
@@ -785,6 +797,18 @@ STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1,
|
||||
STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1);
|
||||
// as above, but takes one or more glyph indices for greater efficiency
|
||||
|
||||
typedef struct stbtt_kerningentry
|
||||
{
|
||||
int glyph1; // use stbtt_FindGlyphIndex
|
||||
int glyph2;
|
||||
int advance;
|
||||
} stbtt_kerningentry;
|
||||
|
||||
STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info);
|
||||
STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length);
|
||||
// Retrieves a complete list of all of the kerning pairs provided by the font
|
||||
// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write.
|
||||
// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1)
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
@@ -829,6 +853,11 @@ STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, s
|
||||
STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices);
|
||||
// frees the data allocated above
|
||||
|
||||
STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg);
|
||||
STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg);
|
||||
// fills svg with the character's SVG data.
|
||||
// returns data size or 0 if SVG not found.
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// BITMAP RENDERING
|
||||
@@ -958,7 +987,7 @@ STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, floa
|
||||
// and computing from that can allow drop-out prevention).
|
||||
//
|
||||
// The algorithm has not been optimized at all, so expect it to be slow
|
||||
// if computing lots of characters or very large sizes.
|
||||
// if computing lots of characters or very large sizes.
|
||||
|
||||
|
||||
|
||||
@@ -1330,6 +1359,22 @@ static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict)
|
||||
return stbtt__cff_get_index(&cff);
|
||||
}
|
||||
|
||||
// since most people won't use this, find this table the first time it's needed
|
||||
static int stbtt__get_svg(stbtt_fontinfo *info)
|
||||
{
|
||||
stbtt_uint32 t;
|
||||
if (info->svg < 0) {
|
||||
t = stbtt__find_table(info->data, info->fontstart, "SVG ");
|
||||
if (t) {
|
||||
stbtt_uint32 offset = ttULONG(info->data + t + 2);
|
||||
info->svg = t + offset;
|
||||
} else {
|
||||
info->svg = 0;
|
||||
}
|
||||
}
|
||||
return info->svg;
|
||||
}
|
||||
|
||||
static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart)
|
||||
{
|
||||
stbtt_uint32 cmap, t;
|
||||
@@ -1409,6 +1454,8 @@ static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, in
|
||||
else
|
||||
info->numGlyphs = 0xffff;
|
||||
|
||||
info->svg = -1;
|
||||
|
||||
// find a cmap encoding table we understand *now* to avoid searching
|
||||
// later. (todo: could make this installable)
|
||||
// the same regardless of glyph.
|
||||
@@ -1715,7 +1762,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
|
||||
if (i != 0)
|
||||
num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);
|
||||
|
||||
// now start the new one
|
||||
// now start the new one
|
||||
start_off = !(flags & 1);
|
||||
if (start_off) {
|
||||
// if we start off with an off-curve point, then when we need to find a point on the curve
|
||||
@@ -1757,7 +1804,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
|
||||
}
|
||||
}
|
||||
num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);
|
||||
} else if (numberOfContours == -1) {
|
||||
} else if (numberOfContours < 0) {
|
||||
// Compound shapes.
|
||||
int more = 1;
|
||||
stbtt_uint8 *comp = data + g + 10;
|
||||
@@ -1768,7 +1815,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
|
||||
int comp_num_verts = 0, i;
|
||||
stbtt_vertex *comp_verts = 0, *tmp = 0;
|
||||
float mtx[6] = {1,0,0,1,0,0}, m, n;
|
||||
|
||||
|
||||
flags = ttSHORT(comp); comp+=2;
|
||||
gidx = ttSHORT(comp); comp+=2;
|
||||
|
||||
@@ -1798,7 +1845,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
|
||||
mtx[2] = ttSHORT(comp)/16384.0f; comp+=2;
|
||||
mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;
|
||||
}
|
||||
|
||||
|
||||
// Find transformation scales.
|
||||
m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]);
|
||||
n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]);
|
||||
@@ -1834,9 +1881,6 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
|
||||
// More components ?
|
||||
more = flags & (1<<5);
|
||||
}
|
||||
} else if (numberOfContours < 0) {
|
||||
// @TODO other compound variations?
|
||||
STBTT_assert(0);
|
||||
} else {
|
||||
// numberOfCounters == 0, do nothing
|
||||
}
|
||||
@@ -2265,6 +2309,48 @@ STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_inde
|
||||
}
|
||||
}
|
||||
|
||||
STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info)
|
||||
{
|
||||
stbtt_uint8 *data = info->data + info->kern;
|
||||
|
||||
// we only look at the first table. it must be 'horizontal' and format 0.
|
||||
if (!info->kern)
|
||||
return 0;
|
||||
if (ttUSHORT(data+2) < 1) // number of tables, need at least 1
|
||||
return 0;
|
||||
if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format
|
||||
return 0;
|
||||
|
||||
return ttUSHORT(data+10);
|
||||
}
|
||||
|
||||
STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length)
|
||||
{
|
||||
stbtt_uint8 *data = info->data + info->kern;
|
||||
int k, length;
|
||||
|
||||
// we only look at the first table. it must be 'horizontal' and format 0.
|
||||
if (!info->kern)
|
||||
return 0;
|
||||
if (ttUSHORT(data+2) < 1) // number of tables, need at least 1
|
||||
return 0;
|
||||
if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format
|
||||
return 0;
|
||||
|
||||
length = ttUSHORT(data+10);
|
||||
if (table_length < length)
|
||||
length = table_length;
|
||||
|
||||
for (k = 0; k < length; k++)
|
||||
{
|
||||
table[k].glyph1 = ttUSHORT(data+18+(k*6));
|
||||
table[k].glyph2 = ttUSHORT(data+20+(k*6));
|
||||
table[k].advance = ttSHORT(data+22+(k*6));
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2)
|
||||
{
|
||||
stbtt_uint8 *data = info->data + info->kern;
|
||||
@@ -2540,8 +2626,7 @@ STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int g1, int
|
||||
|
||||
if (info->gpos)
|
||||
xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2);
|
||||
|
||||
if (info->kern)
|
||||
else if (info->kern)
|
||||
xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2);
|
||||
|
||||
return xAdvance;
|
||||
@@ -2602,6 +2687,45 @@ STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v)
|
||||
STBTT_free(v, info->userdata);
|
||||
}
|
||||
|
||||
STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl)
|
||||
{
|
||||
int i;
|
||||
stbtt_uint8 *data = info->data;
|
||||
stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info);
|
||||
|
||||
int numEntries = ttUSHORT(svg_doc_list);
|
||||
stbtt_uint8 *svg_docs = svg_doc_list + 2;
|
||||
|
||||
for(i=0; i<numEntries; i++) {
|
||||
stbtt_uint8 *svg_doc = svg_docs + (12 * i);
|
||||
if ((gl >= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2)))
|
||||
return svg_doc;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg)
|
||||
{
|
||||
stbtt_uint8 *data = info->data;
|
||||
stbtt_uint8 *svg_doc;
|
||||
|
||||
if (info->svg == 0)
|
||||
return 0;
|
||||
|
||||
svg_doc = stbtt_FindSVGDoc(info, gl);
|
||||
if (svg_doc != NULL) {
|
||||
*svg = (char *) data + info->svg + ttULONG(svg_doc + 4);
|
||||
return ttULONG(svg_doc + 8);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg)
|
||||
{
|
||||
return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svg);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// antialiasing software rasterizer
|
||||
@@ -2727,7 +2851,7 @@ static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, i
|
||||
float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);
|
||||
STBTT_assert(z != NULL);
|
||||
if (!z) return z;
|
||||
|
||||
|
||||
// round dx down to avoid overshooting
|
||||
if (dxdy < 0)
|
||||
z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy);
|
||||
@@ -2805,7 +2929,7 @@ static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__ac
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
e = e->next;
|
||||
}
|
||||
}
|
||||
@@ -3533,7 +3657,7 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info
|
||||
{
|
||||
int ix0,iy0,ix1,iy1;
|
||||
stbtt__bitmap gbm;
|
||||
stbtt_vertex *vertices;
|
||||
stbtt_vertex *vertices;
|
||||
int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);
|
||||
|
||||
if (scale_x == 0) scale_x = scale_y;
|
||||
@@ -3556,7 +3680,7 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info
|
||||
if (height) *height = gbm.h;
|
||||
if (xoff ) *xoff = ix0;
|
||||
if (yoff ) *yoff = iy0;
|
||||
|
||||
|
||||
if (gbm.w && gbm.h) {
|
||||
gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata);
|
||||
if (gbm.pixels) {
|
||||
@@ -3567,7 +3691,7 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info
|
||||
}
|
||||
STBTT_free(vertices, info->userdata);
|
||||
return gbm.pixels;
|
||||
}
|
||||
}
|
||||
|
||||
STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff)
|
||||
{
|
||||
@@ -3579,7 +3703,7 @@ STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigne
|
||||
int ix0,iy0;
|
||||
stbtt_vertex *vertices;
|
||||
int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);
|
||||
stbtt__bitmap gbm;
|
||||
stbtt__bitmap gbm;
|
||||
|
||||
stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0);
|
||||
gbm.pixels = output;
|
||||
@@ -3601,7 +3725,7 @@ STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *
|
||||
STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff)
|
||||
{
|
||||
return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff);
|
||||
}
|
||||
}
|
||||
|
||||
STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint)
|
||||
{
|
||||
@@ -3616,7 +3740,7 @@ STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, uns
|
||||
STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff)
|
||||
{
|
||||
return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff);
|
||||
}
|
||||
}
|
||||
|
||||
STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint)
|
||||
{
|
||||
@@ -3741,7 +3865,7 @@ static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *no
|
||||
con->y = 0;
|
||||
con->bottom_y = 0;
|
||||
STBTT__NOTUSED(nodes);
|
||||
STBTT__NOTUSED(num_nodes);
|
||||
STBTT__NOTUSED(num_nodes);
|
||||
}
|
||||
|
||||
static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects)
|
||||
@@ -3968,6 +4092,7 @@ static float stbtt__oversample_shift(int oversample)
|
||||
STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects)
|
||||
{
|
||||
int i,j,k;
|
||||
int missing_glyph_added = 0;
|
||||
|
||||
k=0;
|
||||
for (i=0; i < num_ranges; ++i) {
|
||||
@@ -3979,7 +4104,7 @@ STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stb
|
||||
int x0,y0,x1,y1;
|
||||
int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j];
|
||||
int glyph = stbtt_FindGlyphIndex(info, codepoint);
|
||||
if (glyph == 0 && spc->skip_missing) {
|
||||
if (glyph == 0 && (spc->skip_missing || missing_glyph_added)) {
|
||||
rects[k].w = rects[k].h = 0;
|
||||
} else {
|
||||
stbtt_GetGlyphBitmapBoxSubpixel(info,glyph,
|
||||
@@ -3989,6 +4114,8 @@ STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stb
|
||||
&x0,&y0,&x1,&y1);
|
||||
rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1);
|
||||
rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1);
|
||||
if (glyph == 0)
|
||||
missing_glyph_added = 1;
|
||||
}
|
||||
++k;
|
||||
}
|
||||
@@ -4023,7 +4150,7 @@ STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info
|
||||
// rects array must be big enough to accommodate all characters in the given ranges
|
||||
STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects)
|
||||
{
|
||||
int i,j,k, return_value = 1;
|
||||
int i,j,k, missing_glyph = -1, return_value = 1;
|
||||
|
||||
// save current values
|
||||
int old_h_over = spc->h_oversample;
|
||||
@@ -4088,6 +4215,13 @@ STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const
|
||||
bc->yoff = (float) y0 * recip_v + sub_y;
|
||||
bc->xoff2 = (x0 + r->w) * recip_h + sub_x;
|
||||
bc->yoff2 = (y0 + r->h) * recip_v + sub_y;
|
||||
|
||||
if (glyph == 0)
|
||||
missing_glyph = j;
|
||||
} else if (spc->skip_missing) {
|
||||
return_value = 0;
|
||||
} else if (r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) {
|
||||
ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph];
|
||||
} else {
|
||||
return_value = 0; // if any fail, report failure
|
||||
}
|
||||
@@ -4126,7 +4260,7 @@ STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char
|
||||
n = 0;
|
||||
for (i=0; i < num_ranges; ++i)
|
||||
n += ranges[i].num_chars;
|
||||
|
||||
|
||||
rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context);
|
||||
if (rects == NULL)
|
||||
return 0;
|
||||
@@ -4137,7 +4271,7 @@ STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char
|
||||
n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects);
|
||||
|
||||
stbtt_PackFontRangesPackRects(spc, rects, n);
|
||||
|
||||
|
||||
return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects);
|
||||
|
||||
STBTT_free(rects, spc->user_allocator_context);
|
||||
@@ -4298,7 +4432,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex
|
||||
int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y;
|
||||
if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) {
|
||||
float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0;
|
||||
if (x_inter < x)
|
||||
if (x_inter < x)
|
||||
winding += (y0 < y1) ? 1 : -1;
|
||||
}
|
||||
}
|
||||
@@ -4324,7 +4458,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex
|
||||
y1 = (int)verts[i ].y;
|
||||
if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) {
|
||||
float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0;
|
||||
if (x_inter < x)
|
||||
if (x_inter < x)
|
||||
winding += (y0 < y1) ? 1 : -1;
|
||||
}
|
||||
} else {
|
||||
@@ -4336,7 +4470,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex
|
||||
if (hits[1][0] < 0)
|
||||
winding += (hits[1][1] < 0 ? -1 : 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return winding;
|
||||
@@ -4389,12 +4523,7 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
|
||||
int w,h;
|
||||
unsigned char *data;
|
||||
|
||||
// if one scale is 0, use same scale for both
|
||||
if (scale_x == 0) scale_x = scale_y;
|
||||
if (scale_y == 0) {
|
||||
if (scale_x == 0) return NULL; // if both scales are 0, return NULL
|
||||
scale_y = scale_x;
|
||||
}
|
||||
if (scale == 0) return NULL;
|
||||
|
||||
stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f,0.0f, &ix0,&iy0,&ix1,&iy1);
|
||||
|
||||
@@ -4417,7 +4546,7 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
|
||||
|
||||
// invert for y-downwards bitmaps
|
||||
scale_y = -scale_y;
|
||||
|
||||
|
||||
{
|
||||
int x,y,i,j;
|
||||
float *precompute;
|
||||
@@ -4566,7 +4695,7 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
|
||||
STBTT_free(verts, info->userdata);
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff)
|
||||
{
|
||||
@@ -4584,7 +4713,7 @@ STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata)
|
||||
//
|
||||
|
||||
// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string
|
||||
static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2)
|
||||
static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2)
|
||||
{
|
||||
stbtt_int32 i=0;
|
||||
|
||||
@@ -4623,7 +4752,7 @@ static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, s
|
||||
return i;
|
||||
}
|
||||
|
||||
static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2)
|
||||
static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2)
|
||||
{
|
||||
return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2);
|
||||
}
|
||||
@@ -4752,7 +4881,7 @@ STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset,
|
||||
|
||||
STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index)
|
||||
{
|
||||
return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index);
|
||||
return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index);
|
||||
}
|
||||
|
||||
STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data)
|
||||
@@ -4845,38 +4974,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
|
||||
------------------------------------------------------------------------------
|
||||
ALTERNATIVE A - MIT License
|
||||
Copyright (c) 2017 Sean Barrett
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
------------------------------------------------------------------------------
|
||||
ALTERNATIVE B - Public Domain (www.unlicense.org)
|
||||
This is free and unencumbered software released into the public domain.
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||
software, either in source code form or as a compiled binary, for any purpose,
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||
software, either in source code form or as a compiled binary, for any purpose,
|
||||
commercial or non-commercial, and by any means.
|
||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||
software dedicate any and all copyright interest in the software to the public
|
||||
domain. We make this dedication for the benefit of the public at large and to
|
||||
the detriment of our heirs and successors. We intend this dedication to be an
|
||||
overt act of relinquishment in perpetuity of all present and future rights to
|
||||
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||
software dedicate any and all copyright interest in the software to the public
|
||||
domain. We make this dedication for the benefit of the public at large and to
|
||||
the detriment of our heirs and successors. We intend this dedication to be an
|
||||
overt act of relinquishment in perpetuity of all present and future rights to
|
||||
this software under copyright law.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
+21
-16
@@ -7,11 +7,11 @@ Other instructions may be found [here](https://wiki.rpcs3.net/index.php?title=Bu
|
||||
|
||||
### Windows 7 or later
|
||||
|
||||
* [CMake 3.14.1+](https://www.cmake.org/download/) (add to PATH)
|
||||
* [Python 3.3+](https://www.python.org/downloads/) (add to PATH)
|
||||
* [CMake 3.16.9+](https://www.cmake.org/download/) (add to PATH)
|
||||
* [Python 3.6+](https://www.python.org/downloads/) (add to PATH)
|
||||
* [Qt 5.15.2](https://www.qt.io/download-qt-installer)
|
||||
* [Visual Studio 2019](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community)
|
||||
* [Vulkan SDK 1.1.126+](https://vulkan.lunarg.com/sdk/home) (See "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/windows/getting_started.html))
|
||||
* [Vulkan SDK 1.2.154+](https://vulkan.lunarg.com/sdk/home) (See "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/windows/getting_started.html))
|
||||
|
||||
**Either add the** `QTDIR` **environment variable, e.g.** `<QtInstallFolder>\5.15.2\msvc2019_64\` **, or use the [Visual Studio Qt Plugin](https://marketplace.visualstudio.com/items?itemName=TheQtCompany.QtVisualStudioTools2019)**
|
||||
|
||||
@@ -19,10 +19,10 @@ Other instructions may be found [here](https://wiki.rpcs3.net/index.php?title=Bu
|
||||
|
||||
These are the essentials tools to build RPCS3 on Linux. Some of them can be installed through your favorite package manager.
|
||||
|
||||
* Clang 11+ or GCC 9+
|
||||
* [CMake 3.14.1+](https://www.cmake.org/download/)
|
||||
* Clang 12+ or GCC 10+
|
||||
* [CMake 3.16.9+](https://www.cmake.org/download/)
|
||||
* [Qt 5.15.2](https://www.qt.io/download-qt-installer)
|
||||
* [Vulkan SDK 1.1.126+](https://vulkan.lunarg.com/sdk/home) (See "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/linux/getting_started.html))
|
||||
* [Vulkan SDK 1.2.154+](https://vulkan.lunarg.com/sdk/home) (See "Install the SDK" [here](https://vulkan.lunarg.com/doc/sdk/latest/linux/getting_started.html))
|
||||
* [SDL2](https://www.libsdl.org/download-2.0.php) (for the FAudio backend)
|
||||
|
||||
**If you have an NVIDIA GPU, you may need to install the libglvnd package.**
|
||||
@@ -43,20 +43,20 @@ Ubuntu usually does not have a new enough Qt package to suit rpcs3's needs. Ther
|
||||
. /etc/os-release
|
||||
sudo add-apt-repository ppa:beineri/opt-qt-5.15.2-$UBUNTU_CODENAME
|
||||
sudo apt-get update
|
||||
sudo apt-get install qt515-meta-minimal qt515svg
|
||||
sudo apt-get install qt515base qt515svg
|
||||
. /opt/qt515/bin/qt515-env.sh >/dev/null 2>&1
|
||||
```
|
||||
|
||||
##### GCC 9.x installation
|
||||
##### GCC 10.x installation
|
||||
|
||||
If the `gcc-9` package is not available on your system, use the following commands
|
||||
If the `gcc-10` package is not available on your system, use the following commands
|
||||
```
|
||||
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
|
||||
sudo apt-get update
|
||||
sudo apt-get install gcc-9 g++-9
|
||||
sudo apt-get install gcc-10 g++-10
|
||||
```
|
||||
|
||||
You can either use `update-alternatives` to setup `gcc-9`/`g++-9` as your default compilers or prefix any `cmake` command by `CXX=g++-9 CC=gcc-9 ` to use it.
|
||||
You can either use `update-alternatives` to setup `gcc-10`/`g++-10` as your default compilers or prefix any `cmake` command by `CXX=g++-10 CC=gcc-10 ` to use it.
|
||||
|
||||
##### Vulkan SDK
|
||||
|
||||
@@ -64,7 +64,7 @@ For Ubuntu systems, it is strongly recommended to use the PPA from [LunarG](http
|
||||
```
|
||||
. /etc/os-release
|
||||
wget -qO - https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add -
|
||||
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-1.2.148-$UBUNTU_CODENAME.list https://packages.lunarg.com/vulkan/1.2.148/lunarg-vulkan-1.2.148-$UBUNTU_CODENAME.list
|
||||
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan-1.2.154-$UBUNTU_CODENAME.list https://packages.lunarg.com/vulkan/1.2.154/lunarg-vulkan-1.2.154-$UBUNTU_CODENAME.list
|
||||
sudo apt update
|
||||
sudo apt install vulkan-sdk
|
||||
```
|
||||
@@ -86,7 +86,7 @@ sudo apt-get install cmake
|
||||
|
||||
#### OpenSUSE
|
||||
|
||||
sudo zypper install git cmake libasound2 libpulse-devel openal-soft-devel glew-devel zlib-devel libedit-devel vulkan-devel libudev-devel libqt5-qtbase-devel libevdev-devel
|
||||
sudo zypper install git cmake libasound2 libpulse-devel openal-soft-devel glew-devel zlib-devel libedit-devel vulkan-devel libudev-devel libqt5-qtbase-devel libqt5gui-private-headers-devel libevdev-devel
|
||||
|
||||
## Setup the project
|
||||
|
||||
@@ -108,11 +108,16 @@ git submodule update --init
|
||||
|
||||
#### Building the projects
|
||||
|
||||
Open `rpcs3.sln`. The recommended build configuration is `Release - LLVM` for all purposes.
|
||||
Open `rpcs3.sln`. The recommended build configuration is `Release`. (On older revisions: `Release - LLVM`)
|
||||
|
||||
You may want to download the precompiled [LLVM libs](https://github.com/RPCS3/llvm-mirror/releases/download/custom-build-win/llvmlibs_mt.7z) and extract them to the root rpcs3 folder (which contains `rpcs3.sln`), as well as download and extract the [additional libs](https://github.com/RPCS3/glslang/releases/download/custom-build-win/glslanglibs_mt.7z) to `lib\%CONFIGURATION%-x64\` to speed up compilation time (unoptimised/debug libs are currently not available precompiled).
|
||||
|
||||
If you're not using the precompiled libs, build the projects in *__BUILD_BEFORE* folder: right-click on every project > *Build*.
|
||||
If you're not using the precompiled libs, build the following projects in *__BUILD_BEFORE* folder by right-clicking on a project > *Build*.:
|
||||
* glslang-build
|
||||
* **Either** llvm_build **or** llvm_build_clang_cl
|
||||
* spirv-tools-build
|
||||
|
||||
Afterwards:
|
||||
|
||||
`Build > Build Solution`
|
||||
|
||||
@@ -121,7 +126,7 @@ If you're not using the precompiled libs, build the projects in *__BUILD_BEFORE*
|
||||
While still in the project root:
|
||||
|
||||
1) `cd .. && mkdir rpcs3_build && cd rpcs3_build`
|
||||
2) `cmake ../rpcs3/ && make` or `CXX=g++-9 CC=gcc-9 cmake ../rpcs3/ && make` to force these compilers
|
||||
2) `cmake ../rpcs3/ && make` or `CXX=g++-10 CC=gcc-10 cmake ../rpcs3/ && make` to force these compilers
|
||||
3) Run RPCS3 with `./bin/rpcs3`
|
||||
|
||||
When using GDB, configure it to ignore SIGSEGV signal (`handle SIGSEGV nostop noprint`).
|
||||
|
||||
+28
-37
@@ -1,63 +1,54 @@
|
||||
cmake_minimum_required(VERSION 3.14.1)
|
||||
cmake_minimum_required(VERSION 3.16.9)
|
||||
|
||||
project(rpcs3)
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9)
|
||||
message(FATAL_ERROR "RPCS3 requires at least gcc-9.")
|
||||
endif()
|
||||
if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
|
||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10)
|
||||
message(FATAL_ERROR "RPCS3 requires at least gcc-10.")
|
||||
endif()
|
||||
elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
|
||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 11.0)
|
||||
message(FATAL_ERROR "RPCS3 requires at least clang-11.0.")
|
||||
endif()
|
||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.0)
|
||||
message(FATAL_ERROR "RPCS3 requires at least clang-12.0.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
option(USE_NATIVE_INSTRUCTIONS "USE_NATIVE_INSTRUCTIONS makes rpcs3 compile with -march=native, which is useful for local builds, but not good for packages." ON)
|
||||
option(WITH_LLVM "Enable usage of LLVM library" ON)
|
||||
option(BUILD_LLVM_SUBMODULE "Build LLVM from git submodule" ON)
|
||||
option(USE_ALSA "ALSA audio backend" ON)
|
||||
option(USE_PULSE "PulseAudio audio backend" ON)
|
||||
option(USE_FAUDIO "FAudio audio backend" ON)
|
||||
option(USE_LIBEVDEV "libevdev-based joystick support" ON)
|
||||
option(USE_DISCORD_RPC "Discord rich presence integration" ON)
|
||||
option(USE_SYSTEM_ZLIB "Prefer system ZLIB instead of the builtin one" ON)
|
||||
option(USE_VULKAN "Vulkan render backend" ON)
|
||||
option(USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF)
|
||||
# include build options
|
||||
include(options.cmake)
|
||||
|
||||
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/rpcs3/cmake_modules")
|
||||
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake_modules")
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
include(CheckCXXCompilerFlag)
|
||||
|
||||
if (NOT CMAKE_BUILD_TYPE)
|
||||
message(STATUS "No build type selected, default to Release")
|
||||
set(CMAKE_BUILD_TYPE "Release")
|
||||
if(NOT CMAKE_BUILD_TYPE)
|
||||
message(STATUS "No build type selected, default to Release")
|
||||
set(CMAKE_BUILD_TYPE "Release")
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
add_definitions(-DNDEBUG)
|
||||
if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
|
||||
add_definitions(-DNDEBUG)
|
||||
elseif(NOT MSVC)
|
||||
add_definitions(-D_DEBUG)
|
||||
add_definitions(-D_DEBUG)
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
message( FATAL_ERROR "RPCS3 can only be compiled on 64-bit platforms." )
|
||||
message( FATAL_ERROR "RPCS3 can only be compiled on 64-bit platforms." )
|
||||
endif()
|
||||
|
||||
find_program(CCACHE_FOUND ccache)
|
||||
if (CCACHE_FOUND)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
||||
if(CCACHE_FOUND)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
||||
endif()
|
||||
|
||||
if(WIN32)
|
||||
add_definitions(-DUNICODE)
|
||||
add_definitions(-D_WIN32_WINNT=0x0602)
|
||||
add_definitions(-DUNICODE)
|
||||
add_definitions(-D_WIN32_WINNT=0x0602)
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
include_directories(/opt/local/include)
|
||||
link_directories(/opt/local/lib)
|
||||
include_directories(/opt/local/include)
|
||||
link_directories(/opt/local/lib)
|
||||
endif()
|
||||
|
||||
# Warnings are silenced for 3rdparty code
|
||||
@@ -66,7 +57,7 @@ set(CMAKE_C_FLAGS -w)
|
||||
set(LLVM_ENABLE_WARNINGS OFF CACHE BOOL "")
|
||||
|
||||
if(MSVC)
|
||||
add_compile_options(/wd4530 /utf-8) # C++ exception handler used, but unwind semantics are not enabled
|
||||
add_compile_options(/wd4530 /utf-8) # C++ exception handler used, but unwind semantics are not enabled
|
||||
endif()
|
||||
|
||||
add_subdirectory(Vulkan EXCLUDE_FROM_ALL)
|
||||
@@ -76,8 +67,8 @@ add_subdirectory(3rdparty)
|
||||
unset(CMAKE_CXX_FLAGS)
|
||||
unset(CMAKE_C_FLAGS)
|
||||
|
||||
if (NOT WIN32)
|
||||
add_compile_options(-pthread)
|
||||
if(NOT WIN32)
|
||||
add_compile_options(-pthread)
|
||||
endif()
|
||||
|
||||
# TODO: do real installation, including copying directory structure
|
||||
|
||||
+15
-6
@@ -3,11 +3,16 @@
|
||||
#include "util/types.hpp"
|
||||
#include "Utilities/StrFmt.h"
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Weffc++"
|
||||
#endif
|
||||
|
||||
template<typename T, uint N>
|
||||
struct bf_base
|
||||
{
|
||||
using type = T;
|
||||
using vtype = simple_t<type>;
|
||||
using vtype = std::common_type_t<type>;
|
||||
using utype = typename std::make_unsigned<vtype>::type;
|
||||
|
||||
// Datatype bitsize
|
||||
@@ -217,7 +222,7 @@ struct cf_t<void>
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static constexpr auto extract(const T& data) -> decltype(+T())
|
||||
static constexpr auto extract(const T&) -> decltype(+T())
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -237,7 +242,7 @@ struct ff_t : bf_base<T, N>
|
||||
using vtype = typename ff_t::vtype;
|
||||
|
||||
// Return constant value
|
||||
static constexpr vtype extract(const type& data)
|
||||
static constexpr vtype extract(const type&)
|
||||
{
|
||||
static_assert((V & ff_t::vmask) == V, "ff_t<> error: V out of bounds");
|
||||
return V;
|
||||
@@ -250,10 +255,14 @@ struct ff_t : bf_base<T, N>
|
||||
}
|
||||
};
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
template<typename T, uint I, uint N>
|
||||
struct fmt_unveil<bf_t<T, I, N>, void>
|
||||
{
|
||||
using type = typename fmt_unveil<simple_t<T>>::type;
|
||||
using type = typename fmt_unveil<std::common_type_t<T>>::type;
|
||||
|
||||
static inline auto get(const bf_t<T, I, N>& bf)
|
||||
{
|
||||
@@ -264,7 +273,7 @@ struct fmt_unveil<bf_t<T, I, N>, void>
|
||||
template<typename F, typename... Fields>
|
||||
struct fmt_unveil<cf_t<F, Fields...>, void>
|
||||
{
|
||||
using type = typename fmt_unveil<simple_t<typename F::type>>::type;
|
||||
using type = typename fmt_unveil<std::common_type_t<typename F::type>>::type;
|
||||
|
||||
static inline auto get(const cf_t<F, Fields...>& cf)
|
||||
{
|
||||
@@ -275,7 +284,7 @@ struct fmt_unveil<cf_t<F, Fields...>, void>
|
||||
template<typename T, T V, uint N>
|
||||
struct fmt_unveil<ff_t<T, V, N>, void>
|
||||
{
|
||||
using type = typename fmt_unveil<simple_t<T>>::type;
|
||||
using type = typename fmt_unveil<std::common_type_t<T>>::type;
|
||||
|
||||
static inline auto get(const ff_t<T, V, N>& ff)
|
||||
{
|
||||
|
||||
+1
-3
@@ -295,7 +295,7 @@ namespace CRCPP
|
||||
static CRCType Finalize(CRCType remainder, CRCType finalXOR, bool reflectOutput);
|
||||
|
||||
template <typename CRCType, crcpp_uint16 CRCWidth>
|
||||
static CRCType UndoFinalize(CRCType remainder, CRCType finalXOR, bool reflectOutput);
|
||||
static CRCType UndoFinalize(CRCType crc, CRCType finalXOR, bool reflectOutput);
|
||||
|
||||
template <typename CRCType, crcpp_uint16 CRCWidth>
|
||||
static CRCType CalculateRemainder(const void * data, crcpp_size size, const Parameters<CRCType, CRCWidth> & parameters, CRCType remainder);
|
||||
@@ -771,8 +771,6 @@ namespace CRCPP
|
||||
in a function even in a branch will never be executed. This also means we don't need pragmas
|
||||
to get rid of warnings, but it still can be computed at compile-time. Win-win!
|
||||
@param[in] x Compile-time expression to bound
|
||||
@tparam CRCType Integer type for storing the CRC result
|
||||
@tparam CRCWidth Number of bits in the CRC
|
||||
@return Non-negative compile-time expression
|
||||
*/
|
||||
template <typename IntegerType>
|
||||
|
||||
+16
-14
@@ -20,27 +20,29 @@ namespace cfg
|
||||
}
|
||||
|
||||
_base::_base(type _type, node* owner, const std::string& name, bool dynamic)
|
||||
: m_type(_type), m_dynamic(dynamic)
|
||||
: m_type(_type), m_dynamic(dynamic), m_name(name)
|
||||
{
|
||||
for (const auto& pair : owner->m_nodes)
|
||||
for (const auto& node : owner->m_nodes)
|
||||
{
|
||||
if (pair.first == name)
|
||||
if (node->get_name() == name)
|
||||
{
|
||||
cfg_log.fatal("Node already exists: %s", name);
|
||||
}
|
||||
}
|
||||
|
||||
owner->m_nodes.emplace_back(name, this);
|
||||
owner->m_nodes.emplace_back(this);
|
||||
}
|
||||
|
||||
bool _base::from_string(const std::string&, bool)
|
||||
{
|
||||
fmt::throw_exception("from_string() purecall");
|
||||
cfg_log.fatal("cfg::_base::from_string() purecall");
|
||||
return false;
|
||||
}
|
||||
|
||||
bool _base::from_list(std::vector<std::string>&&)
|
||||
{
|
||||
fmt::throw_exception("from_list() purecall");
|
||||
cfg_log.fatal("cfg::_base::from_list() purecall");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Emit YAML
|
||||
@@ -136,7 +138,7 @@ bool cfg::try_to_uint64(u64* out, const std::string& value, u64 min, u64 max)
|
||||
|
||||
bool cfg::try_to_enum_value(u64* out, decltype(&fmt_class_string<int>::format) func, const std::string& value)
|
||||
{
|
||||
u64 max = -1;
|
||||
u64 max = umax;
|
||||
|
||||
for (u64 i = 0;; i++)
|
||||
{
|
||||
@@ -218,11 +220,11 @@ void cfg::encode(YAML::Emitter& out, const cfg::_base& rhs)
|
||||
case type::node:
|
||||
{
|
||||
out << YAML::BeginMap;
|
||||
for (const auto& np : static_cast<const node&>(rhs).get_nodes())
|
||||
for (const auto& node : static_cast<const node&>(rhs).get_nodes())
|
||||
{
|
||||
out << YAML::Key << np.first;
|
||||
out << YAML::Key << node->get_name();
|
||||
out << YAML::Value;
|
||||
encode(out, *np.second);
|
||||
encode(out, *node);
|
||||
}
|
||||
|
||||
out << YAML::EndMap;
|
||||
@@ -281,11 +283,11 @@ void cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic)
|
||||
if (!pair.first.IsScalar()) continue;
|
||||
|
||||
// Find the key among existing nodes
|
||||
for (const auto& _pair : static_cast<node&>(rhs).get_nodes())
|
||||
for (const auto& node : static_cast<node&>(rhs).get_nodes())
|
||||
{
|
||||
if (_pair.first == pair.first.Scalar())
|
||||
if (node->get_name() == pair.first.Scalar())
|
||||
{
|
||||
decode(pair.second, *_pair.second, dynamic);
|
||||
decode(pair.second, *node, dynamic);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -366,7 +368,7 @@ void cfg::node::from_default()
|
||||
{
|
||||
for (auto& node : m_nodes)
|
||||
{
|
||||
node.second->from_default();
|
||||
node->from_default();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
-13
@@ -48,10 +48,11 @@ namespace cfg
|
||||
// Config tree entry abstract base class
|
||||
class _base
|
||||
{
|
||||
const type m_type;
|
||||
const type m_type{};
|
||||
|
||||
protected:
|
||||
bool m_dynamic = true;
|
||||
const std::string m_name{};
|
||||
|
||||
// Ownerless entry constructor
|
||||
_base(type _type);
|
||||
@@ -64,11 +65,15 @@ namespace cfg
|
||||
|
||||
_base& operator=(const _base&) = delete;
|
||||
|
||||
virtual ~_base() = default;
|
||||
|
||||
// Get type
|
||||
type get_type() const { return m_type; }
|
||||
|
||||
const std::string& get_name() const { return m_name; }
|
||||
|
||||
// Get dynamic property for reloading configs during games
|
||||
bool get_is_dynamic() const { return m_dynamic; };
|
||||
bool get_is_dynamic() const { return m_dynamic; }
|
||||
|
||||
// Reset defaults
|
||||
virtual void from_default() = 0;
|
||||
@@ -95,7 +100,7 @@ namespace cfg
|
||||
// Config tree node which contains another nodes
|
||||
class node : public _base
|
||||
{
|
||||
std::vector<std::pair<std::string, _base*>> m_nodes;
|
||||
std::vector<_base*> m_nodes{};
|
||||
|
||||
friend class _base;
|
||||
|
||||
@@ -391,8 +396,6 @@ namespace cfg
|
||||
// Simple string entry with mutex
|
||||
class string : public _base
|
||||
{
|
||||
const std::string m_name;
|
||||
|
||||
atomic_ptr<std::string> m_value;
|
||||
|
||||
public:
|
||||
@@ -400,7 +403,6 @@ namespace cfg
|
||||
|
||||
string(node* owner, std::string name, std::string def = {}, bool dynamic = false)
|
||||
: _base(type::string, owner, name, dynamic)
|
||||
, m_name(std::move(name))
|
||||
, m_value(def)
|
||||
, def(std::move(def))
|
||||
{
|
||||
@@ -426,11 +428,6 @@ namespace cfg
|
||||
}
|
||||
}
|
||||
|
||||
const std::string& get_name() const
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
void from_default() override;
|
||||
|
||||
std::string to_string() const override
|
||||
@@ -448,7 +445,7 @@ namespace cfg
|
||||
// Simple set entry (TODO: template for various types)
|
||||
class set_entry final : public _base
|
||||
{
|
||||
std::set<std::string> m_set;
|
||||
std::set<std::string> m_set{};
|
||||
|
||||
public:
|
||||
// Default value is empty list in current implementation
|
||||
@@ -484,7 +481,7 @@ namespace cfg
|
||||
|
||||
class log_entry final : public _base
|
||||
{
|
||||
std::map<std::string, logs::level> m_map;
|
||||
std::map<std::string, logs::level> m_map{};
|
||||
|
||||
public:
|
||||
log_entry(node* owner, const std::string& name)
|
||||
|
||||
+141
-149
@@ -6,7 +6,6 @@
|
||||
#include <unordered_map>
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <cerrno>
|
||||
#include <map>
|
||||
|
||||
#include "util/asm.hpp"
|
||||
@@ -18,11 +17,6 @@ using namespace std::literals::string_literals;
|
||||
#include <cwchar>
|
||||
#include <Windows.h>
|
||||
|
||||
namespace utils
|
||||
{
|
||||
u64 get_unique_tsc();
|
||||
}
|
||||
|
||||
static std::unique_ptr<wchar_t[]> to_wchar(const std::string& source)
|
||||
{
|
||||
// String size + null terminator
|
||||
@@ -65,7 +59,7 @@ static void to_utf8(std::string& out, const wchar_t* source)
|
||||
// Resize buffer
|
||||
out.resize(buf_size - 1);
|
||||
|
||||
const int result = WideCharToMultiByte(CP_UTF8, 0, source, static_cast<int>(length) + 1, &out.front(), buf_size, NULL, NULL);
|
||||
const int result = WideCharToMultiByte(CP_UTF8, 0, source, static_cast<int>(length) + 1, &out.front(), buf_size, nullptr, nullptr);
|
||||
|
||||
// Fix the size
|
||||
out.resize(ensure(result) - 1);
|
||||
@@ -210,13 +204,13 @@ namespace fs
|
||||
|
||||
class device_manager final
|
||||
{
|
||||
mutable shared_mutex m_mutex;
|
||||
mutable shared_mutex m_mutex{};
|
||||
|
||||
std::unordered_map<std::string, std::shared_ptr<device_base>> m_map;
|
||||
std::unordered_map<std::string, shared_ptr<device_base>> m_map{};
|
||||
|
||||
public:
|
||||
std::shared_ptr<device_base> get_device(const std::string& path);
|
||||
std::shared_ptr<device_base> set_device(const std::string& name, const std::shared_ptr<device_base>&);
|
||||
shared_ptr<device_base> get_device(const std::string& path);
|
||||
shared_ptr<device_base> set_device(const std::string& name, shared_ptr<device_base>);
|
||||
};
|
||||
|
||||
static device_manager& get_device_manager()
|
||||
@@ -230,7 +224,7 @@ namespace fs
|
||||
{
|
||||
}
|
||||
|
||||
stat_t file_base::stat()
|
||||
[[noreturn]] stat_t file_base::stat()
|
||||
{
|
||||
fmt::throw_exception("fs::file::stat() not supported.");
|
||||
}
|
||||
@@ -281,48 +275,112 @@ namespace fs
|
||||
{
|
||||
}
|
||||
|
||||
device_base::device_base()
|
||||
: fs_prefix(fmt::format("/vfsv0_%s%s_", fmt::base57(reinterpret_cast<u64>(this)), fmt::base57(utils::get_unique_tsc())))
|
||||
{
|
||||
}
|
||||
|
||||
device_base::~device_base()
|
||||
{
|
||||
}
|
||||
|
||||
bool device_base::remove_dir(const std::string&)
|
||||
{
|
||||
g_tls_error = error::readonly;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool device_base::create_dir(const std::string&)
|
||||
{
|
||||
g_tls_error = error::readonly;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool device_base::rename(const std::string&, const std::string&)
|
||||
{
|
||||
g_tls_error = error::readonly;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool device_base::remove(const std::string&)
|
||||
{
|
||||
g_tls_error = error::readonly;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool device_base::trunc(const std::string&, u64)
|
||||
{
|
||||
g_tls_error = error::readonly;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool device_base::utime(const std::string&, s64, s64)
|
||||
{
|
||||
g_tls_error = error::readonly;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
std::shared_ptr<fs::device_base> fs::device_manager::get_device(const std::string& path)
|
||||
shared_ptr<fs::device_base> fs::device_manager::get_device(const std::string& path)
|
||||
{
|
||||
reader_lock lock(m_mutex);
|
||||
|
||||
const auto found = m_map.find(path.substr(0, path.find_first_of('/', 2)));
|
||||
const usz prefix = path.find_first_of('_', 7) + 1;
|
||||
|
||||
if (found == m_map.end())
|
||||
const auto found = m_map.find(path.substr(prefix, path.find_first_of('/', 1) - prefix));
|
||||
|
||||
if (found == m_map.end() || !path.starts_with(found->second->fs_prefix))
|
||||
{
|
||||
return nullptr;
|
||||
return null_ptr;
|
||||
}
|
||||
|
||||
return found->second;
|
||||
}
|
||||
|
||||
std::shared_ptr<fs::device_base> fs::device_manager::set_device(const std::string& name, const std::shared_ptr<device_base>& device)
|
||||
shared_ptr<fs::device_base> fs::device_manager::set_device(const std::string& name, shared_ptr<device_base> device)
|
||||
{
|
||||
std::lock_guard lock(m_mutex);
|
||||
|
||||
return m_map[name] = device;
|
||||
if (device)
|
||||
{
|
||||
// Adding
|
||||
if (auto [it, ok] = m_map.try_emplace(name, std::move(device)); ok)
|
||||
{
|
||||
return it->second;
|
||||
}
|
||||
|
||||
g_tls_error = error::exist;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Removing
|
||||
if (auto found = m_map.find(name); found != m_map.end())
|
||||
{
|
||||
device = std::move(found->second);
|
||||
m_map.erase(found);
|
||||
return device;
|
||||
}
|
||||
|
||||
g_tls_error = error::noent;
|
||||
}
|
||||
|
||||
return null_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<fs::device_base> fs::get_virtual_device(const std::string& path)
|
||||
shared_ptr<fs::device_base> fs::get_virtual_device(const std::string& path)
|
||||
{
|
||||
// Every virtual device path must have "//" at the beginning
|
||||
if (path.starts_with("//"))
|
||||
// Every virtual device path must have specific name at the beginning
|
||||
if (path.starts_with("/vfsv0_") && path.size() >= 8 + 22 && path[29] == '_' && path.find_first_of('/', 1) > 29)
|
||||
{
|
||||
return get_device_manager().get_device(path);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
return null_ptr;
|
||||
}
|
||||
|
||||
std::shared_ptr<fs::device_base> fs::set_virtual_device(const std::string& name, const std::shared_ptr<device_base>& device)
|
||||
shared_ptr<fs::device_base> fs::set_virtual_device(const std::string& name, shared_ptr<device_base> device)
|
||||
{
|
||||
ensure(name.starts_with("//") && name[2] != '/');
|
||||
|
||||
return get_device_manager().set_device(name, device);
|
||||
return get_device_manager().set_device(name, std::move(device));
|
||||
}
|
||||
|
||||
std::string fs::get_parent_dir(const std::string& path)
|
||||
@@ -593,9 +651,17 @@ bool fs::create_dir(const std::string& path)
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
if (!CreateDirectoryW(to_wchar(path).get(), NULL))
|
||||
if (!CreateDirectoryW(to_wchar(path).get(), nullptr))
|
||||
{
|
||||
g_tls_error = to_error(GetLastError());
|
||||
int res = GetLastError();
|
||||
|
||||
if (res == ERROR_ACCESS_DENIED && is_dir(path))
|
||||
{
|
||||
// May happen on drives
|
||||
res = ERROR_ALREADY_EXISTS;
|
||||
}
|
||||
|
||||
g_tls_error = to_error(res);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -705,7 +771,7 @@ bool fs::rename(const std::string& from, const std::string& to, bool overwrite)
|
||||
}
|
||||
|
||||
error1 = GetLastError();
|
||||
CreateDirectoryW(ws2.get(), NULL); // TODO
|
||||
CreateDirectoryW(ws2.get(), nullptr); // TODO
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -874,7 +940,7 @@ bool fs::truncate_file(const std::string& path, u64 length)
|
||||
|
||||
#ifdef _WIN32
|
||||
// Open the file
|
||||
const auto handle = CreateFileW(to_wchar(path).get(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
const auto handle = CreateFileW(to_wchar(path).get(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
g_tls_error = to_error(GetLastError());
|
||||
@@ -913,7 +979,7 @@ bool fs::utime(const std::string& path, s64 atime, s64 mtime)
|
||||
|
||||
#ifdef _WIN32
|
||||
// Open the file
|
||||
const auto handle = CreateFileW(to_wchar(path).get(), FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
const auto handle = CreateFileW(to_wchar(path).get(), FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
g_tls_error = to_error(GetLastError());
|
||||
@@ -1025,7 +1091,7 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
|
||||
share |= FILE_SHARE_WRITE;
|
||||
}
|
||||
|
||||
const HANDLE handle = CreateFileW(to_wchar(path).get(), access, share, NULL, disp, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
const HANDLE handle = CreateFileW(to_wchar(path).get(), access, share, nullptr, disp, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
@@ -1092,7 +1158,7 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
|
||||
const int size = narrow<int>(count);
|
||||
|
||||
DWORD nread;
|
||||
ensure(ReadFile(m_handle, buffer, size, &nread, NULL)); // "file::read"
|
||||
ensure(ReadFile(m_handle, buffer, size, &nread, nullptr)); // "file::read"
|
||||
|
||||
return nread;
|
||||
}
|
||||
@@ -1103,7 +1169,7 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
|
||||
const int size = narrow<int>(count);
|
||||
|
||||
DWORD nwritten;
|
||||
ensure(WriteFile(m_handle, buffer, size, &nwritten, NULL)); // "file::write"
|
||||
ensure(WriteFile(m_handle, buffer, size, &nwritten, nullptr)); // "file::write"
|
||||
|
||||
return nwritten;
|
||||
}
|
||||
@@ -1301,8 +1367,19 @@ fs::file::file(const std::string& path, bs_t<open_mode> mode)
|
||||
static_assert(sizeof(iovec) == sizeof(iovec_clone), "Weird iovec size");
|
||||
static_assert(offsetof(iovec, iov_len) == offsetof(iovec_clone, iov_len), "Weird iovec::iov_len offset");
|
||||
|
||||
const auto result = ::writev(m_fd, reinterpret_cast<const iovec*>(buffers), buf_count);
|
||||
ensure(result != -1); // "file::write_gather"
|
||||
u64 result = 0;
|
||||
|
||||
while (buf_count)
|
||||
{
|
||||
iovec arg[256];
|
||||
const auto count = std::min<u64>(buf_count, 256);
|
||||
std::memcpy(&arg, buffers, sizeof(iovec) * count);
|
||||
const auto added = ::writev(m_fd, arg, count);
|
||||
ensure(added != -1); // "file::write_gather"
|
||||
result += added;
|
||||
buf_count -= count;
|
||||
buffers += count;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -1328,7 +1405,11 @@ fs::file::file(const void* ptr, usz size)
|
||||
{
|
||||
}
|
||||
|
||||
bool trunc(u64 length) override
|
||||
memory_stream(const memory_stream&) = delete;
|
||||
|
||||
memory_stream& operator=(const memory_stream&) = delete;
|
||||
|
||||
bool trunc(u64) override
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -1349,7 +1430,7 @@ fs::file::file(const void* ptr, usz size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
u64 write(const void* buffer, u64 count) override
|
||||
u64 write(const void*, u64) override
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -1416,7 +1497,7 @@ bool fs::dir::open(const std::string& path)
|
||||
|
||||
#ifdef _WIN32
|
||||
WIN32_FIND_DATAW found;
|
||||
const auto handle = FindFirstFileExW(to_wchar(path + "/*").get(), FindExInfoBasic, &found, FindExSearchNameMatch, NULL, FIND_FIRST_EX_CASE_SENSITIVE | FIND_FIRST_EX_LARGE_FETCH);
|
||||
const auto handle = FindFirstFileExW(to_wchar(path + "/*").get(), FindExInfoBasic, &found, FindExSearchNameMatch, nullptr, FIND_FIRST_EX_CASE_SENSITIVE | FIND_FIRST_EX_LARGE_FETCH);
|
||||
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
@@ -1498,6 +1579,10 @@ bool fs::dir::open(const std::string& path)
|
||||
{
|
||||
}
|
||||
|
||||
unix_dir(const unix_dir&) = delete;
|
||||
|
||||
unix_dir& operator=(const unix_dir&) = delete;
|
||||
|
||||
~unix_dir() override
|
||||
{
|
||||
::closedir(m_dd);
|
||||
@@ -1545,6 +1630,17 @@ bool fs::dir::open(const std::string& path)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool fs::file::strict_read_check(u64 _size, u64 type_size) const
|
||||
{
|
||||
if (usz pos0 = pos(), size0 = size(); pos0 >= size0 || (size0 - pos0) / type_size < _size)
|
||||
{
|
||||
fs::g_tls_error = fs::error::inval;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const std::string& fs::get_config_dir()
|
||||
{
|
||||
// Use magic static
|
||||
@@ -1556,9 +1652,9 @@ const std::string& fs::get_config_dir()
|
||||
wchar_t buf[32768];
|
||||
constexpr DWORD size = static_cast<DWORD>(std::size(buf));
|
||||
if (GetEnvironmentVariable(L"RPCS3_CONFIG_DIR", buf, size) - 1 >= size - 1 &&
|
||||
GetModuleFileName(NULL, buf, size) - 1 >= size - 1)
|
||||
GetModuleFileName(nullptr, buf, size) - 1 >= size - 1)
|
||||
{
|
||||
MessageBoxA(0, fmt::format("GetModuleFileName() failed: error %u.", GetLastError()).c_str(), "fs::get_config_dir()", MB_ICONERROR);
|
||||
MessageBoxA(nullptr, fmt::format("GetModuleFileName() failed: error %u.", GetLastError()).c_str(), "fs::get_config_dir()", MB_ICONERROR);
|
||||
return dir; // empty
|
||||
}
|
||||
|
||||
@@ -1673,110 +1769,6 @@ bool fs::remove_all(const std::string& path, bool remove_root)
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string fs::escape_path(std::string_view path)
|
||||
{
|
||||
std::string real; real.resize(path.size());
|
||||
|
||||
auto get_char = [&](usz& from, usz& to, usz count)
|
||||
{
|
||||
std::memcpy(&real[to], &path[from], count);
|
||||
from += count, to += count;
|
||||
};
|
||||
|
||||
usz i = 0, j = -1, pos_nondelim = 0, after_delim = 0;
|
||||
|
||||
if (i < path.size())
|
||||
{
|
||||
j = 0;
|
||||
}
|
||||
|
||||
for (; i < path.size();)
|
||||
{
|
||||
real[j] = path[i];
|
||||
#ifdef _Win32
|
||||
if (real[j] == '\\')
|
||||
{
|
||||
real[j] = '/';
|
||||
}
|
||||
#endif
|
||||
// If the current character was preceeded by a delimiter special treatment is required:
|
||||
// If another deleimiter is encountered, remove it (do not write it to output string)
|
||||
// Otherwise test if it is a "." or ".." sequence.
|
||||
if (std::exchange(after_delim, path[i] == delim[0] || path[i] == delim[1]))
|
||||
{
|
||||
if (!after_delim)
|
||||
{
|
||||
if (real[j] == '.')
|
||||
{
|
||||
if (i + 1 == path.size())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
get_char(i, j, 1);
|
||||
|
||||
switch (real[j])
|
||||
{
|
||||
case '.':
|
||||
{
|
||||
bool remove_element = true;
|
||||
usz k = 1;
|
||||
|
||||
for (; k + i != path.size(); k++)
|
||||
{
|
||||
switch (path[i + k])
|
||||
{
|
||||
case '.': continue;
|
||||
case delim[0]: case delim[1]: break;
|
||||
default: remove_element = false; break;
|
||||
}
|
||||
}
|
||||
|
||||
if (remove_element)
|
||||
{
|
||||
if (i == 1u)
|
||||
{
|
||||
j = pos_nondelim;
|
||||
real[j] = '\0';// Ensure termination at this posistion
|
||||
after_delim = true;
|
||||
i += k;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
get_char(i, j, k);
|
||||
continue;
|
||||
}
|
||||
case '/':
|
||||
{
|
||||
i++;
|
||||
after_delim = true;
|
||||
continue;
|
||||
}
|
||||
default: get_char(i, j, 1); continue;
|
||||
}
|
||||
}
|
||||
|
||||
pos_nondelim = j;
|
||||
get_char(i, j, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
get_char(i, j, 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (j != umax && (real[j] == delim[0] || real[j] == delim[1])) j--; // Do not include a delmiter at the end
|
||||
|
||||
real.resize(j + 1);
|
||||
return real;
|
||||
}
|
||||
|
||||
u64 fs::get_dir_size(const std::string& path, u64 rounding_alignment)
|
||||
{
|
||||
u64 result = 0;
|
||||
@@ -1821,8 +1813,8 @@ fs::file fs::make_gather(std::vector<fs::file> files)
|
||||
{
|
||||
u64 pos = 0;
|
||||
u64 end = 0;
|
||||
std::vector<file> files;
|
||||
std::map<u64, u64> ends; // Fragment End Offset -> Index
|
||||
std::vector<file> files{};
|
||||
std::map<u64, u64> ends{}; // Fragment End Offset -> Index
|
||||
|
||||
gather_stream(std::vector<fs::file> arg)
|
||||
: files(std::move(arg))
|
||||
@@ -1854,7 +1846,7 @@ fs::file fs::make_gather(std::vector<fs::file> files)
|
||||
return result;
|
||||
}
|
||||
|
||||
bool trunc(u64 length) override
|
||||
bool trunc(u64) override
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -1897,7 +1889,7 @@ fs::file fs::make_gather(std::vector<fs::file> files)
|
||||
return 0;
|
||||
}
|
||||
|
||||
u64 write(const void* buffer, u64 size) override
|
||||
u64 write(const void*, u64) override
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
+59
-28
@@ -1,6 +1,7 @@
|
||||
#pragma once // No BOM and only basic ASCII in this header, or a neko will die
|
||||
|
||||
#include "util/types.hpp"
|
||||
#include "util/shared_ptr.hpp"
|
||||
#include "bit_set.h"
|
||||
|
||||
#include <memory>
|
||||
@@ -81,7 +82,7 @@ namespace fs
|
||||
{
|
||||
virtual ~file_base();
|
||||
|
||||
virtual stat_t stat();
|
||||
[[noreturn]] virtual stat_t stat();
|
||||
virtual void sync();
|
||||
virtual bool trunc(u64 length) = 0;
|
||||
virtual u64 read(void* buffer, u64 size) = 0;
|
||||
@@ -95,7 +96,7 @@ namespace fs
|
||||
// Directory entry (TODO)
|
||||
struct dir_entry : stat_t
|
||||
{
|
||||
std::string name;
|
||||
std::string name{};
|
||||
|
||||
dir_entry()
|
||||
: stat_t{}
|
||||
@@ -124,16 +125,19 @@ namespace fs
|
||||
// Virtual device
|
||||
struct device_base
|
||||
{
|
||||
const std::string fs_prefix;
|
||||
|
||||
device_base();
|
||||
virtual ~device_base();
|
||||
|
||||
virtual bool stat(const std::string& path, stat_t& info) = 0;
|
||||
virtual bool statfs(const std::string& path, device_stat& info) = 0;
|
||||
virtual bool remove_dir(const std::string& path) = 0;
|
||||
virtual bool create_dir(const std::string& path) = 0;
|
||||
virtual bool rename(const std::string& from, const std::string& to) = 0;
|
||||
virtual bool remove(const std::string& path) = 0;
|
||||
virtual bool trunc(const std::string& path, u64 length) = 0;
|
||||
virtual bool utime(const std::string& path, s64 atime, s64 mtime) = 0;
|
||||
virtual bool remove_dir(const std::string& path);
|
||||
virtual bool create_dir(const std::string& path);
|
||||
virtual bool rename(const std::string& from, const std::string& to);
|
||||
virtual bool remove(const std::string& path);
|
||||
virtual bool trunc(const std::string& path, u64 length);
|
||||
virtual bool utime(const std::string& path, s64 atime, s64 mtime);
|
||||
|
||||
virtual std::unique_ptr<file_base> open(const std::string& path, bs_t<open_mode> mode) = 0;
|
||||
virtual std::unique_ptr<dir_base> open_dir(const std::string& path) = 0;
|
||||
@@ -146,10 +150,10 @@ namespace fs
|
||||
constexpr struct pod_tag_t{} pod_tag;
|
||||
|
||||
// Get virtual device for specified path (nullptr for real path)
|
||||
std::shared_ptr<device_base> get_virtual_device(const std::string& path);
|
||||
shared_ptr<device_base> get_virtual_device(const std::string& path);
|
||||
|
||||
// Set virtual device with specified name (nullptr for deletion)
|
||||
std::shared_ptr<device_base> set_virtual_device(const std::string& root_name, const std::shared_ptr<device_base>&);
|
||||
shared_ptr<device_base> set_virtual_device(const std::string& name, shared_ptr<device_base> device);
|
||||
|
||||
// Try to get parent directory (returns empty string on failure)
|
||||
std::string get_parent_dir(const std::string& path);
|
||||
@@ -198,7 +202,9 @@ namespace fs
|
||||
|
||||
class file final
|
||||
{
|
||||
std::unique_ptr<file_base> m_file;
|
||||
std::unique_ptr<file_base> m_file{};
|
||||
|
||||
bool strict_read_check(u64 size, u64 type_size) const;
|
||||
|
||||
public:
|
||||
// Default constructor
|
||||
@@ -377,15 +383,24 @@ namespace fs
|
||||
}
|
||||
|
||||
// Read std::basic_string
|
||||
template <typename T>
|
||||
std::enable_if_t<std::is_trivially_copyable_v<T> && !std::is_pointer_v<T>, bool> read(std::basic_string<T>& str, usz size,
|
||||
template <bool IsStrict = false, typename T>
|
||||
std::enable_if_t<std::is_trivially_copyable_v<T> && !std::is_pointer_v<T>, bool> read(std::basic_string<T>& str, usz _size,
|
||||
const char* file = __builtin_FILE(),
|
||||
const char* func = __builtin_FUNCTION(),
|
||||
u32 line = __builtin_LINE(),
|
||||
u32 col = __builtin_COLUMN()) const
|
||||
{
|
||||
str.resize(size);
|
||||
return read(&str[0], size * sizeof(T), line, col, file, func) == size * sizeof(T);
|
||||
if (!m_file) xnull({line, col, file, func});
|
||||
if (!_size) return true;
|
||||
|
||||
if constexpr (IsStrict)
|
||||
{
|
||||
// If _size arg is too high std::bad_alloc may happen in resize and then we cannot error check
|
||||
if (!strict_read_check(_size, sizeof(T))) return false;
|
||||
}
|
||||
|
||||
str.resize(_size);
|
||||
return read(str.data(), sizeof(T) * _size, line, col, file, func) == sizeof(T) * _size;
|
||||
}
|
||||
|
||||
// Read POD, sizeof(T) is used
|
||||
@@ -412,15 +427,23 @@ namespace fs
|
||||
}
|
||||
|
||||
// Read POD std::vector
|
||||
template <typename T>
|
||||
std::enable_if_t<std::is_trivially_copyable_v<T> && !std::is_pointer_v<T>, bool> read(std::vector<T>& vec, usz size,
|
||||
template <bool IsStrict = false, typename T>
|
||||
std::enable_if_t<std::is_trivially_copyable_v<T> && !std::is_pointer_v<T>, bool> read(std::vector<T>& vec, usz _size,
|
||||
const char* file = __builtin_FILE(),
|
||||
const char* func = __builtin_FUNCTION(),
|
||||
u32 line = __builtin_LINE(),
|
||||
u32 col = __builtin_COLUMN()) const
|
||||
{
|
||||
vec.resize(size);
|
||||
return read(vec.data(), sizeof(T) * size, line, col, file, func) == sizeof(T) * size;
|
||||
if (!m_file) xnull({line, col, file, func});
|
||||
if (!_size) return true;
|
||||
|
||||
if constexpr (IsStrict)
|
||||
{
|
||||
if (!strict_read_check(_size, sizeof(T))) return false;
|
||||
}
|
||||
|
||||
vec.resize(_size);
|
||||
return read(vec.data(), sizeof(T) * _size, line, col, file, func) == sizeof(T) * _size;
|
||||
}
|
||||
|
||||
// Read POD (experimental)
|
||||
@@ -482,7 +505,7 @@ namespace fs
|
||||
|
||||
class dir final
|
||||
{
|
||||
std::unique_ptr<dir_base> m_dir;
|
||||
std::unique_ptr<dir_base> m_dir{};
|
||||
|
||||
public:
|
||||
dir() = default;
|
||||
@@ -543,7 +566,7 @@ namespace fs
|
||||
class iterator
|
||||
{
|
||||
const dir* m_parent;
|
||||
dir_entry m_entry;
|
||||
dir_entry m_entry{};
|
||||
|
||||
public:
|
||||
enum class mode
|
||||
@@ -571,6 +594,14 @@ namespace fs
|
||||
}
|
||||
}
|
||||
|
||||
iterator(const iterator&) = default;
|
||||
|
||||
iterator(iterator&&) = default;
|
||||
|
||||
iterator& operator=(const iterator&) = default;
|
||||
|
||||
iterator& operator=(iterator&&) = default;
|
||||
|
||||
dir_entry& operator *()
|
||||
{
|
||||
return m_entry;
|
||||
@@ -608,7 +639,7 @@ namespace fs
|
||||
// Unique pending file creation destined to be renamed to the destination file
|
||||
struct pending_file
|
||||
{
|
||||
fs::file file;
|
||||
fs::file file{};
|
||||
|
||||
// This is meant to modify files atomically, overwriting is likely
|
||||
bool commit(bool overwrite = true);
|
||||
@@ -617,13 +648,10 @@ namespace fs
|
||||
~pending_file();
|
||||
|
||||
private:
|
||||
std::string m_path; // Pending file path
|
||||
std::string m_dest; // Destination file path
|
||||
std::string m_path{}; // Pending file path
|
||||
std::string m_dest{}; // Destination file path
|
||||
};
|
||||
|
||||
// Get real path for comparisons (TODO: investigate std::filesystem::path::compare implementation)
|
||||
std::string escape_path(std::string_view path);
|
||||
|
||||
// Delete directory and all its contents recursively
|
||||
bool remove_all(const std::string& path, bool remove_root = true);
|
||||
|
||||
@@ -696,13 +724,16 @@ namespace fs
|
||||
{
|
||||
const u64 old_size = obj.size();
|
||||
|
||||
if (old_size + size < old_size)
|
||||
if (old_size + size < old_size || pos + size < pos)
|
||||
{
|
||||
xovfl();
|
||||
}
|
||||
|
||||
if (pos > old_size)
|
||||
{
|
||||
// Reserve memory
|
||||
obj.reserve(pos + size);
|
||||
|
||||
// Fill gap if necessary (default-initialized)
|
||||
obj.resize(pos);
|
||||
}
|
||||
|
||||
+27
-19
@@ -8,7 +8,6 @@
|
||||
#include "util/vm.hpp"
|
||||
#include "util/asm.hpp"
|
||||
#include <charconv>
|
||||
#include <immintrin.h>
|
||||
#include <zlib.h>
|
||||
|
||||
#ifdef __linux__
|
||||
@@ -143,7 +142,7 @@ asmjit::Error jit_runtime::_add(void** dst, asmjit::CodeHolder* code) noexcept
|
||||
return asmjit::kErrorOk;
|
||||
}
|
||||
|
||||
asmjit::Error jit_runtime::_release(void* ptr) noexcept
|
||||
asmjit::Error jit_runtime::_release(void*) noexcept
|
||||
{
|
||||
return asmjit::kErrorOk;
|
||||
}
|
||||
@@ -218,6 +217,10 @@ asmjit::Runtime& asmjit::get_global_runtime()
|
||||
utils::memory_commit(m_pos, size, utils::protection::wx);
|
||||
}
|
||||
|
||||
custom_runtime(const custom_runtime&) = delete;
|
||||
|
||||
custom_runtime& operator=(const custom_runtime&) = delete;
|
||||
|
||||
asmjit::Error _add(void** dst, asmjit::CodeHolder* code) noexcept override
|
||||
{
|
||||
usz codeSize = code->getCodeSize();
|
||||
@@ -249,7 +252,7 @@ asmjit::Runtime& asmjit::get_global_runtime()
|
||||
return asmjit::kErrorOk;
|
||||
}
|
||||
|
||||
asmjit::Error _release(void* ptr) noexcept override
|
||||
asmjit::Error _release(void*) noexcept override
|
||||
{
|
||||
return asmjit::kErrorOk;
|
||||
}
|
||||
@@ -268,10 +271,7 @@ asmjit::Runtime& asmjit::get_global_runtime()
|
||||
#ifdef LLVM_AVAILABLE
|
||||
|
||||
#include <unordered_map>
|
||||
#include <map>
|
||||
#include <unordered_set>
|
||||
#include <set>
|
||||
#include <array>
|
||||
#include <deque>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
@@ -281,6 +281,11 @@ asmjit::Runtime& asmjit::get_global_runtime()
|
||||
#pragma GCC diagnostic ignored "-Wall"
|
||||
#pragma GCC diagnostic ignored "-Wextra"
|
||||
#pragma GCC diagnostic ignored "-Wold-style-cast"
|
||||
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
||||
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
||||
#pragma GCC diagnostic ignored "-Wredundant-decls"
|
||||
#pragma GCC diagnostic ignored "-Weffc++"
|
||||
#pragma GCC diagnostic ignored "-Wmissing-noreturn"
|
||||
#endif
|
||||
#include "llvm/Support/TargetSelect.h"
|
||||
#include "llvm/Support/FormattedStream.h"
|
||||
@@ -294,12 +299,6 @@ asmjit::Runtime& asmjit::get_global_runtime()
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <Windows.h>
|
||||
#else
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
const bool jit_initialize = []() -> bool
|
||||
{
|
||||
llvm::InitializeNativeTarget();
|
||||
@@ -386,6 +385,10 @@ struct MemoryManager1 : llvm::RTDyldMemoryManager
|
||||
|
||||
MemoryManager1() = default;
|
||||
|
||||
MemoryManager1(const MemoryManager1&) = delete;
|
||||
|
||||
MemoryManager1& operator=(const MemoryManager1&) = delete;
|
||||
|
||||
~MemoryManager1() override
|
||||
{
|
||||
utils::memory_release(ptr, c_max_size * 2);
|
||||
@@ -439,12 +442,12 @@ struct MemoryManager1 : llvm::RTDyldMemoryManager
|
||||
return this->ptr + olda;
|
||||
}
|
||||
|
||||
u8* allocateCodeSection(uptr size, uint align, uint sec_id, llvm::StringRef sec_name) override
|
||||
u8* allocateCodeSection(uptr size, uint align, uint /*sec_id*/, llvm::StringRef /*sec_name*/) override
|
||||
{
|
||||
return allocate(code_ptr, size, align, utils::protection::wx);
|
||||
}
|
||||
|
||||
u8* allocateDataSection(uptr size, uint align, uint sec_id, llvm::StringRef sec_name, bool is_ro) override
|
||||
u8* allocateDataSection(uptr size, uint align, uint /*sec_id*/, llvm::StringRef /*sec_name*/, bool /*is_ro*/) override
|
||||
{
|
||||
return allocate(data_ptr, size, align, utils::protection::rw);
|
||||
}
|
||||
@@ -454,7 +457,7 @@ struct MemoryManager1 : llvm::RTDyldMemoryManager
|
||||
return false;
|
||||
}
|
||||
|
||||
void registerEHFrames(u8* addr, u64 load_addr, usz size) override
|
||||
void registerEHFrames(u8*, u64, usz) override
|
||||
{
|
||||
}
|
||||
|
||||
@@ -489,12 +492,12 @@ struct MemoryManager2 : llvm::RTDyldMemoryManager
|
||||
return {addr, llvm::JITSymbolFlags::Exported};
|
||||
}
|
||||
|
||||
u8* allocateCodeSection(uptr size, uint align, uint sec_id, llvm::StringRef sec_name) override
|
||||
u8* allocateCodeSection(uptr size, uint align, uint /*sec_id*/, llvm::StringRef /*sec_name*/) override
|
||||
{
|
||||
return jit_runtime::alloc(size, align, true);
|
||||
}
|
||||
|
||||
u8* allocateDataSection(uptr size, uint align, uint sec_id, llvm::StringRef sec_name, bool is_ro) override
|
||||
u8* allocateDataSection(uptr size, uint align, uint /*sec_id*/, llvm::StringRef /*sec_name*/, bool /*is_ro*/) override
|
||||
{
|
||||
return jit_runtime::alloc(size, align, false);
|
||||
}
|
||||
@@ -504,7 +507,7 @@ struct MemoryManager2 : llvm::RTDyldMemoryManager
|
||||
return false;
|
||||
}
|
||||
|
||||
void registerEHFrames(u8* addr, u64 load_addr, usz size) override
|
||||
void registerEHFrames(u8*, u64, usz) override
|
||||
{
|
||||
}
|
||||
|
||||
@@ -565,7 +568,12 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
fs::file(name, fs::rewrite).write(zbuf.get(), zsz - zs.avail_out);
|
||||
if (!fs::write_file(name, fs::rewrite, zbuf.get(), zsz - zs.avail_out))
|
||||
{
|
||||
jit_log.error("LLVM: Failed to create module file: %s (%s)", name, fs::g_tls_error);
|
||||
return;
|
||||
}
|
||||
|
||||
jit_log.notice("LLVM: Created module: %s", _module->getName().data());
|
||||
}
|
||||
|
||||
|
||||
+15
-4
@@ -13,6 +13,14 @@
|
||||
#pragma GCC diagnostic ignored "-Wall"
|
||||
#pragma GCC diagnostic ignored "-Wextra"
|
||||
#pragma GCC diagnostic ignored "-Wold-style-cast"
|
||||
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
||||
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
||||
#pragma GCC diagnostic ignored "-Wredundant-decls"
|
||||
#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
|
||||
#pragma GCC diagnostic ignored "-Weffc++"
|
||||
#ifndef __clang__
|
||||
#pragma GCC diagnostic ignored "-Wduplicated-branches"
|
||||
#endif
|
||||
#include <asmjit/asmjit.h>
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
@@ -168,7 +176,6 @@ inline FT build_function_asm(F&& builder)
|
||||
#include <unordered_map>
|
||||
|
||||
#include "util/types.hpp"
|
||||
#include "mutex.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 0)
|
||||
@@ -178,6 +185,10 @@ inline FT build_function_asm(F&& builder)
|
||||
#pragma GCC diagnostic ignored "-Wextra"
|
||||
#pragma GCC diagnostic ignored "-Wold-style-cast"
|
||||
#pragma GCC diagnostic ignored "-Wsuggest-override"
|
||||
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
||||
#pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
||||
#pragma GCC diagnostic ignored "-Weffc++"
|
||||
#pragma GCC diagnostic ignored "-Wmissing-noreturn"
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic ignored "-Winconsistent-missing-override"
|
||||
#endif
|
||||
@@ -195,13 +206,13 @@ inline FT build_function_asm(F&& builder)
|
||||
class jit_compiler final
|
||||
{
|
||||
// Local LLVM context
|
||||
llvm::LLVMContext m_context;
|
||||
llvm::LLVMContext m_context{};
|
||||
|
||||
// Execution instance
|
||||
std::unique_ptr<llvm::ExecutionEngine> m_engine;
|
||||
std::unique_ptr<llvm::ExecutionEngine> m_engine{};
|
||||
|
||||
// Arch
|
||||
std::string m_cpu;
|
||||
std::string m_cpu{};
|
||||
|
||||
public:
|
||||
jit_compiler(const std::unordered_map<std::string, u64>& _link, const std::string& _cpu, u32 flags = 0);
|
||||
|
||||
@@ -29,24 +29,22 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <stdlib.h>
|
||||
#include <cstdlib>
|
||||
|
||||
// check if the scheme name is valid
|
||||
static bool IsSchemeValid( const std::string& SchemeName )
|
||||
{
|
||||
for ( auto c : SchemeName )
|
||||
return std::all_of(SchemeName.cbegin(), SchemeName.cend(), [](const auto& c)
|
||||
{
|
||||
if ( !isalpha( c ) && c != '+' && c != '-' && c != '.' ) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return isalpha(c) || c == '+' || c == '-' || c == '.';
|
||||
});
|
||||
}
|
||||
|
||||
bool LUrlParser::clParseURL::GetPort( int* OutPort ) const
|
||||
{
|
||||
if ( !IsValid() ) { return false; }
|
||||
|
||||
int Port = atoi( m_Port.c_str() );
|
||||
const int Port = atoi( m_Port.c_str() );
|
||||
|
||||
if ( Port <= 0 || Port > 65535 ) { return false; }
|
||||
|
||||
|
||||
+13
-13
@@ -1,21 +1,21 @@
|
||||
/*
|
||||
* Lightweight URL & URI parser (RFC 1738, RFC 3986)
|
||||
* https://github.com/corporateshark/LUrlParser
|
||||
*
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
*
|
||||
* Copyright (C) 2015 Sergey Kosarevsky (sk@linderdaum.com)
|
||||
*
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
@@ -47,14 +47,14 @@ namespace LUrlParser
|
||||
{
|
||||
public:
|
||||
LUrlParserError m_ErrorCode;
|
||||
std::string m_Scheme;
|
||||
std::string m_Host;
|
||||
std::string m_Port;
|
||||
std::string m_Path;
|
||||
std::string m_Query;
|
||||
std::string m_Fragment;
|
||||
std::string m_UserName;
|
||||
std::string m_Password;
|
||||
std::string m_Scheme{};
|
||||
std::string m_Host{};
|
||||
std::string m_Port{};
|
||||
std::string m_Path{};
|
||||
std::string m_Query{};
|
||||
std::string m_Fragment{};
|
||||
std::string m_UserName{};
|
||||
std::string m_Password{};
|
||||
|
||||
clParseURL()
|
||||
: m_ErrorCode( LUrlParserError_Uninitialized )
|
||||
|
||||
+41
-17
@@ -254,6 +254,13 @@ void fmt_class_string<u128>::format(std::string& out, u64 arg)
|
||||
{
|
||||
// TODO: it should be supported as full-fledged integral type (with %u, %d, etc, fmt)
|
||||
const u128& num = get_object(arg);
|
||||
|
||||
if (!num)
|
||||
{
|
||||
out += '0';
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
fmt::append(out, "0x%016llx%016llx", num.hi, num.lo);
|
||||
#else
|
||||
@@ -261,6 +268,12 @@ void fmt_class_string<u128>::format(std::string& out, u64 arg)
|
||||
#endif
|
||||
}
|
||||
|
||||
template <>
|
||||
void fmt_class_string<s128>::format(std::string& out, u64 arg)
|
||||
{
|
||||
return fmt_class_string<u128>::format(out, arg);
|
||||
}
|
||||
|
||||
template <>
|
||||
void fmt_class_string<src_loc>::format(std::string& out, u64 arg)
|
||||
{
|
||||
@@ -344,7 +357,9 @@ struct fmt::cfmt_src
|
||||
template <typename T>
|
||||
T get(usz index) const
|
||||
{
|
||||
return *reinterpret_cast<const T*>(reinterpret_cast<const u8*>(args + index));
|
||||
T res{};
|
||||
std::memcpy(&res, reinterpret_cast<const u8*>(args + index), sizeof(res));
|
||||
return res;
|
||||
}
|
||||
|
||||
void skip(usz extra)
|
||||
@@ -373,6 +388,8 @@ struct fmt::cfmt_src
|
||||
TYPE(short);
|
||||
if (std::is_signed<char>::value) TYPE(char);
|
||||
TYPE(long);
|
||||
TYPE(u128);
|
||||
TYPE(s128);
|
||||
|
||||
#undef TYPE
|
||||
|
||||
@@ -394,25 +411,28 @@ void fmt::raw_append(std::string& out, const char* fmt, const fmt_type_info* sup
|
||||
cfmt_append(out, fmt, cfmt_src{sup, args});
|
||||
}
|
||||
|
||||
std::string fmt::replace_first(const std::string& src, const std::string& from, const std::string& to)
|
||||
std::string fmt::replace_all(std::string_view src, std::string_view from, std::string_view to, usz count)
|
||||
{
|
||||
auto pos = src.find(from);
|
||||
std::string target;
|
||||
target.reserve(src.size() + to.size());
|
||||
|
||||
if (pos == umax)
|
||||
for (usz i = 0, replaced = 0; i < src.size();)
|
||||
{
|
||||
return src;
|
||||
}
|
||||
const usz pos = src.find(from, i);
|
||||
|
||||
return (pos ? src.substr(0, pos) + to : to) + std::string(src.c_str() + pos + from.length());
|
||||
}
|
||||
if (pos == umax || replaced++ >= count)
|
||||
{
|
||||
// No match or too many encountered, append the rest of the string as is
|
||||
target.append(src.substr(i));
|
||||
break;
|
||||
}
|
||||
|
||||
std::string fmt::replace_all(const std::string& src, const std::string& from, const std::string& to)
|
||||
{
|
||||
std::string target = src;
|
||||
for (auto pos = target.find(from); pos != umax; pos = target.find(from, pos + 1))
|
||||
{
|
||||
target = (pos ? target.substr(0, pos) + to : to) + std::string(target.c_str() + pos + from.length());
|
||||
pos += to.length();
|
||||
// Append source until the matched string position
|
||||
target.append(src.substr(i, pos - i));
|
||||
|
||||
// Replace string
|
||||
target.append(to);
|
||||
i = pos + from.size();
|
||||
}
|
||||
|
||||
return target;
|
||||
@@ -429,11 +449,10 @@ std::vector<std::string> fmt::split(std::string_view source, std::initializer_li
|
||||
|
||||
for (auto& separator : separators)
|
||||
{
|
||||
if (usz pos0 = source.find(separator, index); pos0 != umax)
|
||||
if (usz pos0 = source.find(separator, index); pos0 < pos)
|
||||
{
|
||||
pos = pos0;
|
||||
sep_size = separator.size();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -455,6 +474,11 @@ std::vector<std::string> fmt::split(std::string_view source, std::initializer_li
|
||||
result.emplace_back(std::string(piece));
|
||||
}
|
||||
|
||||
if (result.empty() && !is_skip_empty)
|
||||
{
|
||||
result.emplace_back();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
+1
-3
@@ -1,6 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
@@ -24,8 +23,7 @@ inline void strcpy_trunc(D& dst, const T& src)
|
||||
|
||||
namespace fmt
|
||||
{
|
||||
std::string replace_first(const std::string& src, const std::string& from, const std::string& to);
|
||||
std::string replace_all(const std::string& src, const std::string& from, const std::string& to);
|
||||
std::string replace_all(std::string_view src, std::string_view from, std::string_view to, usz count = -1);
|
||||
|
||||
template <usz list_size>
|
||||
std::string replace_all(std::string src, const std::pair<std::string, std::string> (&list)[list_size])
|
||||
|
||||
+101
-59
@@ -2,7 +2,6 @@
|
||||
#include "Emu/System.h"
|
||||
#include "Emu/Cell/SPUThread.h"
|
||||
#include "Emu/Cell/PPUThread.h"
|
||||
#include "Emu/Cell/RawSPUThread.h"
|
||||
#include "Emu/Cell/lv2/sys_mmapper.h"
|
||||
#include "Emu/Cell/lv2/sys_event.h"
|
||||
#include "Emu/RSX/RSXThread.h"
|
||||
@@ -10,6 +9,7 @@
|
||||
#include "Utilities/JIT.h"
|
||||
#include <thread>
|
||||
#include <sstream>
|
||||
#include <cfenv>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <Windows.h>
|
||||
@@ -94,7 +94,7 @@ thread_local bool g_tls_access_violation_recovered = false;
|
||||
extern thread_local std::string(*g_tls_log_prefix)();
|
||||
|
||||
// Report error and call std::abort(), defined in main.cpp
|
||||
[[noreturn]] void report_fatal_error(const std::string&);
|
||||
[[noreturn]] void report_fatal_error(std::string_view);
|
||||
|
||||
template <>
|
||||
void fmt_class_string<std::thread::id>::format(std::string& out, u64 arg)
|
||||
@@ -450,7 +450,7 @@ void decode_x64_reg_op(const u8* code, x64_op_t& out_op, x64_reg_t& out_reg, usz
|
||||
}
|
||||
case 0x7f:
|
||||
{
|
||||
if ((repe && !oso) || (!repe && oso)) // MOVDQU/MOVDQA xmm/m, xmm
|
||||
if (repe != oso) // MOVDQU/MOVDQA xmm/m, xmm
|
||||
{
|
||||
out_op = X64OP_STORE;
|
||||
out_reg = get_modRM_reg_xmm(code, rex);
|
||||
@@ -1261,7 +1261,9 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
|
||||
{
|
||||
if (op == X64OP_NONE)
|
||||
{
|
||||
sig_log.error("decode_x64_reg_op(%p): unsupported opcode: %s", code, *reinterpret_cast<const be_t<v128, 1>*>(code));
|
||||
be_t<v128> dump;
|
||||
std::memcpy(&dump, code, sizeof(dump));
|
||||
sig_log.error("decode_x64_reg_op(%p): unsupported opcode: %s", code, dump);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1407,9 +1409,9 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
|
||||
return false;
|
||||
}
|
||||
|
||||
if (area->flags & 0x100 || (is_writing && vm::check_addr(addr)))
|
||||
if (vm::reader_lock rlock; vm::check_addr(addr, 0))
|
||||
{
|
||||
// For 4kb pages or read only memory
|
||||
// For allocated memory with protection lower than required (such as protection::no or read-only while writing to it)
|
||||
utils::memory_protect(vm::base(addr & -0x1000), 0x1000, utils::protection::rw);
|
||||
return true;
|
||||
}
|
||||
@@ -1423,13 +1425,13 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
|
||||
vm::temporary_unlock(*cpu);
|
||||
u32 pf_port_id = 0;
|
||||
|
||||
if (auto pf_entries = g_fxo->get<page_fault_notification_entries>(); true)
|
||||
if (auto& pf_entries = g_fxo->get<page_fault_notification_entries>(); true)
|
||||
{
|
||||
if (auto mem = vm::get(vm::any, addr))
|
||||
{
|
||||
reader_lock lock(pf_entries->mutex);
|
||||
reader_lock lock(pf_entries.mutex);
|
||||
|
||||
for (const auto& entry : pf_entries->entries)
|
||||
for (const auto& entry : pf_entries.entries)
|
||||
{
|
||||
if (entry.start_addr == mem->addr)
|
||||
{
|
||||
@@ -1489,10 +1491,10 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
|
||||
// Now, place the page fault event onto table so that other functions [sys_mmapper_free_address and pagefault recovery funcs etc]
|
||||
// know that this thread is page faulted and where.
|
||||
|
||||
auto pf_events = g_fxo->get<page_fault_event_entries>();
|
||||
auto& pf_events = g_fxo->get<page_fault_event_entries>();
|
||||
{
|
||||
std::lock_guard pf_lock(pf_events->pf_mutex);
|
||||
pf_events->events.emplace(cpu, addr);
|
||||
std::lock_guard pf_lock(pf_events.pf_mutex);
|
||||
pf_events.events.emplace(cpu, addr);
|
||||
}
|
||||
|
||||
sig_log.warning("Page_fault %s location 0x%x because of %s memory", is_writing ? "writing" : "reading",
|
||||
@@ -1607,6 +1609,22 @@ bool handle_access_violation(u32 addr, bool is_writing, x64_context* context) no
|
||||
return true;
|
||||
}
|
||||
|
||||
static void append_thread_name(std::string& msg)
|
||||
{
|
||||
if (thread_ctrl::get_current())
|
||||
{
|
||||
fmt::append(msg, "Emu Thread Name: '%s'.\n", thread_ctrl::get_name());
|
||||
}
|
||||
else if (thread_ctrl::is_main())
|
||||
{
|
||||
fmt::append(msg, "Thread: Main Thread.\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
fmt::append(msg, "Thread id = %s.\n", std::this_thread::get_id());
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
static LONG exception_handler(PEXCEPTION_POINTERS pExp) noexcept
|
||||
@@ -1668,14 +1686,7 @@ static LONG exception_filter(PEXCEPTION_POINTERS pExp) noexcept
|
||||
}
|
||||
}
|
||||
|
||||
if (thread_ctrl::get_current())
|
||||
{
|
||||
fmt::append(msg, "Emu Thread Name: '%s'.\n", thread_ctrl::get_name());
|
||||
}
|
||||
|
||||
// TODO: Report full thread name if not an emu thread
|
||||
|
||||
fmt::append(msg, "Thread id = %s.\n", std::this_thread::get_id());
|
||||
append_thread_name(msg);
|
||||
|
||||
std::vector<HMODULE> modules;
|
||||
for (DWORD size = 256; modules.size() != size; size /= sizeof(HMODULE))
|
||||
@@ -1752,7 +1763,7 @@ const bool s_exception_handler_set = []() -> bool
|
||||
|
||||
#else
|
||||
|
||||
static void signal_handler(int sig, siginfo_t* info, void* uct) noexcept
|
||||
static void signal_handler(int /*sig*/, siginfo_t* info, void* uct) noexcept
|
||||
{
|
||||
x64_context* context = static_cast<ucontext_t*>(uct);
|
||||
|
||||
@@ -1793,19 +1804,11 @@ static void signal_handler(int sig, siginfo_t* info, void* uct) noexcept
|
||||
|
||||
std::string msg = fmt::format("Segfault %s location %p at %p.\n", cause, info->si_addr, RIP(context));
|
||||
|
||||
if (thread_ctrl::get_current())
|
||||
{
|
||||
fmt::append(msg, "Emu Thread Name: '%s'.\n", thread_ctrl::get_name());
|
||||
}
|
||||
|
||||
// TODO: Report full thread name if not an emu thread
|
||||
|
||||
fmt::append(msg, "Thread id = %s.\n", std::this_thread::get_id());
|
||||
append_thread_name(msg);
|
||||
|
||||
if (IsDebuggerPresent())
|
||||
{
|
||||
sys_log.fatal("\n%s", msg);
|
||||
std::fprintf(stderr, "%s\n", msg.c_str());
|
||||
|
||||
sys_log.notice("\n%s", dump_useful_thread_info());
|
||||
|
||||
@@ -2078,6 +2081,8 @@ thread_base::native_entry thread_base::finalize(u64 _self) noexcept
|
||||
|
||||
thread_ctrl::set_thread_affinity_mask(0);
|
||||
|
||||
std::fesetround(FE_TONEAREST);
|
||||
|
||||
static constexpr u64 s_stop_bit = 0x8000'0000'0000'0000ull;
|
||||
|
||||
static atomic_t<u64> s_pool_ctr = []
|
||||
@@ -2211,8 +2216,16 @@ thread_state thread_ctrl::state()
|
||||
{
|
||||
auto _this = g_tls_this_thread;
|
||||
|
||||
// Guard for recursive calls (TODO: may be more effective to reuse one of m_sync bits)
|
||||
static thread_local bool s_tls_exec = false;
|
||||
|
||||
// Drain execution queue
|
||||
_this->exec();
|
||||
if (!s_tls_exec)
|
||||
{
|
||||
s_tls_exec = true;
|
||||
_this->exec();
|
||||
s_tls_exec = false;
|
||||
}
|
||||
|
||||
return static_cast<thread_state>(_this->m_sync & 3);
|
||||
}
|
||||
@@ -2496,12 +2509,9 @@ void thread_base::exec()
|
||||
|
||||
sig_log.fatal("Thread terminated due to fatal error: %s", reason);
|
||||
|
||||
std::fprintf(stderr, "Thread '%s' terminated due to fatal error: %s\n", g_tls_log_prefix().c_str(), std::string(reason).c_str());
|
||||
|
||||
#ifdef _WIN32
|
||||
if (IsDebuggerPresent())
|
||||
{
|
||||
OutputDebugStringA(fmt::format("Thread '%s' terminated due to fatal error: %s\n", g_tls_log_prefix(), reason).c_str());
|
||||
__debugbreak();
|
||||
}
|
||||
#else
|
||||
@@ -2532,8 +2542,7 @@ void thread_base::exec()
|
||||
#endif
|
||||
}
|
||||
|
||||
// Assume main thread
|
||||
report_fatal_error(std::string(reason));
|
||||
report_fatal_error(reason);
|
||||
}
|
||||
|
||||
void thread_ctrl::detect_cpu_layout()
|
||||
@@ -2698,9 +2707,18 @@ u64 thread_ctrl::get_affinity_mask(thread_class group)
|
||||
break;
|
||||
case 16:
|
||||
// 1700, 1800, 2700, TR 1900X family
|
||||
ppu_mask = 0b1111111100000000;
|
||||
spu_mask = ppu_mask;
|
||||
rsx_mask = 0b0000000000111100;
|
||||
if (g_cfg.core.thread_scheduler == thread_scheduler_mode::alt)
|
||||
{
|
||||
ppu_mask = 0b0010000010000000;
|
||||
spu_mask = 0b0000101010101010;
|
||||
rsx_mask = 0b1000000000000000;
|
||||
}
|
||||
else
|
||||
{
|
||||
ppu_mask = 0b1111111100000000;
|
||||
spu_mask = ppu_mask;
|
||||
rsx_mask = 0b0000000000111100;
|
||||
}
|
||||
break;
|
||||
case 12:
|
||||
// 1600, 2600 family, Assign threads 3-12
|
||||
@@ -2728,17 +2746,39 @@ u64 thread_ctrl::get_affinity_mask(thread_class group)
|
||||
spu_mask = 0b000000111111000000000000;
|
||||
rsx_mask = 0b000000000000111111000000;
|
||||
break;
|
||||
default:
|
||||
if (thread_count >= 16)
|
||||
case 16:
|
||||
// 5800X
|
||||
if (g_cfg.core.thread_scheduler == thread_scheduler_mode::alt)
|
||||
{
|
||||
ppu_mask = 0b0000000011110000;
|
||||
spu_mask = 0b1111111100000000;
|
||||
rsx_mask = 0b0000000000001111;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Verified by more than one windows user on 16-thread CPU
|
||||
ppu_mask = spu_mask = rsx_mask = (0b10101010101010101010101010101010 & all_cores_mask);
|
||||
}
|
||||
break;
|
||||
case 12:
|
||||
// 5600X
|
||||
if (g_cfg.core.thread_scheduler == thread_scheduler_mode::alt)
|
||||
{
|
||||
ppu_mask = 0b000000001100;
|
||||
spu_mask = 0b111111110000;
|
||||
rsx_mask = 0b000000000011;
|
||||
}
|
||||
else
|
||||
{
|
||||
ppu_mask = spu_mask = rsx_mask = all_cores_mask;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (thread_count > 24)
|
||||
{
|
||||
ppu_mask = spu_mask = rsx_mask = (0b10101010101010101010101010101010 & all_cores_mask);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2763,23 +2803,8 @@ u64 thread_ctrl::get_affinity_mask(thread_class group)
|
||||
}
|
||||
case native_core_arrangement::intel_ht:
|
||||
{
|
||||
/* This has been disabled as it seems to degrade performance instead of improving it.
|
||||
if (thread_count <= 4)
|
||||
{
|
||||
//i3 or worse
|
||||
switch (group)
|
||||
{
|
||||
case thread_class::rsx:
|
||||
case thread_class::ppu:
|
||||
return (0b0101 & all_cores_mask);
|
||||
case thread_class::spu:
|
||||
return (0b1010 & all_cores_mask);
|
||||
case thread_class::general:
|
||||
return all_cores_mask;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if (thread_count >= 12 && g_cfg.core.thread_scheduler == thread_scheduler_mode::alt)
|
||||
return (0b10101010101010101010101010101010 & all_cores_mask); // Potentially improves performance by mimicking HT off
|
||||
return all_cores_mask;
|
||||
}
|
||||
}
|
||||
@@ -2959,9 +2984,12 @@ std::pair<void*, usz> thread_ctrl::get_thread_stack()
|
||||
void* saddr = 0;
|
||||
usz ssize = 0;
|
||||
pthread_attr_t attr;
|
||||
#ifdef __linux__
|
||||
#if defined(__linux__)
|
||||
pthread_getattr_np(pthread_self(), &attr);
|
||||
pthread_attr_getstack(&attr, &saddr, &ssize);
|
||||
#elif defined(__APPLE__)
|
||||
saddr = pthread_get_stackaddr_np(pthread_self());
|
||||
ssize = pthread_get_stacksize_np(pthread_self());
|
||||
#else
|
||||
pthread_attr_get_np(pthread_self(), &attr);
|
||||
pthread_attr_getstackaddr(&attr, &saddr);
|
||||
@@ -2970,3 +2998,17 @@ std::pair<void*, usz> thread_ctrl::get_thread_stack()
|
||||
#endif
|
||||
return {saddr, ssize};
|
||||
}
|
||||
|
||||
u64 thread_ctrl::get_tid()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return GetCurrentThreadId();
|
||||
#else
|
||||
return reinterpret_cast<u64>(pthread_self());
|
||||
#endif
|
||||
}
|
||||
|
||||
bool thread_ctrl::is_main()
|
||||
{
|
||||
return get_tid() == utils::main_tid;
|
||||
}
|
||||
|
||||
+104
-219
@@ -5,8 +5,6 @@
|
||||
#include "util/shared_ptr.hpp"
|
||||
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <string_view>
|
||||
|
||||
#include "mutex.h"
|
||||
#include "lockless.h"
|
||||
@@ -44,7 +42,7 @@ class named_thread;
|
||||
|
||||
class thread_base;
|
||||
|
||||
template <typename Ctx, typename X = void, typename... Args>
|
||||
template <typename Ctx, typename... Args>
|
||||
struct result_storage
|
||||
{
|
||||
static constexpr bool empty = true;
|
||||
@@ -52,8 +50,8 @@ struct result_storage
|
||||
using type = void;
|
||||
};
|
||||
|
||||
template <typename Ctx, typename... Args>
|
||||
struct result_storage<Ctx, std::enable_if_t<!std::is_void_v<std::invoke_result_t<Ctx, Args&&...>>>, Args...>
|
||||
template <typename Ctx, typename... Args> requires (!std::is_void_v<std::invoke_result_t<Ctx, Args&&...>>)
|
||||
struct result_storage<Ctx, Args...>
|
||||
{
|
||||
using T = std::invoke_result_t<Ctx, Args&&...>;
|
||||
|
||||
@@ -86,6 +84,12 @@ struct result_storage<Ctx, std::enable_if_t<!std::is_void_v<std::invoke_result_t
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
concept NamedThreadName = requires (T& t)
|
||||
{
|
||||
std::string_view(t.thread_name);
|
||||
};
|
||||
|
||||
// Base class for task queue (linked list)
|
||||
class thread_future
|
||||
{
|
||||
@@ -112,12 +116,6 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T, typename = void>
|
||||
struct thread_thread_name : std::bool_constant<false> {};
|
||||
|
||||
template <typename T>
|
||||
struct thread_thread_name<T, std::void_t<decltype(named_thread<T>::thread_name)>> : std::bool_constant<true> {};
|
||||
|
||||
// Thread base class
|
||||
class thread_base
|
||||
{
|
||||
@@ -339,11 +337,95 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
// Get thread ID (works for all threads)
|
||||
static u64 get_tid();
|
||||
|
||||
// Check whether current thread is main thread (usually Qt GUI)
|
||||
static bool is_main();
|
||||
|
||||
private:
|
||||
// Miscellaneous
|
||||
static const u64 process_affinity_mask;
|
||||
};
|
||||
|
||||
// Used internally
|
||||
template <bool Discard, typename Ctx, typename... Args>
|
||||
class thread_future_t : public thread_future, result_storage<Ctx, std::conditional_t<Discard, int, void>, Args...>
|
||||
{
|
||||
[[no_unique_address]] decltype(std::make_tuple(std::forward<Args>(std::declval<Args>())...)) m_args;
|
||||
|
||||
[[no_unique_address]] Ctx m_func;
|
||||
|
||||
using future = thread_future_t;
|
||||
|
||||
public:
|
||||
thread_future_t(Ctx&& func, Args&&... args)
|
||||
: m_args(std::forward<Args>(args)...)
|
||||
, m_func(std::forward<Ctx>(func))
|
||||
{
|
||||
thread_future::exec.raw() = +[](thread_base* tb, thread_future* tf)
|
||||
{
|
||||
const auto _this = static_cast<future*>(tf);
|
||||
|
||||
if (!tb) [[unlikely]]
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
_this->init();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if constexpr (future::empty || Discard)
|
||||
{
|
||||
std::apply(_this->m_func, std::move(_this->m_args));
|
||||
}
|
||||
else
|
||||
{
|
||||
new (_this->_get()) decltype(auto)(std::apply(_this->m_func, std::move(_this->m_args)));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
~thread_future_t()
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
if (!this->exec)
|
||||
{
|
||||
this->destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
decltype(auto) get()
|
||||
{
|
||||
while (this->exec)
|
||||
{
|
||||
this->wait();
|
||||
}
|
||||
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
return *this->_get();
|
||||
}
|
||||
}
|
||||
|
||||
decltype(auto) get() const
|
||||
{
|
||||
while (this->exec)
|
||||
{
|
||||
this->wait();
|
||||
}
|
||||
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
return *this->_get();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Derived from the callable object Context, possibly a lambda
|
||||
template <class Context>
|
||||
class named_thread final : public Context, result_storage<Context>, thread_base
|
||||
@@ -397,17 +479,17 @@ class named_thread final : public Context, result_storage<Context>, thread_base
|
||||
friend class thread_ctrl;
|
||||
|
||||
public:
|
||||
// Default constructor
|
||||
template <bool Valid = std::is_default_constructible_v<Context> && thread_thread_name<Context>(), typename = std::enable_if_t<Valid>>
|
||||
named_thread()
|
||||
: Context()
|
||||
// Forwarding constructor with default name (also potentially the default constructor)
|
||||
template <typename... Args> requires (std::is_constructible_v<Context, Args&&...>) && (NamedThreadName<Context>)
|
||||
named_thread(Args&&... args)
|
||||
: Context(std::forward<Args>(args)...)
|
||||
, thread(trampoline, Context::thread_name)
|
||||
{
|
||||
thread::start();
|
||||
}
|
||||
|
||||
// Normal forwarding constructor
|
||||
template <typename... Args, typename = std::enable_if_t<std::is_constructible_v<Context, Args&&...>>>
|
||||
template <typename... Args> requires (std::is_constructible_v<Context, Args&&...>) && (!NamedThreadName<Context>)
|
||||
named_thread(std::string_view name, Args&&... args)
|
||||
: Context(std::forward<Args>(args)...)
|
||||
, thread(trampoline, name)
|
||||
@@ -467,74 +549,9 @@ public:
|
||||
|
||||
if constexpr (v1)
|
||||
{
|
||||
class future : public thread_future, result_storage<Context, void, Arg, Args...>
|
||||
{
|
||||
// A tuple to store arguments
|
||||
decltype(std::make_tuple(std::forward<Arg, Args...>(arg, args...))) m_args;
|
||||
using future = thread_future_t<Discard, Context&, Arg, Args...>;
|
||||
|
||||
public:
|
||||
future(Arg&& arg, Args&&... args)
|
||||
: m_args(std::forward<Arg, Args...>(arg, args...))
|
||||
{
|
||||
thread_future::exec.raw() = +[](thread_base* tb, thread_future* tf)
|
||||
{
|
||||
const auto _this = static_cast<future*>(tf);
|
||||
|
||||
if (!tb) [[unlikely]]
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
_this->init();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if constexpr (future::empty || Discard)
|
||||
{
|
||||
std::apply(*static_cast<Context*>(static_cast<named_thread*>(tb)), _this->m_args);
|
||||
}
|
||||
else
|
||||
{
|
||||
new (_this->_get()) decltype(auto)(std::apply(*static_cast<Context*>(static_cast<named_thread*>(tb)), _this->m_args));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
future(const future&) = delete;
|
||||
|
||||
future& operator=(const future&) = delete;
|
||||
|
||||
~future()
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
// Should be set to null if executed
|
||||
if (!this->exec)
|
||||
{
|
||||
this->destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
decltype(auto) get()
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
return *this->_get();
|
||||
}
|
||||
}
|
||||
|
||||
decltype(auto) get() const
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
return *this->_get();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
single_ptr<future> target = make_single<future>(std::forward<Arg, Args...>(arg, args...));
|
||||
single_ptr<future> target = make_single<future>(*static_cast<Context*>(this), std::forward<Arg>(arg), std::forward<Args>(args)...);
|
||||
|
||||
if constexpr (!Discard)
|
||||
{
|
||||
@@ -553,75 +570,9 @@ public:
|
||||
}
|
||||
else if constexpr (v2)
|
||||
{
|
||||
class future : public thread_future, result_storage<std::decay_t<Arg>, void, Args...>
|
||||
{
|
||||
decltype(std::make_tuple(std::forward<Args...>(args...))) m_args;
|
||||
using future = thread_future_t<Discard, Arg, Args...>;
|
||||
|
||||
std::decay_t<Arg> m_func;
|
||||
|
||||
public:
|
||||
future(Arg func, Args&&... args)
|
||||
: m_args(std::forward<Args...>(args...))
|
||||
, m_func(func)
|
||||
{
|
||||
thread_future::exec.raw() = +[](thread_base* tb, thread_future* tf)
|
||||
{
|
||||
const auto _this = static_cast<future*>(tf);
|
||||
|
||||
if (!tb) [[unlikely]]
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
_this->init();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if constexpr (future::empty || Discard)
|
||||
{
|
||||
std::apply(_this->m_func, _this->m_args);
|
||||
}
|
||||
else
|
||||
{
|
||||
new (_this->_get()) decltype(auto)(std::apply(_this->m_func, _this->m_args));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
future(const future&) = delete;
|
||||
|
||||
future& operator=(const future&) = delete;
|
||||
|
||||
~future()
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
if (!this->exec)
|
||||
{
|
||||
this->destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
decltype(auto) get()
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
return *this->_get();
|
||||
}
|
||||
}
|
||||
|
||||
decltype(auto) get() const
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
return *this->_get();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
single_ptr<future> target = make_single<future>(std::forward<Arg, Args...>(arg, args...));
|
||||
single_ptr<future> target = make_single<future>(std::forward<Arg>(arg), std::forward<Args>(args)...);
|
||||
|
||||
if constexpr (!Discard)
|
||||
{
|
||||
@@ -637,75 +588,9 @@ public:
|
||||
}
|
||||
else if constexpr (v3)
|
||||
{
|
||||
class future : public thread_future, result_storage<std::decay_t<Arg>, void, Context&, Args...>
|
||||
{
|
||||
decltype(std::make_tuple(std::forward<Args...>(args...))) m_args;
|
||||
using future = thread_future_t<Discard, Arg, Context&, Args...>;
|
||||
|
||||
std::decay_t<Arg> m_func;
|
||||
|
||||
public:
|
||||
future(Arg func, Args&&... args)
|
||||
: m_args(std::forward<Args...>(args...))
|
||||
, m_func(func)
|
||||
{
|
||||
thread_future::exec.raw() = +[](thread_base* tb, thread_future* tf)
|
||||
{
|
||||
const auto _this = static_cast<future*>(tf);
|
||||
|
||||
if (!tb) [[unlikely]]
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
_this->init();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if constexpr (future::empty || Discard)
|
||||
{
|
||||
std::apply(_this->m_func, *static_cast<Context*>(static_cast<named_thread*>(tb)), _this->m_args);
|
||||
}
|
||||
else
|
||||
{
|
||||
new (_this->_get()) decltype(auto)(std::apply(_this->m_func, *static_cast<Context*>(static_cast<named_thread*>(tb)), _this->m_args));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
future(const future&) = delete;
|
||||
|
||||
future& operator=(const future&) = delete;
|
||||
|
||||
~future()
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
if (!this->exec)
|
||||
{
|
||||
this->destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
decltype(auto) get()
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
return *this->_get();
|
||||
}
|
||||
}
|
||||
|
||||
decltype(auto) get() const
|
||||
{
|
||||
if constexpr (!future::empty && !Discard)
|
||||
{
|
||||
return *this->_get();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
single_ptr<future> target = make_single<future>(std::forward<Arg, Args...>(arg, args...));
|
||||
single_ptr<future> target = make_single<future>(std::forward<Arg>(arg), std::ref(*static_cast<Context*>(this)), std::forward<Args>(args)...);
|
||||
|
||||
if constexpr (!Discard)
|
||||
{
|
||||
|
||||
+6
-6
@@ -30,31 +30,31 @@ public:
|
||||
|
||||
double GetElapsedTimeInSec() const
|
||||
{
|
||||
return double(GetElapsedTimeInMicroSec()) / 1000000.0;
|
||||
return static_cast<double>(GetElapsedTimeInMicroSec()) / 1000000.0;
|
||||
}
|
||||
|
||||
double GetElapsedTimeInMilliSec() const
|
||||
{
|
||||
return double(GetElapsedTimeInMicroSec()) / 1000.0;
|
||||
return static_cast<double>(GetElapsedTimeInMicroSec()) / 1000.0;
|
||||
}
|
||||
|
||||
u64 GetElapsedTimeInMicroSec() const
|
||||
{
|
||||
steady_clock::time_point now = m_stopped ? m_end : steady_clock::now();
|
||||
const steady_clock::time_point now = m_stopped ? m_end : steady_clock::now();
|
||||
|
||||
return std::chrono::duration_cast<std::chrono::microseconds>(now - m_start).count();
|
||||
}
|
||||
|
||||
u64 GetElapsedTimeInNanoSec() const
|
||||
{
|
||||
steady_clock::time_point now = m_stopped ? m_end : steady_clock::now();
|
||||
const steady_clock::time_point now = m_stopped ? m_end : steady_clock::now();
|
||||
|
||||
return std::chrono::duration_cast<std::chrono::nanoseconds>(now - m_start).count();
|
||||
}
|
||||
|
||||
u64 GetMsSince(steady_clock::time_point timestamp)
|
||||
u64 GetMsSince(steady_clock::time_point timestamp) const
|
||||
{
|
||||
steady_clock::time_point now = m_stopped ? m_end : steady_clock::now();
|
||||
const steady_clock::time_point now = m_stopped ? m_end : steady_clock::now();
|
||||
|
||||
return std::chrono::duration_cast<std::chrono::milliseconds>(now - timestamp).count();
|
||||
}
|
||||
|
||||
+16
-49
@@ -3,6 +3,7 @@
|
||||
#include "util/types.hpp"
|
||||
#include "StrFmt.h"
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
|
||||
namespace utils
|
||||
@@ -65,7 +66,6 @@ namespace utils
|
||||
public:
|
||||
// Constructors
|
||||
constexpr address_range() = default;
|
||||
constexpr address_range(const address_range &other) : start(other.start), end(other.end) {}
|
||||
|
||||
static constexpr address_range start_length(u32 _start, u32 _length)
|
||||
{
|
||||
@@ -239,16 +239,11 @@ namespace utils
|
||||
}
|
||||
|
||||
// Comparison Operators
|
||||
bool operator ==(const address_range &other) const
|
||||
bool operator ==(const address_range& other) const
|
||||
{
|
||||
return (start == other.start && end == other.end);
|
||||
}
|
||||
|
||||
bool operator !=(const address_range &other) const
|
||||
{
|
||||
return (start != other.start || end != other.end);
|
||||
}
|
||||
|
||||
/**
|
||||
* Debug
|
||||
*/
|
||||
@@ -272,10 +267,10 @@ namespace utils
|
||||
class address_range_vector
|
||||
{
|
||||
public:
|
||||
using vector_type = typename std::vector<address_range>;
|
||||
using iterator = typename vector_type::iterator;
|
||||
using const_iterator = typename vector_type::const_iterator;
|
||||
using size_type = typename vector_type::size_type;
|
||||
using vector_type = std::vector<address_range>;
|
||||
using iterator = vector_type::iterator;
|
||||
using const_iterator = vector_type::const_iterator;
|
||||
using size_type = vector_type::size_type;
|
||||
|
||||
private:
|
||||
vector_type data;
|
||||
@@ -456,7 +451,7 @@ namespace utils
|
||||
// Will fail if ranges within the vector overlap our touch each-other
|
||||
bool check_consistency() const
|
||||
{
|
||||
usz _size = data.size();
|
||||
const usz _size = data.size();
|
||||
|
||||
for (usz i = 0; i < _size; ++i)
|
||||
{
|
||||
@@ -486,20 +481,10 @@ namespace utils
|
||||
// Test for overlap with a given range
|
||||
bool overlaps(const address_range &range) const
|
||||
{
|
||||
for (const address_range ¤t : data)
|
||||
return std::any_of(data.cbegin(), data.cend(), [&range](const address_range& cur)
|
||||
{
|
||||
if (!current.valid())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (current.overlaps(range))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return cur.valid() && cur.overlaps(range);
|
||||
});
|
||||
}
|
||||
|
||||
// Test for overlap with a given address_range vector
|
||||
@@ -531,37 +516,19 @@ namespace utils
|
||||
// Test if a given range is fully contained inside this vector
|
||||
bool contains(const address_range &range) const
|
||||
{
|
||||
for (const address_range &cur : *this)
|
||||
return std::any_of(this->begin(), this->end(), [&range](const address_range& cur)
|
||||
{
|
||||
if (!cur.valid())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (range.inside(cur))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return cur.valid() && cur.inside(range);
|
||||
});
|
||||
}
|
||||
|
||||
// Test if all ranges in this vector are full contained inside a specific range
|
||||
bool inside(const address_range &range) const
|
||||
{
|
||||
for (const address_range &cur : *this)
|
||||
return std::all_of(this->begin(), this->end(), [&range](const address_range& cur)
|
||||
{
|
||||
if (!cur.valid())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!cur.inside(range))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return !cur.valid() || cur.inside(range);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
+30
-17
@@ -530,7 +530,7 @@ static std::basic_string<u32> apply_modification(const patch_engine::patch_info&
|
||||
|
||||
auto ptr = dst + offset;
|
||||
|
||||
u32 resval = -1;
|
||||
u32 resval = umax;
|
||||
|
||||
switch (p.type)
|
||||
{
|
||||
@@ -547,58 +547,70 @@ static std::basic_string<u32> apply_modification(const patch_engine::patch_info&
|
||||
}
|
||||
case patch_type::le16:
|
||||
{
|
||||
*reinterpret_cast<le_t<u16, 1>*>(ptr) = static_cast<u16>(p.value.long_value);
|
||||
le_t<u16> val = static_cast<u16>(p.value.long_value);
|
||||
std::memcpy(ptr, &val, sizeof(val));
|
||||
break;
|
||||
}
|
||||
case patch_type::le32:
|
||||
{
|
||||
*reinterpret_cast<le_t<u32, 1>*>(ptr) = static_cast<u32>(p.value.long_value);
|
||||
le_t<u32> val = static_cast<u32>(p.value.long_value);
|
||||
std::memcpy(ptr, &val, sizeof(val));
|
||||
break;
|
||||
}
|
||||
case patch_type::lef32:
|
||||
{
|
||||
*reinterpret_cast<le_t<u32, 1>*>(ptr) = std::bit_cast<u32, f32>(static_cast<f32>(p.value.double_value));
|
||||
le_t<f32> val = static_cast<f32>(p.value.double_value);
|
||||
std::memcpy(ptr, &val, sizeof(val));
|
||||
break;
|
||||
}
|
||||
case patch_type::le64:
|
||||
{
|
||||
*reinterpret_cast<le_t<u64, 1>*>(ptr) = static_cast<u64>(p.value.long_value);
|
||||
le_t<u64> val = static_cast<u64>(p.value.long_value);
|
||||
std::memcpy(ptr, &val, sizeof(val));
|
||||
break;
|
||||
}
|
||||
case patch_type::lef64:
|
||||
{
|
||||
*reinterpret_cast<le_t<u64, 1>*>(ptr) = std::bit_cast<u64, f64>(p.value.double_value);
|
||||
le_t<f64> val = p.value.double_value;
|
||||
std::memcpy(ptr, &val, sizeof(val));
|
||||
break;
|
||||
}
|
||||
case patch_type::be16:
|
||||
{
|
||||
*reinterpret_cast<be_t<u16, 1>*>(ptr) = static_cast<u16>(p.value.long_value);
|
||||
be_t<u16> val = static_cast<u16>(p.value.long_value);
|
||||
std::memcpy(ptr, &val, sizeof(val));
|
||||
break;
|
||||
}
|
||||
case patch_type::bd32:
|
||||
{
|
||||
*reinterpret_cast<be_t<u32, 1>*>(ptr) = static_cast<u32>(p.value.long_value);
|
||||
be_t<u32> val = static_cast<u32>(p.value.long_value);
|
||||
std::memcpy(ptr, &val, sizeof(val));
|
||||
break;
|
||||
}
|
||||
case patch_type::be32:
|
||||
{
|
||||
*reinterpret_cast<be_t<u32, 1>*>(ptr) = static_cast<u32>(p.value.long_value);
|
||||
if (offset % 4 == 0) resval = offset;
|
||||
be_t<u32> val = static_cast<u32>(p.value.long_value);
|
||||
std::memcpy(ptr, &val, sizeof(val));
|
||||
if (offset % 4 == 0)
|
||||
resval = offset;
|
||||
break;
|
||||
}
|
||||
case patch_type::bef32:
|
||||
{
|
||||
*reinterpret_cast<be_t<u32, 1>*>(ptr) = std::bit_cast<u32, f32>(static_cast<f32>(p.value.double_value));
|
||||
be_t<f32> val = static_cast<f32>(p.value.double_value);
|
||||
std::memcpy(ptr, &val, sizeof(val));
|
||||
break;
|
||||
}
|
||||
case patch_type::bd64:
|
||||
{
|
||||
*reinterpret_cast<be_t<u64, 1>*>(ptr) = static_cast<u64>(p.value.long_value);
|
||||
be_t<u64> val = static_cast<u64>(p.value.long_value);
|
||||
std::memcpy(ptr, &val, sizeof(val));
|
||||
break;
|
||||
}
|
||||
case patch_type::be64:
|
||||
{
|
||||
*reinterpret_cast<be_t<u64, 1>*>(ptr) = static_cast<u64>(p.value.long_value);
|
||||
be_t<u64> val = static_cast<u64>(p.value.long_value);
|
||||
std::memcpy(ptr, &val, sizeof(val));
|
||||
|
||||
if (offset % 4)
|
||||
{
|
||||
@@ -611,7 +623,8 @@ static std::basic_string<u32> apply_modification(const patch_engine::patch_info&
|
||||
}
|
||||
case patch_type::bef64:
|
||||
{
|
||||
*reinterpret_cast<be_t<u64, 1>*>(ptr) = std::bit_cast<u64, f64>(p.value.double_value);
|
||||
be_t<f64> val = p.value.double_value;
|
||||
std::memcpy(ptr, &val, sizeof(val));
|
||||
break;
|
||||
}
|
||||
case patch_type::utf8:
|
||||
@@ -637,8 +650,8 @@ std::basic_string<u32> patch_engine::apply(const std::string& name, u8* dst, u32
|
||||
|
||||
std::basic_string<u32> applied_total;
|
||||
const auto& container = m_map.at(name);
|
||||
const auto serial = Emu.GetTitleID();
|
||||
const auto app_version = Emu.GetAppVersion();
|
||||
const auto& serial = Emu.GetTitleID();
|
||||
const auto& app_version = Emu.GetAppVersion();
|
||||
|
||||
// Different containers in order to seperate the patches
|
||||
std::vector<patch_engine::patch_info> patches_for_this_serial_and_this_version;
|
||||
@@ -780,7 +793,7 @@ void patch_engine::save_config(const patch_map& patches_map)
|
||||
}
|
||||
}
|
||||
|
||||
if (const auto& enabled_patches = config_map[hash].patch_info_map; enabled_patches.size() > 0)
|
||||
if (const auto& enabled_patches = config_map[hash].patch_info_map; !enabled_patches.empty())
|
||||
{
|
||||
out << hash << YAML::BeginMap;
|
||||
|
||||
|
||||
+22
-18
@@ -20,7 +20,7 @@ namespace patch_key
|
||||
static const std::string version = "Version";
|
||||
}
|
||||
|
||||
static const std::string patch_engine_version = "1.2";
|
||||
inline static const std::string patch_engine_version = "1.2";
|
||||
|
||||
enum class patch_type
|
||||
{
|
||||
@@ -49,12 +49,12 @@ public:
|
||||
{
|
||||
patch_type type = patch_type::load;
|
||||
u32 offset = 0;
|
||||
std::string original_value; // Used for import consistency (avoid rounding etc.)
|
||||
std::string original_value{}; // Used for import consistency (avoid rounding etc.)
|
||||
union
|
||||
{
|
||||
u64 long_value;
|
||||
f64 double_value;
|
||||
} value { 0 };
|
||||
} value{0};
|
||||
};
|
||||
|
||||
using patch_app_versions = std::unordered_map<std::string /*app_version*/, bool /*enabled*/>;
|
||||
@@ -64,31 +64,35 @@ public:
|
||||
struct patch_info
|
||||
{
|
||||
// Patch information
|
||||
std::vector<patch_data> data_list;
|
||||
patch_titles titles;
|
||||
std::string description;
|
||||
std::string patch_version;
|
||||
std::string patch_group;
|
||||
std::string author;
|
||||
std::string notes;
|
||||
std::string source_path;
|
||||
std::vector<patch_data> data_list{};
|
||||
patch_titles titles{};
|
||||
std::string description{};
|
||||
std::string patch_version{};
|
||||
std::string patch_group{};
|
||||
std::string author{};
|
||||
std::string notes{};
|
||||
std::string source_path{};
|
||||
|
||||
// Redundant information for accessibility (see patch_container)
|
||||
std::string hash;
|
||||
std::string version;
|
||||
std::string hash{};
|
||||
std::string version{};
|
||||
};
|
||||
|
||||
struct patch_container
|
||||
{
|
||||
std::unordered_map<std::string /*description*/, patch_info> patch_info_map;
|
||||
std::string hash;
|
||||
std::string version;
|
||||
std::unordered_map<std::string /*description*/, patch_info> patch_info_map{};
|
||||
std::string hash{};
|
||||
std::string version{};
|
||||
};
|
||||
|
||||
using patch_map = std::unordered_map<std::string /*hash*/, patch_container>;
|
||||
|
||||
patch_engine();
|
||||
|
||||
patch_engine(const patch_engine&) = delete;
|
||||
|
||||
patch_engine& operator=(const patch_engine&) = delete;
|
||||
|
||||
// Returns the directory in which patch_config.yml is located
|
||||
static std::string get_patch_config_path();
|
||||
|
||||
@@ -136,8 +140,8 @@ public:
|
||||
|
||||
private:
|
||||
// Database
|
||||
patch_map m_map;
|
||||
patch_map m_map{};
|
||||
|
||||
// Only one patch per patch group can be applied
|
||||
std::set<std::string> m_applied_groups;
|
||||
std::set<std::string> m_applied_groups{};
|
||||
};
|
||||
|
||||
+56
-94
@@ -26,10 +26,16 @@ Intersection (&) and symmetric difference (^) is also available.
|
||||
#include "Utilities/StrFmt.h"
|
||||
|
||||
template <typename T>
|
||||
concept BitSetEnum = std::is_enum_v<T> && requires(T x)
|
||||
{
|
||||
T::__bitset_enum_max;
|
||||
};
|
||||
|
||||
template <BitSetEnum T>
|
||||
class atomic_bs_t;
|
||||
|
||||
// Bitset type for enum class with available bits [0, T::__bitset_enum_max)
|
||||
template <typename T>
|
||||
template <BitSetEnum T>
|
||||
class bs_t final
|
||||
{
|
||||
public:
|
||||
@@ -112,24 +118,24 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
constexpr bs_t operator +(bs_t rhs) const
|
||||
friend constexpr bs_t operator +(bs_t lhs, bs_t rhs)
|
||||
{
|
||||
return bs_t(0, m_data | rhs.m_data);
|
||||
return bs_t(0, lhs.m_data | rhs.m_data);
|
||||
}
|
||||
|
||||
constexpr bs_t operator -(bs_t rhs) const
|
||||
friend constexpr bs_t operator -(bs_t lhs, bs_t rhs)
|
||||
{
|
||||
return bs_t(0, m_data & ~rhs.m_data);
|
||||
return bs_t(0, lhs.m_data & ~rhs.m_data);
|
||||
}
|
||||
|
||||
constexpr bs_t operator &(bs_t rhs) const
|
||||
friend constexpr bs_t operator &(bs_t lhs, bs_t rhs)
|
||||
{
|
||||
return bs_t(0, m_data & rhs.m_data);
|
||||
return bs_t(0, lhs.m_data & rhs.m_data);
|
||||
}
|
||||
|
||||
constexpr bs_t operator ^(bs_t rhs) const
|
||||
friend constexpr bs_t operator ^(bs_t lhs, bs_t rhs)
|
||||
{
|
||||
return bs_t(0, m_data ^ rhs.m_data);
|
||||
return bs_t(0, lhs.m_data ^ rhs.m_data);
|
||||
}
|
||||
|
||||
constexpr bool operator ==(bs_t rhs) const
|
||||
@@ -137,16 +143,6 @@ public:
|
||||
return m_data == rhs.m_data;
|
||||
}
|
||||
|
||||
constexpr bool operator !=(bs_t rhs) const
|
||||
{
|
||||
return m_data != rhs.m_data;
|
||||
}
|
||||
|
||||
constexpr bool test(bs_t rhs) const
|
||||
{
|
||||
return (m_data & rhs.m_data) != 0;
|
||||
}
|
||||
|
||||
constexpr bool test_and_set(T bit)
|
||||
{
|
||||
bool r = (m_data & shift(bit)) != 0;
|
||||
@@ -170,42 +166,70 @@ public:
|
||||
};
|
||||
|
||||
// Unary '+' operator: promote plain enum value to bitset value
|
||||
template <typename T, typename = decltype(T::__bitset_enum_max)>
|
||||
template <BitSetEnum T>
|
||||
constexpr bs_t<T> operator +(T bit)
|
||||
{
|
||||
return bit;
|
||||
return bs_t<T>(bit);
|
||||
}
|
||||
|
||||
// Binary '+' operator: bitset union
|
||||
template <typename T, typename = decltype(T::__bitset_enum_max)>
|
||||
constexpr bs_t<T> operator +(T lhs, T rhs)
|
||||
template <BitSetEnum T, typename U> requires (std::is_constructible_v<bs_t<T>, U>)
|
||||
constexpr bs_t<T> operator +(T lhs, const U& rhs)
|
||||
{
|
||||
return bs_t<T>(lhs) + bs_t<T>(rhs);
|
||||
}
|
||||
|
||||
// Binary '+' operator: bitset union
|
||||
template <typename U, BitSetEnum T> requires (std::is_constructible_v<bs_t<T>, U> && !std::is_enum_v<U>)
|
||||
constexpr bs_t<T> operator +(const U& lhs, T rhs)
|
||||
{
|
||||
return bs_t<T>(lhs) + bs_t<T>(rhs);
|
||||
}
|
||||
|
||||
// Binary '-' operator: bitset difference
|
||||
template <typename T, typename = decltype(T::__bitset_enum_max)>
|
||||
constexpr bs_t<T> operator -(T lhs, T rhs)
|
||||
template <BitSetEnum T, typename U> requires (std::is_constructible_v<bs_t<T>, U>)
|
||||
constexpr bs_t<T> operator -(T lhs, const U& rhs)
|
||||
{
|
||||
return bs_t<T>(lhs) - bs_t<T>(rhs);
|
||||
}
|
||||
|
||||
// Binary '-' operator: bitset difference
|
||||
template <typename U, BitSetEnum T> requires (std::is_constructible_v<bs_t<T>, U> && !std::is_enum_v<U>)
|
||||
constexpr bs_t<T> operator -(const U& lhs, T rhs)
|
||||
{
|
||||
return bs_t<T>(lhs) - bs_t<T>(rhs);
|
||||
}
|
||||
|
||||
// Binary '&' operator: bitset intersection
|
||||
template <typename T, typename = decltype(T::__bitset_enum_max)>
|
||||
constexpr bs_t<T> operator &(T lhs, T rhs)
|
||||
template <BitSetEnum T, typename U> requires (std::is_constructible_v<bs_t<T>, U>)
|
||||
constexpr bs_t<T> operator &(T lhs, const U& rhs)
|
||||
{
|
||||
return bs_t<T>(lhs) & bs_t<T>(rhs);
|
||||
}
|
||||
|
||||
// Binary '&' operator: bitset intersection
|
||||
template <typename U, BitSetEnum T> requires (std::is_constructible_v<bs_t<T>, U> && !std::is_enum_v<U>)
|
||||
constexpr bs_t<T> operator &(const U& lhs, T rhs)
|
||||
{
|
||||
return bs_t<T>(lhs) & bs_t<T>(rhs);
|
||||
}
|
||||
|
||||
// Binary '^' operator: bitset symmetric difference
|
||||
template <typename T, typename = decltype(T::__bitset_enum_max)>
|
||||
constexpr bs_t<T> operator ^(T lhs, T rhs)
|
||||
template <BitSetEnum T, typename U> requires (std::is_constructible_v<bs_t<T>, U>)
|
||||
constexpr bs_t<T> operator ^(T lhs, const U& rhs)
|
||||
{
|
||||
return bs_t<T>(lhs) ^ bs_t<T>(rhs);
|
||||
}
|
||||
|
||||
// Binary '^' operator: bitset symmetric difference
|
||||
template <typename U, BitSetEnum T> requires (std::is_constructible_v<bs_t<T>, U> && !std::is_enum_v<U>)
|
||||
constexpr bs_t<T> operator ^(const U& lhs, T rhs)
|
||||
{
|
||||
return bs_t<T>(lhs) ^ bs_t<T>(rhs);
|
||||
}
|
||||
|
||||
// Atomic bitset specialization with optimized operations
|
||||
template <typename T>
|
||||
template <BitSetEnum T>
|
||||
class atomic_bs_t : public atomic_t<::bs_t<T>>
|
||||
{
|
||||
// Corresponding bitset type
|
||||
@@ -237,6 +261,8 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
using base::operator bs_t;
|
||||
|
||||
explicit operator bool() const
|
||||
{
|
||||
return static_cast<bool>(base::load());
|
||||
@@ -315,70 +341,6 @@ public:
|
||||
auto fetch_or(const bs_t&) = delete;
|
||||
auto or_fetch(const bs_t&) = delete;
|
||||
auto operator |=(const bs_t&) = delete;
|
||||
auto operator ++() = delete;
|
||||
auto operator --() = delete;
|
||||
auto operator ++(int) = delete;
|
||||
auto operator --(int) = delete;
|
||||
|
||||
bs_t operator +(bs_t rhs) const
|
||||
{
|
||||
return bs_t(0, base::load().m_data | rhs.m_data);
|
||||
}
|
||||
|
||||
bs_t operator -(bs_t rhs) const
|
||||
{
|
||||
return bs_t(0, base::load().m_data & ~rhs.m_data);
|
||||
}
|
||||
|
||||
bs_t operator &(bs_t rhs) const
|
||||
{
|
||||
return bs_t(0, base::load().m_data & rhs.m_data);
|
||||
}
|
||||
|
||||
bs_t operator ^(bs_t rhs) const
|
||||
{
|
||||
return bs_t(0, base::load().m_data ^ rhs.m_data);
|
||||
}
|
||||
|
||||
bs_t operator ==(bs_t rhs) const
|
||||
{
|
||||
return base::load().m_data == rhs.m_data;
|
||||
}
|
||||
|
||||
bs_t operator !=(bs_t rhs) const
|
||||
{
|
||||
return base::load().m_data != rhs.m_data;
|
||||
}
|
||||
|
||||
friend bs_t operator +(bs_t lhs, const atomic_bs_t& rhs)
|
||||
{
|
||||
return bs_t(0, lhs.m_data | rhs.load().m_data);
|
||||
}
|
||||
|
||||
friend bs_t operator -(bs_t lhs, const atomic_bs_t& rhs)
|
||||
{
|
||||
return bs_t(0, lhs.m_data & ~rhs.load().m_data);
|
||||
}
|
||||
|
||||
friend bs_t operator &(bs_t lhs, const atomic_bs_t& rhs)
|
||||
{
|
||||
return bs_t(0, lhs.m_data & rhs.load().m_data);
|
||||
}
|
||||
|
||||
friend bs_t operator ^(bs_t lhs, const atomic_bs_t& rhs)
|
||||
{
|
||||
return bs_t(0, lhs.m_data ^ rhs.load().m_data);
|
||||
}
|
||||
|
||||
friend bs_t operator ==(bs_t lhs, const atomic_bs_t& rhs)
|
||||
{
|
||||
return lhs.m_data == rhs.load().m_data;
|
||||
}
|
||||
|
||||
friend bs_t operator !=(bs_t lhs, const atomic_bs_t& rhs)
|
||||
{
|
||||
return lhs.m_data != rhs.load().m_data;
|
||||
}
|
||||
|
||||
bool test_and_set(T rhs)
|
||||
{
|
||||
|
||||
+88
-26
@@ -5,8 +5,7 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
static const usz size_dropped = -1;
|
||||
#include "util/asm.hpp"
|
||||
|
||||
/*
|
||||
C-style format parser. Appends formatted string to `out`, returns number of characters written.
|
||||
@@ -42,7 +41,7 @@ usz cfmt_append(Dst& out, const Char* fmt, Src&& src)
|
||||
const auto drop_sequence = [&]
|
||||
{
|
||||
out.insert(out.end(), fmt - ctx.size, fmt);
|
||||
ctx.size = size_dropped;
|
||||
ctx.size = umax;
|
||||
};
|
||||
|
||||
const auto read_decimal = [&](uint result) -> uint
|
||||
@@ -56,36 +55,65 @@ usz cfmt_append(Dst& out, const Char* fmt, Src&& src)
|
||||
return result;
|
||||
};
|
||||
|
||||
const auto write_octal = [&](u64 value, u64 min_num)
|
||||
const auto write_octal = [&](auto value, u64 min_num)
|
||||
{
|
||||
out.resize(out.size() + std::max<u64>(min_num, 66 / 3 - (std::countl_zero<u64>(value | 1) + 2) / 3), '0');
|
||||
if constexpr (sizeof(value) == 16)
|
||||
{
|
||||
out.resize(out.size() + std::max<u64>(min_num, 129 / 3 - (utils::clz128(value | 1) + 1) / 3), '0');
|
||||
}
|
||||
else
|
||||
{
|
||||
out.resize(out.size() + std::max<u64>(min_num, 66 / 3 - (std::countl_zero<u64>(value | 1) + 2) / 3), '0');
|
||||
}
|
||||
|
||||
// Write in reversed order
|
||||
for (auto i = out.rbegin(); value; i++, value /= 8)
|
||||
for (auto i = out.rbegin(); value; i++, value >>= 3)
|
||||
{
|
||||
*i = value % 8 + '0';
|
||||
*i = static_cast<char>(static_cast<u64>(value) & 7) + '0';
|
||||
}
|
||||
};
|
||||
|
||||
const auto write_hex = [&](u64 value, bool upper, u64 min_num)
|
||||
const auto write_hex = [&](auto value, bool upper, u64 min_num)
|
||||
{
|
||||
out.resize(out.size() + std::max<u64>(min_num, 64 / 4 - std::countl_zero<u64>(value | 1) / 4), '0');
|
||||
if constexpr (sizeof(value) == 16)
|
||||
{
|
||||
out.resize(out.size() + std::max<u64>(min_num, 128 / 4 - utils::clz128(value | 1) / 4), '0');
|
||||
}
|
||||
else
|
||||
{
|
||||
out.resize(out.size() + std::max<u64>(min_num, 64 / 4 - std::countl_zero<u64>(value | 1) / 4), '0');
|
||||
}
|
||||
|
||||
// Write in reversed order
|
||||
for (auto i = out.rbegin(); value; i++, value /= 16)
|
||||
for (auto i = out.rbegin(); value; i++, value >>= 4)
|
||||
{
|
||||
*i = (upper ? "0123456789ABCDEF" : "0123456789abcdef")[value % 16];
|
||||
*i = (upper ? "0123456789ABCDEF" : "0123456789abcdef")[static_cast<usz>(value & 0xf)];
|
||||
}
|
||||
};
|
||||
|
||||
const auto write_decimal = [&](u64 value, s64 min_size)
|
||||
const auto write_decimal = [&](auto value, s64 min_size)
|
||||
{
|
||||
const usz start = out.size();
|
||||
|
||||
do
|
||||
{
|
||||
out.push_back(value % 10 + '0');
|
||||
value /= 10;
|
||||
if constexpr (sizeof(value) == 16)
|
||||
{
|
||||
const u128 v0 = value;
|
||||
value >>= 1;
|
||||
constexpr u128 by_five = 0x3333'3333'3333'3333;
|
||||
const u128 v1 = (value >> 64) * by_five;
|
||||
const u128 v2 = ((value >> 64) * by_five) >> 64;
|
||||
const u128 v3 = (static_cast<u64>(value) * by_five) >> 64;
|
||||
value = v1 + v2 + v3;
|
||||
|
||||
out.push_back(static_cast<char>(static_cast<u64>(v0 - (value * 10))) + '0');
|
||||
}
|
||||
else
|
||||
{
|
||||
out.push_back(value % 10 + '0');
|
||||
value /= 10;
|
||||
}
|
||||
}
|
||||
while (0 < --min_size || value);
|
||||
|
||||
@@ -113,7 +141,7 @@ usz cfmt_append(Dst& out, const Char* fmt, Src&& src)
|
||||
ctx = {0};
|
||||
out.push_back(ch);
|
||||
}
|
||||
else if (ctx.size == size_dropped)
|
||||
else if (ctx.size == umax)
|
||||
{
|
||||
out.push_back(ch);
|
||||
}
|
||||
@@ -369,7 +397,16 @@ usz cfmt_append(Dst& out, const Char* fmt, Src&& src)
|
||||
out.push_back(' ');
|
||||
}
|
||||
|
||||
write_decimal(negative ? 0 - val : val, ctx.prec);
|
||||
if (ctx.type == 16)
|
||||
{
|
||||
// TODO: support negative values (s128)
|
||||
u128 val2 = *reinterpret_cast<u128*>(val);
|
||||
write_decimal(val2, ctx.prec);
|
||||
}
|
||||
else
|
||||
{
|
||||
write_decimal(negative ? 0 - val : val, ctx.prec);
|
||||
}
|
||||
}
|
||||
|
||||
const usz size2 = out.size() - start;
|
||||
@@ -425,14 +462,23 @@ usz cfmt_append(Dst& out, const Char* fmt, Src&& src)
|
||||
{
|
||||
out.push_back('0');
|
||||
|
||||
if (val)
|
||||
if (ctx.prec)
|
||||
{
|
||||
write_octal(val, ctx.prec ? ctx.prec - 1 : 0);
|
||||
ctx.prec--;
|
||||
}
|
||||
}
|
||||
else if (!ctx.dot || ctx.prec)
|
||||
|
||||
if ((ctx.alter && val) || !ctx.dot || ctx.prec)
|
||||
{
|
||||
write_octal(val, ctx.prec);
|
||||
if (ctx.type == 16)
|
||||
{
|
||||
u128 val2 = *reinterpret_cast<u128*>(val);
|
||||
write_octal(val2, ctx.prec);
|
||||
}
|
||||
else
|
||||
{
|
||||
write_octal(val, ctx.prec);
|
||||
}
|
||||
}
|
||||
|
||||
const usz size2 = out.size() - start;
|
||||
@@ -485,12 +531,20 @@ usz cfmt_append(Dst& out, const Char* fmt, Src&& src)
|
||||
if (val)
|
||||
{
|
||||
out.push_back(ch); // Prepend 0x or 0X
|
||||
write_hex(val, ch == 'X', ctx.prec);
|
||||
}
|
||||
}
|
||||
else if (!ctx.dot || ctx.prec)
|
||||
|
||||
if ((ctx.alter && val) || !ctx.dot || ctx.prec)
|
||||
{
|
||||
write_hex(val, ch == 'X', ctx.prec);
|
||||
if (ctx.type == 16)
|
||||
{
|
||||
u128 val2 = *reinterpret_cast<u128*>(val);
|
||||
write_hex(val2, ch == 'X', ctx.prec);
|
||||
}
|
||||
else
|
||||
{
|
||||
write_hex(val, ch == 'X', ctx.prec);
|
||||
}
|
||||
}
|
||||
|
||||
const usz size2 = out.size() - start;
|
||||
@@ -544,7 +598,15 @@ usz cfmt_append(Dst& out, const Char* fmt, Src&& src)
|
||||
|
||||
if (!ctx.dot || ctx.prec)
|
||||
{
|
||||
write_decimal(val, ctx.prec);
|
||||
if (ctx.type == 16)
|
||||
{
|
||||
u128 val2 = *reinterpret_cast<u128*>(val);
|
||||
write_decimal(val2, ctx.prec);
|
||||
}
|
||||
else
|
||||
{
|
||||
write_decimal(val, ctx.prec);
|
||||
}
|
||||
}
|
||||
|
||||
const usz size2 = out.size() - start;
|
||||
@@ -610,7 +672,7 @@ usz cfmt_append(Dst& out, const Char* fmt, Src&& src)
|
||||
const u64 arg1 = ctx.args >= 1 ? src.template get<u64>(1) : 0;
|
||||
const u64 arg2 = ctx.args >= 2 ? src.template get<u64>(2) : 0;
|
||||
|
||||
if (const usz _size = std::snprintf(0, 0, _fmt.c_str(), arg0, arg1, arg2))
|
||||
if (const usz _size = std::snprintf(nullptr, 0, _fmt.c_str(), arg0, arg1, arg2))
|
||||
{
|
||||
out.resize(out.size() + _size);
|
||||
std::snprintf(&out.front() + out.size() - _size, _size + 1, _fmt.c_str(), arg0, arg1, arg2);
|
||||
@@ -630,7 +692,7 @@ usz cfmt_append(Dst& out, const Char* fmt, Src&& src)
|
||||
}
|
||||
|
||||
// Handle unfinished sequence
|
||||
if (ctx.size && ctx.size != size_dropped)
|
||||
if (ctx.size && ctx.size != umax)
|
||||
{
|
||||
fmt--, drop_sequence();
|
||||
}
|
||||
|
||||
@@ -21,11 +21,11 @@ constexpr u8 cheat_type_max = static_cast<u8>(cheat_type::max);
|
||||
|
||||
struct cheat_info
|
||||
{
|
||||
std::string game;
|
||||
std::string description;
|
||||
std::string game{};
|
||||
std::string description{};
|
||||
cheat_type type = cheat_type::max;
|
||||
u32 offset{};
|
||||
std::string red_script;
|
||||
std::string red_script{};
|
||||
|
||||
bool from_str(const std::string& cheat_line);
|
||||
std::string to_str() const;
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
#include "cond.h"
|
||||
#include "sync.h"
|
||||
#include "lockless.h"
|
||||
|
||||
#include <climits>
|
||||
|
||||
// use constants, increase signal space
|
||||
|
||||
|
||||
+16
-2
@@ -17,10 +17,24 @@ namespace date_time
|
||||
return buf;
|
||||
}
|
||||
|
||||
static inline std::string fmt_time(const char* fmt, const s64 time)
|
||||
{
|
||||
tm buf;
|
||||
time_t t = time;
|
||||
#ifdef _MSC_VER
|
||||
localtime_s(&buf, &t);
|
||||
#else
|
||||
buf = *localtime(&t);
|
||||
#endif
|
||||
char str[80];
|
||||
strftime(str, sizeof(str), fmt, &buf);
|
||||
return str;
|
||||
}
|
||||
|
||||
static inline std::string current_time()
|
||||
{
|
||||
char str[80];
|
||||
tm now = get_time(0);
|
||||
tm now = get_time(nullptr);
|
||||
strftime(str, sizeof(str), "%c", &now);
|
||||
return str;
|
||||
}
|
||||
@@ -29,7 +43,7 @@ namespace date_time
|
||||
static inline std::string current_time_narrow()
|
||||
{
|
||||
char str[80];
|
||||
tm now = get_time(0);
|
||||
tm now = get_time(nullptr);
|
||||
|
||||
std::string parse_buf;
|
||||
|
||||
|
||||
+4
-110
@@ -102,14 +102,6 @@ struct size2_base
|
||||
return width == rhs.width && height == rhs.height;
|
||||
}
|
||||
|
||||
#if __cpp_impl_three_way_comparison >= 201711
|
||||
#else
|
||||
constexpr bool operator !=(const size2_base& rhs) const
|
||||
{
|
||||
return width != rhs.width || height != rhs.height;
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename NT>
|
||||
explicit constexpr operator size2_base<NT>() const
|
||||
{
|
||||
@@ -211,19 +203,6 @@ struct position1_base
|
||||
return x == rhs;
|
||||
}
|
||||
|
||||
#if __cpp_impl_three_way_comparison >= 201711
|
||||
#else
|
||||
bool operator !=(const position1_base& rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
|
||||
bool operator !=(T rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename NT>
|
||||
explicit operator position1_base<NT>() const
|
||||
{
|
||||
@@ -383,19 +362,6 @@ struct position2_base
|
||||
return x == rhs && y == rhs;
|
||||
}
|
||||
|
||||
#if __cpp_impl_three_way_comparison >= 201711
|
||||
#else
|
||||
constexpr bool operator !=(const position2_base& rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
|
||||
constexpr bool operator !=(T rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename NT>
|
||||
explicit constexpr operator position2_base<NT>() const
|
||||
{
|
||||
@@ -478,19 +444,6 @@ struct position3_base
|
||||
return x == rhs && y == rhs && z == rhs;
|
||||
}
|
||||
|
||||
#if __cpp_impl_three_way_comparison >= 201711
|
||||
#else
|
||||
bool operator !=(const position3_base& rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
|
||||
bool operator !=(T rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename NT>
|
||||
explicit operator position3_base<NT>() const
|
||||
{
|
||||
@@ -571,19 +524,6 @@ struct position4_base
|
||||
return x == rhs && y == rhs && z == rhs && w == rhs;
|
||||
}
|
||||
|
||||
#if __cpp_impl_three_way_comparison >= 201711
|
||||
#else
|
||||
constexpr bool operator !=(const position4_base& rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
|
||||
constexpr bool operator !=(T rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename NT>
|
||||
explicit constexpr operator position4_base<NT>() const
|
||||
{
|
||||
@@ -639,14 +579,6 @@ struct coord_base
|
||||
return position == rhs.position && size == rhs.size;
|
||||
}
|
||||
|
||||
#if __cpp_impl_three_way_comparison >= 201711
|
||||
#else
|
||||
constexpr bool operator != (const coord_base& rhs) const
|
||||
{
|
||||
return position != rhs.position || size != rhs.size;
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename NT>
|
||||
explicit constexpr operator coord_base<NT>() const
|
||||
{
|
||||
@@ -718,14 +650,6 @@ struct area_base
|
||||
return x1 == rhs.x1 && x2 == rhs.x2 && y1 == rhs.y1 && y2 == rhs.y2;
|
||||
}
|
||||
|
||||
#if __cpp_impl_three_way_comparison >= 201711
|
||||
#else
|
||||
constexpr bool operator != (const area_base& rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
#endif
|
||||
|
||||
constexpr area_base operator - (const size2_base<T>& size) const
|
||||
{
|
||||
return{ x1 - size.width, y1 - size.height, x2 - size.width, y2 - size.height };
|
||||
@@ -864,17 +788,10 @@ struct color4_base
|
||||
{
|
||||
}
|
||||
|
||||
constexpr bool operator == (const color4_base& rhs) const
|
||||
constexpr bool operator ==(const color4_base& rhs) const
|
||||
{
|
||||
return r == rhs.r && g == rhs.g && b == rhs.b && a == rhs.a;
|
||||
}
|
||||
#if __cpp_impl_three_way_comparison >= 201711
|
||||
#else
|
||||
constexpr bool operator != (const color4_base& rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
#endif
|
||||
|
||||
void operator *= (const color4_base<T>& rhs)
|
||||
{
|
||||
@@ -940,17 +857,10 @@ struct color3_base
|
||||
{
|
||||
}
|
||||
|
||||
constexpr bool operator == (const color3_base& rhs) const
|
||||
constexpr bool operator ==(const color3_base& rhs) const
|
||||
{
|
||||
return r == rhs.r && g == rhs.g && b == rhs.b;
|
||||
}
|
||||
#if __cpp_impl_three_way_comparison >= 201711
|
||||
#else
|
||||
constexpr bool operator != (const color3_base& rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename NT>
|
||||
explicit constexpr operator color3_base<NT>() const
|
||||
@@ -984,19 +894,11 @@ struct color2_base
|
||||
{
|
||||
}
|
||||
|
||||
constexpr bool operator == (const color2_base& rhs) const
|
||||
constexpr bool operator ==(const color2_base& rhs) const
|
||||
{
|
||||
return r == rhs.r && g == rhs.g;
|
||||
}
|
||||
|
||||
#if __cpp_impl_three_way_comparison >= 201711
|
||||
#else
|
||||
constexpr bool operator != (const color2_base& rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename NT>
|
||||
explicit constexpr operator color2_base<NT>() const
|
||||
{
|
||||
@@ -1018,19 +920,11 @@ struct color1_base
|
||||
{
|
||||
}
|
||||
|
||||
constexpr bool operator == (const color1_base& rhs) const
|
||||
constexpr bool operator ==(const color1_base& rhs) const
|
||||
{
|
||||
return r == rhs.r;
|
||||
}
|
||||
|
||||
#if __cpp_impl_three_way_comparison >= 201711
|
||||
#else
|
||||
constexpr bool operator != (const color1_base& rhs) const
|
||||
{
|
||||
return !(*this == rhs);
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename NT>
|
||||
explicit constexpr operator color1_base<NT>() const
|
||||
{
|
||||
|
||||
@@ -161,11 +161,6 @@ public:
|
||||
return m_ptr == rhs.m_ptr;
|
||||
}
|
||||
|
||||
bool operator !=(const lf_queue_iterator& rhs) const
|
||||
{
|
||||
return m_ptr != rhs.m_ptr;
|
||||
}
|
||||
|
||||
T& operator *() const
|
||||
{
|
||||
return m_ptr->m_data;
|
||||
@@ -308,7 +303,7 @@ public:
|
||||
}
|
||||
|
||||
template <atomic_wait::op Flags = atomic_wait::op::eq>
|
||||
void wait(std::nullptr_t null = nullptr) noexcept
|
||||
void wait(std::nullptr_t /*null*/ = nullptr) noexcept
|
||||
{
|
||||
if (m_head == nullptr)
|
||||
{
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "Utilities/rXml.h"
|
||||
|
||||
rXmlNode::rXmlNode() : handle()
|
||||
rXmlNode::rXmlNode()
|
||||
{
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ std::string rXmlNode::GetNodeContent()
|
||||
return handle.text().get();
|
||||
}
|
||||
|
||||
rXmlDocument::rXmlDocument() : handle()
|
||||
rXmlDocument::rXmlDocument()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
+15
-2
@@ -1,6 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(push, 0)
|
||||
#include <pugixml.hpp>
|
||||
#pragma warning(pop)
|
||||
#else
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wall"
|
||||
#pragma GCC diagnostic ignored "-Wextra"
|
||||
#pragma GCC diagnostic ignored "-Wold-style-cast"
|
||||
#pragma GCC diagnostic ignored "-Weffc++"
|
||||
#include <pugixml.hpp>
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
#include <memory>
|
||||
|
||||
struct rXmlNode
|
||||
@@ -13,7 +26,7 @@ struct rXmlNode
|
||||
std::string GetAttribute( const std::string &name);
|
||||
std::string GetNodeContent();
|
||||
|
||||
pugi::xml_node handle;
|
||||
pugi::xml_node handle{};
|
||||
};
|
||||
|
||||
struct rXmlDocument
|
||||
@@ -24,5 +37,5 @@ struct rXmlDocument
|
||||
void Read(const std::string& data);
|
||||
std::shared_ptr<rXmlNode> GetRoot();
|
||||
|
||||
pugi::xml_document handle;
|
||||
pugi::xml_document handle{};
|
||||
};
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#include <mutex>
|
||||
#include "util/types.hpp"
|
||||
#include "util/atomic.hpp"
|
||||
|
||||
|
||||
+1
-3
@@ -3,7 +3,6 @@
|
||||
/* For internal use. Don't include. */
|
||||
|
||||
#include "util/types.hpp"
|
||||
#include "util/atomic.hpp"
|
||||
#include "util/dyn_lib.hpp"
|
||||
|
||||
#ifdef _WIN32
|
||||
@@ -11,7 +10,7 @@
|
||||
#define NOMINMAX
|
||||
#endif
|
||||
#include <Windows.h>
|
||||
#include <time.h>
|
||||
#include <ctime>
|
||||
#elif __linux__
|
||||
#include <errno.h>
|
||||
#include <sys/syscall.h>
|
||||
@@ -21,7 +20,6 @@
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
#include <algorithm>
|
||||
#include <ctime>
|
||||
#include <chrono>
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
set(ENABLE_PCH OFF CACHE BOOL "Enables Precompiled header" FORCE)
|
||||
set(BUILD_EXTERNAL OFF CACHE BOOL "Build external dependencies in /External" FORCE)
|
||||
set(SKIP_GLSLANG_INSTALL ON CACHE BOOL "Skip installation" FORCE)
|
||||
set(ENABLE_SPVREMAPPER OFF CACHE BOOL "Enables building of SPVRemapper" FORCE)
|
||||
|
||||
+1
-1
Submodule Vulkan/glslang updated: 3ee5f2f1d3...18eef33bd7
@@ -38,24 +38,25 @@
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros">
|
||||
<CmakeGenerator>"Visual Studio $(VisualStudioVersion.Substring(0,2))"</CmakeGenerator>
|
||||
<CmakeCLI>cmake -G $(CmakeGenerator) -A x64 -DCMAKE_CONFIGURATION_TYPES="Debug;Release" -DLLVM_USE_CRT_DEBUG=MTd -DLLVM_USE_CRT_RELEASE=MT ../glslang</CmakeCLI>
|
||||
<CmakeReleaseCLI>cmake -G $(CmakeGenerator) -A x64 -DCMAKE_BUILD_TYPE="Release" -DLLVM_USE_CRT_DEBUG=MTd -DLLVM_USE_CRT_RELEASE=MT ../glslang</CmakeReleaseCLI>
|
||||
<CmakeDebugCLI>cmake -G $(CmakeGenerator) -A x64 -DCMAKE_BUILD_TYPE="Debug" -DLLVM_USE_CRT_DEBUG=MTd -DLLVM_USE_CRT_RELEASE=MT ../glslang</CmakeDebugCLI>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<NMakeBuildCommandLine>$(CmakeCLI)
|
||||
<NMakeBuildCommandLine>$(CmakeReleaseCLI)
|
||||
msbuild.exe ALL_BUILD.vcxproj /t:build /p:Configuration=Release /p:ForceImportBeforeCppTargets=$(SolutionDir)common_default.props /m</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>$(CmakeCLI)
|
||||
<NMakeReBuildCommandLine>$(CmakeReleaseCLI)
|
||||
msbuild.exe ALL_BUILD.vcxproj /t:rebuild /p:Configuration=Release /p:ForceImportBeforeCppTargets=$(SolutionDir)common_default.props /m</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>$(CmakeCLI)
|
||||
<NMakeCleanCommandLine>$(CmakeReleaseCLI)
|
||||
msbuild.exe ALL_BUILD.vcxproj /t:clean /p:Configuration=Release /p:ForceImportBeforeCppTargets=$(SolutionDir)common_default.props /m</NMakeCleanCommandLine>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<NMakeBuildCommandLine>$(CmakeCLI)
|
||||
<NMakeBuildCommandLine>$(CmakeDebugCLI)
|
||||
msbuild.exe ALL_BUILD.vcxproj /t:build /p:Configuration=Debug /p:ForceImportBeforeCppTargets=$(SolutionDir)common_default.props /m
|
||||
</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>$(CmakeCLI)
|
||||
<NMakeReBuildCommandLine>$(CmakeDebugCLI)
|
||||
msbuild.exe ALL_BUILD.vcxproj /t:rebuild /p:Configuration=Debug /p:ForceImportBeforeCppTargets=$(SolutionDir)common_default.props /m
|
||||
</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>$(CmakeCLI)
|
||||
<NMakeCleanCommandLine>$(CmakeDebugCLI)
|
||||
msbuild.exe ALL_BUILD.vcxproj /t:clean /p:Configuration=Debug /p:ForceImportBeforeCppTargets=$(SolutionDir)common_default.props /m
|
||||
</NMakeCleanCommandLine>
|
||||
</PropertyGroup>
|
||||
|
||||
@@ -38,25 +38,26 @@
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros">
|
||||
<CmakeGenerator>"Visual Studio $(VisualStudioVersion.Substring(0,2))"</CmakeGenerator>
|
||||
<CmakeCLI>cmake -G $(CmakeGenerator) -A x64 -DCMAKE_CONFIGURATION_TYPES="Debug;Release" -DLLVM_USE_CRT_DEBUG=MTd -DLLVM_USE_CRT_RELEASE=MT -DSPIRV-Headers_SOURCE_DIR=$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)../spirv-headers')) ../spirv-tools</CmakeCLI>
|
||||
<CmakeReleaseCLI>cmake -G $(CmakeGenerator) -A x64 -DCMAKE_BUILD_TYPE="Release" -DSPIRV_WERROR=OFF -DSPIRV-Headers_SOURCE_DIR=$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)../spirv-headers')) ../spirv-tools</CmakeReleaseCLI>
|
||||
<CmakeDebugCLI>cmake -G $(CmakeGenerator) -A x64 -DCMAKE_BUILD_TYPE="Debug" -DSPIRV_WERROR=OFF -DSPIRV-Headers_SOURCE_DIR=$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)../spirv-headers')) ../spirv-tools</CmakeDebugCLI>
|
||||
<PropsAbsPath>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\..\common_default.props'))</PropsAbsPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<NMakeBuildCommandLine>$(CmakeCLI)
|
||||
<NMakeBuildCommandLine>$(CmakeReleaseCLI)
|
||||
msbuild.exe ALL_BUILD.vcxproj /t:build /p:Configuration=Release /p:ForceImportBeforeCppTargets=$(PropsAbsPath) /m</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>$(CmakeCLI)
|
||||
<NMakeReBuildCommandLine>$(CmakeReleaseCLI)
|
||||
msbuild.exe ALL_BUILD.vcxproj /t:rebuild /p:Configuration=Release /p:ForceImportBeforeCppTargets=$(PropsAbsPath) /m</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>$(CmakeCLI)
|
||||
<NMakeCleanCommandLine>$(CmakeReleaseCLI)
|
||||
msbuild.exe ALL_BUILD.vcxproj /t:clean /p:Configuration=Release /p:ForceImportBeforeCppTargets=$(PropsAbsPath) /m</NMakeCleanCommandLine>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<NMakeBuildCommandLine>$(CmakeCLI)
|
||||
<NMakeBuildCommandLine>$(CmakeDebugCLI)
|
||||
msbuild.exe ALL_BUILD.vcxproj /t:build /p:Configuration=Debug /p:ForceImportBeforeCppTargets=$(PropsAbsPath) /m
|
||||
</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>$(CmakeCLI)
|
||||
<NMakeReBuildCommandLine>$(CmakeDebugCLI)
|
||||
msbuild.exe ALL_BUILD.vcxproj /t:rebuild /p:Configuration=Debug /p:ForceImportBeforeCppTargets=$(PropsAbsPath) /m
|
||||
</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>$(CmakeCLI)
|
||||
<NMakeCleanCommandLine>$(CmakeDebugCLI)
|
||||
msbuild.exe ALL_BUILD.vcxproj /t:clean /p:Configuration=Debug /p:ForceImportBeforeCppTargets=$(PropsAbsPath) /m
|
||||
</NMakeCleanCommandLine>
|
||||
</PropertyGroup>
|
||||
|
||||
@@ -1,18 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug - LLVM|x64">
|
||||
<Configuration>Debug - LLVM</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release - LLVM|x64">
|
||||
<Configuration>Release - LLVM</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
@@ -104,23 +96,15 @@
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="..\rpcs3_debug.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug - LLVM|x64'" Label="PropertySheets">
|
||||
<Import Project="..\rpcs3_debug.props" />
|
||||
<Import Project="..\rpcs3_llvm.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="..\rpcs3_release.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release - LLVM|x64'" Label="PropertySheets">
|
||||
<Import Project="..\rpcs3_release.props" />
|
||||
<Import Project="..\rpcs3_llvm.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<PreprocessorDefinitions>ASMJIT_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release - LLVM|x64'">MaxSpeed</Optimization>
|
||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release'">MaxSpeed</Optimization>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
|
||||
+10
-8
@@ -5,10 +5,7 @@ trigger:
|
||||
tags:
|
||||
exclude:
|
||||
- '*'
|
||||
pr:
|
||||
branches:
|
||||
include:
|
||||
- master
|
||||
pr: none
|
||||
jobs:
|
||||
- job: Linux_Build
|
||||
strategy:
|
||||
@@ -19,12 +16,17 @@ jobs:
|
||||
COMPILER: gcc
|
||||
variables:
|
||||
CCACHE_DIR: $(Pipeline.Workspace)/ccache
|
||||
IS_AZURE: true
|
||||
CI_HAS_ARTIFACTS: true
|
||||
UPLOAD_COMMIT_HASH: d812f1254a1157c80fd402f94446310560f54e5f
|
||||
UPLOAD_REPO_FULL_NAME: "RPCS3/rpcs3-binaries-linux"
|
||||
DEPLOY_APPIMAGE: true
|
||||
APPDIR: "/rpcs3/build/appdir"
|
||||
ARTDIR: "/root/artifacts"
|
||||
RELEASE_MESSAGE: "/rpcs3/GitHubReleaseMessage.txt"
|
||||
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
|
||||
steps:
|
||||
- task: Cache@2
|
||||
inputs:
|
||||
@@ -33,13 +35,13 @@ jobs:
|
||||
displayName: ccache
|
||||
|
||||
- bash: |
|
||||
docker pull --quiet rpcs3/rpcs3-travis-xenial:1.7
|
||||
docker pull --quiet rpcs3/rpcs3-ci-bionic:1.0
|
||||
docker run \
|
||||
-v $(pwd):/rpcs3 \
|
||||
--env-file .ci/docker.env \
|
||||
-v $CCACHE_DIR:/root/.ccache \
|
||||
-v $BUILD_ARTIFACTSTAGINGDIRECTORY:/root/artifacts \
|
||||
rpcs3/rpcs3-travis-xenial:1.7 \
|
||||
rpcs3/rpcs3-ci-bionic:1.0 \
|
||||
/rpcs3/.ci/build-linux.sh
|
||||
displayName: Docker setup and build
|
||||
|
||||
@@ -102,7 +104,7 @@ jobs:
|
||||
solution: 'rpcs3.sln'
|
||||
maximumCpuCount: true
|
||||
platform: x64
|
||||
configuration: 'Release - LLVM'
|
||||
configuration: 'Release'
|
||||
displayName: Compile RPCS3
|
||||
|
||||
- bash: .ci/deploy-windows.sh
|
||||
|
||||
@@ -340,3 +340,28 @@ QLabel#debugger_frame_pc {
|
||||
color: #000; /* Font Color: Black */
|
||||
background-color: #00ff00; /* Green */
|
||||
}
|
||||
|
||||
/* Tree view changes*/
|
||||
QTreeView::branch:has-children:!has-siblings:closed,
|
||||
QTreeView::branch:closed:has-children:has-siblings {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_white.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:open:has-children:!has-siblings,
|
||||
QTreeView::branch:open:has-children:has-siblings {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_down_white.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:has-children:!has-siblings:closed:hover,
|
||||
QTreeView::branch:closed:has-children:has-siblings:hover {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_blue.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:open:has-children:!has-siblings:hover,
|
||||
QTreeView::branch:open:has-children:has-siblings:hover {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_down_blue.png");
|
||||
}
|
||||
|
||||
+36
-2
@@ -159,12 +159,12 @@ QCheckBox::indicator:disabled {
|
||||
|
||||
/* Scrollbars */
|
||||
QScrollBar {
|
||||
width: 5px;
|
||||
width: 10px;
|
||||
background: #23262d;
|
||||
}
|
||||
|
||||
QTableView QScrollBar {
|
||||
width: 3px;
|
||||
width: 10px;
|
||||
height: 3px;
|
||||
}
|
||||
|
||||
@@ -628,3 +628,37 @@ QLabel#tty_text {
|
||||
color: #f8f8f8;
|
||||
}
|
||||
|
||||
/* Debugger colors */
|
||||
QLabel#debugger_frame_breakpoint {
|
||||
color: #000; /* Font Color: Black */
|
||||
background-color: #ffff00; /* Yellow */
|
||||
}
|
||||
QLabel#debugger_frame_pc {
|
||||
color: #000; /* Font Color: Black */
|
||||
background-color: #00ff00; /* Green */
|
||||
}
|
||||
|
||||
/* Tree view changes*/
|
||||
QTreeView::branch:has-children:!has-siblings:closed,
|
||||
QTreeView::branch:closed:has-children:has-siblings {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_white.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:open:has-children:!has-siblings,
|
||||
QTreeView::branch:open:has-children:has-siblings {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_down_white.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:has-children:!has-siblings:closed:hover,
|
||||
QTreeView::branch:closed:has-children:has-siblings:hover {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_green.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:open:has-children:!has-siblings:hover,
|
||||
QTreeView::branch:open:has-children:has-siblings:hover {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_down_green.png");
|
||||
}
|
||||
|
||||
@@ -343,3 +343,28 @@ QTextEdit#tty_frame {
|
||||
QLabel#tty_text {
|
||||
color: #ffffff; /* White */
|
||||
}
|
||||
|
||||
/* Tree view changes*/
|
||||
QTreeView::branch:has-children:!has-siblings:closed,
|
||||
QTreeView::branch:closed:has-children:has-siblings {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_white.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:open:has-children:!has-siblings,
|
||||
QTreeView::branch:open:has-children:has-siblings {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_down_white.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:has-children:!has-siblings:closed:hover,
|
||||
QTreeView::branch:closed:has-children:has-siblings:hover {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_blue.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:open:has-children:!has-siblings:hover,
|
||||
QTreeView::branch:open:has-children:has-siblings:hover {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_down_blue.png");
|
||||
}
|
||||
|
||||
@@ -337,3 +337,28 @@ QLabel#debugger_frame_pc {
|
||||
color: #000; /* Font Color: Black */
|
||||
background-color: #333b44; /* Green */
|
||||
}
|
||||
|
||||
/* Tree view changes*/
|
||||
QTreeView::branch:has-children:!has-siblings:closed,
|
||||
QTreeView::branch:closed:has-children:has-siblings {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_white.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:open:has-children:!has-siblings,
|
||||
QTreeView::branch:open:has-children:has-siblings {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_down_white.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:has-children:!has-siblings:closed:hover,
|
||||
QTreeView::branch:closed:has-children:has-siblings:hover {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_blue.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:open:has-children:!has-siblings:hover,
|
||||
QTreeView::branch:open:has-children:has-siblings:hover {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_down_blue.png");
|
||||
}
|
||||
|
||||
@@ -189,11 +189,11 @@ QSlider#sizeSlider::handle:hover {
|
||||
|
||||
/* Scrollbars */
|
||||
QScrollBar {
|
||||
width: 5px;
|
||||
width: 10px;
|
||||
}
|
||||
|
||||
QTableView QScrollBar {
|
||||
width: 3px;
|
||||
width: 10px;
|
||||
height: 3px;
|
||||
}
|
||||
|
||||
@@ -650,3 +650,37 @@ QLabel#thumbnail_icon_color {
|
||||
color: #370048;
|
||||
}
|
||||
|
||||
/* Debugger colors */
|
||||
QLabel#debugger_frame_breakpoint {
|
||||
color: #000; /* Font Color: Black */
|
||||
background-color: #ffff00; /* Yellow */
|
||||
}
|
||||
QLabel#debugger_frame_pc {
|
||||
color: #000; /* Font Color: Black */
|
||||
background-color: #00ff00; /* Green */
|
||||
}
|
||||
|
||||
/* Tree view changes*/
|
||||
QTreeView::branch:has-children:!has-siblings:closed,
|
||||
QTreeView::branch:closed:has-children:has-siblings {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_white.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:open:has-children:!has-siblings,
|
||||
QTreeView::branch:open:has-children:has-siblings {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_down_white.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:has-children:!has-siblings:closed:hover,
|
||||
QTreeView::branch:closed:has-children:has-siblings:hover {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_blue.png");
|
||||
}
|
||||
|
||||
QTreeView::branch:open:has-children:!has-siblings:hover,
|
||||
QTreeView::branch:open:has-children:has-siblings:hover {
|
||||
border-image: none;
|
||||
image: url("GuiConfigs/list_arrow_down_blue.png");
|
||||
}
|
||||
|
||||
@@ -193,7 +193,7 @@ QSlider#sizeSlider::handle:hover {
|
||||
|
||||
/* Scrollbars */
|
||||
QScrollBar {
|
||||
width: 5px;
|
||||
width: 10px;
|
||||
}
|
||||
|
||||
QScrollArea {
|
||||
@@ -201,7 +201,7 @@ QScrollArea {
|
||||
}
|
||||
|
||||
QTableView QScrollBar {
|
||||
width: 3px;
|
||||
width: 10px;
|
||||
height: 3px;
|
||||
}
|
||||
|
||||
@@ -648,7 +648,7 @@ QLabel#log_level_warning {
|
||||
}
|
||||
|
||||
QLabel#log_level_notice {
|
||||
color: #FFFFFF;
|
||||
color: #455971;
|
||||
}
|
||||
|
||||
QLabel#log_level_trace {
|
||||
@@ -669,3 +669,12 @@ QLabel#thumbnail_icon_color {
|
||||
color: #8500ae;
|
||||
}
|
||||
|
||||
/* Debugger colors */
|
||||
QLabel#debugger_frame_breakpoint {
|
||||
color: #000; /* Font Color: Black */
|
||||
background-color: #ffff00; /* Yellow */
|
||||
}
|
||||
QLabel#debugger_frame_pc {
|
||||
color: #000; /* Font Color: Black */
|
||||
background-color: #00ff00; /* Green */
|
||||
}
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 3.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.0 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.7 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.9 KiB |
@@ -11774,3 +11774,256 @@
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-22T08:52:36Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-22T09:45:40Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"evdev: fix build","sha":"2e5f321583be9aa95c53b4dd8fcfeec190dd2f81"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-21T14:16:06Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-22T09:47:45Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Remove cpu_thread destructor","sha":"96400234a8861aed30112f39bf320e73f5fc359c"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-22T09:36:52Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-22T09:47:45Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Remove vm::cleanup_unlock","sha":"73d45f3bf0cbde4b1d2547b34960598f04083086"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-19T13:18:09Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-22T10:00:01Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Simplify utils::align() a bit\n\nstd::is_unsigned implies std::is_integral I believe.","sha":"9dc238187f0c0e45276b2104e4b4ec125c542e0b"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-22T09:43:40Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-22T10:00:01Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Fix minor inconsistency in utils::memory_reset (Linux)","sha":"ad1027455aac982fe6e3ae6288cfa3f1eff2ae31"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-22T10:32:35Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-22T10:35:01Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"JIT.cpp: fix overcommit bug (should have been Linux-specific)\n\nCloses #9820\n\nCo-authored-by: Eladash <elad3356p@gmail.com>","sha":"980be9e0e821d66d78684b4e641b750b80592524"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-22T16:37:32Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-22T16:37:32Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Add commits","sha":"85bebebb36621e7c6a14a0fb596d84284333a983"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-22T16:37:42Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-22T16:37:42Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Add supporters","sha":"4b858648e51e508d61168285507c7e5afa5e8793"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-22T19:18:06Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-22T21:04:53Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk/dma: Simplify map_dma interface","sha":"3632412c481eb11591ff9821f92b4341f215167a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-22T19:44:01Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-22T21:04:53Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Move queue family management from swapchain to logical device","sha":"cb7cf40b5e70777e77b293cb02ef3d644a8c9492"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-22T17:22:55Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-23T04:03:38Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"fix no-gui crash if no firmware was installed\n\nIt's a bit mysterious, but the confirmation box doesn't like being called in this mode.\nSo let's just return false.","sha":"037586d7bb3a39885f5db4d0a821056efcb75543"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-23T03:34:09Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-23T04:03:38Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"remove unused variable","sha":"0878db4e170d20418eb2133ec75499f74d5a0037"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-21T19:55:07Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T08:29:23Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Atomic PARAM.SFO writes","sha":"932f31e37bead478d1375ba447d7f02cab9643e4"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-22T12:36:35Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T08:29:23Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix atomicity of savedata/trophy data writes","sha":"d4af8dd89abb7b2f13ff67444dbf615ada63bd14"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-23T04:29:11Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T08:29:23Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Atomic SPU LS capture writes","sha":"9ccf39b27f01ea0788b1aeff4e2594fb68521dcb"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-23T04:35:35Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T08:29:23Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Atomic RSX capture writes","sha":"447d2b6f9330876b06e2d02031f028ce37dc7fbf"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6031700?v=4","date":"2021-02-22T19:27:43Z","email":"RipleyTom@users.noreply.github.com","login":"RipleyTom","name":"RipleyTom"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T10:17:49Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix rpcn registration","sha":"801467e565ce18dadcd90c3042477e6841ae3b7f"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-22T21:04:59Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T10:27:54Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"overlays: Fix frametime graph spikes\n\nThe frametime_timer was restarted at the end of the update method, instead of immediately after reading its value.\nThis means that the frametime was lower than expected when an expensive task was executed in-between.","sha":"663b2c9c5e9e58e1a97f665044983179a1b08fd2"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-22T22:00:52Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T10:27:54Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"overlays: Fix perf_metrics_overlay visibility\n\nAlso change auto type to compiled_resource in order to silence a warning about accidental copy by value","sha":"e91df31f8c97907f4fcf820f8ce4ea795df726fa"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-22T22:25:13Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T10:27:54Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"overlays: fix perf_metrics_overlay division by 0","sha":"7cc8380330e0091253f37524fa8648fb94085ab5"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-22T23:43:30Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T10:27:54Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"overlays: fix initial size of perf_overlay body\n\nYou could see that it was not properly adjusted in the first frame in high detail mode.","sha":"79b5b79de1b206e04cfa44ab3590131ab5ebcfbb"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-22T23:56:24Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T10:27:54Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"overlays: fix perf overlay switching detail levels\n\nThe body was lagging behind the text. This was fixed by calling an updated version of init() on settings change.\nThis introduced spikes in the frametime graph, so the data had to become members and m_force_update was adjusted to not interfere with data aquisition.","sha":"a771f168eb13d24a1f3f19421fad97e96839a71d"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-23T14:09:23Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T14:35:45Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Minor GUI fix for PPU interpreter at \"precompilation\"","sha":"68a878264ca203be07ee9acc80517abee790af46"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-13T16:05:31Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T14:55:36Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix Emulation::CallAfter\n\nMost CallAfter usages were extremely wrong when ordered after Emu.Stop(). could result in anywhere from emulation stopping hangs to even segfaults.\ntrack_emu_state = true is now the default, I haven't found cases which need need it disabled.","sha":"112b7f65719b2034952d2cda51d2f0d0d5a7bf15"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-23T15:23:53Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-02-23T15:23:53Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"product_info: add Harmonix Pro-Drum Kit (#9822)\n\nCo-authored-by: DrGeelfood <79338929+DrGeelfood@users.noreply.github.com>","sha":"b83cb2dbf53490d060580b6f33582508ad5816d5"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T09:08:22Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T15:24:50Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"cellSaveData: fix minor issues","sha":"014846cf318aacb62af9ea6bf29c692d068ea708"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T10:09:20Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T15:24:50Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Implement fs::sync (Linux/POSIX)","sha":"090a769bf60326cd4db834d587c95895726e577f"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T10:52:07Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T15:24:50Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Move CPUStats.h -> util/cpu_stats.cpp","sha":"cd01a1eb09fd3992efce61db698c3e2b0b56ea24"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T11:19:45Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T15:24:50Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Remove garbage SPUW perf report","sha":"a90ad62fc0dc29f720183dab005a99d79f7f1071"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T11:22:55Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-23T16:46:37Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"vk::render_device::create: try to remove failing assertion","sha":"3063369322fe2cc23da664bbc684602c0ac6783b"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-22T19:54:25Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-23T20:22:41Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"Formatting fixes only\n\n- Mostly remove camelcase usage in old code.\n- Properly annotate vulkan API imports with _vk prefix to make it clear they are not regular variables.","sha":"d459da137852ea6843812ba00b642428fa32bc44"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-23T19:38:39Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-23T20:22:41Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Handle old GPUs without proper async queues","sha":"0e7e5b59ae699bf516e6a45a789a97f31d665e3e"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-23T18:47:00Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-24T13:42:39Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix TTY handling of control characters","sha":"0012f39384099eca8859f5d4cf5d325ccbd4f98a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-24T19:35:04Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-25T10:08:27Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"overlays: Fix cpu usage in low detail mode","sha":"6db25aa7facbed5451c87b20c39cc85eb9e01ee5"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-24T22:20:32Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-25T10:08:27Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix Nan in cpu_stats::get_usage\n\nAnd apply same logic to linux and windows","sha":"e940632d9305818f38e0d6bc32655da98d2bb7ab"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-25T11:37:31Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-02-25T11:37:31Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"Fix stop count incremention in Emu.Stop (#9843)\n\nUntil emulation is completely stopped, further CallAfter callbacks may be issued with incorrect stop count memorized.","sha":"c13039396c00b9b2dc6e15059da264b89066d239"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6031700?v=4","date":"2021-02-25T19:17:03Z","email":"RipleyTom@users.noreply.github.com","login":"RipleyTom","name":"RipleyTom"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-26T08:58:42Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Add CELL_NET_CTL_INFO_DHCP_HOSTNAME impl","sha":"67378c7dea3790fe60869f377ef4ee4623594d43"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-25T18:57:10Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-26T12:08:14Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Add support for queue family migration and refactor some texture upload code","sha":"be1238cc95952611511bf95645be52275f686046"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-25T19:11:20Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-26T12:08:14Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Add per-queue-family scratch resources and double buffer them","sha":"12cad7c39347f1c0a71766995db46fe0f7d0b460"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-25T19:23:22Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-26T12:08:14Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Explicit initialization of command pool queue family","sha":"d2de8a87bf15581900b3734356fa16dd6c02db33"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-28T13:59:12Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-28T15:00:20Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Fix inadvertent self-assign","sha":"4bef176e9b3924523df4b51eb6efc65ddd36b90a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-27T21:36:03Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T15:48:34Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"remove unused variable","sha":"a4d4ab1df91b7a201574cc499994528399f9c188"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-27T21:37:01Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T15:48:34Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Qt: set parent for QThread\n\nThis may or may not have caused a leak","sha":"7cb32a3680b2075967b0bd4505c2587f66920922"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-24T10:45:10Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T17:16:13Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"named_thread: rewrite result_storage\n\nUse SFINAE as permitted by std::invoke_result_t<>","sha":"29e7eda887243cf0df0fdc07a8c7c9730a2149ab"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-24T10:56:02Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T17:16:13Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"named_thread: implement \"default\" event loop\n\nFixup \"sleepy\" thread at startup on Windows.\nPermit threads which lack operator()() overload.","sha":"3aaa0172d54f2e7082e337fe83840effc32421e0"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T11:39:04Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T17:20:17Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"named_thread: implement task queue\n\natomic_ptr: implement push_head()\n\nthread_ctrl::state() triggers task queue execution.","sha":"de9d859f4ac4e4272f21f803f7e6671db9347540"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T14:25:53Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T17:20:17Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Rewrite cellNetCtlNetStartDialogLoadAsync hack","sha":"f580bee32ca2d57facfe6565852a17840f430d4a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-28T19:05:04Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-02-28T19:05:04Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"Improve cellScreenshot (#9851)\n\n* Fix screenshot logging\r\n\r\n* Update libpng to 1.6.37\r\n\r\n* cellScreenshot: Write text chunks\r\n* cellScreenshot: add overlay image\r\n* screenshot_manager: add /dev_hdd0/photo/\r\n\r\n* read_png_file: use deleter instead of manual close\r\n\r\n* cellScreenshot: use Qt for overlays\r\n* cellScreenshot: don't apply overlay to regular img\r\n* screenshot_manager: add mount hack for VFS\r\n* cellScreenshot: escape the whole path","sha":"a7c9827ad48bcfb31239290c34eee7e60d22e977"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/2995486?v=4","date":"2020-12-27T14:51:55Z","email":"Florin9doi@users.noreply.github.com","login":"Florin9doi","name":"Florin9doi"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T19:36:47Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Buzz settings","sha":"dfee46604af8a1c5d0e43f43beba809993f350c8"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-28T19:59:27Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-02-28T19:59:27Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"Firmware installation bugfixes (#9855)\n\n* Fix race condition in PUP installation abortion.\r\n* Fix freezes of emulator in case the PUP installation failed due to filesystem errors.\r\n* Use fs::create_path as opposed to fs::create_dir as it is can create upper directories in case they are missing and is better in error handling.\r\n* Report TAR errors on failure to create directories.\r\n* Fix pup_object constructor to not crash on invalid PUP file header. (report an error)\r\n* Fix pup_object::validate_hashes to not crash on invalid PUP file entries. (report an error)\r\n* Do not call Qt functions inside a named_thread because it is wrong.","sha":"461fa6a88a17f823dd405615a36295c710823c04"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T21:22:32Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T21:22:32Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Tentative fix for -Wattributes\n\nThese warnings enabled conditionally for GCC 10.1+.","sha":"b7c579adf9e70f7504cb5804caddb79c5ca5c873"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T21:28:28Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-28T21:28:28Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"shared_ptr.hpp: minor fixup","sha":"71e16bfac3790c462d830f03f735a0f2e6ddd76e"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-28T22:06:48Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-02-28T22:06:48Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"Report deadlocked thread names in failures to stop emulation (#9865)\n\n* Report deadlocked thread names in failures to stop emulation\r\n\r\nCo-authored-by: Nekotekina <nekotekina@gmail.com>","sha":"48cd56acc2c55e80d7ae0943d4194ab43e009809"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-28T23:00:49Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-02-28T23:00:49Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"cellScreenshot: fix overlay scaling (#9867)\n\n* cellScreenshot: fix overlay scaling","sha":"0b5c6350aeba9547dfaad0899a477447564926e6"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/10283761?v=4","date":"2021-02-28T23:32:23Z","email":"ani-leo@outlook.com","login":"AniLeo","name":"Ani"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-02-28T23:32:23Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"rpcs3_version: Bump to 0.0.15 (#9866)","sha":"8e4451d1ab2f973240a1547623a955a2fc3d6611"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-28T00:05:10Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T13:37:49Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"DS3: implement player LEDs","sha":"10a55f16cc7a4506a8e1aa86097f7792ac1b1a98"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-28T03:32:08Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T13:37:49Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"input: add some sanity checks","sha":"22b8cfd0bac6bb19f83c531bc2a7838c798d150d"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-28T03:50:23Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T13:37:49Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"ds3: add led battery indicators (Linux only atm)\n\nneeds testing. maybe doesn't work","sha":"c2467b7b3818916fb39c505754e495da12b486b4"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-02-28T04:14:01Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T13:37:49Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt/Input: set player LED in pad settings","sha":"805d52987f1d99008cfb4550b0dda8d8cd444d75"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T08:24:30Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T13:37:49Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"DS3: fix battery_level aquisition","sha":"2dc798d539ced803430dcaf55e7d5a06edff729b"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T12:49:30Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T13:37:49Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"DS3: fix regression: pad data is cleared even if there is no new data","sha":"b5d4b5a21c7e4ca7167c6784079e6699b186891c"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T22:58:38Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T23:45:42Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"DS3: fix linux output report","sha":"3452e18da1f9bac904b94ac9e2294269a5164419"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T23:54:38Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-02T00:29:28Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"DS3: fix LED battery status","sha":"930895a218100e81db2ab85b3a131cc4047c907a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-01T13:11:01Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T13:07:51Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"LLVM: Do not crash on failure to create cache file","sha":"ff211a9508bfd8909d464316ed02e70b9f3682a4"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-03T19:01:30Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T13:08:14Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"shared_ptr.hpp: minor fixup for arrays","sha":"aa7e2376ec62f1920f20a6cb6fad816604a96bfe"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-03T14:05:31Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T13:08:14Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"typeindices.hpp: upgrade with size and align info\n\nThis allows contiguous allocation (as in an aggregate).","sha":"5cc9bd770284a74fd85cf45a2412b34cf137b212"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-03T14:51:52Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T13:08:14Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"auto_typemap.hpp: reduce indirection\n\nImplement is_init() method.\nImplement optional Size template arg for further optimization.","sha":"8a9320c4efdb90e1cf855220022d47ab36234321"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-02-03T18:14:31Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T13:08:14Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"fixed_typemap.hpp: reduce indirection\n\nBackported some changes from auto_typemap.hpp\nImplemented methods init(), reset(), clear()\nDisabled recreation support.","sha":"d788b12a8eba7266861d6df3a11c2743b6725dac"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-01T15:02:25Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T13:08:14Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"named_thread: fix bugs in std::forward usage\n\nFix few misused threads and other bugs.","sha":"bbf52f3cead888fa682d311018fa5bf9477a6b32"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T11:59:19Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T13:08:14Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"fixed_typemap.hpp: return reference","sha":"ea5e837bd63d6cc6595bf4833e4122deec63f1c2"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-02T15:13:15Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T16:19:27Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Atomic trophy status updates","sha":"d0edd44a6994454a8b03e48bc79941af8b55f5d7"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-02-26T09:20:25Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T18:57:51Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"SPU debugger: Implement MFC journal\n\n* Allow to dump up to 1820 commands with up 128 bytes of data each, using key D with the debugger.","sha":"004ebfdaee385e80da65101eb2b3b7bd8385d0a4"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T16:22:39Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T18:58:49Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"fixed_typemap.hpp: make it a bit fool-proof\n\nRequire objects to be non-copyable (move is still allowed).","sha":"52fe86b56c7eb5cadf059a54646215eab8547d06"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T18:07:24Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-02T18:58:49Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"PPU: remove artificial 0x20000000 barrier for debug stats\n\nChange it to 0xE0000000 (SPU demarcation line)","sha":"c71bc25090656162e3727434aadbed3e9d206892"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T19:37:32Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-02T23:33:46Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"perf overlays: add detail level none (hides FPS)","sha":"038c708a0accecfda9cd93210e9ab58faf4e906e"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T19:38:04Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-02T23:33:46Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"perf overlays: fix dynamic font resize of graphs","sha":"e1e370999eee2d7faad94aa7f6389abaaed08c48"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T19:59:05Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-02T23:33:46Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"perf overlay: add datapoint count config settings","sha":"86dbb859b7afe16327c10871443bf56e193fadb2"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T21:44:47Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-02T23:33:46Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"perf overlay: add datapoint settings to GUI","sha":"73ca2119ed6fbb2a094c1dcf7b1073936ff49ff0"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T22:02:03Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-02T23:33:46Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"perf overlay: add missing graph vertex\n\nAnd fix potential division by 0","sha":"fa852c7dbe6c482c30215be366b99d6396c79544"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-01T22:05:38Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-02T23:33:46Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"perf overlay: Don't allow 0 or 1 datapoint count\n\nDoesn't render anyway","sha":"7c0b93f8150a47e57bd7674dd0ea019c85b3c83d"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-02T21:49:11Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-03T10:17:04Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Remove redundant double barrier\n\n- Luckily it was not too harmful in single queue submissions","sha":"1becd2f788b7c014ff2cdc2e6efaf5fdfb2f3caf"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6031700?v=4","date":"2021-02-09T16:05:09Z","email":"RipleyTom@users.noreply.github.com","login":"RipleyTom","name":"RipleyTom"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-03T14:30:16Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Add some GT6 devices to whitelist","sha":"0eb0b1e1c98466d46a0ee7512fcc541ef7db1d6c"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-03T14:37:51Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-03T14:37:51Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"endian.hpp: simplify be_t/le_t constructors","sha":"e6a3b59229fa3b538831b1ce3a8d5ec86e24c3a6"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-03T14:38:36Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-03T14:38:36Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Add commits","sha":"8b8120cfb77a8a8fb5510d55b501cd6cb7b84f34"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/211316?v=4","date":"2021-03-03T19:50:14Z","email":"tredaelli@redhat.com","login":"drizzt","name":"Timothy Redaelli"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-04T09:17:27Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"SPUThread.cpp: remove \"__attribute__((always_inline))\"\n\ncmp_rdata and mov_rdata are using __attribute__((always_inline)),\nwithout inline, that is not supported on current g++ (see RPCS3#1546).\n\nMoreover __attribute__((always_inline)) is a noop if used without inline so\njust remove it.\n\nA proper fix is to move the 2 functions in an header file as static\n(with FORCE_INLINE) so it can be correctly inlined by the compiler.","sha":"fa5a2b6a8523b25152564ac641c1f7cd873a5e5a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/211316?v=4","date":"2021-03-03T21:01:34Z","email":"tredaelli@redhat.com","login":"drizzt","name":"Timothy Redaelli"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-04T09:22:19Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix linking with system curl","sha":"826dc7d5a6b51c5c2272ec52c607565aee2e6c5b"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-04T10:44:24Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-05T11:46:52Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"VS 16.9.0 compilation workaround","sha":"b09ac19e61d6f7d090fa7ac7e86dbcca1941c01f"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-04T10:44:36Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-05T11:46:52Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Qt: fix settings_dialog layout. Add stretches.","sha":"f88c3ae417101112589b8041616041b796942643"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-02T22:23:24Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T01:07:02Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: reset battery progress bar when not supported.","sha":"bdd94f053c973989b7da7a945f8ff9a92a0110ac"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-02T22:24:05Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T01:07:02Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"dualsense: minor cleanup","sha":"b836d2497d9a70e76adc01cfcdc0fdefc257e82a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-02T23:33:10Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T01:07:02Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"dualsense: implement battery level","sha":"cdffaa1598855341a12cdc6079b44726d7efad78"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-05T18:14:50Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T01:07:02Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"dualsense: get hardware and firmware version","sha":"c8e7530e372a014883e4bbaaf1c91e9f3430a881"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-05T19:32:58Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T01:07:02Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"dualsense: fix LED updates","sha":"06d2c5357b150ca28bc94a2000c3e9ebc5cbf304"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-05T21:08:13Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T01:07:02Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"dualsense: implement lightbar pulse (low battery)","sha":"dbb03ae2d710987d0adec5f7fc7e04d81a11ac9a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-05T21:09:28Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T01:07:02Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"DS3/DS4: fix battery LED update","sha":"3e7e077fad94df1510904e67bd13923e50381980"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-01-27T16:22:06Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T09:34:49Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"GUI: Improve missing firmware handling\n\n* Install PS3UPDAT.PUP at the spot when booting games whenever firmware is missing. The option to boot games without firmware is still supported when all firmware SPRX are HLEd in firmware settings.\n* Pop-up a confirmation dialog in firmware installation if firmware is already installed.","sha":"a5d74c5e96468fd10c4c95436d815727b115b21a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T09:43:01Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T10:15:54Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"DualSense: Fix initial ingame LED update","sha":"d2b0b019ec99ca81dff4b7987a078bd70a85ad12"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-05T14:18:17Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T11:53:40Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix utils::get_firmware_version()\n\n* Do not crash on invalid file contents.\n* Do not crash on unexpected file.open() error.","sha":"228988ca2b2ecfa71721e7b91d598b5016c7a1b5"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/12022598?v=4","date":"2021-03-06T13:01:04Z","email":"arus@poczta.onet.pl","login":"GitArUs","name":"GitArUs"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-03-06T13:01:04Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"Allow games to list all savedata (#9547)\n\n* cellSaveData - allow games to list all savedata, not only those they own.\r\n\r\nCo-authored-by: Megamouse <studienricky89@googlemail.com>","sha":"f8097a428c851e1b35b0962e47bdda1bce5b0092"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T14:23:26Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T15:06:21Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"add some log messages for debugging","sha":"7205a937511350dca1c31e660f4a2488171b9c59"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-05T19:05:37Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T15:07:08Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Enable -Wunused-parameter","sha":"87af90501811b7d3432ce5bafa70d7eaac4f5cb6"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T16:26:41Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T16:26:41Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Minor fix for fmt::split with empty string\n\nDoesn't affect existing code, I believe.\nReturn at least 1 empty string if is_skip_empty=false.","sha":"7cd79714facb8e42c7279d5504c9df0b9fe09741"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T16:30:09Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T16:30:09Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Another minor fix for fmt::split\n\nDoesn't affect existing code.\nIf there are 2 or more separator, choose closest.","sha":"c69c70cf5fc6a10d3c03b6e0f581ac9b0b0885b4"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T17:02:16Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T20:10:31Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"sysinfo.cpp: Implement utils::main_tid (main thread id)\n\nCareful.","sha":"ded828dfc94f947a64ce2f0760e50b70dae418a0"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T17:10:48Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T20:10:31Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Implement thread_ctrl::get_tid()","sha":"55c75d2c873885cfda9b21cfc011855ef1f68520"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T18:02:37Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T20:10:31Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Implement thread_ctrl::is_main()","sha":"3609eb25c95624368e9da36824136dc01330aa5e"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T15:40:56Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T22:56:25Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix auto updates. Don't pass exe as arg0 to execl","sha":"9da7910fc90825e4260cae065ee2b29204048f6c"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T20:10:35Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T22:56:25Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Cleanup Emu before the update reboot","sha":"dab53f4e41c0812847329c943ebcd2e1c00e4605"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T20:32:36Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-06T22:56:25Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Qt: Do not allow updates during emulation","sha":"3ae7debc17371e6b0d4825a6b8365d8fbe4513b0"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T10:51:21Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-06T23:52:11Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"overlays: don't count initial garbage values.\n\nThis might also shave off some microseconds.","sha":"a3a4c0a9062ea9f5b708cd2d35647fb1698f2dc6"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-07T00:53:27Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-07T10:48:19Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Input/Qt: implement XInput battery level","sha":"1b5cf118e7a4747b3e64aa20f0abaece6cbc9dd5"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-07T16:59:37Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-03-07T16:59:37Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"GUI: Implement MSELF extraction tool (#9909)\n\n* MSELF: fix overflow\r\n\r\n* GUI: Implement MSELF extraction tool\r\n\r\n* VS: fix mself files in vcxproj\r\n\r\n* fix\r\n\r\n* Update mself.cpp\r\n\r\n* fixed","sha":"2afc7cbaaab7962e9623a0666683b70628297f6b"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-07T18:55:40Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-08T11:05:00Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"patch_manager: expand first search results","sha":"935e398930f43ccaf68da682808f30bc5e4beed4"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/1712979?v=4","date":"2021-03-06T19:56:58Z","email":"dsdominykas@gmail.com","login":"xddxd","name":"xddxd"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-08T12:46:03Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Possible workaround for mobile Kepler chips","sha":"6d91a9fe6f9b9c850266df3bf06e88b28952d480"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/26352541?v=4","date":"2021-03-04T17:16:12Z","email":"MalcolmJestadt@gmail.com","login":"Whatcookie","name":"Malcolm Jestadt"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-08T12:48:36Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"SPU LLVM: Rearange FM instruction for better performance\n- Doesn't eliminate any instructions, but allows for better out of order execution.","sha":"e5d0e035d0b6358b154242ffd3a5d7b5622ff496"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/1712979?v=4","date":"2021-03-08T15:28:07Z","email":"dsdominykas@gmail.com","login":"xddxd","name":"xddxd"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-08T19:57:35Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Move sys_crashdump to it's own file and make it a module itself","sha":"df338f05526c9e7c4f0dcdb0c223d2902eb6cef6"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-07T20:42:38Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-08T19:58:19Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"make from_hdd0_game check lowercase","sha":"1a3c01154ac2d13d14166221bf0fcad946d3a216"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/10439488?v=4","date":"2021-03-08T21:29:56Z","email":"10439488+dio-gh@users.noreply.github.com","login":"dio-gh","name":"dio-gh"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-09T00:07:32Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"fix debugger instr coloring\n\nFixes the missing color highlights from the currently executing instruction and the breakpoints.","sha":"aad06faf1f0a4282010481ac8df8004c269d00a6"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/10439488?v=4","date":"2021-03-08T22:06:15Z","email":"10439488+dio-gh@users.noreply.github.com","login":"dio-gh","name":"dio-gh"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-09T00:07:32Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"fix colors for skyline (bright)\n\nFixes debugger colors and the notice-level log message colors, the latter to the gray that is noted in the color palette.","sha":"324fa10918572f7569f4d7281255f7c3641c11f1"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/10439488?v=4","date":"2021-03-08T22:07:01Z","email":"10439488+dio-gh@users.noreply.github.com","login":"dio-gh","name":"dio-gh"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-09T00:07:32Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"fix colors for skyline (dark)\n\nFixes debugger colors in the dark Skyline stylesheet.","sha":"5dfe3f414d649ad9d7bcef6e71fabe5a8b3b2d40"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-07T15:48:43Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-09T00:09:50Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Remove some redundant code\n\nPotential fix for future warnings.","sha":"5bdd1cf837ffa3a7f31334249ac5d9a850b35f98"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-07T15:49:42Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-09T00:09:50Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Add/fix warning -Wignored-qualifiers (GCC/clang)\n\nFix simple_array::const_iterator as a part of it.","sha":"53af2dbb3f517ac254a8809d89f54d07e48d02f8"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-07T16:47:29Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-09T00:10:15Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Add -Wclobbered and -Wcast-function-type (no effect)","sha":"3990e2d3e62ec83f197084da36318bc153ba85d5"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-08T20:41:23Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-09T00:10:15Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Enable -Wstrict-aliasing=1 (GCC)\n\nFixed partially.","sha":"a4fdbf0a8879abead165f350b286409da5d8c8a3"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-09T12:50:58Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-03-09T12:50:58Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"Workaround segfaults in Vulkan enumeration thread (#9935)\n\n* Workaround segfaults in Vulkan enumeration thread","sha":"52a0b38379718fbda3fb47d6fbeb22ab4b33f2b5"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-01T12:03:00Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-09T12:54:04Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Add -Wnull-dereference (commented out)","sha":"19b5b47b26e7f68b2a6ee83b862001c386eeebbd"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-09T11:02:07Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-09T12:54:04Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Fixup write_gather (Linux, BSD)\n\nSplit iovec into small portions (256 for now)","sha":"a6350d5dd1aa4e9f0ad5645b56ebbd268b53d3e1"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-09T16:19:24Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-09T16:19:24Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Revert changes in BufferUtils.cpp\n\nShould fix #9933","sha":"9cbe77904def228097cb5488a25a046e83aa7686"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-09T23:58:08Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-03-09T23:58:08Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"Move code to cpp (#9938)\n\n* GL: move GLOverlays code to cpp\r\n* GL: move GLCompute code to cpp\r\n* VK: move VKOverlays code to cpp\r\n* VK: move VKCompute code to cpp","sha":"cbd895a29c86f4e044ca00d55dff12e3705897ee"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-10T08:43:23Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-10T10:41:13Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"PPU interpreter hotfix","sha":"63ecb56b51fecac82d3748a6e09a4372b8bda0ef"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-10T12:54:32Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-10T13:02:00Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Implement utils::bless (pointer cast)\n\nTries to workaround strict aliasing troubles.\nDon't confuse with std::bless which works differently.","sha":"03332c340d9e5487bf7f3727abef553235e47f1a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-10T13:11:30Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-10T13:11:30Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Fix std::bit_cast misuse","sha":"4adf4120495cd6a866a8bfb0a72cfb1fe183764d"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-10T23:26:39Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-03-10T23:26:39Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"Improve TAR loader (#9908)\n\n* Fix header magic test.\r\n* Rewrite code to not use so many filesystem calls.\r\n* Add many more error checks.\r\n* Add missing NUL filetype.\r\n* octalToDecimal(header.size) has been fixed to use fixed 12 characters range instead of endless string.\r\n* Add many optimizations.\r\n* Fix possible signed overflows with int, use the unisgned u64 type instead which allows for greater files as well.\r\n* Log errors.","sha":"0958c10f88de148931576315e6e46d6dd2d24dbd"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/2504890?v=4","date":"2021-03-11T10:56:17Z","email":"arabek@users.noreply.github.com","login":"arabek","name":"arabek"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-11T11:33:04Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Use maybe_unused macro for chip var\n\nVar chip is only used in the WIN32 ifdef block - use maybe_unused to silence the compiler warning about unused variable.","sha":"bdefeaf6f96fe6da9a48508c3590c22a14699900"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-08T16:43:35Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-11T12:23:58Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Loader: Log FNID of imported/exported functions","sha":"cfa2d4aaa8a675fd315bcd532d1f890d385ce2ec"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-09T19:40:14Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-11T19:48:12Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Overlays: Implement individual pulse","sha":"40f3adc45f328825dbc8f4da616a68cfd39b7c2b"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-01T11:58:13Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-11T19:55:06Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Add information about unnamed/main threads in logs and fatal dialog\n\n* If thread is unnamed, keep log name empty for main thread, otherwise print thread id. In fatal dialog, main thread can be handled differently (with special remark that it's main thread).\n* Always print thread id in fatal dialog, regardless of thread type.\n\nCo-authored-by: Nekotekina <nekotekina@gmail.com>","sha":"cd6ef2958b7e70de0c6e7a23e303c1ecf0768ba0"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-28T18:11:33Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Add the async task scheduler","sha":"77e312fb9993a363ff22d8de90ca29fc42ab8c15"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-28T18:42:18Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Lazy-initialize image resource on first use when owned by a separate queue","sha":"d2993474fbc8855cc62c0f79aab47a7e945629f3"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-28T19:00:46Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Sync main pipe with async jobs if any","sha":"41f5158247a9bcf087b397501b5a0619d665026b"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-28T19:18:14Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Properly clean up async scheduler","sha":"c9e8b87c6013ff219b08e511ff79c9f08c197ac6"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-02-28T19:34:01Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Optimization - avoid touching the mutex at all if possible even when there is no contention","sha":"589ac1c5d4184f7e7a3193c05599e01d560ffbaa"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-02T21:52:04Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Flip on async texture uploads","sha":"b4e821c28d82e0ef0575a8c69bbab6abcf2058c6"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-03T21:23:23Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Support new fxo usage pattern","sha":"585837a3f0721efc95c8f9fa0af47ea9b916de8e"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-03T21:23:52Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Tune event polling for higher throughput","sha":"bd6c187fcdd3e53fd7010413efc2b900692ec1fe"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-08T17:22:02Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Add an alternate async queue scheduler\n\n- This version violates spec but does not rely on CPU threads to keep the GPU from hanging. It's ironically much safer to use.","sha":"48d0f80a865a15aa6618da550259fc59c990e37d"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-08T17:47:37Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Add options to system configuration","sha":"7d5a72c9e08e5bb3ec47382a6513eb61cfc1d765"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-08T19:57:28Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"Basic fixups","sha":"3e8a00d2641bd0b308929c907f6947232cc48099"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-09T21:46:03Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Solve GPU hang/reset due to waiting on events that are never signaled\n\n- TODO: Some refactoring may be required to pair the primary and secondary CB and avoid such blunders","sha":"608f8de347501c9bfbf4ef875ec0c01243ac3473"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-10T20:30:39Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Check for uninitialized target before going into any scaling op","sha":"a5f0faefc36848a9afad54776bb63feaeb39a51f"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T19:40:33Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-11T23:27:05Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"Add asynchronous streaming to the GUI and auto-enable it\n\n- Hopefully not many users are on very weak GPUs","sha":"140c5bfc3e3b8547773eb147713ad9b7bb95ea17"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-12T08:18:50Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-12T10:01:12Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"debugger: Fix PPU threads pausing","sha":"729cd9284edbac224cff603b66f5115e0000d924"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-12T08:15:24Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-12T18:01:48Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix sysutil_send_system_cmd at Emu.Stop()","sha":"923ba6f3bb413f13076863821efd730b36c32094"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/154165?v=4","date":"2021-03-12T23:11:02Z","email":"154165+jtscott@users.noreply.github.com","login":"jtscott","name":"jtscott"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-13T00:16:01Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Resolve minor typo 'verion'","sha":"e3a7fddddfb0142645405735419deb7c56905b29"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-12T17:52:22Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-13T09:19:39Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Import Custom Icons","sha":"8c139206d7cfdccc9c2dd4b9eddd4ca2c2d781cf"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-12T20:10:11Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-13T09:19:39Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Center Custom Icons","sha":"161d8ef47a393d7d47929112779db30c8cfcd06b"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-12T21:24:35Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-13T09:19:39Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Option for Custom Icons","sha":"8d0947f07f4c2f434281f97df81c49f307c07014"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-12T22:16:41Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-13T09:19:39Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Fix square custom icons","sha":"c0d823f1d842cc4ad2bb71ff55fddcaa33dd4be9"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-13T01:51:40Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-13T10:51:40Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"GUI: Handle uppercase RAP file extension","sha":"d1e07434a163b639908f5cb05aece1e2f3969c16"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-13T05:51:35Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-13T10:51:40Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"GUI: Handle all PUP files in drag-and-drop","sha":"bdf6a1c70e3f9247f6a07cafdbfcde7b9db2938f"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-13T06:19:22Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-13T10:51:40Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"GUI: Atomic RAP file installation","sha":"7a7b168af312d2d7f841b99a10602e8168f28851"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-13T06:21:18Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-13T10:51:40Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"SCE Decryption: Detect illegal RAP files","sha":"aff63028d4f493066580fc4727132374eaeeb28f"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-13T15:02:37Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-13T15:02:37Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Continue fixing strict aliasing warnings","sha":"c22e1e71f0bb5f9e77f0e136bd97089c1b301643"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-13T15:03:08Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-13T15:03:08Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Enable -Wduplicated-branches (GCC)","sha":"ccdea1c4ad67431d3ba2460d8aab49f27d110da3"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-13T15:46:59Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-13T15:46:59Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Enable -Wduplicated-cond (GCC)","sha":"0327ecc5c108189c939a63ae2112b396668ef82a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-13T20:01:37Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-13T20:01:37Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Enable -Wtautological-compare","sha":"bb9b5e6affff63b5b9aaaeb6dcd59a20c1840baf"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-14T12:20:40Z","email":"karokidii@gmail.com","login":"kd-11","name":"kd-11"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/15904127?v=4","date":"2021-03-14T13:39:55Z","email":"15904127+kd-11@users.noreply.github.com","login":"kd-11","name":"kd-11"},"msg":"vk: Disable async streaming by default","sha":"c9214ce6c002bb62fac80afd44cb3b36c3822ecb"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-13T15:46:22Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T15:46:16Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Import Custom Shader Loading Icons\n\nand refactor icon import","sha":"2239a52e9be4ffb0431a5b84eb1d73a0599f7278"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T09:24:14Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T15:46:16Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Fix game icon canvas size","sha":"8b0cd60be99ab481b7205b4760b97445f0152a56"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T10:38:01Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T15:46:16Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"overlays: Fix aspect ratio of custom bakground images","sha":"1a5a0f5eca8f665402a8884621460ebb0e23fb3f"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T11:13:20Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T15:46:16Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"workaround for clang compilation","sha":"c1de0bc28c5e1d03ad6d5a807288283598d31ed1"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T17:42:25Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T18:56:11Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Fix PaintedPixmap crash if icon is null","sha":"1e09be19f57c0dcedc718e5299889fa30d929bc1"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T17:53:55Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T18:56:11Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Fix wide game icons (weird copy pasta error)","sha":"f83b19cecf5560d4ffcdec2e526a5e463a607459"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T18:27:02Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-14T18:56:11Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: dont scale small icons, deal with size instead","sha":"f93dbb8f49e1c5f1ad83277c67c2f787a87d2fa1"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/27760396?v=4","date":"2021-03-14T20:48:50Z","email":"shockdudex@gmail.com","login":"shockdude","name":"shockdude"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-03-14T20:48:50Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"sys_usbd: DJ Hero Turntable Emulation (#9965)\n\n* Initial Turntable Emulation","sha":"6a14849381ffdc7ad954812cc095c2681d9c4fdc"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-15T15:38:07Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-15T17:41:33Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Thread.cpp: Add missing newline","sha":"a5bb925a3d909342dbfe388a70f5aff06030739b"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-15T19:31:05Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-15T19:31:05Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"SPIRV: disable error on warnings","sha":"1b6c14be8da691cc9f3252a6f5da50764973474d"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-15T20:25:46Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-15T21:41:00Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: add bright arrows for tree views","sha":"f8e9ea45ba115c55a24f7977855211a91509e132"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-16T11:03:58Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-03-16T11:03:58Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"Improve fs::container_stream::write (#9976)\n\nAdd overflow condition.","sha":"4c7fc8a70a9f14d4faaa8d489429cfefd5cdff1f"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-16T13:20:45Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-03-16T13:20:45Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"PPU Debugger: Fixup for syscall arguments (#9932)","sha":"a9b0d25c01a5aa351d8154cc367253ddb84851b3"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-12T14:25:03Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-16T16:31:52Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Make gamedata installation atomic as real PS3","sha":"d7b47530070db9855db5ef33351a3cfdd23a00a2"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-16T13:25:31Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-16T16:31:52Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix sys_raw_spu_destroy","sha":"8716ac554fcbab9afa15996f2f71807f45cf21d0"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-16T13:41:32Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-16T16:33:37Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Save all 8 syscall_args","sha":"f801dc65585056dab67bd477662ba4b7f4e1e0d9"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-16T16:37:00Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-16T16:37:03Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Implement lv2_mp_flag::cache\n\nIdentify /dev_hdd1 without unsafe path comparison.","sha":"8fcebebae35595d26d4453f3519ed91779a6e0e3"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-16T23:39:25Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-17T07:49:03Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: make some scrollbars thicker.\n\nHow are we supposed to grab them if they are so tiny?","sha":"6cc5428d5e000d9ad4b802cd00ed506b35f904f2"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-17T14:19:35Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-03-17T14:19:35Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"Replace some log errors (#9980)","sha":"1213708b72e7d29b4461ec0fd4efffd926772315"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-12T06:33:38Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-17T19:31:57Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix sceNpTrophyGet(Trophy/Game)Icon","sha":"1d7fbd6a9a519a235dbd4d8018b86e1ee2407af6"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-17T20:49:43Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-17T20:49:48Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Rename and move g_tls_current_cpu_thread inside cpu_thread\n\nDon't declare extern inside get_current_cpu_thread().\nPossible workaround for gcc-11.","sha":"2decf1ecda937c4741e35976abbde066029f65c3"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-17T20:53:10Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-17T20:53:10Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Add supporters","sha":"ee4009e1239e3fb9d17f07dadab2557af4b5fa40"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-17T20:53:31Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-17T20:53:31Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Add commits","sha":"83fdcff178d91ca8eff0881fa7b768cb41d4e03a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-17T07:48:07Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-18T08:11:34Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"cellSaveDataEnableOverlay","sha":"43ac33c2b46198c6e8bde9ed9e7fb2d72bb8dc57"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-18T09:09:42Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-03-18T09:09:42Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"Fix race in render_creator (#9939)","sha":"ad49c54531d308f04f69e37ee7b3ba3f71991768"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-05T14:34:17Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-19T16:51:09Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Improve firmware installation error handling\n\n* Add new error types and descriptions.\n* Do not crash on missing 0x100 and 0x300 PUP file entries.\n* Report an error on missing PUP package inner files.\n* Fix overflow in file-size against header check.\n* Move all header errors to pup_object class.\n* Move verbose error descriptions to pup_object class.\n* Minor optimizations.","sha":"314670a34755869c57ced92ac19ca195ec492949"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-05T16:07:36Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-19T16:51:09Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"GUI: Implement full extraction of PUP\n\n* Implement full extraction of PS3UPDAT.PUP.\n* Implement TAR extraction via GUI.\n* Use VFS to implement missing PS3 filesystem characters escaping.\n* Use VFS to error on illegal paths. (illegal paths such as malware pointing to \"/../../..and so on../C:/Windows\")","sha":"a9ddb1d3b3bd38e8959a20202e5336c6a092a994"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-19T14:39:44Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-19T16:52:51Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"VS: move projects to 3rdParty","sha":"c4a8bb26fb2f7761478ec7dcf2befde61750e643"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-19T18:07:35Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-19T19:25:08Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix SPU mapped memory page size","sha":"18644195615ed4ddf31361c9cc6825cc078059a7"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-19T14:54:18Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-19T19:26:48Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Fix NtSetTimerResolution in no-gui mode (Win32)\n\nAdd dummy persistent timer with 10ms period.\nReplace QTimer invocation with Emu.CallAfter().\nThis way, headless and no-gui modes should be affected by it.","sha":"379138af2785a571da82ce787c2892a45487456b"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/3001093?v=4","date":"2020-11-26T13:22:59Z","email":"romain.tisserand@gmail.com","login":"rtissera","name":"Romain TISSERAND"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-20T10:57:04Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Add command-line option to install firmware","sha":"b5698ee101bdc9a2f5d2b60f1071f10ed9864e2c"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-20T10:17:26Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-20T10:57:04Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Make cli fw installation more foolproof","sha":"70c98fff1951bce91984052d2d72199efa637777"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/9814000?v=4","date":"2021-03-20T06:11:37Z","email":"zionnimchuk@gmail.com","login":"hcorion","name":"Zion Nimchuk"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-20T12:09:48Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Run shellcheck on all build scripts to ensure quality","sha":"ca0c4f2cc0be650824d8672c1b074fd4b5e1895b"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/9814000?v=4","date":"2021-03-20T06:13:40Z","email":"zionnimchuk@gmail.com","login":"hcorion","name":"Zion Nimchuk"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-20T12:09:48Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix some minor shellcheck errors in github upload and windows build scripts","sha":"2766e5ca6f75c0fc5682b3b2a62ecf63e3b64025"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-20T16:06:43Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-20T17:54:26Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"cfg: move get_name to _base","sha":"ae01e1d2c3942a741ff061aefb9f8ceb01f8af45"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-20T13:19:00Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-20T17:54:26Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"cfg: log unused config entries","sha":"cb9e7358d2c77e62b7f61d64da4fa32df61eaed5"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-20T17:06:45Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-20T17:54:26Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"cfg: simplify get_nodes","sha":"2c05e9719db6d30498c9009631723a1344a90463"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-21T16:18:25Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-21T17:44:11Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Allow package installation through cli\n\nAdds --installpkg cli option","sha":"554ba9d6a673f2760c0c2ce7b41ddd83fa61456a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-21T19:33:30Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-22T09:44:30Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Fix debugger step shortcuts","sha":"399f20ae54d668a1291fce6af5c138b19fd5861f"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-19T15:25:32Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-22T15:37:26Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Memory string searcher improvements\n\n* Search the entire PS3 4GB address space instead of a small area of memory which is meant mostly for PRX/SELF memory aka vm::main segment. This limitation rendered string searcher nearly useless.\n* Implement hexadecimal byte-string, hexadecimal integer, float and double value search formats.\n* Multi-thread searching.\n* Optimize searching algorithm vastly.\n* Fix crash on empty string, report an error.\n* Implement case-insensitive string search.","sha":"b0a0533a4fd0798943455c76b5b5b2aea0729d7f"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-22T18:05:48Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-22T19:19:36Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"VS: fix AdditionalIncludeDirectories","sha":"54d078f379d8d53325ce9009ba9d47a9cca0baac"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-22T18:11:45Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-22T19:19:36Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"VS: fix release Optimization","sha":"b518a9a33877150e35693e3cbd657f6e2c2c03fd"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-22T20:08:29Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-22T22:47:11Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: prepare for removal of deprecated GUI settings\n\nIf you remove a custom name and already had a deprecated name before, you'll never get rid of it.\nThis applies to all of the deprecated settings.","sha":"6892cb1c7ef3f2d67e43c538549913f7e0b9668a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-22T22:49:18Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-22T23:46:26Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"VS: fix release build","sha":"cd07ab5b5fb4dcf31fdace0e66cf43a9c013c78a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-22T23:25:51Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-23T08:11:04Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"VS: try to unbreak debug builds","sha":"dedf09017ac851e2111e9a685dbe21e0cc20c17d"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-23T10:33:07Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-03-23T10:33:07Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"debugger: Fix SPU memory viewing (#10007)\n\n* debugger: Fix SPU memory viewing\r\n\r\n* Fix terminal recovery from page faults (hack allocation)","sha":"a67b3479664de7d5b708bd69fb327e81c3ed5fe0"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-21T05:03:21Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-23T13:05:23Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Improve ELF/Trophy loader's error checking","sha":"2f333424a67084fab02e7550930ca55b36911566"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-21T15:02:21Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-23T13:40:44Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Add some warnings (GCC, clang)","sha":"e0790f758e1759e71e3b7a500f84e169205a9623"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-23T17:19:10Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-23T17:19:10Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"atomic.cpp: remove raw_notify and simplify internal logic\n\nAlso permit zero size in waiters.","sha":"820390b7eddd1d05bbd1a0e8c7773b0d35d54622"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-23T17:52:56Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-23T17:52:56Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"atomic.cpp: allow non-standard sizes in atomic wait (>16)","sha":"393f9d329dfa7de5837ac6663a2d639ad2b01cb9"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-23T17:58:42Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-23T17:58:42Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"atomic.hpp: allow raw notify_all by pointer","sha":"729757b1ddacd9de90e6688843d38167d2266c24"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-23T18:09:31Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-23T18:09:37Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"vm: fix reservation_update notification\n\nRare function.","sha":"5dc3467337162d2327cfc0544fc16a360bf54d4c"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-23T19:32:50Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-23T19:48:57Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Add and fix -Wredundant-decls (GCC)","sha":"b3fb6d7d1874f0d874fa267518ab7020260916a1"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-23T19:39:39Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-24T19:47:51Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: some cleanup in debugger","sha":"ba45daff354a7f328bbfe961d54458244f547433"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-23T19:51:39Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-24T19:47:51Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: select target item in debugger list\n\nThis should make it easier to spot the item","sha":"452fb59c7472cebd191f357641f38b6c9049207b"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-23T22:23:37Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-24T19:47:51Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Fix debugger breakpoint deletion","sha":"8d5445398143757af4475ebf6e07c1bcc6031fbb"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-20T17:58:14Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-25T19:34:00Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Remove unused GUI entries when saving a config","sha":"a7acb84b8b76e8b3adc01e7e0e11badd17166442"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/1712979?v=4","date":"2021-03-17T16:28:03Z","email":"dsdominykas@gmail.com","login":"xddxd","name":"xddxd"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-25T21:29:44Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Scheduler overhaul","sha":"9d895e6b15607826e00ce12877a78094377dd2a7"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-25T21:55:06Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-25T22:39:42Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: don't show updater if booted with cli arg","sha":"9f80a55652f1ec84c0c4bc973588e00ce1923f5e"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-25T22:52:14Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-26T08:08:30Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: clean global cfg before adding custom cfgs","sha":"6565855005a803510875a5c428418b65ff04bf11"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/1712979?v=4","date":"2021-03-26T10:36:04Z","email":"dsdominykas@gmail.com","login":"xddxd","name":"xddxd"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-26T17:56:16Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Wording changes and tooltip fix for unsupported CPUs","sha":"b978aa6dca7d077cbf43fae4246726bdb18c4033"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/1712979?v=4","date":"2021-03-26T18:53:37Z","email":"dsdominykas@gmail.com","login":"xddxd","name":"xddxd"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-28T14:24:48Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"LLVM Clang-cl support and ninja build\nAlso update the submodule","sha":"916ce7899ba431dd6914176e56be74b907dfddae"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-29T12:04:21Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-29T17:19:24Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: add option to hide the log prefix","sha":"0b2ba9823818576eae7ff211ab2355a83b826da5"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-29T14:12:41Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-29T17:19:24Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: set find_dialog \"next\" button to default","sha":"90ac24e524a3da38ae8dafddc7e8788d9bb3b438"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-29T17:20:51Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-29T18:37:33Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Properly set QT_SCALE_FACTOR_ROUNDING_POLICY","sha":"d62983e1a255fc483fb9376bf1b820d13b0f2932"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-29T17:43:00Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-29T18:37:33Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: Drop int for QT_SCALE_FACTOR_ROUNDING_POLICY","sha":"a982280400423427ba25cbd6c9ae3135b1845d28"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/10439488?v=4","date":"2021-03-27T22:07:16Z","email":"10439488+dio-gh@users.noreply.github.com","login":"dio-gh","name":"dio-gh"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-29T19:24:40Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"upgrade icons to a modern design\n\nCredits go to @DAGINATSUKO, and @hcorion for the svg version.","sha":"3e48c9744b48d0e4faa61246c9856369b9b035a9"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/1712979?v=4","date":"2021-03-29T19:45:48Z","email":"dsdominykas@gmail.com","login":"xddxd","name":"xddxd"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/19864447?v=4","date":"2021-03-29T19:45:48Z","email":"noreply@github.com","login":"web-flow","name":"GitHub"},"msg":"Get rid of non-LLVM build configurations (#10030)\n\nCo-authored-by: Megamouse <studienricky89@googlemail.com>","sha":"7cbafd603a3ee1078569d9088c0c65bed8439be3"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-29T20:21:29Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-29T21:32:15Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"add AppIcon to fatal_error_dialog","sha":"66df38957b9eb2beb38ea2b0fe16921ccfe53a97"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-02T14:56:23Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-30T07:21:54Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix Emulator::IsPaused()","sha":"aad52837869641f0252c52f7b7155e3b8cf30f19"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-02T15:00:16Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-30T07:21:54Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix Emulator::Pause race with IDM","sha":"d51bb8b1cc7972a399adfb3eaadf8d602a41f386"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-02T19:51:45Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-30T07:21:54Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Emu: Do not obey auto-exit setting after creating firmware cache","sha":"e9bea1c742afe273cff9ce0364248d9b4799f773"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-03T04:05:21Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-30T07:21:54Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix Emulator::Stop race with IDM\n\nNewly created threads' state could have not been flagged with exit.","sha":"dea1d01de2051a99a2a811e551fe9f427be36129"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-21T16:55:47Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-30T08:13:47Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"rsx: Compile shaders when CELL is not running","sha":"1e71deb0db481761db96ba495b88e4beab756387"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-29T20:05:24Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-30T08:13:47Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"thread-pool: Fix default rounding mode","sha":"5a3c218239516957502c3eae048a2447c9985702"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-29T22:24:47Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-30T17:09:01Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Qt: gs_frame position updates","sha":"e557c962fbeb319dddf7652fde9f0bea235e469e"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2019-12-04T22:17:57Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-31T07:38:30Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Emu/overlay: ingame native overlay PPU compilation","sha":"870224cde007d65edc335d5211b8391883b59115"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-29T13:20:10Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-31T08:27:09Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Enable -Wdeprecated-copy\n\nSome classes violated the Rule of 3(5) in their special operator definitions.","sha":"deacf057698d9fc5746333bf01f26e7de6a3c569"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-30T15:31:46Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-31T08:27:09Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"msg":"Fix some -Weffc++ warnings (part 1)","sha":"2212a131ef049d261f901b412c76a0790830a4c2"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-03-31T13:31:21Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Nekotekina"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-03-31T21:40:09Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Implement scoped_progress_dialog\n\nCreate Emu/system_progress.hpp\nRemove atomic g_progr_show","sha":"e9a45a2f45e32bda9102cb18c8c99da2b98e22cb"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-31T18:17:40Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-04-01T11:09:02Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Fix #9879 and fix firmware confirmation dialog when auto-start is disabled","sha":"55c98bfaefa62eeaceb4234088c2c38ba583a8f7"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-03-31T17:08:01Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-04-01T16:11:55Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"debugger: Implement ability to pause entire emulation on breakpoint","sha":"7b57b8f2cac6d00136b457e554ff33b069d1bf6a"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-04-02T00:46:07Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-04-02T05:14:23Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Move system info to extra line","sha":"98687d474b51a00316e89b0ecc1a7e0966e09965"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-04-01T22:54:32Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-04-02T09:50:28Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"cli: set user-id per command line","sha":"9c7230e79faf26b903c9d632bdbef0f3929de740"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-04-02T16:09:52Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-04-02T18:54:33Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Set userland firmware SPRX directory as the default PS3 decryption tool path","sha":"a1d31f640ac75c78cf304a7f697c0565c45e2993"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-04-02T04:52:55Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/23019877?v=4","date":"2021-04-03T06:47:58Z","email":"studienricky89@googlemail.com","login":"Megamouse","name":"Megamouse"},"msg":"Output all fatal log messages to Console/debugger as well","sha":"73320d4180b7210226ecba048a80232f5453a00e"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-04-02T17:39:47Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-04-03T14:23:40Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Implement get_cellos_appname()\n\nIdentifying vsh.self and possibly other operating system executables in the future.","sha":"878da3b474f19a976b9afc52011a547cb192458c"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-04-02T15:33:22Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-04-03T14:23:40Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Implement _sys_prx_register_module loading imports/exports functionality","sha":"32116086b3164529bc769cdc59b2391886c919c9"}
|
||||
{"author":{"avatar":"https://avatars.githubusercontent.com/u/18193363?v=4","date":"2021-04-02T16:00:09Z","email":"elad3356p@gmail.com","login":"elad335","name":"Eladash"},"committer":{"avatar":"https://avatars.githubusercontent.com/u/6028184?v=4","date":"2021-04-03T14:23:40Z","email":"nekotekina@gmail.com","login":"Nekotekina","name":"Ivan"},"msg":"Quick sys_sm_get_params implementation","sha":"e57f36fc5bdddaab049700f1f06a74d564674158"}
|
||||
|
||||
Binary file not shown.
+28
-4
@@ -1,7 +1,7 @@
|
||||
# Check and configure compiler options for RPCS3
|
||||
|
||||
if(MSVC)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:throwingNew /constexpr:steps16777216 /D _CRT_SECURE_NO_DEPRECATE=1 /D _CRT_NON_CONFORMING_SWPRINTFS=1 /D _SCL_SECURE_NO_WARNINGS=1")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:throwingNew- /constexpr:steps16777216 /D _CRT_SECURE_NO_DEPRECATE=1 /D _CRT_NON_CONFORMING_SWPRINTFS=1 /D _SCL_SECURE_NO_WARNINGS=1")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D NOMINMAX /D _ENABLE_EXTENDED_ALIGNED_STORAGE=1 /D _HAS_EXCEPTIONS=0 /MT")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libc.lib /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /DYNAMICBASE:NO /BASE:0x10000 /FIXED")
|
||||
@@ -27,20 +27,44 @@ else()
|
||||
add_compile_options(-fstack-protector)
|
||||
add_compile_options(-msse -msse2 -mcx16)
|
||||
|
||||
if ((${CMAKE_CXX_COMPILER_ID} MATCHES "GNU") AND (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.1))
|
||||
add_compile_options(-fconcepts)
|
||||
endif()
|
||||
|
||||
add_compile_options(-Werror=old-style-cast)
|
||||
add_compile_options(-Werror=sign-compare)
|
||||
add_compile_options(-Werror=reorder)
|
||||
add_compile_options(-Werror=return-type)
|
||||
add_compile_options(-Werror=overloaded-virtual)
|
||||
add_compile_options(-Werror=missing-noreturn)
|
||||
add_compile_options(-Wunused-parameter)
|
||||
add_compile_options(-Wignored-qualifiers)
|
||||
add_compile_options(-Wredundant-move)
|
||||
add_compile_options(-Wcast-qual)
|
||||
add_compile_options(-Wdeprecated-copy)
|
||||
add_compile_options(-Wtautological-compare)
|
||||
#add_compile_options(-Wshadow)
|
||||
#add_compile_options(-Wconversion)
|
||||
#add_compile_options(-Wpadded)
|
||||
add_compile_options(-Wempty-body)
|
||||
add_compile_options(-Wredundant-decls)
|
||||
#add_compile_options(-Weffc++)
|
||||
|
||||
add_compile_options(-Wstrict-aliasing=1)
|
||||
#add_compile_options(-Wnull-dereference)
|
||||
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
add_compile_options(-Werror=inconsistent-missing-override)
|
||||
elseif(CMAKE_COMPILER_IS_GNUCXX)
|
||||
elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
|
||||
add_compile_options(-Werror=suggest-override)
|
||||
add_compile_options(-Wclobbered)
|
||||
add_compile_options(-Wcast-function-type)
|
||||
add_compile_options(-Wduplicated-branches)
|
||||
add_compile_options(-Wduplicated-cond)
|
||||
endif()
|
||||
|
||||
#TODO Clean the code so these are removed
|
||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.1 OR NOT CMAKE_COMPILER_IS_GNUCXX)
|
||||
if (NOT (${CMAKE_CXX_COMPILER_ID} MATCHES "GNU") OR (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.1))
|
||||
add_compile_options(-Wno-attributes)
|
||||
endif()
|
||||
|
||||
@@ -50,7 +74,7 @@ else()
|
||||
add_compile_options(-Wno-unused-private-field)
|
||||
add_compile_options(-Wno-delete-non-virtual-dtor)
|
||||
add_compile_options(-Wno-unused-command-line-argument)
|
||||
elseif(CMAKE_COMPILER_IS_GNUCXX)
|
||||
elseif(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
|
||||
add_compile_options(-Wno-class-memaccess)
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<!-- Common default props for defining properties without macros. Import right before Microsoft.Cpp.Default.props -->
|
||||
<ImportGroup Label="PropertySheets" />
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Label="Globals">
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Label="Configuration">
|
||||
<!-- Spectre mitigation is disabled by default unless WDK is installed -->
|
||||
<SpectreMitigation>false</SpectreMitigation>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<LanguageStandard>stdcpplatest</LanguageStandard>
|
||||
<PreprocessorDefinitions>_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING=1;_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>false</ExceptionHandling>
|
||||
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
|
||||
<RuntimeLibrary Condition = "$(Configuration.Contains('Release'))">MultiThreaded</RuntimeLibrary>
|
||||
<RuntimeLibrary Condition = "$(Configuration.Contains('Debug'))">MultiThreadedDebug</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup />
|
||||
</Project>
|
||||
+1
-1
Submodule llvm updated: 716bb292ba...4d88105d4a
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user