summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2015-04-16 18:35:09 -0400
committerGravatar bunnei2015-05-01 18:26:58 -0400
commit762c1a9ff5406afc4c6b1a3eb74dae2dc2fb0daf (patch)
tree74ac7be2a6f1b3dfd09986b598844440af9e2f8f /src
parentMerge pull request #717 from linkmauve/useless-auto (diff)
downloadyuzu-762c1a9ff5406afc4c6b1a3eb74dae2dc2fb0daf.tar.gz
yuzu-762c1a9ff5406afc4c6b1a3eb74dae2dc2fb0daf.tar.xz
yuzu-762c1a9ff5406afc4c6b1a3eb74dae2dc2fb0daf.zip
Qt: Move EmuThread ownership from render window to main window.
Diffstat (limited to 'src')
-rw-r--r--src/citra_qt/bootmanager.cpp27
-rw-r--r--src/citra_qt/bootmanager.h14
-rw-r--r--src/citra_qt/debugger/disassembler.cpp18
-rw-r--r--src/citra_qt/debugger/disassembler.h6
-rw-r--r--src/citra_qt/main.cpp55
-rw-r--r--src/citra_qt/main.h6
6 files changed, 57 insertions, 69 deletions
diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index b81bd6167..50c8fed1e 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -10,6 +10,7 @@
10 10
11#include "common/common.h" 11#include "common/common.h"
12#include "bootmanager.h" 12#include "bootmanager.h"
13#include "main.h"
13 14
14#include "core/core.h" 15#include "core/core.h"
15#include "core/settings.h" 16#include "core/settings.h"
@@ -30,6 +31,7 @@ EmuThread::EmuThread(GRenderWindow* render_window) :
30 filename(""), exec_cpu_step(false), cpu_running(false), 31 filename(""), exec_cpu_step(false), cpu_running(false),
31 stop_run(false), render_window(render_window) 32 stop_run(false), render_window(render_window)
32{ 33{
34 connect(this, SIGNAL(started()), render_window, SLOT(moveContext()));
33} 35}
34 36
35void EmuThread::SetFilename(std::string filename) 37void EmuThread::SetFilename(std::string filename)
@@ -133,13 +135,9 @@ private:
133 GRenderWindow* parent; 135 GRenderWindow* parent;
134}; 136};
135 137
136EmuThread& GRenderWindow::GetEmuThread() 138GRenderWindow::GRenderWindow(QWidget* parent, GMainWindow& main_window) :
137{ 139 QWidget(parent), main_window(main_window), keyboard_id(0) {
138 return emu_thread;
139}
140 140
141GRenderWindow::GRenderWindow(QWidget* parent) : QWidget(parent), emu_thread(this), keyboard_id(0)
142{
143 std::string window_title = Common::StringFromFormat("Citra | %s-%s", Common::g_scm_branch, Common::g_scm_desc); 141 std::string window_title = Common::StringFromFormat("Citra | %s-%s", Common::g_scm_branch, Common::g_scm_desc);
144 setWindowTitle(QString::fromStdString(window_title)); 142 setWindowTitle(QString::fromStdString(window_title));
145 143
@@ -160,7 +158,6 @@ GRenderWindow::GRenderWindow(QWidget* parent) : QWidget(parent), emu_thread(this
160 layout->addWidget(child); 158 layout->addWidget(child);
161 layout->setMargin(0); 159 layout->setMargin(0);
162 setLayout(layout); 160 setLayout(layout);
163 connect(&emu_thread, SIGNAL(started()), this, SLOT(moveContext()));
164 161
165 OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size); 162 OnMinimalClientAreaChangeRequest(GetActiveConfig().min_client_area_size);
166 163
@@ -180,29 +177,17 @@ void GRenderWindow::moveContext()
180 // We need to move GL context to the swapping thread in Qt5 177 // We need to move GL context to the swapping thread in Qt5
181#if QT_VERSION > QT_VERSION_CHECK(5, 0, 0) 178#if QT_VERSION > QT_VERSION_CHECK(5, 0, 0)
182 // If the thread started running, move the GL Context to the new thread. Otherwise, move it back. 179 // If the thread started running, move the GL Context to the new thread. Otherwise, move it back.
183 child->context()->moveToThread((QThread::currentThread() == qApp->thread()) ? &emu_thread : qApp->thread()); 180 auto thread = QThread::currentThread() == qApp->thread() ? main_window.GetEmuThread() : qApp->thread();
181 child->context()->moveToThread(thread);
184#endif 182#endif
185} 183}
186 184
187GRenderWindow::~GRenderWindow()
188{
189 if (emu_thread.isRunning())
190 emu_thread.Stop();
191}
192
193void GRenderWindow::SwapBuffers() 185void GRenderWindow::SwapBuffers()
194{ 186{
195 // MakeCurrent is already called in renderer_opengl 187 // MakeCurrent is already called in renderer_opengl
196 child->swapBuffers(); 188 child->swapBuffers();
197} 189}
198 190
199void GRenderWindow::closeEvent(QCloseEvent* event)
200{
201 if (emu_thread.isRunning())
202 emu_thread.Stop();
203 QWidget::closeEvent(event);
204}
205
206void GRenderWindow::MakeCurrent() 191void GRenderWindow::MakeCurrent()
207{ 192{
208 child->makeCurrent(); 193 child->makeCurrent();
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h
index 288da45a1..d3eab6ec1 100644
--- a/src/citra_qt/bootmanager.h
+++ b/src/citra_qt/bootmanager.h
@@ -14,6 +14,7 @@ class QScreen;
14class QKeyEvent; 14class QKeyEvent;
15 15
16class GRenderWindow; 16class GRenderWindow;
17class GMainWindow;
17 18
18class EmuThread : public QThread 19class EmuThread : public QThread
19{ 20{
@@ -67,7 +68,7 @@ public slots:
67 void Stop(); 68 void Stop();
68 69
69private: 70private:
70 friend class GRenderWindow; 71 friend class GMainWindow;
71 72
72 EmuThread(GRenderWindow* render_window); 73 EmuThread(GRenderWindow* render_window);
73 74
@@ -100,10 +101,7 @@ class GRenderWindow : public QWidget, public EmuWindow
100 Q_OBJECT 101 Q_OBJECT
101 102
102public: 103public:
103 GRenderWindow(QWidget* parent = NULL); 104 GRenderWindow(QWidget* parent, GMainWindow& main_window);
104 ~GRenderWindow();
105
106 void closeEvent(QCloseEvent*) override;
107 105
108 // EmuWindow implementation 106 // EmuWindow implementation
109 void SwapBuffers() override; 107 void SwapBuffers() override;
@@ -116,8 +114,6 @@ public:
116 void restoreGeometry(const QByteArray& geometry); // overridden 114 void restoreGeometry(const QByteArray& geometry); // overridden
117 QByteArray saveGeometry(); // overridden 115 QByteArray saveGeometry(); // overridden
118 116
119 EmuThread& GetEmuThread();
120
121 void keyPressEvent(QKeyEvent* event) override; 117 void keyPressEvent(QKeyEvent* event) override;
122 void keyReleaseEvent(QKeyEvent* event) override; 118 void keyReleaseEvent(QKeyEvent* event) override;
123 119
@@ -139,10 +135,10 @@ private:
139 135
140 QGLWidget* child; 136 QGLWidget* child;
141 137
142 EmuThread emu_thread;
143
144 QByteArray geometry; 138 QByteArray geometry;
145 139
140 GMainWindow& main_window;
141
146 /// Device id of keyboard for use with KeyMap 142 /// Device id of keyboard for use with KeyMap
147 int keyboard_id; 143 int keyboard_id;
148}; 144};
diff --git a/src/citra_qt/debugger/disassembler.cpp b/src/citra_qt/debugger/disassembler.cpp
index f620687ae..b58edafe7 100644
--- a/src/citra_qt/debugger/disassembler.cpp
+++ b/src/citra_qt/debugger/disassembler.cpp
@@ -4,6 +4,7 @@
4 4
5#include "disassembler.h" 5#include "disassembler.h"
6 6
7#include "../main.h"
7#include "../bootmanager.h" 8#include "../bootmanager.h"
8#include "../hotkeys.h" 9#include "../hotkeys.h"
9 10
@@ -158,8 +159,9 @@ void DisassemblerModel::SetNextInstruction(unsigned int address) {
158 emit dataChanged(prev_index, prev_index); 159 emit dataChanged(prev_index, prev_index);
159} 160}
160 161
161DisassemblerWidget::DisassemblerWidget(QWidget* parent, EmuThread& emu_thread) : QDockWidget(parent), base_addr(0), emu_thread(emu_thread) 162DisassemblerWidget::DisassemblerWidget(QWidget* parent, GMainWindow& main_window) :
162{ 163 QDockWidget(parent), main_window(main_window), base_addr(0) {
164
163 disasm_ui.setupUi(this); 165 disasm_ui.setupUi(this);
164 166
165 model = new DisassemblerModel(this); 167 model = new DisassemblerModel(this);
@@ -199,7 +201,7 @@ void DisassemblerWidget::Init()
199 201
200void DisassemblerWidget::OnContinue() 202void DisassemblerWidget::OnContinue()
201{ 203{
202 emu_thread.SetCpuRunning(true); 204 main_window.GetEmuThread()->SetCpuRunning(true);
203} 205}
204 206
205void DisassemblerWidget::OnStep() 207void DisassemblerWidget::OnStep()
@@ -209,13 +211,13 @@ void DisassemblerWidget::OnStep()
209 211
210void DisassemblerWidget::OnStepInto() 212void DisassemblerWidget::OnStepInto()
211{ 213{
212 emu_thread.SetCpuRunning(false); 214 main_window.GetEmuThread()->SetCpuRunning(false);
213 emu_thread.ExecStep(); 215 main_window.GetEmuThread()->ExecStep();
214} 216}
215 217
216void DisassemblerWidget::OnPause() 218void DisassemblerWidget::OnPause()
217{ 219{
218 emu_thread.SetCpuRunning(false); 220 main_window.GetEmuThread()->SetCpuRunning(false);
219 221
220 // TODO: By now, the CPU might not have actually stopped... 222 // TODO: By now, the CPU might not have actually stopped...
221 if (Core::g_app_core) { 223 if (Core::g_app_core) {
@@ -225,7 +227,7 @@ void DisassemblerWidget::OnPause()
225 227
226void DisassemblerWidget::OnToggleStartStop() 228void DisassemblerWidget::OnToggleStartStop()
227{ 229{
228 emu_thread.SetCpuRunning(!emu_thread.IsCpuRunning()); 230 main_window.GetEmuThread()->SetCpuRunning(!main_window.GetEmuThread()->IsCpuRunning());
229} 231}
230 232
231void DisassemblerWidget::OnDebugModeEntered() 233void DisassemblerWidget::OnDebugModeEntered()
@@ -233,7 +235,7 @@ void DisassemblerWidget::OnDebugModeEntered()
233 ARMword next_instr = Core::g_app_core->GetPC(); 235 ARMword next_instr = Core::g_app_core->GetPC();
234 236
235 if (model->GetBreakPoints().IsAddressBreakPoint(next_instr)) 237 if (model->GetBreakPoints().IsAddressBreakPoint(next_instr))
236 emu_thread.SetCpuRunning(false); 238 main_window.GetEmuThread()->SetCpuRunning(false);
237 239
238 model->SetNextInstruction(next_instr); 240 model->SetNextInstruction(next_instr);
239 241
diff --git a/src/citra_qt/debugger/disassembler.h b/src/citra_qt/debugger/disassembler.h
index 5e19d7c51..d9e32dbdf 100644
--- a/src/citra_qt/debugger/disassembler.h
+++ b/src/citra_qt/debugger/disassembler.h
@@ -13,7 +13,7 @@
13#include "common/break_points.h" 13#include "common/break_points.h"
14 14
15class QAction; 15class QAction;
16class EmuThread; 16class GMainWindow;
17 17
18class DisassemblerModel : public QAbstractListModel 18class DisassemblerModel : public QAbstractListModel
19{ 19{
@@ -51,7 +51,7 @@ class DisassemblerWidget : public QDockWidget
51 Q_OBJECT 51 Q_OBJECT
52 52
53public: 53public:
54 DisassemblerWidget(QWidget* parent, EmuThread& emu_thread); 54 DisassemblerWidget(QWidget* parent, GMainWindow& main_window);
55 55
56 void Init(); 56 void Init();
57 57
@@ -75,5 +75,5 @@ private:
75 75
76 u32 base_addr; 76 u32 base_addr;
77 77
78 EmuThread& emu_thread; 78 GMainWindow& main_window;
79}; 79};
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index e5ca04124..0e57d9e18 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -46,7 +46,7 @@
46 46
47#include "version.h" 47#include "version.h"
48 48
49GMainWindow::GMainWindow() 49GMainWindow::GMainWindow() : emu_thread(nullptr)
50{ 50{
51 Pica::g_debug_context = Pica::DebugContext::Construct(); 51 Pica::g_debug_context = Pica::DebugContext::Construct();
52 52
@@ -55,14 +55,15 @@ GMainWindow::GMainWindow()
55 ui.setupUi(this); 55 ui.setupUi(this);
56 statusBar()->hide(); 56 statusBar()->hide();
57 57
58 render_window = new GRenderWindow; 58 render_window = new GRenderWindow(this, *this);
59 render_window->hide(); 59 render_window->hide();
60 emu_thread = new EmuThread(render_window);
60 61
61 profilerWidget = new ProfilerWidget(this); 62 profilerWidget = new ProfilerWidget(this);
62 addDockWidget(Qt::BottomDockWidgetArea, profilerWidget); 63 addDockWidget(Qt::BottomDockWidgetArea, profilerWidget);
63 profilerWidget->hide(); 64 profilerWidget->hide();
64 65
65 disasmWidget = new DisassemblerWidget(this, render_window->GetEmuThread()); 66 disasmWidget = new DisassemblerWidget(this, *this);
66 addDockWidget(Qt::BottomDockWidgetArea, disasmWidget); 67 addDockWidget(Qt::BottomDockWidgetArea, disasmWidget);
67 disasmWidget->hide(); 68 disasmWidget->hide();
68 69
@@ -139,13 +140,13 @@ GMainWindow::GMainWindow()
139 connect(ui.action_Hotkeys, SIGNAL(triggered()), this, SLOT(OnOpenHotkeysDialog())); 140 connect(ui.action_Hotkeys, SIGNAL(triggered()), this, SLOT(OnOpenHotkeysDialog()));
140 141
141 // BlockingQueuedConnection is important here, it makes sure we've finished refreshing our views before the CPU continues 142 // BlockingQueuedConnection is important here, it makes sure we've finished refreshing our views before the CPU continues
142 connect(&render_window->GetEmuThread(), SIGNAL(DebugModeEntered()), disasmWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection); 143 connect(emu_thread, SIGNAL(DebugModeEntered()), disasmWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection);
143 connect(&render_window->GetEmuThread(), SIGNAL(DebugModeEntered()), registersWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection); 144 connect(emu_thread, SIGNAL(DebugModeEntered()), registersWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection);
144 connect(&render_window->GetEmuThread(), SIGNAL(DebugModeEntered()), callstackWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection); 145 connect(emu_thread, SIGNAL(DebugModeEntered()), callstackWidget, SLOT(OnDebugModeEntered()), Qt::BlockingQueuedConnection);
145 146
146 connect(&render_window->GetEmuThread(), SIGNAL(DebugModeLeft()), disasmWidget, SLOT(OnDebugModeLeft()), Qt::BlockingQueuedConnection); 147 connect(emu_thread, SIGNAL(DebugModeLeft()), disasmWidget, SLOT(OnDebugModeLeft()), Qt::BlockingQueuedConnection);
147 connect(&render_window->GetEmuThread(), SIGNAL(DebugModeLeft()), registersWidget, SLOT(OnDebugModeLeft()), Qt::BlockingQueuedConnection); 148 connect(emu_thread, SIGNAL(DebugModeLeft()), registersWidget, SLOT(OnDebugModeLeft()), Qt::BlockingQueuedConnection);
148 connect(&render_window->GetEmuThread(), SIGNAL(DebugModeLeft()), callstackWidget, SLOT(OnDebugModeLeft()), Qt::BlockingQueuedConnection); 149 connect(emu_thread, SIGNAL(DebugModeLeft()), callstackWidget, SLOT(OnDebugModeLeft()), Qt::BlockingQueuedConnection);
149 150
150 // Setup hotkeys 151 // Setup hotkeys
151 RegisterHotkey("Main Window", "Load File", QKeySequence::Open); 152 RegisterHotkey("Main Window", "Load File", QKeySequence::Open);
@@ -210,8 +211,8 @@ void GMainWindow::BootGame(std::string filename)
210 registersWidget->OnDebugModeEntered(); 211 registersWidget->OnDebugModeEntered();
211 callstackWidget->OnDebugModeEntered(); 212 callstackWidget->OnDebugModeEntered();
212 213
213 render_window->GetEmuThread().SetFilename(filename); 214 emu_thread->SetFilename(filename);
214 render_window->GetEmuThread().start(); 215 emu_thread->start();
215 216
216 render_window->show(); 217 render_window->show();
217 OnStartGame(); 218 OnStartGame();
@@ -232,7 +233,7 @@ void GMainWindow::OnMenuLoadSymbolMap() {
232 233
233void GMainWindow::OnStartGame() 234void GMainWindow::OnStartGame()
234{ 235{
235 render_window->GetEmuThread().SetCpuRunning(true); 236 emu_thread->SetCpuRunning(true);
236 237
237 ui.action_Start->setEnabled(false); 238 ui.action_Start->setEnabled(false);
238 ui.action_Pause->setEnabled(true); 239 ui.action_Pause->setEnabled(true);
@@ -241,7 +242,7 @@ void GMainWindow::OnStartGame()
241 242
242void GMainWindow::OnPauseGame() 243void GMainWindow::OnPauseGame()
243{ 244{
244 render_window->GetEmuThread().SetCpuRunning(false); 245 emu_thread->SetCpuRunning(false);
245 246
246 ui.action_Start->setEnabled(true); 247 ui.action_Start->setEnabled(true);
247 ui.action_Pause->setEnabled(false); 248 ui.action_Pause->setEnabled(false);
@@ -250,7 +251,7 @@ void GMainWindow::OnPauseGame()
250 251
251void GMainWindow::OnStopGame() 252void GMainWindow::OnStopGame()
252{ 253{
253 render_window->GetEmuThread().SetCpuRunning(false); 254 emu_thread->SetCpuRunning(false);
254 // TODO: Shutdown core 255 // TODO: Shutdown core
255 256
256 ui.action_Start->setEnabled(true); 257 ui.action_Start->setEnabled(true);
@@ -265,24 +266,22 @@ void GMainWindow::OnOpenHotkeysDialog()
265} 266}
266 267
267 268
268void GMainWindow::ToggleWindowMode() 269void GMainWindow::ToggleWindowMode() {
269{ 270 if (ui.action_Single_Window_Mode->isChecked()) {
270 bool enable = ui.action_Single_Window_Mode->isChecked(); 271 // Render in the main window...
271 if (!enable && render_window->parent() != nullptr)
272 {
273 ui.horizontalLayout->removeWidget(render_window);
274 render_window->setParent(nullptr);
275 render_window->setVisible(true);
276 render_window->RestoreGeometry();
277 render_window->setFocusPolicy(Qt::NoFocus);
278 }
279 else if (enable && render_window->parent() == nullptr)
280 {
281 render_window->BackupGeometry(); 272 render_window->BackupGeometry();
282 ui.horizontalLayout->addWidget(render_window); 273 ui.horizontalLayout->addWidget(render_window);
283 render_window->setVisible(true); 274 render_window->setVisible(true);
284 render_window->setFocusPolicy(Qt::ClickFocus); 275 render_window->setFocusPolicy(Qt::ClickFocus);
285 render_window->setFocus(); 276 render_window->setFocus();
277
278 } else {
279 // Render in a separate window...
280 ui.horizontalLayout->removeWidget(render_window);
281 render_window->setParent(nullptr);
282 render_window->setVisible(true);
283 render_window->RestoreGeometry();
284 render_window->setFocusPolicy(Qt::NoFocus);
286 } 285 }
287} 286}
288 287
diff --git a/src/citra_qt/main.h b/src/citra_qt/main.h
index 9b57c5772..5b33ea962 100644
--- a/src/citra_qt/main.h
+++ b/src/citra_qt/main.h
@@ -11,6 +11,7 @@
11 11
12class GImageInfo; 12class GImageInfo;
13class GRenderWindow; 13class GRenderWindow;
14class EmuThread;
14class ProfilerWidget; 15class ProfilerWidget;
15class DisassemblerWidget; 16class DisassemblerWidget;
16class RegistersWidget; 17class RegistersWidget;
@@ -34,6 +35,10 @@ public:
34 GMainWindow(); 35 GMainWindow();
35 ~GMainWindow(); 36 ~GMainWindow();
36 37
38 EmuThread* GetEmuThread() {
39 return emu_thread;
40 }
41
37private: 42private:
38 void BootGame(std::string filename); 43 void BootGame(std::string filename);
39 44
@@ -54,6 +59,7 @@ private:
54 Ui::MainWindow ui; 59 Ui::MainWindow ui;
55 60
56 GRenderWindow* render_window; 61 GRenderWindow* render_window;
62 EmuThread* emu_thread;
57 63
58 ProfilerWidget* profilerWidget; 64 ProfilerWidget* profilerWidget;
59 DisassemblerWidget* disasmWidget; 65 DisassemblerWidget* disasmWidget;