graphics_cmdlists.cpp 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2
  3. // Refer to the license.txt file included.
  4. #include <QListView>
  5. #include <QPushButton>
  6. #include <QVBoxLayout>
  7. #include <QTreeView>
  8. #include "graphics_cmdlists.hxx"
  9. GPUCommandListModel::GPUCommandListModel(QObject* parent) : QAbstractListModel(parent)
  10. {
  11. }
  12. int GPUCommandListModel::rowCount(const QModelIndex& parent) const
  13. {
  14. return pica_trace.writes.size();
  15. }
  16. int GPUCommandListModel::columnCount(const QModelIndex& parent) const
  17. {
  18. return 2;
  19. }
  20. QVariant GPUCommandListModel::data(const QModelIndex& index, int role) const
  21. {
  22. if (!index.isValid())
  23. return QVariant();
  24. const auto& writes = pica_trace.writes;
  25. const Pica::CommandProcessor::CommandHeader cmd{writes[index.row()].Id()};
  26. const u32 val{writes[index.row()].Value()};
  27. if (role == Qt::DisplayRole) {
  28. QString content;
  29. if (index.column() == 0) {
  30. content = QString::fromLatin1(Pica::Regs::GetCommandName(cmd.cmd_id).c_str());
  31. content.append(" ");
  32. } else if (index.column() == 1) {
  33. content.append(QString("%1 ").arg(cmd.hex, 8, 16, QLatin1Char('0')));
  34. content.append(QString("%1 ").arg(val, 8, 16, QLatin1Char('0')));
  35. }
  36. return QVariant(content);
  37. }
  38. return QVariant();
  39. }
  40. void GPUCommandListModel::OnPicaTraceFinished(const Pica::DebugUtils::PicaTrace& trace)
  41. {
  42. beginResetModel();
  43. pica_trace = trace;
  44. endResetModel();
  45. }
  46. GPUCommandListWidget::GPUCommandListWidget(QWidget* parent) : QDockWidget(tr("Pica Command List"), parent)
  47. {
  48. GPUCommandListModel* model = new GPUCommandListModel(this);
  49. QWidget* main_widget = new QWidget;
  50. QTreeView* list_widget = new QTreeView;
  51. list_widget->setModel(model);
  52. list_widget->setFont(QFont("monospace"));
  53. list_widget->setRootIsDecorated(false);
  54. QPushButton* toggle_tracing = new QPushButton(tr("Start Tracing"));
  55. connect(toggle_tracing, SIGNAL(clicked()), this, SLOT(OnToggleTracing()));
  56. connect(this, SIGNAL(TracingFinished(const Pica::DebugUtils::PicaTrace&)),
  57. model, SLOT(OnPicaTraceFinished(const Pica::DebugUtils::PicaTrace&)));
  58. QVBoxLayout* main_layout = new QVBoxLayout;
  59. main_layout->addWidget(list_widget);
  60. main_layout->addWidget(toggle_tracing);
  61. main_widget->setLayout(main_layout);
  62. setWidget(main_widget);
  63. }
  64. void GPUCommandListWidget::OnToggleTracing()
  65. {
  66. if (!Pica::DebugUtils::IsPicaTracing()) {
  67. Pica::DebugUtils::StartPicaTracing();
  68. } else {
  69. pica_trace = Pica::DebugUtils::FinishPicaTracing();
  70. emit TracingFinished(*pica_trace);
  71. }
  72. }