Compare commits

...

15 Commits

Author SHA1 Message Date
dependabot[bot]
c8141261f2 actions: Bump the ci-deps group with 3 updates (#13244)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-14 12:15:08 -04:00
KamFretoZ
9c7750b85d OSD: Add Accessories type indicator to USB Input OSD 2025-09-14 12:10:19 -04:00
chaoticgd
bf10b55aa1 PINE: Use the correct naming convention for static globals 2025-09-13 14:45:10 -04:00
chaoticgd
43d9ea99b0 PINE: Don't crash with SIGPIPE if the client dies while writing 2025-09-13 14:45:10 -04:00
Ziemas
37f28e95b6 Core: Calculate EE/IOPmemSize based on structs 2025-09-11 12:45:12 +02:00
Ziemas
1870193615 Core: Fix EEmemSize
It's got desynced from the actual size of the EEVM_MemoryAllocMess
struct at some point.
2025-09-11 12:45:12 +02:00
lightningterror
189374d19c GS: Bump shader cache version.
Forgot to re include it when I reset the commit.
2025-09-09 20:32:25 +02:00
lightningterror
ac04695edd GS/shaders: Fix false positive warning for pow being negative.
Replaced pow with exp2 log2.
2025-09-09 20:29:02 +02:00
lightningterror
93bf9db0b4 GS/shaders: Fix types mismatch for ps_convert_rgb5a1_8i shader.
Fixes shader compile errors and warnings on mesa, also synch vk and dx shaders for consistency.
2025-09-09 20:29:02 +02:00
PCSX2 Bot
9219a1a38b [ci skip] PAD: Update to latest controller database. 2025-09-08 18:15:01 +02:00
PCSX2 Bot
1a28d6f0d1 [ci skip] Qt: Update Base Translation. 2025-09-08 18:14:48 +02:00
JordanTheToaster
aca1b4478e Deps: Update SDL3 to v3.2.22 2025-09-07 10:30:26 -04:00
TheTechnician27
9a794f7aaa CDVD: Add message for attempting to remove a disc when no disc exists 2025-09-07 10:29:55 -04:00
TheTechnician27
6e65558d42 Hotkeys: Better organize hotkeys page 2025-09-07 10:28:52 -04:00
JordanTheToaster
74936f49e0 GameDB: Deadly Strike fixes 2025-09-02 14:50:37 +02:00
62 changed files with 1867 additions and 501 deletions

View File

@@ -68,7 +68,7 @@ jobs:
mv ./release-notes.md ${GITHUB_WORKSPACE}/release-notes.md
- name: Create a GitHub Release (Manual)
uses: softprops/action-gh-release@72f2c25fcb47643c292f7107632f7a47c1df5cd8
uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836
if: steps.tag_version.outputs.new_tag && github.event_name == 'workflow_dispatch'
with:
body_path: ./release-notes.md
@@ -77,7 +77,7 @@ jobs:
tag_name: ${{ steps.tag_version.outputs.new_tag }}
- name: Create a GitHub Release (Push)
uses: softprops/action-gh-release@72f2c25fcb47643c292f7107632f7a47c1df5cd8
uses: softprops/action-gh-release@6cbd405e2c4e67a21c47fa9e383d020e4e28b836
if: steps.tag_version.outputs.new_tag && github.event_name != 'workflow_dispatch'
with:
body_path: ./release-notes.md
@@ -203,7 +203,7 @@ jobs:
echo "TAG_VAL=${TAG_VAL}"
gh release edit ${TAG_VAL} --draft=false --repo PCSX2/pcsx2
- uses: actions/setup-node@v4
- uses: actions/setup-node@v5
with:
node-version: 22

View File

@@ -20,7 +20,7 @@ LIBBACKTRACE=ad106d5fdd5d960bd33fae1c48a351af567fd075
LIBJPEGTURBO=3.1.1
LIBPNG=1.6.50
LIBWEBP=1.6.0
SDL=SDL3-3.2.20
SDL=SDL3-3.2.22
QT=6.9.2
LZ4=1.10.0
ZSTD=1.5.7
@@ -43,7 +43,7 @@ fd6f417fe9e3a071cf1424a5152d926a34c4a3c5070745470be6cf12a404ed79 $LIBBACKTRACE.
aadc97ea91f6ef078b0ae3a62bba69e008d9a7db19b34e4ac973b19b71b4217c libjpeg-turbo-$LIBJPEGTURBO.tar.gz
4df396518620a7aa3651443e87d1b2862e4e88cad135a8b93423e01706232307 libpng-$LIBPNG.tar.xz
e4ab7009bf0629fd11982d4c2aa83964cf244cffba7347ecd39019a9e38c4564 libwebp-$LIBWEBP.tar.gz
467600ae090dd28616fa37369faf4e3143198ff1da37729b552137e47f751a67 $SDL.tar.gz
f29d00cbcee273c0a54f3f32f86bf5c595e8823a96b1d92a145aac40571ebfcc $SDL.tar.gz
537512904744b35e232912055ccf8ec66d768639ff3abe5788d90d792ec5f48b lz4-$LZ4.tar.gz
eb33e51f49a15e023950cd7825ca74a4a2b43db8354825ac24fc1b7ee09e6fa3 zstd-$ZSTD.tar.gz
44be9c9ecfe04129c4dea0a7e1b36ad476c9cc07c292016ac98e7b41514f2440 qtbase-everywhere-src-$QT.tar.xz

View File

@@ -14,8 +14,8 @@
"sources": [
{
"type": "archive",
"url": "https://libsdl.org/release/SDL3-3.2.20.tar.gz",
"sha256": "467600ae090dd28616fa37369faf4e3143198ff1da37729b552137e47f751a67"
"url": "https://libsdl.org/release/SDL3-3.2.22.tar.gz",
"sha256": "f29d00cbcee273c0a54f3f32f86bf5c595e8823a96b1d92a145aac40571ebfcc"
}
],
"cleanup": [

View File

@@ -40,7 +40,7 @@ fi
FREETYPE=2.13.3
HARFBUZZ=11.2.0
SDL=SDL3-3.2.20
SDL=SDL3-3.2.22
ZSTD=1.5.7
LZ4=1.10.0
LIBPNG=1.6.50
@@ -79,7 +79,7 @@ CMAKE_ARCH_UNIVERSAL=-DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
cat > SHASUMS <<EOF
0550350666d427c74daeb85d5ac7bb353acba5f76956395995311a9c6f063289 freetype-$FREETYPE.tar.xz
16c0204704f3ebeed057aba100fe7db18d71035505cb10e595ea33d346457fc8 harfbuzz-$HARFBUZZ.tar.gz
467600ae090dd28616fa37369faf4e3143198ff1da37729b552137e47f751a67 $SDL.tar.gz
f29d00cbcee273c0a54f3f32f86bf5c595e8823a96b1d92a145aac40571ebfcc $SDL.tar.gz
eb33e51f49a15e023950cd7825ca74a4a2b43db8354825ac24fc1b7ee09e6fa3 zstd-$ZSTD.tar.gz
537512904744b35e232912055ccf8ec66d768639ff3abe5788d90d792ec5f48b lz4-$LZ4.tar.gz
4df396518620a7aa3651443e87d1b2862e4e88cad135a8b93423e01706232307 libpng-$LIBPNG.tar.xz

View File

@@ -22,7 +22,7 @@ fi
FREETYPE=2.13.3
HARFBUZZ=11.2.0
SDL=SDL3-3.2.20
SDL=SDL3-3.2.22
ZSTD=1.5.7
LZ4=1.10.0
LIBPNG=1.6.50
@@ -59,7 +59,7 @@ CMAKE_COMMON=(
cat > SHASUMS <<EOF
0550350666d427c74daeb85d5ac7bb353acba5f76956395995311a9c6f063289 freetype-$FREETYPE.tar.xz
16c0204704f3ebeed057aba100fe7db18d71035505cb10e595ea33d346457fc8 harfbuzz-$HARFBUZZ.tar.gz
467600ae090dd28616fa37369faf4e3143198ff1da37729b552137e47f751a67 $SDL.tar.gz
f29d00cbcee273c0a54f3f32f86bf5c595e8823a96b1d92a145aac40571ebfcc $SDL.tar.gz
eb33e51f49a15e023950cd7825ca74a4a2b43db8354825ac24fc1b7ee09e6fa3 zstd-$ZSTD.tar.gz
537512904744b35e232912055ccf8ec66d768639ff3abe5788d90d792ec5f48b lz4-$LZ4.tar.gz
4df396518620a7aa3651443e87d1b2862e4e88cad135a8b93423e01706232307 libpng-$LIBPNG.tar.xz

View File

@@ -46,7 +46,7 @@ set FREETYPE=2.13.3
set HARFBUZZ=11.2.0
set LIBJPEGTURBO=3.1.1
set LIBPNG=1650
set SDL=SDL3-3.2.20
set SDL=SDL3-3.2.22
set QT=6.9.2
set QTMINOR=6.9
set LZ4=1.10.0
@@ -68,7 +68,7 @@ call :downloadfile "harfbuzz-%HARFBUZZ%.zip" https://github.com/harfbuzz/harfbuz
call :downloadfile "lpng%LIBPNG%.zip" https://download.sourceforge.net/libpng/lpng1650.zip 4be6938313b08d5921f9dede13f2789b653c96f4f8595d92ff3f09c9320e51c7 || goto error
call :downloadfile "libjpeg-turbo-%LIBJPEGTURBO%.tar.gz" "https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/%LIBJPEGTURBO%/libjpeg-turbo-%LIBJPEGTURBO%.tar.gz" aadc97ea91f6ef078b0ae3a62bba69e008d9a7db19b34e4ac973b19b71b4217c || goto error
call :downloadfile "libwebp-%WEBP%.tar.gz" "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-%WEBP%.tar.gz" e4ab7009bf0629fd11982d4c2aa83964cf244cffba7347ecd39019a9e38c4564 || goto error
call :downloadfile "%SDL%.zip" "https://libsdl.org/release/%SDL%.zip" d76454913ea6f5f38856fbf00578d8e39daf842887f3396c95608414680250f7 || goto error
call :downloadfile "%SDL%.zip" "https://libsdl.org/release/%SDL%.zip" 3d60068b1e5c83c66bb14c325dfef46f8fcc380735b4591de6f5e7b9738929d1 || goto error
call :downloadfile "qtbase-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtbase-everywhere-src-%QT%.zip" 97d59c78e40b4ddd018738d285a12afc320b57f8265a3f760353739a3619ccdb || goto error
call :downloadfile "qtimageformats-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtimageformats-everywhere-src-%QT%.zip" f2fc6ff382c6f3af79493d0709dbd64847d0356313518f094f9096315f2fdb30 || goto error
call :downloadfile "qtsvg-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtsvg-everywhere-src-%QT%.zip" af80bb671ea0f66c0036ce7041a56b0e550fc94fb88d2c77b5b6a3e33e42139b || goto error

View File

@@ -44,7 +44,7 @@ set FREETYPE=2.13.3
set HARFBUZZ=11.2.0
set LIBJPEGTURBO=3.1.1
set LIBPNG=1650
set SDL=SDL3-3.2.20
set SDL=SDL3-3.2.22
set QT=6.9.2
set QTMINOR=6.9
set LZ4=1.10.0
@@ -66,7 +66,7 @@ call :downloadfile "harfbuzz-%HARFBUZZ%.zip" https://github.com/harfbuzz/harfbuz
call :downloadfile "lpng%LIBPNG%.zip" https://download.sourceforge.net/libpng/lpng1650.zip 4be6938313b08d5921f9dede13f2789b653c96f4f8595d92ff3f09c9320e51c7 || goto error
call :downloadfile "libjpeg-turbo-%LIBJPEGTURBO%.tar.gz" "https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/%LIBJPEGTURBO%/libjpeg-turbo-%LIBJPEGTURBO%.tar.gz" aadc97ea91f6ef078b0ae3a62bba69e008d9a7db19b34e4ac973b19b71b4217c || goto error
call :downloadfile "libwebp-%WEBP%.tar.gz" "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-%WEBP%.tar.gz" e4ab7009bf0629fd11982d4c2aa83964cf244cffba7347ecd39019a9e38c4564 || goto error
call :downloadfile "%SDL%.zip" "https://libsdl.org/release/%SDL%.zip" d76454913ea6f5f38856fbf00578d8e39daf842887f3396c95608414680250f7 || goto error
call :downloadfile "%SDL%.zip" "https://libsdl.org/release/%SDL%.zip" 3d60068b1e5c83c66bb14c325dfef46f8fcc380735b4591de6f5e7b9738929d1 || goto error
call :downloadfile "qtbase-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtbase-everywhere-src-%QT%.zip" 97d59c78e40b4ddd018738d285a12afc320b57f8265a3f760353739a3619ccdb || goto error
call :downloadfile "qtimageformats-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtimageformats-everywhere-src-%QT%.zip" f2fc6ff382c6f3af79493d0709dbd64847d0356313518f094f9096315f2fdb30 || goto error
call :downloadfile "qtsvg-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtsvg-everywhere-src-%QT%.zip" af80bb671ea0f66c0036ce7041a56b0e550fc94fb88d2c77b5b6a3e33e42139b || goto error

View File

@@ -8,7 +8,7 @@ jobs:
if: github.repository == 'PCSX2/pcsx2'
runs-on: ubuntu-latest
steps:
- uses: actions/labeler@v5
- uses: actions/labeler@v6
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -185,7 +185,24 @@
#define ICON_PF_KEYBOARD "\xE2\x90\xBD"
#define ICON_PF_MOUSE "\xE2\x90\xBE"
#define ICON_PF_MOUSE_AND_KEYBOARD "\xE2\x90\xBF"
#define ICON_PF_DUALSHOCK2 "\xE2\x91\x81"
#define ICON_PF_DUALSHOCK2_SLASH "\xE2\x91\x82"
#define ICON_PF_GUITAR "\xE2\x91\x83"
#define ICON_PF_STEERING_WHEEL_ALT "\xE2\x91\x84"
#define ICON_PF_SEGA_SEAMIC "\xE2\x91\x85"
#define ICON_PF_JOGCON "\xE2\x91\x86"
#define ICON_PF_BUZZ_CONTROLLER "\xE2\x91\x87"
#define ICON_PF_GAMETRAK_DEVICE "\xE2\x91\x88"
#define ICON_PF_DJ_HERO_TURNTABLE "\xE2\x91\x89"
#define ICON_PF_REALPLAY_BOWLING "\xE2\x91\x8A"
#define ICON_PF_NEGCON "\xE2\x91\x8B"
#define ICON_PF_REZ_VIBRATOR "\xE2\x91\x8C"
#define ICON_PF_EYETOY_WEBCAM "\xE2\x91\x8D"
#define ICON_PF_SINGSTAR_MIC "\xE2\x91\x8E"
#define ICON_PF_GUNCON2 "\xE2\x91\x8F"
#define ICON_PF_HEADSET "\xE2\x91\x90"
#define ICON_PF_KEYBOARDMANIA "\xE2\x91\x91"
#define ICON_PF_PRINTER "\xE2\x91\x92"
#define ICON_PF_F1 "\xE2\x91\xA0"
#define ICON_PF_F2 "\xE2\x91\xA1"
#define ICON_PF_F3 "\xE2\x91\xA2"
@@ -362,6 +379,7 @@
#define ICON_PF_HEARTBEAT_MAG "\xE2\x8D\xBE"
#define ICON_PF_MONITOR_CODE "\xE2\x8D\xBF"
#define ICON_PF_SIXTY_CIRCLE "\xE2\x8E\x80"
#define ICON_PF_VIDEO_CAMERA "\xE2\x8E\x81"
#define ICON_PF_SPEAKER_ALT "\xE2\x8D\xA7"
#define ICON_PF_THUNDERBOLT "\xE2\x8D\x9C"
#define ICON_PF_BACKWARD "\xE2\x8F\x8C"

File diff suppressed because it is too large Load Diff

View File

@@ -21758,6 +21758,8 @@ SLES-52954:
SLES-52955:
name: "Deadly Strike"
region: "PAL-E"
roundModes:
eeDivRoundMode: 3 # Fixes grid like pattern.
SLES-52956:
name: "Action Girlz Racing"
region: "PAL-E"
@@ -38928,6 +38930,8 @@ SLPM-62459:
name-en: "Simple 2000 Series Vol. 16 - Sengoku vs. Gendai"
region: "NTSC-J"
compat: 5
roundModes:
eeDivRoundMode: 3 # Fixes grid like pattern.
SLPM-62460:
name: "SuperLite2000 シミュレーション 箱庭鉄道 ~ブルートレイン・特急編~"
name-sort: "すーぱーらいと 2000 しみゅれーしょん はこにわてつどう ぶるーとれいんとっきゅうへん"

Binary file not shown.

View File

@@ -478,6 +478,7 @@
030000001008000001e5000000000000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Windows,
03000000050b00000045000000000000,Nexus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Windows,
03000000152000000182000000000000,NGDS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows,
03000000ec110000e1a7000000000000,Nintendo Switch,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
030000007e0500006920000000000000,Nintendo Switch 2 Pro Controller,a:b0,b:b1,back:b14,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b12,leftstick:b15,lefttrigger:b13,leftx:a0,lefty:a1~,misc1:b17,misc2:b20,paddle1:b18,paddle2:b19,rightshoulder:b4,rightstick:b7,righttrigger:b5,rightx:a2,righty:a3~,start:b6,x:b2,y:b3,platform:Windows,
030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
030000000d0500000308000000000000,Nostromo N45,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Windows,
@@ -1018,6 +1019,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
03000000632500007505000000020000,NeoGeo mini PAD Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Mac OS X,
03000000921200004b46000003020000,NES 2-port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Mac OS X,
030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Mac OS X,
03000000ec110000e1a7000001010000,Nintendo Switch,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
030000007e0500006920000001010000,Nintendo Switch 2 Pro Controller,a:b0,b:b1,back:b14,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b12,leftstick:b15,lefttrigger:b13,leftx:a0,lefty:a1~,misc1:b17,misc2:b20,paddle1:b18,paddle2:b19,rightshoulder:b4,rightstick:b7,righttrigger:b5,rightx:a2,righty:a3~,start:b6,x:b2,y:b3,platform:Mac OS X,
030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
@@ -1505,6 +1507,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
060000007e0500003713000000000000,Nintendo 3DS,a:b0,b:b1,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux,
030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux,
03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b2,y:b3,platform:Linux,
03000000ec110000e1a7000010010000,Nintendo Switch,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
030000007e0500006920000011010000,Nintendo Switch 2 Pro Controller,a:b0,b:b1,back:b14,dpdown:b8,dpleft:b10,dpright:b9,dpup:b11,guide:b16,leftshoulder:b12,leftstick:b15,lefttrigger:b13,leftx:a0,lefty:a1~,misc1:b17,misc2:b20,paddle1:b18,paddle2:b19,rightshoulder:b4,rightstick:b7,righttrigger:b5,rightx:a2,righty:a3~,start:b6,x:b2,y:b3,platform:Linux,
060000004e696e74656e646f20537700,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,
060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux,

View File

@@ -305,64 +305,64 @@ PS_OUTPUT ps_convert_rgb5a1_8i(PS_INPUT input)
uint2 pos = uint2(input.p.xy);
// Collapse separate R G B A areas into their base pixel
uint2 column = (pos & ~uint2(0u, 3u)) / uint2(1,2);
uint2 column = (pos & ~uint2(0u, 3u)) / uint2(1u, 2u);
uint2 subcolumn = (pos & uint2(0u, 1u));
column.x -= (column.x / 128) * 64;
column.y += (column.y / 32) * 32;
column.x -= (column.x / 128u) * 64u;
column.y += (column.y / 32u) * 32u;
uint PSM = uint(DOFFSET);
// Deal with swizzling differences
if ((PSM & 0x8) != 0) // PSMCT16S
if ((PSM & 0x8u) != 0u) // PSMCT16S
{
if ((pos.x & 32) != 0)
if ((pos.x & 32u) != 0u)
{
column.y += 32; // 4 columns high times 4 to get bottom 4 blocks
column.x &= ~32;
column.y += 32u; // 4 columns high times 4 to get bottom 4 blocks
column.x &= ~32u;
}
if ((pos.x & 64) != 0)
if ((pos.x & 64u) != 0u)
{
column.x -= 32;
column.x -= 32u;
}
if (((pos.x & 16) != 0) != ((pos.y & 16) != 0))
if (((pos.x & 16u) != 0u) != ((pos.y & 16u) != 0u))
{
column.x ^= 16;
column.y ^= 8;
column.x ^= 16u;
column.y ^= 8u;
}
if ((PSM & 0x30) != 0) // PSMZ16S - Untested but hopefully ok if anything uses it.
if ((PSM & 0x30u) != 0u) // PSMZ16S - Untested but hopefully ok if anything uses it.
{
column.x ^= 32;
column.y ^= 16;
column.x ^= 32u;
column.y ^= 16u;
}
}
else // PSMCT16
{
if ((pos.y & 32) != 0)
if ((pos.y & 32u) != 0u)
{
column.y -= 16;
column.x += 32;
column.y -= 16u;
column.x += 32u;
}
if ((pos.x & 96) != 0)
if ((pos.x & 96u) != 0u)
{
uint multi = (pos.x & 96) / 32;
column.y += 16 * multi; // 4 columns high times 4 to get bottom 4 blocks
column.x -= (pos.x & 96);
uint multi = (pos.x & 96u) / 32u;
column.y += 16u * multi; // 4 columns high times 4 to get bottom 4 blocks
column.x -= (pos.x & 96u);
}
if (((pos.x & 16) != 0) != ((pos.y & 16) != 0))
if (((pos.x & 16u) != 0u) != ((pos.y & 16) != 0))
{
column.x ^= 16;
column.y ^= 8;
column.x ^= 16u;
column.y ^= 8u;
}
if ((PSM & 0x30) != 0) // PSMZ16 - Untested but hopefully ok if anything uses it.
if ((PSM & 0x30u) != 0u) // PSMZ16 - Untested but hopefully ok if anything uses it.
{
column.x ^= 32;
column.y ^= 32;
column.x ^= 32u;
column.y ^= 32u;
}
}
@@ -371,10 +371,10 @@ PS_OUTPUT ps_convert_rgb5a1_8i(PS_INPUT input)
// Compensate for potentially differing page pitch.
uint SBW = uint(EMODA);
uint DBW = uint(EMODC);
uint2 block_xy = coord / uint2(64,64);
uint block_num = (block_xy.y * (DBW / 128)) + block_xy.x;
uint2 block_offset = uint2((block_num % (SBW / 64)) * 64, (block_num / (SBW / 64)) * 64);
coord = (coord % uint2(64, 64)) + block_offset;
uint2 block_xy = coord / uint2(64u, 64u);
uint block_num = (block_xy.y * (DBW / 128u)) + block_xy.x;
uint2 block_offset = uint2((block_num % (SBW / 64u)) * 64u, (block_num / (SBW / 64u)) * 64u);
coord = (coord % uint2(64u, 64u)) + block_offset;
// Apply offset to cols 1 and 2
uint is_col23 = pos.y & 4u;
@@ -394,18 +394,16 @@ PS_OUTPUT ps_convert_rgb5a1_8i(PS_INPUT input)
{
uint red = (denorm_c.r >> 3) & 0x1Fu;
uint green = (denorm_c.g >> 3) & 0x1Fu;
float sel0 = (float)(((green << 5) | red) & 0xFF) / 255.0f;
output.c = (float4)(sel0);
output.c = (float4)(((float)(((green << 5) | red) & 0xFFu)) / 255.0f);
}
else
{
uint green = (denorm_c.g >> 3) & 0x1Fu;
uint blue = (denorm_c.b >> 3) & 0x1Fu;
uint alpha = denorm_c.a & 0x80u;
float sel0 = (float)((alpha | (blue << 2) | (green >> 3)) & 0xFF) / 255.0f;
output.c = (float4)(sel0);
output.c = (float4)(((float)((alpha | (blue << 2) | (green >> 3)) & 0xFFu)) / 255.0f);
}
return output;
}

View File

@@ -37,7 +37,7 @@ float4 ContrastSaturationBrightness(float4 color) // Ported to HLSL
float3 conColor = lerp(AvgLumin, satColor, con);
float3 csb = conColor;
csb = pow(csb, 1.0 / gam);
csb = exp2(log2(csb) * (1.0 / gam));
color.rgb = csb;
return color;
}

View File

@@ -258,62 +258,62 @@ void ps_convert_rgb5a1_8i()
uvec2 pos = uvec2(gl_FragCoord.xy);
// Collapse separate R G B A areas into their base pixel
uvec2 column = (pos & ~uvec2(0u, 3u)) / uvec2(1,2);
uvec2 column = (pos & ~uvec2(0u, 3u)) / uvec2(1u, 2u);
uvec2 subcolumn = (pos & uvec2(0u, 1u));
column.x -= (column.x / 128) * 64;
column.y += (column.y / 32) * 32;
column.x -= (column.x / 128u) * 64u;
column.y += (column.y / 32u) * 32u;
// Deal with swizzling differences
if ((PSM & 0x8) != 0) // PSMCT16S
if ((PSM & 0x8u) != 0u) // PSMCT16S
{
if ((pos.x & 32) != 0)
if ((pos.x & 32u) != 0u)
{
column.y += 32; // 4 columns high times 4 to get bottom 4 blocks
column.x &= ~32;
column.y += 32u; // 4 columns high times 4 to get bottom 4 blocks
column.x &= ~32u;
}
if ((pos.x & 64) != 0)
if ((pos.x & 64u) != 0u)
{
column.x -= 32;
column.x -= 32u;
}
if (((pos.x & 16) != 0) != ((pos.y & 16) != 0))
if (((pos.x & 16u) != 0u) != ((pos.y & 16u) != 0u))
{
column.x ^= 16;
column.y ^= 8;
column.x ^= 16u;
column.y ^= 8u;
}
if ((PSM & 0x30) != 0) // PSMZ16S - Untested but hopefully ok if anything uses it.
if ((PSM & 0x30u) != 0u) // PSMZ16S - Untested but hopefully ok if anything uses it.
{
column.x ^= 32;
column.y ^= 16;
column.x ^= 32u;
column.y ^= 16u;
}
}
else // PSMCT16
{
if ((pos.y & 32) != 0)
if ((pos.y & 32u) != 0u)
{
column.y -= 16;
column.x += 32;
column.y -= 16u;
column.x += 32u;
}
if ((pos.x & 96) != 0)
if ((pos.x & 96u) != 0u)
{
uint multi = (pos.x & 96) / 32;
column.y += 16 * multi; // 4 columns high times 4 to get bottom 4 blocks
column.x -= (pos.x & 96);
uint multi = (pos.x & 96u) / 32u;
column.y += 16u * multi; // 4 columns high times 4 to get bottom 4 blocks
column.x -= (pos.x & 96u);
}
if (((pos.x & 16) != 0) != ((pos.y & 16) != 0))
if (((pos.x & 16u) != 0u) != ((pos.y & 16u) != 0u))
{
column.x ^= 16;
column.y ^= 8;
column.x ^= 16u;
column.y ^= 8u;
}
if ((PSM & 0x30) != 0) // PSMZ16 - Untested but hopefully ok if anything uses it.
if ((PSM & 0x30u) != 0u) // PSMZ16 - Untested but hopefully ok if anything uses it.
{
column.x ^= 32;
column.y ^= 32;
column.x ^= 32u;
column.y ^= 32u;
}
}
uvec2 coord = column | subcolumn;
@@ -342,18 +342,16 @@ void ps_convert_rgb5a1_8i()
{
uint red = (denorm_c.r >> 3) & 0x1Fu;
uint green = (denorm_c.g >> 3) & 0x1Fu;
float sel0 = float(((green << 5) | red) & 0xFF) / 255.0f;
SV_Target0 = vec4(sel0);
SV_Target0 = vec4(float(((green << 5) | red) & 0xFFu) / 255.0f);
}
else
{
uint green = (denorm_c.g >> 3) & 0x1Fu;
uint blue = (denorm_c.b >> 3) & 0x1Fu;
uint alpha = denorm_c.a & 0x80u;
float sel0 = float((alpha | (blue << 2) | (green >> 3)) & 0xFF) / 255.0f;
SV_Target0 = vec4(sel0);
SV_Target0 = vec4(float((alpha | (blue << 2) | (green >> 3)) & 0xFFu) / 255.0f);
}
}
#endif

