init the renderer on demand, instead of always ready

This commit is contained in:
Joakim L. Gilje
2021-12-15 19:58:09 +01:00
parent cf79387f35
commit d2115bc5e4
4 changed files with 52 additions and 35 deletions

View File

@@ -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;

View File

@@ -37,14 +37,7 @@
<number>0</number>
</property>
<item>
<widget class="RendererStack" name="stackedWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="SoftwareRenderer" name="sw"/>
<widget class="HardwareRenderer" name="ogl"/>
<widget class="HardwareRenderer" name="gles"/>
</widget>
<widget class="RendererStack" name="stackedWidget" />
</item>
</layout>
</widget>

View File

@@ -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<SoftwareRenderer*>(currentWidget()), &SoftwareRenderer::onBlit);
break;
case 1:
case 2:
connect(this, &RendererStack::blitToRenderer, dynamic_cast<HardwareRenderer*>(currentWidget()), &HardwareRenderer::onBlit);
break;
}
}

View File

@@ -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<QImage> imagebufs;
QWidget* current = nullptr;
};
#endif // QT_RENDERERCONTAINER_HPP