mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-11-03 20:24:43 +01:00 
			
		
		
		
	Fix the threading for GL Context in Qt5.
Connect the emu_thread start/finish to a moveContext slot.
This commit is contained in:
		
							parent
							
								
									fab2f28ea5
								
							
						
					
					
						commit
						a3a70e56ac
					
				@ -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);
 | 
			
		||||
    */
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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();
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user