From d2115bc5e42975aea705b4e27144a80433ae5f7b Mon Sep 17 00:00:00 2001 From: "Joakim L. Gilje" Date: Wed, 15 Dec 2021 19:58:09 +0100 Subject: [PATCH] init the renderer on demand, instead of always ready --- src/qt/qt_mainwindow.cpp | 17 +++++-------- src/qt/qt_mainwindow.ui | 9 +------ src/qt/qt_rendererstack.cpp | 49 +++++++++++++++++++++++++++---------- src/qt/qt_rendererstack.hpp | 12 ++++++--- 4 files changed, 52 insertions(+), 35 deletions(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index ad3e950f6..ac2dcaecc 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; } @@ -225,9 +223,6 @@ MainWindow::MainWindow(QWidget *parent) : } 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); @@ -964,21 +959,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 fed414d12..843e84909 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -162,6 +162,42 @@ void RendererStack::leaveEvent(QEvent* event) event->accept(); } +void RendererStack::switchRenderer(Renderer renderer) { + startblit(); + if (current != nullptr) { + removeWidget(current); + } + + switch (renderer) { + case Renderer::Software: + { + auto sw = new SoftwareRenderer(this); + connect(this, &RendererStack::blitToRenderer, sw, &SoftwareRenderer::onBlit); + current = sw; + } + break; + case Renderer::OpenGL: + { + auto hw = new HardwareRenderer(this); + connect(this, &RendererStack::blitToRenderer, hw, &HardwareRenderer::onBlit); + hw->setRenderType(HardwareRenderer::RenderType::OpenGL); + current = hw; + break; + } + case Renderer::OpenGLES: + { + auto hw = new HardwareRenderer(this); + connect(this, &RendererStack::blitToRenderer, hw, &HardwareRenderer::onBlit); + hw->setRenderType(HardwareRenderer::RenderType::OpenGLES); + current = hw; + break; + } + } + current->setFocusPolicy(Qt::NoFocus); + addWidget(current); + endblit(); +} + // called from blitter thread void RendererStack::blit(int x, int y, int w, int h) { @@ -185,16 +221,3 @@ void RendererStack::blit(int x, int y, int w, int h) blitToRenderer(imagebufs[currentBuf], sx, sy, sw, sh); 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); - break; - case 1: - case 2: - connect(this, &RendererStack::blitToRenderer, dynamic_cast(currentWidget()), &HardwareRenderer::onBlit); - break; - } -} diff --git a/src/qt/qt_rendererstack.hpp b/src/qt/qt_rendererstack.hpp index 239bd5bef..b31f3da5e 100644 --- a/src/qt/qt_rendererstack.hpp +++ b/src/qt/qt_rendererstack.hpp @@ -31,6 +31,13 @@ public: event->ignore(); } + enum class Renderer { + Software, + OpenGL, + OpenGLES, + }; + void switchRenderer(Renderer renderer); + signals: void blitToRenderer(const QImage& img, int, int, int, int); @@ -38,9 +45,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; @@ -57,6 +61,8 @@ private: // when calling bits(); int currentBuf = 0; QVector imagebufs; + + QWidget* current = nullptr; }; #endif // QT_RENDERERCONTAINER_HPP