summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/citra_qt/bootmanager.cpp22
-rw-r--r--src/citra_qt/bootmanager.hxx5
-rw-r--r--src/citra_qt/main.cpp3
-rw-r--r--src/video_core/video_core.cpp1
4 files changed, 21 insertions, 10 deletions
diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index b0aa1e561..73f25e691 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -1,5 +1,6 @@
1#include <QHBoxLayout> 1#include <QHBoxLayout>
2#include <QKeyEvent> 2#include <QKeyEvent>
3#include <QApplication>
3 4
4#include "common/common.h" 5#include "common/common.h"
5#include "bootmanager.hxx" 6#include "bootmanager.hxx"
@@ -79,15 +80,11 @@ class GGLWidgetInternal : public QGLWidget
79public: 80public:
80 GGLWidgetInternal(QGLFormat fmt, GRenderWindow* parent) : QGLWidget(parent) 81 GGLWidgetInternal(QGLFormat fmt, GRenderWindow* parent) : QGLWidget(parent)
81 { 82 {
82 doneCurrent();
83 parent_ = parent; 83 parent_ = parent;
84 } 84 }
85 85
86 void paintEvent(QPaintEvent* ev) 86 void paintEvent(QPaintEvent* ev)
87 { 87 {
88 // Apparently, Windows doesn't display anything if we don't call this here.
89 // TODO: Breaks linux though because we aren't calling doneCurrent() ... -.-
90// makeCurrent();
91 } 88 }
92 void resizeEvent(QResizeEvent* ev) { 89 void resizeEvent(QResizeEvent* ev) {
93 parent_->SetClientAreaWidth(size().width()); 90 parent_->SetClientAreaWidth(size().width());
@@ -118,10 +115,22 @@ GRenderWindow::GRenderWindow(QWidget* parent) : QWidget(parent), emu_thread(this
118 layout->addWidget(child); 115 layout->addWidget(child);
119 layout->setMargin(0); 116 layout->setMargin(0);
120 setLayout(layout); 117 setLayout(layout);
118 QObject::connect(&emu_thread, SIGNAL(started()), this, SLOT(moveContext()));
119 QObject::connect(&emu_thread, SIGNAL(finished()), this, SLOT(moveContext()));
121 120
122 BackupGeometry(); 121 BackupGeometry();
123} 122}
124 123
124void GRenderWindow::moveContext()
125{
126 DoneCurrent();
127 // We need to move GL context to the swapping thread in Qt5
128#if QT_VERSION > QT_VERSION_CHECK(5, 0, 0)
129 // If the thread started running, move the GL Context to the new thread. Otherwise, move it back.
130 child->context()->moveToThread(emu_thread.isRunning() ? &emu_thread : qApp->thread());
131#endif
132}
133
125GRenderWindow::~GRenderWindow() 134GRenderWindow::~GRenderWindow()
126{ 135{
127 emu_thread.Stop(); 136 emu_thread.Stop();
@@ -129,7 +138,7 @@ GRenderWindow::~GRenderWindow()
129 138
130void GRenderWindow::SwapBuffers() 139void GRenderWindow::SwapBuffers()
131{ 140{
132 child->makeCurrent(); // TODO: Not necessary? 141 // MakeCurrent is already called in renderer_opengl
133 child->swapBuffers(); 142 child->swapBuffers();
134} 143}
135 144
@@ -212,4 +221,5 @@ void GRenderWindow::keyReleaseEvent(QKeyEvent* event)
212 if (!key_processed) 221 if (!key_processed)
213 QWidget::keyPressEvent(event); 222 QWidget::keyPressEvent(event);
214 */ 223 */
215} \ No newline at end of file 224}
225
diff --git a/src/citra_qt/bootmanager.hxx b/src/citra_qt/bootmanager.hxx
index b4005ccbb..c4a4299b1 100644
--- a/src/citra_qt/bootmanager.hxx
+++ b/src/citra_qt/bootmanager.hxx
@@ -81,6 +81,8 @@ signals:
81 81
82class GRenderWindow : public QWidget, public EmuWindow 82class GRenderWindow : public QWidget, public EmuWindow
83{ 83{
84 Q_OBJECT
85
84public: 86public:
85 GRenderWindow(QWidget* parent = NULL); 87 GRenderWindow(QWidget* parent = NULL);
86 ~GRenderWindow(); 88 ~GRenderWindow();
@@ -103,6 +105,9 @@ public:
103 void keyPressEvent(QKeyEvent* event); 105 void keyPressEvent(QKeyEvent* event);
104 void keyReleaseEvent(QKeyEvent* event); 106 void keyReleaseEvent(QKeyEvent* event);
105 107
108private slots:
109 void moveContext();
110
106private: 111private:
107 QGLWidget* child; 112 QGLWidget* child;
108 113
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index e5190d48a..9a16cf92d 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -142,7 +142,6 @@ void GMainWindow::BootGame(std::string filename)
142 registersWidget->OnCPUStepped(); 142 registersWidget->OnCPUStepped();
143 callstackWidget->OnCPUStepped(); 143 callstackWidget->OnCPUStepped();
144 144
145 render_window->DoneCurrent(); // make sure EmuThread can access GL context
146 render_window->GetEmuThread().SetFilename(filename); 145 render_window->GetEmuThread().SetFilename(filename);
147 render_window->GetEmuThread().start(); 146 render_window->GetEmuThread().start();
148 147
@@ -204,7 +203,6 @@ void GMainWindow::ToggleWindowMode()
204 ui.horizontalLayout->removeWidget(render_window); 203 ui.horizontalLayout->removeWidget(render_window);
205 render_window->setParent(NULL); 204 render_window->setParent(NULL);
206 render_window->setVisible(true); 205 render_window->setVisible(true);
207 render_window->DoneCurrent();
208 render_window->RestoreGeometry(); 206 render_window->RestoreGeometry();
209 } 207 }
210 else if (!enable && render_window->parent() == NULL) 208 else if (!enable && render_window->parent() == NULL)
@@ -212,7 +210,6 @@ void GMainWindow::ToggleWindowMode()
212 render_window->BackupGeometry(); 210 render_window->BackupGeometry();
213 ui.horizontalLayout->addWidget(render_window); 211 ui.horizontalLayout->addWidget(render_window);
214 render_window->setVisible(true); 212 render_window->setVisible(true);
215 render_window->DoneCurrent();
216 } 213 }
217} 214}
218 215
diff --git a/src/video_core/video_core.cpp b/src/video_core/video_core.cpp
index 087b08026..a1c7b6339 100644
--- a/src/video_core/video_core.cpp
+++ b/src/video_core/video_core.cpp
@@ -36,7 +36,6 @@ void Init(EmuWindow* emu_window) {
36 glewExperimental = GL_TRUE; 36 glewExperimental = GL_TRUE;
37 37
38 g_emu_window = emu_window; 38 g_emu_window = emu_window;
39 g_emu_window->MakeCurrent();
40 g_renderer = new RendererOpenGL(); 39 g_renderer = new RendererOpenGL();
41 g_renderer->SetWindow(g_emu_window); 40 g_renderer->SetWindow(g_emu_window);
42 g_renderer->Init(); 41 g_renderer->Init();