diff options
| author | Rémi Verschelde <rverschelde@gmail.com> | 2024-10-02 15:01:30 +0200 |
|---|---|---|
| committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-10-02 15:01:30 +0200 |
| commit | 34913f278129aab238af93228504e6dc78457333 (patch) | |
| tree | de6df3eb2449887dc55e35ce5bc1d49a41cd5f05 | |
| parent | 15cee4b8e08f9704c283607299b0992b8d58854e (diff) | |
| parent | 62753701fdde6d0ab2cb685165a4df21b672b9a1 (diff) | |
| download | redot-engine-34913f278129aab238af93228504e6dc78457333.tar.gz | |
Merge pull request #97698 from Calinou/displayserver-can-create-rendering-device-add-caching
Add caching to `DisplayServer::can_create_rendering_device()`
| -rw-r--r-- | servers/display_server.cpp | 13 | ||||
| -rw-r--r-- | servers/display_server.h | 10 |
2 files changed, 23 insertions, 0 deletions
diff --git a/servers/display_server.cpp b/servers/display_server.cpp index 86b4016da8..f092e23171 100644 --- a/servers/display_server.cpp +++ b/servers/display_server.cpp @@ -1229,6 +1229,12 @@ bool DisplayServer::can_create_rendering_device() { return true; } + if (created_rendering_device == RenderingDeviceCreationStatus::SUCCESS) { + return true; + } else if (created_rendering_device == RenderingDeviceCreationStatus::FAILURE) { + return false; + } + Error err; RenderingContextDriver *rcd = nullptr; @@ -1258,7 +1264,14 @@ bool DisplayServer::can_create_rendering_device() { memdelete(rd); rd = nullptr; if (err == OK) { + // Creating a RenderingDevice is quite slow. + // Cache the result for future usage, so that it's much faster on subsequent calls. + created_rendering_device = RenderingDeviceCreationStatus::SUCCESS; + memdelete(rcd); + rcd = nullptr; return true; + } else { + created_rendering_device = RenderingDeviceCreationStatus::FAILURE; } } diff --git a/servers/display_server.h b/servers/display_server.h index 04f4b0c03d..b518283331 100644 --- a/servers/display_server.h +++ b/servers/display_server.h @@ -594,6 +594,16 @@ public: static Vector<String> get_create_function_rendering_drivers(int p_index); static DisplayServer *create(int p_index, const String &p_rendering_driver, WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i *p_position, const Vector2i &p_resolution, int p_screen, Context p_context, Error &r_error); + enum RenderingDeviceCreationStatus { + UNKNOWN, + SUCCESS, + FAILURE, + }; + + // Used to cache the result of `can_create_rendering_device()` when RenderingDevice isn't currently being used. + // This is done as creating a RenderingDevice is quite slow. + static inline RenderingDeviceCreationStatus created_rendering_device = RenderingDeviceCreationStatus::UNKNOWN; + static bool can_create_rendering_device(); DisplayServer(); |
