mirror of https://github.com/mgba-emu/mgba.git
131 lines
2.9 KiB
C++
131 lines
2.9 KiB
C++
/* Copyright (c) 2013-2015 Jeffrey Pfau
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
#ifndef QGBA_DISPLAY_GL
|
|
#define QGBA_DISPLAY_GL
|
|
|
|
#include "Display.h"
|
|
|
|
#ifdef USE_EPOXY
|
|
#include <epoxy/gl.h>
|
|
#ifndef GLdouble
|
|
#define GLdouble GLdouble
|
|
#endif
|
|
#endif
|
|
|
|
#include <QElapsedTimer>
|
|
#include <QGLWidget>
|
|
#include <QList>
|
|
#include <QMouseEvent>
|
|
#include <QQueue>
|
|
#include <QThread>
|
|
|
|
#include "platform/video-backend.h"
|
|
|
|
namespace QGBA {
|
|
|
|
class EmptyGLWidget : public QGLWidget {
|
|
public:
|
|
EmptyGLWidget(const QGLFormat& format, QWidget* parent) : QGLWidget(format, parent) { setAutoBufferSwap(false); }
|
|
|
|
protected:
|
|
void paintEvent(QPaintEvent*) override {}
|
|
void resizeEvent(QResizeEvent*) override {}
|
|
void mouseMoveEvent(QMouseEvent* event) override { event->ignore(); }
|
|
};
|
|
|
|
class PainterGL;
|
|
class DisplayGL : public Display {
|
|
Q_OBJECT
|
|
|
|
public:
|
|
DisplayGL(const QGLFormat& format, QWidget* parent = nullptr);
|
|
~DisplayGL();
|
|
|
|
bool isDrawing() const override { return m_isDrawing; }
|
|
bool supportsShaders() const override;
|
|
VideoShader* shaders() override;
|
|
|
|
public slots:
|
|
void startDrawing(mCoreThread* context) override;
|
|
void stopDrawing() override;
|
|
void pauseDrawing() override;
|
|
void unpauseDrawing() override;
|
|
void forceDraw() override;
|
|
void lockAspectRatio(bool lock) override;
|
|
void lockIntegerScaling(bool lock) override;
|
|
void filter(bool filter) override;
|
|
void framePosted(const uint32_t*) override;
|
|
void setShaders(struct VDir*) override;
|
|
void clearShaders() override;
|
|
|
|
protected:
|
|
virtual void paintEvent(QPaintEvent*) override {}
|
|
virtual void resizeEvent(QResizeEvent*) override;
|
|
|
|
private:
|
|
void resizePainter();
|
|
|
|
bool m_isDrawing;
|
|
QGLWidget* m_gl;
|
|
PainterGL* m_painter;
|
|
QThread* m_drawThread;
|
|
mCoreThread* m_context;
|
|
};
|
|
|
|
class PainterGL : public QObject {
|
|
Q_OBJECT
|
|
|
|
public:
|
|
PainterGL(int majorVersion, QGLWidget* parent);
|
|
~PainterGL();
|
|
|
|
void setContext(mCoreThread*);
|
|
void setMessagePainter(MessagePainter*);
|
|
void enqueue(const uint32_t* backing);
|
|
|
|
bool supportsShaders() const { return m_supportsShaders; }
|
|
|
|
public slots:
|
|
void forceDraw();
|
|
void draw();
|
|
void start();
|
|
void stop();
|
|
void pause();
|
|
void unpause();
|
|
void resize(const QSize& size);
|
|
void lockAspectRatio(bool lock);
|
|
void lockIntegerScaling(bool lock);
|
|
void filter(bool filter);
|
|
|
|
void setShaders(struct VDir*);
|
|
void clearShaders();
|
|
VideoShader* shaders();
|
|
|
|
private:
|
|
void performDraw();
|
|
void dequeue();
|
|
void dequeueAll();
|
|
|
|
QList<uint32_t*> m_free;
|
|
QQueue<uint32_t*> m_queue;
|
|
QPainter m_painter;
|
|
QMutex m_mutex;
|
|
QGLWidget* m_gl;
|
|
bool m_active;
|
|
bool m_started;
|
|
mCoreThread* m_context;
|
|
bool m_supportsShaders;
|
|
VideoShader m_shader;
|
|
VideoBackend* m_backend;
|
|
QSize m_size;
|
|
MessagePainter* m_messagePainter;
|
|
QElapsedTimer m_delayTimer;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|