1 #pragma once
2 #include <atomic>
3 
4 #include "libretro/libretro.h"
5 #include "Common/GraphicsContext.h"
6 #include "Common/GPU/thin3d_create.h"
7 
8 #include "Core/System.h"
9 #include "GPU/GPUState.h"
10 
11 class LibretroGraphicsContext : public GraphicsContext {
12 public:
LibretroGraphicsContext()13 	LibretroGraphicsContext() {}
~LibretroGraphicsContext()14 	~LibretroGraphicsContext() override { Shutdown(); }
15 
16 	virtual bool Init() = 0;
SetRenderTarget()17 	virtual void SetRenderTarget() {}
18 	virtual GPUCore GetGPUCore() = 0;
19 	virtual const char *Ident() = 0;
20 
Shutdown()21 	void Shutdown() override {
22 		DestroyDrawContext();
23 	}
SwapInterval(int interval)24 	void SwapInterval(int interval) override {}
Resize()25 	void Resize() override {}
26 
27 	virtual void GotBackbuffer();
28 	virtual void LostBackbuffer();
29 
CreateDrawContext()30 	virtual void CreateDrawContext() {}
DestroyDrawContext()31 	virtual void DestroyDrawContext() {
32 		if (!draw_) {
33 			return;
34 		}
35 		delete draw_;
36 		draw_ = nullptr;
37 	}
GetDrawContext()38 	Draw::DrawContext *GetDrawContext() override { return draw_; }
39 
40 	static LibretroGraphicsContext *CreateGraphicsContext();
41 
42 	static retro_video_refresh_t video_cb;
43 
44 protected:
45 	Draw::DrawContext *draw_ = nullptr;
46 };
47 
48 class LibretroHWRenderContext : public LibretroGraphicsContext {
49 public:
50 	LibretroHWRenderContext(retro_hw_context_type context_type, unsigned version_major = 0, unsigned version_minor = 0);
51 	bool Init(bool cache_context);
SetRenderTarget()52 	void SetRenderTarget() override {}
SwapBuffers()53 	void SwapBuffers() override {
54       video_cb(RETRO_HW_FRAME_BUFFER_VALID, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight, 0);
55 	}
56 	virtual void ContextReset();
57 	virtual void ContextDestroy();
58 
59 protected:
60 	retro_hw_render_callback hw_render_ = {};
61 };
62 
63 #ifdef _WIN32
64 class LibretroD3D9Context : public LibretroHWRenderContext {
65 public:
LibretroD3D9Context()66 	LibretroD3D9Context() : LibretroHWRenderContext(RETRO_HW_CONTEXT_DIRECT3D, 9) {}
Init()67 	bool Init() override { return false; }
68 
CreateDrawContext()69 	void CreateDrawContext() override {
70 		draw_ = Draw::T3DCreateDX9Context(nullptr, nullptr, 0, nullptr, nullptr);
71 		draw_->CreatePresets();
72 	}
73 
GetGPUCore()74 	GPUCore GetGPUCore() override { return GPUCORE_DIRECTX9; }
Ident()75 	const char *Ident() override { return "DirectX 9"; }
76 };
77 #endif
78 
79 class LibretroSoftwareContext : public LibretroGraphicsContext {
80 public:
LibretroSoftwareContext()81 	LibretroSoftwareContext() {}
Init()82 	bool Init() override { return true; }
SwapBuffers()83 	void SwapBuffers() override { video_cb(NULL, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight, 0); }
GetGPUCore()84 	GPUCore GetGPUCore() override { return GPUCORE_SOFTWARE; }
Ident()85 	const char *Ident() override { return "Software"; }
86 };
87 
88 namespace Libretro {
89 extern LibretroGraphicsContext *ctx;
90 extern retro_environment_t environ_cb;
91 
92 enum class EmuThreadState {
93 	DISABLED,
94 	START_REQUESTED,
95 	RUNNING,
96 	PAUSE_REQUESTED,
97 	PAUSED,
98 	QUIT_REQUESTED,
99 	STOPPED,
100 };
101 extern bool useEmuThread;
102 extern std::atomic<EmuThreadState> emuThreadState;
103 void EmuThreadStart();
104 void EmuThreadStop();
105 void EmuThreadPause();
106 } // namespace Libretro
107