start cleaning up: move OpenGL stuff out of EmuThread
This commit is contained in:
parent
5c90cb939d
commit
7f437d48db
|
@ -34,29 +34,25 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "OpenGLSupport.h"
|
||||||
|
#include "duckstation/gl/context.h"
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
#include "NDS.h"
|
#include "NDS.h"
|
||||||
|
#include "GPU.h"
|
||||||
|
#include "GPU3D_Soft.h"
|
||||||
|
#include "GPU3D_OpenGL.h"
|
||||||
#include "Platform.h"
|
#include "Platform.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
|
|
||||||
//#include "main_shaders.h"
|
#include "main_shaders.h"
|
||||||
|
|
||||||
#include "OSD.h"
|
#include "OSD.h"
|
||||||
|
|
||||||
using namespace melonDS;
|
using namespace melonDS;
|
||||||
|
|
||||||
|
|
||||||
/*const struct { int id; float ratio; const char* label; } aspectRatios[] =
|
|
||||||
{
|
|
||||||
{ 0, 1, "4:3 (native)" },
|
|
||||||
{ 4, (5.f / 3) / (4.f / 3), "5:3 (3DS)"},
|
|
||||||
{ 1, (16.f / 9) / (4.f / 3), "16:9" },
|
|
||||||
{ 2, (21.f / 9) / (4.f / 3), "21:9" },
|
|
||||||
{ 3, 0, "window" }
|
|
||||||
};
|
|
||||||
int AspectRatiosNum = sizeof(aspectRatios) / sizeof(aspectRatios[0]);*/
|
|
||||||
|
|
||||||
// TEMP
|
// TEMP
|
||||||
extern MainWindow* mainWindow;
|
extern MainWindow* mainWindow;
|
||||||
extern EmuThread* emuThread;
|
extern EmuThread* emuThread;
|
||||||
|
@ -432,6 +428,172 @@ bool ScreenPanelGL::createContext()
|
||||||
return glContext != nullptr;
|
return glContext != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScreenPanelGL::setSwapInterval(int intv)
|
||||||
|
{
|
||||||
|
if (!glContext) return;
|
||||||
|
|
||||||
|
glContext->SetSwapInterval(intv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenPanelGL::initOpenGL()
|
||||||
|
{
|
||||||
|
if (!glContext) return;
|
||||||
|
|
||||||
|
glContext->MakeCurrent();
|
||||||
|
|
||||||
|
OpenGL::BuildShaderProgram(kScreenVS, kScreenFS, screenShaderProgram, "ScreenShader");
|
||||||
|
GLuint pid = screenShaderProgram[2];
|
||||||
|
glBindAttribLocation(pid, 0, "vPosition");
|
||||||
|
glBindAttribLocation(pid, 1, "vTexcoord");
|
||||||
|
glBindFragDataLocation(pid, 0, "oColor");
|
||||||
|
|
||||||
|
OpenGL::LinkShaderProgram(screenShaderProgram);
|
||||||
|
|
||||||
|
glUseProgram(pid);
|
||||||
|
glUniform1i(glGetUniformLocation(pid, "ScreenTex"), 0);
|
||||||
|
|
||||||
|
screenShaderScreenSizeULoc = glGetUniformLocation(pid, "uScreenSize");
|
||||||
|
screenShaderTransformULoc = glGetUniformLocation(pid, "uTransform");
|
||||||
|
|
||||||
|
// to prevent bleeding between both parts of the screen
|
||||||
|
// with bilinear filtering enabled
|
||||||
|
const int paddedHeight = 192*2+2;
|
||||||
|
const float padPixels = 1.f / paddedHeight;
|
||||||
|
|
||||||
|
const float vertices[] =
|
||||||
|
{
|
||||||
|
0.f, 0.f, 0.f, 0.f,
|
||||||
|
0.f, 192.f, 0.f, 0.5f - padPixels,
|
||||||
|
256.f, 192.f, 1.f, 0.5f - padPixels,
|
||||||
|
0.f, 0.f, 0.f, 0.f,
|
||||||
|
256.f, 192.f, 1.f, 0.5f - padPixels,
|
||||||
|
256.f, 0.f, 1.f, 0.f,
|
||||||
|
|
||||||
|
0.f, 0.f, 0.f, 0.5f + padPixels,
|
||||||
|
0.f, 192.f, 0.f, 1.f,
|
||||||
|
256.f, 192.f, 1.f, 1.f,
|
||||||
|
0.f, 0.f, 0.f, 0.5f + padPixels,
|
||||||
|
256.f, 192.f, 1.f, 1.f,
|
||||||
|
256.f, 0.f, 1.f, 0.5f + padPixels
|
||||||
|
};
|
||||||
|
|
||||||
|
glGenBuffers(1, &screenVertexBuffer);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, screenVertexBuffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glGenVertexArrays(1, &screenVertexArray);
|
||||||
|
glBindVertexArray(screenVertexArray);
|
||||||
|
glEnableVertexAttribArray(0); // position
|
||||||
|
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4*4, (void*)(0));
|
||||||
|
glEnableVertexAttribArray(1); // texcoord
|
||||||
|
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4*4, (void*)(2*4));
|
||||||
|
|
||||||
|
glGenTextures(1, &screenTexture);
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, screenTexture);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, paddedHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
// fill the padding
|
||||||
|
u8 zeroData[256*4*4];
|
||||||
|
memset(zeroData, 0, sizeof(zeroData));
|
||||||
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 192, 256, 2, GL_RGBA, GL_UNSIGNED_BYTE, zeroData);
|
||||||
|
|
||||||
|
OSD::Init(true);
|
||||||
|
|
||||||
|
glContext->SetSwapInterval(Config::ScreenVSync ? Config::ScreenVSyncInterval : 0);
|
||||||
|
transferLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenPanelGL::deinitOpenGL()
|
||||||
|
{
|
||||||
|
if (!glContext) return;
|
||||||
|
|
||||||
|
glDeleteTextures(1, &screenTexture);
|
||||||
|
|
||||||
|
glDeleteVertexArrays(1, &screenVertexArray);
|
||||||
|
glDeleteBuffers(1, &screenVertexBuffer);
|
||||||
|
|
||||||
|
OpenGL::DeleteShaderProgram(screenShaderProgram);
|
||||||
|
|
||||||
|
OSD::DeInit();
|
||||||
|
|
||||||
|
glContext->DoneCurrent();
|
||||||
|
|
||||||
|
lastScreenWidth = lastScreenHeight = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScreenPanelGL::drawScreenGL()
|
||||||
|
{
|
||||||
|
if (!glContext) return;
|
||||||
|
if (!emuThread->NDS) return;
|
||||||
|
|
||||||
|
int w = windowInfo.surface_width;
|
||||||
|
int h = windowInfo.surface_height;
|
||||||
|
float factor = windowInfo.surface_scale;
|
||||||
|
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glDepthMask(false);
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_SCISSOR_TEST);
|
||||||
|
glDisable(GL_STENCIL_TEST);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
glViewport(0, 0, w, h);
|
||||||
|
|
||||||
|
glUseProgram(screenShaderProgram[2]);
|
||||||
|
glUniform2f(screenShaderScreenSizeULoc, w / factor, h / factor);
|
||||||
|
|
||||||
|
int frontbuf = emuThread->FrontBuffer;
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
|
||||||
|
#ifdef OGLRENDERER_ENABLED
|
||||||
|
if (emuThread->NDS->GPU.GetRenderer3D().Accelerated)
|
||||||
|
{
|
||||||
|
// hardware-accelerated render
|
||||||
|
static_cast<GLRenderer&>(emuThread->NDS->GPU.GetRenderer3D()).GetCompositor().BindOutputTexture(frontbuf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
// regular render
|
||||||
|
glBindTexture(GL_TEXTURE_2D, screenTexture);
|
||||||
|
|
||||||
|
if (emuThread->NDS->GPU.Framebuffer[frontbuf][0] && emuThread->NDS->GPU.Framebuffer[frontbuf][1])
|
||||||
|
{
|
||||||
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 256, 192, GL_RGBA,
|
||||||
|
GL_UNSIGNED_BYTE, emuThread->NDS->GPU.Framebuffer[frontbuf][0].get());
|
||||||
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 192+2, 256, 192, GL_RGBA,
|
||||||
|
GL_UNSIGNED_BYTE, emuThread->NDS->GPU.Framebuffer[frontbuf][1].get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
screenSettingsLock.lock();
|
||||||
|
|
||||||
|
GLint filter = this->filter ? GL_LINEAR : GL_NEAREST;
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, screenVertexBuffer);
|
||||||
|
glBindVertexArray(screenVertexArray);
|
||||||
|
|
||||||
|
for (int i = 0; i < numScreens; i++)
|
||||||
|
{
|
||||||
|
glUniformMatrix2x3fv(screenShaderTransformULoc, 1, GL_TRUE, screenMatrix[i]);
|
||||||
|
glDrawArrays(GL_TRIANGLES, screenKind[i] == 0 ? 0 : 2*3, 2*3);
|
||||||
|
}
|
||||||
|
|
||||||
|
screenSettingsLock.unlock();
|
||||||
|
|
||||||
|
OSD::Update();
|
||||||
|
OSD::DrawGL(w, h);
|
||||||
|
|
||||||
|
glContext->SwapBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
qreal ScreenPanelGL::devicePixelRatioFromScreen() const
|
qreal ScreenPanelGL::devicePixelRatioFromScreen() const
|
||||||
{
|
{
|
||||||
const QScreen* screen_for_ratio = window()->windowHandle()->screen();
|
const QScreen* screen_for_ratio = window()->windowHandle()->screen();
|
||||||
|
@ -507,8 +669,7 @@ void ScreenPanelGL::setupScreenLayout()
|
||||||
int h = height();
|
int h = height();
|
||||||
|
|
||||||
screenSetupLayout(w, h);
|
screenSetupLayout(w, h);
|
||||||
if (emuThread)
|
transferLayout();
|
||||||
transferLayout(emuThread);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenPanelGL::resizeEvent(QResizeEvent* event)
|
void ScreenPanelGL::resizeEvent(QResizeEvent* event)
|
||||||
|
@ -550,11 +711,26 @@ bool ScreenPanelGL::event(QEvent* event)
|
||||||
return QWidget::event(event);
|
return QWidget::event(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenPanelGL::transferLayout(EmuThread* thread)
|
void ScreenPanelGL::transferLayout()
|
||||||
{
|
{
|
||||||
std::optional<WindowInfo> windowInfo = getWindowInfo();
|
std::optional<WindowInfo> windowInfo = getWindowInfo();
|
||||||
if (windowInfo.has_value())
|
if (windowInfo.has_value())
|
||||||
thread->updateScreenSettings(Config::ScreenFilter, *windowInfo, numScreens, screenKind, &screenMatrix[0][0]);
|
{
|
||||||
|
screenSettingsLock.lock();
|
||||||
|
|
||||||
|
if (lastScreenWidth != windowInfo->surface_width || lastScreenHeight != windowInfo->surface_height)
|
||||||
|
{
|
||||||
|
if (glContext)
|
||||||
|
glContext->ResizeSurface(windowInfo->surface_width, windowInfo->surface_height);
|
||||||
|
lastScreenWidth = windowInfo->surface_width;
|
||||||
|
lastScreenHeight = windowInfo->surface_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->filter = Config::ScreenFilter;
|
||||||
|
this->windowInfo = *windowInfo;
|
||||||
|
|
||||||
|
screenSettingsLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScreenPanelGL::onScreenLayoutChanged()
|
void ScreenPanelGL::onScreenLayoutChanged()
|
||||||
|
|
|
@ -122,9 +122,15 @@ public:
|
||||||
|
|
||||||
bool createContext();
|
bool createContext();
|
||||||
|
|
||||||
|
void setSwapInterval(int intv);
|
||||||
|
|
||||||
|
void initOpenGL();
|
||||||
|
void deinitOpenGL();
|
||||||
|
void drawScreenGL();
|
||||||
|
|
||||||
GL::Context* getContext() { return glContext.get(); }
|
GL::Context* getContext() { return glContext.get(); }
|
||||||
|
|
||||||
void transferLayout(EmuThread* thread);
|
void transferLayout();
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
qreal devicePixelRatioFromScreen() const;
|
qreal devicePixelRatioFromScreen() const;
|
||||||
|
@ -149,6 +155,17 @@ private:
|
||||||
void setupScreenLayout();
|
void setupScreenLayout();
|
||||||
|
|
||||||
std::unique_ptr<GL::Context> glContext;
|
std::unique_ptr<GL::Context> glContext;
|
||||||
|
|
||||||
|
GLuint screenVertexBuffer, screenVertexArray;
|
||||||
|
GLuint screenTexture;
|
||||||
|
GLuint screenShaderProgram[3];
|
||||||
|
GLuint screenShaderTransformULoc, screenShaderScreenSizeULoc;
|
||||||
|
|
||||||
|
QMutex screenSettingsLock;
|
||||||
|
WindowInfo windowInfo;
|
||||||
|
bool filter;
|
||||||
|
|
||||||
|
int lastScreenWidth = -1, lastScreenHeight = -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SCREEN_H
|
#endif // SCREEN_H
|
||||||
|
|
|
@ -749,6 +749,30 @@ GL::Context* MainWindow::getOGLContext()
|
||||||
return glpanel->getContext();
|
return glpanel->getContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*void MainWindow::initOpenGL()
|
||||||
|
{
|
||||||
|
if (!hasOGL) return;
|
||||||
|
|
||||||
|
ScreenPanelGL* glpanel = static_cast<ScreenPanelGL*>(panel);
|
||||||
|
return glpanel->initOpenGL();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::deinitOpenGL()
|
||||||
|
{
|
||||||
|
if (!hasOGL) return;
|
||||||
|
|
||||||
|
ScreenPanelGL* glpanel = static_cast<ScreenPanelGL*>(panel);
|
||||||
|
return glpanel->deinitOpenGL();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::drawScreenGL()
|
||||||
|
{
|
||||||
|
if (!hasOGL) return;
|
||||||
|
|
||||||
|
ScreenPanelGL* glpanel = static_cast<ScreenPanelGL*>(panel);
|
||||||
|
return glpanel->drawScreenGL();
|
||||||
|
}*/
|
||||||
|
|
||||||
void MainWindow::resizeEvent(QResizeEvent* event)
|
void MainWindow::resizeEvent(QResizeEvent* event)
|
||||||
{
|
{
|
||||||
int w = event->size().width();
|
int w = event->size().width();
|
||||||
|
|
|
@ -106,6 +106,9 @@ public:
|
||||||
|
|
||||||
bool hasOGL;
|
bool hasOGL;
|
||||||
GL::Context* getOGLContext();
|
GL::Context* getOGLContext();
|
||||||
|
/*void initOpenGL();
|
||||||
|
void deinitOpenGL();
|
||||||
|
void drawScreenGL();*/
|
||||||
|
|
||||||
bool preloadROMs(QStringList file, QStringList gbafile, bool boot);
|
bool preloadROMs(QStringList file, QStringList gbafile, bool boot);
|
||||||
QStringList splitArchivePath(const QString& filename, bool useMemberSyntax);
|
QStringList splitArchivePath(const QString& filename, bool useMemberSyntax);
|
||||||
|
|
|
@ -99,7 +99,7 @@
|
||||||
|
|
||||||
#include "Savestate.h"
|
#include "Savestate.h"
|
||||||
|
|
||||||
#include "main_shaders.h"
|
//#include "main_shaders.h"
|
||||||
|
|
||||||
#include "ROMManager.h"
|
#include "ROMManager.h"
|
||||||
#include "ArchiveUtil.h"
|
#include "ArchiveUtil.h"
|
||||||
|
@ -194,9 +194,6 @@ EmuThread::EmuThread(QObject* parent) : QThread(parent)
|
||||||
connect(this, SIGNAL(windowFullscreenToggle()), mainWindow, SLOT(onFullscreenToggled()));
|
connect(this, SIGNAL(windowFullscreenToggle()), mainWindow, SLOT(onFullscreenToggled()));
|
||||||
connect(this, SIGNAL(swapScreensToggle()), mainWindow->actScreenSwap, SLOT(trigger()));
|
connect(this, SIGNAL(swapScreensToggle()), mainWindow->actScreenSwap, SLOT(trigger()));
|
||||||
connect(this, SIGNAL(screenEmphasisToggle()), mainWindow, SLOT(onScreenEmphasisToggled()));
|
connect(this, SIGNAL(screenEmphasisToggle()), mainWindow, SLOT(onScreenEmphasisToggled()));
|
||||||
|
|
||||||
auto glPanel = dynamic_cast<ScreenPanelGL*>(mainWindow->panel);
|
|
||||||
if (glPanel) glPanel->transferLayout(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<NDS> EmuThread::CreateConsole(
|
std::unique_ptr<NDS> EmuThread::CreateConsole(
|
||||||
|
@ -402,116 +399,6 @@ bool EmuThread::UpdateConsole(UpdateConsoleNDSArgs&& ndsargs, UpdateConsoleGBAAr
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmuThread::updateScreenSettings(bool filter, const WindowInfo& windowInfo, int numScreens, int* screenKind, float* screenMatrix)
|
|
||||||
{
|
|
||||||
screenSettingsLock.lock();
|
|
||||||
|
|
||||||
if (lastScreenWidth != windowInfo.surface_width || lastScreenHeight != windowInfo.surface_height)
|
|
||||||
{
|
|
||||||
if (oglContext)
|
|
||||||
oglContext->ResizeSurface(windowInfo.surface_width, windowInfo.surface_height);
|
|
||||||
lastScreenWidth = windowInfo.surface_width;
|
|
||||||
lastScreenHeight = windowInfo.surface_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
this->filter = filter;
|
|
||||||
this->windowInfo = windowInfo;
|
|
||||||
this->numScreens = numScreens;
|
|
||||||
memcpy(this->screenKind, screenKind, sizeof(int)*numScreens);
|
|
||||||
memcpy(this->screenMatrix, screenMatrix, sizeof(float)*numScreens*6);
|
|
||||||
|
|
||||||
screenSettingsLock.unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmuThread::initOpenGL()
|
|
||||||
{
|
|
||||||
GL::Context* windowctx = mainWindow->getOGLContext();
|
|
||||||
|
|
||||||
oglContext = windowctx;
|
|
||||||
oglContext->MakeCurrent();
|
|
||||||
|
|
||||||
OpenGL::BuildShaderProgram(kScreenVS, kScreenFS, screenShaderProgram, "ScreenShader");
|
|
||||||
GLuint pid = screenShaderProgram[2];
|
|
||||||
glBindAttribLocation(pid, 0, "vPosition");
|
|
||||||
glBindAttribLocation(pid, 1, "vTexcoord");
|
|
||||||
glBindFragDataLocation(pid, 0, "oColor");
|
|
||||||
|
|
||||||
OpenGL::LinkShaderProgram(screenShaderProgram);
|
|
||||||
|
|
||||||
glUseProgram(pid);
|
|
||||||
glUniform1i(glGetUniformLocation(pid, "ScreenTex"), 0);
|
|
||||||
|
|
||||||
screenShaderScreenSizeULoc = glGetUniformLocation(pid, "uScreenSize");
|
|
||||||
screenShaderTransformULoc = glGetUniformLocation(pid, "uTransform");
|
|
||||||
|
|
||||||
// to prevent bleeding between both parts of the screen
|
|
||||||
// with bilinear filtering enabled
|
|
||||||
const int paddedHeight = 192*2+2;
|
|
||||||
const float padPixels = 1.f / paddedHeight;
|
|
||||||
|
|
||||||
const float vertices[] =
|
|
||||||
{
|
|
||||||
0.f, 0.f, 0.f, 0.f,
|
|
||||||
0.f, 192.f, 0.f, 0.5f - padPixels,
|
|
||||||
256.f, 192.f, 1.f, 0.5f - padPixels,
|
|
||||||
0.f, 0.f, 0.f, 0.f,
|
|
||||||
256.f, 192.f, 1.f, 0.5f - padPixels,
|
|
||||||
256.f, 0.f, 1.f, 0.f,
|
|
||||||
|
|
||||||
0.f, 0.f, 0.f, 0.5f + padPixels,
|
|
||||||
0.f, 192.f, 0.f, 1.f,
|
|
||||||
256.f, 192.f, 1.f, 1.f,
|
|
||||||
0.f, 0.f, 0.f, 0.5f + padPixels,
|
|
||||||
256.f, 192.f, 1.f, 1.f,
|
|
||||||
256.f, 0.f, 1.f, 0.5f + padPixels
|
|
||||||
};
|
|
||||||
|
|
||||||
glGenBuffers(1, &screenVertexBuffer);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, screenVertexBuffer);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
glGenVertexArrays(1, &screenVertexArray);
|
|
||||||
glBindVertexArray(screenVertexArray);
|
|
||||||
glEnableVertexAttribArray(0); // position
|
|
||||||
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4*4, (void*)(0));
|
|
||||||
glEnableVertexAttribArray(1); // texcoord
|
|
||||||
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4*4, (void*)(2*4));
|
|
||||||
|
|
||||||
glGenTextures(1, &screenTexture);
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, screenTexture);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, paddedHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
|
||||||
// fill the padding
|
|
||||||
u8 zeroData[256*4*4];
|
|
||||||
memset(zeroData, 0, sizeof(zeroData));
|
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 192, 256, 2, GL_RGBA, GL_UNSIGNED_BYTE, zeroData);
|
|
||||||
|
|
||||||
OSD::Init(true);
|
|
||||||
|
|
||||||
oglContext->SetSwapInterval(Config::ScreenVSync ? Config::ScreenVSyncInterval : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmuThread::deinitOpenGL()
|
|
||||||
{
|
|
||||||
glDeleteTextures(1, &screenTexture);
|
|
||||||
|
|
||||||
glDeleteVertexArrays(1, &screenVertexArray);
|
|
||||||
glDeleteBuffers(1, &screenVertexBuffer);
|
|
||||||
|
|
||||||
OpenGL::DeleteShaderProgram(screenShaderProgram);
|
|
||||||
|
|
||||||
OSD::DeInit();
|
|
||||||
|
|
||||||
oglContext->DoneCurrent();
|
|
||||||
oglContext = nullptr;
|
|
||||||
|
|
||||||
lastScreenWidth = lastScreenHeight = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmuThread::run()
|
void EmuThread::run()
|
||||||
{
|
{
|
||||||
u32 mainScreenPos[3];
|
u32 mainScreenPos[3];
|
||||||
|
@ -529,11 +416,13 @@ void EmuThread::run()
|
||||||
|
|
||||||
if (mainWindow->hasOGL)
|
if (mainWindow->hasOGL)
|
||||||
{
|
{
|
||||||
initOpenGL();
|
screenGL = static_cast<ScreenPanelGL*>(mainWindow->panel);
|
||||||
|
screenGL->initOpenGL();
|
||||||
videoRenderer = Config::_3DRenderer;
|
videoRenderer = Config::_3DRenderer;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
screenGL = nullptr;
|
||||||
videoRenderer = 0;
|
videoRenderer = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -654,9 +543,9 @@ void EmuThread::run()
|
||||||
// to the old setting again
|
// to the old setting again
|
||||||
if (videoSettingsDirty || Input::HotkeyReleased(HK_FastForward))
|
if (videoSettingsDirty || Input::HotkeyReleased(HK_FastForward))
|
||||||
{
|
{
|
||||||
if (oglContext)
|
if (screenGL)
|
||||||
{
|
{
|
||||||
oglContext->SetSwapInterval(Config::ScreenVSync ? Config::ScreenVSyncInterval : 0);
|
screenGL->setSwapInterval(Config::ScreenVSync ? Config::ScreenVSyncInterval : 0);
|
||||||
videoRenderer = Config::_3DRenderer;
|
videoRenderer = Config::_3DRenderer;
|
||||||
}
|
}
|
||||||
#ifdef OGLRENDERER_ENABLED
|
#ifdef OGLRENDERER_ENABLED
|
||||||
|
@ -666,7 +555,7 @@ void EmuThread::run()
|
||||||
videoRenderer = 0;
|
videoRenderer = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
videoRenderer = oglContext ? Config::_3DRenderer : 0;
|
videoRenderer = screenGL ? Config::_3DRenderer : 0;
|
||||||
|
|
||||||
videoSettingsDirty = false;
|
videoSettingsDirty = false;
|
||||||
|
|
||||||
|
@ -738,7 +627,7 @@ void EmuThread::run()
|
||||||
if (ROMManager::FirmwareSave)
|
if (ROMManager::FirmwareSave)
|
||||||
ROMManager::FirmwareSave->CheckFlush();
|
ROMManager::FirmwareSave->CheckFlush();
|
||||||
|
|
||||||
if (!oglContext)
|
if (!screenGL)
|
||||||
{
|
{
|
||||||
FrontBufferLock.lock();
|
FrontBufferLock.lock();
|
||||||
FrontBuffer = NDS->GPU.FrontBuffer;
|
FrontBuffer = NDS->GPU.FrontBuffer;
|
||||||
|
@ -747,7 +636,7 @@ void EmuThread::run()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FrontBuffer = NDS->GPU.FrontBuffer;
|
FrontBuffer = NDS->GPU.FrontBuffer;
|
||||||
drawScreenGL();
|
screenGL->drawScreenGL();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MELONCAP
|
#ifdef MELONCAP
|
||||||
|
@ -757,7 +646,7 @@ void EmuThread::run()
|
||||||
if (EmuRunning == emuStatus_Exit) break;
|
if (EmuRunning == emuStatus_Exit) break;
|
||||||
|
|
||||||
winUpdateCount++;
|
winUpdateCount++;
|
||||||
if (winUpdateCount >= winUpdateFreq && !oglContext)
|
if (winUpdateCount >= winUpdateFreq && !screenGL)
|
||||||
{
|
{
|
||||||
emit windowUpdate();
|
emit windowUpdate();
|
||||||
winUpdateCount = 0;
|
winUpdateCount = 0;
|
||||||
|
@ -765,9 +654,9 @@ void EmuThread::run()
|
||||||
|
|
||||||
bool fastforward = Input::HotkeyDown(HK_FastForward);
|
bool fastforward = Input::HotkeyDown(HK_FastForward);
|
||||||
|
|
||||||
if (fastforward && oglContext && Config::ScreenVSync)
|
if (fastforward && screenGL && Config::ScreenVSync)
|
||||||
{
|
{
|
||||||
oglContext->SetSwapInterval(0);
|
screenGL->setSwapInterval(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config::DSiVolumeSync && NDS->ConsoleType == 1)
|
if (Config::DSiVolumeSync && NDS->ConsoleType == 1)
|
||||||
|
@ -856,18 +745,20 @@ void EmuThread::run()
|
||||||
|
|
||||||
SDL_Delay(75);
|
SDL_Delay(75);
|
||||||
|
|
||||||
if (oglContext)
|
if (screenGL)
|
||||||
drawScreenGL();
|
screenGL->drawScreenGL();
|
||||||
|
|
||||||
ContextRequestKind contextRequest = ContextRequest;
|
ContextRequestKind contextRequest = ContextRequest;
|
||||||
if (contextRequest == contextRequest_InitGL)
|
if (contextRequest == contextRequest_InitGL)
|
||||||
{
|
{
|
||||||
initOpenGL();
|
screenGL = static_cast<ScreenPanelGL*>(mainWindow->panel);
|
||||||
|
screenGL->initOpenGL();
|
||||||
ContextRequest = contextRequest_None;
|
ContextRequest = contextRequest_None;
|
||||||
}
|
}
|
||||||
else if (contextRequest == contextRequest_DeInitGL)
|
else if (contextRequest == contextRequest_DeInitGL)
|
||||||
{
|
{
|
||||||
deinitOpenGL();
|
screenGL->deinitOpenGL();
|
||||||
|
screenGL = nullptr;
|
||||||
ContextRequest = contextRequest_None;
|
ContextRequest = contextRequest_None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -964,7 +855,7 @@ bool EmuThread::emuIsActive()
|
||||||
return (RunningSomething == 1);
|
return (RunningSomething == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmuThread::drawScreenGL()
|
/*void EmuThread::drawScreenGL()
|
||||||
{
|
{
|
||||||
if (!NDS) return;
|
if (!NDS) return;
|
||||||
int w = windowInfo.surface_width;
|
int w = windowInfo.surface_width;
|
||||||
|
@ -1029,7 +920,7 @@ void EmuThread::drawScreenGL()
|
||||||
OSD::DrawGL(w, h);
|
OSD::DrawGL(w, h);
|
||||||
|
|
||||||
oglContext->SwapBuffers();
|
oglContext->SwapBuffers();
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ public:
|
||||||
int FrontBuffer = 0;
|
int FrontBuffer = 0;
|
||||||
QMutex FrontBufferLock;
|
QMutex FrontBufferLock;
|
||||||
|
|
||||||
void updateScreenSettings(bool filter, const WindowInfo& windowInfo, int numScreens, int* screenKind, float* screenMatrix);
|
//void updateScreenSettings(bool filter, const WindowInfo& windowInfo, int numScreens, int* screenKind, float* screenMatrix);
|
||||||
|
|
||||||
/// Applies the config in args.
|
/// Applies the config in args.
|
||||||
/// Creates a new NDS console if needed,
|
/// Creates a new NDS console if needed,
|
||||||
|
@ -113,9 +113,9 @@ private:
|
||||||
std::unique_ptr<melonDS::NDSCart::CartCommon>&& ndscart,
|
std::unique_ptr<melonDS::NDSCart::CartCommon>&& ndscart,
|
||||||
std::unique_ptr<melonDS::GBACart::CartCommon>&& gbacart
|
std::unique_ptr<melonDS::GBACart::CartCommon>&& gbacart
|
||||||
) noexcept;
|
) noexcept;
|
||||||
void drawScreenGL();
|
//void drawScreenGL();
|
||||||
void initOpenGL();
|
//void initOpenGL();
|
||||||
void deinitOpenGL();
|
//void deinitOpenGL();
|
||||||
|
|
||||||
enum EmuStatusKind
|
enum EmuStatusKind
|
||||||
{
|
{
|
||||||
|
@ -141,7 +141,7 @@ private:
|
||||||
};
|
};
|
||||||
std::atomic<ContextRequestKind> ContextRequest = contextRequest_None;
|
std::atomic<ContextRequestKind> ContextRequest = contextRequest_None;
|
||||||
|
|
||||||
GL::Context* oglContext = nullptr;
|
/*GL::Context* oglContext = nullptr;
|
||||||
GLuint screenVertexBuffer, screenVertexArray;
|
GLuint screenVertexBuffer, screenVertexArray;
|
||||||
GLuint screenTexture;
|
GLuint screenTexture;
|
||||||
GLuint screenShaderProgram[3];
|
GLuint screenShaderProgram[3];
|
||||||
|
@ -154,7 +154,8 @@ private:
|
||||||
int numScreens;
|
int numScreens;
|
||||||
bool filter;
|
bool filter;
|
||||||
|
|
||||||
int lastScreenWidth = -1, lastScreenHeight = -1;
|
int lastScreenWidth = -1, lastScreenHeight = -1;*/
|
||||||
|
ScreenPanelGL* screenGL;
|
||||||
};
|
};
|
||||||
|
|
||||||
class MelonApplication : public QApplication
|
class MelonApplication : public QApplication
|
||||||
|
|
Loading…
Reference in New Issue