Compare commits

...

14 Commits

Author SHA1 Message Date
Gess1t
c8d0ea883f
Merge 58b456b9b7 into 4528441c74 2024-11-10 01:31:54 +01:00
Gess1t
58b456b9b7 Move getsupportedRenderers function to SupportedRenderers class 2024-11-01 03:10:54 +01:00
Gess1t
4b234bd161 Check length on glVersionStr 2024-10-30 23:18:30 +01:00
Gess1t
4677d9f7ea Change casing to comply with review 2024-10-30 23:18:14 +01:00
Gess1t
d34aed7ccd Uncheck OpenGL display when requirements aren't met
Also disable the vsync interval label to match other part of the UX
2024-10-28 19:23:43 +01:00
Gess1t
4f6679b821 Use cached variables instead of re-fetching from settings 2024-10-28 19:05:15 +01:00
Gess1t
f0986fd32d Remove redundant check when base requirements aren't met 2024-10-28 18:58:42 +01:00
Gess1t
7fa6f73b0c Set settings in cfg for use in setVsyncControlEnable 2024-10-28 05:08:44 +01:00
Gess1t
04357bddc8 Add missing fallback to software renderer for the Compute shader renderer 2024-10-28 05:07:45 +01:00
Gess1t
94a2bce37c Cache supported renderers 2024-10-28 05:03:57 +01:00
Gess1t
61afc57ff2 use setVsyncControlEnable instead for toggling vsync settings 2024-10-28 04:35:28 +01:00
Gess1t
7b516d6396 Add some comments in VideoSettingsDialog 2024-10-28 03:19:44 +01:00
Gess1t
bdcb7f6d26 Fix Vsync never being editable (from master) 2024-10-28 03:02:24 +01:00
Gess1t
54902989a1 Check if required renderer is available before disabling options 2024-10-28 03:01:43 +01:00
6 changed files with 153 additions and 1 deletions

View File

