DDraceNetwork 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)
20#include <objc/objc-runtime.h>
21
22class CAutoreleasePool
23{
24private:
25 id m_Pool;
26
27public:
28 CAutoreleasePool()
29 {
30 Class NSAutoreleasePoolClass = (Class)objc_getClass("NSAutoreleasePool");
31 m_Pool = class_createInstance(NSAutoreleasePoolClass, 0);
32 SEL selector = sel_registerName("init");
33 ((id (*)(id, SEL))objc_msgSend)(m_Pool, selector);
34 }
35
36 ~CAutoreleasePool()
37 {
38 SEL selector = sel_registerName("drain");
39 ((id (*)(id, SEL))objc_msgSend)(m_Pool, selector);
40 }
41};
42#endif
43
44// basic threaded backend, abstract, missing init and shutdown functions
46{
47private:
50
51public:
52 // constructed on the main thread, the rest of the functions is run on the render thread
54 {
55 public:
56 virtual ~ICommandProcessor() = default;
57 virtual void RunBuffer(CCommandBuffer *pBuffer) = 0;
58
59 virtual const SGfxErrorContainer &GetError() const = 0;
60 virtual void ErroneousCleanup() = 0;
61
62 virtual const SGfxWarningContainer &GetWarning() const = 0;
63 };
64
66
67 void RunBuffer(CCommandBuffer *pBuffer) override;
68 void RunBufferSingleThreadedUnsafe(CCommandBuffer *pBuffer) override;
69 bool IsIdle() const override;
70 void WaitForIdle() override;
71
72 void ProcessError(const SGfxErrorContainer &Error);
73
74protected:
75 void StartProcessor(ICommandProcessor *pProcessor);
76 void StopProcessor();
77
78 bool HasWarning() const
79 {
80 return m_Warning.m_WarningType != GFX_WARNING_TYPE_NONE;
81 }
82
83private:
85 std::atomic_bool m_Shutdown;
86#if !defined(CONF_PLATFORM_EMSCRIPTEN)
88 std::condition_variable m_BufferSwapCond;
90 bool m_Started = false;
91 std::atomic_bool m_BufferInProcess;
92 void *m_pThread;
93 static void ThreadFunc(void *pUser);
94#endif
95
96public:
97 bool GetWarning(std::vector<std::string> &WarningStrings) override;
98};
99
100// takes care of implementation independent operations
102{
103 void Cmd_Signal(const CCommandBuffer::SCommand_Signal *pCommand);
104
105public:
106 bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand);
107};
108
130
131// takes care of sdl related commands
133{
134 // SDL stuff
135 SDL_Window *m_pWindow = nullptr;
136 SDL_GLContext m_GLContext = nullptr;
137
138public:
139 enum
140 {
143 };
144
146 {
149 SDL_Window *m_pWindow;
150 SDL_GLContext m_GLContext;
151 };
152
158
159private:
160 void Cmd_Init(const SCommand_Init *pCommand);
161 void Cmd_Shutdown(const SCommand_Shutdown *pCommand);
162 void Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand);
163 void Cmd_VSync(const CCommandBuffer::SCommand_VSync *pCommand);
166
167public:
169
170 bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand);
171};
172
173// command processor implementation, uses the fragments to combine into one processor
198
199static constexpr size_t gs_GpuInfoStringSize = 256;
200
201// graphics backend implemented with SDL and the graphics library @see EBackendType
203{
204 SDL_Window *m_pWindow = nullptr;
205 SDL_GLContext m_GLContext = nullptr;
207 std::atomic<uint64_t> m_TextureMemoryUsage{0};
208 std::atomic<uint64_t> m_BufferMemoryUsage{0};
209 std::atomic<uint64_t> m_StreamMemoryUsage{0};
210 std::atomic<uint64_t> m_StagingMemoryUsage{0};
211
213
215
217
219
223
225
226 char m_aErrorString[256];
227
229 static void ClampDriverVersion(EBackendType BackendType);
230
231public:
233 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;
234 int Shutdown() override;
235
236 uint64_t TextureMemoryUsage() const override;
237 uint64_t BufferMemoryUsage() const override;
238 uint64_t StreamedMemoryUsage() const override;
239 uint64_t StagingMemoryUsage() const override;
240
241 const TTwGraphicsGpuList &GetGpus() const override;
242
243 int GetNumScreens() const override { return m_NumScreens; }
244 const char *GetScreenName(int Screen) const override;
245
246 void GetVideoModes(CVideoMode *pModes, int MaxModes, int *pNumModes, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override;
247 void GetCurrentVideoMode(CVideoMode &CurMode, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override;
248
249 void Minimize() override;
250 void SetWindowParams(int FullscreenMode, bool IsBorderless) override;
251 bool SetWindowScreen(int Index, bool MoveToCenter) override;
252 bool UpdateDisplayMode(int Index) override;
253 int GetWindowScreen() override;
254 int WindowActive() override;
255 int WindowOpen() override;
256 void SetWindowGrab(bool Grab) override;
257 bool ResizeWindow(int w, int h, int RefreshRate) override;
258 void GetViewportSize(int &w, int &h) override;
259 void NotifyWindow() override;
260 bool IsScreenKeyboardShown() override;
261
262 void WindowDestroyNtf(uint32_t WindowId) override;
263 void WindowCreateNtf(uint32_t WindowId) override;
264
265 bool GetDriverVersion(EGraphicsDriverAgeType DriverAgeType, int &Major, int &Minor, int &Patch, const char *&pName, EBackendType BackendType) override;
266 bool IsConfigModernAPI() override { return IsModernAPI(m_BackendType); }
267 bool UseTrianglesAsQuad() override { return m_Capabilities.m_TrianglesAsQuads; }
268 bool HasTileBuffering() override { return m_Capabilities.m_TileBuffering; }
269 bool HasQuadBuffering() override { return m_Capabilities.m_QuadBuffering; }
270 bool HasTextBuffering() override { return m_Capabilities.m_TextBuffering; }
271 bool HasQuadContainerBuffering() override { return m_Capabilities.m_QuadContainerBuffering; }
272 bool Uses2DTextureArrays() override { return m_Capabilities.m_2DArrayTextures; }
273 bool HasTextureArraysSupport() override { return m_Capabilities.m_2DArrayTextures || m_Capabilities.m_3DTextures; }
274
275 const char *GetErrorString() override
276 {
277 if(m_aErrorString[0] != '\0')
278 return m_aErrorString;
279
280 return nullptr;
281 }
282
283 const char *GetVendorString() override
284 {
285 return m_aVendorString;
286 }
287
288 const char *GetVersionString() override
289 {
290 return m_aVersionString;
291 }
292
293 const char *GetRendererString() override
294 {
295 return m_aRendererString;
296 }
297
299
300 std::optional<int> ShowMessageBox(const IGraphics::CMessageBox &MessageBox) override;
301
302 static bool IsModernAPI(EBackendType BackendType);
303};
304
305#endif // ENGINE_CLIENT_BACKEND_SDL_H
@ GFX_WARNING_TYPE_NONE
Definition backend_base.h:50
static constexpr size_t gs_GpuInfoStringSize
Definition backend_sdl.h:199
Definition graphics_threaded.h:47
@ CMDGROUP_PLATFORM_SDL
Definition graphics_threaded.h:112
Definition backend_base.h:82
Definition backend_sdl.h:102
void Cmd_Signal(const CCommandBuffer::SCommand_Signal *pCommand)
Definition backend_sdl.cpp:207
bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand)
Definition backend_sdl.cpp:212
Definition backend_sdl.h:133
void Cmd_WindowCreateNtf(const CCommandBuffer::SCommand_WindowCreateNtf *pCommand)
Definition backend_sdl.cpp:259
void Cmd_VSync(const CCommandBuffer::SCommand_VSync *pCommand)
Definition backend_sdl.cpp:244
SDL_GLContext m_GLContext
Definition backend_sdl.h:136
bool RunCommand(const CCommandBuffer::SCommand *pBaseCommand)
Definition backend_sdl.cpp:281
void Cmd_Init(const SCommand_Init *pCommand)
Definition backend_sdl.cpp:224
void Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand)
Definition backend_sdl.cpp:238
void Cmd_WindowDestroyNtf(const CCommandBuffer::SCommand_WindowDestroyNtf *pCommand)
Definition backend_sdl.cpp:270
SDL_Window * m_pWindow
Definition backend_sdl.h:135
@ CMD_INIT
Definition backend_sdl.h:141
@ CMD_SHUTDOWN
Definition backend_sdl.h:142
void Cmd_Shutdown(const SCommand_Shutdown *pCommand)
Definition backend_sdl.cpp:232
void RunBuffer(CCommandBuffer *pBuffer) override
Definition backend_sdl.cpp:365
CCommandProcessorFragment_SDL m_SDL
Definition backend_sdl.h:177
const SGfxErrorContainer & GetError() const override
Definition backend_sdl.cpp:456
const SGfxWarningContainer & GetWarning() const override
Definition backend_sdl.cpp:466
CCommandProcessor_SDL_GL(EBackendType BackendType, int GLMajor, int GLMinor, int GLPatch)
Definition backend_sdl.cpp:401
void HandleError()
Definition backend_sdl.cpp:302
SGfxWarningContainer m_Warning
Definition backend_sdl.h:183
void HandleWarning()
Definition backend_sdl.cpp:336
SGfxErrorContainer m_Error
Definition backend_sdl.h:182
void ErroneousCleanup() override
Definition backend_sdl.cpp:461
~CCommandProcessor_SDL_GL() override
Definition backend_sdl.cpp:451
CCommandProcessorFragment_General m_General
Definition backend_sdl.h:178
EBackendType m_BackendType
Definition backend_sdl.h:180
CCommandProcessorFragment_GLBase * m_pGLBackend
Definition backend_sdl.h:176
const char * GetScreenName(int Screen) const override
Definition backend_sdl.cpp:993
int WindowActive() override
Definition backend_sdl.cpp:1705
void SetWindowGrab(bool Grab) override
Definition backend_sdl.cpp:1715
void WindowDestroyNtf(uint32_t WindowId) override
Definition backend_sdl.cpp:1783
SDL_GLContext m_GLContext
Definition backend_sdl.h:205
bool ResizeWindow(int w, int h, int RefreshRate) override
Definition backend_sdl.cpp:1720
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:1115
void GetCurrentVideoMode(CVideoMode &CurMode, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override
Definition backend_sdl.cpp:1076
char m_aVendorString[gs_GpuInfoStringSize]
Definition backend_sdl.h:220
const char * GetRendererString() override
Definition backend_sdl.h:293
std::atomic< uint64_t > m_StagingMemoryUsage
Definition backend_sdl.h:210
const char * GetVendorString() override
Definition backend_sdl.h:283
bool HasQuadContainerBuffering() override
Definition backend_sdl.h:271
bool UpdateDisplayMode(int Index) override
Definition backend_sdl.cpp:1685
static void ClampDriverVersion(EBackendType BackendType)
Definition backend_sdl.cpp:775
uint64_t StagingMemoryUsage() const override
Definition backend_sdl.cpp:1588
ICommandProcessor * m_pProcessor
Definition backend_sdl.h:206
TGLBackendReadPresentedImageData m_ReadPresentedImageDataFunc
Definition backend_sdl.h:214
void SetWindowParams(int FullscreenMode, bool IsBorderless) override
Definition backend_sdl.cpp:1603
std::atomic< uint64_t > m_StreamMemoryUsage
Definition backend_sdl.h:209
uint64_t StreamedMemoryUsage() const override
Definition backend_sdl.cpp:1583
bool HasTextBuffering() override
Definition backend_sdl.h:270
SDL_Window * m_pWindow
Definition backend_sdl.h:204
int GetWindowScreen() override
Definition backend_sdl.cpp:1700
std::atomic< uint64_t > m_BufferMemoryUsage
Definition backend_sdl.h:208
int GetNumScreens() const override
Definition backend_sdl.h:243
std::optional< int > ShowMessageBox(const IGraphics::CMessageBox &MessageBox) override
Definition backend_sdl.cpp:885
const TTwGraphicsGpuList & GetGpus() const override
Definition backend_sdl.cpp:1593
TGLBackendReadPresentedImageData & GetReadPresentedImageDataFuncUnsafe() override
Definition backend_sdl.cpp:1792
bool Uses2DTextureArrays() override
Definition backend_sdl.h:272
int m_NumScreens
Definition backend_sdl.h:216
static bool IsModernAPI(EBackendType BackendType)
Definition backend_sdl.cpp:902
SBackendCapabilities m_Capabilities
Definition backend_sdl.h:218
bool HasTextureArraysSupport() override
Definition backend_sdl.h:273
uint64_t BufferMemoryUsage() const override
Definition backend_sdl.cpp:1578
void Minimize() override
Definition backend_sdl.cpp:1598
const char * GetErrorString() override
Definition backend_sdl.h:275
void GetVideoModes(CVideoMode *pModes, int MaxModes, int *pNumModes, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override
Definition backend_sdl.cpp:1012
bool IsScreenKeyboardShown() override
Definition backend_sdl.cpp:1778
bool UseTrianglesAsQuad() override
Definition backend_sdl.h:267
bool IsConfigModernAPI() override
Definition backend_sdl.h:266
int Shutdown() override
Definition backend_sdl.cpp:1535
TTwGraphicsGpuList m_GpuList
Definition backend_sdl.h:212
char m_aErrorString[256]
Definition backend_sdl.h:226
std::atomic< uint64_t > m_TextureMemoryUsage
Definition backend_sdl.h:207
bool HasQuadBuffering() override
Definition backend_sdl.h:269
bool HasTileBuffering() override
Definition backend_sdl.h:268
EBackendType m_BackendType
Definition backend_sdl.h:224
void GetViewportSize(int &w, int &h) override
Definition backend_sdl.cpp:1758
char m_aRendererString[gs_GpuInfoStringSize]
Definition backend_sdl.h:222
bool SetWindowScreen(int Index, bool MoveToCenter) override
Definition backend_sdl.cpp:1654
CGraphicsBackend_SDL_GL(TTranslateFunc &&TranslateFunc)
Definition backend_sdl.cpp:1109
const char * GetVersionString() override
Definition backend_sdl.h:288
void WindowCreateNtf(uint32_t WindowId) override
Definition backend_sdl.cpp:1787
void NotifyWindow() override
Definition backend_sdl.cpp:1766
static EBackendType DetectBackend()
Definition backend_sdl.cpp:740
int WindowOpen() override
Definition backend_sdl.cpp:1710
uint64_t TextureMemoryUsage() const override
Definition backend_sdl.cpp:1573
bool GetDriverVersion(EGraphicsDriverAgeType DriverAgeType, int &Major, int &Minor, int &Patch, const char *&pName, EBackendType BackendType) override
Definition backend_sdl.cpp:914
char m_aVersionString[gs_GpuInfoStringSize]
Definition backend_sdl.h:221
virtual const SGfxErrorContainer & GetError() const =0
virtual void RunBuffer(CCommandBuffer *pBuffer)=0
virtual const SGfxWarningContainer & GetWarning() const =0
static void ThreadFunc(void *pUser)
Definition backend_sdl.cpp:54
void StartProcessor(ICommandProcessor *pProcessor)
Definition backend_sdl.cpp:95
CCommandBuffer * m_pBuffer
Definition backend_sdl.h:89
bool IsIdle() const override
Definition backend_sdl.cpp:163
bool HasWarning() const
Definition backend_sdl.h:78
TTranslateFunc m_TranslateFunc
Definition backend_sdl.h:48
std::condition_variable m_BufferSwapCond
Definition backend_sdl.h:88
std::atomic_bool m_Shutdown
Definition backend_sdl.h:85
ICommandProcessor * m_pProcessor
Definition backend_sdl.h:84
bool m_Started
Definition backend_sdl.h:90
void RunBufferSingleThreadedUnsafe(CCommandBuffer *pBuffer) override
Definition backend_sdl.cpp:158
void WaitForIdle() override
Definition backend_sdl.cpp:172
void ProcessError(const SGfxErrorContainer &Error)
Definition backend_sdl.cpp:180
void RunBuffer(CCommandBuffer *pBuffer) override
Definition backend_sdl.cpp:124
bool GetWarning(std::vector< std::string > &WarningStrings) override
Definition backend_sdl.cpp:194
CGraphicsBackend_Threaded(TTranslateFunc &&TranslateFunc)
Definition backend_sdl.cpp:84
void * m_pThread
Definition backend_sdl.h:92
SGfxWarningContainer m_Warning
Definition backend_sdl.h:49
std::mutex m_BufferSwapMutex
Definition backend_sdl.h:87
std::atomic_bool m_BufferInProcess
Definition backend_sdl.h:91
void StopProcessor()
Definition backend_sdl.cpp:108
Definition graphics.h:76
Definition graphics_threaded.h:662
Definition graphics.h:572
Definition storage.h:21
EBackendType
Definition graphics.h:146
@ BACKEND_TYPE_AUTO
Definition graphics.h:152
EGraphicsDriverAgeType
Definition graphics.h:137
std::function< bool(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector< uint8_t > &vDstData)> TGLBackendReadPresentedImageData
Definition graphics.h:184
STWGraphicGpu TTwGraphicsGpuList
Definition graphics.h:179
std::function< const char *(const char *, const char *)> TTranslateFunc
Definition graphics_threaded.h:1275
Definition graphics_threaded.h:215
Definition graphics_threaded.h:471
Definition graphics_threaded.h:477
Definition graphics_threaded.h:573
Definition graphics_threaded.h:581
Definition graphics_threaded.h:182
SCommand(unsigned Cmd)
Definition graphics_threaded.h:184
SDL_Window * m_pWindow
Definition backend_sdl.h:149
SDL_GLContext m_GLContext
Definition backend_sdl.h:150
SCommand_Init()
Definition backend_sdl.h:147
SCommand_Shutdown()
Definition backend_sdl.h:155
Definition backend_sdl.h:110
bool m_3DTextures
Definition backend_sdl.h:118
int m_ContextMajor
Definition backend_sdl.h:126
int m_ContextPatch
Definition backend_sdl.h:128
bool m_QuadBuffering
Definition backend_sdl.h:112
bool m_ShaderSupport
Definition backend_sdl.h:121
bool m_QuadContainerBuffering
Definition backend_sdl.h:114
bool m_TileBuffering
Definition backend_sdl.h:111
bool m_NPOTTextures
Definition backend_sdl.h:117
bool m_MipMapping
Definition backend_sdl.h:116
bool m_TrianglesAsQuads
Definition backend_sdl.h:124
bool m_2DArrayTextures
Definition backend_sdl.h:119
int m_ContextMinor
Definition backend_sdl.h:127
bool m_TextBuffering
Definition backend_sdl.h:113
bool m_2DArrayTexturesAsExtension
Definition backend_sdl.h:120
Definition backend_base.h:60
Definition backend_base.h:76