init the renderer on demand, instead of always ready
This commit is contained in:
@@ -55,8 +55,6 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
|
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
ui->stackedWidget->setMouseTracking(true);
|
ui->stackedWidget->setMouseTracking(true);
|
||||||
ui->ogl->setRenderType(HardwareRenderer::RenderType::OpenGL);
|
|
||||||
ui->gles->setRenderType(HardwareRenderer::RenderType::OpenGLES);
|
|
||||||
statusBar()->setVisible(!hide_status_bar);
|
statusBar()->setVisible(!hide_status_bar);
|
||||||
|
|
||||||
this->setWindowIcon(QIcon(":/settings/win/icons/86Box-yellow.ico"));
|
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);
|
ui->actionUpdate_status_bar_icons->setChecked(update_icons);
|
||||||
switch (vid_api) {
|
switch (vid_api) {
|
||||||
case 0:
|
case 0:
|
||||||
ui->stackedWidget->setCurrentIndex(0);
|
ui->stackedWidget->switchRenderer(RendererStack::Renderer::Software);
|
||||||
ui->actionSoftware_Renderer->setChecked(true);
|
ui->actionSoftware_Renderer->setChecked(true);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
ui->stackedWidget->setCurrentIndex(1);
|
ui->stackedWidget->switchRenderer(RendererStack::Renderer::OpenGL);
|
||||||
ui->actionHardware_Renderer_OpenGL->setChecked(true);
|
ui->actionHardware_Renderer_OpenGL->setChecked(true);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
ui->stackedWidget->setCurrentIndex(2);
|
ui->stackedWidget->switchRenderer(RendererStack::Renderer::OpenGLES);
|
||||||
ui->actionHardware_Renderer_OpenGL_ES->setChecked(true);
|
ui->actionHardware_Renderer_OpenGL_ES->setChecked(true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -225,9 +223,6 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
setFocusPolicy(Qt::StrongFocus);
|
setFocusPolicy(Qt::StrongFocus);
|
||||||
ui->gles->setFocusPolicy(Qt::NoFocus);
|
|
||||||
ui->sw->setFocusPolicy(Qt::NoFocus);
|
|
||||||
ui->ogl->setFocusPolicy(Qt::NoFocus);
|
|
||||||
ui->stackedWidget->setFocusPolicy(Qt::NoFocus);
|
ui->stackedWidget->setFocusPolicy(Qt::NoFocus);
|
||||||
ui->centralwidget->setFocusPolicy(Qt::NoFocus);
|
ui->centralwidget->setFocusPolicy(Qt::NoFocus);
|
||||||
menuBar()->setFocusPolicy(Qt::NoFocus);
|
menuBar()->setFocusPolicy(Qt::NoFocus);
|
||||||
@@ -964,21 +959,21 @@ QSize MainWindow::getRenderWidgetSize()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionSoftware_Renderer_triggered() {
|
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->setChecked(false);
|
||||||
ui->actionHardware_Renderer_OpenGL_ES->setChecked(false);
|
ui->actionHardware_Renderer_OpenGL_ES->setChecked(false);
|
||||||
vid_api = 0;
|
vid_api = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionHardware_Renderer_OpenGL_triggered() {
|
void MainWindow::on_actionHardware_Renderer_OpenGL_triggered() {
|
||||||
ui->stackedWidget->setCurrentIndex(1);
|
ui->stackedWidget->switchRenderer(RendererStack::Renderer::OpenGL);
|
||||||
ui->actionSoftware_Renderer->setChecked(false);
|
ui->actionSoftware_Renderer->setChecked(false);
|
||||||
ui->actionHardware_Renderer_OpenGL_ES->setChecked(false);
|
ui->actionHardware_Renderer_OpenGL_ES->setChecked(false);
|
||||||
vid_api = 1;
|
vid_api = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::on_actionHardware_Renderer_OpenGL_ES_triggered() {
|
void MainWindow::on_actionHardware_Renderer_OpenGL_ES_triggered() {
|
||||||
ui->stackedWidget->setCurrentIndex(2);
|
ui->stackedWidget->switchRenderer(RendererStack::Renderer::OpenGLES);
|
||||||
ui->actionSoftware_Renderer->setChecked(false);
|
ui->actionSoftware_Renderer->setChecked(false);
|
||||||
ui->actionHardware_Renderer_OpenGL->setChecked(false);
|
ui->actionHardware_Renderer_OpenGL->setChecked(false);
|
||||||
vid_api = 2;
|
vid_api = 2;
|
||||||
|
@@ -37,14 +37,7 @@
|
|||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="RendererStack" name="stackedWidget">
|
<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>
|
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
@@ -162,6 +162,42 @@ void RendererStack::leaveEvent(QEvent* event)
|
|||||||
event->accept();
|
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
|
// called from blitter thread
|
||||||
void RendererStack::blit(int x, int y, int w, int h)
|
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);
|
blitToRenderer(imagebufs[currentBuf], sx, sy, sw, sh);
|
||||||
currentBuf = (currentBuf + 1) % 2;
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -31,6 +31,13 @@ public:
|
|||||||
event->ignore();
|
event->ignore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum class Renderer {
|
||||||
|
Software,
|
||||||
|
OpenGL,
|
||||||
|
OpenGLES,
|
||||||
|
};
|
||||||
|
void switchRenderer(Renderer renderer);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void blitToRenderer(const QImage& img, int, int, int, int);
|
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 blit(int x, int y, int w, int h);
|
||||||
void mousePoll();
|
void mousePoll();
|
||||||
|
|
||||||
private slots:
|
|
||||||
void on_RendererStack_currentChanged(int arg1);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::RendererStack *ui;
|
Ui::RendererStack *ui;
|
||||||
|
|
||||||
@@ -57,6 +61,8 @@ private:
|
|||||||
// when calling bits();
|
// when calling bits();
|
||||||
int currentBuf = 0;
|
int currentBuf = 0;
|
||||||
QVector<QImage> imagebufs;
|
QVector<QImage> imagebufs;
|
||||||
|
|
||||||
|
QWidget* current = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QT_RENDERERCONTAINER_HPP
|
#endif // QT_RENDERERCONTAINER_HPP
|
||||||
|
Reference in New Issue
Block a user