From 3c150c4bdbdb0e3cb98cbec9c5beda6834e40767 Mon Sep 17 00:00:00 2001 From: Yuri Kunde Schlesner Date: Sat, 23 Aug 2014 18:08:09 -0300 Subject: [PATCH] Fix wrong threaded usage of OpenGL context. This fixes crashes on all platform when rendering to the screen. --- src/citra_qt/bootmanager.cpp | 13 +++++++------ src/citra_qt/bootmanager.hxx | 1 + src/citra_qt/main.cpp | 5 ++--- src/video_core/video_core.cpp | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp index b0aa1e561..8b6c5fb72 100644 --- a/src/citra_qt/bootmanager.cpp +++ b/src/citra_qt/bootmanager.cpp @@ -79,15 +79,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()); @@ -97,6 +93,12 @@ private: GRenderWindow* parent_; }; +void GRenderWindow::MoveContextToEmuThread() { + // This isn't required in Qt4 and moveToThread doesn't exist there +#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) + child->context()->moveToThread(&emu_thread); +#endif +} EmuThread& GRenderWindow::GetEmuThread() { @@ -129,7 +131,6 @@ GRenderWindow::~GRenderWindow() void GRenderWindow::SwapBuffers() { - child->makeCurrent(); // TODO: Not necessary? child->swapBuffers(); } @@ -212,4 +213,4 @@ void GRenderWindow::keyReleaseEvent(QKeyEvent* event) if (!key_processed) QWidget::keyPressEvent(event); */ -} \ No newline at end of file +} diff --git a/src/citra_qt/bootmanager.hxx b/src/citra_qt/bootmanager.hxx index b4005ccbb..8c4c31dd1 100644 --- a/src/citra_qt/bootmanager.hxx +++ b/src/citra_qt/bootmanager.hxx @@ -98,6 +98,7 @@ public: void restoreGeometry(const QByteArray& geometry); // overridden QByteArray saveGeometry(); // overridden + void MoveContextToEmuThread(); EmuThread& GetEmuThread(); void keyPressEvent(QKeyEvent* event); diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index e5190d48a..5001d28cd 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -142,7 +142,8 @@ void GMainWindow::BootGame(std::string filename) registersWidget->OnCPUStepped(); callstackWidget->OnCPUStepped(); - render_window->DoneCurrent(); // make sure EmuThread can access GL context + render_window->DoneCurrent(); + render_window->MoveContextToEmuThread(); render_window->GetEmuThread().SetFilename(filename); render_window->GetEmuThread().start(); @@ -204,7 +205,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 +212,6 @@ void GMainWindow::ToggleWindowMode() render_window->BackupGeometry(); ui.horizontalLayout->addWidget(render_window); render_window->setVisible(true); - render_window->DoneCurrent(); } } diff --git a/src/video_core/video_core.cpp b/src/video_core/video_core.cpp index 087b08026..8b907c195 100644 --- a/src/video_core/video_core.cpp +++ b/src/video_core/video_core.cpp @@ -36,7 +36,7 @@ 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();