Compare commits

...
19 Commits
Author SHA1 Message Date
Ziemasandlightningterror 86d76bbf59 GameDB: Patch The Gift to fix sound RPC 2026-07-16 16:45:38 +02:00
refractionpcsx2andlightningterror 45fa6a8bb5 GS: Add special case CSM2 read for Breath of Fire Dragon Quarter 2026-07-16 16:44:29 +02:00
SternXDandlightningterror 223c2cba9a ImGui: Fix cut off legend in save state overlay 2026-07-16 16:42:02 +02:00
TJnotJTandlightningterror 562c32cd15 GS:HW: Fix ROV texture type conversion for temporary Z. 2026-07-16 16:41:31 +02:00
SternXDandlightningterror 876a0bfbd7 FullscreenUI: Fix nav loss after logging in to RA 2026-07-16 16:40:36 +02:00
chaoticgdandlightningterror 81558dc9c4 Qt: Silence warning when opening log window 2026-07-16 16:39:57 +02:00
PCSX2 BotandTy 2d62078b04 [ci skip] Qt: Update Base Translation. 2026-07-15 20:29:09 -04:00
RedPanda4552andlightningterror 474ad59818 USB: Copy Virtua Cop offsets to Re-Birth JP version 2026-07-15 16:23:29 +02:00
refractionpcsx2andlightningterror d75c8b1edc GS/TC: Invalidate rgb + alpha on contained target swizzle mismatch 2026-07-15 14:35:47 +02:00
refractionpcsx2andlightningterror d89b4b6fa1 GS/TC: Improve handling of different format overlap in preload 2026-07-15 14:35:47 +02:00
refractionpcsx2andlightningterror afb875f2c6 GS/HW: Improve clears when half is zero + alter mismatched DHC lookup
- DHC is double half clear :)
2026-07-15 14:35:47 +02:00
refractionpcsx2andlightningterror f24d44d470 GS: Make size macros const expressions 2026-07-15 14:35:47 +02:00
refractionpcsx2andlightningterror 4918b0aa09 GS/TC: Don't clear valid flags if render target is only partially cleared 2026-07-15 14:35:47 +02:00
a50ed4d05a GS:HW: Fix regression with prefer_reuse texture fetching flag.
Boolean value of the flag was not properly inverted in a refactor.

