Change Qt to use QOpenGLWidget and support shared context and texture mailbox

This commit is contained in:
James Rowe 2019-09-16 20:38:48 -06:00
parent 27d0fc64d0
commit 91255b8802
3 changed files with 85 additions and 118 deletions

View file

@ -7,8 +7,7 @@
#include <atomic>
#include <condition_variable>
#include <mutex>
#include <QGLWidget>
#include <QImage>
#include <QOpenGLWidget>
#include <QThread>
#include "common/thread.h"
#include "core/core.h"
@ -17,16 +16,30 @@
class QKeyEvent;
class QScreen;
class QTouchEvent;
class QOffscreenSurface;
class QOpenGLContext;
class GGLWidgetInternal;
class GMainWindow;
class GRenderWindow;
class GGLContext : public Frontend::GraphicsContext {
public:
explicit GGLContext(QOpenGLContext* shared_context);
void MakeCurrent() override;
void DoneCurrent() override;
private:
QOpenGLContext* context;
QOffscreenSurface* surface;
};
class EmuThread final : public QThread {
Q_OBJECT
public:
explicit EmuThread(GRenderWindow* render_window);
explicit EmuThread(Frontend::GraphicsContext& context);
~EmuThread() override;
/**
@ -80,7 +93,7 @@ private:
std::mutex running_mutex;
std::condition_variable running_cv;
GRenderWindow* render_window;
Frontend::GraphicsContext& core_context;
signals:
/**
@ -104,18 +117,20 @@ signals:
void ErrorThrown(Core::System::ResultStatus, std::string);
};
class GRenderWindow : public QWidget, public Frontend::EmuWindow {
class GRenderWindow : public QOpenGLWidget, public Frontend::EmuWindow {
Q_OBJECT
public:
GRenderWindow(QWidget* parent, EmuThread* emu_thread);
~GRenderWindow() override;
// EmuWindow implementation
void SwapBuffers() override;
// EmuWindow implementation.
void MakeCurrent() override;
void DoneCurrent() override;
void PollEvents() override;
std::unique_ptr<Frontend::GraphicsContext> CreateSharedContext() const override;
void paintGL() override;
void BackupGeometry();
void RestoreGeometry();
@ -126,6 +141,8 @@ public:
void closeEvent(QCloseEvent* event) override;
void resizeEvent(QResizeEvent* event) override;
void keyPressEvent(QKeyEvent* event) override;
void keyReleaseEvent(QKeyEvent* event) override;
@ -137,14 +154,11 @@ public:
void focusOutEvent(QFocusEvent* event) override;
void OnClientAreaResized(u32 width, u32 height);
void InitRenderTarget();
void CaptureScreenshot(u32 res_scale, const QString& screenshot_path);
public slots:
void moveContext(); // overridden
void OnEmulationStarting(EmuThread* emu_thread);
void OnEmulationStopping();
@ -162,7 +176,7 @@ private:
void OnMinimalClientAreaChangeRequest(std::pair<u32, u32> minimal_size) override;
GGLWidgetInternal* child;
std::unique_ptr<GraphicsContext> core_context;
QByteArray geometry;