mirror of
https://github.com/PCSX2/pcsx2.git
synced 2026-01-31 01:15:24 +01:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
19f0cfcf06 | ||
|
|
4f42d95d3c | ||
|
|
68823c524f | ||
|
|
05917796a5 | ||
|
|
d64da07b7d | ||
|
|
27074a809c | ||
|
|
33b366180e | ||
|
|
d8e310e7bf | ||
|
|
534ddd80ae | ||
|
|
d34f2ec142 | ||
|
|
7381a02dae | ||
|
|
333c7ef61b | ||
|
|
77d5a04aa4 |
@@ -114,7 +114,7 @@ def check_regression_test(baselinedir, testdir, name):
|
||||
if not os.path.isfile(path2):
|
||||
print("--- Frame %u for %s is missing in test set" % (framenum, name))
|
||||
write("<h1>{}</h1>".format(name))
|
||||
write("--- Frame %u for %s is missing in test set" % (framenum, name))
|
||||
write("<pre>--- Frame %u for %s is missing in test set</pre>" % (framenum, name))
|
||||
return False
|
||||
|
||||
if not compare_frames(path1, path2):
|
||||
|
||||
@@ -336,7 +336,7 @@ void CpuWidget::onVMPaused()
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ui.disassemblyWidget->gotoAddress(m_cpu.getPC(), false);
|
||||
m_ui.disassemblyWidget->gotoProgramCounterOnPause();
|
||||
}
|
||||
|
||||
reloadCPUWidgets();
|
||||
|
||||
@@ -656,6 +656,12 @@ void DisassemblyWidget::customMenuRequested(QPoint pos)
|
||||
connect(action, &QAction::triggered, this, &DisassemblyWidget::contextGoToAddress);
|
||||
contextMenu->addAction(action = new QAction(tr("Go to in Memory View"), this));
|
||||
connect(action, &QAction::triggered, this, [this]() { gotoInMemory(m_selectedAddressStart); });
|
||||
|
||||
contextMenu->addAction(action = new QAction(tr("Go to PC on Pause"), this));
|
||||
action->setCheckable(true);
|
||||
action->setChecked(m_goToProgramCounterOnPause);
|
||||
connect(action, &QAction::triggered, this, [this](bool value) { m_goToProgramCounterOnPause = value; });
|
||||
|
||||
contextMenu->addSeparator();
|
||||
contextMenu->addAction(action = new QAction(tr("Add Function"), this));
|
||||
connect(action, &QAction::triggered, this, &DisassemblyWidget::contextAddFunction);
|
||||
@@ -822,6 +828,12 @@ void DisassemblyWidget::gotoAddressAndSetFocus(u32 address)
|
||||
gotoAddress(address, true);
|
||||
}
|
||||
|
||||
void DisassemblyWidget::gotoProgramCounterOnPause()
|
||||
{
|
||||
if (m_goToProgramCounterOnPause)
|
||||
gotoAddress(m_cpu->getPC(), false);
|
||||
}
|
||||
|
||||
void DisassemblyWidget::gotoAddress(u32 address, bool should_set_focus)
|
||||
{
|
||||
const u32 destAddress = address & ~3;
|
||||
|
||||
@@ -59,6 +59,7 @@ public slots:
|
||||
void contextShowOpcode();
|
||||
|
||||
void gotoAddressAndSetFocus(u32 address);
|
||||
void gotoProgramCounterOnPause();
|
||||
void gotoAddress(u32 address, bool should_set_focus);
|
||||
|
||||
void setDemangle(bool demangle) { m_demangleFunctions = demangle; };
|
||||
@@ -82,6 +83,7 @@ private:
|
||||
|
||||
bool m_demangleFunctions = true;
|
||||
bool m_showInstructionOpcode = true;
|
||||
bool m_goToProgramCounterOnPause = true;
|
||||
DisassemblyManager m_disassemblyManager;
|
||||
|
||||
inline QString DisassemblyStringFromAddress(u32 address, QFont font, u32 pc, bool selected);
|
||||
|
||||
@@ -1346,9 +1346,8 @@ void MainWindow::onGameListEntryContextMenuRequested(const QPoint& point)
|
||||
if (action->isEnabled())
|
||||
{
|
||||
connect(action, &QAction::triggered, [entry]() {
|
||||
SettingsWindow::openGamePropertiesDialog(entry, entry->title,
|
||||
(entry->type != GameList::EntryType::ELF) ? entry->serial : std::string(),
|
||||
entry->crc);
|
||||
SettingsWindow::openGamePropertiesDialog(entry,
|
||||
entry->title, entry->serial, entry->crc, entry->type == GameList::EntryType::ELF);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1564,7 +1563,7 @@ void MainWindow::onViewGamePropertiesActionTriggered()
|
||||
if (entry)
|
||||
{
|
||||
SettingsWindow::openGamePropertiesDialog(
|
||||
entry, entry->title, s_current_elf_override.isEmpty() ? entry->serial : std::string(), entry->crc);
|
||||
entry, entry->title, entry->serial, entry->crc, !s_current_elf_override.isEmpty());
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -1580,12 +1579,12 @@ void MainWindow::onViewGamePropertiesActionTriggered()
|
||||
if (s_current_elf_override.isEmpty())
|
||||
{
|
||||
SettingsWindow::openGamePropertiesDialog(
|
||||
nullptr, s_current_title.toStdString(), s_current_disc_serial.toStdString(), s_current_disc_crc);
|
||||
nullptr, s_current_title.toStdString(), s_current_disc_serial.toStdString(), s_current_disc_crc, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
SettingsWindow::openGamePropertiesDialog(
|
||||
nullptr, s_current_title.toStdString(), std::string(), s_current_disc_crc);
|
||||
nullptr, s_current_title.toStdString(), std::string(), s_current_disc_crc, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -56,6 +56,7 @@ GameCheatSettingsWidget::GameCheatSettingsWidget(SettingsWindow* dialog, QWidget
|
||||
m_model_proxy->setFilterFixedString(text);
|
||||
m_ui.cheatList->expandAll();
|
||||
});
|
||||
connect(m_dialog, &SettingsWindow::discSerialChanged, this, &GameCheatSettingsWidget::reloadList);
|
||||
|
||||
dialog->registerWidgetHelp(m_ui.allCRCsCheckbox, tr("Show Cheats For All CRCs"), tr("Checked"),
|
||||
tr("Toggles scanning patch files for all CRCs of the game. With this enabled available patches for the game serial with different CRCs will also be loaded."));
|
||||
@@ -124,7 +125,7 @@ void GameCheatSettingsWidget::updateListEnabled()
|
||||
m_ui.enableAll->setEnabled(cheats_enabled);
|
||||
m_ui.disableAll->setEnabled(cheats_enabled);
|
||||
m_ui.reloadCheats->setEnabled(cheats_enabled);
|
||||
m_ui.allCRCsCheckbox->setEnabled(cheats_enabled);
|
||||
m_ui.allCRCsCheckbox->setEnabled(cheats_enabled && !m_dialog->getSerial().empty());
|
||||
m_ui.searchText->setEnabled(cheats_enabled);
|
||||
}
|
||||
|
||||
@@ -210,6 +211,7 @@ void GameCheatSettingsWidget::reloadList()
|
||||
|
||||
m_parent_map.clear();
|
||||
m_model->removeRows(0, m_model->rowCount());
|
||||
m_ui.allCRCsCheckbox->setEnabled(!m_dialog->getSerial().empty() && m_ui.cheatList->isEnabled());
|
||||
|
||||
for (const Patch::PatchInfo& pi : m_patches)
|
||||
{
|
||||
|
||||
@@ -81,6 +81,7 @@ GamePatchSettingsWidget::GamePatchSettingsWidget(SettingsWindow* dialog, QWidget
|
||||
|
||||
connect(m_ui.reload, &QPushButton::clicked, this, &GamePatchSettingsWidget::onReloadClicked);
|
||||
connect(m_ui.allCRCsCheckbox, &QCheckBox::checkStateChanged, this, &GamePatchSettingsWidget::reloadList);
|
||||
connect(m_dialog, &SettingsWindow::discSerialChanged, this, &GamePatchSettingsWidget::reloadList);
|
||||
|
||||
dialog->registerWidgetHelp(m_ui.allCRCsCheckbox, tr("Show Patches For All CRCs"), tr("Checked"),
|
||||
tr("Toggles scanning patch files for all CRCs of the game. With this enabled available patches for the game serial with different CRCs will also be loaded."));
|
||||
@@ -124,6 +125,7 @@ void GamePatchSettingsWidget::reloadList()
|
||||
setGlobalWsPatchNoteVisibility(ws_patches_enabled_globally);
|
||||
setGlobalNiPatchNoteVisibility(ni_patches_enabled_globally);
|
||||
delete m_ui.scrollArea->takeWidget();
|
||||
m_ui.allCRCsCheckbox->setEnabled(!m_dialog->getSerial().empty());
|
||||
|
||||
QWidget* container = new QWidget(m_ui.scrollArea);
|
||||
QVBoxLayout* layout = new QVBoxLayout(container);
|
||||
|
||||
@@ -156,7 +156,15 @@ void GameSummaryWidget::onDiscPathChanged(const QString& value)
|
||||
|
||||
// force rescan of elf to update the serial
|
||||
g_main_window->rescanFile(m_entry_path);
|
||||
repopulateCurrentDetails();
|
||||
|
||||
auto lock = GameList::GetLock();
|
||||
const GameList::Entry* entry = GameList::GetEntryForPath(m_entry_path.c_str());
|
||||
if (entry)
|
||||
{
|
||||
populateDetails(entry);
|
||||
m_dialog->setSerial(entry->serial);
|
||||
m_ui.checkWiki->setEnabled(!entry->serial.empty());
|
||||
}
|
||||
}
|
||||
|
||||
void GameSummaryWidget::onDiscPathBrowseClicked()
|
||||
|
||||
@@ -447,6 +447,12 @@ void SettingsWindow::setWindowTitle(const QString& title)
|
||||
QWidget::setWindowTitle(QStringLiteral("%1 [%2]").arg(title, m_filename));
|
||||
}
|
||||
|
||||
void SettingsWindow::setSerial(std::string serial)
|
||||
{
|
||||
m_serial = std::move(serial);
|
||||
emit discSerialChanged();
|
||||
}
|
||||
|
||||
bool SettingsWindow::getEffectiveBoolValue(const char* section, const char* key, bool default_value) const
|
||||
{
|
||||
bool value;
|
||||
@@ -649,9 +655,9 @@ void SettingsWindow::saveAndReloadGameSettings()
|
||||
g_emu_thread->reloadGameSettings();
|
||||
}
|
||||
|
||||
void SettingsWindow::openGamePropertiesDialog(const GameList::Entry* game, const std::string_view title, std::string serial, u32 disc_crc)
|
||||
void SettingsWindow::openGamePropertiesDialog(const GameList::Entry* game, const std::string_view title, std::string serial, u32 disc_crc, bool is_elf)
|
||||
{
|
||||
std::string filename = VMManager::GetGameSettingsPath(serial, disc_crc);
|
||||
std::string filename = VMManager::GetGameSettingsPath(!is_elf ? serial : std::string_view(), disc_crc);
|
||||
|
||||
// check for an existing dialog with this filename
|
||||
for (SettingsWindow* dialog : s_open_game_properties_dialogs)
|
||||
|
||||
@@ -45,7 +45,7 @@ public:
|
||||
u32 disc_crc, QString filename = QString());
|
||||
~SettingsWindow();
|
||||
|
||||
static void openGamePropertiesDialog(const GameList::Entry* game, const std::string_view title, std::string serial, u32 disc_crc);
|
||||
static void openGamePropertiesDialog(const GameList::Entry* game, const std::string_view title, std::string serial, u32 disc_crc, bool is_elf);
|
||||
static void closeGamePropertiesDialogs();
|
||||
|
||||
SettingsInterface* getSettingsInterface() const;
|
||||
@@ -72,6 +72,7 @@ public:
|
||||
bool eventFilter(QObject* object, QEvent* event) override;
|
||||
|
||||
void setWindowTitle(const QString& title);
|
||||
void setSerial(std::string serial);
|
||||
|
||||
QString getCategory() const;
|
||||
void setCategory(const char* category);
|
||||
@@ -96,7 +97,7 @@ public:
|
||||
void saveAndReloadGameSettings();
|
||||
|
||||
Q_SIGNALS:
|
||||
void settingsResetToDefaults();
|
||||
void discSerialChanged();
|
||||
|
||||
private Q_SLOTS:
|
||||
void onCategoryCurrentRowChanged(int row);
|
||||
|
||||
@@ -4909,18 +4909,18 @@ Do you want to overwrite?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="660"/>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="666"/>
|
||||
<source>Add Function</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="229"/>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="662"/>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="668"/>
|
||||
<source>Rename Function</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="664"/>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="670"/>
|
||||
<source>Remove Function</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -5017,22 +5017,27 @@ Do you want to overwrite?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="668"/>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="660"/>
|
||||
<source>Go to PC on Pause</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="674"/>
|
||||
<source>Restore Function</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="673"/>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="679"/>
|
||||
<source>Stub (NOP) Function</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="678"/>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="684"/>
|
||||
<source>Show &Opcode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="693"/>
|
||||
<location filename="../Debugger/DisassemblyWidget.cpp" line="699"/>
|
||||
<source>%1 NOT VALID ADDRESS</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -10374,22 +10379,22 @@ Please see our official documentation for more information.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameCheatSettingsWidget.cpp" line="60"/>
|
||||
<location filename="../Settings/GameCheatSettingsWidget.cpp" line="61"/>
|
||||
<source>Show Cheats For All CRCs</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameCheatSettingsWidget.cpp" line="60"/>
|
||||
<location filename="../Settings/GameCheatSettingsWidget.cpp" line="61"/>
|
||||
<source>Checked</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameCheatSettingsWidget.cpp" line="61"/>
|
||||
<location filename="../Settings/GameCheatSettingsWidget.cpp" line="62"/>
|
||||
<source>Toggles scanning patch files for all CRCs of the game. With this enabled available patches for the game serial with different CRCs will also be loaded.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameCheatSettingsWidget.cpp" line="234"/>
|
||||
<location filename="../Settings/GameCheatSettingsWidget.cpp" line="236"/>
|
||||
<source>%1 unlabelled patch codes will automatically activate.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -11088,22 +11093,22 @@ Scanning recursively takes more time, but will identify files in subdirectories.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GamePatchSettingsWidget.cpp" line="85"/>
|
||||
<location filename="../Settings/GamePatchSettingsWidget.cpp" line="86"/>
|
||||
<source>Show Patches For All CRCs</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GamePatchSettingsWidget.cpp" line="85"/>
|
||||
<location filename="../Settings/GamePatchSettingsWidget.cpp" line="86"/>
|
||||
<source>Checked</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GamePatchSettingsWidget.cpp" line="86"/>
|
||||
<location filename="../Settings/GamePatchSettingsWidget.cpp" line="87"/>
|
||||
<source>Toggles scanning patch files for all CRCs of the game. With this enabled available patches for the game serial with different CRCs will also be loaded.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GamePatchSettingsWidget.cpp" line="184"/>
|
||||
<location filename="../Settings/GamePatchSettingsWidget.cpp" line="186"/>
|
||||
<source>There are no patches available for this game.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -11415,99 +11420,99 @@ Scanning recursively takes more time, but will identify files in subdirectories.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="165"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="173"/>
|
||||
<source>Select Disc Path</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="178"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="186"/>
|
||||
<source>Game is not a CD/DVD.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="185"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="193"/>
|
||||
<source>Track list unavailable while virtual machine is running.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="210"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="218"/>
|
||||
<source>#</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="213"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="221"/>
|
||||
<source>Mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="214"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="222"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="230"/>
|
||||
<source>Start</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="215"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="223"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="231"/>
|
||||
<source>Sectors</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="216"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="224"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="232"/>
|
||||
<source>Size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="217"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="225"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="233"/>
|
||||
<source>MD5</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="218"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="226"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="234"/>
|
||||
<source>Status</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="234"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="239"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="240"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="241"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="242"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="247"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="248"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="249"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="255"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="256"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="257"/>
|
||||
<source>%1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="242"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="250"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="258"/>
|
||||
<source><not computed></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="266"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="274"/>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="266"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="274"/>
|
||||
<source>Cannot verify image while a game is running.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="296"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="304"/>
|
||||
<source>One or more tracks is missing.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="333"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="341"/>
|
||||
<source>Verified as %1 [%2] (Version %3).</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="340"/>
|
||||
<location filename="../Settings/GameSummaryWidget.cpp" line="348"/>
|
||||
<source>Verified as %1 [%2].</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -15445,13 +15450,13 @@ Right click to clear binding</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1406"/>
|
||||
<location filename="../MainWindow.cpp" line="1467"/>
|
||||
<location filename="../MainWindow.cpp" line="1405"/>
|
||||
<location filename="../MainWindow.cpp" line="1466"/>
|
||||
<source>Change Disc</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2785"/>
|
||||
<location filename="../MainWindow.cpp" line="2784"/>
|
||||
<source>Load State</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -16004,13 +16009,13 @@ Right click to clear binding</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1510"/>
|
||||
<location filename="../MainWindow.cpp" line="1509"/>
|
||||
<source>Start Big Picture Mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.ui" line="990"/>
|
||||
<location filename="../MainWindow.cpp" line="1511"/>
|
||||
<location filename="../MainWindow.cpp" line="1510"/>
|
||||
<source>Big Picture</source>
|
||||
<comment>In Toolbar</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -16081,11 +16086,11 @@ Are you sure you want to continue?</source>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1312"/>
|
||||
<location filename="../MainWindow.cpp" line="1707"/>
|
||||
<location filename="../MainWindow.cpp" line="2194"/>
|
||||
<location filename="../MainWindow.cpp" line="2329"/>
|
||||
<location filename="../MainWindow.cpp" line="2690"/>
|
||||
<location filename="../MainWindow.cpp" line="2804"/>
|
||||
<location filename="../MainWindow.cpp" line="1706"/>
|
||||
<location filename="../MainWindow.cpp" line="2193"/>
|
||||
<location filename="../MainWindow.cpp" line="2328"/>
|
||||
<location filename="../MainWindow.cpp" line="2689"/>
|
||||
<location filename="../MainWindow.cpp" line="2803"/>
|
||||
<source>Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -16100,264 +16105,264 @@ Are you sure you want to continue?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1361"/>
|
||||
<location filename="../MainWindow.cpp" line="1360"/>
|
||||
<source>Set Cover Image...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1364"/>
|
||||
<location filename="../MainWindow.cpp" line="1363"/>
|
||||
<source>Exclude From List</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1367"/>
|
||||
<location filename="../MainWindow.cpp" line="1366"/>
|
||||
<source>Reset Play Time</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1371"/>
|
||||
<location filename="../MainWindow.cpp" line="1370"/>
|
||||
<source>Check Wiki Page</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1378"/>
|
||||
<location filename="../MainWindow.cpp" line="1377"/>
|
||||
<source>Default Boot</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1385"/>
|
||||
<location filename="../MainWindow.cpp" line="1384"/>
|
||||
<source>Fast Boot</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1388"/>
|
||||
<location filename="../MainWindow.cpp" line="1387"/>
|
||||
<source>Full Boot</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1393"/>
|
||||
<location filename="../MainWindow.cpp" line="1392"/>
|
||||
<source>Boot and Debug</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1417"/>
|
||||
<location filename="../MainWindow.cpp" line="1416"/>
|
||||
<source>Add Search Directory...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1426"/>
|
||||
<location filename="../MainWindow.cpp" line="1425"/>
|
||||
<source>Start File</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1435"/>
|
||||
<location filename="../MainWindow.cpp" line="1434"/>
|
||||
<source>Start Disc</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1452"/>
|
||||
<location filename="../MainWindow.cpp" line="1451"/>
|
||||
<source>Select Disc Image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1620"/>
|
||||
<location filename="../MainWindow.cpp" line="1619"/>
|
||||
<source>Updater Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1626"/>
|
||||
<location filename="../MainWindow.cpp" line="1625"/>
|
||||
<source><p>Sorry, you are trying to update a PCSX2 version which is not an official GitHub release. To prevent incompatibilities, the auto-updater is only enabled on official builds.</p><p>To obtain an official build, please download from the link below:</p><p><a href="https://pcsx2.net/downloads/">https://pcsx2.net/downloads/</a></p></source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1631"/>
|
||||
<location filename="../MainWindow.cpp" line="1630"/>
|
||||
<source>Automatic updating is not supported on the current platform.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1697"/>
|
||||
<location filename="../MainWindow.cpp" line="1696"/>
|
||||
<source>Confirm File Creation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1698"/>
|
||||
<location filename="../MainWindow.cpp" line="1697"/>
|
||||
<source>The pnach file '%1' does not currently exist. Do you want to create it?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1707"/>
|
||||
<location filename="../MainWindow.cpp" line="1706"/>
|
||||
<source>Failed to create '%1'.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1732"/>
|
||||
<location filename="../MainWindow.cpp" line="1731"/>
|
||||
<source>Theme Change</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1733"/>
|
||||
<location filename="../MainWindow.cpp" line="1732"/>
|
||||
<source>Changing the theme will close the debugger window. Any unsaved data will be lost. Do you want to continue?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1831"/>
|
||||
<location filename="../MainWindow.cpp" line="1830"/>
|
||||
<source>Input Recording Failed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1832"/>
|
||||
<location filename="../MainWindow.cpp" line="1831"/>
|
||||
<source>Failed to create file: {}</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1855"/>
|
||||
<location filename="../MainWindow.cpp" line="1854"/>
|
||||
<source>Input Recording Files (*.p2m2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1890"/>
|
||||
<location filename="../MainWindow.cpp" line="1889"/>
|
||||
<source>Input Playback Failed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1891"/>
|
||||
<location filename="../MainWindow.cpp" line="1890"/>
|
||||
<source>Failed to open file: {}</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1972"/>
|
||||
<location filename="../MainWindow.cpp" line="1971"/>
|
||||
<source>Paused</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2151"/>
|
||||
<location filename="../MainWindow.cpp" line="2150"/>
|
||||
<source>Load State Failed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2151"/>
|
||||
<location filename="../MainWindow.cpp" line="2150"/>
|
||||
<source>Cannot load a save state without a running VM.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2179"/>
|
||||
<location filename="../MainWindow.cpp" line="2178"/>
|
||||
<source>The new ELF cannot be loaded without resetting the virtual machine. Do you want to reset the virtual machine now?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2194"/>
|
||||
<location filename="../MainWindow.cpp" line="2193"/>
|
||||
<source>Cannot change from game to GS dump without shutting down first.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2329"/>
|
||||
<location filename="../MainWindow.cpp" line="2328"/>
|
||||
<source>Failed to get window info from widget</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1510"/>
|
||||
<location filename="../MainWindow.cpp" line="1509"/>
|
||||
<source>Stop Big Picture Mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1511"/>
|
||||
<location filename="../MainWindow.cpp" line="1510"/>
|
||||
<source>Exit Big Picture</source>
|
||||
<comment>In Toolbar</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1575"/>
|
||||
<location filename="../MainWindow.cpp" line="1574"/>
|
||||
<source>Game Properties</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="1575"/>
|
||||
<location filename="../MainWindow.cpp" line="1574"/>
|
||||
<source>Game properties is unavailable for the current game.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2648"/>
|
||||
<location filename="../MainWindow.cpp" line="2647"/>
|
||||
<source>Could not find any CD/DVD-ROM devices. Please ensure you have a drive connected and sufficient permissions to access it.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2666"/>
|
||||
<location filename="../MainWindow.cpp" line="2665"/>
|
||||
<source>Select disc drive:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2690"/>
|
||||
<location filename="../MainWindow.cpp" line="2689"/>
|
||||
<source>This save state does not exist.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2703"/>
|
||||
<location filename="../MainWindow.cpp" line="2702"/>
|
||||
<source>Select Cover Image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2720"/>
|
||||
<location filename="../MainWindow.cpp" line="2719"/>
|
||||
<source>Cover Already Exists</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2721"/>
|
||||
<location filename="../MainWindow.cpp" line="2720"/>
|
||||
<source>A cover image for this game already exists, do you wish to replace it?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2716"/>
|
||||
<location filename="../MainWindow.cpp" line="2730"/>
|
||||
<location filename="../MainWindow.cpp" line="2736"/>
|
||||
<location filename="../MainWindow.cpp" line="2742"/>
|
||||
<location filename="../MainWindow.cpp" line="2715"/>
|
||||
<location filename="../MainWindow.cpp" line="2729"/>
|
||||
<location filename="../MainWindow.cpp" line="2735"/>
|
||||
<location filename="../MainWindow.cpp" line="2741"/>
|
||||
<source>Copy Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2730"/>
|
||||
<location filename="../MainWindow.cpp" line="2729"/>
|
||||
<source>Failed to remove existing cover '%1'</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2736"/>
|
||||
<location filename="../MainWindow.cpp" line="2735"/>
|
||||
<source>Failed to copy '%1' to '%2'</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2742"/>
|
||||
<location filename="../MainWindow.cpp" line="2741"/>
|
||||
<source>Failed to remove '%1'</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2178"/>
|
||||
<location filename="../MainWindow.cpp" line="2751"/>
|
||||
<location filename="../MainWindow.cpp" line="2177"/>
|
||||
<location filename="../MainWindow.cpp" line="2750"/>
|
||||
<source>Confirm Reset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2703"/>
|
||||
<location filename="../MainWindow.cpp" line="2702"/>
|
||||
<source>All Cover Image Types (*.jpg *.jpeg *.png *.webp)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2716"/>
|
||||
<location filename="../MainWindow.cpp" line="2715"/>
|
||||
<source>You must select a different file to the current cover image.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2752"/>
|
||||
<location filename="../MainWindow.cpp" line="2751"/>
|
||||
<source>Are you sure you want to reset the play time for '%1'?
|
||||
|
||||
This action cannot be undone.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2779"/>
|
||||
<location filename="../MainWindow.cpp" line="2778"/>
|
||||
<source>Load Resume State</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2782"/>
|
||||
<location filename="../MainWindow.cpp" line="2781"/>
|
||||
<source>A resume save state was found for this game, saved at:
|
||||
|
||||
%1.
|
||||
@@ -16366,43 +16371,43 @@ Do you want to load this state, or start from a fresh boot?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2786"/>
|
||||
<location filename="../MainWindow.cpp" line="2785"/>
|
||||
<source>Fresh Boot</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2787"/>
|
||||
<location filename="../MainWindow.cpp" line="2786"/>
|
||||
<source>Delete And Boot</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2804"/>
|
||||
<location filename="../MainWindow.cpp" line="2803"/>
|
||||
<source>Failed to delete save state file '%1'.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2862"/>
|
||||
<location filename="../MainWindow.cpp" line="2861"/>
|
||||
<source>Load State File...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2862"/>
|
||||
<location filename="../MainWindow.cpp" line="2861"/>
|
||||
<source>Load From File...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2865"/>
|
||||
<location filename="../MainWindow.cpp" line="2936"/>
|
||||
<location filename="../MainWindow.cpp" line="2864"/>
|
||||
<location filename="../MainWindow.cpp" line="2935"/>
|
||||
<source>Select Save State File</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2936"/>
|
||||
<location filename="../MainWindow.cpp" line="2935"/>
|
||||
<source>Save States (*.p2s)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2872"/>
|
||||
<location filename="../MainWindow.cpp" line="2871"/>
|
||||
<source>Delete Save States...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -16422,75 +16427,75 @@ Do you want to load this state, or start from a fresh boot?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2865"/>
|
||||
<location filename="../MainWindow.cpp" line="2864"/>
|
||||
<source>Save States (*.p2s *.p2s.backup)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2877"/>
|
||||
<location filename="../MainWindow.cpp" line="2876"/>
|
||||
<source>Undo Load State</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2891"/>
|
||||
<location filename="../MainWindow.cpp" line="2890"/>
|
||||
<source>Resume (%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2907"/>
|
||||
<location filename="../MainWindow.cpp" line="2906"/>
|
||||
<source>Load Slot %1 (%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2916"/>
|
||||
<location filename="../MainWindow.cpp" line="2924"/>
|
||||
<location filename="../MainWindow.cpp" line="2915"/>
|
||||
<location filename="../MainWindow.cpp" line="2923"/>
|
||||
<source>Delete Save States</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2917"/>
|
||||
<location filename="../MainWindow.cpp" line="2916"/>
|
||||
<source>Are you sure you want to delete all save states for %1?
|
||||
|
||||
The saves will not be recoverable.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2924"/>
|
||||
<location filename="../MainWindow.cpp" line="2923"/>
|
||||
<source>%1 save states deleted.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2934"/>
|
||||
<location filename="../MainWindow.cpp" line="2933"/>
|
||||
<source>Save To File...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2954"/>
|
||||
<location filename="../MainWindow.cpp" line="2953"/>
|
||||
<source>Empty</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="2956"/>
|
||||
<location filename="../MainWindow.cpp" line="2955"/>
|
||||
<source>Save Slot %1 (%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="3007"/>
|
||||
<location filename="../MainWindow.cpp" line="3006"/>
|
||||
<source>Confirm Disc Change</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="3008"/>
|
||||
<location filename="../MainWindow.cpp" line="3007"/>
|
||||
<source>Do you want to swap discs or boot the new image (via system reset)?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="3009"/>
|
||||
<location filename="../MainWindow.cpp" line="3008"/>
|
||||
<source>Swap Disc</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="3010"/>
|
||||
<location filename="../MainWindow.cpp" line="3009"/>
|
||||
<source>Reset</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
@@ -16513,24 +16518,24 @@ The saves will not be recoverable.</source>
|
||||
<context>
|
||||
<name>MemoryCard</name>
|
||||
<message>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="282"/>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="969"/>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="289"/>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="962"/>
|
||||
<source>Memory Card Creation Failed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="283"/>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="290"/>
|
||||
<source>Could not create the memory card:
|
||||
{}</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="308"/>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="315"/>
|
||||
<source>Memory Card Read Failed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="309"/>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="316"/>
|
||||
<source>Unable to access memory card:
|
||||
|
||||
{}
|
||||
@@ -16541,13 +16546,13 @@ Close any other instances of PCSX2, or restart your computer.
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="504"/>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="497"/>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFolder.cpp" line="2344"/>
|
||||
<source>Memory Card '{}' was saved to storage.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="970"/>
|
||||
<location filename="../../pcsx2/SIO/Memcard/MemoryCardFile.cpp" line="963"/>
|
||||
<source>Failed to create memory card. The error was:
|
||||
{}</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -16564,7 +16569,8 @@ Close any other instances of PCSX2, or restart your computer.
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/SIO/Sio.cpp" line="165"/>
|
||||
<source>The virtual console hasn't saved to your memory card for quite some time. Savestates should not be used in place of in-game saves.</source>
|
||||
<source>The virtual console hasn't saved to your memory card in a long time.
|
||||
Savestates should not be used in place of in-game saves.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
@@ -18200,7 +18206,7 @@ Ejecting {3} and replacing it with {2}.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../pcsx2/Patch.cpp" line="760"/>
|
||||
<location filename="../../pcsx2/Patch.cpp" line="762"/>
|
||||
<source>%n GameDB patches are active.</source>
|
||||
<comment>OSD Message</comment>
|
||||
<translation type="unfinished">
|
||||
@@ -18209,7 +18215,7 @@ Ejecting {3} and replacing it with {2}.</source>
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../pcsx2/Patch.cpp" line="767"/>
|
||||
<location filename="../../pcsx2/Patch.cpp" line="769"/>
|
||||
<source>%n game patches are active.</source>
|
||||
<comment>OSD Message</comment>
|
||||
<translation type="unfinished">
|
||||
@@ -18218,7 +18224,7 @@ Ejecting {3} and replacing it with {2}.</source>
|
||||
</translation>
|
||||
</message>
|
||||
<message numerus="yes">
|
||||
<location filename="../../pcsx2/Patch.cpp" line="774"/>
|
||||
<location filename="../../pcsx2/Patch.cpp" line="776"/>
|
||||
<source>%n cheat patches are active.</source>
|
||||
<comment>OSD Message</comment>
|
||||
<translation type="unfinished">
|
||||
@@ -18227,7 +18233,7 @@ Ejecting {3} and replacing it with {2}.</source>
|
||||
</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../pcsx2/Patch.cpp" line="789"/>
|
||||
<location filename="../../pcsx2/Patch.cpp" line="791"/>
|
||||
<source>No cheats or patches (widescreen, compatibility or others) are found / enabled.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
@@ -952,11 +952,11 @@ GSVector2i GSRendererHW::GetValidSize(const GSTextureCache::Source* tex)
|
||||
return GSVector2i(width, height);
|
||||
}
|
||||
|
||||
GSVector2i GSRendererHW::GetTargetSize(const GSTextureCache::Source* tex)
|
||||
GSVector2i GSRendererHW::GetTargetSize(const GSTextureCache::Source* tex, const bool can_expand)
|
||||
{
|
||||
const GSVector2i valid_size = GetValidSize(tex);
|
||||
|
||||
return g_texture_cache->GetTargetSize(m_cached_ctx.FRAME.Block(), m_cached_ctx.FRAME.FBW, m_cached_ctx.FRAME.PSM, valid_size.x, valid_size.y);
|
||||
return g_texture_cache->GetTargetSize(m_cached_ctx.FRAME.Block(), m_cached_ctx.FRAME.FBW, m_cached_ctx.FRAME.PSM, valid_size.x, valid_size.y, can_expand);
|
||||
}
|
||||
|
||||
bool GSRendererHW::IsPossibleChannelShuffle() const
|
||||
@@ -2553,7 +2553,7 @@ void GSRendererHW::Draw()
|
||||
const u32 color_mask = (m_vt.m_max.c > GSVector4i::zero()).mask();
|
||||
const bool texture_function_color = m_cached_ctx.TEX0.TFX == TFX_DECAL || (color_mask & 0xFFF) || (m_cached_ctx.TEX0.TFX > TFX_DECAL && (color_mask & 0xF000));
|
||||
const bool texture_function_alpha = m_cached_ctx.TEX0.TFX != TFX_MODULATE || (color_mask & 0xF000);
|
||||
const bool req_color = texture_function_color && (!PRIM->ABE || (PRIM->ABE && IsUsingCsInBlend())) && (possible_shuffle || (m_cached_ctx.FRAME.FBMSK & (fm_mask & 0x00FFFFFF)) != (fm_mask & 0x00FFFFFF)) || need_aem_color;
|
||||
const bool req_color = (texture_function_color && (!PRIM->ABE || (PRIM->ABE && IsUsingCsInBlend())) && (possible_shuffle || (m_cached_ctx.FRAME.FBMSK & (fm_mask & 0x00FFFFFF)) != (fm_mask & 0x00FFFFFF))) || need_aem_color;
|
||||
const bool alpha_used = (GSUtil::GetChannelMask(m_context->TEX0.PSM) == 0x8 || (m_context->TEX0.TCC && texture_function_alpha)) && ((PRIM->ABE && IsUsingAsInBlend()) || (m_cached_ctx.TEST.ATE && m_cached_ctx.TEST.ATST > ATST_ALWAYS) || (possible_shuffle || (m_cached_ctx.FRAME.FBMSK & (fm_mask & 0xFF000000)) != (fm_mask & 0xFF000000)));
|
||||
const bool req_alpha = (GSUtil::GetChannelMask(m_context->TEX0.PSM) & 0x8) && alpha_used;
|
||||
|
||||
@@ -2612,8 +2612,14 @@ void GSRendererHW::Draw()
|
||||
}
|
||||
}
|
||||
|
||||
// Urban Reign trolls by scissoring a draw to a target at 0x0-0x117F to 378x449 which ends up the size being rounded up to 640x480
|
||||
// causing the buffer to expand to around 0x1400, which makes a later framebuffer at 0x1180 to fail to be created correctly.
|
||||
// We can cheese this by checking if the Z is masked and the resultant colour is going to be black anyway.
|
||||
const bool output_black = PRIM->ABE && ((m_context->ALPHA.A == 1 && m_context->ALPHA.B == 0 && GetAlphaMinMax().min >= 128) || m_context->ALPHA.IsBlack()) && m_draw_env->COLCLAMP.CLAMP == 1;
|
||||
const bool can_expand = !(m_cached_ctx.ZBUF.ZMSK && output_black);
|
||||
|
||||
// Estimate size based on the scissor rectangle and height cache.
|
||||
const GSVector2i t_size = GetTargetSize(src);
|
||||
const GSVector2i t_size = GetTargetSize(src, can_expand);
|
||||
const GSVector4i t_size_rect = GSVector4i::loadh(t_size);
|
||||
|
||||
// Ensure draw rect is clamped to framebuffer size. Necessary for updating valid area.
|
||||
@@ -3404,20 +3410,18 @@ void GSRendererHW::Draw()
|
||||
|
||||
std::string s;
|
||||
|
||||
if (GSConfig.SaveRT && s_n >= GSConfig.SaveN)
|
||||
if (rt && GSConfig.SaveRT && s_n >= GSConfig.SaveN)
|
||||
{
|
||||
s = GetDrawDumpPath("%05d_f%lld_rt1_%05x_%s.bmp", s_n, frame, m_cached_ctx.FRAME.Block(), psm_str(m_cached_ctx.FRAME.PSM));
|
||||
s = GetDrawDumpPath("%05d_f%lld_rt1_%05x_(%05x)_%s.bmp", s_n, frame, m_cached_ctx.FRAME.Block(), rt->m_TEX0.TBP0, psm_str(m_cached_ctx.FRAME.PSM));
|
||||
|
||||
if (rt)
|
||||
rt->m_texture->Save(s);
|
||||
rt->m_texture->Save(s);
|
||||
}
|
||||
|
||||
if (GSConfig.SaveDepth && s_n >= GSConfig.SaveN)
|
||||
if (ds && GSConfig.SaveDepth && s_n >= GSConfig.SaveN)
|
||||
{
|
||||
s = GetDrawDumpPath("%05d_f%lld_rz1_%05x_%s.bmp", s_n, frame, m_cached_ctx.ZBUF.Block(), psm_str(m_cached_ctx.ZBUF.PSM));
|
||||
s = GetDrawDumpPath("%05d_f%lld_rz1_%05x_(%05x)_%s.bmp", s_n, frame, m_cached_ctx.ZBUF.Block(), ds->m_TEX0.TBP0, psm_str(m_cached_ctx.ZBUF.PSM));
|
||||
|
||||
if (ds)
|
||||
ds->m_texture->Save(s);
|
||||
ds->m_texture->Save(s);
|
||||
}
|
||||
|
||||
if (GSConfig.SaveL > 0 && (s_n - GSConfig.SaveN) > GSConfig.SaveL)
|
||||
@@ -3429,6 +3433,8 @@ void GSRendererHW::Draw()
|
||||
if (rt)
|
||||
rt->m_last_draw = s_n;
|
||||
|
||||
if (ds)
|
||||
ds->m_last_draw = s_n;
|
||||
#ifdef DISABLE_HW_TEXTURE_CACHE
|
||||
if (rt)
|
||||
g_texture_cache->Read(rt, real_rect);
|
||||
@@ -7407,9 +7413,10 @@ ClearType GSRendererHW::IsConstantDirectWriteMemClear()
|
||||
&& !(m_draw_env->SCANMSK.MSK & 2) && !m_cached_ctx.TEST.ATE // no alpha test
|
||||
&& !m_cached_ctx.TEST.DATE // no destination alpha test
|
||||
&& (!m_cached_ctx.TEST.ZTE || m_cached_ctx.TEST.ZTST == ZTST_ALWAYS) // no depth test
|
||||
&& (m_vt.m_eq.rgba == 0xFFFF || m_vertex.next == 2)) // constant color write
|
||||
&& (m_vt.m_eq.rgba == 0xFFFF || m_vertex.next == 2) // constant color write
|
||||
&& (!PRIM->FGE || m_vt.m_min.p.w == 255.0f)) // No fog effect
|
||||
{
|
||||
if (PRIM->ABE && (!m_context->ALPHA.IsOpaque() || m_cached_ctx.FRAME.FBMSK))
|
||||
if ((PRIM->ABE && !m_context->ALPHA.IsOpaque()) || (m_cached_ctx.FRAME.FBMSK & GSLocalMemory::m_psm[m_cached_ctx.FRAME.PSM].fmsk))
|
||||
return ClearWithDraw;
|
||||
|
||||
return NormalClear;
|
||||
|
||||
@@ -214,7 +214,7 @@ public:
|
||||
void MergeSprite(GSTextureCache::Source* tex);
|
||||
float GetTextureScaleFactor() override;
|
||||
GSVector2i GetValidSize(const GSTextureCache::Source* tex = nullptr);
|
||||
GSVector2i GetTargetSize(const GSTextureCache::Source* tex = nullptr);
|
||||
GSVector2i GetTargetSize(const GSTextureCache::Source* tex = nullptr, const bool can_expand = true);
|
||||
|
||||
void Reset(bool hardware_reset) override;
|
||||
void UpdateSettings(const Pcsx2Config::GSOptions& old_config) override;
|
||||
|
||||
@@ -2569,7 +2569,7 @@ bool GSTextureCache::PreloadTarget(GIFRegTEX0 TEX0, const GSVector2i& size, cons
|
||||
{
|
||||
const GSVector4i save_rect = preserve_target ? newrect : eerect;
|
||||
|
||||
if(!hw_clear)
|
||||
if (!hw_clear)
|
||||
dst->UpdateValidity(save_rect);
|
||||
GL_INS("Preloading the RT DATA from updated GS Memory");
|
||||
AddDirtyRectTarget(dst, save_rect, TEX0.PSM, TEX0.TBW, rgba, GSLocalMemory::m_psm[TEX0.PSM].trbpp >= 16);
|
||||
@@ -2605,12 +2605,14 @@ bool GSTextureCache::PreloadTarget(GIFRegTEX0 TEX0, const GSVector2i& size, cons
|
||||
auto j = i;
|
||||
Target* t = *j;
|
||||
|
||||
if (dst != t && t->m_TEX0.TBW == dst->m_TEX0.TBW && t->m_TEX0.PSM == dst->m_TEX0.PSM && t->m_TEX0.TBW > 4)
|
||||
if (dst != t && t->m_TEX0.PSM == dst->m_TEX0.PSM/* && t->m_TEX0.TBW == dst->m_TEX0.TBW*/)
|
||||
if (t->Overlaps(dst->m_TEX0.TBP0, dst->m_TEX0.TBW, dst->m_TEX0.PSM, dst->m_valid))
|
||||
{
|
||||
const u32 buffer_width = std::max(1U, dst->m_TEX0.TBW);
|
||||
|
||||
// If the two targets are misaligned, it's likely a relocation, so we can just kill the old target.
|
||||
// Kill targets that are overlapping new targets, but ignore the copy if the old target is dirty because we favour GS memory.
|
||||
if (((((t->m_TEX0.TBP0 - dst->m_TEX0.TBP0) >> 5) % dst->m_TEX0.TBW) != 0) && !t->m_dirty.empty())
|
||||
if (((((t->m_TEX0.TBP0 - dst->m_TEX0.TBP0) >> 5) % buffer_width) != 0) && !t->m_dirty.empty())
|
||||
{
|
||||
InvalidateSourcesFromTarget(t);
|
||||
i = list.erase(j);
|
||||
@@ -2629,64 +2631,84 @@ bool GSTextureCache::PreloadTarget(GIFRegTEX0 TEX0, const GSVector2i& size, cons
|
||||
return hw_clear.value_or(false);
|
||||
}
|
||||
// The new texture is behind it but engulfs the whole thing, shrink the new target so it grows in the HW Draw resize.
|
||||
else if (dst->m_TEX0.TBP0 < t->m_TEX0.TBP0 && (dst->UnwrappedEndBlock() + 1) > t->m_TEX0.TBP0 && dst->m_TEX0.TBP0 < (t->UnwrappedEndBlock() + 1))
|
||||
else if (dst->m_TEX0.TBP0 < t->m_TEX0.TBP0 && (dst->UnwrappedEndBlock() + 1) > t->m_TEX0.TBP0)
|
||||
{
|
||||
const int rt_pages = ((t->UnwrappedEndBlock() + 1) - t->m_TEX0.TBP0) >> 5;
|
||||
const int overlapping_pages = std::min(rt_pages, static_cast<int>((dst->UnwrappedEndBlock() + 1) - t->m_TEX0.TBP0) >> 5);
|
||||
const int overlapping_pages_height = (overlapping_pages / dst->m_TEX0.TBW) * GSLocalMemory::m_psm[t->m_TEX0.PSM].pgs.y;
|
||||
const int overlapping_pages_height = ((overlapping_pages + (buffer_width - 1)) / buffer_width) * GSLocalMemory::m_psm[t->m_TEX0.PSM].pgs.y;
|
||||
|
||||
if (overlapping_pages_height == 0 || (overlapping_pages % dst->m_TEX0.TBW))
|
||||
if (overlapping_pages_height == 0 || (overlapping_pages % buffer_width))
|
||||
{
|
||||
// No overlap top copy or the widths don't match.
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
const int dst_offset_width = (((t->m_TEX0.TBP0 - dst->m_TEX0.TBP0) >> 5) % dst->m_TEX0.TBW) * GSLocalMemory::m_psm[t->m_TEX0.PSM].pgs.x;
|
||||
const int dst_offset_height = ((((t->m_TEX0.TBP0 - dst->m_TEX0.TBP0) >> 5) / dst->m_TEX0.TBW) * GSLocalMemory::m_psm[t->m_TEX0.PSM].pgs.y);
|
||||
const int dst_offset_height = ((((t->m_TEX0.TBP0 - dst->m_TEX0.TBP0) >> 5) / buffer_width) * GSLocalMemory::m_psm[t->m_TEX0.PSM].pgs.y);
|
||||
const int texture_height = (dst->m_TEX0.TBW == t->m_TEX0.TBW) ? (dst_offset_height + t->m_valid.w) : (dst_offset_height + overlapping_pages_height);
|
||||
|
||||
if (texture_height > dst->m_unscaled_size.y && !dst->ResizeTexture(dst->m_unscaled_size.x, texture_height, true))
|
||||
{
|
||||
// Resize failed, probably ran out of VRAM, better luck next time. Fall back to CPU.
|
||||
DevCon.Warning("Failed to resize target on preload? Draw %d", GSState::s_n);
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
const int dst_offset_width = (((t->m_TEX0.TBP0 - dst->m_TEX0.TBP0) >> 5) % buffer_width) * GSLocalMemory::m_psm[t->m_TEX0.PSM].pgs.x;
|
||||
const int dst_offset_scaled_width = dst_offset_width * dst->m_scale;
|
||||
const int dst_offset_scaled_height = dst_offset_height * dst->m_scale;
|
||||
const GSVector4i dst_rect_scale = GSVector4i(t->m_valid.x, dst_offset_height, t->m_valid.z, dst_offset_height + overlapping_pages_height);
|
||||
const GSVector4i dst_rect_scale = GSVector4i(t->m_valid.x, dst_offset_height, t->m_valid.z, texture_height);
|
||||
|
||||
if (((!hw_clear && (preserve_target || preload)) || dst_rect_scale.rintersect(draw_rect).rempty()) && dst->GetScale() == t->GetScale())
|
||||
{
|
||||
const int copy_width = ((t->m_texture->GetWidth()) > (dst->m_texture->GetWidth()) ? (dst->m_texture->GetWidth()) : t->m_texture->GetWidth()) - dst_offset_scaled_width;
|
||||
const int copy_height = overlapping_pages_height * t->m_scale;
|
||||
int copy_width = ((t->m_texture->GetWidth()) > (dst->m_texture->GetWidth()) ? (dst->m_texture->GetWidth()) : t->m_texture->GetWidth()) - dst_offset_scaled_width;
|
||||
int copy_height = (texture_height - dst_offset_height) * t->m_scale;
|
||||
|
||||
GL_INS("RT double buffer copy from FBP 0x%x, %dx%d => %d,%d", t->m_TEX0.TBP0, copy_width, copy_height, 0, dst_offset_scaled_height);
|
||||
|
||||
// Clear the dirty first
|
||||
t->Update();
|
||||
dst->Update();
|
||||
|
||||
// Clamp it if it gets too small, shouldn't happen but stranger things have happened.
|
||||
if (copy_width < 0)
|
||||
{
|
||||
copy_width = 0;
|
||||
}
|
||||
|
||||
// Invalidate has been moved to after DrawPrims(), because we might kill the current sources' backing.
|
||||
if (!t->m_valid_rgb || !(t->m_valid_alpha_high || t->m_valid_alpha_low) || t->m_scale != dst->m_scale)
|
||||
{
|
||||
const GSVector4 src_rect = GSVector4(0, 0, copy_width, copy_height) / (GSVector4(t->m_texture->GetSize()).xyxy());
|
||||
const GSVector4 dst_rect = GSVector4(dst_offset_scaled_width, dst_offset_scaled_height, dst_offset_scaled_width + copy_width, dst_offset_scaled_width + copy_height);
|
||||
const GSVector4 dst_rect = GSVector4(dst_offset_scaled_width, dst_offset_scaled_height, dst_offset_scaled_width + copy_width, dst_offset_scaled_height + copy_height);
|
||||
g_gs_device->StretchRect(t->m_texture, src_rect, dst->m_texture, dst_rect, t->m_valid_rgb, t->m_valid_rgb, t->m_valid_rgb, t->m_valid_alpha_high || t->m_valid_alpha_low);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Invalidate has been moved to after DrawPrims(), because we might kill the current sources' backing.
|
||||
if ((copy_width + dst_offset_scaled_width) > (dst->m_unscaled_size.x * dst->m_scale) || (copy_height + dst_offset_scaled_height) > (dst->m_unscaled_size.y * dst->m_scale))
|
||||
{
|
||||
copy_width = std::min(copy_width, static_cast<int>((dst->m_unscaled_size.x * dst->m_scale) - dst_offset_scaled_width));
|
||||
copy_height = std::min(copy_height, static_cast<int>((dst->m_unscaled_size.y * dst->m_scale) - dst_offset_scaled_height));
|
||||
}
|
||||
|
||||
g_gs_device->CopyRect(t->m_texture, dst->m_texture, GSVector4i(0, 0, copy_width, copy_height), dst_offset_scaled_width, dst_offset_scaled_height);
|
||||
}
|
||||
}
|
||||
|
||||
if ((overlapping_pages < rt_pages) || (src && src->m_target && src->m_from_target == t))
|
||||
// src is using this target, so point it at the new copy.
|
||||
if (src && src->m_target && src->m_from_target == t)
|
||||
{
|
||||
// This should never happen as we're making a new target so the src should never be something it overlaps, but just incase..
|
||||
GSVector4i new_valid = t->m_valid;
|
||||
new_valid.y = std::max(new_valid.y - overlapping_pages_height, 0);
|
||||
new_valid.w = std::max(new_valid.w - overlapping_pages_height, 0);
|
||||
t->m_TEX0.TBP0 += (overlapping_pages_height / GSLocalMemory::m_psm[t->m_TEX0.PSM].pgs.y) << 5;
|
||||
t->ResizeValidity(new_valid);
|
||||
src->m_from_target = dst;
|
||||
src->m_texture = dst->m_texture;
|
||||
src->m_region.SetY(src->m_region.GetMinY() + dst_offset_height, src->m_region.GetMaxY() + dst_offset_height);
|
||||
src->m_region.SetX(src->m_region.GetMinX() + dst_offset_width, src->m_region.GetMaxX() + dst_offset_width);
|
||||
}
|
||||
else
|
||||
{
|
||||
InvalidateSourcesFromTarget(t);
|
||||
i = list.erase(j);
|
||||
delete t;
|
||||
}
|
||||
return hw_clear.value_or(false);
|
||||
|
||||
InvalidateSourcesFromTarget(t);
|
||||
i = list.erase(j);
|
||||
delete t;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
@@ -3736,6 +3758,19 @@ bool GSTextureCache::Move(u32 SBP, u32 SBW, u32 SPSM, int sx, int sy, u32 DBP, u
|
||||
if (alpha_only && (!dst || GSLocalMemory::m_psm[dst->m_TEX0.PSM].bpp != 32))
|
||||
return false;
|
||||
|
||||
// Beware of the case where a game might create a larger texture by moving a bunch of chunks around.
|
||||
if (dst && DBP == SBP && dy > dst->m_unscaled_size.y)
|
||||
{
|
||||
const u32 new_DBP = DBP + (((dy / GSLocalMemory::m_psm[dst->m_TEX0.PSM].pgs.y) * DBW) << 5);
|
||||
|
||||
dst = nullptr;
|
||||
|
||||
DBP = new_DBP;
|
||||
dy = 0;
|
||||
|
||||
dst = GetExactTarget(DBP, DBW, dpsm_s.depth ? DepthStencil : RenderTarget, DBP);
|
||||
}
|
||||
|
||||
// Beware of the case where a game might create a larger texture by moving a bunch of chunks around.
|
||||
// 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.
|
||||
@@ -4182,7 +4217,7 @@ GSTextureCache::Target* GSTextureCache::FindOverlappingTarget(u32 BP, u32 BW, u3
|
||||
return FindOverlappingTarget(BP, end_bp);
|
||||
}
|
||||
|
||||
GSVector2i GSTextureCache::GetTargetSize(u32 bp, u32 fbw, u32 psm, s32 min_width, s32 min_height)
|
||||
GSVector2i GSTextureCache::GetTargetSize(u32 bp, u32 fbw, u32 psm, s32 min_width, s32 min_height, bool can_expand)
|
||||
{
|
||||
TargetHeightElem search = {};
|
||||
search.bp = bp;
|
||||
@@ -4196,14 +4231,17 @@ GSVector2i GSTextureCache::GetTargetSize(u32 bp, u32 fbw, u32 psm, s32 min_width
|
||||
TargetHeightElem& elem = const_cast<TargetHeightElem&>(*it);
|
||||
if (elem.bits == search.bits)
|
||||
{
|
||||
if (elem.width < min_width || elem.height < min_height)
|
||||
if (can_expand)
|
||||
{
|
||||
DbgCon.WriteLn("Expand size at %x %u %u from %ux%u to %ux%u", bp, fbw, psm, elem.width, elem.height,
|
||||
min_width, min_height);
|
||||
}
|
||||
if (elem.width < min_width || elem.height < min_height)
|
||||
{
|
||||
DbgCon.WriteLn("Expand size at %x %u %u from %ux%u to %ux%u", bp, fbw, psm, elem.width, elem.height,
|
||||
min_width, min_height);
|
||||
}
|
||||
|
||||
elem.width = std::max(elem.width, min_width);
|
||||
elem.height = std::max(elem.height, min_height);
|
||||
elem.width = std::max(elem.width, min_width);
|
||||
elem.height = std::max(elem.height, min_height);
|
||||
}
|
||||
|
||||
m_target_heights.MoveFront(it.Index());
|
||||
elem.age = 0;
|
||||
@@ -4211,7 +4249,7 @@ GSVector2i GSTextureCache::GetTargetSize(u32 bp, u32 fbw, u32 psm, s32 min_width
|
||||
}
|
||||
}
|
||||
|
||||
DbgCon.WriteLn("New size at %x %u %u: %ux%u", bp, fbw, psm, min_width, min_height);
|
||||
DbgCon.WriteLn("New size at %x %u %u: %ux%u draw %d", bp, fbw, psm, min_width, min_height, GSState::s_n);
|
||||
m_target_heights.push_front(search);
|
||||
return GSVector2i(min_width, min_height);
|
||||
}
|
||||
|
||||
@@ -504,7 +504,7 @@ public:
|
||||
Target* FindOverlappingTarget(u32 BP, u32 end_bp) const;
|
||||
Target* FindOverlappingTarget(u32 BP, u32 BW, u32 PSM, GSVector4i rc) const;
|
||||
|
||||
GSVector2i GetTargetSize(u32 bp, u32 fbw, u32 psm, s32 min_width, s32 min_height);
|
||||
GSVector2i GetTargetSize(u32 bp, u32 fbw, u32 psm, s32 min_width, s32 min_height, bool can_expand = true);
|
||||
bool HasTargetInHeightCache(u32 bp, u32 fbw, u32 psm, u32 max_age = std::numeric_limits<u32>::max(), bool move_front = true);
|
||||
bool Has32BitTarget(u32 bp);
|
||||
|
||||
|
||||
@@ -368,12 +368,14 @@ bool Patch::OpenPatchesZip()
|
||||
std::string Patch::GetPnachTemplate(const std::string_view serial, u32 crc, bool include_serial, bool add_wildcard, bool all_crcs)
|
||||
{
|
||||
pxAssert(!all_crcs || (include_serial && add_wildcard));
|
||||
if (all_crcs)
|
||||
return fmt::format("{}_*.pnach", serial);
|
||||
else if (include_serial)
|
||||
return fmt::format("{}_{:08X}{}.pnach", serial, crc, add_wildcard ? "*" : "");
|
||||
else
|
||||
return fmt::format("{:08X}{}.pnach", crc, add_wildcard ? "*" : "");
|
||||
if (!serial.empty())
|
||||
{
|
||||
if (all_crcs)
|
||||
return fmt::format("{}_*.pnach", serial);
|
||||
else if (include_serial)
|
||||
return fmt::format("{}_{:08X}{}.pnach", serial, crc, add_wildcard ? "*" : "");
|
||||
}
|
||||
return fmt::format("{:08X}{}.pnach", crc, add_wildcard ? "*" : "");
|
||||
}
|
||||
|
||||
std::vector<std::string> Patch::FindPatchFilesOnDisk(const std::string_view serial, u32 crc, bool cheats, bool all_crcs)
|
||||
|
||||
@@ -157,6 +157,7 @@ class FileMemoryCard
|
||||
{
|
||||
protected:
|
||||
std::FILE* m_file[8] = {};
|
||||
s64 m_fileSize[8] = {};
|
||||
std::string m_filenames[8] = {};
|
||||
std::vector<u8> m_currentdata;
|
||||
u64 m_chksum[8] = {};
|
||||
@@ -246,7 +247,13 @@ std::string FileMcd_GetDefaultName(uint slot)
|
||||
return StringUtil::StdStringFromFormat("Mcd%03u.ps2", slot + 1);
|
||||
}
|
||||
|
||||
FileMemoryCard::FileMemoryCard() = default;
|
||||
FileMemoryCard::FileMemoryCard()
|
||||
{
|
||||
for (u8 slot = 0; slot < 8; slot++)
|
||||
{
|
||||
m_fileSize[slot] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
FileMemoryCard::~FileMemoryCard() = default;
|
||||
|
||||
@@ -314,12 +321,14 @@ void FileMemoryCard::Open()
|
||||
}
|
||||
else // Load checksum
|
||||
{
|
||||
m_fileSize[slot] = FileSystem::FSize64(m_file[slot]);
|
||||
|
||||
Console.WriteLnFmt(Color_Green, "McdSlot {} [File]: {} [{} MB, {}]", slot, Path::GetFileName(fname),
|
||||
(FileSystem::FSize64(m_file[slot]) + (MCD_SIZE + 1)) / MC2_MBSIZE,
|
||||
(m_fileSize[slot] + (MCD_SIZE + 1)) / MC2_MBSIZE,
|
||||
FileMcd_IsMemoryCardFormatted(m_file[slot]) ? "Formatted" : "UNFORMATTED");
|
||||
|
||||
m_filenames[slot] = std::move(fname);
|
||||
m_ispsx[slot] = FileSystem::FSize64(m_file[slot]) == 0x20000;
|
||||
m_ispsx[slot] = m_fileSize[slot] == 0x20000;
|
||||
m_chkaddr = 0x210;
|
||||
|
||||
if (!m_ispsx[slot] && FileSystem::FSeek64(m_file[slot], m_chkaddr, SEEK_SET) == 0)
|
||||
@@ -354,30 +363,14 @@ void FileMemoryCard::Close()
|
||||
}
|
||||
|
||||
m_filenames[slot] = {};
|
||||
m_fileSize[slot] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
// Returns FALSE if the seek failed (is outside the bounds of the file).
|
||||
bool FileMemoryCard::Seek(std::FILE* f, u32 adr)
|
||||
{
|
||||
const s64 size = FileSystem::FSize64(f);
|
||||
|
||||
// If anyone knows why this filesize logic is here (it appears to be related to legacy PSX
|
||||
// cards, perhaps hacked support for some special emulator-specific memcard formats that
|
||||
// had header info?), then please replace this comment with something useful. Thanks! -- air
|
||||
|
||||
u32 offset = 0;
|
||||
|
||||
if (size == MCD_SIZE + 64)
|
||||
offset = 64;
|
||||
else if (size == MCD_SIZE + 3904)
|
||||
offset = 3904;
|
||||
else
|
||||
{
|
||||
// perform sanity checks here?
|
||||
}
|
||||
|
||||
return (FileSystem::FSeek64(f, adr + offset, SEEK_SET) == 0);
|
||||
return (FileSystem::FSeek64(f, adr, SEEK_SET) == 0);
|
||||
}
|
||||
|
||||
// returns FALSE if an error occurred (either permission denied or disk full)
|
||||
@@ -415,7 +408,7 @@ void FileMemoryCard::GetSizeInfo(uint slot, McdSizeInfo& outways)
|
||||
|
||||
pxAssert(m_file[slot]);
|
||||
if (m_file[slot])
|
||||
outways.McdSizeInSectors = static_cast<u32>(FileSystem::FSize64(m_file[slot])) / (outways.SectorSize + outways.EraseBlockSizeInSectors);
|
||||
outways.McdSizeInSectors = static_cast<u32>(m_fileSize[slot]) / (outways.SectorSize + outways.EraseBlockSizeInSectors);
|
||||
else
|
||||
outways.McdSizeInSectors = 0x4000;
|
||||
|
||||
@@ -542,7 +535,7 @@ u64 FileMemoryCard::GetCRC(uint slot)
|
||||
if (!Seek(mcfp, 0))
|
||||
return 0;
|
||||
|
||||
const s64 mcfpsize = FileSystem::FSize64(mcfp);
|
||||
const s64 mcfpsize = m_fileSize[slot];
|
||||
if (mcfpsize < 0)
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -162,6 +162,6 @@ void MemcardBusy::CheckSaveStateDependency()
|
||||
if (g_FrameCount - sioLastFrameMcdBusy > NUM_FRAMES_BEFORE_SAVESTATE_DEPENDENCY_WARNING)
|
||||
{
|
||||
Host::AddIconOSDMessage("MemcardBusy", ICON_PF_MEMORY_CARD,
|
||||
TRANSLATE_SV("MemoryCard", "The virtual console hasn't saved to your memory card for quite some time. Savestates should not be used in place of in-game saves."), Host::OSD_INFO_DURATION);
|
||||
TRANSLATE_SV("MemoryCard", "The virtual console hasn't saved to your memory card in a long time.\nSavestates should not be used in place of in-game saves."), Host::OSD_INFO_DURATION);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user