mirror of
https://github.com/PCSX2/pcsx2.git
synced 2026-01-31 01:15:24 +01:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7ea33400a9 | ||
|
|
32a3e8e62d | ||
|
|
fa953d7bb3 | ||
|
|
66cd51bcd5 | ||
|
|
ed7ebb77ca | ||
|
|
10fc9a790d | ||
|
|
c42330eebf | ||
|
|
680e05fead | ||
|
|
1f7b98bf6b | ||
|
|
c3a20d421e | ||
|
|
f03ab6f728 | ||
|
|
e9275d78b5 | ||
|
|
8ababb3890 | ||
|
|
422aba4b20 | ||
|
|
045b9bbf40 | ||
|
|
1f519acf92 | ||
|
|
ac9ebdecba |
@@ -25,7 +25,7 @@ LIBBACKTRACE=ad106d5fdd5d960bd33fae1c48a351af567fd075
|
||||
LIBJPEGTURBO=3.1.2
|
||||
LIBPNG=1.6.53
|
||||
LIBWEBP=1.6.0
|
||||
NVENC=11.1.5.3
|
||||
NVENC=13.0.19.0
|
||||
SDL=SDL3-3.4.0
|
||||
QT=6.10.1
|
||||
QTAPNG=1.3.0
|
||||
@@ -57,7 +57,7 @@ e4ab7009bf0629fd11982d4c2aa83964cf244cffba7347ecd39019a9e38c4564 libwebp-$LIBWE
|
||||
082cbf5f429e0d80820f68dc2b507a94d4cc1b4e70817b119bbb8ec6a69584b8 $SDL.tar.gz
|
||||
452a1a290bd0cf18737fad0057dc17b7fdf10a73eda2d6d4f31ba04fda25ef2c libpng-$LIBPNG-apng.patch.gz
|
||||
537512904744b35e232912055ccf8ec66d768639ff3abe5788d90d792ec5f48b lz4-$LZ4.tar.gz
|
||||
2974b91062197e0527dffa3aadd8fe3bfa6681ae45f5ff9181bc0ca6479abd59 nv-codec-headers-$NVENC.tar.gz
|
||||
13da39edb3a40ed9713ae390ca89faa2f1202c9dda869ef306a8d4383e242bee nv-codec-headers-$NVENC.tar.gz
|
||||
c465aa56757e7746ac707f582b6e2d51546569a4a2488c1172fb543aa5fdfc2c vulkan-sdk-$VULKAN.tar.gz
|
||||
eb33e51f49a15e023950cd7825ca74a4a2b43db8354825ac24fc1b7ee09e6fa3 zstd-$ZSTD.tar.gz
|
||||
5a6226f7e23db51fdc3223121eba53f3f5447cf0cc4d6cb82a3a2df7a65d265d qtbase-everywhere-src-$QT.tar.xz
|
||||
|
||||
@@ -2075,6 +2075,8 @@ SCAJ-20128:
|
||||
SCAJ-20129:
|
||||
name: "Ponkotsu Roman Daikatsugeki Bumpy Trot"
|
||||
region: "NTSC-Unk"
|
||||
roundModes:
|
||||
eeRoundMode: 0 # Fixes broken load triggers.
|
||||
gsHWFixes:
|
||||
getSkipCount: "GSC_IRem"
|
||||
halfPixelOffset: 2 # Aligns effects.
|
||||
@@ -7614,6 +7616,8 @@ SCKA-20058:
|
||||
name: "액션 로망 범피 트롯"
|
||||
name-en: "Action Romance Bumpy Trot"
|
||||
region: "NTSC-K"
|
||||
roundModes:
|
||||
eeRoundMode: 0 # Fixes broken load triggers.
|
||||
gsHWFixes:
|
||||
getSkipCount: "GSC_IRem"
|
||||
halfPixelOffset: 2 # Aligns effects.
|
||||
@@ -25578,6 +25582,8 @@ SLES-54137:
|
||||
SLES-54138:
|
||||
name: "Steambot Chronicles"
|
||||
region: "PAL-E"
|
||||
roundModes:
|
||||
eeRoundMode: 0 # Fixes broken load triggers.
|
||||
gsHWFixes:
|
||||
getSkipCount: "GSC_IRem"
|
||||
halfPixelOffset: 2 # Aligns effects.
|
||||
@@ -26228,6 +26234,8 @@ SLES-54333:
|
||||
SLES-54335:
|
||||
name: "Steambot Chronicles"
|
||||
region: "PAL-F"
|
||||
roundModes:
|
||||
eeRoundMode: 0 # Fixes broken load triggers.
|
||||
gsHWFixes:
|
||||
getSkipCount: "GSC_IRem"
|
||||
halfPixelOffset: 2 # Aligns effects.
|
||||
@@ -35853,6 +35861,8 @@ SLPM-60255:
|
||||
name-sort: "ぽんこつろまんだいかつげきばんぴーとろっと [たいけんばん]"
|
||||
name-en: "Ponkotsu Roeman Daikatsugeki Bumpy Trot [Trial]"
|
||||
region: "NTSC-J"
|
||||
roundModes:
|
||||
eeRoundMode: 0 # Fixes broken load triggers.
|
||||
gsHWFixes:
|
||||
getSkipCount: "GSC_IRem"
|
||||
halfPixelOffset: 2 # Aligns effects.
|
||||
@@ -35924,6 +35934,8 @@ SLPM-60266:
|
||||
name-sort: "ぽんこつろまんだいかつげきばんぴーとろっと [たいけんばん]"
|
||||
name-en: "Ponkotsu Roeman Daikatsugeki Bumpy Trot [Trial]"
|
||||
region: "NTSC-J"
|
||||
roundModes:
|
||||
eeRoundMode: 0 # Fixes broken load triggers.
|
||||
gsHWFixes:
|
||||
getSkipCount: "GSC_IRem"
|
||||
halfPixelOffset: 2 # Aligns effects.
|
||||
@@ -59824,6 +59836,8 @@ SLPS-25457:
|
||||
name-sort: "ぽんこつろまんだいかつげきばんぴーとろっと"
|
||||
name-en: "Ponkotsu Roeman Daikatsugeki Bumpy Trot"
|
||||
region: "NTSC-J"
|
||||
roundModes:
|
||||
eeRoundMode: 0 # Fixes broken load triggers.
|
||||
gsHWFixes:
|
||||
getSkipCount: "GSC_IRem"
|
||||
halfPixelOffset: 2 # Aligns effects.
|
||||
@@ -61228,6 +61242,8 @@ SLPS-25683:
|
||||
name-sort: "ぽんこつろまんだいかつげきばんぴーとろっと [Irem COLLECTION]"
|
||||
name-en: "Ponkotsu Roman Daikatsugeki Bumpy Trot [Irem Collection]"
|
||||
region: "NTSC-J"
|
||||
roundModes:
|
||||
eeRoundMode: 0 # Fixes broken load triggers.
|
||||
gsHWFixes:
|
||||
getSkipCount: "GSC_IRem"
|
||||
halfPixelOffset: 2 # Aligns effects.
|
||||
@@ -71360,6 +71376,8 @@ SLUS-21344:
|
||||
name: "Steambot Chronicles"
|
||||
region: "NTSC-U"
|
||||
compat: 5
|
||||
roundModes:
|
||||
eeRoundMode: 0 # Fixes broken load triggers.
|
||||
gsHWFixes:
|
||||
getSkipCount: "GSC_IRem"
|
||||
halfPixelOffset: 2 # Aligns effects.
|
||||
@@ -74901,6 +74919,8 @@ SLUS-28059:
|
||||
SLUS-28061:
|
||||
name: "Steambot Chronicles [Trade Demo]"
|
||||
region: "NTSC-U"
|
||||
roundModes:
|
||||
eeRoundMode: 0 # Fixes broken load triggers.
|
||||
gsHWFixes:
|
||||
getSkipCount: "GSC_IRem"
|
||||
halfPixelOffset: 2 # Aligns effects.
|
||||
@@ -75679,6 +75699,8 @@ SLUS-29185:
|
||||
SLUS-29188:
|
||||
name: "Steambot Chronicles [Regular Demo]"
|
||||
region: "NTSC-U"
|
||||
roundModes:
|
||||
eeRoundMode: 0 # Fixes broken load triggers.
|
||||
gsHWFixes:
|
||||
getSkipCount: "GSC_IRem"
|
||||
halfPixelOffset: 2 # Aligns effects.
|
||||
|
||||
@@ -123,6 +123,11 @@ void BreakpointDialog::accept()
|
||||
bp->cond.expression = expr;
|
||||
bp->cond.expressionString = m_ui.txtCondition->text().toStdString();
|
||||
}
|
||||
else
|
||||
{
|
||||
bp->hasCond = false;
|
||||
bp->cond = {};
|
||||
}
|
||||
}
|
||||
if (auto* mc = std::get_if<MemCheck>(&m_bp_mc))
|
||||
{
|
||||
@@ -159,6 +164,11 @@ void BreakpointDialog::accept()
|
||||
mc->cond.expression = expr;
|
||||
mc->cond.expressionString = m_ui.txtCondition->text().toStdString();
|
||||
}
|
||||
else
|
||||
{
|
||||
mc->hasCond = false;
|
||||
mc->cond = {};
|
||||
}
|
||||
|
||||
int condition = 0;
|
||||
if (m_ui.chkRead->isChecked())
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Options and Patches</string>
|
||||
<string>Fast Boot Options</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
|
||||
@@ -2223,7 +2223,7 @@ Leaderboard Position: {1} of {2}</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/BIOSSettingsWidget.ui" line="138"/>
|
||||
<source>Options and Patches</source>
|
||||
<source>Fast Boot Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
@@ -2339,18 +2339,18 @@ Leaderboard Position: {1} of {2}</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Debugger/Breakpoints/BreakpointDialog.cpp" line="103"/>
|
||||
<location filename="../Debugger/Breakpoints/BreakpointDialog.cpp" line="132"/>
|
||||
<location filename="../Debugger/Breakpoints/BreakpointDialog.cpp" line="137"/>
|
||||
<source>Invalid Address</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Debugger/Breakpoints/BreakpointDialog.cpp" line="119"/>
|
||||
<location filename="../Debugger/Breakpoints/BreakpointDialog.cpp" line="155"/>
|
||||
<location filename="../Debugger/Breakpoints/BreakpointDialog.cpp" line="160"/>
|
||||
<source>Invalid Condition</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Debugger/Breakpoints/BreakpointDialog.cpp" line="139"/>
|
||||
<location filename="../Debugger/Breakpoints/BreakpointDialog.cpp" line="144"/>
|
||||
<source>Invalid Size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -6804,11 +6804,6 @@ The URL was: %1</source>
|
||||
<source>BIOS Selection</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/ImGui/FullscreenUI.cpp" line="9512"/>
|
||||
<source>Options and Patches</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/ImGui/FullscreenUI.cpp" line="9513"/>
|
||||
<source>Skips the intro screen, and bypasses region checks.</source>
|
||||
@@ -9942,6 +9937,11 @@ Do you want to shutdown anyway and IRREVERSIBLY CORRUPT YOUR MEMORY CARD?</sourc
|
||||
<source>Shows the number of dumped and loaded texture replacements on the OSD.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/ImGui/FullscreenUI.cpp" line="9512"/>
|
||||
<source>Fast Boot Options</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/ImGui/FullscreenUI.cpp" line="9604"/>
|
||||
<source>Bilinear Dirty Upscale</source>
|
||||
@@ -11893,7 +11893,7 @@ This action cannot be undone.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp" line="5055"/>
|
||||
<location filename="../../pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp" line="5052"/>
|
||||
<source>Spin GPU During Readbacks is enabled, but calibrated timestamps are unavailable. This might be really slow.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -19742,12 +19742,12 @@ Savestates should not be used in place of in-game saves.</source>
|
||||
<context>
|
||||
<name>MemoryCardListWidget</name>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="456"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="450"/>
|
||||
<source>Yes</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="456"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="450"/>
|
||||
<source>No</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -19781,7 +19781,7 @@ Savestates should not be used in place of in-game saves.</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.ui" line="90"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="113"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="107"/>
|
||||
<source>Reset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -19812,170 +19812,149 @@ Savestates should not be used in place of in-game saves.</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.ui" line="148"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="305"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="299"/>
|
||||
<source>Create</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.ui" line="155"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="299"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="293"/>
|
||||
<source>Rename</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.ui" line="162"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="300"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="294"/>
|
||||
<source>Convert</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.ui" line="169"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="301"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="295"/>
|
||||
<source>Delete</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.ui" line="181"/>
|
||||
<source>Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.ui" line="187"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="62"/>
|
||||
<source>Automatically manage saves based on running game</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="63"/>
|
||||
<source>Checked</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="64"/>
|
||||
<source>(Folder type only / Card size: Auto) Loads only the relevant booted game saves, ignoring others. Avoids running out of space for saves.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="93"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="87"/>
|
||||
<source>Swap Memory Cards</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="113"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="107"/>
|
||||
<source>Eject Memory Card</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="152"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="275"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="340"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="146"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="269"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="334"/>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="212"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="222"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="206"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="216"/>
|
||||
<source>Delete Memory Card</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="237"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="244"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="251"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="258"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="231"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="238"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="245"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="252"/>
|
||||
<source>Rename Memory Card</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="237"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="231"/>
|
||||
<source>New Card Name</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="244"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="238"/>
|
||||
<source>New name is invalid, it must end with .ps2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="252"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="246"/>
|
||||
<source>New name is invalid, a card with this name already exists.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="105"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="99"/>
|
||||
<source>Slot %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="152"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="146"/>
|
||||
<source>This Memory Card cannot be recognized or is not a valid file type.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="213"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="207"/>
|
||||
<source>Are you sure you wish to delete the Memory Card '%1'?
|
||||
|
||||
This action cannot be reversed, and you will lose any saves on the card.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="223"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="217"/>
|
||||
<source>Failed to delete the Memory Card. The log may have more information.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="259"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="253"/>
|
||||
<source>Failed to rename Memory Card. The log may contain more information.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="275"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="269"/>
|
||||
<source>Cannot convert an unformatted memory card.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="294"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="288"/>
|
||||
<source>Use for Slot %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="340"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="334"/>
|
||||
<source>Both slots must have a card selected to swap.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="356"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="350"/>
|
||||
<source>PS2 (8MB)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="359"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="353"/>
|
||||
<source>PS2 (16MB)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="362"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="356"/>
|
||||
<source>PS2 (32MB)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="365"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="359"/>
|
||||
<source>PS2 (64MB)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="368"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="362"/>
|
||||
<source>PS1 (128KB)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="372"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="381"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="366"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="375"/>
|
||||
<source>Unknown</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="377"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="371"/>
|
||||
<source>PS2 (Folder)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -19983,12 +19962,12 @@ This action cannot be reversed, and you will lose any saves on the card.</source
|
||||
<context>
|
||||
<name>MemoryCardSlotWidget</name>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="513"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="507"/>
|
||||
<source>%1 [%2]</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="519"/>
|
||||
<location filename="../Settings/MemoryCardSettingsWidget.cpp" line="513"/>
|
||||
<source>%1 [Missing]</source>
|
||||
<extracomment>Ignore Crowdin's warning for [Missing], the text should be translated.</extracomment>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -22483,115 +22462,120 @@ Scanning recursively takes more time, but will identify files in subdirectories.
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="139"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="154"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="163"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="160"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="170"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="181"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="203"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="214"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="290"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="301"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="309"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="337"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="370"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="409"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="177"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="188"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="210"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="221"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="297"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="308"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="316"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="344"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="377"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="416"/>
|
||||
<source>Failed to create shortcut</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="139"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="301"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="308"/>
|
||||
<source>Filename contains illegal character.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="154"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="160"/>
|
||||
<source>Could not create start menu directory.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="163"/>
|
||||
<source>Home path is empty.</source>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="170"/>
|
||||
<source>'Desktop' directory not found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="170"/>
|
||||
<source>User's 'Start Menu\Programs' directory not found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="177"/>
|
||||
<source>A shortcut with the same name already exists.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="181"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="370"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="188"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="377"/>
|
||||
<source>File path contains invalid character(s).</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="203"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="210"/>
|
||||
<source>CoInitialize failed (%1)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="223"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="230"/>
|
||||
<source>CoCreateInstance failed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="232"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="239"/>
|
||||
<source>SetPath failed (%1)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="241"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="248"/>
|
||||
<source>SetWorkingDirectory failed (%1)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="252"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="259"/>
|
||||
<source>SetArguments failed (%1)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="263"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="270"/>
|
||||
<source>SetIconLocation failed (%1)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="271"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="278"/>
|
||||
<source>QueryInterface failed (%1)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="280"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="287"/>
|
||||
<source>Failed to save the shortcut (%1)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="290"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="297"/>
|
||||
<source>Cannot create a shortcut without a title.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="309"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="316"/>
|
||||
<source>Executable path is empty.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="337"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="344"/>
|
||||
<source>Path to the Home directory is empty.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="399"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="406"/>
|
||||
<source>Desktop Shortcut Files (*.desktop)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="401"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="408"/>
|
||||
<source>Select Shortcut Save Destination</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="409"/>
|
||||
<location filename="../ShortcutCreationDialog.cpp" line="416"/>
|
||||
<source>Failed to create .desktop file</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -25524,42 +25508,42 @@ Error was: {}</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3171"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3169"/>
|
||||
<source>Fast CDVD is enabled, this may break games.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3175"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3173"/>
|
||||
<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="3185"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3183"/>
|
||||
<source>Upscale multiplier is below native, this will break rendering.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3225"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3223"/>
|
||||
<source>Mipmapping is disabled. This may break rendering in some games.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3230"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3228"/>
|
||||
<source>Debug device is enabled. This will massively reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3260"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3258"/>
|
||||
<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="3723"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3721"/>
|
||||
<source>No Game Running</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3190"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3188"/>
|
||||
<source>Trilinear filtering is not set to automatic. This may break rendering in some games.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -25643,142 +25627,142 @@ PCSX2 will be able to run once you've placed your BIOS image inside the fol
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3118"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3116"/>
|
||||
<source>Cheats have been disabled due to RetroAchievements Hardcore Mode.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3195"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3193"/>
|
||||
<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="3200"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3198"/>
|
||||
<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="3235"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3233"/>
|
||||
<source>Dithering is set to Force 32 bit. This will break rendering in some games.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3240"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3238"/>
|
||||
<source>Dithering is disabled. This will cause color banding in some games.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3245"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3243"/>
|
||||
<source>Integer scaling is enabled. This may shrink the image.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3254"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3252"/>
|
||||
<source>Graphics API 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="3266"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3264"/>
|
||||
<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="3272"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3270"/>
|
||||
<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="3277"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3275"/>
|
||||
<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="3282"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3280"/>
|
||||
<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="3289"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3287"/>
|
||||
<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="3294"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3292"/>
|
||||
<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="3299"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3297"/>
|
||||
<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="3304"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3302"/>
|
||||
<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="3308"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3306"/>
|
||||
<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="3310"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3308"/>
|
||||
<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="3329"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3327"/>
|
||||
<source>EE Recompiler is not enabled, this will significantly reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3334"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3332"/>
|
||||
<source>VU0 Recompiler is not enabled, this will significantly reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3339"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3337"/>
|
||||
<source>VU1 Recompiler is not enabled, this will significantly reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3344"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3342"/>
|
||||
<source>IOP Recompiler is not enabled, this will significantly reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3349"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3347"/>
|
||||
<source>EE Cache is enabled, this will significantly reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3354"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3352"/>
|
||||
<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="3359"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3357"/>
|
||||
<source>INTC Spin Detection is not enabled, this may reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3362"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3360"/>
|
||||
<source>Fastmem is not enabled, this will reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3366"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3364"/>
|
||||
<source>Instant VU1 is disabled, this may reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3371"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3369"/>
|
||||
<source>mVU Flag Hack is not enabled, this may reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3205"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3203"/>
|
||||
<source>GPU Palette Conversion is enabled, this may reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -25788,17 +25772,17 @@ PCSX2 will be able to run once you've placed your BIOS image inside the fol
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3210"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3208"/>
|
||||
<source>Texture Preloading is not Full, this may reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3215"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3213"/>
|
||||
<source>Estimate texture region is enabled, this may reduce performance.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3220"/>
|
||||
<location filename="../../pcsx2/VMManager.cpp" line="3218"/>
|
||||
<source>Texture dumping is enabled, this will continually dump textures to disk.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
@@ -1899,6 +1899,30 @@ void GSState::FlushWrite()
|
||||
|
||||
r = m_tr.rect;
|
||||
|
||||
// If the end isn't where it said it would be, we need to calculate the end point.
|
||||
// Star Wars - The Clone Wars just sets the rect to 16x4095 then YOLO's about half a page, then kills the transfer.
|
||||
// If we just nuke the whole lot, even though nothing has been transferred, we risk killing data we don't mean to.
|
||||
if (m_tr.end < m_tr.total && GSIsHardwareRenderer())
|
||||
{
|
||||
const GSLocalMemory::psm_t& psm_s = GSLocalMemory::m_psm[m_tr.m_blit.DPSM];
|
||||
// Convert to nibbles then back to bytes after, in case trbpp is 4.
|
||||
const u32 in_data_pixel_count = (((len * 2) + ((psm_s.trbpp / 4) - 1)) / (psm_s.trbpp / 4));
|
||||
const u32 rect_pixel_count = r.width() * r.height();
|
||||
|
||||
if (rect_pixel_count > in_data_pixel_count)
|
||||
{
|
||||
const int calculated_height = ((in_data_pixel_count + (r.width() - 1)) / r.width());
|
||||
|
||||
// Just setting the height should be okay...
|
||||
r.w = std::max(r.y + calculated_height, psm_s.bs.y);
|
||||
|
||||
if (m_draw_transfers.size() > 0 && m_tr.m_blit.DBP == m_draw_transfers.back().blit.DBP)
|
||||
{
|
||||
m_draw_transfers.back().rect = r;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
InvalidateVideoMem(m_env.BITBLTBUF, r);
|
||||
|
||||
const GSLocalMemory::writeImage wi = GSLocalMemory::m_psm[m_env.BITBLTBUF.DPSM].wi;
|
||||
|
||||
@@ -244,7 +244,7 @@ const char* GSDevice::RenderAPIToString(RenderAPI api)
|
||||
|
||||
bool GSDevice::GetRequestedExclusiveFullscreenMode(u32* width, u32* height, float* refresh_rate)
|
||||
{
|
||||
const std::string mode = Host::GetBaseStringSettingValue("EmuCore/GS", "FullscreenMode", "");
|
||||
const std::string mode = Host::GetStringSettingValue("EmuCore/GS", "FullscreenMode", "");
|
||||
if (!mode.empty())
|
||||
{
|
||||
const std::string_view mode_view = mode;
|
||||
@@ -899,14 +899,13 @@ void GSDevice::ShadeBoost()
|
||||
if (ResizeRenderTarget(&m_target_tmp, m_current->GetWidth(), m_current->GetHeight(), false, false))
|
||||
{
|
||||
// predivide to avoid the divide (multiply) in the shader
|
||||
const float params[4] = {
|
||||
const GSVector4 params(
|
||||
static_cast<float>(GSConfig.ShadeBoost_Brightness) * (1.0f / 50.0f),
|
||||
static_cast<float>(GSConfig.ShadeBoost_Contrast) * (1.0f / 50.0f),
|
||||
static_cast<float>(GSConfig.ShadeBoost_Saturation) * (1.0f / 50.0f),
|
||||
static_cast<float>(GSConfig.ShadeBoost_Gamma) * (1.0f / 50.0f),
|
||||
};
|
||||
static_cast<float>(GSConfig.ShadeBoost_Gamma) * (1.0f / 50.0f));
|
||||
|
||||
DoShadeBoost(m_current, m_target_tmp, params);
|
||||
DoShadeBoost(m_current, m_target_tmp, params.v);
|
||||
|
||||
m_current = m_target_tmp;
|
||||
}
|
||||
|
||||
@@ -1397,7 +1397,7 @@ void GSDevice11::PresentRect(GSTexture* sTex, const GSVector4& sRect, GSTexture*
|
||||
const float right = dRect.z * 2 / ds.x - 1.0f;
|
||||
const float bottom = 1.0f - dRect.w * 2 / ds.y;
|
||||
|
||||
GSVertexPT1 vertices[] =
|
||||
const GSVertexPT1 vertices[] =
|
||||
{
|
||||
{GSVector4(left, top, 0.5f, 1.0f), GSVector2(sRect.x, sRect.y)},
|
||||
{GSVector4(right, top, 0.5f, 1.0f), GSVector2(sRect.z, sRect.y)},
|
||||
@@ -1427,13 +1427,14 @@ void GSDevice11::PresentRect(GSTexture* sTex, const GSVector4& sRect, GSTexture*
|
||||
void GSDevice11::UpdateCLUTTexture(GSTexture* sTex, float sScale, u32 offsetX, u32 offsetY, GSTexture* dTex, u32 dOffset, u32 dSize)
|
||||
{
|
||||
// match merge cb
|
||||
struct Uniforms
|
||||
struct alignas(16) Uniforms
|
||||
{
|
||||
float scale;
|
||||
float pad1[3];
|
||||
u32 offsetX, offsetY, dOffset;
|
||||
u32 pad2;
|
||||
};
|
||||
const Uniforms cb = {sScale, {}, offsetX, offsetY, dOffset};
|
||||
const Uniforms cb = {sScale, {}, offsetX, offsetY, dOffset, 0};
|
||||
m_ctx->UpdateSubresource(m_merge.cb.get(), 0, nullptr, &cb, 0, 0);
|
||||
|
||||
const GSVector4 dRect(0, 0, dSize, 1);
|
||||
@@ -1444,14 +1445,15 @@ void GSDevice11::UpdateCLUTTexture(GSTexture* sTex, float sScale, u32 offsetX, u
|
||||
void GSDevice11::ConvertToIndexedTexture(GSTexture* sTex, float sScale, u32 offsetX, u32 offsetY, u32 SBW, u32 SPSM, GSTexture* dTex, u32 DBW, u32 DPSM)
|
||||
{
|
||||
// match merge cb
|
||||
struct Uniforms
|
||||
struct alignas(16) Uniforms
|
||||
{
|
||||
float scale;
|
||||
float pad1[3];
|
||||
u32 SBW, DBW, SPSM;
|
||||
u32 pad2;
|
||||
};
|
||||
|
||||
const Uniforms cb = {sScale, {}, SBW, DBW, SPSM};
|
||||
const Uniforms cb = {sScale, {}, SBW, DBW, SPSM, 0};
|
||||
m_ctx->UpdateSubresource(m_merge.cb.get(), 0, nullptr, &cb, 0, 0);
|
||||
|
||||
const GSVector4 dRect(0, 0, dTex->GetWidth(), dTex->GetHeight());
|
||||
@@ -1461,7 +1463,7 @@ void GSDevice11::ConvertToIndexedTexture(GSTexture* sTex, float sScale, u32 offs
|
||||
|
||||
void GSDevice11::FilteredDownsampleTexture(GSTexture* sTex, GSTexture* dTex, u32 downsample_factor, const GSVector2i& clamp_min, const GSVector4& dRect)
|
||||
{
|
||||
struct Uniforms
|
||||
struct alignas(16) Uniforms
|
||||
{
|
||||
float weight;
|
||||
float step_multiplier;
|
||||
@@ -2063,13 +2065,13 @@ void GSDevice11::RenderImGui()
|
||||
|
||||
UpdateImGuiTextures();
|
||||
|
||||
const float L = 0.0f;
|
||||
constexpr float L = 0.0f;
|
||||
const float R = static_cast<float>(m_window_info.surface_width);
|
||||
const float T = 0.0f;
|
||||
constexpr float T = 0.0f;
|
||||
const float B = static_cast<float>(m_window_info.surface_height);
|
||||
|
||||
// clang-format off
|
||||
const float ortho_projection[4][4] =
|
||||
const GSVector4 ortho_projection[4] =
|
||||
{
|
||||
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
|
||||
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
|
||||
|
||||
@@ -193,11 +193,24 @@ void GSDevice12::LoadAgilitySDK()
|
||||
if (agility_loaded)
|
||||
return;
|
||||
|
||||
HRESULT hr;
|
||||
// On older versions of Windows 10 (example 2019 LTSC) D3D12GetInterface may fail because it doesn't exist,
|
||||
// in such case we can check if D3D12GetInterface exists first.
|
||||
const HMODULE d3d12 = GetModuleHandleW(L"d3d12.dll");
|
||||
if (!d3d12)
|
||||
return;
|
||||
|
||||
using PFN_D3D12GetInterface = HRESULT(WINAPI*)(REFCLSID rclsid, REFIID riid, void** ppv);
|
||||
auto pD3D12GetInterface = reinterpret_cast<PFN_D3D12GetInterface>(GetProcAddress(d3d12, "D3D12GetInterface"));
|
||||
if (!pD3D12GetInterface)
|
||||
{
|
||||
Console.Error("D3D12: Agility SDK configuration is not available");
|
||||
return;
|
||||
}
|
||||
|
||||
// See https://microsoft.github.io/DirectX-Specs/d3d/IndependentDevices.html
|
||||
ComPtr<ID3D12SDKConfiguration1> sdk_configuration;
|
||||
hr = D3D12GetInterface(CLSID_D3D12SDKConfiguration, IID_PPV_ARGS(sdk_configuration.put()));
|
||||
HRESULT hr;
|
||||
hr = pD3D12GetInterface(CLSID_D3D12SDKConfiguration, IID_PPV_ARGS(sdk_configuration.put()));
|
||||
if (FAILED(hr))
|
||||
{
|
||||
Console.Error("D3D12: Agility SDK configuration is not available");
|
||||
@@ -925,6 +938,7 @@ void GSDevice12::SetVSyncMode(GSVSyncMode mode, bool allow_present_throttle)
|
||||
|
||||
if (GetSwapChainBufferCount() != old_buffer_count)
|
||||
{
|
||||
ExecuteCommandList(true);
|
||||
DestroySwapChain();
|
||||
if (!CreateSwapChain())
|
||||
pxFailRel("Failed to recreate swap chain after vsync change.");
|
||||
@@ -1622,14 +1636,14 @@ void GSDevice12::UpdateCLUTTexture(
|
||||
GSTexture* sTex, float sScale, u32 offsetX, u32 offsetY, GSTexture* dTex, u32 dOffset, u32 dSize)
|
||||
{
|
||||
// match merge cb
|
||||
struct Uniforms
|
||||
struct alignas(16) Uniforms
|
||||
{
|
||||
float scale;
|
||||
float pad1[3];
|
||||
u32 offsetX, offsetY, dOffset;
|
||||
u32 pad2;
|
||||
};
|
||||
const Uniforms cb = {sScale, {}, offsetX, offsetY, dOffset};
|
||||
const Uniforms cb = {sScale, {}, offsetX, offsetY, dOffset, 0};
|
||||
SetUtilityRootSignature();
|
||||
SetUtilityPushConstants(&cb, sizeof(cb));
|
||||
|
||||
@@ -1643,14 +1657,15 @@ void GSDevice12::ConvertToIndexedTexture(
|
||||
GSTexture* sTex, float sScale, u32 offsetX, u32 offsetY, u32 SBW, u32 SPSM, GSTexture* dTex, u32 DBW, u32 DPSM)
|
||||
{
|
||||
// match merge cb
|
||||
struct Uniforms
|
||||
struct alignas(16) Uniforms
|
||||
{
|
||||
float scale;
|
||||
float pad1[3];
|
||||
u32 SBW, DBW, SPSM;
|
||||
u32 pad2;
|
||||
};
|
||||
|
||||
const Uniforms cb = {sScale, {}, SBW, DBW, SPSM};
|
||||
const Uniforms cb = {sScale, {}, SBW, DBW, SPSM, 0};
|
||||
SetUtilityRootSignature();
|
||||
SetUtilityPushConstants(&cb, sizeof(cb));
|
||||
|
||||
@@ -1662,7 +1677,7 @@ void GSDevice12::ConvertToIndexedTexture(
|
||||
|
||||
void GSDevice12::FilteredDownsampleTexture(GSTexture* sTex, GSTexture* dTex, u32 downsample_factor, const GSVector2i& clamp_min, const GSVector4& dRect)
|
||||
{
|
||||
struct Uniforms
|
||||
struct alignas(16) Uniforms
|
||||
{
|
||||
float weight;
|
||||
float step_multiplier;
|
||||
@@ -2171,7 +2186,7 @@ void GSDevice12::RenderImGui()
|
||||
const float B = static_cast<float>(m_window_info.surface_height);
|
||||
|
||||
// clang-format off
|
||||
const float ortho_projection[4][4] =
|
||||
const GSVector4 ortho_projection[4] =
|
||||
{
|
||||
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
|
||||
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
|
||||
|
||||
@@ -5091,14 +5091,14 @@ bool GSTextureCache::Move(u32 SBP, u32 SBW, u32 SPSM, int sx, int sy, u32 DBP, u
|
||||
// We use dx/dy == 0 and the TBW check as a safeguard to make sure these go through to local memory.
|
||||
// We can also recreate the target if it's previously been created in the height cache with a valid size.
|
||||
// Good test case for this is the Xenosaga I cutscene transitions, or Gradius V.
|
||||
if (src && !dst && ((dx == 0 && dy == 0 && ((static_cast<u32>(w) + 63) / 64) <= DBW) || HasTargetInHeightCache(DBP, DBW, DPSM, 10)))
|
||||
if (src && !dst && ((((dx == 0 && dy == 0) || (dx == sx && dy == sy && DBW == src->m_TEX0.TBW)) && ((static_cast<u32>(w) + 63) / 64) <= DBW) || HasTargetInHeightCache(DBP, DBW, DPSM, 10)))
|
||||
{
|
||||
GIFRegTEX0 new_TEX0 = {};
|
||||
new_TEX0.TBP0 = DBP;
|
||||
new_TEX0.TBW = DBW;
|
||||
new_TEX0.PSM = DPSM;
|
||||
|
||||
const GSVector2i target_size = GetTargetSize(DBP, DBW, DPSM, Common::AlignUpPow2(w, 64), h);
|
||||
const GSVector2i target_size = (dx == 0 && dy == 0) ? GetTargetSize(DBP, DBW, DPSM, Common::AlignUpPow2(w, 64), h) : GSVector2i(src->m_valid.z, src->m_valid.w);
|
||||
dst = LookupTarget(new_TEX0, target_size, src->m_scale, src->m_type);
|
||||
if (!dst)
|
||||
{
|
||||
|
||||
@@ -3131,7 +3131,7 @@ void GSDeviceVK::UpdateCLUTTexture(
|
||||
GSTexture* sTex, float sScale, u32 offsetX, u32 offsetY, GSTexture* dTex, u32 dOffset, u32 dSize)
|
||||
{
|
||||
// Super annoying, but apparently NVIDIA doesn't like floats/ints packed together in the same vec4?
|
||||
struct Uniforms
|
||||
struct alignas(16) Uniforms
|
||||
{
|
||||
u32 offsetX, offsetY, dOffset, pad1;
|
||||
float scale;
|
||||
@@ -3150,7 +3150,7 @@ void GSDeviceVK::UpdateCLUTTexture(
|
||||
void GSDeviceVK::ConvertToIndexedTexture(
|
||||
GSTexture* sTex, float sScale, u32 offsetX, u32 offsetY, u32 SBW, u32 SPSM, GSTexture* dTex, u32 DBW, u32 DPSM)
|
||||
{
|
||||
struct Uniforms
|
||||
struct alignas(16) Uniforms
|
||||
{
|
||||
u32 SBW;
|
||||
u32 DBW;
|
||||
@@ -3171,7 +3171,7 @@ void GSDeviceVK::ConvertToIndexedTexture(
|
||||
|
||||
void GSDeviceVK::FilteredDownsampleTexture(GSTexture* sTex, GSTexture* dTex, u32 downsample_factor, const GSVector2i& clamp_min, const GSVector4& dRect)
|
||||
{
|
||||
struct Uniforms
|
||||
struct alignas(16) Uniforms
|
||||
{
|
||||
GSVector2i clamp_min;
|
||||
int downsample_factor;
|
||||
@@ -4434,16 +4434,13 @@ void GSDeviceVK::RenderImGui()
|
||||
|
||||
UpdateImGuiTextures();
|
||||
|
||||
const float uniforms[2][2] = {{
|
||||
2.0f / static_cast<float>(m_window_info.surface_width),
|
||||
2.0f / static_cast<float>(m_window_info.surface_height),
|
||||
},
|
||||
{
|
||||
-1.0f,
|
||||
-1.0f,
|
||||
}};
|
||||
const GSVector4 uniforms(
|
||||
2.0f / static_cast<float>(m_window_info.surface_width),
|
||||
2.0f / static_cast<float>(m_window_info.surface_height),
|
||||
-1.0f,
|
||||
-1.0f);
|
||||
|
||||
SetUtilityPushConstants(uniforms, sizeof(uniforms));
|
||||
SetUtilityPushConstants(&uniforms, sizeof(uniforms));
|
||||
SetPipeline(m_imgui_pipeline);
|
||||
|
||||
if (m_utility_sampler != m_linear_sampler)
|
||||
|
||||
@@ -4461,7 +4461,7 @@ void FullscreenUI::DrawBIOSSettingsPage()
|
||||
});
|
||||
}
|
||||
|
||||
MenuHeading(FSUI_CSTR("Options and Patches"));
|
||||
MenuHeading(FSUI_CSTR("Fast Boot Options"));
|
||||
DrawToggleSetting(bsi, FSUI_ICONSTR(ICON_FA_FORWARD_FAST, "Fast Boot"), FSUI_CSTR("Skips the intro screen, and bypasses region checks."),
|
||||
"EmuCore", "EnableFastBoot", true);
|
||||
|
||||
@@ -9509,7 +9509,7 @@ TRANSLATE_NOOP("FullscreenUI", "Resets configuration to defaults (excluding cont
|
||||
TRANSLATE_NOOP("FullscreenUI", "BIOS Configuration");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Changes the BIOS image used to start future sessions.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "BIOS Selection");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Options and Patches");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Fast Boot Options");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Skips the intro screen, and bypasses region checks.");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Speed Control");
|
||||
TRANSLATE_NOOP("FullscreenUI", "Sets the speed when running without fast forwarding.");
|
||||
|
||||
@@ -200,7 +200,6 @@ void SPU2::DoFullDump()
|
||||
fprintf(dump, " - Sound Start Address: %x\n", Cores[c].Voices[v].StartA);
|
||||
fprintf(dump, " - Next Data Address: %x\n", Cores[c].Voices[v].NextA);
|
||||
fprintf(dump, " - Play Status: %s\n", (Cores[c].Voices[v].ADSR.Phase > 0) ? "Playing" : "Not Playing");
|
||||
fprintf(dump, " - Block Sample: %d\n", Cores[c].Voices[v].SCurrent);
|
||||
}
|
||||
fprintf(dump, "#### END OF DUMP.\n\n");
|
||||
}
|
||||
|
||||
@@ -89,55 +89,13 @@ int g_counter_cache_ignores = 0;
|
||||
#define XAFLAG_LOOP (1ul << 1)
|
||||
#define XAFLAG_LOOP_START (1ul << 2)
|
||||
|
||||
static __forceinline s32 GetNextDataBuffered(V_Core& thiscore, uint voiceidx)
|
||||
static __forceinline void GetNextDataBuffered(V_Core& thiscore, uint voiceidx)
|
||||
{
|
||||
V_Voice& vc(thiscore.Voices[voiceidx]);
|
||||
|
||||
if ((vc.SCurrent & 3) == 0)
|
||||
if (vc.SBuffer == nullptr)
|
||||
{
|
||||
IncrementNextA(thiscore, voiceidx);
|
||||
|
||||
if ((vc.NextA & 7) == 0) // vc.SCurrent == 24 equivalent
|
||||
{
|
||||
if (vc.LoopFlags & XAFLAG_LOOP_END)
|
||||
{
|
||||
thiscore.Regs.ENDX |= (1 << voiceidx);
|
||||
vc.NextA = vc.LoopStartA | 1;
|
||||
if (!(vc.LoopFlags & XAFLAG_LOOP))
|
||||
{
|
||||
vc.Stop();
|
||||
|
||||
if (IsDevBuild)
|
||||
{
|
||||
if (SPU2::MsgVoiceOff())
|
||||
SPU2::ConLog("* SPU2: Voice Off by EndPoint: %d \n", voiceidx);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
vc.NextA++; // no, don't IncrementNextA here. We haven't read the header yet.
|
||||
}
|
||||
}
|
||||
|
||||
if (vc.SCurrent == 28)
|
||||
{
|
||||
vc.SCurrent = 0;
|
||||
|
||||
// We'll need the loop flags and buffer pointers regardless of cache status:
|
||||
|
||||
for (int i = 0; i < 2; i++)
|
||||
if (Cores[i].IRQEnable && Cores[i].IRQA == (vc.NextA & 0xFFFF8))
|
||||
SetIrqCall(i);
|
||||
|
||||
s16* memptr = GetMemPtr(vc.NextA & 0xFFFF8);
|
||||
vc.LoopFlags = *memptr >> 8; // grab loop flags from the upper byte.
|
||||
|
||||
if ((vc.LoopFlags & XAFLAG_LOOP_START) && !vc.LoopMode)
|
||||
{
|
||||
vc.LoopStartA = vc.NextA & 0xFFFF8;
|
||||
}
|
||||
|
||||
const int cacheIdx = vc.NextA / pcm_WordsPerBlock;
|
||||
const int cacheIdx = (vc.NextA & 0xFFFF8) / pcm_WordsPerBlock;
|
||||
PcmCacheEntry& cacheLine = pcm_cache_data[cacheIdx];
|
||||
vc.SBuffer = cacheLine.Sampledata;
|
||||
|
||||
@@ -172,46 +130,18 @@ static __forceinline s32 GetNextDataBuffered(V_Core& thiscore, uint voiceidx)
|
||||
g_counter_cache_misses++;
|
||||
}
|
||||
|
||||
|
||||
s16* memptr = GetMemPtr(vc.NextA & 0xFFFF8);
|
||||
XA_decode_block(vc.SBuffer, memptr, vc.Prev1, vc.Prev2);
|
||||
}
|
||||
}
|
||||
|
||||
return vc.SBuffer[vc.SCurrent++];
|
||||
}
|
||||
|
||||
static __forceinline void GetNextDataDummy(V_Core& thiscore, uint voiceidx)
|
||||
{
|
||||
V_Voice& vc(thiscore.Voices[voiceidx]);
|
||||
|
||||
IncrementNextA(thiscore, voiceidx);
|
||||
|
||||
if ((vc.NextA & 7) == 0) // vc.SCurrent == 24 equivalent
|
||||
// Get the sample index for NextA, we have to subtract 1 to ignore the loop header
|
||||
int sampleIdx = ((vc.NextA % pcm_WordsPerBlock) - 1) * 4;
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
if (vc.LoopFlags & XAFLAG_LOOP_END)
|
||||
{
|
||||
thiscore.Regs.ENDX |= (1 << voiceidx);
|
||||
vc.NextA = vc.LoopStartA | 1;
|
||||
}
|
||||
else
|
||||
vc.NextA++; // no, don't IncrementNextA here. We haven't read the header yet.
|
||||
vc.DecodeFifo[(vc.DecPosWrite + i) % 32] = vc.SBuffer[sampleIdx + i];
|
||||
}
|
||||
|
||||
if (vc.SCurrent == 28)
|
||||
{
|
||||
for (int i = 0; i < 2; i++)
|
||||
if (Cores[i].IRQEnable && Cores[i].IRQA == (vc.NextA & 0xFFFF8))
|
||||
SetIrqCall(i);
|
||||
|
||||
vc.LoopFlags = *GetMemPtr(vc.NextA & 0xFFFF8) >> 8; // grab loop flags from the upper byte.
|
||||
|
||||
if ((vc.LoopFlags & XAFLAG_LOOP_START) && !vc.LoopMode)
|
||||
vc.LoopStartA = vc.NextA & 0xFFFF8;
|
||||
|
||||
vc.SCurrent = 0;
|
||||
}
|
||||
|
||||
vc.SP -= 0x1000 * (4 - (vc.SCurrent & 3));
|
||||
vc.SCurrent += 4 - (vc.SCurrent & 3);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -237,6 +167,69 @@ static __forceinline StereoOut32 ApplyVolume(const StereoOut32& data, const V_Vo
|
||||
ApplyVolume(data.Right, volume.Right.Value));
|
||||
}
|
||||
|
||||
static __forceinline void UpdateBlockHeader(V_Core& thiscore, uint voiceidx)
|
||||
{
|
||||
V_Voice& vc(thiscore.Voices[voiceidx]);
|
||||
|
||||
for (int i = 0; i < 2; i++)
|
||||
if (Cores[i].IRQEnable && Cores[i].IRQA == (vc.NextA & 0xFFFF8))
|
||||
SetIrqCall(i);
|
||||
|
||||
s16* memptr = GetMemPtr(vc.NextA & 0xFFFF8);
|
||||
vc.LoopFlags = *memptr >> 8; // grab loop flags from the upper byte.
|
||||
|
||||
if ((vc.LoopFlags & XAFLAG_LOOP_START) && !vc.LoopMode)
|
||||
{
|
||||
vc.LoopStartA = vc.NextA & 0xFFFF8;
|
||||
}
|
||||
}
|
||||
|
||||
static __forceinline void DecodeSamples(uint coreidx, uint voiceidx)
|
||||
{
|
||||
V_Core& thiscore(Cores[coreidx]);
|
||||
V_Voice& vc(thiscore.Voices[voiceidx]);
|
||||
|
||||
// Update the block header on every audio frame
|
||||
UpdateBlockHeader(thiscore, voiceidx);
|
||||
|
||||
// When a voice is started at 0 pitch, NAX quickly advances to SSA + 5
|
||||
// So that would mean the decode buffer holds around 12 samples
|
||||
if (((int)(vc.DecPosWrite - vc.DecPosRead)) > 12) {
|
||||
// Sufficient data buffered
|
||||
return;
|
||||
}
|
||||
|
||||
if (vc.ADSR.Phase > V_ADSR::PHASE_STOPPED)
|
||||
{
|
||||
GetNextDataBuffered(thiscore, voiceidx);
|
||||
}
|
||||
|
||||
vc.DecPosWrite += 4;
|
||||
|
||||
IncrementNextA(thiscore, voiceidx);
|
||||
if ((vc.NextA & 7) == 0)
|
||||
{
|
||||
if (vc.LoopFlags & XAFLAG_LOOP_END)
|
||||
{
|
||||
thiscore.Regs.ENDX |= (1 << voiceidx);
|
||||
vc.NextA = vc.LoopStartA;
|
||||
if (!(vc.LoopFlags & XAFLAG_LOOP))
|
||||
{
|
||||
vc.Stop();
|
||||
|
||||
if (IsDevBuild)
|
||||
{
|
||||
if (SPU2::MsgVoiceOff())
|
||||
SPU2::ConLog("* SPU2: Voice Off by EndPoint: %d \n", voiceidx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IncrementNextA(thiscore, voiceidx);
|
||||
vc.SBuffer = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
static void __forceinline UpdatePitch(uint coreidx, uint voiceidx)
|
||||
{
|
||||
V_Voice& vc(Cores[coreidx].Voices[voiceidx]);
|
||||
@@ -278,33 +271,27 @@ static __forceinline void CalculateADSR(V_Core& thiscore, uint voiceidx)
|
||||
pxAssume(vc.ADSR.Value >= 0); // ADSR should never be negative...
|
||||
}
|
||||
|
||||
__forceinline static s32 GaussianInterpolate(s32 pv4, s32 pv3, s32 pv2, s32 pv1, s32 i)
|
||||
static __forceinline void ConsumeSamples(V_Core& thiscore, uint voiceidx)
|
||||
{
|
||||
s32 out = 0;
|
||||
out = (interpTable[i][0] * pv4) >> 15;
|
||||
out += (interpTable[i][1] * pv3) >> 15;
|
||||
out += (interpTable[i][2] * pv2) >> 15;
|
||||
out += (interpTable[i][3] * pv1) >> 15;
|
||||
V_Voice& vc(thiscore.Voices[voiceidx]);
|
||||
|
||||
return out;
|
||||
int consumed = vc.SP >> 12;
|
||||
vc.SP &= 0xfff;
|
||||
vc.DecPosRead += consumed;
|
||||
}
|
||||
|
||||
static __forceinline s32 GetVoiceValues(V_Core& thiscore, uint voiceidx)
|
||||
{
|
||||
V_Voice& vc(thiscore.Voices[voiceidx]);
|
||||
|
||||
while (vc.SP >= 0)
|
||||
{
|
||||
vc.PV4 = vc.PV3;
|
||||
vc.PV3 = vc.PV2;
|
||||
vc.PV2 = vc.PV1;
|
||||
vc.PV1 = GetNextDataBuffered(thiscore, voiceidx);
|
||||
vc.SP -= 0x1000;
|
||||
}
|
||||
int phase = (vc.SP & 0x0ff0) >> 4;
|
||||
s32 out = 0;
|
||||
out += (interpTable[phase][0] * vc.DecodeFifo[(vc.DecPosRead + 0) % 32]) >> 15;
|
||||
out += (interpTable[phase][1] * vc.DecodeFifo[(vc.DecPosRead + 1) % 32]) >> 15;
|
||||
out += (interpTable[phase][2] * vc.DecodeFifo[(vc.DecPosRead + 2) % 32]) >> 15;
|
||||
out += (interpTable[phase][3] * vc.DecodeFifo[(vc.DecPosRead + 3) % 32]) >> 15;
|
||||
|
||||
const s32 mu = vc.SP + 0x1000;
|
||||
|
||||
return GaussianInterpolate(vc.PV4, vc.PV3, vc.PV2, vc.PV1, (mu & 0x0ff0) >> 4);
|
||||
return out;
|
||||
}
|
||||
|
||||
// This is Dr. Hell's noise algorithm as implemented in pcsxr
|
||||
@@ -382,21 +369,13 @@ static __forceinline StereoOut32 MixVoice(uint coreidx, uint voiceidx)
|
||||
V_Core& thiscore(Cores[coreidx]);
|
||||
V_Voice& vc(thiscore.Voices[voiceidx]);
|
||||
|
||||
// If this assertion fails, it mans SCurrent is being corrupted somewhere, or is not initialized
|
||||
// properly. Invalid values in SCurrent will cause errant IRQs and corrupted audio.
|
||||
pxAssertMsg((vc.SCurrent <= 28) && (vc.SCurrent != 0), "Current sample should always range from 1->28");
|
||||
|
||||
// Most games don't use much volume slide effects. So only call the UpdateVolume
|
||||
// methods when needed by checking the flag outside the method here...
|
||||
// (Note: Ys 6 : Ark of Nephistm uses these effects)
|
||||
|
||||
vc.Volume.Update();
|
||||
|
||||
// SPU2 Note: The spu2 continues to process voices for eternity, always, so we
|
||||
// have to run through all the motions of updating the voice regardless of it's
|
||||
// audible status. Otherwise IRQs might not trigger and emulation might fail.
|
||||
|
||||
UpdatePitch(coreidx, voiceidx);
|
||||
DecodeSamples(coreidx, voiceidx);
|
||||
|
||||
StereoOut32 voiceOut(0, 0);
|
||||
s32 Value = 0;
|
||||
@@ -419,11 +398,14 @@ static __forceinline StereoOut32 MixVoice(uint coreidx, uint voiceidx)
|
||||
|
||||
voiceOut = ApplyVolume(StereoOut32(Value, Value), vc.Volume);
|
||||
}
|
||||
else
|
||||
{
|
||||
while (vc.SP >= 0)
|
||||
GetNextDataDummy(thiscore, voiceidx); // Dummy is enough
|
||||
}
|
||||
|
||||
// SPU2 Note: The spu2 continues to process voices for eternity, always, so we
|
||||
// have to run through all the motions of updating the voice regardless of it's
|
||||
// audible status. Otherwise IRQs might not trigger and emulation might fail.
|
||||
|
||||
UpdatePitch(coreidx, voiceidx);
|
||||
|
||||
ConsumeSamples(thiscore, voiceidx);
|
||||
|
||||
// Write-back of raw voice data (post ADSR applied)
|
||||
if (voiceidx == 1)
|
||||
@@ -533,7 +515,8 @@ StereoOut32 V_Core::Mix(const VoiceMixSet& inVoices, const StereoOut32& Input, c
|
||||
return TD + ApplyVolume(RV, FxVol);
|
||||
}
|
||||
|
||||
static StereoOut32 DCFilter(StereoOut32 input) {
|
||||
static StereoOut32 DCFilter(StereoOut32 input)
|
||||
{
|
||||
// A simple DC blocking high-pass filter
|
||||
// Implementation from http://peabody.sapp.org/class/dmp2/lab/dcblock/
|
||||
// The magic number 0x7f5c is ceil(INT16_MAX * 0.995)
|
||||
@@ -634,9 +617,9 @@ __forceinline void spu2Mix()
|
||||
if (SPU2::MsgCache())
|
||||
{
|
||||
SPU2::ConLog(" * SPU2 > CacheStats > Hits: %d Misses: %d Ignores: %d\n",
|
||||
g_counter_cache_hits,
|
||||
g_counter_cache_misses,
|
||||
g_counter_cache_ignores);
|
||||
g_counter_cache_hits,
|
||||
g_counter_cache_misses,
|
||||
g_counter_cache_ignores);
|
||||
}
|
||||
|
||||
g_counter_cache_hits =
|
||||
|
||||
@@ -256,29 +256,16 @@ struct V_Voice
|
||||
// Sample pointer (19:12 bit fixed point)
|
||||
s32 SP;
|
||||
|
||||
// Sample pointer for Cubic Interpolation
|
||||
// Cubic interpolation mixes a sample behind Linear, so that it
|
||||
// can have sample data to either side of the end points from which
|
||||
// to extrapolate. This SP represents that late sample position.
|
||||
s32 SPc;
|
||||
|
||||
// Previous sample values - used for interpolation
|
||||
// Inverted order of these members to match the access order in the
|
||||
// code (might improve cache hits).
|
||||
s32 PV4;
|
||||
s32 PV3;
|
||||
s32 PV2;
|
||||
s32 PV1;
|
||||
|
||||
// Last outputted audio value, used for voice modulation.
|
||||
s32 OutX;
|
||||
s32 NextCrest; // temp value for Crest calculation
|
||||
|
||||
// SBuffer now points directly to an ADPCM cache entry.
|
||||
s16* SBuffer;
|
||||
|
||||
// sample position within the current decoded packet.
|
||||
s32 SCurrent;
|
||||
// Each voice has a buffer of decoded samples
|
||||
s32 DecodeFifo[32];
|
||||
u32 DecPosWrite;
|
||||
u32 DecPosRead;
|
||||
|
||||
// it takes a few ticks for voices to start on the real SPU2?
|
||||
void Start();
|
||||
|
||||
@@ -181,7 +181,6 @@ void V_Core::Init(int index)
|
||||
VoiceGates[v].WetR = -1;
|
||||
|
||||
Voices[v].Volume = V_VolumeSlideLR(0, 0); // V_VolumeSlideLR::Max;
|
||||
Voices[v].SCurrent = 28;
|
||||
|
||||
Voices[v].ADSR.Counter = 0;
|
||||
Voices[v].ADSR.Value = 0;
|
||||
@@ -190,6 +189,10 @@ void V_Core::Init(int index)
|
||||
Voices[v].NextA = 0x2801;
|
||||
Voices[v].StartA = 0x2800;
|
||||
Voices[v].LoopStartA = 0x2800;
|
||||
|
||||
memset(Voices[v].DecodeFifo, 0, sizeof(Voices[v].DecodeFifo));
|
||||
Voices[v].DecPosRead = 0;
|
||||
Voices[v].DecPosWrite = 0;
|
||||
}
|
||||
|
||||
DMAICounter = 0;
|
||||
@@ -212,23 +215,18 @@ void V_Voice::Start()
|
||||
}
|
||||
|
||||
ADSR.Attack();
|
||||
SCurrent = 28;
|
||||
LoopMode = 0;
|
||||
|
||||
// When SP >= 0 the next sample will be grabbed, we don't want this to happen
|
||||
// instantly because in the case of pitch being 0 we want to delay getting
|
||||
// the next block header. This is a hack to work around the fact that unlike
|
||||
// the HW we don't update the block header on every cycle.
|
||||
SP = -1;
|
||||
SP = 0;
|
||||
|
||||
LoopFlags = 0;
|
||||
NextA = StartA | 1;
|
||||
Prev1 = 0;
|
||||
Prev2 = 0;
|
||||
|
||||
PV1 = PV2 = 0;
|
||||
PV3 = PV4 = 0;
|
||||
NextCrest = -0x8000;
|
||||
SBuffer = nullptr;
|
||||
DecPosRead = 0;
|
||||
DecPosWrite = 0;
|
||||
}
|
||||
|
||||
void V_Voice::Stop()
|
||||
@@ -989,12 +987,10 @@ static void RegWrite_VoiceAddr(u16 value)
|
||||
// Wallace And Gromit: Curse Of The Were-Rabbit.
|
||||
|
||||
thisvoice.NextA = ((u32)(value & 0x0F) << 16) | (thisvoice.NextA & 0xFFF8) | 1;
|
||||
thisvoice.SCurrent = 28;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
thisvoice.NextA = (thisvoice.NextA & 0x0F0000) | (value & 0xFFF8) | 1;
|
||||
thisvoice.SCurrent = 28;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1212,7 +1208,6 @@ static void RegWrite_Core(u16 value)
|
||||
for (uint v = 0; v < 24; ++v)
|
||||
{
|
||||
Cores[1].Voices[v].Volume = V_VolumeSlideLR(0, 0); // V_VolumeSlideLR::Max;
|
||||
Cores[1].Voices[v].SCurrent = 28;
|
||||
|
||||
Cores[1].Voices[v].ADSR.Value = 0;
|
||||
Cores[1].Voices[v].ADSR.Phase = 0;
|
||||
|
||||
@@ -26,7 +26,7 @@ enum class FreezeAction
|
||||
// [SAVEVERSION+]
|
||||
// This informs the auto updater that the users savestates will be invalidated.
|
||||
|
||||
static const u32 g_SaveVersion = (0x9A55 << 16) | 0x0000;
|
||||
static const u32 g_SaveVersion = (0x9A57 << 16) | 0x0000;
|
||||
|
||||
|
||||
// the freezing data between submodules and core
|
||||
|
||||
Reference in New Issue
Block a user