Skip to content

Commit

Permalink
Merge pull request #97698 from Calinou/displayserver-can-create-rende…
Browse files Browse the repository at this point in the history
…ring-device-add-caching

Add caching to `DisplayServer::can_create_rendering_device()`
  • Loading branch information
akien-mga committed Oct 2, 2024
2 parents 15cee4b + 6275370 commit 34913f2
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
13 changes: 13 additions & 0 deletions servers/display_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}
}

Expand Down
10 changes: 10 additions & 0 deletions servers/display_server.h
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,16 @@ class DisplayServer : public Object {
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();
Expand Down

0 comments on commit 34913f2

Please sign in to comment.