View File

@@ -332,62 +332,62 @@ void ps_convert_rgb5a1_8i()
uvec2 pos = uvec2(gl_FragCoord.xy);
// Collapse separate R G B A areas into their base pixel
uvec2 column = (pos & ~uvec2(0u, 3u)) / uvec2(1,2);
uvec2 column = (pos & ~uvec2(0u, 3u)) / uvec2(1u, 2u);
uvec2 subcolumn = (pos & uvec2(0u, 1u));
column.x -= (column.x / 128) * 64;
column.y += (column.y / 32) * 32;
column.x -= (column.x / 128u) * 64u;
column.y += (column.y / 32u) * 32u;
// Deal with swizzling differences
if ((PSM & 0x8) != 0) // PSMCT16S
if ((PSM & 0x8u) != 0u) // PSMCT16S
{
if ((pos.x & 32) != 0)
if ((pos.x & 32u) != 0u)
{
column.y += 32; // 4 columns high times 4 to get bottom 4 blocks
column.x &= ~32;
column.y += 32u; // 4 columns high times 4 to get bottom 4 blocks
column.x &= ~32u;
}
if ((pos.x & 64) != 0)
if ((pos.x & 64u) != 0u)
{
column.x -= 32;
column.x -= 32u;
}
if (((pos.x & 16) != 0) != ((pos.y & 16) != 0))
if (((pos.x & 16u) != 0u) != ((pos.y & 16u) != 0u))
{
column.x ^= 16;
column.y ^= 8;
column.x ^= 16u;
column.y ^= 8u;
}
if ((PSM & 0x30) != 0) // PSMZ16S - Untested but hopefully ok if anything uses it.
if ((PSM & 0x30u) != 0u) // PSMZ16S - Untested but hopefully ok if anything uses it.
{
column.x ^= 32;
column.y ^= 16;
column.x ^= 32u;
column.y ^= 16u;
}
}
else // PSMCT16
{
if ((pos.y & 32) != 0)
if ((pos.y & 32u) != 0u)
{
column.y -= 16;
column.x += 32;
column.y -= 16u;
column.x += 32u;
}
if ((pos.x & 96) != 0)
if ((pos.x & 96u) != 0u)
{
uint multi = (pos.x & 96) / 32;
column.y += 16 * multi; // 4 columns high times 4 to get bottom 4 blocks
column.x -= (pos.x & 96);
uint multi = (pos.x & 96u) / 32u;
column.y += 16u * multi; // 4 columns high times 4 to get bottom 4 blocks
column.x -= (pos.x & 96u);
}
if (((pos.x & 16) != 0) != ((pos.y & 16) != 0))
if (((pos.x & 16u) != 0u) != ((pos.y & 16u) != 0u))
{
column.x ^= 16;
column.y ^= 8;
column.x ^= 16u;
column.y ^= 8u;
}
if ((PSM & 0x30) != 0) // PSMZ16 - Untested but hopefully ok if anything uses it.
if ((PSM & 0x30u) != 0u) // PSMZ16 - Untested but hopefully ok if anything uses it.
{
column.x ^= 32;
column.y ^= 32;
column.x ^= 32u;
column.y ^= 32u;
}
}
uvec2 coord = column | subcolumn;
@@ -410,23 +410,22 @@ void ps_convert_rgb5a1_8i()
coord *= uvec2(ScaleFactor);
vec4 pixel = texelFetch(samp0, ivec2(coord), 0);
uvec4 denorm_c = uvec4(pixel * 255.5f);
if ((pos.y & 2u) == 0u)
{
uint red = (denorm_c.r >> 3) & 0x1Fu;
uint green = (denorm_c.g >> 3) & 0x1Fu;
float sel0 = float(((green << 5) | red) & 0xFF) / 255.0f;
o_col0 = vec4(sel0);
o_col0 = vec4(float(((green << 5) | red) & 0xFFu) / 255.0f);
}
else
{
uint green = (denorm_c.g >> 3) & 0x1Fu;
uint blue = (denorm_c.b >> 3) & 0x1Fu;
uint alpha = denorm_c.a & 0x80u;
float sel0 = float((alpha | (blue << 2) | (green >> 3)) & 0xFF) / 255.0f;
o_col0 = vec4(sel0);
o_col0 = vec4(float((alpha | (blue << 2) | (green >> 3)) & 0xFFu) / 255.0f);
}
}
#endif

