aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/qt_sdl/main.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/qt_sdl/main.h')
-rw-r--r--src/frontend/qt_sdl/main.h74
1 files changed, 51 insertions, 23 deletions
diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h
index 1977b7f..2e2a9ab 100644
--- a/src/frontend/qt_sdl/main.h
+++ b/src/frontend/qt_sdl/main.h
@@ -19,6 +19,8 @@
#ifndef MAIN_H
#define MAIN_H
+#include "glad/glad.h"
+
#include <QApplication>
#include <QThread>
#include <QWidget>
@@ -28,15 +30,15 @@
#include <QActionGroup>
#include <QTimer>
#include <QMutex>
+#include <QScreen>
+#include <QCloseEvent>
+
+#include <atomic>
-#include <QOffscreenSurface>
-#include <QOpenGLWidget>
-#include <QOpenGLContext>
-#include <QOpenGLFunctions>
-#include <QOpenGLFunctions_3_2_Core>
-#include <QOpenGLShaderProgram>
+#include <optional>
#include "FrontendUtil.h"
+#include "duckstation/gl/context.h"
class EmuThread : public QThread
{
@@ -46,9 +48,6 @@ class EmuThread : public QThread
public:
explicit EmuThread(QObject* parent = nullptr);
- void initOpenGL();
- void deinitOpenGL();
-
void changeWindowTitle(char* title);
// to be called from the UI thread
@@ -61,11 +60,13 @@ public:
bool emuIsRunning();
bool emuIsActive();
+ void initContext();
+ void deinitContext();
+
int FrontBuffer = 0;
QMutex FrontBufferLock;
- GLsync FrontBufferReverseSyncs[2] = {nullptr, nullptr};
- GLsync FrontBufferSyncs[2] = {nullptr, nullptr};
+ void updateScreenSettings(bool filter, const WindowInfo& windowInfo, int numScreens, int* screenKind, float* screenMatrix);
signals:
void windowUpdate();
@@ -86,13 +87,31 @@ signals:
void swapScreensToggle();
private:
- volatile int EmuStatus;
+ void drawScreenGL();
+ void initOpenGL();
+ void deinitOpenGL();
+
+ std::atomic<int> EmuStatus;
int PrevEmuStatus;
int EmuRunning;
int EmuPause;
- QOffscreenSurface* oglSurface;
- QOpenGLContext* oglContext;
+ std::atomic<int> ContextRequest = 0;
+
+ GL::Context* oglContext = nullptr;
+ GLuint screenVertexBuffer, screenVertexArray;
+ GLuint screenTexture;
+ GLuint screenShaderProgram[3];
+ GLuint screenShaderTransformULoc, screenShaderScreenSizeULoc;
+
+ QMutex screenSettingsLock;
+ WindowInfo windowInfo;
+ float screenMatrix[Frontend::MaxScreenTransforms][6];
+ int screenKind[Frontend::MaxScreenTransforms];
+ int numScreens;
+ bool filter;
+
+ int lastScreenWidth = -1, lastScreenHeight = -1;
};
@@ -158,7 +177,7 @@ private:
};
-class ScreenPanelGL : public QOpenGLWidget, public ScreenHandler, protected QOpenGLFunctions_3_2_Core
+class ScreenPanelGL : public QWidget, public ScreenHandler
{
Q_OBJECT
@@ -166,13 +185,22 @@ public:
explicit ScreenPanelGL(QWidget* parent);
virtual ~ScreenPanelGL();
+ std::optional<WindowInfo> getWindowInfo();
+
+ bool createContext();
+
+ GL::Context* getContext() { return glContext.get(); }
+
+ void transferLayout(EmuThread* thread);
protected:
- void initializeGL() override;
- void paintGL() override;
+ qreal devicePixelRatioFromScreen() const;
+ int scaledWindowWidth() const;
+ int scaledWindowHeight() const;
+
+ QPaintEngine* paintEngine() const override;
void resizeEvent(QResizeEvent* event) override;
- void resizeGL(int w, int h) override;
void mousePressEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
@@ -180,16 +208,14 @@ protected:
void tabletEvent(QTabletEvent* event) override;
bool event(QEvent* event) override;
+
private slots:
void onScreenLayoutChanged();
private:
void setupScreenLayout();
- QOpenGLShaderProgram* screenShader;
- GLuint screenVertexBuffer;
- GLuint screenVertexArray;
- GLuint screenTexture;
+ std::unique_ptr<GL::Context> glContext;
};
class MelonApplication : public QApplication
@@ -210,7 +236,7 @@ public:
~MainWindow();
bool hasOGL;
- QOpenGLContext* getOGLContext();
+ GL::Context* getOGLContext();
bool preloadROMs(QString filename, QString gbafilename);
@@ -306,6 +332,8 @@ private slots:
void onFullscreenToggled();
private:
+ void closeEvent(QCloseEvent* event);
+
QStringList currentROM;
QStringList currentGBAROM;
QList<QString> recentFileList;