From 54902989a1806ce0921caa92ff22f773e55fafbc Mon Sep 17 00:00:00 2001 From: Gess1t Date: Mon, 28 Oct 2024 03:01:43 +0100 Subject: [PATCH] Check if required renderer is available before disabling options --- src/frontend/qt_sdl/VideoSettingsDialog.cpp | 66 ++++++++++++++++++++- src/frontend/qt_sdl/VideoSettingsDialog.h | 1 + 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/frontend/qt_sdl/VideoSettingsDialog.cpp b/src/frontend/qt_sdl/VideoSettingsDialog.cpp index 619ecda3..4efb5adf 100644 --- a/src/frontend/qt_sdl/VideoSettingsDialog.cpp +++ b/src/frontend/qt_sdl/VideoSettingsDialog.cpp @@ -41,15 +41,79 @@ void VideoSettingsDialog::setEnabled() { auto& cfg = emuInstance->getGlobalConfig(); int renderer = cfg.GetInt("3D.Renderer"); + int ogldisplay = cfg.GetBool("Screen.UseGL"); + + int supportedRenderer = getsupportedRenderers(); + + bool base_gl = supportedRenderer > renderer3D_Software; + bool compute_gl = supportedRenderer == renderer3D_OpenGLCompute; + + if (!compute_gl) + { + ui->rb3DCompute->setEnabled(false); + if (renderer == renderer3D_OpenGLCompute) // fallback to software renderer + ui->rb3DSoftware->setChecked(true); + } + + if (!base_gl) + { + renderer = renderer3D_Software; + ogldisplay = false; + + ui->rb3DOpenGL->setEnabled(false); + if (renderer == renderer3D_OpenGL) // fallback to software renderer + ui->rb3DSoftware->setChecked(true); + } bool softwareRenderer = renderer == renderer3D_Software; - ui->cbGLDisplay->setEnabled(softwareRenderer); + ui->cbGLDisplay->setEnabled(softwareRenderer && base_gl); ui->cbSoftwareThreaded->setEnabled(softwareRenderer); ui->cbxGLResolution->setEnabled(!softwareRenderer); ui->cbBetterPolygons->setEnabled(renderer == renderer3D_OpenGL); ui->cbxComputeHiResCoords->setEnabled(renderer == renderer3D_OpenGLCompute); } +int VideoSettingsDialog::getsupportedRenderers() +{ + ScreenPanelGL *glpanel = new ScreenPanelGL(this); + std::optional windowinfo = glpanel->getWindowInfo(); + + int renderer = renderer3D_Software; + + if (windowinfo.has_value()) + { + std::array versionsToTry = { + GL::Context::Version{GL::Context::Profile::Core, 4, 3}, + GL::Context::Version{GL::Context::Profile::Core, 3, 2} + }; + + std::unique_ptr glContext = GL::Context::Create(*windowinfo, versionsToTry); + + if (glContext) + { + const char* gl_version_str = reinterpret_cast(glGetString(GL_VERSION)); + + if (gl_version_str) + { + int gl_version = 0; + + if (isdigit(gl_version_str[0]) && isdigit(gl_version_str[2])) + gl_version = (gl_version_str[0] - '0') * 100 + + (gl_version_str[2] - '0') * 10; + + if (gl_version >= 430) + renderer = renderer3D_OpenGLCompute; + else if (gl_version >= 320) + renderer = renderer3D_OpenGL; + } + } + } + + delete glpanel; + + return renderer; +} + VideoSettingsDialog::VideoSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::VideoSettingsDialog) { ui->setupUi(this); diff --git a/src/frontend/qt_sdl/VideoSettingsDialog.h b/src/frontend/qt_sdl/VideoSettingsDialog.h index e7ba5cc7..dad58dd2 100644 --- a/src/frontend/qt_sdl/VideoSettingsDialog.h +++ b/src/frontend/qt_sdl/VideoSettingsDialog.h @@ -74,6 +74,7 @@ private slots: private: void setVsyncControlEnable(bool hasOGL); void setEnabled(); + int getsupportedRenderers(); Ui::VideoSettingsDialog* ui; EmuInstance* emuInstance;