summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--servers/display_server.cpp13
-rw-r--r--servers/display_server.h10
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();