diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp
index f804d5444..64a589e63 100644
--- a/src/qt/qt_mainwindow.cpp
+++ b/src/qt/qt_mainwindow.cpp
@@ -55,8 +55,6 @@ MainWindow::MainWindow(QWidget *parent) :
ui->setupUi(this);
ui->stackedWidget->setMouseTracking(true);
- ui->ogl->setRenderType(HardwareRenderer::RenderType::OpenGL);
- ui->gles->setRenderType(HardwareRenderer::RenderType::OpenGLES);
statusBar()->setVisible(!hide_status_bar);
this->setWindowIcon(QIcon(":/settings/win/icons/86Box-yellow.ico"));
@@ -138,15 +136,15 @@ MainWindow::MainWindow(QWidget *parent) :
ui->actionUpdate_status_bar_icons->setChecked(update_icons);
switch (vid_api) {
case 0:
- ui->stackedWidget->setCurrentIndex(0);
+ ui->stackedWidget->switchRenderer(RendererStack::Renderer::Software);
ui->actionSoftware_Renderer->setChecked(true);
break;
case 1:
- ui->stackedWidget->setCurrentIndex(1);
+ ui->stackedWidget->switchRenderer(RendererStack::Renderer::OpenGL);
ui->actionHardware_Renderer_OpenGL->setChecked(true);
break;
case 2:
- ui->stackedWidget->setCurrentIndex(2);
+ ui->stackedWidget->switchRenderer(RendererStack::Renderer::OpenGLES);
ui->actionHardware_Renderer_OpenGL_ES->setChecked(true);
break;
}
@@ -230,9 +228,6 @@ MainWindow::MainWindow(QWidget *parent) :
#endif
setFocusPolicy(Qt::StrongFocus);
- ui->gles->setFocusPolicy(Qt::NoFocus);
- ui->sw->setFocusPolicy(Qt::NoFocus);
- ui->ogl->setFocusPolicy(Qt::NoFocus);
ui->stackedWidget->setFocusPolicy(Qt::NoFocus);
ui->centralwidget->setFocusPolicy(Qt::NoFocus);
menuBar()->setFocusPolicy(Qt::NoFocus);
@@ -977,21 +972,21 @@ QSize MainWindow::getRenderWidgetSize()
}
void MainWindow::on_actionSoftware_Renderer_triggered() {
- ui->stackedWidget->setCurrentIndex(0);
+ ui->stackedWidget->switchRenderer(RendererStack::Renderer::Software);
ui->actionHardware_Renderer_OpenGL->setChecked(false);
ui->actionHardware_Renderer_OpenGL_ES->setChecked(false);
vid_api = 0;
}
void MainWindow::on_actionHardware_Renderer_OpenGL_triggered() {
- ui->stackedWidget->setCurrentIndex(1);
+ ui->stackedWidget->switchRenderer(RendererStack::Renderer::OpenGL);
ui->actionSoftware_Renderer->setChecked(false);
ui->actionHardware_Renderer_OpenGL_ES->setChecked(false);
vid_api = 1;
}
void MainWindow::on_actionHardware_Renderer_OpenGL_ES_triggered() {
- ui->stackedWidget->setCurrentIndex(2);
+ ui->stackedWidget->switchRenderer(RendererStack::Renderer::OpenGLES);
ui->actionSoftware_Renderer->setChecked(false);
ui->actionHardware_Renderer_OpenGL->setChecked(false);
vid_api = 2;
diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui
index 49f3e7e43..35471ddc3 100644
--- a/src/qt/qt_mainwindow.ui
+++ b/src/qt/qt_mainwindow.ui
@@ -37,14 +37,7 @@
0
-
-
-
- 0
-
-
-
-
-
+
diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp
index 07546ea3a..b25cd2df1 100644
--- a/src/qt/qt_rendererstack.cpp
+++ b/src/qt/qt_rendererstack.cpp
@@ -167,6 +167,42 @@ void RendererStack::leaveEvent(QEvent* event)
event->accept();
}
+void RendererStack::switchRenderer(Renderer renderer) {
+ startblit();
+ if (current) {
+ removeWidget(current.get());
+ }
+
+ switch (renderer) {
+ case Renderer::Software:
+ {
+ auto sw = new SoftwareRenderer(this);
+ connect(this, &RendererStack::blitToRenderer, sw, &SoftwareRenderer::onBlit, Qt::QueuedConnection);
+ current.reset(sw);
+ }
+ break;
+ case Renderer::OpenGL:
+ {
+ auto hw = new HardwareRenderer(this);
+ connect(this, &RendererStack::blitToRenderer, hw, &HardwareRenderer::onBlit, Qt::QueuedConnection);
+ hw->setRenderType(HardwareRenderer::RenderType::OpenGL);
+ current.reset(hw);
+ break;
+ }
+ case Renderer::OpenGLES:
+ {
+ auto hw = new HardwareRenderer(this);
+ connect(this, &RendererStack::blitToRenderer, hw, &HardwareRenderer::onBlit, Qt::QueuedConnection);
+ hw->setRenderType(HardwareRenderer::RenderType::OpenGLES);
+ current.reset(hw);
+ break;
+ }
+ }
+ current->setFocusPolicy(Qt::NoFocus);
+ addWidget(current.get());
+ endblit();
+}
+
// called from blitter thread
void RendererStack::blit(int x, int y, int w, int h)
{
@@ -190,16 +226,3 @@ void RendererStack::blit(int x, int y, int w, int h)
blitToRenderer(imagebufs[currentBuf], sx, sy, sw, sh, &buffers_in_use[currentBuf]);
currentBuf = (currentBuf + 1) % 2;
}
-
-void RendererStack::on_RendererStack_currentChanged(int arg1) {
- disconnect(this, &RendererStack::blitToRenderer, nullptr, nullptr);
- switch (arg1) {
- case 0:
- connect(this, &RendererStack::blitToRenderer, dynamic_cast(currentWidget()), &SoftwareRenderer::onBlit, Qt::QueuedConnection);
- break;
- case 1:
- case 2:
- connect(this, &RendererStack::blitToRenderer, dynamic_cast(currentWidget()), &HardwareRenderer::onBlit, Qt::QueuedConnection);
- break;
- }
-}
diff --git a/src/qt/qt_rendererstack.hpp b/src/qt/qt_rendererstack.hpp
index b54db0390..2d987aa1e 100644
--- a/src/qt/qt_rendererstack.hpp
+++ b/src/qt/qt_rendererstack.hpp
@@ -4,6 +4,7 @@
#include
#include
#include
+#include
#include
#include
@@ -33,6 +34,13 @@ public:
event->ignore();
}
+ enum class Renderer {
+ Software,
+ OpenGL,
+ OpenGLES,
+ };
+ void switchRenderer(Renderer renderer);
+
signals:
void blitToRenderer(const QImage& img, int, int, int, int, std::atomic_flag* in_use);
@@ -40,9 +48,6 @@ public slots:
void blit(int x, int y, int w, int h);
void mousePoll();
-private slots:
- void on_RendererStack_currentChanged(int arg1);
-
private:
Ui::RendererStack *ui;
@@ -60,6 +65,8 @@ private:
int currentBuf = 0;
QVector imagebufs;
+ std::unique_ptr current;
+
/* atomic flag for each buffer to not overload the renderer */
std::vector buffers_in_use;
};