Merge pull request #5320 from Cacodemon345/qt-openglrenderer-pcem

Port OpenGL 3.x renderer from PCem
This commit is contained in:
Miran Grča
2025-03-10 16:29:51 +01:00
committed by GitHub
31 changed files with 3307 additions and 1162 deletions

View File

@@ -62,6 +62,8 @@ extern int qt_nvr_save(void);
#ifdef MTR_ENABLED
# include <minitrace/minitrace.h>
#endif
extern bool cpu_thread_running;
};
#include <QGuiApplication>
@@ -452,6 +454,9 @@ MainWindow::MainWindow(QWidget *parent)
endblit();
}
#endif
case 6:
newVidApi = RendererStack::Renderer::OpenGL3PCem;
break;
}
ui->stackedWidget->switchRenderer(newVidApi);
if (!show_second_monitors)
@@ -779,6 +784,14 @@ MainWindow::closeEvent(QCloseEvent *event)
ui->stackedWidget->mouse_exit_func();
ui->stackedWidget->switchRenderer(RendererStack::Renderer::Software);
for (int i = 1; i < MONITORS_NUM; i++) {
if (renderers[i] && renderers[i]->isHidden()) {
renderers[i]->show();
QApplication::processEvents();
renderers[i]->switchRenderer(RendererStack::Renderer::Software);
QApplication::processEvents();
}
}
qt_nvr_save();
config_save();
@@ -1253,7 +1266,7 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event)
static auto curdopause = dopause;
if (event->type() == QEvent::WindowBlocked) {
curdopause = dopause;
plat_pause(1);
plat_pause(isShowMessage ? 2 : 1);
emit setMouseCapture(false);
} else if (event->type() == QEvent::WindowUnblocked) {
plat_pause(curdopause);
@@ -1277,7 +1290,11 @@ void
MainWindow::showMessage(int flags, const QString &header, const QString &message)
{
if (QThread::currentThread() == this->thread()) {
showMessage_(flags, header, message);
if (!cpu_thread_running) {
showMessageForNonQtThread(flags, header, message, nullptr);
}
else
showMessage_(flags, header, message);
} else {
std::atomic_bool done = false;
emit showMessageForNonQtThread(flags, header, message, &done);
@@ -1293,6 +1310,7 @@ MainWindow::showMessage_(int flags, const QString &header, const QString &messag
if (done) {
*done = false;
}
isShowMessage = true;
QMessageBox box(QMessageBox::Warning, header, message, QMessageBox::NoButton, this);
if (flags & (MBX_FATAL)) {
box.setIcon(QMessageBox::Critical);
@@ -1304,6 +1322,7 @@ MainWindow::showMessage_(int flags, const QString &header, const QString &messag
if (done) {
*done = true;
}
isShowMessage = false;
if (cpu_thread_run == 0)
QApplication::exit(-1);
}
@@ -1980,15 +1999,40 @@ MainWindow::changeEvent(QEvent *event)
}
}
void
MainWindow::reloadAllRenderers()
{
reload_renderers = true;
}
void
MainWindow::on_actionRenderer_options_triggered()
{
if (const auto dlg = ui->stackedWidget->getOptions(this)) {
if (dlg->exec() == QDialog::Accepted) {
for (int i = 1; i < MONITORS_NUM; i++) {
if (ui->stackedWidget->reloadRendererOption()) {
ui->stackedWidget->switchRenderer(static_cast<RendererStack::Renderer>(vid_api));
if (show_second_monitors) {
for (int i = 1; i < MONITORS_NUM; i++) {
if (renderers[i] && renderers[i]->reloadRendererOption() && renderers[i]->hasOptions()) {
ui->stackedWidget->switchRenderer(static_cast<RendererStack::Renderer>(vid_api));
}
}
}
} else for (int i = 1; i < MONITORS_NUM; i++) {
if (renderers[i] && renderers[i]->hasOptions())
renderers[i]->reloadOptions();
}
} else if (reload_renderers && ui->stackedWidget->reloadRendererOption()) {
reload_renderers = false;
ui->stackedWidget->switchRenderer(static_cast<RendererStack::Renderer>(vid_api));
if (show_second_monitors) {
for (int i = 1; i < MONITORS_NUM; i++) {
if (renderers[i] && renderers[i]->reloadRendererOption() && renderers[i]->hasOptions()) {
ui->stackedWidget->switchRenderer(static_cast<RendererStack::Renderer>(vid_api));
}
}
}
}
}
}