Fix the threading for GL Context in Qt5.

Connect the emu_thread start/finish to a moveContext slot.
This commit is contained in:
Sacha 2014-08-25 00:47:00 +10:00
parent fab2f28ea5
commit a3a70e56ac
4 changed files with 21 additions and 10 deletions

View file

@ -1,5 +1,6 @@
#include <QHBoxLayout>
#include <QKeyEvent>
#include <QApplication>
#include "common/common.h"
#include "bootmanager.hxx"
@ -79,15 +80,11 @@ class GGLWidgetInternal : public QGLWidget
public:
GGLWidgetInternal(QGLFormat fmt, GRenderWindow* parent) : QGLWidget(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,10 +115,22 @@ 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()));
QObject::connect(&emu_thread, SIGNAL(finished()), 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(emu_thread.isRunning() ? &emu_thread : qApp->thread());
#endif
}
GRenderWindow::~GRenderWindow()
{
emu_thread.Stop();
@ -129,7 +138,7 @@ GRenderWindow::~GRenderWindow()
void GRenderWindow::SwapBuffers()
{
child->makeCurrent(); // TODO: Not necessary?
// MakeCurrent is already called in renderer_opengl
child->swapBuffers();
}
@ -212,4 +221,5 @@ void GRenderWindow::keyReleaseEvent(QKeyEvent* event)
if (!key_processed)
QWidget::keyPressEvent(event);
*/
}
}