DDNet documentation
Loading...
Searching...
No Matches
backend_sdl.h
Go to the documentation of this file.
1#ifndef ENGINE_CLIENT_BACKEND_SDL_H
2#define ENGINE_CLIENT_BACKEND_SDL_H
3
4#include <base/detect.h>
5
8#include <engine/graphics.h>
9
10#include <SDL_video.h>
11
12#include <atomic>
13#include <condition_variable>
14#include <cstddef>
15#include <cstdint>
16#include <mutex>
17#include <vector>
18
19#if defined(CONF_PLATFORM_MACOS) || defined(CONF_PLATFORM_IOS)
20#include <objc/message.h>
21#include <objc/runtime.h>
22
23class CAutoreleasePool
24{
25private:
26 id m_Pool;
27
28public:
29 CAutoreleasePool()
30 {
31 Class NSAutoreleasePoolClass = (Class)objc_getClass("NSAutoreleasePool");
32 m_Pool = class_createInstance(NSAutoreleasePoolClass, 0);
33 SEL selector = sel_registerName("init");
34 ((id (*)(id, SEL))objc_msgSend)(m_Pool, selector);
35 }
36
37 ~CAutoreleasePool()
38 {
39 SEL selector = sel_registerName("drain");
40 ((id (*)(id, SEL))objc_msgSend)(m_Pool, selector);
41 }
42};
43#endif
44
45// basic threaded backend, abstract, missing init and shutdown functions
47{
48private:
50 std::string m_FatalError;
52
53public:
54 // constructed on the main thread, the rest of the functions is run on the render thread
56 {
57 public:
58 virtual ~ICommandProcessor() = default;
59 virtual void RunBuffer(CCommandBuffer *pBuffer) = 0;
60
61 virtual const SGfxErrorContainer &GetError() const = 0;
62 virtual void ErroneousCleanup() = 0;
63
64 virtual const SGfxWarningContainer &GetWarning() const = 0;
65 };
66
68
69 void RunBuffer(CCommandBuffer *pBuffer) override;
70 void RunBufferSingleThreadedUnsafe(CCommandBuffer *pBuffer) override;
71 bool IsIdle() const override;
72 void WaitForIdle() override;
73
74 void ProcessError(const SGfxErrorContainer &Error);
75
76protected:
77 void StartProcessor(ICommandProcessor *pProcessor);
78 void StopProcessor();
79
80 bool HasWarning() const
81 {
83 }
84
85private:
87 std::atomic_bool m_Shutdown;
88#if !defined(CONF_PLATFORM_EMSCRIPTEN)
90 std::condition_variable m_BufferSwapCond;
92 bool m_Started = false;
93 std::atomic_bool m_BufferInProcess;
94 void *m_pThread;
95 static void ThreadFunc(void *pUser);
96#endif
97
98public:
99 const char *GetFatalError() const override;
100 bool GetWarning(std::vector<std::string> &WarningStrings) override;
101};
102
103// takes care of implementation independent operations
105{
106 void Cmd_Signal(const CCommandBuffer::SCommand_Signal *pCommand);
107
108public:
109 bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand);
110};
111
133
134// takes care of sdl related commands
136{
137 // SDL stuff
138 SDL_Window *m_pWindow = nullptr;
139 SDL_GLContext m_GLContext = nullptr;
140
141public:
142 enum
143 {
146 };
147
149 {
152 SDL_Window *m_pWindow;
153 SDL_GLContext m_GLContext;
154 };
155
161
162private:
163 void Cmd_Init(const SCommand_Init *pCommand);
164 void Cmd_Shutdown(const SCommand_Shutdown *pCommand);
165 void Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand);
166 void Cmd_VSync(const CCommandBuffer::SCommand_VSync *pCommand);
169
170public:
172
173 bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand);
174};
175
176// command processor implementation, uses the fragments to combine into one processor
201
202static constexpr size_t GPU_INFO_STRING_SIZE = 256;
203
204// graphics backend implemented with SDL and the graphics library @see EBackendType
206{
207 SDL_Window *m_pWindow = nullptr;
208 SDL_GLContext m_GLContext = nullptr;
210 std::atomic<uint64_t> m_TextureMemoryUsage{0};
211 std::atomic<uint64_t> m_BufferMemoryUsage{0};
212 std::atomic<uint64_t> m_StreamMemoryUsage{0};
213 std::atomic<uint64_t> m_StagingMemoryUsage{0};
214
216
218
220
222
226
228
229 char m_aErrorString[256];
230
232 static void ClampDriverVersion(EBackendType BackendType);
233
234public:
236 int Init(const char *pName, int *pScreen, int *pWidth, int *pHeight, int *pRefreshRate, int *pFsaaSamples, int Flags, int *pDesktopWidth, int *pDesktopHeight, int *pCurrentWidth, int *pCurrentHeight, class IStorage *pStorage) override;
237 int Shutdown() override;
238
239 uint64_t TextureMemoryUsage() const override;
240 uint64_t BufferMemoryUsage() const override;
241 uint64_t StreamedMemoryUsage() const override;
242 uint64_t StagingMemoryUsage() const override;
243
244 const TTwGraphicsGpuList &GetGpus() const override;
245
246 int GetNumScreens() const override { return m_NumScreens; }
247 const char *GetScreenName(int Screen) const override;
248
249 void GetVideoModes(CVideoMode *pModes, int MaxModes, int *pNumModes, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override;
250 void GetCurrentVideoMode(CVideoMode &CurMode, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override;
251
252 void Minimize() override;
253 void SetWindowParams(int FullscreenMode, bool IsBorderless) override;
254 bool SetWindowScreen(int Index, bool MoveToCenter, ivec2 *pDesktopSize) override;
255 bool UpdateDisplayMode(int Index, ivec2 *pDesktopSize) override;
256 int GetWindowScreen() override;
257 int WindowActive() override;
258 int WindowOpen() override;
259 void SetWindowGrab(bool Grab) override;
260 bool ResizeWindow(int w, int h, int RefreshRate) override;
261 void GetViewportSize(int &w, int &h) override;
262 void GetDisplayCutoutInsets(int &Left, int &Right) override;
263 void NotifyWindow() override;
264 bool IsScreenKeyboardShown() override;
265
266 void WindowDestroyNtf(uint32_t WindowId) override;
267 void WindowCreateNtf(uint32_t WindowId) override;
268
269 bool GetDriverVersion(EGraphicsDriverAgeType DriverAgeType, int &Major, int &Minor, int &Patch, const char *&pName, EBackendType BackendType) override;
270 bool IsConfigModernAPI() override { return IsModernAPI(m_BackendType); }
278
279 const char *GetErrorString() override
280 {
281 if(m_aErrorString[0] != '\0')
282 return m_aErrorString;
283
284 return nullptr;
285 }
286
287 const char *GetVendorString() override
288 {
289 return m_aVendorString;
290 }
291
292 const char *GetVersionString() override
293 {
294 return m_aVersionString;
295 }
296
297 const char *GetRendererString() override
298 {
299 return m_aRendererString;
300 }
301
303
304 std::optional<int> ShowMessageBox(const IGraphics::CMessageBox &MessageBox) override;
305
306 static bool IsModernAPI(EBackendType BackendType);
307};
308
309#endif // ENGINE_CLIENT_BACKEND_SDL_H
@ GFX_WARNING_TYPE_NONE
Definition backend_base.h:50
static constexpr size_t GPU_INFO_STRING_SIZE
Definition backend_sdl.h:202
Definition graphics_threaded.h:48
@ CMDGROUP_PLATFORM_SDL
Definition graphics_threaded.h:113
Definition backend_base.h:82
Definition backend_sdl.h:105
void Cmd_Signal(const CCommandBuffer::SCommand_Signal *pCommand)
Definition backend_sdl.cpp:238
bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand)
Definition backend_sdl.cpp:243
Definition backend_sdl.h:136
void Cmd_WindowCreateNtf(const CCommandBuffer::SCommand_WindowCreateNtf *pCommand)
Definition backend_sdl.cpp:290
void Cmd_VSync(const CCommandBuffer::SCommand_VSync *pCommand)
Definition backend_sdl.cpp:275
SDL_GLContext m_GLContext
Definition backend_sdl.h:139
bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand)
Definition backend_sdl.cpp:312
void Cmd_Init(const SCommand_Init *pCommand)
Definition backend_sdl.cpp:255
void Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand)
Definition backend_sdl.cpp:269
void Cmd_WindowDestroyNtf(const CCommandBuffer::SCommand_WindowDestroyNtf *pCommand)
Definition backend_sdl.cpp:301
SDL_Window * m_pWindow
Definition backend_sdl.h:138
@ CMD_INIT
Definition backend_sdl.h:144
@ CMD_SHUTDOWN
Definition backend_sdl.h:145
void Cmd_Shutdown(const SCommand_Shutdown *pCommand)
Definition backend_sdl.cpp:263
void RunBuffer(CCommandBuffer *pBuffer) override
Definition backend_sdl.cpp:396
CCommandProcessorFragment_SDL m_SDL
Definition backend_sdl.h:180
const SGfxErrorContainer & GetError() const override
Definition backend_sdl.cpp:487
const SGfxWarningContainer & GetWarning() const override
Definition backend_sdl.cpp:497
CCommandProcessor_SDL_GL(EBackendType BackendType, int GLMajor, int GLMinor, int GLPatch)
Definition backend_sdl.cpp:432
void HandleError()
Definition backend_sdl.cpp:333
SGfxWarningContainer m_Warning
Definition backend_sdl.h:186
void HandleWarning()
Definition backend_sdl.cpp:367
SGfxErrorContainer m_Error
Definition backend_sdl.h:185
void ErroneousCleanup() override
Definition backend_sdl.cpp:492
CCommandProcessorFragment_General m_General
Definition backend_sdl.h:181
EBackendType m_BackendType
Definition backend_sdl.h:183
CCommandProcessorFragment_GLBase * m_pGLBackend
Definition backend_sdl.h:179
const char * GetScreenName(int Screen) const override
Definition backend_sdl.cpp:1030
int WindowActive() override
Definition backend_sdl.cpp:1742
void SetWindowGrab(bool Grab) override
Definition backend_sdl.cpp:1752
void WindowDestroyNtf(uint32_t WindowId) override
Definition backend_sdl.cpp:1834
SDL_GLContext m_GLContext
Definition backend_sdl.h:208
bool ResizeWindow(int w, int h, int RefreshRate) override
Definition backend_sdl.cpp:1761
int Init(const char *pName, int *pScreen, int *pWidth, int *pHeight, int *pRefreshRate, int *pFsaaSamples, int Flags, int *pDesktopWidth, int *pDesktopHeight, int *pCurrentWidth, int *pCurrentHeight, class IStorage *pStorage) override
Definition backend_sdl.cpp:1148
void GetCurrentVideoMode(CVideoMode &CurMode, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override
Definition backend_sdl.cpp:1109
bool UpdateDisplayMode(int Index, ivec2 *pDesktopSize) override
Definition backend_sdl.cpp:1722
char m_aVendorString[GPU_INFO_STRING_SIZE]
Definition backend_sdl.h:223
const char * GetRendererString() override
Definition backend_sdl.h:297
std::atomic< uint64_t > m_StagingMemoryUsage
Definition backend_sdl.h:213
const char * GetVendorString() override
Definition backend_sdl.h:287
bool HasQuadContainerBuffering() override
Definition backend_sdl.h:275
static void ClampDriverVersion(EBackendType BackendType)
Definition backend_sdl.cpp:812
uint64_t StagingMemoryUsage() const override
Definition backend_sdl.cpp:1625
ICommandProcessor * m_pProcessor
Definition backend_sdl.h:209
TGLBackendReadPresentedImageData m_ReadPresentedImageDataFunc
Definition backend_sdl.h:217
void SetWindowParams(int FullscreenMode, bool IsBorderless) override
Definition backend_sdl.cpp:1640
std::atomic< uint64_t > m_StreamMemoryUsage
Definition backend_sdl.h:212
uint64_t StreamedMemoryUsage() const override
Definition backend_sdl.cpp:1620
bool HasTextBuffering() override
Definition backend_sdl.h:274
SDL_Window * m_pWindow
Definition backend_sdl.h:207
int GetWindowScreen() override
Definition backend_sdl.cpp:1737
std::atomic< uint64_t > m_BufferMemoryUsage
Definition backend_sdl.h:211
int GetNumScreens() const override
Definition backend_sdl.h:246
std::optional< int > ShowMessageBox(const IGraphics::CMessageBox &MessageBox) override
Definition backend_sdl.cpp:922
const TTwGraphicsGpuList & GetGpus() const override
Definition backend_sdl.cpp:1630
TGLBackendReadPresentedImageData & GetReadPresentedImageDataFuncUnsafe() override
Definition backend_sdl.cpp:1843
bool Uses2DTextureArrays() override
Definition backend_sdl.h:276
int m_NumScreens
Definition backend_sdl.h:219
static bool IsModernAPI(EBackendType BackendType)
Definition backend_sdl.cpp:939
SBackendCapabilities m_Capabilities
Definition backend_sdl.h:221
bool HasTextureArraysSupport() override
Definition backend_sdl.h:277
uint64_t BufferMemoryUsage() const override
Definition backend_sdl.cpp:1615
void Minimize() override
Definition backend_sdl.cpp:1635
bool SetWindowScreen(int Index, bool MoveToCenter, ivec2 *pDesktopSize) override
Definition backend_sdl.cpp:1691
const char * GetErrorString() override
Definition backend_sdl.h:279
void GetVideoModes(CVideoMode *pModes, int MaxModes, int *pNumModes, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override
Definition backend_sdl.cpp:1045
bool IsScreenKeyboardShown() override
Definition backend_sdl.cpp:1829
bool UseTrianglesAsQuad() override
Definition backend_sdl.h:271
char m_aRendererString[GPU_INFO_STRING_SIZE]
Definition backend_sdl.h:225
bool IsConfigModernAPI() override
Definition backend_sdl.h:270
int Shutdown() override
Definition backend_sdl.cpp:1572
TTwGraphicsGpuList m_GpuList
Definition backend_sdl.h:215
char m_aErrorString[256]
Definition backend_sdl.h:229
std::atomic< uint64_t > m_TextureMemoryUsage
Definition backend_sdl.h:210
bool HasQuadBuffering() override
Definition backend_sdl.h:273
bool HasTileBuffering() override
Definition backend_sdl.h:272
EBackendType m_BackendType
Definition backend_sdl.h:227
void GetDisplayCutoutInsets(int &Left, int &Right) override
Definition backend_sdl.cpp:1807
void GetViewportSize(int &w, int &h) override
Definition backend_sdl.cpp:1799
CGraphicsBackend_SDL_GL(TTranslateFunc &&TranslateFunc)
Definition backend_sdl.cpp:1142
const char * GetVersionString() override
Definition backend_sdl.h:292
void WindowCreateNtf(uint32_t WindowId) override
Definition backend_sdl.cpp:1838
void NotifyWindow() override
Definition backend_sdl.cpp:1817
char m_aVersionString[GPU_INFO_STRING_SIZE]
Definition backend_sdl.h:224
static EBackendType DetectBackend()
Definition backend_sdl.cpp:771
int WindowOpen() override
Definition backend_sdl.cpp:1747
uint64_t TextureMemoryUsage() const override
Definition backend_sdl.cpp:1610
bool GetDriverVersion(EGraphicsDriverAgeType DriverAgeType, int &Major, int &Minor, int &Patch, const char *&pName, EBackendType BackendType) override
Definition backend_sdl.cpp:951
virtual const SGfxErrorContainer & GetError() const =0
virtual void RunBuffer(CCommandBuffer *pBuffer)=0
virtual const SGfxWarningContainer & GetWarning() const =0
const char * GetFatalError() const override
Definition backend_sdl.cpp:220
static void ThreadFunc(void *pUser)
Definition backend_sdl.cpp:65
void StartProcessor(ICommandProcessor *pProcessor)
Definition backend_sdl.cpp:108
std::string m_FatalError
Definition backend_sdl.h:50
CCommandBuffer * m_pBuffer
Definition backend_sdl.h:91
bool IsIdle() const override
Definition backend_sdl.cpp:176
bool HasWarning() const
Definition backend_sdl.h:80
TTranslateFunc m_TranslateFunc
Definition backend_sdl.h:49
std::condition_variable m_BufferSwapCond
Definition backend_sdl.h:90
std::atomic_bool m_Shutdown
Definition backend_sdl.h:87
ICommandProcessor * m_pProcessor
Definition backend_sdl.h:86
bool m_Started
Definition backend_sdl.h:92
void RunBufferSingleThreadedUnsafe(CCommandBuffer *pBuffer) override
Definition backend_sdl.cpp:171
void WaitForIdle() override
Definition backend_sdl.cpp:185
void ProcessError(const SGfxErrorContainer &Error)
Definition backend_sdl.cpp:202
void RunBuffer(CCommandBuffer *pBuffer) override
Definition backend_sdl.cpp:137
bool GetWarning(std::vector< std::string > &WarningStrings) override
Definition backend_sdl.cpp:225
CGraphicsBackend_Threaded(TTranslateFunc &&TranslateFunc)
Definition backend_sdl.cpp:97
void * m_pThread
Definition backend_sdl.h:94
SGfxWarningContainer m_Warning
Definition backend_sdl.h:51
std::mutex m_BufferSwapMutex
Definition backend_sdl.h:89
std::atomic_bool m_BufferInProcess
Definition backend_sdl.h:93
void StopProcessor()
Definition backend_sdl.cpp:121
Definition graphics.h:75
Definition graphics_threaded.h:667
Definition graphics.h:633
Definition storage.h:21
EBackendType
Definition graphics.h:143
@ BACKEND_TYPE_AUTO
Definition graphics.h:149
EGraphicsDriverAgeType
Definition graphics.h:134
std::function< bool(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector< uint8_t > &vDstData)> TGLBackendReadPresentedImageData
Definition graphics.h:181
STWGraphicGpu TTwGraphicsGpuList
Definition graphics.h:176
std::function< const char *(const char *, const char *)> TTranslateFunc
Definition graphics_threaded.h:1276
Definition graphics_threaded.h:216
Definition graphics_threaded.h:472
Definition graphics_threaded.h:478
Definition graphics_threaded.h:578
Definition graphics_threaded.h:586
Definition graphics_threaded.h:183
SCommand(unsigned Cmd)
Definition graphics_threaded.h:185
SDL_Window * m_pWindow
Definition backend_sdl.h:152
SDL_GLContext m_GLContext
Definition backend_sdl.h:153
SCommand_Init()
Definition backend_sdl.h:150
SCommand_Shutdown()
Definition backend_sdl.h:158
Definition backend_sdl.h:113
bool m_3DTextures
Definition backend_sdl.h:121
int m_ContextMajor
Definition backend_sdl.h:129
int m_ContextPatch
Definition backend_sdl.h:131
bool m_QuadBuffering
Definition backend_sdl.h:115
bool m_ShaderSupport
Definition backend_sdl.h:124
bool m_QuadContainerBuffering
Definition backend_sdl.h:117
bool m_TileBuffering
Definition backend_sdl.h:114
bool m_NPOTTextures
Definition backend_sdl.h:120
bool m_MipMapping
Definition backend_sdl.h:119
bool m_TrianglesAsQuads
Definition backend_sdl.h:127
bool m_2DArrayTextures
Definition backend_sdl.h:122
int m_ContextMinor
Definition backend_sdl.h:130
bool m_TextBuffering
Definition backend_sdl.h:116
bool m_2DArrayTexturesAsExtension
Definition backend_sdl.h:123
Definition backend_base.h:60
Definition backend_base.h:76
EGfxWarningType m_WarningType
Definition backend_base.h:77
vector2_base< int > ivec2
Definition vmath.h:170