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