Compare commits

...
62 Commits
Author SHA1 Message Date
Ty d8d27c9072 New translations pcsx2-qt_en.ts (Azerbaijani)
[ci skip]
[ci skip]
2026-08-19 12:43:57 -04:00
Ty 9029106ce8 New translations pcsx2-qt_en.ts (Croatian)
[ci skip]
[ci skip]
2026-08-19 12:43:52 -04:00
copilot-swe-agent[bot]andF0bes 7a6e67fb07 translations: Fix format string placeholder mismatches in es-419, hr-HR, sr-SP (AI-assisted)
Co-authored-by: F0bes <29295048+F0bes@users.noreply.github.com>
2026-08-19 00:45:25 +00:00
Ty 4cbc36ef40 New translations pcsx2-qt_en.ts (Froglish)
[ci skip]
[ci skip]
2026-08-18 20:39:27 -04:00
Ty b0a0b5e711 New translations pcsx2-qt_en.ts (Spanish, Latin America)
[ci skip]
[ci skip]
2026-08-18 20:39:25 -04:00
Ty 5a52d9fbc3 New translations pcsx2-qt_en.ts (Guarani)
[ci skip]
[ci skip]
2026-08-18 20:39:22 -04:00
Ty 50b159e4c6 New translations pcsx2-qt_en.ts (Quechua)
[ci skip]
[ci skip]
2026-08-18 20:39:18 -04:00
Ty c92e6b9e83 New translations pcsx2-qt_en.ts (Hindi)
[ci skip]
[ci skip]
2026-08-18 20:39:16 -04:00
Ty 2ecc0694b1 New translations pcsx2-qt_en.ts (Azerbaijani)
[ci skip]
[ci skip]
2026-08-18 20:39:13 -04:00
Ty f3081ef97d New translations pcsx2-qt_en.ts (Latvian)
[ci skip]
[ci skip]
2026-08-18 20:39:10 -04:00
Ty b3cb212e5b New translations pcsx2-qt_en.ts (Croatian)
[ci skip]
[ci skip]
2026-08-18 20:39:08 -04:00
Ty ab3145d4b1 New translations pcsx2-qt_en.ts (Persian)
[ci skip]
[ci skip]
2026-08-18 20:39:05 -04:00
Ty d3f97d1289 New translations pcsx2-qt_en.ts (Indonesian)
[ci skip]
[ci skip]
2026-08-18 20:39:02 -04:00
Ty 42282d5e79 New translations pcsx2-qt_en.ts (Portuguese, Brazilian)
[ci skip]
[ci skip]
2026-08-18 20:38:59 -04:00
Ty 6528341da6 New translations pcsx2-qt_en.ts (Vietnamese)
[ci skip]
[ci skip]
2026-08-18 20:38:56 -04:00
Ty 4185ea6f5d New translations pcsx2-qt_en.ts (Chinese Traditional)
[ci skip]
[ci skip]
2026-08-18 20:38:52 -04:00
Ty 82ca1da7e9 New translations pcsx2-qt_en.ts (Chinese Simplified)
[ci skip]
[ci skip]
2026-08-18 20:38:49 -04:00
Ty 9e745d5618 New translations pcsx2-qt_en.ts (Ukrainian)
[ci skip]
[ci skip]
2026-08-18 20:38:46 -04:00
Ty 96556966ba New translations pcsx2-qt_en.ts (Turkish)
[ci skip]
[ci skip]
2026-08-18 20:38:43 -04:00
Ty 95d1d55119 New translations pcsx2-qt_en.ts (Swedish)
[ci skip]
[ci skip]
2026-08-18 20:38:40 -04:00
Ty 184846eb3d New translations pcsx2-qt_en.ts (Serbian (Cyrillic))
[ci skip]
[ci skip]
2026-08-18 20:38:37 -04:00
Ty 318bfec422 New translations pcsx2-qt_en.ts (Russian)
[ci skip]
[ci skip]
2026-08-18 20:38:34 -04:00
Ty 3b8fb1e9bf New translations pcsx2-qt_en.ts (Portuguese)
[ci skip]
[ci skip]
2026-08-18 20:38:31 -04:00
Ty f218114c12 New translations pcsx2-qt_en.ts (Polish)
[ci skip]
[ci skip]
2026-08-18 20:38:29 -04:00
Ty a02ad8c97b New translations pcsx2-qt_en.ts (Norwegian)
[ci skip]
[ci skip]
2026-08-18 20:38:26 -04:00
Ty d76653cf08 New translations pcsx2-qt_en.ts (Dutch)
[ci skip]
[ci skip]
2026-08-18 20:38:23 -04:00
Ty 5407914c4f New translations pcsx2-qt_en.ts (Lithuanian)
[ci skip]
[ci skip]
2026-08-18 20:38:20 -04:00
Ty 5458c11111 New translations pcsx2-qt_en.ts (Korean)
[ci skip]
[ci skip]
2026-08-18 20:38:17 -04:00
Ty 921e11d6bd New translations pcsx2-qt_en.ts (Georgian)
[ci skip]
[ci skip]
2026-08-18 20:38:15 -04:00
Ty 6e5254ef76 New translations pcsx2-qt_en.ts (Japanese)
[ci skip]
[ci skip]
2026-08-18 20:38:12 -04:00
Ty 6ad9f273c4 New translations pcsx2-qt_en.ts (Italian)
[ci skip]
[ci skip]
2026-08-18 20:38:09 -04:00
Ty 8f59d83e1a New translations pcsx2-qt_en.ts (Hungarian)
[ci skip]
[ci skip]
2026-08-18 20:38:06 -04:00
Ty bbef6bfb04 New translations pcsx2-qt_en.ts (Hebrew)
[ci skip]
[ci skip]
2026-08-18 20:38:03 -04:00
Ty c7846ef4b4 New translations pcsx2-qt_en.ts (Finnish)
[ci skip]
[ci skip]
2026-08-18 20:38:01 -04:00
Ty cfa65211ed New translations pcsx2-qt_en.ts (Greek)
[ci skip]
[ci skip]
2026-08-18 20:37:58 -04:00
Ty 200dacccf9 New translations pcsx2-qt_en.ts (German)
[ci skip]
[ci skip]
2026-08-18 20:37:55 -04:00
Ty ce5baa19f1 New translations pcsx2-qt_en.ts (Danish)
[ci skip]
[ci skip]
2026-08-18 20:37:52 -04:00
Ty 17002e4e45 New translations pcsx2-qt_en.ts (Czech)
[ci skip]
[ci skip]
2026-08-18 20:37:50 -04:00
Ty 5168defa99 New translations pcsx2-qt_en.ts (Catalan)
[ci skip]
[ci skip]
2026-08-18 20:37:47 -04:00
Ty cc3d3ec444 New translations pcsx2-qt_en.ts (Bulgarian)
[ci skip]
[ci skip]
2026-08-18 20:37:43 -04:00
Ty 345f7e19d2 New translations pcsx2-qt_en.ts (Arabic)
[ci skip]
[ci skip]
2026-08-18 20:37:41 -04:00
Ty e20fda310e New translations pcsx2-qt_en.ts (Afrikaans)
[ci skip]
[ci skip]
2026-08-18 20:37:38 -04:00
Ty 00e379f994 New translations pcsx2-qt_en.ts (Spanish)
[ci skip]
[ci skip]
2026-08-18 20:37:34 -04:00
Ty 04dc9fc054 New translations pcsx2-qt_en.ts (French)
[ci skip]
[ci skip]
2026-08-18 20:37:31 -04:00
Ty ae93ff15d3 New translations pcsx2-qt_en.ts (Romanian)
[ci skip]
[ci skip]
2026-08-18 20:37:28 -04:00
PCSX2 Bot 4fd1a4192a [ci skip] Qt: Update Base Translation. 2026-08-18 10:04:18 +02:00
SternXD 4ef1ff82e6 Qt/macOS: Keep Fullscreen on the main window 2026-08-17 18:37:50 +02:00
refractionpcsx2 cde2448a6c GameDB: Add Prioritize Lower depth fix to Steambot Chronicles 2026-08-15 14:26:15 +02:00
refractionpcsx2 ded263f98a GS/HW: Avoid detecting shuffles as source of truth for target format 2026-08-15 14:26:15 +02:00
refractionpcsx2 ffa5690656 GS/TC: Improve single pixel overlap detection in RT in RT 2026-08-15 14:26:15 +02:00
Ziemas ca03806a4c EE/IOP: Fix loading elf's through relative path 2026-08-13 14:52:05 -04:00
PCSX2 Bot 2cf8dabe6b [ci skip] PAD: Update to latest controller database. 2026-08-10 12:35:19 -04:00
lightningterror 8c1bb5742e GS: Fix unused variable warning. 2026-08-10 00:45:08 +02:00
TellowKrinkle d88510e3a6 GS: Fix Vertex Buffer Growth 2026-08-08 20:26:00 +02:00
TellowKrinkle af48193ebb GS: Fix Lines2Sprites buffer growth 2026-08-08 20:26:00 +02:00
refractionpcsx2 9945046a49 GS: Improve vertex copy over to new buffer + small tweaks 2026-08-08 13:26:05 +02:00
refractionpcsx2 5c611f85e1 GS: Use current primitive mode for backing up spare vert buffers 2026-08-08 05:22:07 +02:00
PCSX2 Bot c3df2360fc [ci skip] Qt: Update Base Translation. 2026-08-07 03:15:28 +02:00
TJnotJT 29b7bc4466 GS:VK: Only use feedback loop layout for depth if texture barrier is supported. 2026-08-07 01:02:39 +02:00
SternXD 624717dfad GS: Fix status bar GPU % when OSD GPU usage is off 2026-08-04 23:01:34 +02:00
PCSX2 Bot 4055a19a1d [ci skip] PAD: Update to latest controller database. 2026-08-03 12:52:19 -04:00
PCSX2 Bot 7fd49498ab [ci skip] Qt: Update Base Translation. 2026-08-03 07:34:27 -04:00
57 changed files with 297213 additions and 206689 deletions
+5
View File
@@ -25662,6 +25662,7 @@ SLES-54138:
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
limit24BitDepth: 2 # Fixes icon brightness.
SLES-54139:
name: "Earache - Extreme Metal Racing"
region: "PAL-E"
@@ -26318,6 +26319,7 @@ SLES-54335:
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
limit24BitDepth: 2 # Fixes icon brightness.
SLES-54336:
name: "Lumines Plus"
region: "PAL-M5"
@@ -71845,6 +71847,7 @@ SLUS-21344:
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
limit24BitDepth: 2 # Fixes icon brightness.
SLUS-21345:
name: "Grandia III [Disc 2 of 2]"
region: "NTSC-U"
@@ -75403,6 +75406,7 @@ SLUS-28061:
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
limit24BitDepth: 2 # Fixes icon brightness.
SLUS-28062:
name: "Dance Factory [Trade Demo]"
region: "NTSC-U"
@@ -76189,6 +76193,7 @@ SLUS-29188:
preloadFrameData: 1 # Fixes menu graphics.
autoFlush: 1 # Fixes motion blur.
minimumBlendingLevel: 2 # Improves post effects.
limit24BitDepth: 2 # Fixes icon brightness.
SLUS-29189:
name: "FIFA World Cup - Germany 2006 [Demo]"
region: "NTSC-U"
+7 -3
View File
@@ -79,10 +79,10 @@
03000000c82d00001230000000000000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00001330000000000000,8BitDo Ultimate,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00001260000000000000,8BitDo Ultimate 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b17,paddle2:b16,paddle3:b2,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00000a31000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00001b30000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00001c30000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00001d30000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00000a31000000000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00001530000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00001630000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000c82d00001730000000000000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
@@ -244,7 +244,7 @@
03000000ac0500001a06000000000000,GameSir T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000373500000410000000000000,GameSir T4 Kaleid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
03000000373500009410000000000000,GameSir Tegenaria Lite,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
03000000373500001611000000000000,GameSir X5 Lite,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b8,righttrigger:b9,platform:Windows,
03000000373500001611000000000000,GameSir X5 Lite,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
030000004c0e00001035000000000000,Gamester,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,
030000000d0f00001110000000000000,GameStick Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,
0300000047530000616d000000000000,GameStop,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,
@@ -428,7 +428,6 @@
03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
030000002a0600001024000000000000,Matricom,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:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,
030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,
030000008f0e00001330000000000000,Mayflash Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Windows,
03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows,
03000000242f00003700000000000000,Mayflash F101,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
03000000790000003018000000000000,Mayflash F300 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
@@ -441,6 +440,7 @@
03000000242f0000f400000000000000,Mayflash N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a5,start:b9,platform:Windows,
03000000242f0000f500000000000000,Mayflash N64 Adapter,a:b2,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a5,start:b9,platform:Windows,
03000000790000007918000000000000,Mayflash N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,righttrigger:b7,rightx:a3,righty:a2,start:b8,platform:Windows,
030000008f0e00001330000000000000,Mayflash N64 Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Windows,
030000008f0e00001030000000000000,Mayflash Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,lefttrigger:b7,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,
0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,
03000000790000000318000000000000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,
@@ -516,6 +516,7 @@
030000006f0e00000901000000000000,PDP PS3 Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
030000006f0e00008901000000000000,PDP Realmz Nintendo Switch Controller,a:b1,b:b2,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:b0,y:b3,platform:Windows,
030000008f0e00004100000000000000,PlaySega,a:b1,b:b0,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b4,y:b3,platform:Windows,
03000000d620000020a7000000000000,PowerA Advantage Nintendo Switch 2 Controller,a:b1,b:b2,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,misc2:b16,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
03000000d620000011a7000000000000,PowerA Core Controller,a:b1,b:b2,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:b0,y:b3,platform:Windows,
03000000dd62000015a7000000000000,PowerA Fusion Nintendo Switch Arcade Stick,a:b1,b:b2,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:b0,y:b3,platform:Windows,
03000000d620000012a7000000000000,PowerA Fusion Nintendo Switch Fight Pad,a:b1,b:b2,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:b0,y:b3,platform:Windows,
@@ -804,6 +805,8 @@
030000006f0e00000302000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
030000006f0e00000702000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
0300000034120000adbe000000000000,vJoy Device,a:b0,b:b1,back:b15,dpdown:b6,dpleft:b7,dpright:b8,dpup:b5,guide:b16,leftshoulder:b9,leftstick:b13,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b14,righttrigger:b12,rightx:a3,righty:a4,start:b4,x:b2,y:b3,platform:Windows,
03000000d23800001010000000000000,Void Genesis,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b2,leftstick:b9,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b18,misc2:b21,misc3:b20,paddle1:b22,paddle2:b15,paddle3:b23,paddle4:b17,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a5,start:b19,x:b3,y:b4,platform:Windows,
03000000d23800001210000000000000,Void Genesis,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b2,leftstick:b9,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b18,misc2:b21,misc3:b20,paddle1:b22,paddle2:b15,paddle3:b23,paddle4:b17,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a5,start:b19,x:b3,y:b4,platform:Windows,
03000000120c0000ab57000000000000,Warrior Joypad JS083,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
030000007e0500003003000000000000,Wii U Pro,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b6,leftstick:b11,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b12,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,
0300000032150000030a000000000000,Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
@@ -1470,6 +1473,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
030000006d0400001ec2000020200000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006d04000019c2000011010000,Logitech F710,a:b1,b:b2,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:b0,y:b3,platform:Linux,
030000006d0400001fc2000005030000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
030000006d0400001ac2000010010000,Logitech Precision,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,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:b0,y:b3,platform:Linux,
030000006d04000019c2000010010000,Logitech RumblePad 2,a:b1,b:b2,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:b0,y:b3,platform:Linux,
030000006d0400000ac2000010010000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Linux,
+79
View File
@@ -1202,6 +1202,21 @@ void MainWindow::updateDisplayRelatedActions(bool has_surface, bool render_to_ma
QSignalBlocker blocker(m_ui.actionToolbarFullscreen);
m_ui.actionToolbarFullscreen->setChecked(fullscreen);
}
#ifdef __APPLE__
if (render_to_main && fullscreen)
{
m_ui.toolBar->setVisible(false);
m_ui.statusBar->setVisible(false);
}
else
{
m_ui.toolBar->setVisible(m_ui.actionViewToolbar->isChecked());
m_ui.statusBar->setVisible(m_ui.actionViewStatusBar->isChecked());
}
m_ui.actionViewToolbar->setEnabled(!(render_to_main && fullscreen));
m_ui.actionViewStatusBar->setEnabled(!(render_to_main && fullscreen));
#endif
}
void MainWindow::updateStatusBarWidgetVisibility()
@@ -1376,6 +1391,12 @@ bool MainWindow::isRenderingFullscreen() const
if (!MTGS::IsOpen() || !m_display_surface)
return false;
#ifdef __APPLE__
// When rendering to main, the main window is what goes fullscreen.
if (isRenderingToMain())
return isFullScreen();
#endif
return m_display_surface->isFullScreen();
}
@@ -1394,7 +1415,12 @@ bool MainWindow::shouldHideMainWindow() const
{
// NOTE: We can't use isRenderingToMain() here, because this happens post-fullscreen-switch.
return (Host::GetBoolSettingValue("UI", "HideMainWindowWhenRunning", false) && !g_emu_thread->shouldRenderToMain()) ||
#ifdef __APPLE__
// macOS keeps fullscreen on the main window so don't hide it there.
(g_emu_thread->shouldRenderToMain() && (g_emu_thread->isExclusiveFullscreen() || m_is_temporarily_windowed)) ||
#else
(g_emu_thread->shouldRenderToMain() && (isRenderingFullscreen() || g_emu_thread->isExclusiveFullscreen() || m_is_temporarily_windowed)) ||
#endif
Host::InNoGUIMode();
}
@@ -2796,6 +2822,27 @@ std::optional<WindowInfo> MainWindow::acquireRenderWindow(bool recreate_window,
return m_display_surface->getWindowInfo();
}
#ifdef __APPLE__
// Skip recreating when toggling fullscreen if we're still rendering to main.
if (m_display_created && !recreate_window && is_rendering_to_main && render_to_main && !changing_surfaceless)
{
updateDisplayRelatedActions(true, true, fullscreen);
if (fullscreen)
showFullScreen();
else
showNormal();
while (!m_is_closing && isFullScreen() != fullscreen)
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
updateDisplayWidgetCursor();
m_display_surface->setFocus();
updateWindowState();
return m_display_surface->getWindowInfo();
}
#endif
destroyDisplayWidget(surfaceless);
m_display_created = true;
@@ -2835,14 +2882,23 @@ void MainWindow::createDisplayWidget(bool fullscreen, bool render_to_main)
{
// If we're rendering to main and were hidden (e.g. coming back from fullscreen),
// make sure we're visible before trying to add ourselves. Otherwise Wayland breaks.
#ifdef __APPLE__
// On macOS the main window itself goes fullscreen so it needs to be visible then too.
if (render_to_main && !isVisible())
#else
if (!fullscreen && render_to_main && !isVisible())
#endif
{
setVisible(true);
QGuiApplication::sync();
}
m_display_surface = new DisplaySurface();
#ifdef __APPLE__
if (!render_to_main)
#else
if (fullscreen || !render_to_main)
#endif
{
#ifdef DISPLAY_SURFACE_WINDOW
m_display_surface->setTitle(windowTitle());
@@ -2858,7 +2914,11 @@ void MainWindow::createDisplayWidget(bool fullscreen, bool render_to_main)
m_display_container = m_display_surface->createWindowContainer(getContentParent());
}
#ifdef __APPLE__
if (!render_to_main && (fullscreen || g_emu_thread->isExclusiveFullscreen()))
#else
if (fullscreen || g_emu_thread->isExclusiveFullscreen())
#endif
{
// On Wayland, while move/restoreGeometry can't position the window, it can influence which screen they show up on.
// Other platforms can position windows fine, but the only thing that matters here is the screen.
@@ -2914,6 +2974,15 @@ void MainWindow::createDisplayWidget(bool fullscreen, bool render_to_main)
updateDisplayRelatedActions(true, render_to_main, fullscreen);
#ifdef __APPLE__
if (render_to_main && fullscreen)
{
showFullScreen();
while (!m_is_closing && !isFullScreen())
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
}
#endif
// We need the surface visible.
QGuiApplication::sync();
}
@@ -3006,6 +3075,16 @@ void MainWindow::destroyDisplayWidget(bool show_game_list)
if (!(m_display_surface->isFullScreen() || m_display_is_exclusive_fullscreen) && !isRenderingToMain())
saveDisplayWindowGeometryToConfig();
#ifdef __APPLE__
// Need to leave fullscreen before destroying otherwise we could get stuck in it.
if (isRenderingToMain() && isFullScreen())
{
showNormal();
while (isFullScreen())
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
}
#endif
if (isRenderingToMain())
{
pxAssertRel(m_ui.mainContainer->indexOf(m_display_container) == 1, "Display widget in stack");
+5
View File
@@ -898,7 +898,12 @@ std::optional<WindowInfo> EmuThread::acquireRenderWindow(bool recreate_window)
// Check if we're wanting to get exclusive fullscreen. This should be safe to read, since we're going to be calling from the GS thread.
m_is_exclusive_fullscreen = m_is_fullscreen && GSWantsExclusiveFullscreen();
const bool window_fullscreen = m_is_fullscreen && !m_is_exclusive_fullscreen;
#ifdef __APPLE__
// Fullscreen the main window instead of opening a separate one on macOS.
const bool render_to_main = !m_is_exclusive_fullscreen && m_is_rendering_to_main;
#else
const bool render_to_main = !m_is_exclusive_fullscreen && !window_fullscreen && m_is_rendering_to_main;
#endif
return emit onAcquireRenderWindowRequested(recreate_window, window_fullscreen, render_to_main, m_is_surfaceless);
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -161,7 +161,7 @@ static bool OpenGSDevice(GSRendererType renderer, bool clear_state_on_fail, bool
return false;
}
if (GSConfig.OsdShowGPU && !g_gs_device->SetGPUTimingEnabled(true))
if (!g_gs_device->SetGPUTimingEnabled(true))
GSConfig.OsdShowGPU = false;
if (GSConfig.OsdShowGPUStats && !g_gs_device->SetGPUPipelineStatisticsEnabled(true))
GSConfig.OsdShowGPUStats = false;
@@ -881,9 +881,9 @@ void GSUpdateConfig(const Pcsx2Config::GSOptions& new_config)
g_gs_renderer->PurgeTextureCache(true, false, true);
}
if (GSConfig.OsdShowGPU != old_config.OsdShowGPU)
if (GSConfig.OsdShowGPU && !old_config.OsdShowGPU)
{
if (!g_gs_device->SetGPUTimingEnabled(GSConfig.OsdShowGPU))
if (!g_gs_device->SetGPUTimingEnabled(true))
GSConfig.OsdShowGPU = false;
}
+64 -62
View File
@@ -373,6 +373,7 @@ void GSState::ResetDrawBufferIdx()
void GSState::ResetDrawBuffers()
{
m_used_buffers_idx = 1;
m_max_vertex_count = 0;
for (int i = 0; i < MAX_DRAW_BUFFERS; i++)
{
@@ -383,9 +384,9 @@ void GSState::ResetDrawBuffers()
m_index = &m_index_buffers[i];
m_vertex = &m_vertex_buffers[i];
m_vertex_buffers[i].head = m_vertex_buffers[i].tail = m_vertex_buffers[i].next = 0;
GrowVertexBuffer();
}
GrowVertexBuffer();
ResetDrawBufferIdx();
}
@@ -473,15 +474,16 @@ void GSState::PushBuffer()
m_index = &m_index_buffers[m_used_buffers_idx];
m_vertex = &m_vertex_buffers[m_used_buffers_idx];
GSVertexBuff& vtx_buff = *m_vertex;
GSIndexBuff& idx_buff = *m_index;
const u32 base = m_vertex_buffers[m_current_buffer_idx].head;
const u32 copy_amt = m_vertex_buffers[m_current_buffer_idx].tail - base;
u32 copy_amt = m_vertex_buffers[m_current_buffer_idx].tail - base;
m_vertex->tail = 0;
if (copy_amt)
if (copy_amt && m_env.PRIM.PRIM == m_env_buffers[m_current_buffer_idx].m_env.PRIM.PRIM)
memcpy(vtx_buff.buff, &m_vertex_buffers[m_current_buffer_idx].buff[base], sizeof(GSVertex) * copy_amt);
else
copy_amt = 0;
vtx_buff.head = 0;
vtx_buff.next = 0;
@@ -638,20 +640,27 @@ bool GSState::CanBufferNewDraw()
GSVertexBuff& vtx_buff = *m_vertex;
GSIndexBuff& idx_buff = *m_index;
const u32 copy_amt = m_vertex_buffers[m_current_buffer_idx].tail - m_vertex_buffers[m_current_buffer_idx].head;
m_recent_buffer_switch = vtx_buff.tail == vtx_buff.head;
if (idx_buff.tail)
vtx_buff.tail = idx_buff.buff[idx_buff.tail - 1] + 1;
vtx_buff.tail = std::max(idx_buff.buff[idx_buff.tail - 1], idx_buff.buff[std::max(static_cast<int>(idx_buff.tail) - 2, 0)]) + 1;
else
vtx_buff.tail = 0;
if (copy_amt)
memcpy(&vtx_buff.buff[vtx_buff.tail], &m_vertex_buffers[m_current_buffer_idx].buff[m_vertex_buffers[m_current_buffer_idx].head], sizeof(GSVertex) * copy_amt);
vtx_buff.head = vtx_buff.tail;
vtx_buff.next = vtx_buff.head;
vtx_buff.tail += copy_amt;
u32 copy_amt = m_vertex_buffers[m_current_buffer_idx].tail - m_vertex_buffers[m_current_buffer_idx].head;
if (copy_amt && m_env_buffers[i].m_env.PRIM.PRIM == m_env_buffers[m_current_buffer_idx].m_env.PRIM.PRIM)
{
memcpy(&vtx_buff.buff[vtx_buff.tail], &m_vertex_buffers[m_current_buffer_idx].buff[m_vertex_buffers[m_current_buffer_idx].head], sizeof(GSVertex) * copy_amt);
vtx_buff.tail += copy_amt;
}
else
copy_amt = 0;
m_recent_buffer_switch = vtx_buff.tail == vtx_buff.head;
m_backed_up_ctx = m_env_buffers[i].m_backed_up_ctx;
temp_draw_rect = m_env_buffers[i].draw_rect;
m_env_buffers[i].m_dirty_regs = 0;
@@ -678,7 +687,6 @@ bool GSState::CanBufferNewDraw()
vtx_buff.xy_tail = 0;
m_current_buffer_idx = i;
}
m_dirty_gs_regs = 0;
@@ -2527,7 +2535,8 @@ void GSState::FlushPrim()
if (tail > head)
{
switch (PRIM->PRIM)
// NOTE: Do not use PRIM->PRIM as the previous environment may have been restored and it may have changed from strip to fan, which messes up the backup.
switch (m_env.PRIM.PRIM)
{
case GS_POINTLIST:
pxAssert(0);
@@ -2667,7 +2676,7 @@ void GSState::FlushPrim()
// If it's a Triangle fan the XY buffer needs to be updated to point to the correct head vert
// Jak 3 shadows get spikey (with autoflush) if you don't.
if (PRIM->PRIM == GS_TRIANGLEFAN)
if (m_env.PRIM.PRIM == GS_TRIANGLEFAN)
{
for (u32 i = 0; i < unused; i++)
{
@@ -3817,56 +3826,49 @@ void GSState::UpdateVertexKick()
m_fpGIFPackedRegHandlersC[GIF_REG_STQRGBAXYZ2] = m_fpGIFPackedRegHandlerSTQRGBAXYZ2[prim];
}
static void GrowBuffer(void** pbuff, size_t old_size, size_t new_size, bool vertices)
{
void* new_buff = _aligned_malloc(new_size, 32);
if (!new_buff)
{
Console.Error("GS: failed to allocate %zu bytes for %s.", new_size, vertices ? "vertices" : "indices");
pxFailRel("Memory allocation failed");
}
if (*pbuff)
{
if (old_size)
{
std::memcpy(new_buff, *pbuff, old_size);
}
_aligned_free(*pbuff);
}
*pbuff = new_buff;
}
template <typename T>
static void GrowBuffer(T** pbuff, size_t old_count, size_t new_count)
{
static_assert(std::is_same_v<T, GSVertex> || std::is_same_v<T, u16>, "For use with indices or vertices");
GrowBuffer(reinterpret_cast<void**>(pbuff), old_count * sizeof(T), new_count * sizeof(T), std::is_same_v<T, GSVertex>);
}
void GSState::GrowVertexBuffer()
{
const u32 maxcount = std::max<u32>(m_vertex->maxcount * 3 / 2, 10000);
const u32 old_vertex_size = sizeof(GSVertex) * m_vertex->tail;
const u32 new_vertex_size = sizeof(GSVertex) * maxcount;
const u32 old_index_size = sizeof(u16) * m_index->tail;
const u32 new_index_size = sizeof(u16) * maxcount * 6; // Worst case index list is a list of points with vs expansion, 6 indices per point
const u32 maxcount = std::max<u32>(m_max_vertex_count * 3 / 2, 10000);
const u32 new_vertex_count = maxcount;
const u32 new_index_count = maxcount * 6; // Worst case index list is a list of points with vs expansion, 6 indices per point
// Structure describing buffers to reallocate
struct AllocDesc
for (GSVertexBuff& buf : m_vertex_buffers)
{
void** pbuff;
u32 old_size;
u32 new_size;
};
const std::array<AllocDesc, 5> alloc_desc = {{
{reinterpret_cast<void**>(&m_vertex->buff), old_vertex_size, new_vertex_size},
// discard contents of buff_copy by setting old_size = 0
{reinterpret_cast<void**>(&m_vertex->buff_copy), 0, new_vertex_size},
{reinterpret_cast<void**>(&m_draw_vertex.buff), old_vertex_size, new_vertex_size},
{reinterpret_cast<void**>(&m_index->buff), old_index_size, new_index_size},
{reinterpret_cast<void**>(&m_draw_index.buff), old_index_size, new_index_size}
}};
// For logging
u32 total_size = 0;
for (const auto& desc : alloc_desc)
total_size += desc.new_size;
// Reallocate each of the needed buffers
for (const auto [pbuff, old_size, new_size] : alloc_desc)
{
void* new_buff = _aligned_malloc(new_size, 32);
if (!new_buff)
{
Console.Error("GS: failed to allocate %zu bytes for vertices and indices.", total_size);
pxFailRel("Memory allocation failed");
}
if (*pbuff)
{
if (old_size)
{
std::memcpy(new_buff, *pbuff, old_size);
}
_aligned_free(*pbuff);
}
*pbuff = new_buff;
GrowBuffer(&buf.buff, buf.tail, new_vertex_count);
GrowBuffer(&buf.buff_copy, 0, new_vertex_count);
}
for (GSIndexBuff& buf : m_index_buffers)
GrowBuffer(&buf.buff, buf.tail, new_index_count);
GrowBuffer(&m_draw_vertex.buff, m_vertex->tail, new_vertex_count);
GrowBuffer(&m_draw_index.buff, m_index->tail, new_index_count);
m_vertex->maxcount = maxcount - 3; // -3 to have some space at the end of the buffer before DrawingKick can grow it
m_max_vertex_count = maxcount - 3; // -3 to have some space at the end of the buffer before DrawingKick can grow it
}
// For returning order of vertices to form a right triangle
@@ -5835,7 +5837,7 @@ __forceinline void GSState::VertexKick(u32 skip)
GSVertexBuff& vtx_buff = *m_vertex;
GSIndexBuff& idx_buff = *m_index;
static_assert(n > 0);
pxAssert(vtx_buff.tail < vtx_buff. maxcount + 3);
pxAssert(vtx_buff.tail < m_max_vertex_count + 3);
if constexpr (prim == GS_INVALID)
{
@@ -5972,7 +5974,7 @@ __forceinline void GSState::VertexKick(u32 skip)
vtx_buff.head = head + 1;
[[fallthrough]];
case GS_TRIANGLEFAN:
if (tail >= vtx_buff.maxcount)
if (tail >= m_max_vertex_count)
GrowVertexBuffer(); // in case too many vertices were skipped
break;
default:
@@ -5996,7 +5998,7 @@ __forceinline void GSState::VertexKick(u32 skip)
SetDrawBufferEnv();
}
if (tail >= vtx_buff.maxcount)
if (tail >= m_max_vertex_count)
GrowVertexBuffer();
u16* RESTRICT buff = &idx_buff.buff[idx_buff.tail];
+2 -1
View File
@@ -135,12 +135,13 @@ protected:
int m_used_buffers_idx = 0;
int m_current_buffer_idx = 0;
bool m_recent_buffer_switch = false;
u32 m_max_vertex_count;
struct GSVertexBuff
{
GSVertex* buff;
GSVertex* buff_copy; // same size buffer to copy/modify the original buffer
u32 head, tail, next, maxcount; // head: first vertex, tail: last vertex + 1, next: last indexed + 1
u32 head, tail, next; // head: first vertex, tail: last vertex + 1, next: last indexed + 1
u32 xy_tail;
GSVector4i xy[4];
GSVector4i xyhead;
+4 -5
View File
@@ -222,9 +222,7 @@ void GSRendererHW::Lines2Sprites()
// each sprite converted to quad needs twice the space
const int tail = m_vertex->tail * 2;
const int max_count = m_vertex->maxcount;
while (tail > max_count)
while (m_vertex->tail * 2 > m_max_vertex_count)
{
GrowVertexBuffer();
}
@@ -3941,7 +3939,8 @@ void GSRendererHW::Draw()
if (next_ctx.FRAME.Block() == FRAME_TEX0.TBP0 && next_ctx.FRAME.PSM != FRAME_TEX0.PSM)
FRAME_TEX0.PSM = next_ctx.FRAME.PSM;
else if (next_ctx.TEX0.TBP0 == FRAME_TEX0.TBP0 && next_ctx.TEX0.PSM != FRAME_TEX0.PSM)
// Be careful of the next draw being a channel shuffle!
else if (next_ctx.TEX0.TBP0 == FRAME_TEX0.TBP0 && next_ctx.TEX0.PSM != FRAME_TEX0.PSM && GSLocalMemory::m_psm[next_ctx.TEX0.PSM].trbpp >= 16)
FRAME_TEX0.PSM = next_ctx.TEX0.PSM;
else
FRAME_TEX0.PSM = PSMCT32; // Guess full color if no upcoming hint, it'll fix itself later.
@@ -5384,7 +5383,7 @@ void GSRendererHW::HandleFlatShadedVertices()
return;
// De-index the vertices using the copy buffer
while (vtx_buff.maxcount < idx_buff.tail)
while (m_max_vertex_count < idx_buff.tail)
GrowVertexBuffer();
for (int i = static_cast<int>(idx_buff.tail) - 1; i >= 0; i--)
+10 -1
View File
@@ -2580,12 +2580,21 @@ GSTextureCache::Target* GSTextureCache::LookupDrawTarget(GIFRegTEX0 TEX0, const
{
// Some games misuse the scissor so it ends up valid 1 pixel over, which causes hell for us. So check if it still overlaps without the extra pixel.
const GSVector4i adjusted_valid = GSVector4i(t->m_valid.x, t->m_valid.y, std::min(t->m_valid.z, static_cast<int>(t->m_TEX0.TBW) * 64), t->m_valid.w - 1);
const u32 adjusted_endblock = GSLocalMemory::GetEndBlockAddress(t->m_TEX0.TBP0, t->m_TEX0.TBW, t->m_TEX0.PSM, adjusted_valid);
u32 adjusted_endblock = GSLocalMemory::GetUnwrappedEndBlockAddress(t->m_TEX0.TBP0, t->m_TEX0.TBW, t->m_TEX0.PSM, adjusted_valid);
if (adjusted_endblock <= bp)
{
i++;
continue;
}
const GSVector4i adjusted_rect = GSVector4i(min_rect.x, min_rect.y, std::min(min_rect.z, static_cast<int>(t->m_TEX0.TBW) * 64), min_rect.w - 1);
// Also check the offset from the bp to the current request to see if it overlaps the begining of the selected target.
adjusted_endblock = GSLocalMemory::GetUnwrappedEndBlockAddress(TEX0.TBP0, TEX0.TBW, TEX0.PSM, adjusted_rect);
if (adjusted_endblock <= t->m_TEX0.TBP0)
{
i++;
continue;
}
const GSLocalMemory::psm_t& s_psm = GSLocalMemory::m_psm[TEX0.PSM];
const u32 widthpage_offset = (std::abs(static_cast<int>(bp - t->m_TEX0.TBP0)) >> 5) % std::max(t->m_TEX0.TBW, 1U);
const bool is_aligned_ok = widthpage_offset == 0 || ((min_rect.width() <= static_cast<int>((t->m_TEX0.TBW - widthpage_offset) * 64) && (t->m_TEX0.TBW == TEX0.TBW || TEX0.TBW == 1)) && bp >= t->m_TEX0.TBP0);
+1 -1
View File
@@ -320,7 +320,7 @@ void GSRendererSW::RewriteVerticesIfSTOverflow()
constexpr int n = GSUtil::GetClassVertexCount(primclass);
// Make sure the copy buffer is large enough.
while (m_vertex->maxcount < m_index->tail)
while (m_max_vertex_count < m_index->tail)
GrowVertexBuffer();
GSVertex* RESTRICT vertex = m_vertex->buff;
+9 -5
View File
@@ -1657,9 +1657,11 @@ VkRenderPass GSDeviceVK::CreateCachedRenderPass(RenderPassCacheKey key)
if (key.depth_format != VK_FORMAT_UNDEFINED)
{
const VkImageLayout layout =
key.depth_sampling ? (UseFeedbackLoopLayout() ? VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT :
VK_IMAGE_LAYOUT_GENERAL) :
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
key.depth_sampling ?
((m_features.depth_feedback && UseFeedbackLoopLayout()) ?
VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT :
VK_IMAGE_LAYOUT_GENERAL) :
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
attachments[num_attachments] = {0, static_cast<VkFormat>(key.depth_format), VK_SAMPLE_COUNT_1_BIT,
static_cast<VkAttachmentLoadOp>(key.depth_load_op), static_cast<VkAttachmentStoreOp>(key.depth_store_op),
static_cast<VkAttachmentLoadOp>(key.stencil_load_op),
@@ -3757,12 +3759,14 @@ void GSDeviceVK::OMSetRenderTargets(
}
else if (feedback_loop & FeedbackLoopFlag_ReadDepth)
{
if (vkDs->GetLayout() != GSTextureVK::Layout::FeedbackLoop)
const GSTextureVK::Layout layout = m_features.depth_feedback ?
GSTextureVK::Layout::FeedbackLoop : GSTextureVK::Layout::General;
if (vkDs->GetLayout() != layout)
{
m_dirty_flags |= (DIRTY_FLAG_TFX_TEXTURE_0 << TFX_TEXTURE_TEXTURE);
if (m_tfx_textures[TFX_TEXTURE_TEXTURE] == vkDs)
m_dirty_flags |= DIRTY_FLAG_TFX_TEXTURE_0 << TFX_TEXTURE_TEXTURE;
vkDs->TransitionToLayout(GSTextureVK::Layout::FeedbackLoop);
vkDs->TransitionToLayout(layout);
}
}
else
+1
View File
@@ -6324,6 +6324,7 @@ TRANSLATE_NOOP("FullscreenUI", "Tile");
TRANSLATE_NOOP("FullscreenUI", "Xbox");
TRANSLATE_NOOP("FullscreenUI", "PlayStation");
TRANSLATE_NOOP("FullscreenUI", "Nintendo");
TRANSLATE_NOOP("FullscreenUI", "Generic");
TRANSLATE_NOOP("FullscreenUI", "Enabled");
TRANSLATE_NOOP("FullscreenUI", "Disabled");
TRANSLATE_NOOP("FullscreenUI", "2% [1 FPS (NTSC) / 1 FPS (PAL)]");
+3 -2
View File
@@ -83,8 +83,9 @@ static std::string hostRoot;
void Hle_SetHostRoot(const char* bootFilename)
{
hostRoot = Path::ToNativePath(Path::GetDirectory(bootFilename));
Console.WriteLn("HLE Host: Set 'host:' root path to: %s\n", hostRoot.c_str());
std::string path = Path::RealPath(bootFilename);
hostRoot = Path::ToNativePath(Path::GetDirectory(path));
Console.WriteLn("HLE Host: Set 'host:' root path to: %s", hostRoot.c_str());
}
void Hle_ClearHostRoot()
+3 -1
View File
@@ -3,6 +3,7 @@
#include "Common.h"
#include "common/Path.h"
#include "common/StringUtil.h"
#include "ps2/BiosTools.h"
#include "R5900.h"
@@ -671,7 +672,8 @@ void eeloadHook()
const std::string& elf_override = VMManager::Internal::GetELFOverride();
if (!elf_override.empty())
{
elfname = fmt::format("host:{}", elf_override);
// The host: root should be directory containg the elf, so get only the filename part
elfname = fmt::format("host:{}", Path::GetFileName(elf_override));
}
else
{