Skip to content

Commit 6275370

Browse files
committed
Add caching to DisplayServer::can_create_rendering_device()
This greatly speeds up the method when using the Compatibility rendering method, where this method is not guaranteed to return `true` in that case.
1 parent e3213aa commit 6275370

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

servers/display_server.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,6 +1229,12 @@ bool DisplayServer::can_create_rendering_device() {
12291229
return true;
12301230
}
12311231

1232+
if (created_rendering_device == RenderingDeviceCreationStatus::SUCCESS) {
1233+
return true;
1234+
} else if (created_rendering_device == RenderingDeviceCreationStatus::FAILURE) {
1235+
return false;
1236+
}
1237+
12321238
Error err;
12331239
RenderingContextDriver *rcd = nullptr;
12341240

@@ -1258,7 +1264,14 @@ bool DisplayServer::can_create_rendering_device() {
12581264
memdelete(rd);
12591265
rd = nullptr;
12601266
if (err == OK) {
1267+
// Creating a RenderingDevice is quite slow.
1268+
// Cache the result for future usage, so that it's much faster on subsequent calls.
1269+
created_rendering_device = RenderingDeviceCreationStatus::SUCCESS;
1270+
memdelete(rcd);
1271+
rcd = nullptr;
12611272
return true;
1273+
} else {
1274+
created_rendering_device = RenderingDeviceCreationStatus::FAILURE;
12621275
}
12631276
}
12641277

servers/display_server.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,16 @@ class DisplayServer : public Object {
594594
static Vector<String> get_create_function_rendering_drivers(int p_index);
595595
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);
596596

597+
enum RenderingDeviceCreationStatus {
598+
UNKNOWN,
599+
SUCCESS,
600+
FAILURE,
601+
};
602+
603+
// Used to cache the result of `can_create_rendering_device()` when RenderingDevice isn't currently being used.
604+
// This is done as creating a RenderingDevice is quite slow.
605+
static inline RenderingDeviceCreationStatus created_rendering_device = RenderingDeviceCreationStatus::UNKNOWN;
606+
597607
static bool can_create_rendering_device();
598608

599609
DisplayServer();

0 commit comments

Comments
 (0)