summaryrefslogtreecommitdiffstats
path: root/src/citra_qt/bootmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/citra_qt/bootmanager.cpp')
-rw-r--r--src/citra_qt/bootmanager.cpp48
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
+}
+