Co-authored-by: t654132
2026-07-15 14:34:40 +02:00
refractionpcsx2andlightningterror 19d08ba94f GS/TC: Only bilinear resize depth if downscaled 2026-07-15 14:34:02 +02:00
PCSX2 BotandTy a80b3144bb [ci skip] Qt: Update Base Translation. 2026-07-14 20:35:45 -04:00
chaoticgdandlightningterror 9f0206966b Debugger: Add navigation history with back and forward buttons 2026-07-15 00:29:33 +02:00
chaoticgdandlightningterror dcae14398a Debugger: Improve menu item sorting 2026-07-15 00:29:33 +02:00
TheLastRarandlightningterror 14164e6592 GS/OGL: Increase padding to fill ProgramSelector size 2026-07-15 00:27:42 +02:00
37 changed files with 845 additions and 254 deletions
+8
View File
@@ -15134,6 +15134,14 @@ SLES-50276:
name: "The Gift"
name-sort: "Gift, The"
region: "PAL-E"
patches:
CC76CD02:
content: |-
// Sound RPC races because of shared send/receive buffers with badly
// placed wait loop, fix by forcing all sound rpc to be synchronous.
// Ideal fix would be moving the rpc wait loop though.
author=Ziemas
patch=0,EE,002159e0,word,00000000
SLES-50277:
name: "Red Faction"
region: "PAL-E"
+1
View File
@@ -196,6 +196,7 @@ target_sources(pcsx2-qt PRIVATE
Debugger/ModuleModel.h
Debugger/ModuleView.cpp
Debugger/ModuleView.h
Debugger/NavigationHistoryStack.h
Debugger/RegisterView.cpp
Debugger/RegisterView.h
Debugger/RegisterView.ui
+24 -1
View File
@@ -206,6 +206,29 @@ void DebuggerView::updateStyleSheet()
setStyleSheet(stylesheet);
}
bool DebuggerView::supportsNavigation()
{
return false;
}
bool DebuggerView::canNavigateBack()
{
return false;
}
bool DebuggerView::canNavigateForward()
{
return false;
}
void DebuggerView::navigateBack()
{
}
void DebuggerView::navigateForward()
{
}
void DebuggerView::goToInDisassembler(u32 address, bool switch_to_tab)
{
DebuggerEvents::GoToAddress event;
@@ -268,7 +291,7 @@ std::vector<QAction*> DebuggerView::createEventActionsImplementation(
if (lhs->displayNameWithoutSuffix() == rhs->displayNameWithoutSuffix())
return lhs->displayNameSuffixNumber() < rhs->displayNameSuffixNumber();
return lhs->displayNameWithoutSuffix() < rhs->displayNameWithoutSuffix();
return QtHost::LocaleSensitiveCompare(lhs->displayNameWithoutSuffix(), rhs->displayNameWithoutSuffix()) < 0;
});
QMenu* submenu = nullptr;
+6
View File
@@ -153,6 +153,12 @@ public:
void updateStyleSheet();
virtual bool supportsNavigation();
virtual bool canNavigateBack();
virtual bool canNavigateForward();
virtual void navigateBack();
virtual void navigateForward();
static void goToInDisassembler(u32 address, bool switch_to_tab);
static void goToInMemoryView(u32 address, bool switch_to_tab);
+37
View File
@@ -115,6 +115,28 @@ DebuggerWindow::DebuggerWindow(QWidget* parent)
setMenuWidget(m_dock_manager->createMenuBar(menu_bar));
connect(m_dock_manager, &DockManager::focusedViewForNavigationChanged,
this, &DebuggerWindow::updateNavigationButtons);
m_ui.actionNavigateBack->setEnabled(false);
m_ui.actionNavigateForward->setEnabled(false);
connect(m_ui.actionNavigateBack, &QAction::triggered, this, [this]() {
DebuggerView* view = m_dock_manager->focusedViewForNavigation();
if (!view)
return;
view->navigateBack();
});
connect(m_ui.actionNavigateForward, &QAction::triggered, this, [this]() {
DebuggerView* view = m_dock_manager->focusedViewForNavigation();
if (!view)
return;
view->navigateForward();
});
updateTheme();
Host::RunOnCPUThread([]() {
@@ -307,6 +329,21 @@ void DebuggerWindow::updateFromSettings()
}
}
void DebuggerWindow::updateNavigationButtons()
{
DebuggerView* view = m_dock_manager->focusedViewForNavigation();
if (view)
{
m_ui.actionNavigateBack->setEnabled(view->canNavigateBack());
m_ui.actionNavigateForward->setEnabled(view->canNavigateForward());
}
else
{
m_ui.actionNavigateBack->setEnabled(false);
m_ui.actionNavigateForward->setEnabled(false);
}
}
void DebuggerWindow::onVMStarting()
{
m_ui.actionRun->setEnabled(true);
+3 -1
View File
@@ -40,7 +40,9 @@ public:
void updateFromSettings();
public slots:
void updateNavigationButtons();
private slots:
void onVMStarting();
void onVMPaused();
void onVMResumed();
+63 -16
View File
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>1000</width>
<height>750</height>
<width>1322</width>
<height>974</height>
</rect>
</property>
<property name="windowTitle">
@@ -23,8 +23,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>1000</width>
<height>21</height>
<width>1322</width>
<height>30</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@@ -58,6 +58,9 @@
</property>
<addaction name="actionOnTop"/>
<addaction name="separator"/>
<addaction name="actionNavigateBack"/>
<addaction name="actionNavigateForward"/>
<addaction name="separator"/>
<addaction name="actionIncreaseFontSize"/>
<addaction name="actionDecreaseFontSize"/>
<addaction name="actionResetFontSize"/>
@@ -82,12 +85,25 @@
<addaction name="menuWindows"/>
<addaction name="menuLayouts"/>
</widget>
<widget class="QToolBar" name="toolBarNavigation">
<property name="windowTitle">
<string>Navigation</string>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
<addaction name="actionNavigateBack"/>
<addaction name="actionNavigateForward"/>
</widget>
<widget class="QToolBar" name="toolBarDebug">
<property name="windowTitle">
<string>Debug</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
<enum>Qt::ToolButtonStyle::ToolButtonTextBesideIcon</enum>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
@@ -105,7 +121,7 @@
<string>File</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
<enum>Qt::ToolButtonStyle::ToolButtonTextBesideIcon</enum>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
@@ -122,7 +138,7 @@
<string>System</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
<enum>Qt::ToolButtonStyle::ToolButtonTextBesideIcon</enum>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
@@ -138,7 +154,7 @@
<string>View</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
<enum>Qt::ToolButtonStyle::ToolButtonTextBesideIcon</enum>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
@@ -237,7 +253,7 @@
<string>Shut Down</string>
</property>
<property name="menuRole">
<enum>QAction::NoRole</enum>
<enum>QAction::MenuRole::NoRole</enum>
</property>
</action>
<action name="actionReset">
@@ -248,7 +264,7 @@
<string>Reset</string>
</property>
<property name="menuRole">
<enum>QAction::NoRole</enum>
<enum>QAction::MenuRole::NoRole</enum>
</property>
</action>
<action name="actionClose">
@@ -259,7 +275,7 @@
<string>Close</string>
</property>
<property name="menuRole">
<enum>QAction::NoRole</enum>
<enum>QAction::MenuRole::NoRole</enum>
</property>
</action>
<action name="actionIncreaseFontSize">
@@ -270,7 +286,7 @@
<string>Increase Font Size</string>
</property>
<property name="menuRole">
<enum>QAction::NoRole</enum>
<enum>QAction::MenuRole::NoRole</enum>
</property>
</action>
<action name="actionDecreaseFontSize">
@@ -284,7 +300,7 @@
<string>Ctrl+-</string>
</property>
<property name="menuRole">
<enum>QAction::NoRole</enum>
<enum>QAction::MenuRole::NoRole</enum>
</property>
</action>
<action name="actionResetFontSize">
@@ -295,7 +311,7 @@
<string>Reset Font Size</string>
</property>
<property name="menuRole">
<enum>QAction::NoRole</enum>
<enum>QAction::MenuRole::NoRole</enum>
</property>
</action>
<action name="actionSettings">
@@ -306,7 +322,7 @@
<string>Settings</string>
</property>
<property name="menuRole">
<enum>QAction::NoRole</enum>
<enum>QAction::MenuRole::NoRole</enum>
</property>
</action>
<action name="actionGameSettings">
@@ -317,7 +333,7 @@
<string>Game Settings</string>
</property>
<property name="menuRole">
<enum>QAction::NoRole</enum>
<enum>QAction::MenuRole::NoRole</enum>
</property>
</action>
<action name="actionToolsDummy">
@@ -330,6 +346,37 @@
<string/>
</property>
</action>
<action name="actionNavigateBack">
<property name="icon">
<iconset theme="arrow-left-line"/>
</property>
<property name="text">
<string>Navigate Back</string>
</property>
<property name="toolTip">
<string>Navigate Back</string>
</property>
<property name="shortcut">
<string>Alt+Left</string>
</property>
<property name="menuRole">
<enum>QAction::MenuRole::NoRole</enum>
</property>
</action>
<action name="actionNavigateForward">
<property name="icon">
<iconset theme="arrow-right-line"/>
</property>
<property name="text">
<string>Navigate Forward</string>
</property>
<property name="shortcut">
<string>Alt+Right</string>
</property>
<property name="menuRole">
<enum>QAction::MenuRole::NoRole</enum>
</property>
</action>
</widget>
<resources/>
<connections/>
+56 -7
View File
@@ -76,7 +76,11 @@ bool DisassemblyView::fromJson(const JsonValueWrapper& json)
auto start_address = json.value().FindMember("startAddress");
if (start_address != json.value().MemberEnd() && start_address->value.IsUint())
{
m_visibleStart = start_address->value.GetUint() & ~3;
m_navigation_history.clear();
m_navigation_history.pushInstantly(m_visibleStart);
}
auto go_to_pc_on_pause = json.value().FindMember("goToPCOnPause");
if (go_to_pc_on_pause != json.value().MemberEnd() && go_to_pc_on_pause->value.IsBool())
@@ -388,6 +392,41 @@ QString DisassemblyView::GetLineDisasm(u32 address)
return QString("%1 %2").arg(lineInfo.name.c_str()).arg(lineInfo.params.c_str());
};
bool DisassemblyView::supportsNavigation()
{
return true;
}
bool DisassemblyView::canNavigateBack()
{
return m_navigation_history.canGoBack();
}
bool DisassemblyView::canNavigateForward()
{
return m_navigation_history.canGoForward();
}
void DisassemblyView::navigateBack()
{
std::optional<u32> address = m_navigation_history.back();
if (!address.has_value())
return;
m_visibleStart = *address;
update();
}
void DisassemblyView::navigateForward()
{
std::optional<u32> address = m_navigation_history.forward();
if (!address.has_value())
return;
m_visibleStart = *address;
update();
}
// Here we go!
void DisassemblyView::paintEvent(QPaintEvent* event)
{
@@ -629,19 +668,21 @@ void DisassemblyView::mouseDoubleClickEvent(QMouseEvent* event)
void DisassemblyView::wheelEvent(QWheelEvent* event)
{
if (event->angleDelta().y() < 0) // todo: max address bounds check?
{
if (event->angleDelta().y() < 0)
m_visibleStart += 4;
}
else if (event->angleDelta().y() && m_visibleStart > 0)
{
m_visibleStart -= 4;
}
m_navigation_history.pushWithDelay(m_visibleStart);
update();
}
void DisassemblyView::keyPressEvent(QKeyEvent* event)
{
// Alt is used for the global navigation shortcuts.
if (event->modifiers() & Qt::AltModifier)
return;
switch (event->key())
{
case Qt::Key_Up:
@@ -653,15 +694,19 @@ void DisassemblyView::keyPressEvent(QKeyEvent* event)
// Auto scroll
if (m_visibleStart > m_selectedAddressStart)
m_visibleStart -= 4;
m_navigation_history.pushWithDelay(m_visibleStart);
break;
}
break;
case Qt::Key_PageUp:
{
m_selectedAddressStart -= m_visibleRows * 4;
m_selectedAddressEnd = m_selectedAddressStart;
m_visibleStart -= m_visibleRows * 4;
m_navigation_history.pushWithDelay(m_visibleStart);
break;
}
break;
case Qt::Key_Down:
{
m_selectedAddressEnd += 4;
@@ -673,6 +718,7 @@ void DisassemblyView::keyPressEvent(QKeyEvent* event)
if (m_visibleStart + ((m_visibleRows - 1) * 4) < m_selectedAddressEnd)
m_visibleStart += 4;
m_navigation_history.pushWithDelay(m_visibleStart);
break;
}
case Qt::Key_PageDown:
@@ -680,6 +726,7 @@ void DisassemblyView::keyPressEvent(QKeyEvent* event)
m_selectedAddressStart += m_visibleRows * 4;
m_selectedAddressEnd = m_selectedAddressStart;
m_visibleStart += m_visibleRows * 4;
m_navigation_history.pushWithDelay(m_visibleStart);
break;
}
case Qt::Key_G:
@@ -1014,6 +1061,8 @@ void DisassemblyView::gotoAddress(u32 address, bool should_set_focus)
m_selectedAddressStart = destAddress;
m_selectedAddressEnd = destAddress;
m_navigation_history.pushInstantly(m_visibleStart);
update();
if (should_set_focus)
setFocus();
+13 -2
View File
@@ -5,7 +5,8 @@
#include "ui_DisassemblyView.h"
#include "DebuggerView.h"
#include "Debugger/DebuggerView.h"
#include "Debugger/NavigationHistoryStack.h"
#include "pcsx2/DebugTools/DisassemblyManager.h"
@@ -26,6 +27,12 @@ public:
// Required for the breakpoint list (ugh wtf)
QString GetLineDisasm(u32 address);
bool supportsNavigation() override;
bool canNavigateBack() override;
bool canNavigateForward() override;
void navigateBack() override;
void navigateForward() override;
protected:
void paintEvent(QPaintEvent* event) override;
void mousePressEvent(QMouseEvent* event) override;
@@ -68,7 +75,7 @@ public slots:
private:
Ui::DisassemblyView m_ui;
u32 m_visibleStart = 0x100000; // The address of the first instruction shown.
u32 m_visibleStart = STARTING_ADDRESS; // The address of the first instruction shown.
u32 m_visibleRows;
u32 m_selectedAddressStart = 0;
u32 m_selectedAddressEnd = 0;
@@ -81,6 +88,8 @@ private:
bool m_goToProgramCounterOnPause = true;
DisassemblyManager m_disassemblyManager;
NavigationHistoryStack<u32> m_navigation_history{STARTING_ADDRESS};
QString GetDisassemblyTitleLine();
QColor GetDisassemblyTitleLineColor();
inline QString DisassemblyStringFromAddress(u32 address, QFont font, u32 pc, bool selected);
@@ -96,4 +105,6 @@ private:
void setInstructions(u32 start, u32 end, u32 value);
bool AddressCanRestore(u32 start, u32 end);
bool FunctionCanRestore(u32 address);
static constexpr u32 STARTING_ADDRESS = 0x100000;
};
+39 -8
View File
@@ -339,15 +339,28 @@ void DockManager::createToolsMenu(QMenu* menu)
if (m_current_layout == DockLayout::INVALID_INDEX || !g_debugger_window)
return;
for (QToolBar* widget : g_debugger_window->findChildren<QToolBar*>())
std::vector<QToolBar*> toolbars;
for (QToolBar* toolbar : g_debugger_window->findChildren<QToolBar*>())
toolbars.emplace_back(toolbar);
std::sort(toolbars.begin(), toolbars.end(), [](QToolBar* lhs, QToolBar* rhs) {
return QtHost::LocaleSensitiveCompare(lhs->windowTitle(), rhs->windowTitle()) < 0;
});
for (QToolBar* toolbar : toolbars)
{
QAction* action = menu->addAction(widget->windowTitle());
action->setText(widget->windowTitle());
QAction* action = menu->addAction(toolbar->windowTitle());
action->setText(toolbar->windowTitle());
action->setCheckable(true);
action->setChecked(widget->isVisible());
connect(action, &QAction::triggered, this, [widget]() {
widget->setVisible(!widget->isVisible());
action->setChecked(toolbar->isVisible());
connect(action, &QAction::triggered, this, [toolbar = QPointer<QToolBar>(toolbar)]() {
if (!toolbar)
return;
toolbar->setVisible(!toolbar->isVisible());
});
menu->addAction(action);
}
}
@@ -383,7 +396,7 @@ void DockManager::createWindowsMenu(QMenu* menu)
if (lhs->displayNameWithoutSuffix() == rhs->displayNameWithoutSuffix())
return lhs->displayNameSuffixNumber() < rhs->displayNameSuffixNumber();
return lhs->displayNameWithoutSuffix() < rhs->displayNameWithoutSuffix();
return QtHost::LocaleSensitiveCompare(lhs->displayNameWithoutSuffix(), rhs->displayNameWithoutSuffix()) < 0;
});
for (DebuggerView* widget : add_another_widgets)
@@ -472,7 +485,7 @@ void DockManager::createWindowsMenu(QMenu* menu)
if (lhs.display_name == rhs.display_name)
return lhs.suffix_number < rhs.suffix_number;
return lhs.display_name < rhs.display_name;
return QtHost::LocaleSensitiveCompare(lhs.display_name, rhs.display_name) < 0;
});
for (const DebuggerViewToggle& toggle : toggles)
@@ -862,6 +875,24 @@ std::optional<BreakPointCpu> DockManager::cpu()
return m_layouts.at(m_current_layout).cpu();
}
DebuggerView* DockManager::focusedViewForNavigation()
{
if (!m_focused_view_for_navigation)
return nullptr;
return m_focused_view_for_navigation;
}
void DockManager::onFocusedDockWidgetChanged(KDDockWidgets::QtWidgets::DockWidget* widget)
{
DebuggerView* view = qobject_cast<DebuggerView*>(widget->widget());
if (view && view->supportsNavigation() && view != m_focused_view_for_navigation)
{
m_focused_view_for_navigation = view;
emit focusedViewForNavigationChanged();
}
}
KDDockWidgets::Core::DockWidget* DockManager::dockWidgetFactory(const QString& name)
{
if (!g_debugger_window)
+10
View File
@@ -98,6 +98,14 @@ public:
std::optional<BreakPointCpu> cpu();
/// Returns the last focused view that supports back/forward navigation.
DebuggerView* focusedViewForNavigation();
void onFocusedDockWidgetChanged(KDDockWidgets::QtWidgets::DockWidget* widget);
Q_SIGNALS:
void focusedViewForNavigationChanged();
private:
static KDDockWidgets::Core::DockWidget* dockWidgetFactory(const QString& name);
static bool dragAboutToStart(KDDockWidgets::Core::Draggable* draggable);
@@ -108,4 +116,6 @@ private:
DockMenuBar* m_menu_bar = nullptr;
bool m_layout_locked = true;
QPointer<DebuggerView> m_focused_view_for_navigation;
};
+2
View File
@@ -82,6 +82,7 @@ const std::vector<DockTables::DefaultDockLayout> DockTables::DEFAULT_DOCK_LAYOUT
{"MemorySearchView", DefaultDockGroup::TOP_LEFT},
},
.toolbars = {
"toolBarNavigation",
"toolBarDebug",
"toolBarFile",
},
@@ -113,6 +114,7 @@ const std::vector<DockTables::DefaultDockLayout> DockTables::DEFAULT_DOCK_LAYOUT
{"MemorySearchView", DefaultDockGroup::TOP_LEFT},
},
.toolbars = {
"toolBarNavigation",
"toolBarDebug",
"toolBarFile",
},
+7
View File
@@ -82,6 +82,7 @@ DockWidget::DockWidget(
: KDDockWidgets::QtWidgets::DockWidget(unique_name, options, layout_saver_options, window_flags)
{
connect(this, &DockWidget::isOpenChanged, this, &DockWidget::openStateChanged);
connect(this, &DockWidget::isFocusedChanged, this, &DockWidget::focusStateChanged);
}
void DockWidget::openStateChanged(bool open)
@@ -95,6 +96,12 @@ void DockWidget::openStateChanged(bool open)
g_debugger_window->dockManager().destroyDebuggerView(uniqueName());
}
void DockWidget::focusStateChanged(bool focused)
{
if (focused && g_debugger_window)
g_debugger_window->dockManager().onFocusedDockWidgetChanged(this);
}
// *****************************************************************************
DockTitleBar::DockTitleBar(KDDockWidgets::Core::TitleBar* controller, KDDockWidgets::Core::View* parent)
+1
View File
@@ -63,6 +63,7 @@ public:
protected:
void openStateChanged(bool open);
void focusStateChanged(bool focused);
};
class DockTitleBar : public KDDockWidgets::QtWidgets::TitleBar
+56 -8
View File
@@ -19,9 +19,11 @@ using namespace QtUtils;
/*
MemoryViewTable
*/
void MemoryViewTable::UpdateStartAddress(u32 start)
void MemoryViewTable::UpdateStartAddress(u32 start, NavigationHistoryOperation history_operation)
{
startAddress = start & ~0xF;
navigation_history.push(startAddress, history_operation);
parent->update();
}
void MemoryViewTable::UpdateSelectedAddress(u32 selected, bool page)
@@ -41,6 +43,13 @@ void MemoryViewTable::UpdateSelectedAddress(u32 selected, bool page)
else
startAddress += 0x10;
}
else
{
return;
}
navigation_history.pushWithDelay(startAddress);
parent->update();
}
void MemoryViewTable::DrawTable(QPainter& painter, const QPalette& palette, s32 height, DebugInterface& cpu)
@@ -684,7 +693,7 @@ MemoryView::MemoryView(const DebuggerViewParameters& parameters)
setContextMenuPolicy(Qt::CustomContextMenu);
connect(this, &MemoryView::customContextMenuRequested, this, &MemoryView::openContextMenu);
m_table.UpdateStartAddress(0x100000);
m_table.UpdateStartAddress(0x100000, NavigationHistoryOperation::INSTANT_PUSH);
receiveEvent<DebuggerEvents::Refresh>([this](const DebuggerEvents::Refresh& event) -> bool {
update();
@@ -723,7 +732,10 @@ bool MemoryView::fromJson(const JsonValueWrapper& json)
auto start_address = json.value().FindMember("startAddress");
if (start_address != json.value().MemberEnd() && start_address->value.IsUint())
m_table.UpdateStartAddress(start_address->value.GetUint());
{
m_table.navigation_history.clear();
m_table.UpdateStartAddress(start_address->value.GetUint(), NavigationHistoryOperation::INSTANT_PUSH);
}
auto view_type = json.value().FindMember("viewType");
if (view_type != json.value().MemberEnd() && view_type->value.IsInt())
@@ -746,6 +758,40 @@ bool MemoryView::fromJson(const JsonValueWrapper& json)
return true;
}
bool MemoryView::supportsNavigation()
{
return true;
}
bool MemoryView::canNavigateBack()
{
return m_table.navigation_history.canGoBack();
}
bool MemoryView::canNavigateForward()
{
return m_table.navigation_history.canGoForward();
}
void MemoryView::navigateBack()
{
std::optional<u32> address = m_table.navigation_history.back();
if (!address.has_value())
return;
m_table.UpdateStartAddress(*address, NavigationHistoryOperation::NO_PUSH);
}
void MemoryView::navigateForward()
{
std::optional<u32> address = m_table.navigation_history.forward();
if (!address.has_value())
return;
m_table.UpdateStartAddress(*address, NavigationHistoryOperation::NO_PUSH);
}
void MemoryView::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
@@ -928,17 +974,20 @@ void MemoryView::wheelEvent(QWheelEvent* event)
{
if (event->angleDelta().y() < 0)
{
m_table.UpdateStartAddress(m_table.startAddress + 0x10);
m_table.UpdateStartAddress(m_table.startAddress + 0x10, NavigationHistoryOperation::DELAYED_PUSH);
}
else if (event->angleDelta().y() > 0)
{
m_table.UpdateStartAddress(m_table.startAddress - 0x10);
m_table.UpdateStartAddress(m_table.startAddress - 0x10, NavigationHistoryOperation::DELAYED_PUSH);
}
update();
}
void MemoryView::keyPressEvent(QKeyEvent* event)
{
// Alt is used for the global navigation shortcuts.
if (event->modifiers() & Qt::AltModifier)
return;
if (!m_table.KeyPress(event->key(), event->text().size() ? event->text()[0] : '\0', cpu()))
{
switch (event->key())
@@ -960,9 +1009,8 @@ void MemoryView::keyPressEvent(QKeyEvent* event)
void MemoryView::gotoAddress(u32 address)
{
m_table.UpdateStartAddress(address & ~0xF);
m_table.UpdateStartAddress(address & ~0xF, NavigationHistoryOperation::INSTANT_PUSH);
m_table.selectedAddress = address;
update();
setFocus();
}
+10 -1
View File
@@ -6,6 +6,7 @@
#include "ui_MemoryView.h"
#include "Debugger/DebuggerView.h"
#include "Debugger/NavigationHistoryStack.h"
#include "DebugTools/DebugInterface.h"
#include "DebugTools/DisassemblyManager.h"
@@ -93,7 +94,9 @@ public:
u32 selectedAddress = 0;
s32 selectedIndex = 0;
void UpdateStartAddress(u32 start);
NavigationHistoryStack<u32> navigation_history;
void UpdateStartAddress(u32 start, NavigationHistoryOperation history_operation);
void UpdateSelectedAddress(u32 selected, bool page = false);
void DrawTable(QPainter& painter, const QPalette& palette, s32 height, DebugInterface& cpu);
void SelectAt(QPoint pos);
@@ -136,6 +139,12 @@ public:
void toJson(JsonValueWrapper& json) override;
bool fromJson(const JsonValueWrapper& json) override;
bool supportsNavigation() override;
bool canNavigateBack() override;
bool canNavigateForward() override;
void navigateBack() override;
void navigateForward() override;
protected:
void paintEvent(QPaintEvent* event) override;
void mousePressEvent(QMouseEvent* event) override;
+164
View File
@@ -0,0 +1,164 @@
// SPDX-FileCopyrightText: 2002-2026 PCSX2 Dev Team
// SPDX-License-Identifier: GPL-3.0+
#pragma once
#include "Debugger/DebuggerWindow.h"
#include <QtCore/QTimer>
#include <deque>
enum class NavigationHistoryOperation
{
INSTANT_PUSH,
DELAYED_PUSH,
NO_PUSH
};
/// Data structure for storing navigation history, to be used for the back and
/// forward buttons.
template <typename Element>
class NavigationHistoryStack
{
public:
NavigationHistoryStack()
: m_position(m_elements.end())
{
m_timer.setInterval(DELAY_MILLISECONDS);
QObject::connect(&m_timer, &QTimer::timeout, [this]() {
pushInstantly(std::move(m_pending));
m_timer.stop();
});
}
NavigationHistoryStack(Element element)
: NavigationHistoryStack()
{
pushInstantly(std::move(element));
}
NavigationHistoryStack(const NavigationHistoryStack<Element>&) = delete;
NavigationHistoryStack<Element>& operator=(const NavigationHistoryStack<Element>&) = delete;
NavigationHistoryStack(NavigationHistoryStack<Element>&&) = delete;
NavigationHistoryStack<Element>& operator=(NavigationHistoryStack<Element>&&) = delete;
/// Push an element onto the stack.
void push(Element element, NavigationHistoryOperation operation)
{
switch (operation)
{
case NavigationHistoryOperation::INSTANT_PUSH:
pushInstantly(std::move(element));
break;
case NavigationHistoryOperation::DELAYED_PUSH:
pushWithDelay(std::move(element));
break;
case NavigationHistoryOperation::NO_PUSH:
break;
}
}
/// Wait a second, and then push an element onto the stack. If another
/// element is pushed, then that will take priority. This is useful if we're
/// storing a scroll position, and don't want the stack to be spammed with
/// new values when the user scrolls, for example.
void pushWithDelay(Element element)
{
m_pending = std::move(element);
m_timer.start();
}
/// Push an element onto the stack instantly.
void pushInstantly(Element element)
{
m_timer.stop();
if (m_position != m_elements.end() && element == *(m_position - 1))
return;
updateNavigationButtons();
m_elements.erase(m_position, m_elements.end());
m_elements.push_back(std::move(element));
if (m_elements.size() > MAX_ELEMENTS)
m_elements.pop_front();
m_position = m_elements.end();
}
/// Should to user have an option to go back?
bool canGoBack() const
{
return m_elements.begin() != m_elements.end() && m_position > m_elements.begin() + 1;
}
/// Should the user have an option to go forward?
bool canGoForward() const
{
return m_position != m_elements.end();
}
// Retrieve the current element.
std::optional<Element> current() const
{
if (m_position == m_elements.begin())
return std::nullopt;
return *(m_position - 1);
}
/// Go back one.
std::optional<Element> back()
{
updateNavigationButtons();
if (!canGoBack())
return std::nullopt;
m_position--;
return *(m_position - 1);
}
/// Go forward one.
std::optional<Element> forward()
{
updateNavigationButtons();
if (!canGoForward())
return std::nullopt;
Element element = *m_position;
m_position++;
return element;
}
/// Remove all elements.
void clear()
{
m_elements.clear();
m_position = m_elements.end();
m_timer.stop();
}
private:
void updateNavigationButtons()
{
QTimer::singleShot(0, []() {
if (g_debugger_window)
g_debugger_window->updateNavigationButtons();
});
}
std::deque<Element> m_elements;
std::deque<Element>::iterator m_position;
QTimer m_timer;
Element m_pending;
static constexpr int DELAY_MILLISECONDS = 1000;
static constexpr size_t MAX_ELEMENTS = 1000;
};
+1 -1
View File
@@ -216,7 +216,7 @@ void LogWindow::createUi()
m_newline_on_enter = state == Qt::CheckState::Checked;
});
m_input_hbox = new QHBoxLayout(this);
m_input_hbox = new QHBoxLayout;
m_input_hbox->addWidget(m_line_input, 1);
m_input_hbox->addWidget(m_local_echo_checkbox);
m_input_hbox->addWidget(m_newline_on_enter_checkbox);
+194 -168
View File
@@ -5183,7 +5183,7 @@ Do you want to overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockTables.cpp" line="90"/>
<location filename="../Debugger/Docking/DockTables.cpp" line="91"/>
<source>R3000</source>
<translation type="unfinished"></translation>
</message>
@@ -5275,13 +5275,13 @@ Do you want to overwrite?</source>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="32"/>
<location filename="../Debugger/DebuggerWindow.ui" line="105"/>
<location filename="../Debugger/DebuggerWindow.ui" line="121"/>
<source>File</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="42"/>
<location filename="../Debugger/DebuggerWindow.ui" line="87"/>
<location filename="../Debugger/DebuggerWindow.ui" line="103"/>
<source>Debug</source>
<translation type="unfinished"></translation>
</message>
@@ -5292,136 +5292,162 @@ Do you want to overwrite?</source>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="57"/>
<location filename="../Debugger/DebuggerWindow.ui" line="138"/>
<location filename="../Debugger/DebuggerWindow.ui" line="154"/>
<source>View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="67"/>
<location filename="../Debugger/DebuggerWindow.ui" line="70"/>
<source>Layouts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="74"/>
<location filename="../Debugger/DebuggerWindow.ui" line="77"/>
<source>Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="122"/>
<location filename="../Debugger/DebuggerWindow.ui" line="90"/>
<source>Navigation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="138"/>
<source>System</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="159"/>
<location filename="../Debugger/DebuggerWindow.cpp" line="326"/>
<location filename="../Debugger/DebuggerWindow.ui" line="175"/>
<location filename="../Debugger/DebuggerWindow.cpp" line="363"/>
<source>Run</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="167"/>
<location filename="../Debugger/DebuggerWindow.ui" line="183"/>
<source>Step Into</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="170"/>
<location filename="../Debugger/DebuggerWindow.ui" line="186"/>
<source>F11</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="178"/>
<location filename="../Debugger/DebuggerWindow.ui" line="194"/>
<source>Step Over</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="181"/>
<location filename="../Debugger/DebuggerWindow.ui" line="197"/>
<source>F10</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="189"/>
<location filename="../Debugger/DebuggerWindow.ui" line="205"/>
<source>Step Out</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="192"/>
<location filename="../Debugger/DebuggerWindow.ui" line="208"/>
<source>Shift+F11</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="203"/>
<location filename="../Debugger/DebuggerWindow.ui" line="219"/>
<source>Always On Top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="206"/>
<location filename="../Debugger/DebuggerWindow.ui" line="222"/>
<source>Show this window on top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="214"/>
<location filename="../Debugger/DebuggerWindow.ui" line="230"/>
<source>Analyze</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="219"/>
<location filename="../Debugger/DebuggerWindow.ui" line="235"/>
<source>Reset All Layouts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="224"/>
<location filename="../Debugger/DebuggerWindow.ui" line="240"/>
<source>Reset Default Layouts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="229"/>
<location filename="../Debugger/DebuggerWindow.ui" line="245"/>
<source>Reset Splitter Positions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="237"/>
<location filename="../Debugger/DebuggerWindow.ui" line="253"/>
<source>Shut Down</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="248"/>
<location filename="../Debugger/DebuggerWindow.ui" line="264"/>
<source>Reset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="259"/>
<location filename="../Debugger/DebuggerWindow.ui" line="275"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="270"/>
<location filename="../Debugger/DebuggerWindow.ui" line="286"/>
<source>Increase Font Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="281"/>
<location filename="../Debugger/DebuggerWindow.ui" line="297"/>
<source>Decrease Font Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="284"/>
<location filename="../Debugger/DebuggerWindow.ui" line="300"/>
<source>Ctrl+-</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="295"/>
<location filename="../Debugger/DebuggerWindow.ui" line="311"/>
<source>Reset Font Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="306"/>
<location filename="../Debugger/DebuggerWindow.ui" line="322"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="317"/>
<location filename="../Debugger/DebuggerWindow.ui" line="333"/>
<source>Game Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="354"/>
<location filename="../Debugger/DebuggerWindow.ui" line="357"/>
<source>Navigate Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="360"/>
<source>Alt+Left</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="371"/>
<source>Navigate Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.ui" line="374"/>
<source>Alt+Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.cpp" line="73"/>
<source>Are you sure you want to reset all layouts?</source>
@@ -5439,7 +5465,7 @@ Do you want to overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DebuggerWindow.cpp" line="366"/>
<location filename="../Debugger/DebuggerWindow.cpp" line="403"/>
<source>Pause</source>
<translation type="unfinished"></translation>
</message>
@@ -5452,168 +5478,168 @@ Do you want to overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="113"/>
<location filename="../Debugger/DisassemblyView.cpp" line="132"/>
<location filename="../Debugger/DisassemblyView.cpp" line="150"/>
<location filename="../Debugger/DisassemblyView.cpp" line="166"/>
<location filename="../Debugger/DisassemblyView.cpp" line="117"/>
<location filename="../Debugger/DisassemblyView.cpp" line="136"/>
<location filename="../Debugger/DisassemblyView.cpp" line="154"/>
<location filename="../Debugger/DisassemblyView.cpp" line="170"/>
<source>Assemble Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="113"/>
<location filename="../Debugger/DisassemblyView.cpp" line="150"/>
<location filename="../Debugger/DisassemblyView.cpp" line="117"/>
<location filename="../Debugger/DisassemblyView.cpp" line="154"/>
<source>Unable to change assembly while core is running</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="157"/>
<location filename="../Debugger/DisassemblyView.cpp" line="161"/>
<source>Assemble Instruction</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="250"/>
<location filename="../Debugger/DisassemblyView.cpp" line="254"/>
<source>Go To In Disassembly</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="257"/>
<location filename="../Debugger/DisassemblyView.cpp" line="261"/>
<source>Cannot Go To</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="307"/>
<location filename="../Debugger/DisassemblyView.cpp" line="318"/>
<location filename="../Debugger/DisassemblyView.cpp" line="311"/>
<location filename="../Debugger/DisassemblyView.cpp" line="322"/>
<source>Rename Function Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="307"/>
<location filename="../Debugger/DisassemblyView.cpp" line="311"/>
<source>No function / symbol is currently selected.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="311"/>
<location filename="../Debugger/DisassemblyView.cpp" line="800"/>
<location filename="../Debugger/DisassemblyView.cpp" line="315"/>
<location filename="../Debugger/DisassemblyView.cpp" line="847"/>
<source>Rename Function</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="312"/>
<location filename="../Debugger/DisassemblyView.cpp" line="316"/>
<source>Function name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="318"/>
<location filename="../Debugger/DisassemblyView.cpp" line="322"/>
<source>Function name cannot be nothing.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="374"/>
<location filename="../Debugger/DisassemblyView.cpp" line="378"/>
<source>Restore Function Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="374"/>
<location filename="../Debugger/DisassemblyView.cpp" line="378"/>
<source>Unable to stub selected address.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="727"/>
<location filename="../Debugger/DisassemblyView.cpp" line="774"/>
<source>Copy Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="730"/>
<location filename="../Debugger/DisassemblyView.cpp" line="777"/>
<source>Copy Instruction Hex</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="733"/>
<location filename="../Debugger/DisassemblyView.cpp" line="780"/>
<source>&amp;Copy Instruction Text</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="739"/>
<location filename="../Debugger/DisassemblyView.cpp" line="786"/>
<source>Copy Function Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="743"/>
<location filename="../Debugger/DisassemblyView.cpp" line="790"/>
<source>Paste Instruction Text</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="750"/>
<location filename="../Debugger/DisassemblyView.cpp" line="797"/>
<source>Restore Instruction(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="754"/>
<location filename="../Debugger/DisassemblyView.cpp" line="801"/>
<source>Asse&amp;mble new Instruction(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="758"/>
<location filename="../Debugger/DisassemblyView.cpp" line="805"/>
<source>NOP Instruction(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="763"/>
<location filename="../Debugger/DisassemblyView.cpp" line="810"/>
<source>Run to Cursor</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="766"/>
<location filename="../Debugger/DisassemblyView.cpp" line="813"/>
<source>&amp;Jump to Cursor</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="770"/>
<location filename="../Debugger/DisassemblyView.cpp" line="817"/>
<source>Toggle &amp;Breakpoint</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="774"/>
<location filename="../Debugger/DisassemblyView.cpp" line="821"/>
<source>Follow Branch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="779"/>
<location filename="../Debugger/DisassemblyView.cpp" line="826"/>
<source>&amp;Go to Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="789"/>
<location filename="../Debugger/DisassemblyView.cpp" line="836"/>
<source>Go to PC on Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="797"/>
<location filename="../Debugger/DisassemblyView.cpp" line="844"/>
<source>Add Function</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="803"/>
<location filename="../Debugger/DisassemblyView.cpp" line="850"/>
<source>Remove Function</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="809"/>
<location filename="../Debugger/DisassemblyView.cpp" line="856"/>
<source>Restore Function</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="814"/>
<location filename="../Debugger/DisassemblyView.cpp" line="861"/>
<source>Stub (NOP) Function</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="820"/>
<location filename="../Debugger/DisassemblyView.cpp" line="867"/>
<source>Show &amp;Instruction Bytes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="879"/>
<location filename="../Debugger/DisassemblyView.cpp" line="926"/>
<source>%1 NOT VALID ADDRESS</source>
<translation type="unfinished"></translation>
</message>
@@ -5621,27 +5647,27 @@ Do you want to overwrite?</source>
<context>
<name>DisassemblyViewColumnTitle</name>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="838"/>
<location filename="../Debugger/DisassemblyView.cpp" line="885"/>
<source> %1 %2 %3 %4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="842"/>
<location filename="../Debugger/DisassemblyView.cpp" line="889"/>
<source> %1 %2 %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="850"/>
<location filename="../Debugger/DisassemblyView.cpp" line="897"/>
<source>Location</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="855"/>
<location filename="../Debugger/DisassemblyView.cpp" line="902"/>
<source>Bytes </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/DisassemblyView.cpp" line="859"/>
<location filename="../Debugger/DisassemblyView.cpp" line="906"/>
<source>Instruction</source>
<translation type="unfinished"></translation>
</message>
@@ -5667,38 +5693,38 @@ Do you want to overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockManager.cpp" line="366"/>
<location filename="../Debugger/Docking/DockManager.cpp" line="379"/>
<source>Add Another...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockManager.cpp" line="586"/>
<location filename="../Debugger/Docking/DockManager.cpp" line="599"/>
<source>Edit Layout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockManager.cpp" line="591"/>
<location filename="../Debugger/Docking/DockManager.cpp" line="604"/>
<source>Reset Layout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockManager.cpp" line="649"/>
<location filename="../Debugger/Docking/DockManager.cpp" line="662"/>
<source>Are you sure you want to reset layout &apos;%1&apos;?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockManager.cpp" line="648"/>
<location filename="../Debugger/Docking/DockManager.cpp" line="679"/>
<location filename="../Debugger/Docking/DockManager.cpp" line="661"/>
<location filename="../Debugger/Docking/DockManager.cpp" line="692"/>
<source>Confirmation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockManager.cpp" line="597"/>
<location filename="../Debugger/Docking/DockManager.cpp" line="610"/>
<source>Delete Layout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockManager.cpp" line="680"/>
<location filename="../Debugger/Docking/DockManager.cpp" line="693"/>
<source>Are you sure you want to delete layout &apos;%1&apos;?</source>
<translation type="unfinished"></translation>
</message>
@@ -5724,57 +5750,57 @@ Do you want to overwrite?</source>
<context>
<name>DockTabBar</name>
<message>
<location filename="../Debugger/Docking/DockViews.cpp" line="169"/>
<location filename="../Debugger/Docking/DockViews.cpp" line="176"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockViews.cpp" line="178"/>
<location filename="../Debugger/Docking/DockViews.cpp" line="185"/>
<source>Rename Window</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockViews.cpp" line="179"/>
<location filename="../Debugger/Docking/DockViews.cpp" line="186"/>
<source>New name:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockViews.cpp" line="188"/>
<location filename="../Debugger/Docking/DockViews.cpp" line="195"/>
<source>Invalid Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockViews.cpp" line="188"/>
<location filename="../Debugger/Docking/DockViews.cpp" line="195"/>
<source>The specified name is too long.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockViews.cpp" line="196"/>
<location filename="../Debugger/Docking/DockViews.cpp" line="203"/>
<source>Reset Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockViews.cpp" line="210"/>
<location filename="../Debugger/Docking/DockViews.cpp" line="217"/>
<source>Primary</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockViews.cpp" line="225"/>
<location filename="../Debugger/Docking/DockViews.cpp" line="232"/>
<source>Set Target</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockViews.cpp" line="233"/>
<location filename="../Debugger/Docking/DockViews.cpp" line="240"/>
<source>%1 (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockViews.cpp" line="246"/>
<location filename="../Debugger/Docking/DockViews.cpp" line="253"/>
<source>Inherit From Layout</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/DockViews.cpp" line="254"/>
<location filename="../Debugger/Docking/DockViews.cpp" line="261"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@@ -18379,21 +18405,6 @@ Right click to clear binding</source>
</context>
<context>
<name>LayoutEditorDialog</name>
<message>
<location filename="../Debugger/Docking/LayoutEditorDialog.ui" line="22"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/LayoutEditorDialog.ui" line="32"/>
<source>Target</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/LayoutEditorDialog.ui" line="42"/>
<source>Initial State</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/LayoutEditorDialog.cpp" line="18"/>
<source>New Layout</source>
@@ -18439,6 +18450,21 @@ Right click to clear binding</source>
<source>A layout with that name already exists.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/LayoutEditorDialog.ui" line="28"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/LayoutEditorDialog.ui" line="38"/>
<source>Target:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Docking/LayoutEditorDialog.ui" line="48"/>
<source>Initial State:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>LogWindow</name>
@@ -20650,77 +20676,77 @@ Slot 2: {}</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="778"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="824"/>
<source>Copy Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="789"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="835"/>
<source>Go to Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="792"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="838"/>
<source>Follow Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="797"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="843"/>
<source>Show as Little Endian</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="810"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="856"/>
<source>Show as 1 byte</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="816"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="862"/>
<source>Show as 2 bytes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="822"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="868"/>
<source>Show as 4 bytes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="828"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="874"/>
<source>Show as 8 bytes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="834"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="880"/>
<source>Show as float</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="848"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="894"/>
<source>Copy Byte</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="852"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="898"/>
<source>Copy Segment</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="854"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="900"/>
<source>Copy Character</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="858"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="904"/>
<source>Paste</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="898"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="944"/>
<source>Go To In Memory View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="905"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="951"/>
<source>Cannot Go To</source>
<translation type="unfinished"></translation>
</message>
@@ -20728,19 +20754,19 @@ Slot 2: {}</source>
<context>
<name>MemoryViewTable</name>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="307"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="316"/>
<source>Input New Float</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="315"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="352"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="324"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="361"/>
<source>Input Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../Debugger/Memory/MemoryView.cpp" line="315"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="352"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="324"/>
<location filename="../Debugger/Memory/MemoryView.cpp" line="361"/>
<source>Invalid float value</source>
<translation type="unfinished"></translation>
</message>
@@ -24352,12 +24378,12 @@ Rename it to {} to remove this warning.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="440"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="443"/>
<source>GunCon 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="582"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="585"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="78"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="106"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="938"/>
@@ -24371,7 +24397,7 @@ Rename it to {} to remove this warning.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="583"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="586"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="79"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="107"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="940"/>
@@ -24385,7 +24411,7 @@ Rename it to {} to remove this warning.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="584"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="587"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="80"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="108"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="941"/>
@@ -24399,7 +24425,7 @@ Rename it to {} to remove this warning.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="585"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="588"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="81"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="109"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="939"/>
@@ -24413,22 +24439,22 @@ Rename it to {} to remove this warning.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="587"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="590"/>
<source>Trigger</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="588"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="591"/>
<source>Shoot Offscreen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="590"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="593"/>
<source>Calibration Shot</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="592"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="595"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="139"/>
<location filename="../../pcsx2/USB/usb-pad/usb-seamic.cpp" line="363"/>
<location filename="../../pcsx2/USB/usb-pad/usb-train.cpp" line="154"/>
@@ -24436,7 +24462,7 @@ Rename it to {} to remove this warning.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="593"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="596"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="140"/>
<location filename="../../pcsx2/USB/usb-pad/usb-seamic.cpp" line="364"/>
<location filename="../../pcsx2/USB/usb-pad/usb-train.cpp" line="155"/>
@@ -24444,14 +24470,14 @@ Rename it to {} to remove this warning.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="594"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="597"/>
<location filename="../../pcsx2/USB/usb-pad/usb-seamic.cpp" line="365"/>
<location filename="../../pcsx2/USB/usb-pad/usb-train.cpp" line="156"/>
<source>C</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="595"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="598"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="90"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="116"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="936"/>
@@ -24465,7 +24491,7 @@ Rename it to {} to remove this warning.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="596"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="599"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="91"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="117"/>
<location filename="../../pcsx2/USB/usb-pad/usb-pad.cpp" line="937"/>
@@ -24479,141 +24505,141 @@ Rename it to {} to remove this warning.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="597"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="600"/>
<source>Relative Left</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="598"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="601"/>
<source>Relative Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="599"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="602"/>
<source>Relative Up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="600"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="603"/>
<source>Relative Down</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="609"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="612"/>
<source>Cursor Path</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="610"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="613"/>
<source>Sets the crosshair image that this lightgun will use. Setting a crosshair image will disable the system cursor.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="613"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="616"/>
<source>Cursor Scale</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="614"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="617"/>
<source>Scales the crosshair image set above.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="614"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="617"/>
<source>%.0f%%</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="616"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="619"/>
<source>Cursor Color</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="617"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="620"/>
<source>Applies a color to the chosen crosshair images, can be used for multiple players. Specify in HTML/CSS format (e.g. #aabbcc)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="620"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="623"/>
<source>Manual Screen Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="621"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="624"/>
<source>Forces the use of the screen parameters below, instead of automatic parameters if available.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="624"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="627"/>
<source>X Scale (Sensitivity)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="625"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="628"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="631"/>
<source>Scales the position to simulate CRT curvature.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="626"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="629"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="632"/>
<source>%.2f%%</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="627"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="630"/>
<source>Y Scale (Sensitivity)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="630"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="633"/>
<source>Center X</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="631"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="634"/>
<source>Sets the horizontal center position of the simulated screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="632"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="635"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="638"/>
<source>%.0fpx</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="633"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="636"/>
<source>Center Y</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="634"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="637"/>
<source>Sets the vertical center position of the simulated screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="636"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="639"/>
<source>Screen Width</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="637"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="640"/>
<source>Sets the width of the simulated screen.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="637"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="640"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="643"/>
<source>%dpx</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="639"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="642"/>
<source>Screen Height</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="640"/>
<location filename="../../pcsx2/USB/usb-lightgun/guncon2.cpp" line="643"/>
<source>Sets the height of the simulated screen.</source>
<translation type="unfinished"></translation>
</message>
+1
View File
@@ -246,6 +246,7 @@
<QtMoc Include="Debugger\StackView.h" />
<QtMoc Include="Debugger\ModuleModel.h" />
<QtMoc Include="Debugger\ModuleView.h" />
<QtMoc Include="Debugger\NavigationHistoryStack.h" />
<QtMoc Include="Debugger\ThreadModel.h" />
<QtMoc Include="Debugger\ThreadView.h" />
<ClInclude Include="Debugger\DebuggerSettingsManager.h" />
+3
View File
@@ -529,6 +529,9 @@
<QtMoc Include="Debugger\ModuleView.h">
<Filter>Debugger</Filter>
</QtMoc>
<QtMoc Include="Debugger\NavigationHistoryStack.h">
<Filter>Debugger</Filter>
</QtMoc>
<QtMoc Include="Debugger\ModuleModel.h">
<Filter>Debugger</Filter>
</QtMoc>
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#000"><path d="M7.82843 10.9999H20V12.9999H7.82843L13.1924 18.3638L11.7782 19.778L4 11.9999L11.7782 4.22168L13.1924 5.63589L7.82843 10.9999Z"></path></svg>

After

Width:  |  Height:  |  Size: 222 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#000"><path d="M16.1716 10.9999L10.8076 5.63589L12.2218 4.22168L20 11.9999L12.2218 19.778L10.8076 18.3638L16.1716 12.9999H4V10.9999H16.1716Z"></path></svg>

After

Width:  |  Height:  |  Size: 222 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#fff"><path d="M7.82843 10.9999H20V12.9999H7.82843L13.1924 18.3638L11.7782 19.778L4 11.9999L11.7782 4.22168L13.1924 5.63589L7.82843 10.9999Z"></path></svg>

After

Width:  |  Height:  |  Size: 222 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="#fff"><path d="M16.1716 10.9999L10.8076 5.63589L12.2218 4.22168L20 11.9999L12.2218 19.778L10.8076 18.3638L16.1716 12.9999H4V10.9999H16.1716Z"></path></svg>

After

Width:  |  Height:  |  Size: 222 B

+6 -2
View File
@@ -2,12 +2,14 @@
<qresource>
<file>icons/AppIcon64.png</file>
<file>icons/black/index.theme</file>
<file>icons/black/svg/arrow-left-line.svg</file>
<file>icons/black/svg/arrow-left-right-line.svg</file>
<file>icons/black/svg/arrow-right-line.svg</file>
<file>icons/black/svg/artboard-2-line.svg</file>
<file>icons/black/svg/at.svg</file>
<file>icons/black/svg/band-aid-line.svg</file>
<file>icons/black/svg/booklet.svg</file>
<file>icons/black/svg/book.svg</file>
<file>icons/black/svg/booklet.svg</file>
<file>icons/black/svg/brush-line.svg</file>
<file>icons/black/svg/bug-line.svg</file>
<file>icons/black/svg/buzz-controller-line.svg</file>
@@ -113,12 +115,14 @@
<file>icons/QT.png</file>
<file>icons/update.png</file>
<file>icons/white/index.theme</file>
<file>icons/white/svg/arrow-left-line.svg</file>
<file>icons/white/svg/arrow-left-right-line.svg</file>
<file>icons/white/svg/arrow-right-line.svg</file>
<file>icons/white/svg/artboard-2-line.svg</file>
<file>icons/white/svg/at.svg</file>
<file>icons/white/svg/band-aid-line.svg</file>
<file>icons/white/svg/booklet.svg</file>
<file>icons/white/svg/book.svg</file>
<file>icons/white/svg/booklet.svg</file>
<file>icons/white/svg/brush-line.svg</file>
<file>icons/white/svg/bug-line.svg</file>
<file>icons/white/svg/buzz-controller-line.svg</file>
+28 -1
View File
@@ -385,7 +385,13 @@ void GSClut::Read32(const GIFRegTEX0& TEX0, const GIFRegTEXA& TEXA)
case PSMT4HH:
clut += (TEX0.CSA & 15) << 4;
// TODO: merge these functions
ReadCLUT_T32_I4(clut, m_buff32);
// This is for a situation with Breath of Fire Dragon Quarter where it reinterprets the buffer under CSM2 after reading as CSM1.
if (TEX0.CSM == 1 && m_write.TEX0.CSM == 0)
ReadCLUT_T32_I4_Swizzled(clut, m_buff32);
else
ReadCLUT_T32_I4(clut, m_buff32);
ExpandCLUT64_T32_I8(m_buff32, (u64*)m_buff64); // sw renderer does not need m_buff64 anymore
break;
}
@@ -632,6 +638,27 @@ __forceinline void GSClut::WriteCLUT_T16_I4_CSM1(const u16* RESTRICT src, u16* R
}
}
// These functions are only used if the CLUT is in 32bit mode and it swaps to CSM2, a very obscure setup used by Breath of Fire Dragon Quarter.
// This doesn't handle offsetting the CLUT or anything crazy, that would be a lot more work
void GSClut::ReadCLUT_T32_I4_Swizzled(const u16* RESTRICT clut, u32* RESTRICT dst)
{
// Point to the base of the palette block
GSVector4i* s = (GSVector4i*)clut;
GSVector4i* d = (GSVector4i*)dst;
GSVector4i v0 = s[0];
GSVector4i v1 = s[2];
GSVector4i v2 = s[32];
GSVector4i v3 = s[34];
GSVector4i::sw16(v0, v2, v1, v3);
d[0] = v0;
d[1] = v1;
d[2] = v2;
d[3] = v3;
}
void GSClut::ReadCLUT_T32_I8(const u16* RESTRICT clut, u32* RESTRICT dst, int offset)
{
// Okay this deserves a small explanation
+1
View File
@@ -78,6 +78,7 @@ class alignas(32) GSClut final : public GSAlignedClass<32>
static void WriteCLUT_T32_I4_CSM1(const u32* RESTRICT src, u16* RESTRICT clut);
static void WriteCLUT_T16_I8_CSM1(const u16* RESTRICT src, u16* RESTRICT clut);
static void WriteCLUT_T16_I4_CSM1(const u16* RESTRICT src, u16* RESTRICT clut);
static void ReadCLUT_T32_I4_Swizzled(const u16* RESTRICT clut, u32* RESTRICT dst);
static void ReadCLUT_T32_I8(const u16* RESTRICT clut, u32* RESTRICT dst, int offset);
static void ReadCLUT_T32_I4(const u16* RESTRICT clut, u32* RESTRICT dst);
//static void ReadCLUT_T32_I4(const u16* RESTRICT clut, u32* RESTRICT dst32, u64* RESTRICT dst64);
+11 -11
View File
@@ -5,23 +5,23 @@
// clang-format off
#define VM_SIZE 4194304u
#define HALF_VM_SIZE (VM_SIZE / 2u)
#define GS_PAGE_SIZE 8192u
#define GS_BLOCK_SIZE 256u
#define GS_COLUMN_SIZE 64u
#define GS_BLOCKS_PER_PAGE (GS_PAGE_SIZE / GS_BLOCK_SIZE)
#define GS_MAX_PAGES (VM_SIZE / GS_PAGE_SIZE)
#define GS_MAX_BLOCKS (VM_SIZE / GS_BLOCK_SIZE)
#define GS_MAX_COLUMNS (VM_SIZE / GS_COLUMN_SIZE)
//if defined, will send much info in reply to the API title info queri from PCSX2
//default should be undefined
//#define GSTITLEINFO_API_FORCE_VERBOSE
#include "GSVector.h"
constexpr u32 VM_SIZE = 4194304u;
constexpr u32 HALF_VM_SIZE = (VM_SIZE / 2u);
constexpr u32 GS_PAGE_SIZE = 8192u;
constexpr u32 GS_BLOCK_SIZE = 256u;
constexpr u32 GS_COLUMN_SIZE = 64u;
constexpr u32 GS_BLOCKS_PER_PAGE = (GS_PAGE_SIZE / GS_BLOCK_SIZE);
constexpr u32 GS_MAX_PAGES = (VM_SIZE / GS_PAGE_SIZE);
constexpr u32 GS_MAX_BLOCKS = (VM_SIZE / GS_BLOCK_SIZE);
constexpr u32 GS_MAX_COLUMNS = (VM_SIZE / GS_COLUMN_SIZE);
#pragma pack(push, 1)
enum GS_PRIM
+1 -1
View File
@@ -805,7 +805,7 @@ GSTexture* GSDevice::CreateTexture(int w, int h, int mipmap_levels, GSTexture::F
{
pxAssert(mipmap_levels != 0 && (mipmap_levels < 0 || mipmap_levels <= GetMipmapLevelsForSize(w, h)));
const int levels = mipmap_levels < 0 ? GetMipmapLevelsForSize(w, h) : mipmap_levels;
return FetchSurface(GSTexture::Texture, w, h, levels, format, false, m_features.prefer_new_textures && prefer_reuse);
return FetchSurface(GSTexture::Texture, w, h, levels, format, false, !m_features.prefer_new_textures || prefer_reuse);
}
GSTexture* GSDevice::CreateTexture(const GSVector2i& size, int mipmap_levels, GSTexture::Format format, bool prefer_reuse)
+22 -11
View File
@@ -3225,8 +3225,10 @@ void GSRendererHW::Draw()
// Be careful of being 1 pixel from filled.
const bool page_aligned = (m_r.w % pgs.y) == (pgs.y - 1) || (m_r.w % pgs.y) == 0;
const bool is_zero_color_clear = (GetConstantDirectWriteMemClearColor() == 0 && !preserve_rt_color && page_aligned);
const bool is_zero_depth_clear = (GetConstantDirectWriteMemClearDepth() == 0 && !preserve_depth && page_aligned);
const bool is_full_color_cover = !preserve_rt_color && page_aligned;
const bool is_full_depth_cover = !preserve_depth && page_aligned;
const bool is_zero_color_clear = (GetConstantDirectWriteMemClearColor() == 0 && is_full_color_cover);
const bool is_zero_depth_clear = (GetConstantDirectWriteMemClearDepth() == 0 && is_full_depth_cover);
bool gs_mem_cleared = false;
// If it's an invalid-sized draw, do the mem clear on the CPU, we don't want to create huge targets.
// If clearing to zero, don't bother creating the target. Games tend to clear more than they use, wasting VRAM/bandwidth.
@@ -3261,8 +3263,8 @@ void GSRendererHW::Draw()
}
gs_mem_cleared |= overwriting_whole_rt && overwriting_whole_ds && (!no_rt || !no_ds);
if (overwriting_whole_rt && overwriting_whole_ds &&
TryGSMemClear(no_rt, preserve_rt_color, is_zero_color_clear, rt_end_bp,
no_ds, preserve_depth, is_zero_depth_clear, ds_end_bp))
TryGSMemClear(no_rt, preserve_rt_color, is_full_color_cover, rt_end_bp,
no_ds, preserve_depth, is_full_depth_cover, ds_end_bp))
{
GL_INS("HW: Skipping (%d,%d=>%d,%d) draw at FBP %x/ZBP %x due to invalid height or zero clear.", m_r.x, m_r.y,
m_r.z, m_r.w, m_cached_ctx.FRAME.Block(), m_cached_ctx.ZBUF.Block());
@@ -3285,8 +3287,14 @@ void GSRendererHW::Draw()
}
}
CleanupDraw(false);
return;
no_rt |= is_zero_color_clear;
no_ds |= is_zero_depth_clear;
if (no_rt && no_ds)
{
CleanupDraw(false);
return;
}
}
}
@@ -7838,7 +7846,7 @@ void GSRendererHW::ConvertTextureTypeROVSingle(GSTextureCache::Target* tgt, bool
}
#if PCSX2_DEVBUILD
new_tex->SetDebugName(tgt->m_texture->GetDebugName());
new_tex->SetDebugName(old_tex->GetDebugName());
#endif
if (tgt->m_texture == old_tex)
@@ -7869,12 +7877,13 @@ void GSRendererHW::ConvertTextureTypeROV(GSTextureCache::Target* rt, GSTextureCa
// Convert depth to the proper type/format.
if (ds)
{
if (m_conf.ps.HasDepthROV() && !ds->m_texture->IsShaderWrite())
// Note: we must use m_conf.ds because it might be the temporary Z texture.
if (m_conf.ps.HasDepthROV() && !m_conf.ds->IsShaderWrite())
{
GL_PUSH("HW: Convert DepthStencil -> DepthColor for ROV.");
ConvertTextureTypeROVSingle(ds, true);
}
else if (!m_conf.ps.HasDepthROV() && !ds->m_texture->IsDepthStencil())
else if (!m_conf.ps.HasDepthROV() && !m_conf.ds->IsDepthStencil())
{
GL_PUSH("HW: Convert DepthColor -> DepthStencil for non-ROV.");
ConvertTextureTypeROVSingle(ds, false);
@@ -9975,9 +9984,11 @@ bool GSRendererHW::DetectDoubleHalfClear(bool& no_rt, bool& no_ds)
// path write out FRAME and Z separately, with their associated masks. Limit it to black to avoid false positives.
if (write_color == 0)
{
// Don't check the *entire* size for the end, as some games (X-Men) decide it's done with Z and starts overwriting
// the end with other things, which causes a resize, so the end point is no longer in the right place.
// So let's just check there's at least one page over the half way point, at worst it means 2 targets overlap.
const GSTextureCache::Target* base_tgt = g_texture_cache->GetExactTarget(base * GS_BLOCKS_PER_PAGE,
m_cached_ctx.FRAME.FBW, clear_depth ? GSTextureCache::DepthStencil : GSTextureCache::RenderTarget,
GSLocalMemory::GetEndBlockAddress(half * GS_BLOCKS_PER_PAGE, m_cached_ctx.FRAME.FBW, m_cached_ctx.FRAME.PSM, m_r));
m_cached_ctx.FRAME.FBW, clear_depth ? GSTextureCache::DepthStencil : GSTextureCache::RenderTarget, (half + 1) * GS_BLOCKS_PER_PAGE);
if (base_tgt)
{
GL_INS("HW: DetectDoubleHalfClear(): Invalidating targets at 0x%x/0x%x due to different formats, and clear to black.",
+59 -8
View File
@@ -3565,16 +3565,62 @@ bool GSTextureCache::PreloadTarget(GIFRegTEX0 TEX0, const GSVector2i& size, cons
// Make sure there's sufficient compatibility/overlap between the old target and the new target
// to warrant loading from the old target.
const u32 old_buffer_width = std::max(1U, old_dst->m_TEX0.TBW);
if (old_dst->m_TEX0.PSM != dst->m_TEX0.PSM ||
!old_dst->Overlaps(dst->m_TEX0.TBP0, dst->m_TEX0.TBW, dst->m_TEX0.PSM, dst_valid))
{
if (old_dst->m_TEX0.TBP0 == dst->m_TEX0.TBP0 && dst_end_block >= old_dst->m_end_block && (!src || !src->m_target || src->m_from_target != old_dst))
{
InvalidateSourcesFromTarget(old_dst);
i = list.erase(j);
delete old_dst;
continue;
}
if (old_dst->Overlaps(dst->m_TEX0.TBP0, dst->m_TEX0.TBW, dst->m_TEX0.PSM, dst_valid))
{
const GSLocalMemory::psm_t& psm_o = GSLocalMemory::m_psm[old_dst->m_TEX0.PSM];
if (dst->m_TEX0.TBP0 > old_dst->m_TEX0.TBP0)
{
const int block_diff = dst->m_TEX0.TBP0 - old_dst->m_TEX0.TBP0;
const u32 old_pages_wide = old_buffer_width * 64 / psm_o.pgs.x;
if ((block_diff % (GS_BLOCKS_PER_PAGE * old_pages_wide)) == 0) // Check for left alignment.
{
const int new_height = block_diff / (GS_BLOCKS_PER_PAGE * old_pages_wide) * psm_o.pgs.y;
old_dst->m_valid = old_dst->m_valid.rintersect(GSVector4i(old_dst->m_valid.x, old_dst->m_valid.y, old_dst->m_valid.z, new_height));
old_dst->ResizeValidity(old_dst->m_valid);
}
}
else // new target is behind the old one, so need to move the start of the old one to the end block of the new.
{
const int block_diff = dst_end_block - old_dst->m_TEX0.TBP0;
const u32 old_pages_wide = old_buffer_width * 64 / psm_o.pgs.x;
if ((block_diff % (GS_BLOCKS_PER_PAGE * old_pages_wide)) == 0) // Check for left alignment.
{
const int change_height = block_diff / (GS_BLOCKS_PER_PAGE * old_pages_wide) * psm_o.pgs.y;
old_dst->m_valid = old_dst->m_valid.rintersect(GSVector4i(old_dst->m_valid.x, old_dst->m_valid.y, old_dst->m_valid.z, old_dst->m_valid.w - change_height));
old_dst->m_TEX0.TBP0 += block_diff;
const GSVector2i new_scaled_size = GSVector2i(old_dst->m_unscaled_size * old_dst->m_scale);
if (GSTexture* tex = g_gs_device->CreateCompatible(dst->m_texture, new_scaled_size, true))
{
const int height_offset = change_height * old_dst->m_scale;
g_gs_device->CopyRect(old_dst->m_texture, tex, GSVector4i(0, height_offset, old_dst->GetUnscaledWidth() * old_dst->m_scale, old_dst->GetUnscaledHeight() * old_dst->m_scale), 0, 0);
g_gs_device->Recycle(old_dst->m_texture);
old_dst->m_texture = tex;
}
}
}
}
i++;
continue;
}
const int page_diff = std::abs(static_cast<int>(old_dst->m_TEX0.TBP0 - dst->m_TEX0.TBP0)) >> 5;
const u32 new_buffer_width = std::max(1U, dst->m_TEX0.TBW);
const u32 old_buffer_width = std::max(1U, old_dst->m_TEX0.TBW);
// Handle cases where the buffer widths don't match.
if (new_buffer_width != old_buffer_width)
@@ -3592,7 +3638,7 @@ bool GSTextureCache::PreloadTarget(GIFRegTEX0 TEX0, const GSVector2i& size, cons
const u32 old_pages_wide = old_buffer_width * 64 / psm_s.pgs.x;
if ((block_diff % (32 * old_pages_wide)) == 0) // Check for left alignment.
{
const int new_height = block_diff / (32 * old_pages_wide) * psm_s.pgs.y;
const int new_height = block_diff / (GS_BLOCKS_PER_PAGE * old_pages_wide) * psm_s.pgs.y;
old_dst->m_valid = old_dst->m_valid.rintersect(GSVector4i(0, 0, old_dst->GetUnscaledWidth(), new_height));
if (old_dst->m_valid.rempty())
{
@@ -4543,10 +4589,14 @@ void GSTextureCache::InvalidateContainedTargets(u32 start_bp, u32 end_bp, u32 wr
InvalidateSourcesFromTarget(t);
t->m_valid_alpha_low &= preserve_alpha;
t->m_valid_alpha_high &= preserve_alpha;
t->m_valid_rgb &= (fb_mask & 0x00FFFFFF) != 0;
t->m_was_dst_matched = false;
if (type == DepthStencil || start_bp == t->m_TEX0.TBP0 || (start_bp < t->m_TEX0.TBP0 && t->UnwrappedEndBlock() <= end_bp))
{
const bool compatible_channel_swizzle = GSLocalMemory::m_psm[t->m_TEX0.PSM].bpp == GSLocalMemory::m_psm[write_psm].bpp;
t->m_valid_alpha_low &= preserve_alpha && compatible_channel_swizzle;
t->m_valid_alpha_high &= preserve_alpha && compatible_channel_swizzle;
t->m_valid_rgb &= (fb_mask & 0x00FFFFFF) != 0 && compatible_channel_swizzle;
t->m_was_dst_matched = false;
}
// Don't keep partial depth buffers around.
if ((!t->m_valid_alpha_low && !t->m_valid_alpha_high && !t->m_valid_rgb) || type == DepthStencil)
@@ -8178,8 +8228,9 @@ bool GSTextureCache::Target::ResizeTexture(int new_unscaled_width, int new_unsca
{
// Can't do partial copies in DirectX for depth textures, and it's probably not ideal in other
// APIs either. So use a fullscreen quad setting depth instead.
// Use bilinear to avoid artifacts with upscaling. At native this is equivalent to nearest.
g_gs_device->StretchRectAuto(m_texture, tex, GSVector4(rc), Biln);
// Use bilinear to avoid artifacts with upscaling during native scaling.
const bool req_bilinear = m_downscaled && m_scale < g_gs_renderer->GetUpscaleMultiplier();
g_gs_device->StretchRectAuto(m_texture, tex, GSVector4(rc), req_bilinear ? Biln : Nearest);
}
else
{
+2 -1
View File
@@ -128,12 +128,13 @@ public:
{
PSSelector ps;
VSSelector vs;
u8 pad[3];
u8 pad[15];
__fi bool operator==(const ProgramSelector& p) const { return BitEqual(*this, p); }
__fi bool operator!=(const ProgramSelector& p) const { return !BitEqual(*this, p); }
};
static_assert(sizeof(ProgramSelector) == 32, "Program selector is 32 bytes");
static_assert(offsetof(ProgramSelector, pad) + sizeof(ProgramSelector::pad) == sizeof(ProgramSelector));
struct ProgramSelectorHash
{
+2 -2
View File
@@ -380,8 +380,8 @@ bool FullscreenUI::HasActiveWindow()
bool FullscreenUI::AreAnyDialogsOpen()
{
return (s_save_state_selector_open || s_about_window_open || s_cover_downloader_open ||
s_input_binding_type != InputBindingInfo::Type::Unknown || ImGuiFullscreen::IsChoiceDialogOpen() ||
ImGuiFullscreen::IsFileSelectorOpen());
s_achievements_login_open || s_input_binding_type != InputBindingInfo::Type::Unknown ||
ImGuiFullscreen::IsChoiceDialogOpen() || ImGuiFullscreen::IsFileSelectorOpen());
}
void FullscreenUI::CheckForConfigChanges(const Pcsx2Config& old_config)
+7 -2
View File
@@ -4349,6 +4349,8 @@ void FullscreenUI::DrawAchievementsLoginWindow()
if (ImGui::BeginPopupModal("RetroAchievements", &s_achievements_login_open, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_AlwaysAutoResize))
{
ResetFocusHere();
const float content_width = ImGui::GetContentRegionAvail().x;
ImGui::PushFont(g_large_font.first, g_large_font.second);
@@ -4448,6 +4450,8 @@ void FullscreenUI::DrawAchievementsLoginWindow()
s_achievements_login_username[0] = '\0';
s_achievements_login_password[0] = '\0';
QueueResetFocus(FocusResetType::PopupClosed);
};
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, LayoutScale(ImGuiFullscreen::LAYOUT_FRAME_ROUNDING));
@@ -4463,7 +4467,7 @@ void FullscreenUI::DrawAchievementsLoginWindow()
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.3f, 0.6f, 1.0f, 1.0f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0.1f, 0.4f, 0.8f, 1.0f));
if (ImGui::Button(FSUI_CSTR("Dismiss"), ImVec2(button_width, button_height)) && !s_achievements_login_logging_in)
if ((ImGui::Button(FSUI_CSTR("Dismiss"), ImVec2(button_width, button_height)) || WantsToCloseMenu()) && !s_achievements_login_logging_in)
CloseLoginPopup();
ImGui::PopStyleColor(3);
@@ -4580,7 +4584,7 @@ void FullscreenUI::DrawAchievementsLoginWindow()
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.5f, 0.5f, 0.5f, 1.0f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(0.3f, 0.3f, 0.3f, 1.0f));
if (ImGui::Button(FSUI_CSTR("Cancel"), ImVec2(button_width, button_height)) && !s_achievements_login_logging_in)
if ((ImGui::Button(FSUI_CSTR("Cancel"), ImVec2(button_width, button_height)) || WantsToCloseMenu()) && !s_achievements_login_logging_in)
{
if (s_achievements_login_reason == Achievements::LoginRequestReason::TokenInvalid)
{
@@ -4803,6 +4807,7 @@ void FullscreenUI::DrawAchievementsSettingsPage(std::unique_lock<std::mutex>& se
s_achievements_login_reason = Achievements::LoginRequestReason::UserInitiated;
s_achievements_login_show_dismiss = false;
s_achievements_login_open = true;
QueueResetFocus(FocusResetType::PopupOpened);
}
}
+2 -2
View File
@@ -1635,8 +1635,8 @@ void SaveStateSelectorUI::Draw()
ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar |
ImGuiWindowFlags_NoScrollbar))
{
// Leave 2 lines for the legend
const float legend_margin = ImGui::GetFontSize() * 3.0f + ImGui::GetStyle().ItemSpacing.y * 3.0f;
// Leave room for the legend.
const float legend_margin = ImGui::GetTextLineHeightWithSpacing() * 4.0f;
const float padding = 10.0f * scale;
ImGui::BeginChild("##item_list", ImVec2(0, -legend_margin), false,
+1
View File
@@ -92,6 +92,7 @@ namespace usb_lightgun
{"SLPS-25077", 90.0f, 97.5f, 422, 118, 640, 240}, // Vampire Night (J)
{"SLUS-20221", 89.8f, 102.5f, 422, 124, 640, 228}, // Vampire Night (U)
{"SLES-51229", 110.15f, 100.0f, 433, 159, 512, 256}, // Virtua Cop - Elite Edition (E,J) (480i)
{"SLPM-62205", 110.15f, 100.0f, 433, 159, 512, 256}, // Virtua Cop Re-Birth (J) (480i)
// {"SLES-51229", 85.75f, 92.0f, 456, 164, 640, 256}, // Virtua Cop - Elite Edition (E,J) (480p)
};