View File

@@ -53,16 +53,24 @@ void HotkeySettingsWidget::createButtons()
auto iter = m_categories.find(category);
if (iter == m_categories.end())
{
// Top line
QLabel* top_line = new QLabel(m_container);
top_line->setFrameShape(QFrame::HLine);
top_line->setFixedHeight(12);
m_layout->addWidget(top_line);
// Category label
QLabel* label = new QLabel(category, m_container);
QFont label_font(label->font());
label_font.setPointSizeF(14.0f);
label->setFont(label_font);
m_layout->addWidget(label);
QLabel* line = new QLabel(m_container);
line->setFrameShape(QFrame::HLine);
line->setFixedHeight(4);
m_layout->addWidget(line);
// Bottom line
QLabel* bottom_line = new QLabel(m_container);
bottom_line->setFrameShape(QFrame::HLine);
bottom_line->setFixedHeight(12);
m_layout->addWidget(bottom_line);
QGridLayout* layout = new QGridLayout();
layout->setContentsMargins(0, 0, 0, 0);

View File

@@ -16095,266 +16095,278 @@ Swap chain: see Microsoft&apos;s Terminology Portal.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="116"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="121"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="126"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="132"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="136"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="141"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="150"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="158"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="166"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="183"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="188"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="193"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="198"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="203"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="208"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="212"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="217"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="222"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="227"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="215"/>
<source>System</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="116"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="121"/>
<source>Open Pause Menu</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="122"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="127"/>
<source>Open Achievements List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="127"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="132"/>
<source>Open Leaderboards List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="132"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="137"/>
<source>Toggle Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="136"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="116"/>
<source>Toggle Fullscreen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="141"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="146"/>
<source>Toggle Frame Limit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="151"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="156"/>
<source>Toggle Turbo / Fast Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="158"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="180"/>
<source>Toggle Slow Motion</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="167"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="164"/>
<source>Turbo / Fast Forward (Hold)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="183"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="188"/>
<source>Increase Target Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="188"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="193"/>
<source>Decrease Target Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="193"/>
<source>Increase Volume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="198"/>
<source>Decrease Volume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="203"/>
<source>Toggle Mute</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="208"/>
<source>Frame Advance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="212"/>
<source>Shut Down Virtual Machine</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="217"/>
<source>Reset Virtual Machine</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="223"/>
<source>Toggle Input Recording Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="228"/>
<source>Swap Memory Cards</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="234"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="239"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="244"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="249"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="254"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="259"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="267"/>
<source>Save States</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="235"/>
<source>Select Previous Save Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="240"/>
<source>Select Next Save Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="245"/>
<source>Save State To Selected Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="250"/>
<source>Load State From Selected Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="255"/>
<source>Load Backup State From Selected Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="260"/>
<source>Save State and Select Next Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="268"/>
<source>Select Next Slot and Save State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="286"/>
<source>Save State To Slot 1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="287"/>
<source>Load State From Slot 1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="288"/>
<source>Save State To Slot 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="289"/>
<source>Load State From Slot 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="290"/>
<source>Save State To Slot 3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="291"/>
<source>Load State From Slot 3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="292"/>
<source>Save State To Slot 4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="293"/>
<source>Load State From Slot 4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="294"/>
<source>Save State To Slot 5</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="295"/>
<source>Load State From Slot 5</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="296"/>
<source>Save State To Slot 6</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="297"/>
<source>Load State From Slot 6</source>
<location filename="../../pcsx2/Hotkeys.cpp" line="298"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="303"/>
<source>Audio</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="298"/>
<source>Save State To Slot 7</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="299"/>
<source>Load State From Slot 7</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="300"/>
<source>Save State To Slot 8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="301"/>
<source>Load State From Slot 8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="302"/>
<source>Save State To Slot 9</source>
<source>Increase Volume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="303"/>
<source>Decrease Volume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="294"/>
<source>Toggle Mute</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="142"/>
<source>Frame Advance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="198"/>
<source>Shut Down Virtual Machine</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="203"/>
<source>Reset Virtual Machine</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="216"/>
<source>Toggle Input Recording Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="209"/>
<source>Swap Memory Cards</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="116"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="121"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="126"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="131"/>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="137"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="142"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="146"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="155"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="163"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="180"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="188"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="193"/>
<source>Speed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="220"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="225"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="230"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="235"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="240"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="245"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="253"/>
<source>Save States</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="221"/>
<source>Select Previous Save Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="226"/>
<source>Select Next Save Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="231"/>
<source>Save State To Selected Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="236"/>
<source>Load State From Selected Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="241"/>
<source>Load Backup State From Selected Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="246"/>
<source>Save State and Select Next Slot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="254"/>
<source>Select Next Slot and Save State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="272"/>
<source>Save State To Slot 1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="273"/>
<source>Load State From Slot 1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="274"/>
<source>Save State To Slot 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="275"/>
<source>Load State From Slot 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="276"/>
<source>Save State To Slot 3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="277"/>
<source>Load State From Slot 3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="278"/>
<source>Save State To Slot 4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="279"/>
<source>Load State From Slot 4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="280"/>
<source>Save State To Slot 5</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="281"/>
<source>Load State From Slot 5</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="282"/>
<source>Save State To Slot 6</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="283"/>
<source>Load State From Slot 6</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="284"/>
<source>Save State To Slot 7</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="285"/>
<source>Load State From Slot 7</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="286"/>
<source>Save State To Slot 8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="287"/>
<source>Load State From Slot 8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="288"/>
<source>Save State To Slot 9</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="289"/>
<source>Load State From Slot 9</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="304"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="290"/>
<source>Save State To Slot 10</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/Hotkeys.cpp" line="305"/>
<location filename="../../pcsx2/Hotkeys.cpp" line="291"/>
<source>Load State From Slot 10</source>
<translation type="unfinished"></translation>
</message>
@@ -24022,74 +24034,74 @@ Please consult the FAQs and Guides for further instructions.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2254"/>
<location filename="../../pcsx2/VMManager.cpp" line="2259"/>
<source>Disc removed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2260"/>
<location filename="../../pcsx2/VMManager.cpp" line="2267"/>
<source>Disc changed to &apos;{}&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2269"/>
<location filename="../../pcsx2/VMManager.cpp" line="2276"/>
<source>Failed to open new disc image &apos;{}&apos;. Reverting to old image.
Error was: {}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="2278"/>
<location filename="../../pcsx2/VMManager.cpp" line="2285"/>
<source>Failed to switch back to old disc image. Removing disc.
Error was: {}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3081"/>
<location filename="../../pcsx2/VMManager.cpp" line="3088"/>
<source>Cheats have been disabled due to achievements hardcore mode.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3134"/>
<location filename="../../pcsx2/VMManager.cpp" line="3141"/>
<source>Fast CDVD is enabled, this may break games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3138"/>
<location filename="../../pcsx2/VMManager.cpp" line="3145"/>
<source>Cycle rate/skip is not at default, this may crash or make games run too slow.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3148"/>
<location filename="../../pcsx2/VMManager.cpp" line="3155"/>
<source>Upscale multiplier is below native, this will break rendering.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3188"/>
<location filename="../../pcsx2/VMManager.cpp" line="3195"/>
<source>Mipmapping is disabled. This may break rendering in some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3193"/>
<location filename="../../pcsx2/VMManager.cpp" line="3200"/>
<source>Debug device is enabled. This will massively reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3202"/>
<location filename="../../pcsx2/VMManager.cpp" line="3209"/>
<source>Renderer is not set to Automatic. This may cause performance problems and graphical issues.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3208"/>
<location filename="../../pcsx2/VMManager.cpp" line="3215"/>
<source>Texture filtering is not set to Bilinear (PS2). This will break rendering in some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3671"/>
<location filename="../../pcsx2/VMManager.cpp" line="3678"/>
<source>No Game Running</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3153"/>
<location filename="../../pcsx2/VMManager.cpp" line="3160"/>
<source>Trilinear filtering is not set to automatic. This may break rendering in some games.</source>
<translation type="unfinished"></translation>
</message>
@@ -24132,132 +24144,137 @@ Error was: {}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3158"/>
<location filename="../../pcsx2/VMManager.cpp" line="2255"/>
<source>No disc to remove.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3165"/>
<source>Blending Accuracy is below Basic, this may break effects in some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3163"/>
<location filename="../../pcsx2/VMManager.cpp" line="3170"/>
<source>Hardware Download Mode is not set to Accurate, this may break rendering in some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3214"/>
<location filename="../../pcsx2/VMManager.cpp" line="3221"/>
<source>EE FPU Round Mode is not set to default, this may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3220"/>
<location filename="../../pcsx2/VMManager.cpp" line="3227"/>
<source>EE FPU Clamp Mode is not set to default, this may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3225"/>
<location filename="../../pcsx2/VMManager.cpp" line="3232"/>
<source>VU0 Round Mode is not set to default, this may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3230"/>
<location filename="../../pcsx2/VMManager.cpp" line="3237"/>
<source>VU1 Round Mode is not set to default, this may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3237"/>
<location filename="../../pcsx2/VMManager.cpp" line="3244"/>
<source>VU Clamp Mode is not set to default, this may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3242"/>
<location filename="../../pcsx2/VMManager.cpp" line="3249"/>
<source>128MB RAM is enabled. Compatibility with some games may be affected.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3247"/>
<location filename="../../pcsx2/VMManager.cpp" line="3254"/>
<source>Game Fixes are not enabled. Compatibility with some games may be affected.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3252"/>
<location filename="../../pcsx2/VMManager.cpp" line="3259"/>
<source>Compatibility Patches are not enabled. Compatibility with some games may be affected.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3256"/>
<location filename="../../pcsx2/VMManager.cpp" line="3263"/>
<source>Frame rate for NTSC is not default. This may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3258"/>
<location filename="../../pcsx2/VMManager.cpp" line="3265"/>
<source>Frame rate for PAL is not default. This may break some games.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3277"/>
<location filename="../../pcsx2/VMManager.cpp" line="3284"/>
<source>EE Recompiler is not enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3282"/>
<location filename="../../pcsx2/VMManager.cpp" line="3289"/>
<source>VU0 Recompiler is not enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3287"/>
<location filename="../../pcsx2/VMManager.cpp" line="3294"/>
<source>VU1 Recompiler is not enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3292"/>
<location filename="../../pcsx2/VMManager.cpp" line="3299"/>
<source>IOP Recompiler is not enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3297"/>
<location filename="../../pcsx2/VMManager.cpp" line="3304"/>
<source>EE Cache is enabled, this will significantly reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3302"/>
<location filename="../../pcsx2/VMManager.cpp" line="3309"/>
<source>EE Wait Loop Detection is not enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3307"/>
<location filename="../../pcsx2/VMManager.cpp" line="3314"/>
<source>INTC Spin Detection is not enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3310"/>
<location filename="../../pcsx2/VMManager.cpp" line="3317"/>
<source>Fastmem is not enabled, this will reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3314"/>
<location filename="../../pcsx2/VMManager.cpp" line="3321"/>
<source>Instant VU1 is disabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3319"/>
<location filename="../../pcsx2/VMManager.cpp" line="3326"/>
<source>mVU Flag Hack is not enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3168"/>
<location filename="../../pcsx2/VMManager.cpp" line="3175"/>
<source>GPU Palette Conversion is enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3173"/>
<location filename="../../pcsx2/VMManager.cpp" line="3180"/>
<source>Texture Preloading is not Full, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3178"/>
<location filename="../../pcsx2/VMManager.cpp" line="3185"/>
<source>Estimate texture region is enabled, this may reduce performance.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/VMManager.cpp" line="3183"/>
<location filename="../../pcsx2/VMManager.cpp" line="3190"/>
<source>Texture dumping is enabled, this will continually dump textures to disk.</source>
<translation type="unfinished"></translation>
</message>

View File

@@ -113,32 +113,37 @@ static bool UseSavestateSelector()
}
BEGIN_HOTKEY_LIST(g_common_hotkeys)
DEFINE_HOTKEY("OpenPauseMenu", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Hotkeys", "Open Pause Menu"),
DEFINE_HOTKEY("ToggleFullscreen", TRANSLATE_NOOP("Hotkeys", "Navigation"), TRANSLATE_NOOP("Hotkeys", "Toggle Fullscreen"),
[](s32 pressed) {
if (!pressed)
Host::SetFullscreen(!Host::IsFullscreen());
})
DEFINE_HOTKEY("OpenPauseMenu", TRANSLATE_NOOP("Hotkeys", "Navigation"), TRANSLATE_NOOP("Hotkeys", "Open Pause Menu"),
[](s32 pressed) {
if (!pressed && VMManager::HasValidVM() && CanPause())
FullscreenUI::OpenPauseMenu();
})
DEFINE_HOTKEY("OpenAchievementsList", TRANSLATE_NOOP("Hotkeys", "System"),
DEFINE_HOTKEY("OpenAchievementsList", TRANSLATE_NOOP("Hotkeys", "Navigation"),
TRANSLATE_NOOP("Hotkeys", "Open Achievements List"), [](s32 pressed) {
if (!pressed && CanPause())
FullscreenUI::OpenAchievementsWindow();
})
DEFINE_HOTKEY("OpenLeaderboardsList", TRANSLATE_NOOP("Hotkeys", "System"),
DEFINE_HOTKEY("OpenLeaderboardsList", TRANSLATE_NOOP("Hotkeys", "Navigation"),
TRANSLATE_NOOP("Hotkeys", "Open Leaderboards List"), [](s32 pressed) {
if (!pressed && CanPause())
FullscreenUI::OpenLeaderboardsWindow();
})
DEFINE_HOTKEY(
"TogglePause", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Hotkeys", "Toggle Pause"), [](s32 pressed) {
"TogglePause", TRANSLATE_NOOP("Hotkeys", "Speed"), TRANSLATE_NOOP("Hotkeys", "Toggle Pause"), [](s32 pressed) {
if (!pressed && VMManager::HasValidVM() && CanPause())
VMManager::SetPaused(VMManager::GetState() != VMState::Paused);
})
DEFINE_HOTKEY("ToggleFullscreen", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Hotkeys", "Toggle Fullscreen"),
[](s32 pressed) {
if (!pressed)
Host::SetFullscreen(!Host::IsFullscreen());
DEFINE_HOTKEY(
"FrameAdvance", TRANSLATE_NOOP("Hotkeys", "Speed"), TRANSLATE_NOOP("Hotkeys", "Frame Advance"), [](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
VMManager::FrameAdvance(1);
})
DEFINE_HOTKEY("ToggleFrameLimit", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Hotkeys", "Toggle Frame Limit"),
DEFINE_HOTKEY("ToggleFrameLimit", TRANSLATE_NOOP("Hotkeys", "Speed"), TRANSLATE_NOOP("Hotkeys", "Toggle Frame Limit"),
[](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
{
@@ -147,7 +152,7 @@ DEFINE_HOTKEY("ToggleFrameLimit", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE
LimiterModeType::Nominal);
}
})
DEFINE_HOTKEY("ToggleTurbo", TRANSLATE_NOOP("Hotkeys", "System"),
DEFINE_HOTKEY("ToggleTurbo", TRANSLATE_NOOP("Hotkeys", "Speed"),
TRANSLATE_NOOP("Hotkeys", "Toggle Turbo / Fast Forward"), [](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
{
@@ -155,15 +160,7 @@ DEFINE_HOTKEY("ToggleTurbo", TRANSLATE_NOOP("Hotkeys", "System"),
(VMManager::GetLimiterMode() != LimiterModeType::Turbo) ? LimiterModeType::Turbo : LimiterModeType::Nominal);
}
})
DEFINE_HOTKEY("ToggleSlowMotion", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Hotkeys", "Toggle Slow Motion"),
[](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
{
VMManager::SetLimiterMode(
(VMManager::GetLimiterMode() != LimiterModeType::Slomo) ? LimiterModeType::Slomo : LimiterModeType::Nominal);
}
})
DEFINE_HOTKEY("HoldTurbo", TRANSLATE_NOOP("Hotkeys", "System"),
DEFINE_HOTKEY("HoldTurbo", TRANSLATE_NOOP("Hotkeys", "Speed"),
TRANSLATE_NOOP("Hotkeys", "Turbo / Fast Forward (Hold)"), [](s32 pressed) {
if (!VMManager::HasValidVM())
return;
@@ -180,35 +177,24 @@ DEFINE_HOTKEY("HoldTurbo", TRANSLATE_NOOP("Hotkeys", "System"),
s_limiter_mode_prior_to_hold_interaction.reset();
}
})
DEFINE_HOTKEY("IncreaseSpeed", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Hotkeys", "Increase Target Speed"),
DEFINE_HOTKEY("ToggleSlowMotion", TRANSLATE_NOOP("Hotkeys", "Speed"), TRANSLATE_NOOP("Hotkeys", "Toggle Slow Motion"),
[](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
{
VMManager::SetLimiterMode(
(VMManager::GetLimiterMode() != LimiterModeType::Slomo) ? LimiterModeType::Slomo : LimiterModeType::Nominal);
}
})
DEFINE_HOTKEY("IncreaseSpeed", TRANSLATE_NOOP("Hotkeys", "Speed"), TRANSLATE_NOOP("Hotkeys", "Increase Target Speed"),
[](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
HotkeyAdjustTargetSpeed(0.1);
})
DEFINE_HOTKEY("DecreaseSpeed", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Hotkeys", "Decrease Target Speed"),
DEFINE_HOTKEY("DecreaseSpeed", TRANSLATE_NOOP("Hotkeys", "Speed"), TRANSLATE_NOOP("Hotkeys", "Decrease Target Speed"),
[](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
HotkeyAdjustTargetSpeed(-0.1);
})
DEFINE_HOTKEY("IncreaseVolume", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Hotkeys", "Increase Volume"),
[](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
HotkeyAdjustVolume(-1, 5);
})
DEFINE_HOTKEY("DecreaseVolume", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Hotkeys", "Decrease Volume"),
[](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
HotkeyAdjustVolume(-1, -5);
})
DEFINE_HOTKEY("Mute", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Hotkeys", "Toggle Mute"), [](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
HotkeyAdjustVolume((SPU2::GetOutputVolume() == 0) ? SPU2::GetResetVolume() : 0, 0);
})
DEFINE_HOTKEY(
"FrameAdvance", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Hotkeys", "Frame Advance"), [](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
VMManager::FrameAdvance(1);
})
DEFINE_HOTKEY("ShutdownVM", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Hotkeys", "Shut Down Virtual Machine"),
[](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
@@ -219,11 +205,6 @@ DEFINE_HOTKEY("ResetVM", TRANSLATE_NOOP("Hotkeys", "System"), TRANSLATE_NOOP("Ho
if (!pressed && VMManager::HasValidVM())
VMManager::Reset();
})
DEFINE_HOTKEY("InputRecToggleMode", TRANSLATE_NOOP("Hotkeys", "System"),
TRANSLATE_NOOP("Hotkeys", "Toggle Input Recording Mode"), [](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
g_InputRecording.getControls().toggleRecordMode();
})
DEFINE_HOTKEY("SwapMemCards", TRANSLATE_NOOP("Hotkeys", "System"),
TRANSLATE_NOOP("Hotkeys", "Swap Memory Cards"), [](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
@@ -231,6 +212,11 @@ DEFINE_HOTKEY("SwapMemCards", TRANSLATE_NOOP("Hotkeys", "System"),
FileMcd_Swap();
});
})
DEFINE_HOTKEY("InputRecToggleMode", TRANSLATE_NOOP("Hotkeys", "System"),
TRANSLATE_NOOP("Hotkeys", "Toggle Input Recording Mode"), [](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
g_InputRecording.getControls().toggleRecordMode();
})
DEFINE_HOTKEY("PreviousSaveStateSlot", TRANSLATE_NOOP("Hotkeys", "Save States"),
TRANSLATE_NOOP("Hotkeys", "Select Previous Save Slot"), [](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
@@ -305,4 +291,18 @@ DEFINE_HOTKEY_SAVESTATE_X(10, TRANSLATE_NOOP("Hotkeys", "Save State To Slot 10")
DEFINE_HOTKEY_LOADSTATE_X(10, TRANSLATE_NOOP("Hotkeys", "Load State From Slot 10"))
#undef DEFINE_HOTKEY_SAVESTATE_X
#undef DEFINE_HOTKEY_LOADSTATE_X
DEFINE_HOTKEY("Mute", TRANSLATE_NOOP("Hotkeys", "Audio"), TRANSLATE_NOOP("Hotkeys", "Toggle Mute"), [](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
HotkeyAdjustVolume((SPU2::GetOutputVolume() == 0) ? SPU2::GetResetVolume() : 0, 0);
})
DEFINE_HOTKEY("IncreaseVolume", TRANSLATE_NOOP("Hotkeys", "Audio"), TRANSLATE_NOOP("Hotkeys", "Increase Volume"),
[](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
HotkeyAdjustVolume(-1, 5);
})
DEFINE_HOTKEY("DecreaseVolume", TRANSLATE_NOOP("Hotkeys", "Audio"), TRANSLATE_NOOP("Hotkeys", "Decrease Volume"),
[](s32 pressed) {
if (!pressed && VMManager::HasValidVM())
HotkeyAdjustVolume(-1, -5);
})
END_HOTKEY_LIST()

View File

@@ -467,7 +467,7 @@ ImFont* ImGuiManager::AddTextFont()
{
// Exclude FA and PF ranges
// clang-format off
static constexpr ImWchar range_exclude_icons[] = { 0x2198,0x2199,0x219e,0x21a7,0x21b0,0x21b3,0x21ba,0x21c3,0x21ce,0x21d4,0x21dc,0x21dd,0x21e0,0x21e3,0x21e6,0x21e8,0x21f3,0x21f3,0x21f7,0x21fb,0x2206,0x2208,0x221a,0x221a,0x227a,0x227d,0x22bf,0x22c8,0x2349,0x2349,0x235a,0x2361,0x2364,0x2367,0x237a,0x237f,0x23b2,0x23b5,0x23cc,0x23cc,0x23f4,0x23f7,0x2427,0x243a,0x243d,0x243d,0x2443,0x2443,0x2460,0x246b,0x248f,0x248f,0x24f5,0x24ff,0x2605,0x2605,0x2699,0x2699,0x278a,0x278e,0xff21,0xff3a,0x0,0x0 };
static constexpr ImWchar range_exclude_icons[] = { 0x2198,0x2199,0x219e,0x21a7,0x21b0,0x21b3,0x21ba,0x21c3,0x21ce,0x21d4,0x21dc,0x21dd,0x21e0,0x21e3,0x21e6,0x21e8,0x21f3,0x21f3,0x21f7,0x21fb,0x2206,0x2208,0x221a,0x221a,0x227a,0x227d,0x22bf,0x22c8,0x2349,0x2349,0x235a,0x2361,0x2364,0x2367,0x237a,0x237f,0x23b2,0x23b5,0x23cc,0x23cc,0x23f4,0x23f7,0x2427,0x243a,0x243d,0x243e,0x2443,0x2452,0x2460,0x246b,0x248f,0x248f,0x24f5,0x24ff,0x2605,0x2605,0x2699,0x2699,0x278a,0x278e,0xff21,0xff3a,0x0,0x0 };
// clang-format on
ImFontConfig cfg;

View File

@@ -670,7 +670,7 @@ __ri void ImGuiManager::DrawInputsOverlay(float scale, float margin, float spaci
for (u32 port = 0; port < USB::NUM_PORTS; port++)
{
if (EmuConfig.USB.Ports[port].DeviceType >= 0 && !USB::GetDeviceBindings(port).empty())
if (EmuConfig.USB.Ports[port].DeviceType >= 0)
num_ports++;
}
@@ -688,10 +688,7 @@ __ri void ImGuiManager::DrawInputsOverlay(float scale, float margin, float spaci
continue;
const Pad::ControllerInfo& cinfo = pad->GetInfo();
if (cinfo.icon_name)
text.format("{} {}", cinfo.icon_name, slot + 1u);
else
text.format("{} |", slot + 1u);
text.format("{} {} • {} |", ICON_FA_GAMEPAD, slot + 1u, cinfo.icon_name ? cinfo.icon_name : ICON_FA_TRIANGLE_EXCLAMATION);
for (u32 bind = 0; bind < static_cast<u32>(cinfo.bindings.size()); bind++)
{
@@ -744,10 +741,9 @@ __ri void ImGuiManager::DrawInputsOverlay(float scale, float margin, float spaci
continue;
const std::span<const InputBindingInfo> bindings(USB::GetDeviceBindings(port));
if (bindings.empty())
continue;
text.format("{} {} ", ICON_PF_USB, port + 1u);
const char* icon = USB::GetDeviceIconName(port);
text.format("{} {} • {} | ", ICON_PF_USB, port + 1u, icon ? icon : ICON_FA_TRIANGLE_EXCLAMATION);
for (const InputBindingInfo& bi : bindings)
{

View File

@@ -4,6 +4,8 @@
#pragma once
#include "vtlb.h"
#include "MemoryTypes.h"
#include "common/BitUtils.h"
// This is a table of default virtual map addresses for ps2vm components. These locations
// are provided and used to assist in debugging and possibly hacking; as it makes it possible
@@ -22,13 +24,15 @@ namespace HostMemoryMap
// Main
//////////////////////////////////////////////////////////////////////////
// PS2 main memory, SPR, and ROMs (approximately 138.5MB, but we round up to 139MB for simplicity).
// PS2 main memory, SPR, and ROMs (approximately 143MB).
// Needs to be big enough to fit the EEVM_MemoryAllocMess struct
static constexpr u32 EEmemOffset = 0x00000000;
static constexpr u32 EEmemSize = 0x8B00000;
static constexpr u32 EEmemSize = Common::AlignUp(sizeof(EEVM_MemoryAllocMess), _1mb);
// IOP main memory (2MB + 64K + 256b, rounded up to 3MB for simplicity).
// IOP main memory (approximately 3MB).
// Needs to be big enough to fit the IopVM_MemoryAllocMess struct
static constexpr u32 IOPmemOffset = EEmemOffset + EEmemSize;
static constexpr u32 IOPmemSize = 0x300000;
static constexpr u32 IOPmemSize = Common::AlignUp(sizeof(IopVM_MemoryAllocMess), _1mb);
// VU0 and VU1 memory (40KB, rounded up to 1MB for simplicity).
static constexpr u32 VUmemOffset = IOPmemOffset + IOPmemSize;

View File

@@ -29,6 +29,7 @@ typedef u32 mem32_t;
typedef u64 mem64_t;
typedef u128 mem128_t;
// Needs to fit within EEmemSize of Memory.h
struct EEVM_MemoryAllocMess
{
u8 Main[Ps2MemSize::MainRam]; // Main memory (hard-wired to 32MB)
@@ -47,6 +48,7 @@ struct EEVM_MemoryAllocMess
u8 ZeroWrite[_1mb];
};
// Needs to fit within IOPmemSize of Memory.h
struct IopVM_MemoryAllocMess
{
u8 Main[Ps2MemSize::IopRam]; // Main memory (hard-wired to 2MB)

View File

@@ -19,7 +19,7 @@
#include "fmt/format.h"
#if _WIN32
#if defined(_WIN32)
#define read_portable(a, b, c) (recv(a, (char*)b, c, 0))
#define write_portable(a, b, c) (send(a, (const char*)b, c, 0))
#define safe_close_portable(a) \
@@ -31,9 +31,23 @@
(a) = INVALID_SOCKET; \
} \
} while (0)
#define bzero(b, len) (memset((b), '\0', (len)), (void)0)
#include "common/RedtapeWindows.h"
#include <WinSock2.h>
#elif defined(__linux__) || defined(__FreeBSD__)
#define read_portable(a, b, c) (read(a, b, c))
#define write_portable(a, b, c) (send(a, b, c, MSG_NOSIGNAL))
#define safe_close_portable(a) \
do \
{ \
if ((a) >= 0) \
{ \
close((a)); \
(a) = -1; \
} \
} while (0)
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#else
#define read_portable(a, b, c) (read(a, b, c))
#define write_portable(a, b, c) (write(a, b, c))
@@ -74,25 +88,25 @@ static bool InitializeWinsock()
namespace PINEServer
{
std::thread m_thread;
int m_slot;
static std::thread s_thread;
static int s_slot;
#ifdef _WIN32
// windows claim to have support for AF_UNIX sockets but that is a blatant lie,
// their SDK won't even run their own examples, so we go on TCP sockets.
static SOCKET m_sock = INVALID_SOCKET;
static SOCKET s_sock = INVALID_SOCKET;
// the message socket used in thread's accept().
static SOCKET m_msgsock = INVALID_SOCKET;
static SOCKET s_msgsock = INVALID_SOCKET;
#else
// absolute path of the socket. Stored in XDG_RUNTIME_DIR, if unset /tmp
static std::string m_socket_name;
static int m_sock = -1;
static std::string s_socket_name;
static int s_sock = -1;
// the message socket used in thread's accept().
static int m_msgsock = -1;
static int s_msgsock = -1;
#endif
// Whether the socket processing thread should stop executing/is stopped.
static std::atomic_bool m_end{true};
static std::atomic_bool s_end{true};
/**
* Maximum memory used by an IPC message request.
@@ -111,13 +125,13 @@ namespace PINEServer
* A preallocated buffer used to store all IPC replies.
* to the size of 50.000 MsgWrite64 IPC calls.
*/
static std::vector<u8> m_ret_buffer;
static std::vector<u8> s_ret_buffer;
/**
* IPC messages buffer.
* A preallocated buffer used to store all IPC messages.
*/
static std::vector<u8> m_ipc_buffer;
static std::vector<u8> s_ipc_buffer;
/**
* IPC Command messages opcodes.
@@ -246,8 +260,8 @@ namespace PINEServer
bool PINEServer::Initialize(int slot)
{
m_end.store(false, std::memory_order_release);
m_slot = slot;
s_end.store(false, std::memory_order_release);
s_slot = slot;
#ifdef _WIN32
if (!InitializeWinsock())
@@ -257,8 +271,8 @@ bool PINEServer::Initialize(int slot)
return false;
}
m_sock = socket(AF_INET, SOCK_STREAM, 0);
if ((m_sock == INVALID_SOCKET) || slot > 65536)
s_sock = socket(AF_INET, SOCK_STREAM, 0);
if ((s_sock == INVALID_SOCKET) || slot > 65536)
{
Console.WriteLn(Color_Red, "PINE: Cannot open socket! Shutting down...");
Deinitialize();
@@ -270,7 +284,7 @@ bool PINEServer::Initialize(int slot)
server.sin_addr.s_addr = htonl(INADDR_LOOPBACK); // localhost only
server.sin_port = htons(slot);
if (bind(m_sock, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
if (bind(s_sock, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
{
Console.WriteLn(Color_Red, "PINE: Error while binding to socket! Shutting down...");
Deinitialize();
@@ -287,32 +301,32 @@ bool PINEServer::Initialize(int slot)
// fallback in case macOS or other OSes don't implement the XDG base
// spec
if (runtime_dir == nullptr)
m_socket_name = "/tmp/" PINE_EMULATOR_NAME ".sock";
s_socket_name = "/tmp/" PINE_EMULATOR_NAME ".sock";
else
{
m_socket_name = runtime_dir;
m_socket_name += "/" PINE_EMULATOR_NAME ".sock";
s_socket_name = runtime_dir;
s_socket_name += "/" PINE_EMULATOR_NAME ".sock";
}
if (slot != PINE_DEFAULT_SLOT)
m_socket_name += "." + std::to_string(slot);
s_socket_name += "." + std::to_string(slot);
struct sockaddr_un server;
m_sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (m_sock < 0)
s_sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (s_sock < 0)
{
Console.WriteLn(Color_Red, "PINE: Cannot open socket! Shutting down...");
Deinitialize();
return false;
}
server.sun_family = AF_UNIX;
StringUtil::Strlcpy(server.sun_path, m_socket_name, sizeof(server.sun_path));
StringUtil::Strlcpy(server.sun_path, s_socket_name, sizeof(server.sun_path));
// we unlink the socket so that when releasing this thread the socket gets
// freed even if we didn't close correctly the loop
unlink(m_socket_name.c_str());
if (bind(m_sock, (struct sockaddr*)&server, sizeof(struct sockaddr_un)))
unlink(s_socket_name.c_str());
if (bind(s_sock, (struct sockaddr*)&server, sizeof(struct sockaddr_un)))
{
Console.WriteLn(Color_Red, "PINE: Error while binding to socket! Shutting down...");
Deinitialize();
@@ -323,7 +337,7 @@ bool PINEServer::Initialize(int slot)
// maximum queue of 4096 commands before refusing, approximated to the
// nearest legal value. We do not use SOMAXCONN as windows have this idea
// that a "reasonable" value is 5, which is not.
if (listen(m_sock, 4096))
if (listen(s_sock, 4096))
{
Console.WriteLn(Color_Red, "PINE: Cannot listen for connections! Shutting down...");
Deinitialize();
@@ -332,23 +346,23 @@ bool PINEServer::Initialize(int slot)
// we allocate once buffers to not have to do mallocs for each IPC
// request, as malloc is expansive when we optimize for µs.
m_ret_buffer.resize(MAX_IPC_RETURN_SIZE);
m_ipc_buffer.resize(MAX_IPC_SIZE);
s_ret_buffer.resize(MAX_IPC_RETURN_SIZE);
s_ipc_buffer.resize(MAX_IPC_SIZE);
// we start the thread
m_thread = std::thread(&PINEServer::MainLoop);
s_thread = std::thread(&PINEServer::MainLoop);
return true;
}
bool PINEServer::IsInitialized()
{
return !m_end.load(std::memory_order_acquire);
return !s_end.load(std::memory_order_acquire);
}
int PINEServer::GetSlot()
{
return m_slot;
return s_slot;
}
std::vector<u8>& PINEServer::MakeOkIPC(std::vector<u8>& ret_buffer, uint32_t size = 5)
@@ -367,24 +381,29 @@ std::vector<u8>& PINEServer::MakeFailIPC(std::vector<u8>& ret_buffer, uint32_t s
bool PINEServer::AcceptClient()
{
m_msgsock = accept(m_sock, 0, 0);
if (m_msgsock >= 0)
s_msgsock = accept(s_sock, 0, 0);
if (s_msgsock >= 0)
{
// Gross C-style cast, but SOCKET is a handle on Windows.
Console.WriteLn("PINE: New client with FD %d connected.", (int)m_msgsock);
Console.WriteLn("PINE: New client with FD %d connected.", (int)s_msgsock);
return true;
}
#ifdef __APPLE__
int nosigpipe = 1;
setsockopt(s_msgsock, SOL_SOCKET, SO_NOSIGPIPE, &nosigpipe, sizeof(nosigpipe));
#endif
// everything else is non recoverable in our scope
// we also mark as recoverable socket errors where it would block a
// non blocking socket, even though our socket is blocking, in case
// we ever have to implement a non blocking socket.
#ifdef _WIN32
const int errno_w = WSAGetLastError();
if (!(errno_w == WSAECONNRESET || errno_w == WSAEINTR || errno_w == WSAEINPROGRESS || errno_w == WSAEMFILE || errno_w == WSAEWOULDBLOCK) && m_sock != INVALID_SOCKET)
if (!(errno_w == WSAECONNRESET || errno_w == WSAEINTR || errno_w == WSAEINPROGRESS || errno_w == WSAEMFILE || errno_w == WSAEWOULDBLOCK) && s_sock != INVALID_SOCKET)
Console.Error("PINE: accept() returned error %d", errno_w);
#else
if (!(errno == ECONNABORTED || errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) && m_sock >= 0)
if (!(errno == ECONNABORTED || errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) && s_sock >= 0)
Console.Error("PINE: accept() returned error %d", errno);
#endif
@@ -395,7 +414,7 @@ void PINEServer::MainLoop()
{
Threading::SetNameOfCurrentThread("PINE Server");
while (!m_end.load(std::memory_order_acquire))
while (!s_end.load(std::memory_order_acquire))
{
if (!AcceptClient())
continue;
@@ -403,25 +422,25 @@ void PINEServer::MainLoop()
ClientLoop();
Console.WriteLn("PINE: Client disconnected.");
safe_close_portable(m_msgsock);
safe_close_portable(s_msgsock);
}
}
void PINEServer::ClientLoop()
{
while (!m_end.load(std::memory_order_acquire))
while (!s_end.load(std::memory_order_acquire))
{
// either int or ssize_t depending on the platform, so we have to
// use a bunch of auto
auto receive_length = 0;
auto end_length = 4;
const std::span<u8> ipc_buffer_span(m_ipc_buffer);
const std::span<u8> ipc_buffer_span(s_ipc_buffer);
// while we haven't received the entire packet, maybe due to
// socket datagram splittage, we continue to read
while (receive_length < end_length)
{
const auto tmp_length = read_portable(m_msgsock, &ipc_buffer_span[receive_length], MAX_IPC_SIZE - receive_length);
const auto tmp_length = read_portable(s_msgsock, &ipc_buffer_span[receive_length], MAX_IPC_SIZE - receive_length);
// we recreate the socket if an error happens
if (tmp_length <= 0)
@@ -450,10 +469,10 @@ void PINEServer::ClientLoop()
// disconnects
if (receive_length != 0)
{
res = ParseCommand(ipc_buffer_span.subspan(4), m_ret_buffer, (u32)end_length - 4);
res = ParseCommand(ipc_buffer_span.subspan(4), s_ret_buffer, (u32)end_length - 4);
// if we cannot send back our answer restart the socket
if (write_portable(m_msgsock, res.buffer.data(), res.size) < 0)
if (write_portable(s_msgsock, res.buffer.data(), res.size) < 0)
return;
}
}
@@ -461,30 +480,30 @@ void PINEServer::ClientLoop()
void PINEServer::Deinitialize()
{
m_end.store(true, std::memory_order_release);
s_end.store(true, std::memory_order_release);
#ifndef _WIN32
if (!m_socket_name.empty())
if (!s_socket_name.empty())
{
unlink(m_socket_name.c_str());
m_socket_name = {};
unlink(s_socket_name.c_str());
s_socket_name = {};
}
#endif
// shutdown() is needed, otherwise accept() will still block.
#ifdef _WIN32
if (m_sock != INVALID_SOCKET)
shutdown(m_sock, SD_BOTH);
if (s_sock != INVALID_SOCKET)
shutdown(s_sock, SD_BOTH);
#else
if (m_sock >= 0)
shutdown(m_sock, SHUT_RDWR);
if (s_sock >= 0)
shutdown(s_sock, SHUT_RDWR);
#endif
safe_close_portable(m_sock);
safe_close_portable(m_msgsock);
safe_close_portable(s_sock);
safe_close_portable(s_msgsock);
if (m_thread.joinable())
m_thread.join();
if (s_thread.joinable())
s_thread.join();
}
PINEServer::IPCBuffer PINEServer::ParseCommand(std::span<u8> buf, std::vector<u8>& ret_buffer, u32 buf_size)

View File

@@ -81,7 +81,7 @@ static const SettingInfo s_settings[] = {
};
const Pad::ControllerInfo PadDualshock2::ControllerInfo = {Pad::ControllerType::DualShock2, "DualShock2",
TRANSLATE_NOOP("Pad", "DualShock 2"), ICON_PF_GAMEPAD_ALT, s_bindings, s_settings, Pad::VibrationCapabilities::LargeSmallMotors};
TRANSLATE_NOOP("Pad", "DualShock 2"), ICON_PF_DUALSHOCK2, s_bindings, s_settings, Pad::VibrationCapabilities::LargeSmallMotors};
void PadDualshock2::ConfigLog()
{

View File

@@ -45,7 +45,7 @@ static const SettingInfo s_settings[] = {
};
const Pad::ControllerInfo PadJogcon::ControllerInfo = {Pad::ControllerType::Jogcon, "Jogcon",
TRANSLATE_NOOP("Pad", "Jogcon"), ICON_PF_GAMEPAD_ALT, s_bindings, s_settings, Pad::VibrationCapabilities::LargeSmallMotors};
TRANSLATE_NOOP("Pad", "Jogcon"), ICON_PF_JOGCON, s_bindings, s_settings, Pad::VibrationCapabilities::LargeSmallMotors};
void PadJogcon::ConfigLog()
{

View File

@@ -42,7 +42,7 @@ static const SettingInfo s_settings[] = {
};
const Pad::ControllerInfo PadNegcon::ControllerInfo = {Pad::ControllerType::Negcon, "NeGcon",
TRANSLATE_NOOP("Pad", "NeGcon"), ICON_PF_GAMEPAD_ALT, s_bindings, s_settings, Pad::VibrationCapabilities::LargeSmallMotors};
TRANSLATE_NOOP("Pad", "NeGcon"), ICON_PF_NEGCON, s_bindings, s_settings, Pad::VibrationCapabilities::LargeSmallMotors};
void PadNegcon::ConfigLog()
{

View File

@@ -3,4 +3,4 @@
/// Version number for GS and other shaders. Increment whenever any of the contents of the
/// shaders change, to invalidate the cache.
static constexpr u32 SHADER_CACHE_VERSION = 72;
static constexpr u32 SHADER_CACHE_VERSION = 73;

View File

@@ -561,6 +561,15 @@ const char* USB::GetDeviceName(const std::string_view device)
return dev ? dev->Name() : TRANSLATE_NOOP("USB", "Not Connected");
}
const char* USB::GetDeviceIconName(u32 port)
{
pxAssert(port < NUM_PORTS);
if (s_usb_device_proxy[port])
return s_usb_device_proxy[port]->IconName();
else
return nullptr;
}
const char* USB::GetDeviceSubtypeName(const std::string_view device, u32 subtype)
{
const DeviceProxy* dev = RegisterDevice::instance().Device(device);

View File

@@ -27,6 +27,7 @@ namespace USB
std::vector<std::pair<const char*, const char*>> GetDeviceTypes();
const char* GetDeviceName(const std::string_view device);
const char* GetDeviceIconName(u32 port);
const char* GetDeviceSubtypeName(const std::string_view device, u32 subtype);
std::span<const char*> GetDeviceSubtypes(const std::string_view device);
std::span<const InputBindingInfo> GetDeviceBindings(const std::string_view device, u32 subtype);

View File

@@ -51,6 +51,7 @@ public:
virtual const char* Name() const = 0;
virtual const char* TypeName() const = 0;
virtual const char* IconName() const = 0;
virtual std::span<const char*> SubTypes() const;
virtual std::span<const InputBindingInfo> Bindings(u32 subtype) const;
virtual std::span<const SettingInfo> Settings(u32 subtype) const;

View File

@@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0+
#include "Host.h"
#include "IconsPromptFont.h"
#include "videodev.h"
#include "usb-eyetoy-webcam.h"
#include "ov519.h"
@@ -491,6 +492,11 @@ namespace usb_eyetoy
return "webcam";
}
const char* EyeToyWebCamDevice::IconName() const
{
return ICON_PF_EYETOY_WEBCAM;
}
bool EyeToyWebCamDevice::Freeze(USBDevice* dev, StateWrapper& sw) const
{
EYETOYState* s = USB_CONTAINER_OF(dev, EYETOYState, dev);

View File

@@ -461,6 +461,7 @@ namespace usb_eyetoy
USBDevice* CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const override;
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
bool Freeze(USBDevice* dev, StateWrapper& sw) const override;
void UpdateSettings(USBDevice* dev, SettingsInterface& si) const override;
std::span<const char*> SubTypes() const override;

View File

@@ -32,6 +32,7 @@
#include "USB/qemu-usb/desc.h"
#include "USB/usb-hid/usb-hid.h"
#include "IconsPromptFont.h"
#include "common/Console.h"
namespace usb_hid
@@ -826,6 +827,11 @@ namespace usb_hid
return "hidkbd";
}
const char* HIDKbdDevice::IconName() const
{
return ICON_PF_KEYBOARD_ALT;
}
std::span<const InputBindingInfo> HIDKbdDevice::Bindings(u32 subtype) const
{
static constexpr const InputBindingInfo info[] = {
@@ -899,6 +905,11 @@ namespace usb_hid
return "hidmouse";
}
const char* HIDMouseDevice::IconName() const
{
return ICON_PF_MOUSE;
}
bool HIDMouseDevice::Freeze(USBDevice* dev, StateWrapper& sw) const
{
UsbHIDState* s = USB_CONTAINER_OF(dev, UsbHIDState, dev);

View File

@@ -14,6 +14,7 @@ namespace usb_hid
public:
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
std::span<const InputBindingInfo> Bindings(u32 subtype) const override;
USBDevice* CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const override;
void SetBindingValue(USBDevice* dev, u32 bind, float value) const override;
@@ -25,6 +26,7 @@ namespace usb_hid
public:
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
std::span<const InputBindingInfo> Bindings(u32 subtype) const override;
float GetBindingValue(const USBDevice* dev, u32 bind) const override;
void SetBindingValue(USBDevice* dev, u32 bind, float value) const override;

View File

@@ -3,6 +3,7 @@
#include "GS/GS.h"
#include "Host.h"
#include "IconsPromptFont.h"
#include "ImGui/ImGuiManager.h"
#include "Input/InputManager.h"
#include "StateWrapper.h"
@@ -444,6 +445,11 @@ namespace usb_lightgun
return "guncon2";
}
const char* GunCon2Device::IconName() const
{
return ICON_PF_GUNCON2;
}
USBDevice* GunCon2Device::CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const
{
GunCon2State* s = new GunCon2State(port);

View File

@@ -12,6 +12,7 @@ namespace usb_lightgun
USBDevice* CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const override;
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
bool Freeze(USBDevice* dev, StateWrapper& sw) const override;
void UpdateSettings(USBDevice* dev, SettingsInterface& si) const override;
float GetBindingValue(const USBDevice* dev, u32 bind_index) const override;

View File

@@ -34,6 +34,7 @@
#include "USB/USB.h"
#include "StateWrapper.h"
#include "IconsPromptFont.h"
#include "common/Console.h"
#define BUFFER_FRAMES 200
@@ -962,6 +963,11 @@ namespace usb_mic
return TRANSLATE_NOOP("USB", "Logitech USB Headset");
}
const char* HeadsetDevice::IconName() const
{
return ICON_PF_HEADSET;
}
bool HeadsetDevice::Freeze(USBDevice* dev, StateWrapper& sw) const
{
HeadsetState* s = USB_CONTAINER_OF(dev, HeadsetState, dev);

View File

@@ -11,6 +11,7 @@ namespace usb_mic
USBDevice* CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const override;
const char* TypeName() const override;
const char* Name() const override;
const char* IconName() const override;
bool Freeze(USBDevice* dev, StateWrapper& sw) const override;
void UpdateSettings(USBDevice* dev, SettingsInterface& si) const override;

View File

@@ -24,6 +24,7 @@
// Most stuff is based on Qemu 1.7 USB soundcard passthrough code.
#include "IconsPromptFont.h"
#include "USB/qemu-usb/qusb.h"
#include "USB/qemu-usb/desc.h"
#include "USB/qemu-usb/USBinternal.h"
@@ -1204,6 +1205,11 @@ namespace usb_mic
return "singstar";
}
const char* MicrophoneDevice::IconName() const
{
return ICON_PF_SINGSTAR_MIC;
}
bool MicrophoneDevice::Freeze(USBDevice* dev, StateWrapper& sw) const
{
SINGSTARMICState* s = USB_CONTAINER_OF(dev, SINGSTARMICState, dev);

View File

@@ -22,6 +22,7 @@ namespace usb_mic
USBDevice* CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const override;
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
bool Freeze(USBDevice* dev, StateWrapper& sw) const override;
void UpdateSettings(USBDevice* dev, SettingsInterface& si) const override;
std::span<const char*> SubTypes() const override;

View File

@@ -1,6 +1,7 @@
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
#include "IconsFontAwesome6.h"
#include "USB/qemu-usb/qusb.h"
#include "USB/qemu-usb/desc.h"
#include "USB/qemu-usb/USBinternal.h"
@@ -1189,6 +1190,11 @@ namespace usb_msd
return TRANSLATE_NOOP("USB", "Mass Storage Device");
}
const char* MsdDevice::IconName() const
{
return ICON_FA_HARD_DRIVE;
}
bool MsdDevice::Freeze(USBDevice* dev, StateWrapper& sw) const
{
MSDState* s = USB_CONTAINER_OF(dev, MSDState, dev);

View File

@@ -19,6 +19,7 @@ namespace usb_msd
USBDevice* CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const override;
const char* TypeName() const override;
const char* Name() const override;
const char* IconName() const override;
bool Freeze(USBDevice* dev, StateWrapper& sw) const override;
void UpdateSettings(USBDevice* dev, SettingsInterface& si) const override;
std::span<const char*> SubTypes() const override;

View File

@@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0+
#include "Host.h"
#include "IconsPromptFont.h"
#include "Input/InputManager.h"
#include "StateWrapper.h"
#include "USB/USB.h"
@@ -205,6 +206,11 @@ namespace usb_pad
return "BuzzDevice";
}
const char* BuzzDevice::IconName() const
{
return ICON_PF_BUZZ_CONTROLLER;
}
bool BuzzDevice::Freeze(USBDevice* dev, StateWrapper& sw) const
{
return true;

View File

@@ -84,6 +84,7 @@ namespace usb_pad
public:
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
bool Freeze(USBDevice* dev, StateWrapper& sw) const override;
float GetBindingValue(const USBDevice* dev, u32 bind_index) const override;
void SetBindingValue(USBDevice* dev, u32 bind_index, float value) const override;

View File

@@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0+
#include "Host.h"
#include "IconsPromptFont.h"
#include "Input/InputManager.h"
#include "StateWrapper.h"
#include "USB/USB.h"
@@ -282,6 +283,11 @@ namespace usb_pad
return "Gametrak";
}
const char* GametrakDevice::IconName() const
{
return ICON_PF_GAMETRAK_DEVICE;
}
USBDevice* GametrakDevice::CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const
{
GametrakState* s = new GametrakState(port);

View File

@@ -74,6 +74,7 @@ namespace usb_pad
public:
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
float GetBindingValue(const USBDevice* dev, u32 bind_index) const override;
void SetBindingValue(USBDevice* dev, u32 bind_index, float value) const override;
bool Freeze(USBDevice* dev, StateWrapper& sw) const override;

View File

@@ -2,6 +2,8 @@
// SPDX-License-Identifier: GPL-3.0+
#include "usb-pad.h"
#include "IconsFontAwesome6.h"
#include "IconsPromptFont.h"
#include "USB/qemu-usb/USBinternal.h"
#include "USB/usb-pad/usb-pad-sdl-ff.h"
#include "USB/USB.h"
@@ -814,6 +816,11 @@ namespace usb_pad
return "Pad";
}
const char* PadDevice::IconName() const
{
return ICON_PF_STEERING_WHEEL_ALT;
}
bool PadDevice::Freeze(USBDevice* dev, StateWrapper& sw) const
{
PadState* s = USB_CONTAINER_OF(dev, PadState, dev);
@@ -887,6 +894,11 @@ namespace usb_pad
return "RBDrumKit";
}
const char* RBDrumKitDevice::IconName() const
{
return ICON_FA_DRUM;
}
USBDevice* RBDrumKitDevice::CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const
{
PadState* s = new PadState(port, WT_ROCKBAND1_DRUMKIT);
@@ -949,6 +961,11 @@ namespace usb_pad
return "Keyboardmania";
}
const char* KeyboardmaniaDevice::IconName() const
{
return ICON_PF_KEYBOARDMANIA;
}
std::span<const char*> KeyboardmaniaDevice::SubTypes() const
{
return {};

View File

@@ -72,6 +72,7 @@ namespace usb_pad
USBDevice* CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const override;
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
bool Freeze(USBDevice* dev, StateWrapper& sw) const override;
void UpdateSettings(USBDevice* dev, SettingsInterface& si) const override;
float GetBindingValue(const USBDevice* dev, u32 bind_index) const override;
@@ -88,6 +89,7 @@ namespace usb_pad
public:
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
std::span<const char*> SubTypes() const override;
std::span<const InputBindingInfo> Bindings(u32 subtype) const override;
std::span<const SettingInfo> Settings(u32 subtype) const override;
@@ -99,6 +101,7 @@ namespace usb_pad
public:
const char* Name() const;
const char* TypeName() const;
const char* IconName() const;
std::span<const char*> SubTypes() const;
std::span<const InputBindingInfo> Bindings(u32 subtype) const;
std::span<const SettingInfo> Settings(u32 subtype) const;
@@ -111,6 +114,7 @@ namespace usb_pad
public:
const char* Name() const;
const char* TypeName() const;
const char* IconName() const;
std::span<const char*> SubTypes() const;
std::span<const InputBindingInfo> Bindings(u32 subtype) const;
std::span<const SettingInfo> Settings(u32 subtype) const;

View File

@@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0+
#include "Host.h"
#include "IconsPromptFont.h"
#include "Input/InputManager.h"
#include "StateWrapper.h"
#include "USB/USB.h"
@@ -285,6 +286,11 @@ namespace usb_pad
return "RealPlay";
}
const char* RealPlayDevice::IconName() const
{
return ICON_PF_REALPLAY_BOWLING;
}
USBDevice* RealPlayDevice::CreateDevice(SettingsInterface& si, u32 port, u32 type) const
{
RealPlayState* s = new RealPlayState(port, type);

View File

@@ -80,6 +80,7 @@ namespace usb_pad
public:
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
float GetBindingValue(const USBDevice* dev, u32 bind_index) const override;
void SetBindingValue(USBDevice* dev, u32 bind_index, float value) const override;
bool Freeze(USBDevice* dev, StateWrapper& sw) const override;

View File

@@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0+
#include "Host.h"
#include "IconsPromptFont.h"
#include "USB/usb-pad/usb-pad.h"
#include "USB/qemu-usb/desc.h"
#include "USB/usb-mic/usb-mic.h"
@@ -341,6 +342,11 @@ namespace usb_pad
return "seamic";
}
const char* SeamicDevice::IconName() const
{
return ICON_PF_SEGA_SEAMIC;
}
std::span<const char*> SeamicDevice::SubTypes() const
{
return {};

View File

@@ -26,6 +26,11 @@ namespace usb_pad
return "TrainController";
}
const char* TrainDevice::IconName() const
{
return ICON_FA_TRAIN;
}
std::span<const char*> TrainDevice::SubTypes() const
{
static const char* subtypes[] = {

View File

@@ -23,6 +23,7 @@ namespace usb_pad
USBDevice* CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const override;
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
std::span<const char*> SubTypes() const override;
void UpdateSettings(USBDevice* dev, SettingsInterface& si) const override;
std::span<const SettingInfo> Settings(u32 subtype) const override;

View File

@@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-3.0+
#include "Host.h"
#include "IconsPromptFont.h"
#include "Input/InputManager.h"
#include "StateWrapper.h"
#include "USB/USB.h"
@@ -129,6 +130,11 @@ namespace usb_pad
return "TranceVibrator";
}
const char* TranceVibratorDevice::IconName() const
{
return ICON_PF_REZ_VIBRATOR;
}
bool TranceVibratorDevice::Freeze(USBDevice* dev, StateWrapper& sw) const
{
return true;

View File

@@ -26,6 +26,7 @@ namespace usb_pad
public:
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
bool Freeze(USBDevice* dev, StateWrapper& sw) const override;
float GetBindingValue(const USBDevice* dev, u32 bind_index) const override;
void SetBindingValue(USBDevice* dev, u32 bind_index, float value) const override;

View File

@@ -2,6 +2,8 @@
// SPDX-License-Identifier: GPL-3.0+
#include "Host.h"
#include "IconsFontAwesome6.h"
#include "IconsPromptFont.h"
#include "Input/InputManager.h"
#include "StateWrapper.h"
#include "USB/USB.h"
@@ -235,6 +237,11 @@ namespace usb_pad
return "DJTurntable";
}
const char* DJTurntableDevice::IconName() const
{
return ICON_PF_DJ_HERO_TURNTABLE;
}
USBDevice* DJTurntableDevice::CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const
{
TurntableState* s = new TurntableState(port);

View File

@@ -86,6 +86,7 @@ namespace usb_pad
public:
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
float GetBindingValue(const USBDevice* dev, u32 bind_index) const override;
void SetBindingValue(USBDevice* dev, u32 bind_index, float value) const override;
bool Freeze(USBDevice* dev, StateWrapper& sw) const override;

View File

@@ -1,6 +1,7 @@
// SPDX-FileCopyrightText: 2002-2025 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
#include "IconsPromptFont.h"
#include "USB/qemu-usb/qusb.h"
#include "USB/qemu-usb/USBinternal.h"
#include "USB/usb-printer/usb-printer.h"
@@ -331,6 +332,11 @@ namespace usb_printer
return "printer";
}
const char* PrinterDevice::IconName() const
{
return ICON_PF_PRINTER;
}
bool PrinterDevice::Freeze(USBDevice* dev, StateWrapper& sw) const
{
PrinterState* s = USB_CONTAINER_OF(dev, PrinterState, dev);

View File

@@ -114,6 +114,7 @@ namespace usb_printer
USBDevice* CreateDevice(SettingsInterface& si, u32 port, u32 subtype) const override;
const char* Name() const override;
const char* TypeName() const override;
const char* IconName() const override;
bool Freeze(USBDevice* dev, StateWrapper& sw) const override;
std::span<const char*> SubTypes() const override;

View File

@@ -2251,8 +2251,15 @@ bool VMManager::ChangeDisc(CDVD_SourceType source, std::string path)
{
if (source == CDVD_SourceType::NoDisc)
{
Host::AddIconOSDMessage("ChangeDisc", ICON_FA_COMPACT_DISC, TRANSLATE_SV("VMManager", "Disc removed."),
Host::OSD_INFO_DURATION);
if (old_path.empty())
Host::AddIconOSDMessage("ChangeDisc", ICON_FA_COMPACT_DISC, TRANSLATE_SV("VMManager", "No disc to remove."),
Host::OSD_INFO_DURATION);
else
{
Host::AddIconOSDMessage("ChangeDisc", ICON_FA_COMPACT_DISC, TRANSLATE_SV("VMManager", "Disc removed."),
Host::OSD_INFO_DURATION);
Console.WriteLnFmt("Removed disc: '{}'", old_path);
}
}
else
{