aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/GPU.cpp78
-rw-r--r--src/GPU.h22
-rw-r--r--src/GPU2D.cpp14
-rw-r--r--src/GPU2D.h2
-rw-r--r--src/GPU3D.cpp57
-rw-r--r--src/GPU3D.h7
-rw-r--r--src/GPU3D_OpenGL.cpp17
-rw-r--r--src/GPU3D_Soft.cpp10
-rw-r--r--src/GPU_OpenGL.cpp39
-rw-r--r--src/frontend/qt_sdl/AudioSettingsDialog.ui9
-rw-r--r--src/frontend/qt_sdl/VideoSettingsDialog.cpp79
-rw-r--r--src/frontend/qt_sdl/VideoSettingsDialog.h9
-rw-r--r--src/frontend/qt_sdl/VideoSettingsDialog.ui9
-rw-r--r--src/frontend/qt_sdl/main.cpp152
-rw-r--r--src/frontend/qt_sdl/main.h5
15 files changed, 342 insertions, 167 deletions
diff --git a/src/GPU.cpp b/src/GPU.cpp
index 993086e..56db0e2 100644
--- a/src/GPU.cpp
+++ b/src/GPU.cpp
@@ -78,6 +78,7 @@ u8* VRAMPtr_BOBJ[0x8];
int FrontBuffer;
u32* Framebuffer[2][2];
+int Renderer;
bool Accelerated;
GPU2D* GPU2D_A;
@@ -93,8 +94,8 @@ bool Init()
FrontBuffer = 0;
Framebuffer[0][0] = NULL; Framebuffer[0][1] = NULL;
Framebuffer[1][0] = NULL; Framebuffer[1][1] = NULL;
+ Renderer = 0;
Accelerated = false;
- SetDisplaySettings(false);
return true;
}
@@ -182,6 +183,8 @@ void Reset()
int backbuf = FrontBuffer ? 0 : 1;
GPU2D_A->SetFramebuffer(Framebuffer[backbuf][1]);
GPU2D_B->SetFramebuffer(Framebuffer[backbuf][0]);
+
+ ResetRenderer();
}
void Stop()
@@ -274,8 +277,65 @@ void AssignFramebuffers()
}
}
-void SetDisplaySettings(bool accel)
+void InitRenderer(int renderer)
+{
+ if (renderer == 1)
+ {
+ if (!GLCompositor::Init())
+ {
+ renderer = 0;
+ }
+ else if (!GPU3D::GLRenderer::Init())
+ {
+ GLCompositor::DeInit();
+ renderer = 0;
+ }
+ }
+
+ if (renderer == 0)
+ {
+ GPU3D::SoftRenderer::Init();
+ }
+
+ Renderer = renderer;
+ Accelerated = renderer != 0;
+}
+
+void DeInitRenderer()
+{
+ if (Renderer == 0)
+ {
+ GPU3D::SoftRenderer::DeInit();
+ }
+ else
+ {
+ GPU3D::GLRenderer::DeInit();
+ GLCompositor::DeInit();
+ }
+}
+
+void ResetRenderer()
{
+ if (Renderer == 0)
+ {
+ GPU3D::SoftRenderer::Reset();
+ }
+ else
+ {
+ GLCompositor::Reset();
+ GPU3D::GLRenderer::Reset();
+ }
+}
+
+void SetRenderSettings(int renderer, RenderSettings& settings)
+{
+ if (renderer != Renderer)
+ {
+ DeInitRenderer();
+ InitRenderer(renderer);
+ }
+
+ bool accel = Accelerated;
int fbsize;
if (accel) fbsize = (256*3 + 1) * 192;
else fbsize = 256 * 192;
@@ -296,10 +356,18 @@ void SetDisplaySettings(bool accel)
AssignFramebuffers();
- GPU2D_A->SetDisplaySettings(accel);
- GPU2D_B->SetDisplaySettings(accel);
+ GPU2D_A->SetRenderSettings(accel);
+ GPU2D_B->SetRenderSettings(accel);
- Accelerated = accel;
+ if (Renderer == 0)
+ {
+ GPU3D::SoftRenderer::SetRenderSettings(settings);
+ }
+ else
+ {
+ GLCompositor::SetRenderSettings(settings);
+ GPU3D::GLRenderer::SetRenderSettings(settings);
+ }
}
diff --git a/src/GPU.h b/src/GPU.h
index e85a5b4..039e065 100644
--- a/src/GPU.h
+++ b/src/GPU.h
@@ -20,7 +20,6 @@
#define GPU_H
#include "GPU2D.h"
-#include "GPU3D.h"
namespace GPU
{
@@ -72,6 +71,17 @@ extern u32* Framebuffer[2][2];
extern GPU2D* GPU2D_A;
extern GPU2D* GPU2D_B;
+extern int Renderer;
+
+
+typedef struct
+{
+ bool Soft_Threaded;
+
+ int GL_ScaleFactor;
+
+} RenderSettings;
+
bool Init();
void DeInit();
@@ -80,7 +90,11 @@ void Stop();
void DoSavestate(Savestate* file);
-void SetDisplaySettings(bool accel);
+void InitRenderer(int renderer);
+void DeInitRenderer();
+void ResetRenderer();
+
+void SetRenderSettings(int renderer, RenderSettings& settings);
u8* GetUniqueBankPtr(u32 mask, u32 offset);
@@ -429,7 +443,7 @@ bool Init();
void DeInit();
void Reset();
-void UpdateDisplaySettings();
+void SetRenderSettings(RenderSettings& settings);
void RenderFrame();
void BindOutputTexture();
@@ -438,4 +452,6 @@ void BindOutputTexture();
}
+#include "GPU3D.h"
+
#endif
diff --git a/src/GPU2D.cpp b/src/GPU2D.cpp
index 6f950b7..604a4ee 100644
--- a/src/GPU2D.cpp
+++ b/src/GPU2D.cpp
@@ -202,16 +202,8 @@ void GPU2D::DoSavestate(Savestate* file)
file->Var32(&CaptureCnt);
}
- if (file->IsAtleastVersion(2, 1))
- {
- file->Var32(&Win0Active);
- file->Var32(&Win1Active);
- }
- else
- {
- Win0Active = 0;
- Win1Active = 0;
- }
+ file->Var32(&Win0Active);
+ file->Var32(&Win1Active);
if (!file->Saving)
{
@@ -232,7 +224,7 @@ void GPU2D::SetFramebuffer(u32* buf)
Framebuffer = buf;
}
-void GPU2D::SetDisplaySettings(bool accel)
+void GPU2D::SetRenderSettings(bool accel)
{
Accelerated = accel;
diff --git a/src/GPU2D.h b/src/GPU2D.h
index c4bd2f9..521adf0 100644
--- a/src/GPU2D.h
+++ b/src/GPU2D.h
@@ -31,7 +31,7 @@ public:
void SetEnabled(bool enable) { Enabled = enable; }
void SetFramebuffer(u32* buf);
- void SetDisplaySettings(bool accel);
+ void SetRenderSettings(bool accel);
u8 Read8(u32 addr);
u16 Read16(u32 addr);
diff --git a/src/GPU3D.cpp b/src/GPU3D.cpp
index e687e37..bd27783 100644
--- a/src/GPU3D.cpp
+++ b/src/GPU3D.cpp
@@ -157,8 +157,6 @@ u32 NumCommands, CurCommand, ParamCount, TotalParams;
bool GeometryEnabled;
bool RenderingEnabled;
-int Renderer;
-
u32 DispCnt;
u8 AlphaRefVal, AlphaRef;
@@ -280,17 +278,11 @@ bool Init()
CmdStallQueue = new FIFO<CmdFIFOEntry>(64);
- Renderer = -1;
- // SetRenderer() will be called to set it up later
-
return true;
}
void DeInit()
{
- if (Renderer == 0) SoftRenderer::DeInit();
- else GLRenderer::DeInit();
-
delete CmdFIFO;
delete CmdPIPE;
@@ -391,8 +383,6 @@ void Reset()
FlushAttributes = 0;
ResetRenderingState();
- if (Renderer == 0) SoftRenderer::Reset();
- else GLRenderer::Reset();
}
void DoSavestate(Savestate* file)
@@ -607,43 +597,6 @@ void SetEnabled(bool geometry, bool rendering)
}
-int InitRenderer(bool hasGL)
-{
- int renderer = hasGL ? Config::_3DRenderer : 0;
-
- if (renderer == 1)
- {
- if (!GLRenderer::Init())
- renderer = 0;
- }
-printf("renderer: %d\n", renderer);
- if (renderer == 0) SoftRenderer::Init();
-
- Renderer = renderer;
- UpdateRendererConfig();
- GPU::SetDisplaySettings(Renderer != 0);
- return renderer;
-}
-
-void DeInitRenderer()
-{
- if (Renderer == 0) SoftRenderer::DeInit();
- else GLRenderer::DeInit();
-}
-
-void UpdateRendererConfig()
-{
- if (Renderer == 0)
- {
- SoftRenderer::SetupRenderThread();
- }
- else
- {
- GLRenderer::UpdateDisplaySettings();
- }
-}
-
-
void MatrixLoadIdentity(s32* m)
{
@@ -2470,7 +2423,7 @@ void CheckFIFODMA()
void VCount144()
{
- if (Renderer == 0) SoftRenderer::VCount144();
+ if (GPU::Renderer == 0) SoftRenderer::VCount144();
}
@@ -2552,14 +2505,14 @@ void VBlank()
void VCount215()
{
- if (Renderer == 0) SoftRenderer::RenderFrame();
- else GLRenderer::RenderFrame();
+ if (GPU::Renderer == 0) SoftRenderer::RenderFrame();
+ else GLRenderer::RenderFrame();
}
u32* GetLine(int line)
{
- if (Renderer == 0) return SoftRenderer::GetLine(line);
- else return GLRenderer::GetLine(line);
+ if (GPU::Renderer == 0) return SoftRenderer::GetLine(line);
+ else return GLRenderer::GetLine(line);
}
diff --git a/src/GPU3D.h b/src/GPU3D.h
index 1fd3383..71f069d 100644
--- a/src/GPU3D.h
+++ b/src/GPU3D.h
@@ -102,10 +102,6 @@ void DoSavestate(Savestate* file);
void SetEnabled(bool geometry, bool rendering);
-int InitRenderer(bool hasGL);
-void DeInitRenderer();
-void UpdateRendererConfig();
-
void ExecuteCommand();
s32 CyclesToRunFor();
@@ -134,6 +130,7 @@ bool Init();
void DeInit();
void Reset();
+void SetRenderSettings(GPU::RenderSettings& settings);
void SetupRenderThread();
void VCount144();
@@ -149,7 +146,7 @@ bool Init();
void DeInit();
void Reset();
-void UpdateDisplaySettings();
+void SetRenderSettings(GPU::RenderSettings& settings);
void RenderFrame();
void PrepareCaptureFrame();
diff --git a/src/GPU3D_OpenGL.cpp b/src/GPU3D_OpenGL.cpp
index 9a78504..8a06874 100644
--- a/src/GPU3D_OpenGL.cpp
+++ b/src/GPU3D_OpenGL.cpp
@@ -372,19 +372,11 @@ bool Init()
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, 1024, 48, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, NULL);
- if (!GPU::GLCompositor::Init())
- {
- // TODO: clean up things? fail more gracefully??
- return false;
- }
-
return true;
}
void DeInit()
{
- GPU::GLCompositor::DeInit();
-
glDeleteTextures(1, &TexMemID);
glDeleteTextures(1, &TexPalMemID);
@@ -407,13 +399,12 @@ void DeInit()
void Reset()
{
- GPU::GLCompositor::Reset();
}
-void UpdateDisplaySettings()
+void SetRenderSettings(GPU::RenderSettings& settings)
{
- int scale = Config::GL_ScaleFactor;
- bool antialias = false; //Config::GL_Antialias;
+ int scale = settings.GL_ScaleFactor;
+ bool antialias = false; // REMOVE ME!
if (antialias) scale *= 2;
@@ -490,8 +481,6 @@ void UpdateDisplaySettings()
//glLineWidth(scale);
//glLineWidth(1.5);
-
- GPU::GLCompositor::UpdateDisplaySettings();
}
diff --git a/src/GPU3D_Soft.cpp b/src/GPU3D_Soft.cpp
index 8397898..e9d8e75 100644
--- a/src/GPU3D_Soft.cpp
+++ b/src/GPU3D_Soft.cpp
@@ -60,6 +60,7 @@ bool Enabled;
// threading
+bool Threaded;
void* RenderThread;
bool RenderThreadRunning;
bool RenderThreadRendering;
@@ -83,7 +84,7 @@ void StopRenderThread()
void SetupRenderThread()
{
- if (Config::Threaded3D)
+ if (Threaded)
{
if (!RenderThreadRunning)
{
@@ -112,6 +113,7 @@ bool Init()
Sema_RenderDone = Platform::Semaphore_Create();
Sema_ScanlineCount = Platform::Semaphore_Create();
+ Threaded = false;
RenderThreadRunning = false;
RenderThreadRendering = false;
@@ -138,6 +140,12 @@ void Reset()
SetupRenderThread();
}
+void SetRenderSettings(GPU::RenderSettings& settings)
+{
+ Threaded = settings.Soft_Threaded;
+ SetupRenderThread();
+}
+
// Notes on the interpolator:
diff --git a/src/GPU_OpenGL.cpp b/src/GPU_OpenGL.cpp
index 99eb845..1cb6864 100644
--- a/src/GPU_OpenGL.cpp
+++ b/src/GPU_OpenGL.cpp
@@ -142,9 +142,9 @@ void Reset()
}
-void UpdateDisplaySettings()
+void SetRenderSettings(RenderSettings& settings)
{
- int scale = Config::GL_ScaleFactor;
+ int scale = settings.GL_ScaleFactor;
Scale = scale;
ScreenW = 256 * scale;
@@ -175,28 +175,25 @@ void RenderFrame()
OpenGL::UseShaderProgram(CompShader[0]);
glUniform1ui(CompScaleLoc[0], Scale);
- //if (RunningSomething)
+ int frontbuf = GPU::FrontBuffer;
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, CompScreenInputTex);
+
+ if (GPU::Framebuffer[frontbuf][0] && GPU::Framebuffer[frontbuf][1])
{
- int frontbuf = GPU::FrontBuffer;
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, CompScreenInputTex);
-
- if (GPU::Framebuffer[frontbuf][0] && GPU::Framebuffer[frontbuf][1])
- {
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256*3 + 1, 192, GL_RGBA_INTEGER,
- GL_UNSIGNED_BYTE, GPU::Framebuffer[frontbuf][0]);
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 192, 256*3 + 1, 192, GL_RGBA_INTEGER,
- GL_UNSIGNED_BYTE, GPU::Framebuffer[frontbuf][1]);
- }
-
- glActiveTexture(GL_TEXTURE1);
- GPU3D::GLRenderer::SetupAccelFrame();
-
- glBindBuffer(GL_ARRAY_BUFFER, CompVertexBufferID);
- glBindVertexArray(CompVertexArrayID);
- glDrawArrays(GL_TRIANGLES, 0, 4*3);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256*3 + 1, 192, GL_RGBA_INTEGER,
+ GL_UNSIGNED_BYTE, GPU::Framebuffer[frontbuf][0]);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 192, 256*3 + 1, 192, GL_RGBA_INTEGER,
+ GL_UNSIGNED_BYTE, GPU::Framebuffer[frontbuf][1]);
}
+ glActiveTexture(GL_TEXTURE1);
+ GPU3D::GLRenderer::SetupAccelFrame();
+
+ glBindBuffer(GL_ARRAY_BUFFER, CompVertexBufferID);
+ glBindVertexArray(CompVertexArrayID);
+ glDrawArrays(GL_TRIANGLES, 0, 4*3);
+
glFlush();
}
diff --git a/src/frontend/qt_sdl/AudioSettingsDialog.ui b/src/frontend/qt_sdl/AudioSettingsDialog.ui
index 9ae8baa..bcaf937 100644
--- a/src/frontend/qt_sdl/AudioSettingsDialog.ui
+++ b/src/frontend/qt_sdl/AudioSettingsDialog.ui
@@ -10,10 +10,19 @@
<height>230</height>
</rect>
</property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="windowTitle">
<string>Audio settings - melonDS</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetFixedSize</enum>
+ </property>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
diff --git a/src/frontend/qt_sdl/VideoSettingsDialog.cpp b/src/frontend/qt_sdl/VideoSettingsDialog.cpp
index 0aeb154..09f1ab4 100644
--- a/src/frontend/qt_sdl/VideoSettingsDialog.cpp
+++ b/src/frontend/qt_sdl/VideoSettingsDialog.cpp
@@ -46,7 +46,7 @@ VideoSettingsDialog::VideoSettingsDialog(QWidget* parent) : QDialog(parent), ui(
grp3DRenderer = new QButtonGroup(this);
grp3DRenderer->addButton(ui->rb3DSoftware, 0);
grp3DRenderer->addButton(ui->rb3DOpenGL, 1);
- //connect(grp3DRenderer, SIGNAL(buttonClicked(int)), this, SLOT(onChange3DRenderer(int)));
+ connect(grp3DRenderer, SIGNAL(buttonClicked(int)), this, SLOT(onChange3DRenderer(int)));
grp3DRenderer->button(Config::_3DRenderer)->setChecked(true);
ui->cbGLDisplay->setChecked(Config::ScreenUseGL != 0);
@@ -57,8 +57,21 @@ VideoSettingsDialog::VideoSettingsDialog(QWidget* parent) : QDialog(parent), ui(
ui->cbSoftwareThreaded->setChecked(Config::Threaded3D != 0);
for (int i = 1; i <= 16; i++)
- ui->cbxGLResolution->addItem(QString("%1x native (%2x%3)").arg(i).arg(256*i).arg(192*i), QVariant(i));
- ui->cbxGLResolution->setCurrentIndex(Config::GL_ScaleFactor);
+ ui->cbxGLResolution->addItem(QString("%1x native (%2x%3)").arg(i).arg(256*i).arg(192*i));
+ ui->cbxGLResolution->setCurrentIndex(Config::GL_ScaleFactor-1);
+
+ if (Config::_3DRenderer == 0)
+ {
+ ui->cbGLDisplay->setEnabled(true);
+ ui->cbSoftwareThreaded->setEnabled(true);
+ ui->cbxGLResolution->setEnabled(false);
+ }
+ else
+ {
+ ui->cbGLDisplay->setEnabled(false);
+ ui->cbSoftwareThreaded->setEnabled(false);
+ ui->cbxGLResolution->setEnabled(true);
+ }
}
VideoSettingsDialog::~VideoSettingsDialog()
@@ -68,7 +81,6 @@ VideoSettingsDialog::~VideoSettingsDialog()
void VideoSettingsDialog::on_VideoSettingsDialog_accepted()
{
- //
Config::Save();
closeDlg();
@@ -76,9 +88,64 @@ void VideoSettingsDialog::on_VideoSettingsDialog_accepted()
void VideoSettingsDialog::on_VideoSettingsDialog_rejected()
{
- //
+ bool old_gl = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0);
+
+ Config::_3DRenderer = oldRenderer;
+ Config::ScreenUseGL = oldGLDisplay;
+ Config::ScreenVSync = oldVSync;
+ Config::ScreenVSyncInterval = oldVSyncInterval;
+ Config::Threaded3D = oldSoftThreaded;
+ Config::GL_ScaleFactor = oldGLScale;
+
+ bool new_gl = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0);
+ emit updateVideoSettings(old_gl != new_gl);
closeDlg();
}
-//
+void VideoSettingsDialog::onChange3DRenderer(int renderer)
+{
+ bool old_gl = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0);
+
+ Config::_3DRenderer = renderer;
+
+ if (renderer == 0)
+ {
+ ui->cbGLDisplay->setEnabled(true);
+ ui->cbSoftwareThreaded->setEnabled(true);
+ ui->cbxGLResolution->setEnabled(false);
+ }
+ else
+ {
+ ui->cbGLDisplay->setEnabled(false);
+ ui->cbSoftwareThreaded->setEnabled(false);
+ ui->cbxGLResolution->setEnabled(true);
+ }
+
+ bool new_gl = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0);
+ emit updateVideoSettings(old_gl != new_gl);
+}
+
+void VideoSettingsDialog::on_cbGLDisplay_stateChanged(int state)
+{
+ bool old_gl = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0);
+
+ Config::ScreenUseGL = (state != 0);
+
+ bool new_gl = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0);
+ emit updateVideoSettings(old_gl != new_gl);
+}
+
+void VideoSettingsDialog::on_cbSoftwareThreaded_stateChanged(int state)
+{
+ Config::Threaded3D = (state != 0);
+
+ emit updateVideoSettings(false);
+}
+
+void VideoSettingsDialog::on_cbxGLResolution_currentIndexChanged(int idx)
+{
+ Config::GL_ScaleFactor = idx+1;
+
+ emit updateVideoSettings(false);
+}
diff --git a/src/frontend/qt_sdl/VideoSettingsDialog.h b/src/frontend/qt_sdl/VideoSettingsDialog.h
index 05dfecb..2f6d17c 100644
--- a/src/frontend/qt_sdl/VideoSettingsDialog.h
+++ b/src/frontend/qt_sdl/VideoSettingsDialog.h
@@ -51,11 +51,18 @@ public:
currentDlg = nullptr;
}
+signals:
+ void updateVideoSettings(bool glchange);
+
private slots:
void on_VideoSettingsDialog_accepted();
void on_VideoSettingsDialog_rejected();
- //
+ void onChange3DRenderer(int renderer);
+ void on_cbGLDisplay_stateChanged(int state);
+ void on_cbxGLResolution_currentIndexChanged(int idx);
+
+ void on_cbSoftwareThreaded_stateChanged(int state);
private:
Ui::VideoSettingsDialog* ui;
diff --git a/src/frontend/qt_sdl/VideoSettingsDialog.ui b/src/frontend/qt_sdl/VideoSettingsDialog.ui
index 06670e5..6cdd5d8 100644
--- a/src/frontend/qt_sdl/VideoSettingsDialog.ui
+++ b/src/frontend/qt_sdl/VideoSettingsDialog.ui
@@ -10,10 +10,19 @@
<height>237</height>
</rect>
</property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="windowTitle">
<string>Video settings - melonDS</string>
</property>
<layout class="QGridLayout" name="gridLayout">
+ <property name="sizeConstraint">
+ <enum>QLayout::SetFixedSize</enum>
+ </property>
<item row="1" column="1">
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp
index ae4bcf3..658ae8b 100644
--- a/src/frontend/qt_sdl/main.cpp
+++ b/src/frontend/qt_sdl/main.cpp
@@ -68,6 +68,10 @@ EmuThread* emuThread;
int autoScreenSizing = 0;
+int videoRenderer;
+GPU::RenderSettings videoSettings;
+bool videoSettingsDirty;
+
SDL_AudioDeviceID audioDevice;
int audioFreq;
SDL_cond* audioSync;
@@ -251,9 +255,7 @@ EmuThread::EmuThread(QObject* parent) : QThread(parent)
EmuRunning = 2;
RunningSomething = false;
- //connect(this, SIGNAL(windowUpdate()), mainWindow, SLOT(update()));
connect(this, SIGNAL(windowUpdate()), mainWindow->panel, SLOT(update()));
- //connect(this, SIGNAL(windowUpdate()), mainWindow, SLOT(repaint()));
connect(this, SIGNAL(windowTitleChange(QString)), mainWindow, SLOT(onTitleUpdate(QString)));
connect(this, SIGNAL(windowEmuStart()), mainWindow, SLOT(onEmuStart()));
connect(this, SIGNAL(windowEmuStop()), mainWindow, SLOT(onEmuStop()));
@@ -312,6 +314,7 @@ void* EmuThread::oglGetProcAddress(const char* proc)
void EmuThread::run()
{
+ bool hasOGL = mainWindow->hasOGL;
u32 mainScreenPos[3];
NDS::Init();
@@ -321,20 +324,20 @@ void EmuThread::run()
mainScreenPos[2] = 0;
autoScreenSizing = 0;
- /*if (Screen_UseGL)
- {
- uiGLMakeContextCurrent(GLContext);
- GPU3D::InitRenderer(true);
- uiGLMakeContextCurrent(NULL);
- }
- else*/
+ videoSettingsDirty = false;
+ videoSettings.Soft_Threaded = Config::Threaded3D != 0;
+ videoSettings.GL_ScaleFactor = Config::GL_ScaleFactor;
+
+ if (hasOGL)
{
- //GPU3D::InitRenderer(false);
- bool res = oglContext->makeCurrent(oglSurface);
- printf("good? %d\n", res);
- OpenGL::Init();
- GPU3D::InitRenderer(res);
+ oglContext->makeCurrent(oglSurface);
+ videoRenderer = OpenGL::Init() ? Config::_3DRenderer : 0;
}
+ else
+ videoRenderer = 0;
+
+ GPU::InitRenderer(videoRenderer);
+ GPU::SetRenderSettings(videoRenderer, videoSettings);
Input::Init();
@@ -377,6 +380,29 @@ void EmuThread::run()
{
EmuStatus = 1;
+ // update render settings if needed
+ if (videoSettingsDirty)
+ {
+ if (hasOGL != mainWindow->hasOGL)
+ {
+ hasOGL = mainWindow->hasOGL;
+ if (hasOGL)
+ {
+ oglContext->makeCurrent(oglSurface);
+ videoRenderer = OpenGL::Init() ? Config::_3DRenderer : 0;
+ }
+ else
+ videoRenderer = 0;
+ }
+ else
+ videoRenderer = hasOGL ? Config::_3DRenderer : 0;
+
+ videoSettingsDirty = false;
+ videoSettings.Soft_Threaded = Config::Threaded3D != 0;
+ videoSettings.GL_ScaleFactor = Config::GL_ScaleFactor;
+ GPU::SetRenderSettings(videoRenderer, videoSettings);
+ }
+
// process input and hotkeys
NDS::SetKeyMask(Input::InputMask);
@@ -390,12 +416,6 @@ void EmuThread::run()
// microphone input
micProcess();
- /*if (Screen_UseGL)
- {
- uiGLBegin(GLContext);
- uiGLMakeContextCurrent(GLContext);
- }*/
-
// auto screen layout
if (Config::ScreenSizing == 3)
{
@@ -435,12 +455,6 @@ void EmuThread::run()
if (EmuRunning == 0) break;
- /*if (Screen_UseGL)
- {
- GLScreen_DrawScreen();
- uiGLEnd(GLContext);
- }
- uiAreaQueueRedrawAll(MainDrawArea);*/
emit windowUpdate();
bool fastforward = Input::HotkeyDown(HK_FastForward);
@@ -513,18 +527,8 @@ void EmuThread::run()
lastmeasuretick = lasttick;
fpslimitcount = 0;
- /*if (Screen_UseGL)
- {
- uiGLBegin(GLContext);
- uiGLMakeContextCurrent(GLContext);
- GLScreen_DrawScreen();
- uiGLEnd(GLContext);
- }
- uiAreaQueueRedrawAll(MainDrawArea);*/
emit windowUpdate();
- //if (Screen_UseGL) uiGLMakeContextCurrent(NULL);
-
EmuStatus = EmuRunning;
sprintf(melontitle, "melonDS " MELONDS_VERSION);
@@ -536,8 +540,7 @@ void EmuThread::run()
EmuStatus = 0;
- //if (Screen_UseGL) uiGLMakeContextCurrent(GLContext);
-
+ GPU::DeInitRenderer();
NDS::DeInit();
//Platform::LAN_DeInit();
@@ -549,7 +552,8 @@ void EmuThread::run()
else
OSD::DeInit(false);*/
- //if (Screen_UseGL) uiGLMakeContextCurrent(NULL);
+ if (hasOGL)
+ oglContext->doneCurrent();
}
void EmuThread::changeWindowTitle(char* title)
@@ -794,6 +798,7 @@ ScreenPanelGL::ScreenPanelGL(QWidget* parent) : QOpenGLWidget(parent)
ScreenPanelGL::~ScreenPanelGL()
{
// CHECKME!!!!
+ // ALSO TODO: CLEANUP
delete screenShader;
}
@@ -888,7 +893,7 @@ void ScreenPanelGL::paintGL()
int frontbuf = GPU::FrontBuffer;
glActiveTexture(GL_TEXTURE0);
- if (true)
+ if (GPU::Renderer != 0)
{
// hardware-accelerated render
GPU::GLCompositor::BindOutputTexture();
@@ -1162,11 +1167,8 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
}
setMenuBar(menubar);
- //panel = new ScreenPanelNative(this);
- panel = new ScreenPanelGL(this);
- setCentralWidget(panel);
- connect(this, SIGNAL(screenLayoutChange()), panel, SLOT(onScreenLayoutChanged()));
- emit screenLayoutChange();
+ show();
+ createScreenPanel();
resize(Config::WindowWidth, Config::WindowHeight);
@@ -1210,9 +1212,45 @@ MainWindow::~MainWindow()
{
}
+void MainWindow::createScreenPanel()
+{
+ hasOGL = (Config::ScreenUseGL != 0) || (Config::_3DRenderer != 0);
+
+ if (hasOGL)
+ {
+ ScreenPanelGL* panelGL = new ScreenPanelGL(this);
+ panelGL->show();
+
+ if (!panelGL->isValid())
+ hasOGL = false;
+ else
+ {
+ QSurfaceFormat fmt = panelGL->format();
+ if (fmt.majorVersion() < 3 || (fmt.majorVersion() == 3 && fmt.minorVersion() < 2))
+ hasOGL = false;
+ }
+
+ if (!hasOGL)
+ delete panelGL;
+ else
+ panel = panelGL;
+ }
+
+ if (!hasOGL)
+ {
+ panel = new ScreenPanelNative(this);
+ panel->show();
+ }
+
+ setCentralWidget(panel);
+ connect(this, SIGNAL(screenLayoutChange()), panel, SLOT(onScreenLayoutChanged()));
+ emit screenLayoutChange();
+}
+
QOpenGLContext* MainWindow::getOGLContext()
{
- // TODO: check whether we can actually pull this!
+ if (!hasOGL) return nullptr;
+
QOpenGLWidget* glpanel = (QOpenGLWidget*)panel;
return glpanel->context();
}
@@ -1575,6 +1613,7 @@ void MainWindow::onInputConfigFinished(int res)
void MainWindow::onOpenVideoSettings()
{
VideoSettingsDialog* dlg = VideoSettingsDialog::openDlg(this);
+ connect(dlg, &VideoSettingsDialog::updateVideoSettings, this, &MainWindow::onUpdateVideoSettings);
}
void MainWindow::onOpenAudioSettings()
@@ -1745,6 +1784,23 @@ void MainWindow::onEmuStop()
actStop->setEnabled(false);
}
+void MainWindow::onUpdateVideoSettings(bool glchange)
+{
+ if (glchange)
+ {
+ emuThread->emuPause();
+
+ delete panel;
+ createScreenPanel();
+ connect(emuThread, SIGNAL(windowUpdate()), panel, SLOT(update()));
+ }
+
+ videoSettingsDirty = true;
+
+ if (glchange)
+ emuThread->emuUnpause();
+}
+
void emuStop()
{
@@ -1790,6 +1846,9 @@ int main(int argc, char** argv)
Config::Load();
#define SANITIZE(var, min, max) { if (var < min) var = min; else if (var > max) var = max; }
+ SANITIZE(Config::_3DRenderer, 0, 1);
+ SANITIZE(Config::ScreenVSyncInterval, 1, 20);
+ SANITIZE(Config::GL_ScaleFactor, 1, 16);
SANITIZE(Config::AudioVolume, 0, 256);
SANITIZE(Config::MicInputType, 0, 3);
SANITIZE(Config::ScreenRotation, 0, 3);
@@ -1900,7 +1959,6 @@ int main(int argc, char** argv)
Input::OpenJoystick();
mainWindow = new MainWindow();
- mainWindow->show();
emuThread = new EmuThread();
emuThread->start();
diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h
index 8759e95..ef51158 100644
--- a/src/frontend/qt_sdl/main.h
+++ b/src/frontend/qt_sdl/main.h
@@ -171,6 +171,7 @@ public:
explicit MainWindow(QWidget* parent = nullptr);
~MainWindow();
+ bool hasOGL;
QOpenGLContext* getOGLContext();
protected:
@@ -221,7 +222,11 @@ private slots:
void onEmuStart();
void onEmuStop();
+ void onUpdateVideoSettings(bool glchange);
+
private:
+ void createScreenPanel();
+
QString loadErrorStr(int error);
public: