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 <SDL_video.h>
5
6#include <base/detect.h>
7
8#include <engine/graphics.h>
9
11
13
14#include <atomic>
15#include <condition_variable>
16#include <cstddef>
17#include <cstdint>
18#include <mutex>
19#include <vector>
20
21#if defined(CONF_PLATFORM_MACOS)
22#include <objc/objc-runtime.h>
23
25{
26private:
27 id m_Pool;
28
29public:
31 {
32 Class NSAutoreleasePoolClass = (Class)objc_getClass("NSAutoreleasePool");
34 SEL selector = sel_registerName("init");
35 ((id(*)(id, SEL))objc_msgSend)(m_Pool, selector);
36 }
37
39 {
40 SEL selector = sel_registerName("drain");
41 ((id(*)(id, SEL))objc_msgSend)(m_Pool, selector);
42 }
43};
44#endif
45
46// basic threaded backend, abstract, missing init and shutdown functions
48{
49private:
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;
71 bool IsIdle() const override;
72 void WaitForIdle() override;
73
74 void ProcessError(const SGfxErrorContainer &Error);
75
76protected:
78 void StopProcessor();
79
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 bool GetWarning(std::vector<std::string> &WarningStrings) override;
100};
101
102// takes care of implementation independent operations
110
132
133// takes care of sdl related commands
174
175// command processor implementation, uses the fragments to combine into one processor
200
201static constexpr size_t gs_GpuInfoStringSize = 256;
202
203// graphics backend implemented with SDL and the graphics library @see EBackendType
205{
209 std::atomic<uint64_t> m_TextureMemoryUsage{0};
210 std::atomic<uint64_t> m_BufferMemoryUsage{0};
211 std::atomic<uint64_t> m_StreamMemoryUsage{0};
212 std::atomic<uint64_t> m_StagingMemoryUsage{0};
213
215
217
219
221
225
227
228 char m_aErrorString[256];
229
232
233public:
235 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;
236 int Shutdown() override;
237
238 uint64_t TextureMemoryUsage() const override;
239 uint64_t BufferMemoryUsage() const override;
240 uint64_t StreamedMemoryUsage() const override;
241 uint64_t StagingMemoryUsage() const override;
242
243 const TTwGraphicsGpuList &GetGpus() const override;
244
245 int GetNumScreens() const override { return m_NumScreens; }
246 const char *GetScreenName(int Screen) const override;
247
248 void GetVideoModes(CVideoMode *pModes, int MaxModes, int *pNumModes, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override;
250
251 void Minimize() override;
252 void Maximize() override;
253 void SetWindowParams(int FullscreenMode, bool IsBorderless) override;
254 bool SetWindowScreen(int Index) override;
255 bool UpdateDisplayMode(int Index) 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 NotifyWindow() override;
263 bool IsScreenKeyboardShown() override;
264
265 void WindowDestroyNtf(uint32_t WindowId) override;
266 void WindowCreateNtf(uint32_t WindowId) override;
267
269 bool IsConfigModernAPI() override { return IsModernAPI(m_BackendType); }
277
278 const char *GetErrorString() override
279 {
280 if(m_aErrorString[0] != '\0')
281 return m_aErrorString;
282
283 return nullptr;
284 }
285
286 const char *GetVendorString() override
287 {
288 return m_aVendorString;
289 }
290
291 const char *GetVersionString() override
292 {
293 return m_aVersionString;
294 }
295
296 const char *GetRendererString() override
297 {
298 return m_aRendererString;
299 }
300
302
303 std::optional<int> ShowMessageBox(const IGraphics::CMessageBox &MessageBox) override;
304
306};
307
308#endif // ENGINE_CLIENT_BACKEND_SDL_H
@ GFX_WARNING_TYPE_NONE
Definition backend_base.h:51
static constexpr size_t gs_GpuInfoStringSize
Definition backend_sdl.h:201
Definition graphics_threaded.h:19
@ CMDGROUP_PLATFORM_SDL
Definition graphics_threaded.h:84
Definition backend_base.h:83
Definition backend_sdl.h:104
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:135
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:138
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
@ CMD_INIT
Definition backend_sdl.h:143
@ CMD_SHUTDOWN
Definition backend_sdl.h:144
void Cmd_WindowDestroyNtf(const CCommandBuffer::SCommand_WindowDestroyNtf *pCommand)
Definition backend_sdl.cpp:270
SDL_Window * m_pWindow
Definition backend_sdl.h:137
void Cmd_Shutdown(const SCommand_Shutdown *pCommand)
Definition backend_sdl.cpp:232
Definition backend_sdl.h:177
void RunBuffer(CCommandBuffer *pBuffer) override
Definition backend_sdl.cpp:366
CCommandProcessorFragment_SDL m_SDL
Definition backend_sdl.h:179
const SGfxErrorContainer & GetError() const override
Definition backend_sdl.cpp:458
const SGfxWarningContainer & GetWarning() const override
Definition backend_sdl.cpp:468
virtual ~CCommandProcessor_SDL_GL()
Definition backend_sdl.cpp:453
void HandleError()
Definition backend_sdl.cpp:302
SGfxWarningContainer m_Warning
Definition backend_sdl.h:185
void HandleWarning()
Definition backend_sdl.cpp:336
SGfxErrorContainer m_Error
Definition backend_sdl.h:184
void ErroneousCleanup() override
Definition backend_sdl.cpp:463
CCommandProcessorFragment_General m_General
Definition backend_sdl.h:180
EBackendType m_BackendType
Definition backend_sdl.h:182
CCommandProcessorFragment_GLBase * m_pGLBackend
Definition backend_sdl.h:178
Definition backend_sdl.h:205
const char * GetScreenName(int Screen) const override
Definition backend_sdl.cpp:995
int WindowActive() override
Definition backend_sdl.cpp:1697
void SetWindowGrab(bool Grab) override
Definition backend_sdl.cpp:1707
void WindowDestroyNtf(uint32_t WindowId) override
Definition backend_sdl.cpp:1775
SDL_GLContext m_GLContext
Definition backend_sdl.h:207
bool ResizeWindow(int w, int h, int RefreshRate) override
Definition backend_sdl.cpp:1712
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:1117
void GetCurrentVideoMode(CVideoMode &CurMode, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override
Definition backend_sdl.cpp:1078
char m_aVendorString[gs_GpuInfoStringSize]
Definition backend_sdl.h:222
const char * GetRendererString() override
Definition backend_sdl.h:296
std::atomic< uint64_t > m_StagingMemoryUsage
Definition backend_sdl.h:212
const char * GetVendorString() override
Definition backend_sdl.h:286
bool HasQuadContainerBuffering() override
Definition backend_sdl.h:274
bool UpdateDisplayMode(int Index) override
Definition backend_sdl.cpp:1677
static void ClampDriverVersion(EBackendType BackendType)
Definition backend_sdl.cpp:777
uint64_t StagingMemoryUsage() const override
Definition backend_sdl.cpp:1586
ICommandProcessor * m_pProcessor
Definition backend_sdl.h:208
TGLBackendReadPresentedImageData m_ReadPresentedImageDataFunc
Definition backend_sdl.h:216
void Maximize() override
Definition backend_sdl.cpp:1601
bool SetWindowScreen(int Index) override
Definition backend_sdl.cpp:1655
void SetWindowParams(int FullscreenMode, bool IsBorderless) override
Definition backend_sdl.cpp:1606
std::atomic< uint64_t > m_StreamMemoryUsage
Definition backend_sdl.h:211
uint64_t StreamedMemoryUsage() const override
Definition backend_sdl.cpp:1581
bool HasTextBuffering() override
Definition backend_sdl.h:273
SDL_Window * m_pWindow
Definition backend_sdl.h:206
int GetWindowScreen() override
Definition backend_sdl.cpp:1692
std::atomic< uint64_t > m_BufferMemoryUsage
Definition backend_sdl.h:210
int GetNumScreens() const override
Definition backend_sdl.h:245
std::optional< int > ShowMessageBox(const IGraphics::CMessageBox &MessageBox) override
Definition backend_sdl.cpp:887
const TTwGraphicsGpuList & GetGpus() const override
Definition backend_sdl.cpp:1591
TGLBackendReadPresentedImageData & GetReadPresentedImageDataFuncUnsafe() override
Definition backend_sdl.cpp:1784
bool Uses2DTextureArrays() override
Definition backend_sdl.h:275
int m_NumScreens
Definition backend_sdl.h:218
static bool IsModernAPI(EBackendType BackendType)
Definition backend_sdl.cpp:904
bool HasTextureArraysSupport() override
Definition backend_sdl.h:276
uint64_t BufferMemoryUsage() const override
Definition backend_sdl.cpp:1576
void Minimize() override
Definition backend_sdl.cpp:1596
const char * GetErrorString() override
Definition backend_sdl.h:278
void GetVideoModes(CVideoMode *pModes, int MaxModes, int *pNumModes, float HiDPIScale, int MaxWindowWidth, int MaxWindowHeight, int ScreenId) override
Definition backend_sdl.cpp:1014
bool IsScreenKeyboardShown() override
Definition backend_sdl.cpp:1770
bool UseTrianglesAsQuad() override
Definition backend_sdl.h:270
bool IsConfigModernAPI() override
Definition backend_sdl.h:269
int Shutdown() override
Definition backend_sdl.cpp:1533
TTwGraphicsGpuList m_GpuList
Definition backend_sdl.h:214
char m_aErrorString[256]
Definition backend_sdl.h:228
std::atomic< uint64_t > m_TextureMemoryUsage
Definition backend_sdl.h:209
bool HasQuadBuffering() override
Definition backend_sdl.h:272
bool HasTileBuffering() override
Definition backend_sdl.h:271
EBackendType m_BackendType
Definition backend_sdl.h:226
void GetViewportSize(int &w, int &h) override
Definition backend_sdl.cpp:1750
char m_aRendererString[gs_GpuInfoStringSize]
Definition backend_sdl.h:224
const char * GetVersionString() override
Definition backend_sdl.h:291
void WindowCreateNtf(uint32_t WindowId) override
Definition backend_sdl.cpp:1779
void NotifyWindow() override
Definition backend_sdl.cpp:1758
SBackendCapabilites m_Capabilites
Definition backend_sdl.h:220
static EBackendType DetectBackend()
Definition backend_sdl.cpp:742
int WindowOpen() override
Definition backend_sdl.cpp:1702
uint64_t TextureMemoryUsage() const override
Definition backend_sdl.cpp:1571
bool GetDriverVersion(EGraphicsDriverAgeType DriverAgeType, int &Major, int &Minor, int &Patch, const char *&pName, EBackendType BackendType) override
Definition backend_sdl.cpp:916
char m_aVersionString[gs_GpuInfoStringSize]
Definition backend_sdl.h:223
virtual const SGfxErrorContainer & GetError() const =0
virtual void RunBuffer(CCommandBuffer *pBuffer)=0
virtual const SGfxWarningContainer & GetWarning() const =0
Definition backend_sdl.h:48
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:91
bool HasWarning()
Definition backend_sdl.h:80
bool IsIdle() const override
Definition backend_sdl.cpp:163
TTranslateFunc m_TranslateFunc
Definition backend_sdl.h:50
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: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
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:108
Definition graphics.h:75
Definition graphics_threaded.h:664
Definition graphics.h:560
Definition storage.h:21
Definition vmath.h:15
constexpr vector2_base()=default
EBackendType
Definition graphics.h:145
@ BACKEND_TYPE_AUTO
Definition graphics.h:151
EGraphicsDriverAgeType
Definition graphics.h:136
std::function< bool(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector< uint8_t > &vDstData)> TGLBackendReadPresentedImageData
Definition graphics.h:183
std::function< const char *(const char *, const char *)> TTranslateFunc
Definition graphics_threaded.h:1281
Definition graphics_threaded.h:219
Definition graphics_threaded.h:475
Definition graphics_threaded.h:481
Definition graphics_threaded.h:577
Definition graphics_threaded.h:585
Definition graphics_threaded.h:184
SCommand(unsigned Cmd)
Definition graphics_threaded.h:186
SDL_Window * m_pWindow
Definition backend_sdl.h:151
SDL_GLContext m_GLContext
Definition backend_sdl.h:152
SCommand_Init()
Definition backend_sdl.h:149
SCommand_Shutdown()
Definition backend_sdl.h:157
Definition backend_sdl.h:112
bool m_2DArrayTexturesAsExtension
Definition backend_sdl.h:122
int m_ContextPatch
Definition backend_sdl.h:130
bool m_NPOTTextures
Definition backend_sdl.h:119
bool m_TextBuffering
Definition backend_sdl.h:115
int m_ContextMajor
Definition backend_sdl.h:128
bool m_QuadBuffering
Definition backend_sdl.h:114
bool m_QuadContainerBuffering
Definition backend_sdl.h:116
bool m_2DArrayTextures
Definition backend_sdl.h:121
bool m_TrianglesAsQuads
Definition backend_sdl.h:126
bool m_3DTextures
Definition backend_sdl.h:120
bool m_MipMapping
Definition backend_sdl.h:118
bool m_ShaderSupport
Definition backend_sdl.h:123
bool m_TileBuffering
Definition backend_sdl.h:113
int m_ContextMinor
Definition backend_sdl.h:129
Definition backend_base.h:61
Definition backend_base.h:77
EGfxWarningType m_WarningType
Definition backend_base.h:78
Definition graphics.h:157