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#ifndef BACKEND_NO_SDL
11#include <SDL_video.h>
12#else
13struct SDL_Window;
14typedef void *SDL_GLContext;
15#endif
16
17#include <atomic>
18#include <condition_variable>
19#include <cstddef>
20#include <cstdint>
21#include <mutex>
22#include <vector>
23
24#if defined(CONF_PLATFORM_MACOS) || defined(CONF_PLATFORM_IOS)
25#include <objc/message.h>
26#include <objc/runtime.h>
27
28class CAutoreleasePool
29{
30private:
31 id m_Pool;
32
33public:
34 CAutoreleasePool()
35 {
36 Class NSAutoreleasePoolClass = (Class)objc_getClass("NSAutoreleasePool");
37 m_Pool = class_createInstance(NSAutoreleasePoolClass, 0);
38 SEL selector = sel_registerName("init");
39 ((id (*)(id, SEL))objc_msgSend)(m_Pool, selector);
40 }
41
42 ~CAutoreleasePool()
43 {
44 SEL selector = sel_registerName("drain");
45 ((id (*)(id, SEL))objc_msgSend)(m_Pool, selector);
46 }
47};
48#endif
49
50// basic threaded backend, abstract, missing init and shutdown functions
52{
53private:
55 std::string m_FatalError;
57
58public:
59 // constructed on the main thread, the rest of the functions is run on the render thread
61 {
62 public:
63 virtual ~ICommandProcessor() = default;
64 virtual void RunBuffer(CCommandBuffer *pBuffer) = 0;
65
66 virtual const SGfxErrorContainer &GetError() const = 0;
67 virtual void ErroneousCleanup() = 0;
68
69 virtual const SGfxWarningContainer &GetWarning() const = 0;
70 };
71
73
74 void RunBuffer(CCommandBuffer *pBuffer) override;
75 void RunBufferSingleThreadedUnsafe(CCommandBuffer *pBuffer) override;
76 bool IsIdle() const override;
77 void WaitForIdle() override;
78
79 void ProcessError(const SGfxErrorContainer &Error);
80
81protected:
82 void StartProcessor(ICommandProcessor *pProcessor);
83 void StopProcessor();
84
85 bool HasWarning() const
86 {
88 }
89
90private:
92 std::atomic_bool m_Shutdown;
93#if !defined(CONF_PLATFORM_EMSCRIPTEN)
95 std::condition_variable m_BufferSwapCond;
97 bool m_Started = false;
98 std::atomic_bool m_BufferInProcess;
99 void *m_pThread;
100 static void ThreadFunc(void *pUser);
101#endif
102
103public:
104 const char *GetFatalError() const override;
105 bool GetWarning(std::vector<std::string> &WarningStrings) override;
106};
107
108// takes care of implementation independent operations
110{
111 void Cmd_Signal(const CCommandBuffer::SCommand_Signal *pCommand);
112
113public:
114 bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand);
115};
116
138
139// takes care of sdl related commands
141{
142 // SDL stuff
143 SDL_Window *m_pWindow = nullptr;
144 SDL_GLContext m_GLContext = nullptr;
145
146public:
147 enum
148 {
151 };
152
154 {
157 SDL_Window *m_pWindow;
158 SDL_GLContext m_GLContext;
159 };
160
166
167private:
168 void Cmd_Init(const SCommand_Init *pCommand);
169 void Cmd_Shutdown(const SCommand_Shutdown *pCommand);
170 void Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand);
171 void Cmd_VSync(const CCommandBuffer::SCommand_VSync *pCommand);
174
175public:
177
178 bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand);
179};
180
181// command processor implementation, uses the fragments to combine into one processor
206
207static constexpr size_t GPU_INFO_STRING_SIZE = 256;
208
209// graphics backend implemented with SDL and the graphics library @see EBackendType
211{
212 SDL_Window *m_pWindow = nullptr;
213 SDL_GLContext m_GLContext = nullptr;
215 std::atomic<uint64_t> m_TextureMemoryUsage{0};
216 std::atomic<uint64_t> m_BufferMemoryUsage{0};
217 std::atomic<uint64_t> m_StreamMemoryUsage{0};
218 std::atomic<uint64_t> m_StagingMemoryUsage{0};
219
221
223
225
227
231
233
234 char m_aErrorString[256];
235
237 static void ClampDriverVersion(EBackendType BackendType);
238
239public:
241 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;
242 int Shutdown() override;
243
244 uint64_t TextureMemoryUsage() const override;
245 uint64_t BufferMemoryUsage() const override;
246 uint64_t StreamedMemoryUsage() const override;
247 uint64_t StagingMemoryUsage() const override;
248
249 const TTwGraphicsGpuList &GetGpus() const override;
250
251 int GetNumScreens() const override { return m_NumScreens; }
252 const char *GetScreenName(int Screen) const override;
253
254 void GetVideoModes(CVideoMode *pModes, int MaxModes, int *pNumModes, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override;
255 void GetCurrentVideoMode(CVideoMode &CurMode, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override;
256
257 void Minimize() override;
258 void SetWindowParams(int FullscreenMode, bool IsBorderless) override;
259 bool SetWindowScreen(int Index, bool MoveToCenter, ivec2 *pDesktopSize) override;
260 bool UpdateDisplayMode(int Index, ivec2 *pDesktopSize) override;
261 int GetWindowScreen() override;
262 int WindowActive() override;
263 int WindowOpen() override;
264 void SetWindowGrab(bool Grab) override;
265 bool ResizeWindow(int w, int h, int RefreshRate) override;
266 void GetViewportSize(int &w, int &h) override;
267 void GetDisplayCutoutInsets(int &Left, int &Right) override;
268 void NotifyWindow() override;
269 bool IsScreenKeyboardShown() override;
270
271 void WindowDestroyNtf(uint32_t WindowId) override;
272 void WindowCreateNtf(uint32_t WindowId) override;
273
274 bool GetDriverVersion(EGraphicsDriverAgeType DriverAgeType, int &Major, int &Minor, int &Patch, const char *&pName, EBackendType BackendType) override;
275 bool IsConfigModernAPI() override { return IsModernAPI(m_BackendType); }
283
284 const char *GetErrorString() override
285 {
286 if(m_aErrorString[0] != '\0')
287 return m_aErrorString;
288
289 return nullptr;
290 }
291
292 const char *GetVendorString() override
293 {
294 return m_aVendorString;
295 }
296
297 const char *GetVersionString() override
298 {
299 return m_aVersionString;
300 }
301
302 const char *GetRendererString() override
303 {
304 return m_aRendererString;
305 }
306
308
309 std::optional<int> ShowMessageBox(const IGraphics::CMessageBox &MessageBox) override;
310
311 static bool IsModernAPI(EBackendType BackendType);
312};
313
314#endif // ENGINE_CLIENT_BACKEND_SDL_H
@ GFX_WARNING_TYPE_NONE
Definition backend_base.h:54
static constexpr size_t GPU_INFO_STRING_SIZE
Definition backend_sdl.h:207
Definition graphics_threaded.h:48
@ CMDGROUP_PLATFORM_SDL
Definition graphics_threaded.h:113
Definition backend_base.h:86
Definition backend_sdl.h:110
void Cmd_Signal(const CCommandBuffer::SCommand_Signal *pCommand)
Definition backend_threaded.cpp:204
bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand)
Definition backend_threaded.cpp:209
Definition backend_sdl.h:141
void Cmd_WindowCreateNtf(const CCommandBuffer::SCommand_WindowCreateNtf *pCommand)
Definition backend_sdl.cpp:90
void Cmd_VSync(const CCommandBuffer::SCommand_VSync *pCommand)
Definition backend_sdl.cpp:75
SDL_GLContext m_GLContext
Definition backend_sdl.h:144
bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand)
Definition backend_sdl.cpp:112
void Cmd_Init(const SCommand_Init *pCommand)
Definition backend_sdl.cpp:55
void Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand)
Definition backend_sdl.cpp:69
void Cmd_WindowDestroyNtf(const CCommandBuffer::SCommand_WindowDestroyNtf *pCommand)
Definition backend_sdl.cpp:101
SDL_Window * m_pWindow
Definition backend_sdl.h:143
@ CMD_INIT
Definition backend_sdl.h:149
@ CMD_SHUTDOWN
Definition backend_sdl.h:150
void Cmd_Shutdown(const SCommand_Shutdown *pCommand)
Definition backend_sdl.cpp:63
void RunBuffer(CCommandBuffer *pBuffer) override
Definition backend_sdl.cpp:196
CCommandProcessorFragment_SDL m_SDL
Definition backend_sdl.h:185
const SGfxErrorContainer & GetError() const override
Definition backend_sdl.cpp:287
const SGfxWarningContainer & GetWarning() const override
Definition backend_sdl.cpp:297
CCommandProcessor_SDL_GL(EBackendType BackendType, int GLMajor, int GLMinor, int GLPatch)
Definition backend_sdl.cpp:232
void HandleError()
Definition backend_sdl.cpp:133
SGfxWarningContainer m_Warning
Definition backend_sdl.h:191
void HandleWarning()
Definition backend_sdl.cpp:167
SGfxErrorContainer m_Error
Definition backend_sdl.h:190
void ErroneousCleanup() override
Definition backend_sdl.cpp:292
CCommandProcessorFragment_General m_General
Definition backend_sdl.h:186
EBackendType m_BackendType
Definition backend_sdl.h:188
CCommandProcessorFragment_GLBase * m_pGLBackend
Definition backend_sdl.h:184
const char * GetScreenName(int Screen) const override
Definition backend_sdl.cpp:830
int WindowActive() override
Definition backend_sdl.cpp:1542
void SetWindowGrab(bool Grab) override
Definition backend_sdl.cpp:1552
void WindowDestroyNtf(uint32_t WindowId) override
Definition backend_sdl.cpp:1634
SDL_GLContext m_GLContext
Definition backend_sdl.h:213
bool ResizeWindow(int w, int h, int RefreshRate) override
Definition backend_sdl.cpp:1561
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:948
void GetCurrentVideoMode(CVideoMode &CurMode, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override
Definition backend_sdl.cpp:909
bool UpdateDisplayMode(int Index, ivec2 *pDesktopSize) override
Definition backend_sdl.cpp:1522
char m_aVendorString[GPU_INFO_STRING_SIZE]
Definition backend_sdl.h:228
const char * GetRendererString() override
Definition backend_sdl.h:302
std::atomic< uint64_t > m_StagingMemoryUsage
Definition backend_sdl.h:218
const char * GetVendorString() override
Definition backend_sdl.h:292
bool HasQuadContainerBuffering() override
Definition backend_sdl.h:280
static void ClampDriverVersion(EBackendType BackendType)
Definition backend_sdl.cpp:612
uint64_t StagingMemoryUsage() const override
Definition backend_sdl.cpp:1425
ICommandProcessor * m_pProcessor
Definition backend_sdl.h:214
TGLBackendReadPresentedImageData m_ReadPresentedImageDataFunc
Definition backend_sdl.h:222
void SetWindowParams(int FullscreenMode, bool IsBorderless) override
Definition backend_sdl.cpp:1440
std::atomic< uint64_t > m_StreamMemoryUsage
Definition backend_sdl.h:217
uint64_t StreamedMemoryUsage() const override
Definition backend_sdl.cpp:1420
bool HasTextBuffering() override
Definition backend_sdl.h:279
SDL_Window * m_pWindow
Definition backend_sdl.h:212
int GetWindowScreen() override
Definition backend_sdl.cpp:1537
std::atomic< uint64_t > m_BufferMemoryUsage
Definition backend_sdl.h:216
int GetNumScreens() const override
Definition backend_sdl.h:251
std::optional< int > ShowMessageBox(const IGraphics::CMessageBox &MessageBox) override
Definition backend_sdl.cpp:722
const TTwGraphicsGpuList & GetGpus() const override
Definition backend_sdl.cpp:1430
TGLBackendReadPresentedImageData & GetReadPresentedImageDataFuncUnsafe() override
Definition backend_sdl.cpp:1643
bool Uses2DTextureArrays() override
Definition backend_sdl.h:281
int m_NumScreens
Definition backend_sdl.h:224
static bool IsModernAPI(EBackendType BackendType)
Definition backend_sdl.cpp:739
SBackendCapabilities m_Capabilities
Definition backend_sdl.h:226
bool HasTextureArraysSupport() override
Definition backend_sdl.h:282
uint64_t BufferMemoryUsage() const override
Definition backend_sdl.cpp:1415
void Minimize() override
Definition backend_sdl.cpp:1435
bool SetWindowScreen(int Index, bool MoveToCenter, ivec2 *pDesktopSize) override
Definition backend_sdl.cpp:1491
const char * GetErrorString() override
Definition backend_sdl.h:284
void GetVideoModes(CVideoMode *pModes, int MaxModes, int *pNumModes, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override
Definition backend_sdl.cpp:845
bool IsScreenKeyboardShown() override
Definition backend_sdl.cpp:1629
bool UseTrianglesAsQuad() override
Definition backend_sdl.h:276
char m_aRendererString[GPU_INFO_STRING_SIZE]
Definition backend_sdl.h:230
bool IsConfigModernAPI() override
Definition backend_sdl.h:275
int Shutdown() override
Definition backend_sdl.cpp:1372
TTwGraphicsGpuList m_GpuList
Definition backend_sdl.h:220
char m_aErrorString[256]
Definition backend_sdl.h:234
std::atomic< uint64_t > m_TextureMemoryUsage
Definition backend_sdl.h:215
bool HasQuadBuffering() override
Definition backend_sdl.h:278
bool HasTileBuffering() override
Definition backend_sdl.h:277
EBackendType m_BackendType
Definition backend_sdl.h:232
void GetDisplayCutoutInsets(int &Left, int &Right) override
Definition backend_sdl.cpp:1607
void GetViewportSize(int &w, int &h) override
Definition backend_sdl.cpp:1599
CGraphicsBackend_SDL_GL(TTranslateFunc &&TranslateFunc)
Definition backend_sdl.cpp:942
const char * GetVersionString() override
Definition backend_sdl.h:297
void WindowCreateNtf(uint32_t WindowId) override
Definition backend_sdl.cpp:1638
void NotifyWindow() override
Definition backend_sdl.cpp:1617
char m_aVersionString[GPU_INFO_STRING_SIZE]
Definition backend_sdl.h:229
static EBackendType DetectBackend()
Definition backend_sdl.cpp:571
int WindowOpen() override
Definition backend_sdl.cpp:1547
uint64_t TextureMemoryUsage() const override
Definition backend_sdl.cpp:1410
bool GetDriverVersion(EGraphicsDriverAgeType DriverAgeType, int &Major, int &Minor, int &Patch, const char *&pName, EBackendType BackendType) override
Definition backend_sdl.cpp:751
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_threaded.cpp:186
static void ThreadFunc(void *pUser)
Definition backend_threaded.cpp:31
void StartProcessor(ICommandProcessor *pProcessor)
Definition backend_threaded.cpp:74
std::string m_FatalError
Definition backend_sdl.h:55
CCommandBuffer * m_pBuffer
Definition backend_sdl.h:96
bool IsIdle() const override
Definition backend_threaded.cpp:142
bool HasWarning() const
Definition backend_sdl.h:85
TTranslateFunc m_TranslateFunc
Definition backend_sdl.h:54
std::condition_variable m_BufferSwapCond
Definition backend_sdl.h:95
std::atomic_bool m_Shutdown
Definition backend_sdl.h:92
ICommandProcessor * m_pProcessor
Definition backend_sdl.h:91
bool m_Started
Definition backend_sdl.h:97
void RunBufferSingleThreadedUnsafe(CCommandBuffer *pBuffer) override
Definition backend_threaded.cpp:137
void WaitForIdle() override
Definition backend_threaded.cpp:151
void ProcessError(const SGfxErrorContainer &Error)
Definition backend_threaded.cpp:168
void RunBuffer(CCommandBuffer *pBuffer) override
Definition backend_threaded.cpp:103
bool GetWarning(std::vector< std::string > &WarningStrings) override
Definition backend_threaded.cpp:191
CGraphicsBackend_Threaded(TTranslateFunc &&TranslateFunc)
Definition backend_threaded.cpp:63
void * m_pThread
Definition backend_sdl.h:99
SGfxWarningContainer m_Warning
Definition backend_sdl.h:56
std::mutex m_BufferSwapMutex
Definition backend_sdl.h:94
std::atomic_bool m_BufferInProcess
Definition backend_sdl.h:98
void StopProcessor()
Definition backend_threaded.cpp:87
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:1278
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:157
SDL_GLContext m_GLContext
Definition backend_sdl.h:158
SCommand_Init()
Definition backend_sdl.h:155
SCommand_Shutdown()
Definition backend_sdl.h:163
Definition backend_sdl.h:118
bool m_3DTextures
Definition backend_sdl.h:126
int m_ContextMajor
Definition backend_sdl.h:134
int m_ContextPatch
Definition backend_sdl.h:136
bool m_QuadBuffering
Definition backend_sdl.h:120
bool m_ShaderSupport
Definition backend_sdl.h:129
bool m_QuadContainerBuffering
Definition backend_sdl.h:122
bool m_TileBuffering
Definition backend_sdl.h:119
bool m_NPOTTextures
Definition backend_sdl.h:125
bool m_MipMapping
Definition backend_sdl.h:124
bool m_TrianglesAsQuads
Definition backend_sdl.h:132
bool m_2DArrayTextures
Definition backend_sdl.h:127
int m_ContextMinor
Definition backend_sdl.h:135
bool m_TextBuffering
Definition backend_sdl.h:121
bool m_2DArrayTexturesAsExtension
Definition backend_sdl.h:128
Definition backend_base.h:64
Definition backend_base.h:80
EGfxWarningType m_WarningType
Definition backend_base.h:81
vector2_base< int > ivec2
Definition vmath.h:170