mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	citra-qt: Add command list view.
This commit is contained in:
		
							parent
							
								
									5d62f5d92a
								
							
						
					
					
						commit
						6893732348
					
				
					 8 changed files with 129 additions and 2 deletions
				
			
		|  | @ -3,6 +3,7 @@ set(SRCS | ||||||
|             debugger/callstack.cpp |             debugger/callstack.cpp | ||||||
|             debugger/disassembler.cpp |             debugger/disassembler.cpp | ||||||
|             debugger/graphics.cpp |             debugger/graphics.cpp | ||||||
|  |             debugger/graphics_cmdlists.cpp | ||||||
|             debugger/ramview.cpp |             debugger/ramview.cpp | ||||||
|             debugger/registers.cpp |             debugger/registers.cpp | ||||||
|             hotkeys.cpp |             hotkeys.cpp | ||||||
|  | @ -40,6 +41,7 @@ qt4_wrap_cpp(MOC_SRCS | ||||||
|                         debugger/callstack.hxx |                         debugger/callstack.hxx | ||||||
|                         debugger/disassembler.hxx |                         debugger/disassembler.hxx | ||||||
|                         debugger/graphics.hxx |                         debugger/graphics.hxx | ||||||
|  |                         debugger/graphics_cmdlists.hxx | ||||||
|                         debugger/registers.hxx |                         debugger/registers.hxx | ||||||
|                         debugger/ramview.hxx |                         debugger/ramview.hxx | ||||||
|                         hotkeys.hxx |                         hotkeys.hxx | ||||||
|  |  | ||||||
|  | @ -131,6 +131,7 @@ | ||||||
|     <ClCompile Include="config\controller_config_util.cpp" /> |     <ClCompile Include="config\controller_config_util.cpp" /> | ||||||
|     <ClCompile Include="debugger\callstack.cpp" /> |     <ClCompile Include="debugger\callstack.cpp" /> | ||||||
|     <ClCompile Include="debugger\graphics.cpp" /> |     <ClCompile Include="debugger\graphics.cpp" /> | ||||||
|  |     <ClCompile Include="debugger\graphics_cmdlists.cpp" /> | ||||||
|     <ClCompile Include="debugger\registers.cpp" /> |     <ClCompile Include="debugger\registers.cpp" /> | ||||||
|     <ClCompile Include="debugger\disassembler.cpp" /> |     <ClCompile Include="debugger\disassembler.cpp" /> | ||||||
|     <ClCompile Include="debugger\ramview.cpp" /> |     <ClCompile Include="debugger\ramview.cpp" /> | ||||||
|  | @ -146,6 +147,7 @@ | ||||||
|     <MOC Include="debugger\callstack.hxx" /> |     <MOC Include="debugger\callstack.hxx" /> | ||||||
|     <MOC Include="debugger\disassembler.hxx" /> |     <MOC Include="debugger\disassembler.hxx" /> | ||||||
|     <MOC Include="debugger\graphics.hxx" /> |     <MOC Include="debugger\graphics.hxx" /> | ||||||
|  |     <MOC Include="debugger\graphics_cmdlists.hxx" /> | ||||||
|     <MOC Include="debugger\ramview.hxx" /> |     <MOC Include="debugger\ramview.hxx" /> | ||||||
|     <MOC Include="debugger\registers.hxx" /> |     <MOC Include="debugger\registers.hxx" /> | ||||||
|     <MOC Include="bootmanager.hxx" /> |     <MOC Include="bootmanager.hxx" /> | ||||||
|  |  | ||||||
|  | @ -42,6 +42,9 @@ | ||||||
|     <ClCompile Include="debugger\graphics.cpp"> |     <ClCompile Include="debugger\graphics.cpp"> | ||||||
|       <Filter>debugger</Filter> |       <Filter>debugger</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |     <ClCompile Include="debugger\graphics_cmdlists.cpp"> | ||||||
|  |       <Filter>debugger</Filter> | ||||||
|  |     </ClCompile> | ||||||
|     <ClCompile Include="debugger\ramview.cpp"> |     <ClCompile Include="debugger\ramview.cpp"> | ||||||
|       <Filter>debugger</Filter> |       <Filter>debugger</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  | @ -74,6 +77,9 @@ | ||||||
|     <MOC Include="debugger\graphics.hxx"> |     <MOC Include="debugger\graphics.hxx"> | ||||||
|       <Filter>debugger</Filter> |       <Filter>debugger</Filter> | ||||||
|     </MOC> |     </MOC> | ||||||
|  |     <MOC Include="debugger\graphics_cmdlists.hxx"> | ||||||
|  |       <Filter>debugger</Filter> | ||||||
|  |     </MOC> | ||||||
|     <MOC Include="debugger\ramview.hxx"> |     <MOC Include="debugger\ramview.hxx"> | ||||||
|       <Filter>debugger</Filter> |       <Filter>debugger</Filter> | ||||||
|     </MOC> |     </MOC> | ||||||
|  |  | ||||||
							
								
								
									
										65
									
								
								src/citra_qt/debugger/graphics_cmdlists.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								src/citra_qt/debugger/graphics_cmdlists.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,65 @@ | ||||||
|  | // Copyright 2014 Citra Emulator Project
 | ||||||
|  | // Licensed under GPLv2
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #include "graphics_cmdlists.hxx" | ||||||
|  | #include <QListView> | ||||||
|  | 
 | ||||||
|  | extern GraphicsDebugger g_debugger; | ||||||
|  | 
 | ||||||
|  | GPUCommandListModel::GPUCommandListModel(QObject* parent) : QAbstractListModel(parent), row_count(0) | ||||||
|  | { | ||||||
|  |     connect(this, SIGNAL(CommandListCalled()), this, SLOT(OnCommandListCalledInternal()), Qt::UniqueConnection); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int GPUCommandListModel::rowCount(const QModelIndex& parent) const | ||||||
|  | { | ||||||
|  |     return row_count; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | QVariant GPUCommandListModel::data(const QModelIndex& index, int role) const | ||||||
|  | { | ||||||
|  |     if (!index.isValid()) | ||||||
|  |         return QVariant(); | ||||||
|  | 
 | ||||||
|  |     int idx = index.row(); | ||||||
|  |     if (role == Qt::DisplayRole) | ||||||
|  |     { | ||||||
|  |         QString content; | ||||||
|  |         const GraphicsDebugger::PicaCommandList& cmdlist = command_list[idx].second; | ||||||
|  |         for (int i = 0; i < cmdlist.size(); ++i) | ||||||
|  |         { | ||||||
|  |             const GraphicsDebugger::PicaCommand& cmd = cmdlist[i]; | ||||||
|  |             for (int j = 0; j < cmd.size(); ++j) | ||||||
|  |                 content.append(QString("%1 ").arg(cmd[j], 8, 16, QLatin1Char('0'))); | ||||||
|  |         } | ||||||
|  |         return QVariant(content); | ||||||
|  |     } | ||||||
|  |     return QVariant(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GPUCommandListModel::OnCommandListCalled(const GraphicsDebugger::PicaCommandList& lst, bool is_new) | ||||||
|  | { | ||||||
|  |     emit CommandListCalled(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void GPUCommandListModel::OnCommandListCalledInternal() | ||||||
|  | { | ||||||
|  |     beginResetModel(); | ||||||
|  | 
 | ||||||
|  |     command_list = GetDebugger()->GetCommandLists(); | ||||||
|  |     row_count = command_list.size(); | ||||||
|  | 
 | ||||||
|  |     endResetModel(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | GPUCommandListWidget::GPUCommandListWidget(QWidget* parent) : QDockWidget(tr("Pica Command List"), parent) | ||||||
|  | { | ||||||
|  |     GPUCommandListModel* model = new GPUCommandListModel(this); | ||||||
|  |     g_debugger.RegisterObserver(model); | ||||||
|  | 
 | ||||||
|  |     QListView* list_widget = new QListView; | ||||||
|  |     list_widget->setModel(model); | ||||||
|  |     setWidget(list_widget); | ||||||
|  | } | ||||||
							
								
								
									
										44
									
								
								src/citra_qt/debugger/graphics_cmdlists.hxx
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/citra_qt/debugger/graphics_cmdlists.hxx
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,44 @@ | ||||||
|  | // Copyright 2014 Citra Emulator Project
 | ||||||
|  | // Licensed under GPLv2
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include <QAbstractListModel> | ||||||
|  | #include <QDockWidget> | ||||||
|  | 
 | ||||||
|  | #include "video_core/gpu_debugger.h" | ||||||
|  | 
 | ||||||
|  | class GPUCommandListModel : public QAbstractListModel, public GraphicsDebugger::DebuggerObserver | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  |     GPUCommandListModel(QObject* parent); | ||||||
|  | 
 | ||||||
|  |     int rowCount(const QModelIndex& parent = QModelIndex()) const override; | ||||||
|  |     QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  |     void OnCommandListCalled(const GraphicsDebugger::PicaCommandList& lst, bool is_new) override; | ||||||
|  | 
 | ||||||
|  | public slots: | ||||||
|  |     void OnCommandListCalledInternal(); | ||||||
|  | 
 | ||||||
|  | signals: | ||||||
|  |     void CommandListCalled(); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |     int row_count; | ||||||
|  |     std::vector<std::pair<u32,GraphicsDebugger::PicaCommandList>> command_list; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | class GPUCommandListWidget : public QDockWidget | ||||||
|  | { | ||||||
|  |     Q_OBJECT | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  |     GPUCommandListWidget(QWidget* parent = 0); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | }; | ||||||
|  | @ -20,6 +20,7 @@ | ||||||
| #include "debugger/callstack.hxx" | #include "debugger/callstack.hxx" | ||||||
| #include "debugger/ramview.hxx" | #include "debugger/ramview.hxx" | ||||||
| #include "debugger/graphics.hxx" | #include "debugger/graphics.hxx" | ||||||
|  | #include "debugger/graphics_cmdlists.hxx" | ||||||
| 
 | 
 | ||||||
| #include "core/system.h" | #include "core/system.h" | ||||||
| #include "core/loader.h" | #include "core/loader.h" | ||||||
|  | @ -52,11 +53,16 @@ GMainWindow::GMainWindow() | ||||||
|     addDockWidget(Qt::RightDockWidgetArea, graphicsWidget); |     addDockWidget(Qt::RightDockWidgetArea, graphicsWidget); | ||||||
|     callstackWidget->hide(); |     callstackWidget->hide(); | ||||||
| 
 | 
 | ||||||
|  |     graphicsCommandsWidget = new GPUCommandListWidget(this); | ||||||
|  |     addDockWidget(Qt::RightDockWidgetArea, graphicsCommandsWidget); | ||||||
|  |     callstackWidget->hide(); | ||||||
|  | 
 | ||||||
|     QMenu* debug_menu = ui.menu_View->addMenu(tr("Debugging")); |     QMenu* debug_menu = ui.menu_View->addMenu(tr("Debugging")); | ||||||
|     debug_menu->addAction(disasmWidget->toggleViewAction()); |     debug_menu->addAction(disasmWidget->toggleViewAction()); | ||||||
|     debug_menu->addAction(registersWidget->toggleViewAction()); |     debug_menu->addAction(registersWidget->toggleViewAction()); | ||||||
|     debug_menu->addAction(callstackWidget->toggleViewAction()); |     debug_menu->addAction(callstackWidget->toggleViewAction()); | ||||||
|     debug_menu->addAction(graphicsWidget->toggleViewAction()); |     debug_menu->addAction(graphicsWidget->toggleViewAction()); | ||||||
|  |     debug_menu->addAction(graphicsCommandsWidget->toggleViewAction()); | ||||||
| 
 | 
 | ||||||
|     // Set default UI state
 |     // Set default UI state
 | ||||||
|     // geometry: 55% of the window contents are in the upper screen half, 45% in the lower half
 |     // geometry: 55% of the window contents are in the upper screen half, 45% in the lower half
 | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ class DisassemblerWidget; | ||||||
| class RegistersWidget; | class RegistersWidget; | ||||||
| class CallstackWidget; | class CallstackWidget; | ||||||
| class GPUCommandStreamWidget; | class GPUCommandStreamWidget; | ||||||
|  | class GPUCommandListWidget; | ||||||
| 
 | 
 | ||||||
| class GMainWindow : public QMainWindow | class GMainWindow : public QMainWindow | ||||||
| { | { | ||||||
|  | @ -52,6 +53,7 @@ private: | ||||||
|     RegistersWidget* registersWidget; |     RegistersWidget* registersWidget; | ||||||
|     CallstackWidget* callstackWidget; |     CallstackWidget* callstackWidget; | ||||||
|     GPUCommandStreamWidget* graphicsWidget; |     GPUCommandStreamWidget* graphicsWidget; | ||||||
|  |     GPUCommandListWidget* graphicsCommandsWidget; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #endif // _CITRA_QT_MAIN_HXX_
 | #endif // _CITRA_QT_MAIN_HXX_
 | ||||||
|  |  | ||||||
|  | @ -57,7 +57,7 @@ public: | ||||||
|         * @param is_new true if the command list was called for the first time |         * @param is_new true if the command list was called for the first time | ||||||
|         * @todo figure out how to make sure called functions don't keep references around beyond their life time |         * @todo figure out how to make sure called functions don't keep references around beyond their life time | ||||||
|         */ |         */ | ||||||
|         virtual void CommandListCalled(const PicaCommandList& lst, bool is_new) |         virtual void OnCommandListCalled(const PicaCommandList& lst, bool is_new) | ||||||
|         { |         { | ||||||
|             ERROR_LOG(GSP, "Command list called: %d", (int)is_new); |             ERROR_LOG(GSP, "Command list called: %d", (int)is_new); | ||||||
|         } |         } | ||||||
|  | @ -106,7 +106,7 @@ public: | ||||||
|             command_lists.push_back(obj); |             command_lists.push_back(obj); | ||||||
| 
 | 
 | ||||||
|         ForEachObserver([&](DebuggerObserver* observer) { |         ForEachObserver([&](DebuggerObserver* observer) { | ||||||
|                             observer->CommandListCalled(obj.second, is_new); |                             observer->OnCommandListCalled(obj.second, is_new); | ||||||
|                         } ); |                         } ); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue