Ver código fonte

Fix the threading for GL Context in Qt5.
Connect the emu_thread start/finish to a moveContext slot.

Sacha 12 anos atrás
pai
commit
a3a70e56ac

+ 16 - 6
src/citra_qt/bootmanager.cpp

@@ -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);
     */
-}
+}
+

+ 5 - 0
src/citra_qt/bootmanager.hxx

@@ -81,6 +81,8 @@ signals:
 
 class GRenderWindow : public QWidget, public EmuWindow
 {
+    Q_OBJECT
+
 public:
     GRenderWindow(QWidget* parent = NULL);
     ~GRenderWindow();
@@ -103,6 +105,9 @@ public:
     void keyPressEvent(QKeyEvent* event);
     void keyReleaseEvent(QKeyEvent* event);
 
+private slots:
+    void moveContext();
+
 private:
     QGLWidget* child;
 

+ 0 - 3
src/citra_qt/main.cpp

@@ -142,7 +142,6 @@ void GMainWindow::BootGame(std::string filename)
     registersWidget->OnCPUStepped();
     callstackWidget->OnCPUStepped();
 
-    render_window->DoneCurrent(); // make sure EmuThread can access GL context
     render_window->GetEmuThread().SetFilename(filename);
     render_window->GetEmuThread().start();
 
@@ -204,7 +203,6 @@ void GMainWindow::ToggleWindowMode()
         ui.horizontalLayout->removeWidget(render_window);
         render_window->setParent(NULL);
         render_window->setVisible(true);
-        render_window->DoneCurrent();
         render_window->RestoreGeometry();
     }
     else if (!enable && render_window->parent() == NULL)
@@ -212,7 +210,6 @@ void GMainWindow::ToggleWindowMode()
         render_window->BackupGeometry();
         ui.horizontalLayout->addWidget(render_window);
         render_window->setVisible(true);
-        render_window->DoneCurrent();
     }
 }
 

+ 0 - 1
src/video_core/video_core.cpp

@@ -36,7 +36,6 @@ void Init(EmuWindow* emu_window) {
     glewExperimental = GL_TRUE;
 
     g_emu_window = emu_window;
-    g_emu_window->MakeCurrent();
     g_renderer = new RendererOpenGL();
     g_renderer->SetWindow(g_emu_window);
     g_renderer->Init();