diff options
Diffstat (limited to 'src/frontend/qt_sdl/main.h')
-rw-r--r-- | src/frontend/qt_sdl/main.h | 74 |
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; |