mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-01 04:51:49 +01:00
rsx_debugger: layout refactoring for highdpi and resizeability
This commit is contained in:
parent
92ec846375
commit
4899e35fbb
@ -80,6 +80,7 @@ namespace gui
|
||||
const QString game_list = "GameList";
|
||||
const QString logger = "Logger";
|
||||
const QString debugger = "Debugger";
|
||||
const QString rsx = "RSX_Debugger";
|
||||
const QString meta = "Meta";
|
||||
const QString fs = "FileSystem";
|
||||
const QString gs_frame = "GSFrame";
|
||||
@ -148,6 +149,8 @@ namespace gui
|
||||
const gui_save d_splitterState = gui_save(debugger, "splitterState", QByteArray());
|
||||
const gui_save d_centerPC = gui_save(debugger, "centerPC", false);
|
||||
|
||||
const gui_save rsx_geometry = gui_save(rsx, "geometry", QByteArray());
|
||||
|
||||
const gui_save m_currentConfig = gui_save(meta, "currentConfig", QObject::tr("CurrentSettings"));
|
||||
const gui_save m_currentStylesheet = gui_save(meta, "currentStylesheet", Default);
|
||||
const gui_save m_saveNotes = gui_save(meta, "saveNotes", QVariantMap());
|
||||
|
@ -1153,7 +1153,7 @@ void main_window::CreateConnects()
|
||||
|
||||
connect(ui->toolsRsxDebuggerAct, &QAction::triggered, [=]
|
||||
{
|
||||
rsx_debugger* rsx = new rsx_debugger(this);
|
||||
rsx_debugger* rsx = new rsx_debugger(guiSettings);
|
||||
rsx->show();
|
||||
});
|
||||
|
||||
|
@ -9,70 +9,70 @@ enum GCMEnumTypes
|
||||
|
||||
constexpr auto qstr = QString::fromStdString;
|
||||
|
||||
rsx_debugger::rsx_debugger(QWidget* parent)
|
||||
rsx_debugger::rsx_debugger(std::shared_ptr<gui_settings> gui_settings, QWidget* parent)
|
||||
: QDialog(parent)
|
||||
, m_item_count(37)
|
||||
, m_gui_settings(gui_settings)
|
||||
, m_addr(0x0)
|
||||
, m_cur_texture(0)
|
||||
, exit(false)
|
||||
{
|
||||
setWindowTitle(tr("RSX Debugger"));
|
||||
setObjectName("rsx_debugger");
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
setWindowFlags(Qt::Window);
|
||||
|
||||
//Fonts and Colors
|
||||
QFont mono = QFontDatabase::systemFont(QFontDatabase::FixedFont);
|
||||
mono.setPointSize(8);
|
||||
|
||||
QHBoxLayout* hbox_panel = new QHBoxLayout();
|
||||
|
||||
//Tools
|
||||
QVBoxLayout* vbox_tools = new QVBoxLayout();
|
||||
|
||||
// Controls
|
||||
QGroupBox* gb_controls = new QGroupBox(tr("RSX Debugger Controls"), this);
|
||||
QHBoxLayout* hbox_controls = new QHBoxLayout();
|
||||
QLabel l("000000000"); // hacky way to get the lineedit to resize properly
|
||||
l.setFont(mono);
|
||||
|
||||
// Controls: Address
|
||||
QGroupBox* gb_controls_addr = new QGroupBox(tr("Address:"), this);
|
||||
QHBoxLayout* hbox_controls_addr = new QHBoxLayout();
|
||||
m_addr_line = new QLineEdit();
|
||||
m_addr_line->setFont(mono);
|
||||
m_addr_line->setPlaceholderText("00000000");
|
||||
m_addr_line->setMaxLength(8);
|
||||
m_addr_line->setMaximumWidth(65);
|
||||
m_addr_line->setFixedWidth(l.sizeHint().width());
|
||||
setFocusProxy(m_addr_line);
|
||||
|
||||
QHBoxLayout* hbox_controls_addr = new QHBoxLayout();
|
||||
hbox_controls_addr->addWidget(m_addr_line);
|
||||
|
||||
QGroupBox* gb_controls_addr = new QGroupBox(tr("Address:"));
|
||||
gb_controls_addr->setLayout(hbox_controls_addr);
|
||||
|
||||
// Controls: Go to
|
||||
QGroupBox* gb_controls_goto = new QGroupBox(tr("Go to:"), this);
|
||||
QHBoxLayout* hbox_controls_goto = new QHBoxLayout();
|
||||
QPushButton* b_goto_get = new QPushButton(tr("Get"), this);
|
||||
QPushButton* b_goto_put = new QPushButton(tr("Put"), this);
|
||||
QPushButton* b_goto_get = new QPushButton(tr("Get"));
|
||||
QPushButton* b_goto_put = new QPushButton(tr("Put"));
|
||||
b_goto_get->setAutoDefault(false);
|
||||
b_goto_put->setAutoDefault(false);
|
||||
|
||||
QHBoxLayout* hbox_controls_goto = new QHBoxLayout();
|
||||
hbox_controls_goto->addWidget(b_goto_get);
|
||||
hbox_controls_goto->addWidget(b_goto_put);
|
||||
|
||||
QGroupBox* gb_controls_goto = new QGroupBox(tr("Go to:"));
|
||||
gb_controls_goto->setLayout(hbox_controls_goto);
|
||||
|
||||
// Controls: Breaks
|
||||
QGroupBox* gb_controls_breaks = new QGroupBox(tr("Break on:"), this);
|
||||
QHBoxLayout* hbox_controls_breaks = new QHBoxLayout();
|
||||
QPushButton* b_break_frame = new QPushButton(tr("Frame"), this);
|
||||
QPushButton* b_break_text = new QPushButton(tr("Texture"), this);
|
||||
QPushButton* b_break_draw = new QPushButton(tr("Draw"), this);
|
||||
QPushButton* b_break_prim = new QPushButton(tr("Primitive"), this);
|
||||
QPushButton* b_break_inst = new QPushButton(tr("Command"), this);
|
||||
QPushButton* b_break_frame = new QPushButton(tr("Frame"));
|
||||
QPushButton* b_break_text = new QPushButton(tr("Texture"));
|
||||
QPushButton* b_break_draw = new QPushButton(tr("Draw"));
|
||||
QPushButton* b_break_prim = new QPushButton(tr("Primitive"));
|
||||
QPushButton* b_break_inst = new QPushButton(tr("Command"));
|
||||
b_break_frame->setAutoDefault(false);
|
||||
b_break_text->setAutoDefault(false);
|
||||
b_break_draw->setAutoDefault(false);
|
||||
b_break_prim->setAutoDefault(false);
|
||||
b_break_inst->setAutoDefault(false);
|
||||
|
||||
QHBoxLayout* hbox_controls_breaks = new QHBoxLayout();
|
||||
hbox_controls_breaks->addWidget(b_break_frame);
|
||||
hbox_controls_breaks->addWidget(b_break_text);
|
||||
hbox_controls_breaks->addWidget(b_break_draw);
|
||||
hbox_controls_breaks->addWidget(b_break_prim);
|
||||
hbox_controls_breaks->addWidget(b_break_inst);
|
||||
|
||||
QGroupBox* gb_controls_breaks = new QGroupBox(tr("Break on:"));
|
||||
gb_controls_breaks->setLayout(hbox_controls_breaks);
|
||||
|
||||
// TODO: This feature is not yet implemented
|
||||
@ -82,31 +82,31 @@ rsx_debugger::rsx_debugger(QWidget* parent)
|
||||
b_break_prim->setEnabled(false);
|
||||
b_break_inst->setEnabled(false);
|
||||
|
||||
QHBoxLayout* hbox_controls = new QHBoxLayout();
|
||||
hbox_controls->addWidget(gb_controls_addr);
|
||||
hbox_controls->addWidget(gb_controls_goto);
|
||||
hbox_controls->addWidget(gb_controls_breaks);
|
||||
gb_controls->setLayout(hbox_controls);
|
||||
hbox_controls->addStretch(1);
|
||||
|
||||
|
||||
QTabWidget* tw_rsx = new QTabWidget(this);
|
||||
tw_rsx->setFixedSize(QSize(726, 660));
|
||||
m_tw_rsx = new QTabWidget();
|
||||
|
||||
//adds a tab containing a list to the tabwidget
|
||||
auto l_addRSXTab = [=](QTableWidget* table, QString tabname, int columns)
|
||||
auto l_addRSXTab = [=](QTableWidget* table, const QString& tabname, int columns)
|
||||
{
|
||||
QWidget* tab = new QWidget(tw_rsx);
|
||||
tw_rsx->addTab(tab, tabname);
|
||||
table = new QTableWidget(tab);
|
||||
table->setItemDelegate(new table_item_delegate(this));
|
||||
table->setFixedSize(QSize(720, 634));
|
||||
table = new QTableWidget();
|
||||
table->setItemDelegate(new table_item_delegate);
|
||||
table->setFont(mono);
|
||||
table->setGridStyle(Qt::NoPen);
|
||||
table->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
|
||||
table->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
|
||||
table->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||||
table->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||
table->verticalHeader()->setVisible(false);
|
||||
table->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
|
||||
table->verticalHeader()->setDefaultSectionSize(16);
|
||||
table->horizontalHeader()->stretchLastSection();
|
||||
table->setColumnCount(columns);
|
||||
m_tw_rsx->addTab(table, tabname);
|
||||
return table;
|
||||
};
|
||||
|
||||
@ -119,6 +119,7 @@ rsx_debugger::rsx_debugger(QWidget* parent)
|
||||
m_list_settings = l_addRSXTab(m_list_settings, tr("Settings"), 2);
|
||||
|
||||
//Tabs: List Columns
|
||||
m_list_commands->installEventFilter(this);
|
||||
m_list_commands->setHorizontalHeaderLabels(QStringList() << tr("Column") << tr("Value") << tr("Command") << tr("Count"));
|
||||
m_list_commands->setColumnWidth(0, 70);
|
||||
m_list_commands->setColumnWidth(1, 70);
|
||||
@ -147,136 +148,66 @@ rsx_debugger::rsx_debugger(QWidget* parent)
|
||||
m_list_settings->setColumnWidth(0, 170);
|
||||
m_list_settings->setColumnWidth(1, 270);
|
||||
|
||||
// Fill list
|
||||
for(u32 i=0; i<m_item_count; i++)
|
||||
{
|
||||
m_list_commands->insertRow(m_list_commands->rowCount());
|
||||
}
|
||||
for (u32 i = 0; i<frame_debug.command_queue.size(); i++)
|
||||
m_list_captured_frame->insertRow(1);
|
||||
|
||||
//Tools: Tools = Controls + Notebook Tabs
|
||||
vbox_tools->addWidget(gb_controls);
|
||||
vbox_tools->addSpacing(10);
|
||||
vbox_tools->addWidget(tw_rsx);
|
||||
QVBoxLayout* vbox_tools = new QVBoxLayout();
|
||||
vbox_tools->addLayout(hbox_controls);
|
||||
vbox_tools->addWidget(m_tw_rsx);
|
||||
|
||||
// State explorer
|
||||
QHBoxLayout* hbox_state_explorer = new QHBoxLayout();
|
||||
QTabWidget* state_rsx = new QTabWidget(this);
|
||||
state_rsx->setFixedSize(QSize(726,746)); // content fits nicely
|
||||
|
||||
QWidget* p_buffers = new QWidget(state_rsx);
|
||||
QWidget* p_transform_program = new QWidget(state_rsx);
|
||||
QWidget* p_shader_program = new QWidget(state_rsx);
|
||||
QWidget* p_index_buffer = new QWidget(state_rsx);
|
||||
|
||||
state_rsx->addTab(p_buffers, tr("RTTs and DS"));
|
||||
state_rsx->addTab(p_transform_program, tr("Transform program"));
|
||||
state_rsx->addTab(p_shader_program, tr("Shader program"));
|
||||
state_rsx->addTab(p_index_buffer, tr("Index buffer"));
|
||||
|
||||
m_text_transform_program = new QLabel(p_transform_program);
|
||||
m_text_transform_program->setFixedSize(QSize(720, 720));
|
||||
m_text_transform_program = new QLabel();
|
||||
m_text_transform_program->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard);
|
||||
m_text_transform_program->setFont(mono);
|
||||
m_text_transform_program->setText("");
|
||||
|
||||
m_text_shader_program = new QLabel(p_shader_program);
|
||||
m_text_shader_program->setFixedSize(QSize(720, 720));
|
||||
m_text_shader_program = new QLabel();
|
||||
m_text_shader_program->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard);
|
||||
m_text_shader_program->setFont(mono);
|
||||
m_text_shader_program->setText("");
|
||||
|
||||
m_list_index_buffer = new QListWidget(p_index_buffer);
|
||||
m_list_index_buffer->setFixedSize(QSize(720, 720));
|
||||
m_list_index_buffer = new QListWidget();
|
||||
m_list_index_buffer->setFont(mono);
|
||||
|
||||
//Buffers
|
||||
QVBoxLayout* vbox_buffers1 = new QVBoxLayout();
|
||||
QVBoxLayout* vbox_buffers2 = new QVBoxLayout();
|
||||
QGroupBox* gb_buffers_colorA = new QGroupBox(tr("Color Buffer A"), p_buffers);
|
||||
QGroupBox* gb_buffers_colorB = new QGroupBox(tr("Color Buffer B"), p_buffers);
|
||||
QGroupBox* gb_buffers_colorC = new QGroupBox(tr("Color Buffer C"), p_buffers);
|
||||
QGroupBox* gb_buffers_colorD = new QGroupBox(tr("Color Buffer D"), p_buffers);
|
||||
QGroupBox* gb_buffers_depth = new QGroupBox(tr("Depth Buffer"), p_buffers);
|
||||
QGroupBox* gb_buffers_stencil = new QGroupBox(tr("Stencil Buffer"), p_buffers);
|
||||
QGroupBox* gb_buffers_text = new QGroupBox(tr("Texture"), p_buffers);
|
||||
QHBoxLayout* hbox_buffers_colorA = new QHBoxLayout();
|
||||
QHBoxLayout* hbox_buffers_colorB = new QHBoxLayout();
|
||||
QHBoxLayout* hbox_buffers_colorC = new QHBoxLayout();
|
||||
QHBoxLayout* hbox_buffers_colorD = new QHBoxLayout();
|
||||
QHBoxLayout* hbox_buffers_depth = new QHBoxLayout();
|
||||
QHBoxLayout* hbox_buffers_stencil = new QHBoxLayout();
|
||||
QHBoxLayout* hbox_buffers_text = new QHBoxLayout();
|
||||
gb_buffers_colorA ->setLayout(hbox_buffers_colorA);
|
||||
gb_buffers_colorB ->setLayout(hbox_buffers_colorB);
|
||||
gb_buffers_colorC ->setLayout(hbox_buffers_colorC);
|
||||
gb_buffers_colorD ->setLayout(hbox_buffers_colorD);
|
||||
gb_buffers_depth ->setLayout(hbox_buffers_depth);
|
||||
gb_buffers_stencil->setLayout(hbox_buffers_stencil);
|
||||
gb_buffers_text ->setLayout(hbox_buffers_text);
|
||||
|
||||
//Buffers and textures
|
||||
int m_panel_width = 108;
|
||||
int m_panel_height = 108;
|
||||
int m_text_width = 108;
|
||||
int m_text_height = 108;
|
||||
|
||||
//Panels for displaying the buffers
|
||||
m_buffer_colorA = new Buffer(p_buffers, false, 0);
|
||||
m_buffer_colorB = new Buffer(p_buffers, false, 1);
|
||||
m_buffer_colorC = new Buffer(p_buffers, false, 2);
|
||||
m_buffer_colorD = new Buffer(p_buffers, false, 3);
|
||||
m_buffer_depth = new Buffer(p_buffers, false);
|
||||
m_buffer_stencil = new Buffer(p_buffers, false);
|
||||
m_buffer_tex = new Buffer(p_buffers, true);
|
||||
m_buffer_colorA ->setFixedSize(QSize(m_panel_width, m_panel_height));
|
||||
m_buffer_colorB ->setFixedSize(QSize(m_panel_width, m_panel_height));
|
||||
m_buffer_colorC ->setFixedSize(QSize(m_panel_width, m_panel_height));
|
||||
m_buffer_colorD ->setFixedSize(QSize(m_panel_width, m_panel_height));
|
||||
m_buffer_depth ->setFixedSize(QSize(m_panel_width, m_panel_height));
|
||||
m_buffer_stencil->setFixedSize(QSize(m_panel_width, m_panel_height));
|
||||
m_buffer_tex ->setFixedSize(QSize(m_text_width, m_text_height));
|
||||
hbox_buffers_colorA ->addWidget(m_buffer_colorA);
|
||||
hbox_buffers_colorB ->addWidget(m_buffer_colorB);
|
||||
hbox_buffers_colorC ->addWidget(m_buffer_colorC);
|
||||
hbox_buffers_colorD ->addWidget(m_buffer_colorD);
|
||||
hbox_buffers_depth ->addWidget(m_buffer_depth);
|
||||
hbox_buffers_stencil->addWidget(m_buffer_stencil);
|
||||
hbox_buffers_text ->addWidget(m_buffer_tex);
|
||||
m_buffer_colorA = new Buffer(false, 0, tr("Color Buffer A"));
|
||||
m_buffer_colorB = new Buffer(false, 1, tr("Color Buffer B"));
|
||||
m_buffer_colorC = new Buffer(false, 2, tr("Color Buffer C"));
|
||||
m_buffer_colorD = new Buffer(false, 3, tr("Color Buffer D"));
|
||||
m_buffer_depth = new Buffer(false, 4, tr("Depth Buffer"));
|
||||
m_buffer_stencil = new Buffer(false, 4, tr("Stencil Buffer"));
|
||||
m_buffer_tex = new Buffer(true, 4, tr("Texture"));
|
||||
|
||||
//Merge and display everything
|
||||
vbox_buffers1->addSpacing(10);
|
||||
vbox_buffers1->addWidget(gb_buffers_colorA);
|
||||
vbox_buffers1->addSpacing(10);
|
||||
vbox_buffers1->addWidget(gb_buffers_colorC);
|
||||
vbox_buffers1->addSpacing(10);
|
||||
vbox_buffers1->addWidget(gb_buffers_depth);
|
||||
vbox_buffers1->addSpacing(10);
|
||||
vbox_buffers1->addWidget(gb_buffers_text);
|
||||
vbox_buffers1->addSpacing(10);
|
||||
QVBoxLayout* vbox_buffers1 = new QVBoxLayout();
|
||||
vbox_buffers1->addWidget(m_buffer_colorA);
|
||||
vbox_buffers1->addWidget(m_buffer_colorC);
|
||||
vbox_buffers1->addWidget(m_buffer_depth);
|
||||
vbox_buffers1->addWidget(m_buffer_tex);
|
||||
vbox_buffers1->addStretch();
|
||||
|
||||
vbox_buffers2->addSpacing(10);
|
||||
vbox_buffers2->addWidget(gb_buffers_colorB);
|
||||
vbox_buffers2->addSpacing(10);
|
||||
vbox_buffers2->addWidget(gb_buffers_colorD);
|
||||
vbox_buffers2->addSpacing(10);
|
||||
vbox_buffers2->addWidget(gb_buffers_stencil);
|
||||
vbox_buffers2->addSpacing(10);
|
||||
QVBoxLayout* vbox_buffers2 = new QVBoxLayout();
|
||||
vbox_buffers2->addWidget(m_buffer_colorB);
|
||||
vbox_buffers2->addWidget(m_buffer_colorD);
|
||||
vbox_buffers2->addWidget(m_buffer_stencil);
|
||||
vbox_buffers2->addStretch();
|
||||
|
||||
hbox_state_explorer->addLayout(vbox_buffers1);
|
||||
hbox_state_explorer->addSpacing(10);
|
||||
hbox_state_explorer->addLayout(vbox_buffers2);
|
||||
hbox_state_explorer->addStretch();
|
||||
QHBoxLayout* buffer_layout = new QHBoxLayout();
|
||||
buffer_layout->addLayout(vbox_buffers1);
|
||||
buffer_layout->addLayout(vbox_buffers2);
|
||||
buffer_layout->addStretch();
|
||||
|
||||
p_buffers->setLayout(hbox_state_explorer);
|
||||
QWidget* buffers = new QWidget();
|
||||
buffers->setLayout(buffer_layout);
|
||||
|
||||
hbox_panel->addLayout(vbox_tools);
|
||||
hbox_panel->addSpacing(10);
|
||||
hbox_panel->addWidget(state_rsx);
|
||||
setLayout(hbox_panel);
|
||||
QTabWidget* state_rsx = new QTabWidget();
|
||||
state_rsx->addTab(buffers, tr("RTTs and DS"));
|
||||
state_rsx->addTab(m_text_transform_program, tr("Transform program"));
|
||||
state_rsx->addTab(m_text_shader_program, tr("Shader program"));
|
||||
state_rsx->addTab(m_list_index_buffer, tr("Index buffer"));
|
||||
|
||||
QHBoxLayout* main_layout = new QHBoxLayout();
|
||||
main_layout->addLayout(vbox_tools, 1);
|
||||
main_layout->addWidget(state_rsx, 1);
|
||||
setLayout(main_layout);
|
||||
|
||||
//Events
|
||||
connect(b_goto_get, &QAbstractButton::clicked, [=]
|
||||
@ -319,9 +250,11 @@ rsx_debugger::rsx_debugger(QWidget* parent)
|
||||
connect(m_list_captured_draw_calls, &QTableWidget::itemClicked, this, &rsx_debugger::OnClickDrawCalls);
|
||||
|
||||
//Fill the frame
|
||||
UpdateInformation();
|
||||
setFixedSize(sizeHint());
|
||||
setFocusProxy(m_addr_line);
|
||||
for (u32 i = 0; i < frame_debug.command_queue.size(); i++)
|
||||
m_list_captured_frame->insertRow(i);
|
||||
|
||||
if (!restoreGeometry(m_gui_settings->GetValue(gui::rsx_geometry).toByteArray()))
|
||||
UpdateInformation();
|
||||
}
|
||||
|
||||
rsx_debugger::~rsx_debugger()
|
||||
@ -329,55 +262,108 @@ rsx_debugger::~rsx_debugger()
|
||||
exit = true;
|
||||
}
|
||||
|
||||
void rsx_debugger::closeEvent(QCloseEvent* event)
|
||||
{
|
||||
m_gui_settings->SetValue(gui::rsx_geometry, saveGeometry());
|
||||
QDialog::closeEvent(event);
|
||||
}
|
||||
|
||||
void rsx_debugger::keyPressEvent(QKeyEvent* event)
|
||||
{
|
||||
if(isActiveWindow())
|
||||
{
|
||||
switch(event->key())
|
||||
{
|
||||
case Qt::Key_F5: UpdateInformation(); return;
|
||||
case Qt::Key_F5: UpdateInformation(); break;
|
||||
}
|
||||
}
|
||||
|
||||
QDialog::keyPressEvent(event);
|
||||
}
|
||||
|
||||
void rsx_debugger::wheelEvent(QWheelEvent* event)
|
||||
bool rsx_debugger::eventFilter(QObject* object, QEvent* event)
|
||||
{
|
||||
if (!m_list_commands->underMouse())
|
||||
if (object == m_list_commands)
|
||||
{
|
||||
return;
|
||||
}
|
||||
QPoint numSteps = event->angleDelta() / 8 / 15; // http://doc.qt.io/qt-5/qwheelevent.html#pixelDelta
|
||||
if(vm::check_addr(m_addr, 4))
|
||||
{
|
||||
int items = event->modifiers() & Qt::ControlModifier ? m_item_count : 1;
|
||||
|
||||
for(int i=0; i<items; ++i)
|
||||
switch (event->type())
|
||||
{
|
||||
u32 offset;
|
||||
if(vm::check_addr(m_addr, 4))
|
||||
{
|
||||
u32 cmd = vm::read32(m_addr);
|
||||
u32 count = ((cmd & RSX_METHOD_OLD_JUMP_CMD_MASK) == RSX_METHOD_OLD_JUMP_CMD)
|
||||
|| ((cmd & RSX_METHOD_NEW_JUMP_CMD_MASK) == RSX_METHOD_NEW_JUMP_CMD)
|
||||
|| ((cmd & RSX_METHOD_CALL_CMD_MASK) == RSX_METHOD_CALL_CMD)
|
||||
|| cmd == RSX_METHOD_RETURN_CMD ? 0 : (cmd >> 18) & 0x7ff;
|
||||
case QEvent::Resize:
|
||||
{
|
||||
bool is_empty = m_list_commands->rowCount() < 1;
|
||||
if (is_empty)
|
||||
m_list_commands->insertRow(m_list_commands->rowCount());
|
||||
|
||||
offset = 1 + count;
|
||||
int item_height = m_list_commands->rowHeight(0);
|
||||
if (is_empty)
|
||||
{
|
||||
m_list_commands->clearContents();
|
||||
m_list_commands->setRowCount(0);
|
||||
}
|
||||
|
||||
int available_height = m_list_commands->rect().height() - m_list_commands->horizontalHeader()->height() - m_list_commands->frameWidth() * 2;
|
||||
if (available_height < item_height || item_height < 1)
|
||||
break;
|
||||
|
||||
int new_item_count = available_height / item_height;
|
||||
if (new_item_count == m_item_count)
|
||||
break;
|
||||
|
||||
m_item_count = new_item_count;
|
||||
m_list_commands->clearContents();
|
||||
m_list_commands->setRowCount(0);
|
||||
|
||||
for (u32 i = 0; i < m_item_count; ++i)
|
||||
m_list_commands->insertRow(m_list_commands->rowCount());
|
||||
|
||||
if (m_list_commands->horizontalScrollBar())
|
||||
m_list_commands->removeRow(--m_item_count);
|
||||
|
||||
UpdateInformation();
|
||||
break;
|
||||
}
|
||||
case QEvent::Wheel:
|
||||
{
|
||||
QWheelEvent* wheelEvent = static_cast<QWheelEvent*>(event);
|
||||
QPoint numSteps = wheelEvent->angleDelta() / 8 / 15; // http://doc.qt.io/qt-5/qwheelevent.html#pixelDelta
|
||||
|
||||
if (vm::check_addr(m_addr, 4))
|
||||
{
|
||||
int items = wheelEvent->modifiers() & Qt::ControlModifier ? m_item_count : 1;
|
||||
|
||||
for (int i = 0; i<items; ++i)
|
||||
{
|
||||
u32 offset;
|
||||
if (vm::check_addr(m_addr, 4))
|
||||
{
|
||||
u32 cmd = vm::read32(m_addr);
|
||||
u32 count = ((cmd & RSX_METHOD_OLD_JUMP_CMD_MASK) == RSX_METHOD_OLD_JUMP_CMD)
|
||||
|| ((cmd & RSX_METHOD_NEW_JUMP_CMD_MASK) == RSX_METHOD_NEW_JUMP_CMD)
|
||||
|| ((cmd & RSX_METHOD_CALL_CMD_MASK) == RSX_METHOD_CALL_CMD)
|
||||
|| cmd == RSX_METHOD_RETURN_CMD ? 0 : (cmd >> 18) & 0x7ff;
|
||||
|
||||
offset = 1 + count;
|
||||
}
|
||||
else
|
||||
{
|
||||
offset = 1;
|
||||
}
|
||||
|
||||
m_addr -= 4 * offset * numSteps.y();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
offset = 1;
|
||||
m_addr -= (wheelEvent->modifiers() & Qt::ControlModifier ? m_item_count : 1) * 4 * numSteps.y();
|
||||
}
|
||||
|
||||
m_addr -= 4 * offset * numSteps.y();
|
||||
UpdateInformation();
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_addr -= (event->modifiers() & Qt::ControlModifier ? m_item_count : 1) * 4 * numSteps.y();
|
||||
}
|
||||
|
||||
UpdateInformation();
|
||||
return QDialog::eventFilter(object, event);
|
||||
}
|
||||
|
||||
namespace
|
||||
@ -396,19 +382,32 @@ namespace
|
||||
}
|
||||
}
|
||||
|
||||
Buffer::Buffer(bool isTex, u32 id, const QString& name, QWidget* parent)
|
||||
: QGroupBox(name, parent), m_isTex(isTex), m_id(id)
|
||||
{
|
||||
m_image_size = isTex ? Texture_Size : Panel_Size;
|
||||
|
||||
m_canvas = new QLabel();
|
||||
m_canvas->setFixedSize(m_image_size);
|
||||
|
||||
QHBoxLayout* layout = new QHBoxLayout();
|
||||
layout->setContentsMargins(1, 1, 1, 1);
|
||||
layout->addWidget(m_canvas);
|
||||
setLayout(layout);
|
||||
};
|
||||
|
||||
// Draws a formatted and buffered <image> inside the Buffer Widget
|
||||
void Buffer::showImage(const QImage& image)
|
||||
{
|
||||
if (image.isNull()) return;
|
||||
m_image = image;
|
||||
QImage scaled = m_image.scaled(size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||
QLabel* m_canvas = new QLabel();
|
||||
m_canvas->setFixedSize(size());
|
||||
QImage scaled = m_image.scaled(m_image_size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||
m_canvas->setPixmap(QPixmap::fromImage(scaled));
|
||||
QHBoxLayout* layout = new QHBoxLayout();
|
||||
layout->setContentsMargins(0, 0, 0, 0);
|
||||
layout->addWidget(m_canvas);
|
||||
setLayout(layout);
|
||||
QHBoxLayout* new_layout = new QHBoxLayout();
|
||||
new_layout->setContentsMargins(1, 1, 1, 1);
|
||||
new_layout->addWidget(m_canvas);
|
||||
delete layout();
|
||||
setLayout(new_layout);
|
||||
}
|
||||
|
||||
void Buffer::mouseDoubleClickEvent(QMouseEvent* event)
|
||||
@ -744,10 +743,10 @@ void rsx_debugger::GetBuffers()
|
||||
Buffer* pnl;
|
||||
switch(bufferId)
|
||||
{
|
||||
case 0: pnl = m_buffer_colorA; break;
|
||||
case 1: pnl = m_buffer_colorB; break;
|
||||
case 2: pnl = m_buffer_colorC; break;
|
||||
default: pnl = m_buffer_colorD; break;
|
||||
case 0: pnl = m_buffer_colorA; break;
|
||||
case 1: pnl = m_buffer_colorB; break;
|
||||
case 2: pnl = m_buffer_colorC; break;
|
||||
default: pnl = m_buffer_colorD; break;
|
||||
}
|
||||
pnl->showImage(QImage(buffer, width, height, QImage::Format_RGB32));
|
||||
}
|
||||
@ -1109,7 +1108,7 @@ const char* rsx_debugger::ParseGCMEnum(u32 value, u32 type)
|
||||
|
||||
QString rsx_debugger::DisAsmCommand(u32 cmd, u32 count, u32 currentAddr, u32 ioAddr)
|
||||
{
|
||||
std::string disasm = "";
|
||||
std::string disasm;
|
||||
|
||||
#define DISASM(string, ...) { if(disasm.empty()) disasm = fmt::format((string), ##__VA_ARGS__); else disasm += (' ' + fmt::format((string), ##__VA_ARGS__)); }
|
||||
if((cmd & RSX_METHOD_OLD_JUMP_CMD_MASK) == RSX_METHOD_OLD_JUMP_CMD)
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include "table_item_delegate.h"
|
||||
#include "gui_settings.h"
|
||||
|
||||
#include <QDialog>
|
||||
#include <QLabel>
|
||||
#include <QLineEdit>
|
||||
#include <QHBoxLayout>
|
||||
@ -27,19 +26,25 @@
|
||||
#include <QSignalMapper>
|
||||
#include <QPixmap>
|
||||
|
||||
class Buffer : public QWidget
|
||||
class Buffer : public QGroupBox
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
const QSize Panel_Size = QSize(108, 108);
|
||||
const QSize Texture_Size = QSize(108, 108);
|
||||
|
||||
u32 m_id;
|
||||
bool m_isTex;
|
||||
QImage m_image;
|
||||
QLabel* m_canvas;
|
||||
QSize m_image_size;
|
||||
|
||||
public:
|
||||
Buffer(QWidget* parent, bool isTex, u32 id = 4)
|
||||
: QWidget(parent), m_isTex(isTex), m_id(id){};
|
||||
Buffer(bool isTex, u32 id, const QString& name, QWidget* parent = 0);
|
||||
void showImage(const QImage& image = QImage());
|
||||
|
||||
private:
|
||||
void mouseDoubleClickEvent(QMouseEvent* event);
|
||||
protected:
|
||||
void mouseDoubleClickEvent(QMouseEvent* event) override;
|
||||
};
|
||||
|
||||
class rsx_debugger : public QDialog
|
||||
@ -59,6 +64,7 @@ class rsx_debugger : public QDialog
|
||||
QTableWidget* m_list_texture;
|
||||
QTableWidget* m_list_settings;
|
||||
QListWidget* m_list_index_buffer;
|
||||
QTabWidget* m_tw_rsx;
|
||||
|
||||
Buffer* m_buffer_colorA;
|
||||
Buffer* m_buffer_colorB;
|
||||
@ -73,9 +79,11 @@ class rsx_debugger : public QDialog
|
||||
|
||||
uint m_cur_texture;
|
||||
|
||||
std::shared_ptr<gui_settings> m_gui_settings;
|
||||
|
||||
public:
|
||||
bool exit;
|
||||
rsx_debugger(QWidget* parent);
|
||||
rsx_debugger(std::shared_ptr<gui_settings> gui_settings, QWidget* parent = 0);
|
||||
~rsx_debugger();
|
||||
|
||||
virtual void UpdateInformation();
|
||||
@ -92,9 +100,12 @@ public:
|
||||
void SetPC(const uint pc);
|
||||
|
||||
public Q_SLOTS:
|
||||
virtual void keyPressEvent(QKeyEvent* event);
|
||||
virtual void wheelEvent(QWheelEvent* event);
|
||||
virtual void OnClickDrawCalls();
|
||||
virtual void SetFlags();
|
||||
virtual void SetPrograms();
|
||||
|
||||
protected:
|
||||
virtual void closeEvent(QCloseEvent* event) override;
|
||||
virtual void keyPressEvent(QKeyEvent* event) override;
|
||||
virtual bool eventFilter(QObject* object, QEvent* event) override;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user