Skip to content

Commit

Permalink
Add caching to DisplayServer::can_create_rendering_device()
Browse files Browse the repository at this point in the history
This greatly speeds up the method when using the Compatibility rendering
method, where this method is not guaranteed to return `true` in that case.
  • Loading branch information
Calinou committed Oct 1, 2024
1 parent e3213aa commit 6ec3545
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
11 changes: 11 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,12 @@ 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;
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 6ec3545

Please sign in to comment.