2018-03-24 11:44:53 +00:00
|
|
|
#pragma once
|
|
|
|
#include <atomic>
|
|
|
|
|
|
|
|
#include "libretro/libretro.h"
|
|
|
|
#include "Common/GraphicsContext.h"
|
|
|
|
#include "thin3d/thin3d_create.h"
|
|
|
|
|
|
|
|
#include "Core/System.h"
|
|
|
|
#include "GPU/GPUState.h"
|
|
|
|
|
|
|
|
class LibretroGraphicsContext : public GraphicsContext {
|
2018-03-26 16:37:34 +00:00
|
|
|
public:
|
2018-03-24 11:44:53 +00:00
|
|
|
LibretroGraphicsContext() {}
|
2018-03-26 16:37:34 +00:00
|
|
|
~LibretroGraphicsContext() override { Shutdown(); }
|
2018-03-24 11:44:53 +00:00
|
|
|
|
|
|
|
virtual bool Init() = 0;
|
|
|
|
virtual void SetRenderTarget() {}
|
|
|
|
virtual GPUCore GetGPUCore() = 0;
|
|
|
|
virtual const char *Ident() = 0;
|
|
|
|
|
2018-03-26 16:37:34 +00:00
|
|
|
void Shutdown() override {
|
2018-03-24 11:44:53 +00:00
|
|
|
DestroyDrawContext();
|
|
|
|
PSP_CoreParameter().thin3d = nullptr;
|
|
|
|
}
|
|
|
|
void SwapInterval(int interval) override {}
|
|
|
|
void Resize() override {}
|
|
|
|
|
2018-03-25 22:07:02 +00:00
|
|
|
virtual void GotBackbuffer();
|
|
|
|
virtual void LostBackbuffer();
|
|
|
|
|
2018-03-24 11:44:53 +00:00
|
|
|
virtual void CreateDrawContext() {}
|
2018-03-26 16:37:34 +00:00
|
|
|
virtual void DestroyDrawContext() {
|
|
|
|
if (!draw_) {
|
2018-03-24 11:44:53 +00:00
|
|
|
return;
|
2018-03-26 16:37:34 +00:00
|
|
|
}
|
2018-03-24 11:44:53 +00:00
|
|
|
delete draw_;
|
|
|
|
draw_ = nullptr;
|
|
|
|
}
|
|
|
|
Draw::DrawContext *GetDrawContext() override { return draw_; }
|
|
|
|
|
|
|
|
static LibretroGraphicsContext *CreateGraphicsContext();
|
|
|
|
|
|
|
|
static retro_video_refresh_t video_cb;
|
|
|
|
|
2018-03-26 16:37:34 +00:00
|
|
|
protected:
|
2018-03-24 11:44:53 +00:00
|
|
|
Draw::DrawContext *draw_ = nullptr;
|
|
|
|
};
|
|
|
|
|
|
|
|
class LibretroHWRenderContext : public LibretroGraphicsContext {
|
2018-03-26 16:37:34 +00:00
|
|
|
public:
|
2018-03-24 11:44:53 +00:00
|
|
|
LibretroHWRenderContext(retro_hw_context_type context_type, unsigned version_major = 0, unsigned version_minor = 0);
|
2018-03-26 16:21:11 +00:00
|
|
|
bool Init(bool cache_context);
|
2018-03-24 11:44:53 +00:00
|
|
|
void SetRenderTarget() override {}
|
2018-03-26 16:37:34 +00:00
|
|
|
void SwapBuffers() override {
|
|
|
|
if (gstate_c.skipDrawReason) {
|
2018-03-24 11:44:53 +00:00
|
|
|
video_cb(NULL, 0, 0, 0);
|
2018-03-26 16:37:34 +00:00
|
|
|
} else {
|
2018-03-24 11:44:53 +00:00
|
|
|
video_cb(RETRO_HW_FRAME_BUFFER_VALID, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight, 0);
|
2018-03-26 16:37:34 +00:00
|
|
|
}
|
2018-03-24 11:44:53 +00:00
|
|
|
}
|
|
|
|
virtual void ContextReset();
|
|
|
|
virtual void ContextDestroy();
|
|
|
|
|
2018-03-26 16:37:34 +00:00
|
|
|
protected:
|
2018-03-24 11:44:53 +00:00
|
|
|
retro_hw_render_callback hw_render_ = {};
|
|
|
|
};
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
class LibretroD3D9Context : public LibretroHWRenderContext {
|
2018-03-26 16:37:34 +00:00
|
|
|
public:
|
2018-03-24 11:44:53 +00:00
|
|
|
LibretroD3D9Context() : LibretroHWRenderContext(RETRO_HW_CONTEXT_DIRECT3D, 9) {}
|
|
|
|
bool Init() override { return false; }
|
2018-03-24 12:39:05 +00:00
|
|
|
|
2018-03-26 16:37:34 +00:00
|
|
|
void CreateDrawContext() override {
|
2018-03-24 21:47:12 +00:00
|
|
|
draw_ = Draw::T3DCreateDX9Context(nullptr, nullptr, 0, nullptr, nullptr);
|
2018-03-24 12:39:05 +00:00
|
|
|
draw_->CreatePresets();
|
|
|
|
}
|
|
|
|
|
2018-03-24 11:44:53 +00:00
|
|
|
GPUCore GetGPUCore() override { return GPUCORE_DIRECTX9; }
|
|
|
|
const char *Ident() override { return "DirectX 9"; }
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
class LibretroSoftwareContext : public LibretroGraphicsContext {
|
2018-03-26 16:37:34 +00:00
|
|
|
public:
|
2018-03-24 11:44:53 +00:00
|
|
|
LibretroSoftwareContext() {}
|
|
|
|
bool Init() override { return true; }
|
|
|
|
void SwapBuffers() override { video_cb(NULL, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight, 0); }
|
|
|
|
GPUCore GetGPUCore() override { return GPUCORE_SOFTWARE; }
|
|
|
|
const char *Ident() override { return "Software"; }
|
|
|
|
};
|
|
|
|
|
|
|
|
class LibretroNullContext : public LibretroGraphicsContext {
|
2018-03-26 16:37:34 +00:00
|
|
|
public:
|
2018-03-24 11:44:53 +00:00
|
|
|
LibretroNullContext() {}
|
|
|
|
|
|
|
|
bool Init() override { return true; }
|
|
|
|
void SwapBuffers() override { video_cb(NULL, 0, 0, 0); }
|
|
|
|
GPUCore GetGPUCore() override { return GPUCORE_NULL; }
|
|
|
|
const char *Ident() override { return "NULL"; }
|
|
|
|
};
|
|
|
|
|
|
|
|
namespace Libretro {
|
|
|
|
extern LibretroGraphicsContext *ctx;
|
|
|
|
extern retro_environment_t environ_cb;
|
|
|
|
|
2018-03-26 16:37:34 +00:00
|
|
|
enum class EmuThreadState {
|
2018-03-24 11:44:53 +00:00
|
|
|
DISABLED,
|
|
|
|
START_REQUESTED,
|
|
|
|
RUNNING,
|
|
|
|
PAUSE_REQUESTED,
|
|
|
|
PAUSED,
|
|
|
|
QUIT_REQUESTED,
|
|
|
|
STOPPED,
|
|
|
|
};
|
|
|
|
extern bool useEmuThread;
|
|
|
|
extern std::atomic<EmuThreadState> emuThreadState;
|
|
|
|
void EmuThreadStart();
|
|
|
|
void EmuThreadStop();
|
|
|
|
void EmuThreadPause();
|
2018-03-26 16:37:34 +00:00
|
|
|
} // namespace Libretro
|