@ -31,6 +31,7 @@ set(SOURCES_QT_SDL
ROMInfoDialog.cpp
RAMInfoDialog.cpp
TitleManagerDialog.cpp
SupportedRenderers.cpp
OSD_shaders.h
font.h
Platform.cpp

View File

@ -0,0 +1,63 @@
#include "types.h"
#include "Platform.h"
#include "Config.h"
#include "GPU.h"
#include "main.h"
#include "SupportedRenderers.h"
SupportedRenderers* SupportedRenderers::instance = nullptr;
SupportedRenderers::SupportedRenderers(QWidget* parent)
{
if (SupportedRenderers::instance == nullptr)
instance = this;
software = true;
// OpenGL
setSupportedOpenGLRenderers(parent);
// Future renderers
}
SupportedRenderers::~SupportedRenderers() {}
void SupportedRenderers::setSupportedOpenGLRenderers(QWidget* parent)
{
ScreenPanelGL *glPanel = new ScreenPanelGL(parent);
std::optional<WindowInfo> windowInfo = glPanel->getWindowInfo();
if (windowInfo.has_value())
{
std::array<GL::Context::Version, 2> versionsToTry = {
GL::Context::Version{GL::Context::Profile::Core, 4, 3},
GL::Context::Version{GL::Context::Profile::Core, 3, 2}
};
std::unique_ptr<GL::Context> glContext = GL::Context::Create(*windowInfo, versionsToTry);
if (glContext)
{
const char* glVersionStr = reinterpret_cast<const char*>(glGetString(GL_VERSION));
if (glVersionStr && strlen(glVersionStr) >= 3)
{
int gl_version = 0;
// A proper version string or object isn't provided, so we have to parse it ourselves
if (isdigit(glVersionStr[0]) && isdigit(glVersionStr[2]))
gl_version = (glVersionStr[0] - '0') * 100 +
(glVersionStr[2] - '0') * 10;
// OpenGL 4.3 is required for Compute Shaders while 3.2 is the base requirement
if (gl_version >= 430)
computeGl = true;
if (gl_version >= 320)
baseGl = true;
}
}
}
delete glPanel;
}

View File

@ -0,0 +1,52 @@
/*
Copyright 2016-2024 melonDS team
This file is part of melonDS.
melonDS is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option)
any later version.
melonDS is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with melonDS. If not, see http://www.gnu.org/licenses/.
*/
#ifndef SUPPORTEDRENDERERS_H
#define SUPPORTEDRENDERERS_H
using namespace melonDS;
#include "glad/glad.h"
#include <QApplication>
#include "EmuInstance.h"
class SupportedRenderers
{
public:
explicit SupportedRenderers(QWidget* parent);
~SupportedRenderers();
static SupportedRenderers* instance;
// Software
bool software;
// OpenGL
bool baseGl;
bool computeGl;
// Future renderers
private:
void setSupportedOpenGLRenderers(QWidget* parent);
};
#endif // SUPPORTEDRENDERERS_H

View File

@ -24,6 +24,7 @@
#include "Config.h"
#include "GPU.h"
#include "main.h"
#include "SupportedRenderers.h"
#include "VideoSettingsDialog.h"
#include "ui_VideoSettingsDialog.h"
@ -39,11 +40,39 @@ VideoSettingsDialog* VideoSettingsDialog::currentDlg = nullptr;
void VideoSettingsDialog::setEnabled()
{
bool baseGl = SupportedRenderers::instance->baseGl;
bool computeGl = SupportedRenderers::instance->computeGl;
auto& cfg = emuInstance->getGlobalConfig();
int renderer = cfg.GetInt("3D.Renderer");
int oglDisplay = cfg.GetBool("Screen.UseGL");
if (!computeGl)
{
ui->rb3DCompute->setEnabled(false);
if (renderer == renderer3D_OpenGLCompute) // fallback to software renderer
{
ui->rb3DSoftware->setChecked(true);
renderer = renderer3D_Software;
}
}
if (!baseGl) // fallback to software renderer
{
renderer = renderer3D_Software;
oglDisplay = false;
ui->rb3DOpenGL->setEnabled(false);
ui->cbGLDisplay->setChecked(false);
ui->rb3DSoftware->setChecked(true);
}
cfg.SetInt("3D.Renderer", renderer);
cfg.SetBool("Screen.UseGL", oglDisplay);
bool softwareRenderer = renderer == renderer3D_Software;
ui->cbGLDisplay->setEnabled(softwareRenderer);
ui->cbGLDisplay->setEnabled(softwareRenderer && baseGl);
setVsyncControlEnable(oglDisplay || !softwareRenderer);
ui->cbSoftwareThreaded->setEnabled(softwareRenderer);
ui->cbxGLResolution->setEnabled(!softwareRenderer);
ui->cbBetterPolygons->setEnabled(renderer == renderer3D_OpenGL);
@ -146,6 +175,7 @@ void VideoSettingsDialog::on_VideoSettingsDialog_rejected()
void VideoSettingsDialog::setVsyncControlEnable(bool hasOGL)
{
ui->label_2->setEnabled(hasOGL);
ui->cbVSync->setEnabled(hasOGL);
ui->sbVSyncInterval->setEnabled(hasOGL);
}

View File

@ -74,6 +74,7 @@ private slots:
private:
void setVsyncControlEnable(bool hasOGL);
void setEnabled();
int getsupportedRenderers();
Ui::VideoSettingsDialog* ui;
EmuInstance* emuInstance;

View File

@ -83,6 +83,7 @@
#include "CameraManager.h"
#include "Window.h"
#include "AboutDialog.h"
#include "SupportedRenderers.h"
using namespace melonDS;
@ -694,6 +695,10 @@ MainWindow::MainWindow(int id, EmuInstance* inst, QWidget* parent) :
// if the window was closed in fullscreen do not restore this
setWindowState(windowState() & ~Qt::WindowFullScreen);
}
if (id == 0 && SupportedRenderers::instance == nullptr)
SupportedRenderers* renderers = new SupportedRenderers(this);
show();
panel = nullptr;