mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2024-11-14 13:27:41 -07:00
* rework GPU's settings interface, make it config-agnostic
* make video settings dialog functional, sorta * fix dialogs that were resizable
This commit is contained in:
parent
5005a7c3f0
commit
0804ab3c78
78
src/GPU.cpp
78
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
22
src/GPU.h
22
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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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">
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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">
|
||||
|
@ -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)
|
||||
videoSettingsDirty = false;
|
||||
videoSettings.Soft_Threaded = Config::Threaded3D != 0;
|
||||
videoSettings.GL_ScaleFactor = Config::GL_ScaleFactor;
|
||||
|
||||
if (hasOGL)
|
||||
{
|
||||
uiGLMakeContextCurrent(GLContext);
|
||||
GPU3D::InitRenderer(true);
|
||||
uiGLMakeContextCurrent(NULL);
|
||||
}
|
||||
else*/
|
||||
{
|
||||
//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();
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user