diff options
Diffstat (limited to 'src/citra_qt/bootmanager.cpp')
-rw-r--r-- | src/citra_qt/bootmanager.cpp | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp index b0aa1e561..573060d30 100644 --- a/src/citra_qt/bootmanager.cpp +++ b/src/citra_qt/bootmanager.cpp @@ -1,5 +1,6 @@ #include <QHBoxLayout> #include <QKeyEvent> +#include <QApplication> #include "common/common.h" #include "bootmanager.hxx" @@ -19,7 +20,8 @@ EmuThread::EmuThread(GRenderWindow* render_window) : exec_cpu_step(false), cpu_running(false), - render_window(render_window), filename("") + render_window(render_window), filename(""), + stop_run(false) { } @@ -30,7 +32,8 @@ void EmuThread::SetFilename(std::string filename) void EmuThread::run() { - while (true) + stop_run = false; + while (!stop_run) { for (int tight_loop = 0; tight_loop < 10000; ++tight_loop) { @@ -40,11 +43,14 @@ void EmuThread::run() exec_cpu_step = false; Core::SingleStep(); - if (!cpu_running) + if (!cpu_running) { emit CPUStepped(); + yieldCurrentThread(); + } } } } + render_window->moveContext(); Core::Stop(); } @@ -56,17 +62,21 @@ void EmuThread::Stop() INFO_LOG(MASTER_LOG, "EmuThread::Stop called while emu thread wasn't running, returning..."); return; } + stop_run = true; //core::g_state = core::SYS_DIE; - wait(1000); + wait(500); if (isRunning()) { WARN_LOG(MASTER_LOG, "EmuThread still running, terminating..."); - terminate(); + quit(); wait(1000); if (isRunning()) + { WARN_LOG(MASTER_LOG, "EmuThread STILL running, something is wrong here..."); + terminate(); + } } INFO_LOG(MASTER_LOG, "EmuThread stopped"); } @@ -77,17 +87,13 @@ void EmuThread::Stop() class GGLWidgetInternal : public QGLWidget { public: - GGLWidgetInternal(QGLFormat fmt, GRenderWindow* parent) : QGLWidget(parent) + GGLWidgetInternal(QGLFormat fmt, GRenderWindow* parent) : QGLWidget(fmt, parent) { - doneCurrent(); parent_ = parent; } void paintEvent(QPaintEvent* ev) { - // Apparently, Windows doesn't display anything if we don't call this here. - // TODO: Breaks linux though because we aren't calling doneCurrent() ... -.- -// makeCurrent(); } void resizeEvent(QResizeEvent* ev) { parent_->SetClientAreaWidth(size().width()); @@ -118,24 +124,37 @@ GRenderWindow::GRenderWindow(QWidget* parent) : QWidget(parent), emu_thread(this layout->addWidget(child); layout->setMargin(0); setLayout(layout); + QObject::connect(&emu_thread, SIGNAL(started()), this, SLOT(moveContext())); BackupGeometry(); } +void GRenderWindow::moveContext() +{ + DoneCurrent(); + // We need to move GL context to the swapping thread in Qt5 +#if QT_VERSION > QT_VERSION_CHECK(5, 0, 0) + // If the thread started running, move the GL Context to the new thread. Otherwise, move it back. + child->context()->moveToThread((QThread::currentThread() == qApp->thread()) ? &emu_thread : qApp->thread()); +#endif +} + GRenderWindow::~GRenderWindow() { - emu_thread.Stop(); + if (emu_thread.isRunning()) + emu_thread.Stop(); } void GRenderWindow::SwapBuffers() { - child->makeCurrent(); // TODO: Not necessary? + // MakeCurrent is already called in renderer_opengl child->swapBuffers(); } void GRenderWindow::closeEvent(QCloseEvent* event) { - emu_thread.Stop(); + if (emu_thread.isRunning()) + emu_thread.Stop(); QWidget::closeEvent(event); } @@ -212,4 +231,5 @@ void GRenderWindow::keyReleaseEvent(QKeyEvent* event) if (!key_processed) QWidget::keyPressEvent(event); */ -}
\ No newline at end of file +} + |