mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00: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
					
				
					 4 changed files with 21 additions and 10 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue