ppsspp/Qt/QtMain.h

197 lines
3.6 KiB
C
Raw Normal View History

2012-12-16 09:47:51 +00:00
#ifndef QTMAIN_H
#define QTMAIN_H
#include <QTouchEvent>
#include <QMouseEvent>
#include <QInputDialog>
#include "gfx_es2/glsl_program.h"
#include <QGLWidget>
2014-12-18 22:57:59 +00:00
#ifndef SDL
2012-12-16 09:47:51 +00:00
#include <QAudioOutput>
#include <QAudioFormat>
#endif
2016-10-12 10:32:20 +00:00
#if defined(MOBILE_DEVICE)
#include <QAccelerometer>
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
QTM_USE_NAMESPACE
#endif
#endif
#include <cassert>
2018-01-31 11:05:18 +00:00
#include <atomic>
#include <thread>
#include "base/display.h"
#include "base/logging.h"
#include "base/timeutil.h"
#include "file/zip_read.h"
2015-09-06 11:44:06 +00:00
#include "gfx/gl_common.h"
#include "gfx_es2/gpu_features.h"
#include "input/input_state.h"
2013-07-08 00:04:20 +00:00
#include "input/keycodes.h"
2016-01-03 14:03:08 +00:00
#include "thin3d/thin3d.h"
#include "base/NativeApp.h"
#include "net/resolve.h"
#include "NKCodeFromQt.h"
2016-01-03 14:03:08 +00:00
#include "Common/GraphicsContext.h"
#include "Core/Core.h"
#include "Core/Config.h"
#include "Core/ConfigValues.h"
#include "Core/System.h"
#include "thin3d/thin3d_create.h"
2018-01-31 11:05:18 +00:00
#include "thin3d/GLRenderManager.h"
// Input
2017-03-15 05:01:18 +00:00
void SimulateGamepad();
class QtGLGraphicsContext : public GraphicsContext {
2016-01-03 14:03:08 +00:00
public:
QtGLGraphicsContext() {
CheckGLExtensions();
draw_ = Draw::T3DCreateGLContext();
SetGPUBackend(GPUBackend::OPENGL);
2018-01-31 11:05:18 +00:00
renderManager_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER);
renderManager_->SetInflightFrames(g_Config.iInflightFrames);
bool success = draw_->CreatePresets();
_assert_msg_(success, "Failed to compile preset shaders");
// TODO: Need to figure out how to implement SetSwapInterval for Qt.
2016-01-03 14:03:08 +00:00
}
2018-01-31 11:05:18 +00:00
~QtGLGraphicsContext() {
delete draw_;
2018-01-31 11:05:18 +00:00
draw_ = nullptr;
renderManager_ = nullptr;
}
void Shutdown() override {}
void SwapInterval(int interval) override {
// See TODO in constructor.
// renderManager_->SwapInterval(interval);
}
void SwapBuffers() override {}
void Resize() override {}
Draw::DrawContext *GetDrawContext() override {
return draw_;
}
2018-01-31 11:05:18 +00:00
void ThreadStart() override {
renderManager_->ThreadStart(draw_);
2018-01-31 11:05:18 +00:00
}
bool ThreadFrame() override {
return renderManager_->ThreadFrame();
}
void ThreadEnd() override {
renderManager_->ThreadEnd();
}
void StopThread() override {
renderManager_->WaitUntilQueueIdle();
renderManager_->StopThread();
}
private:
2018-01-31 11:05:18 +00:00
Draw::DrawContext *draw_ = nullptr;
GLRenderManager *renderManager_ = nullptr;
};
enum class EmuThreadState {
DISABLED,
START_REQUESTED,
RUNNING,
QUIT_REQUESTED,
STOPPED,
2016-01-03 14:03:08 +00:00
};
2018-01-31 11:05:18 +00:00
// GUI, thread manager
class MainUI : public QGLWidget
{
Q_OBJECT
public:
explicit MainUI(QWidget *parent = 0);
~MainUI();
void resizeGL(int w, int h);
public slots:
QString InputBoxGetQString(QString title, QString defaultValue);
signals:
void doubleClick();
void newFrame();
protected:
void timerEvent(QTimerEvent *);
void changeEvent(QEvent *e);
bool event(QEvent *e);
void initializeGL();
void paintGL();
void updateAccelerometer();
2018-01-31 11:05:18 +00:00
void EmuThreadFunc();
void EmuThreadStart();
void EmuThreadStop();
void EmuThreadJoin();
2018-01-31 11:05:18 +00:00
private:
QtGLGraphicsContext *graphicsContext;
float xscale, yscale;
2016-10-12 10:32:20 +00:00
#if defined(MOBILE_DEVICE)
QAccelerometer* acc;
#endif
2018-01-31 11:05:18 +00:00
std::thread emuThread;
std::atomic<int> emuThreadState;
};
class QTCamera : public QObject {
Q_OBJECT
public:
QTCamera() {}
~QTCamera() {};
signals:
void onStartCamera(int width, int height);
void onStopCamera();
public slots:
void startCamera(int width, int height);
void stopCamera();
};
2016-02-10 11:37:47 +00:00
extern MainUI* emugl;
2014-12-18 22:57:59 +00:00
#ifndef SDL
// Audio
class MainAudio : public QObject {
2012-12-16 09:47:51 +00:00
Q_OBJECT
public:
2016-02-10 11:37:47 +00:00
MainAudio() {}
~MainAudio();
2013-10-26 09:51:29 +00:00
public slots:
void run();
2013-01-15 10:45:26 +00:00
protected:
void timerEvent(QTimerEvent *);
2012-12-16 09:47:51 +00:00
private:
QIODevice* feed;
QAudioOutput* output;
int mixlen;
char* mixbuf;
2013-01-31 22:49:37 +00:00
int timer;
2012-12-16 09:47:51 +00:00
};
2014-12-18 22:57:59 +00:00
#endif //SDL
#endif