Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Always render when XR is enabled, even if no OS windows can draw #94412

Merged
merged 1 commit into from
Jul 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions doc/classes/DisplayServer.xml
Original file line number Diff line number Diff line change
Expand Up @@ -879,6 +879,12 @@
Registers callables to emit when the menu is respectively about to show or closed. Callback methods should have zero arguments.
</description>
</method>
<method name="has_additional_outputs" qualifiers="const">
<return type="bool" />
<description>
Returns [code]true[/code] if any additional outputs have been registered via [method register_additional_output].
</description>
</method>
<method name="has_feature" qualifiers="const">
<return type="bool" />
<param index="0" name="feature" type="int" enum="DisplayServer.Feature" />
Expand Down Expand Up @@ -1022,6 +1028,14 @@
Perform window manager processing, including input flushing. See also [method force_process_and_drop_events], [method Input.flush_buffered_events] and [member Input.use_accumulated_input].
</description>
</method>
<method name="register_additional_output">
<return type="void" />
<param index="0" name="object" type="Object" />
<description>
Registers an [Object] which represents an additional output that will be rendered too, beyond normal windows. The [Object] is only used as an identifier, which can be later passed to [method unregister_additional_output].
This can be used to prevent Godot from skipping rendering when no normal windows are visible.
</description>
</method>
<method name="screen_get_dpi" qualifiers="const">
<return type="int" />
<param index="0" name="screen" type="int" default="-1" />
Expand Down Expand Up @@ -1352,6 +1366,13 @@
[b]Note:[/b] [member ProjectSettings.audio/general/text_to_speech] should be [code]true[/code] to use text-to-speech.
</description>
</method>
<method name="unregister_additional_output">
<return type="void" />
<param index="0" name="object" type="Object" />
<description>
Unregisters an [Object] representing an additional output, that was registered via [method register_additional_output].
</description>
</method>
<method name="virtual_keyboard_get_height" qualifiers="const">
<return type="int" />
<description>
Expand Down
2 changes: 1 addition & 1 deletion main/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4108,7 +4108,7 @@ bool Main::iteration() {

RenderingServer::get_singleton()->sync(); //sync if still drawing from previous frames.

if (DisplayServer::get_singleton()->can_any_window_draw() &&
if ((DisplayServer::get_singleton()->can_any_window_draw() || DisplayServer::get_singleton()->has_additional_outputs()) &&
RenderingServer::get_singleton()->is_render_loop_enabled()) {
if ((!force_redraw_requested) && OS::get_singleton()->is_in_low_processor_usage_mode()) {
if (RenderingServer::get_singleton()->has_changed()) {
Expand Down
6 changes: 6 additions & 0 deletions modules/openxr/openxr_interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -651,6 +651,10 @@ bool OpenXRInterface::initialize() {
// make this our primary interface
xr_server->set_primary_interface(this);

// Register an additional output with the display server, so rendering won't
// be skipped if no windows are visible.
DisplayServer::get_singleton()->register_additional_output(this);

initialized = true;

return initialized;
Expand All @@ -674,6 +678,8 @@ void OpenXRInterface::uninitialize() {
}
}

DisplayServer::get_singleton()->unregister_additional_output(this);

initialized = false;
}

Expand Down
15 changes: 15 additions & 0 deletions servers/display_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -759,6 +759,17 @@ DisplayServer::WindowID DisplayServer::get_focused_window() const {
void DisplayServer::set_context(Context p_context) {
}

void DisplayServer::register_additional_output(Object *p_object) {
ObjectID id = p_object->get_instance_id();
if (!additional_outputs.has(id)) {
additional_outputs.push_back(id);
}
}

void DisplayServer::unregister_additional_output(Object *p_object) {
additional_outputs.erase(p_object->get_instance_id());
}

void DisplayServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("has_feature", "feature"), &DisplayServer::has_feature);
ClassDB::bind_method(D_METHOD("get_name"), &DisplayServer::get_name);
Expand Down Expand Up @@ -997,6 +1008,10 @@ void DisplayServer::_bind_methods() {

ClassDB::bind_method(D_METHOD("is_window_transparency_available"), &DisplayServer::is_window_transparency_available);

ClassDB::bind_method(D_METHOD("register_additional_output", "object"), &DisplayServer::register_additional_output);
ClassDB::bind_method(D_METHOD("unregister_additional_output", "object"), &DisplayServer::unregister_additional_output);
ClassDB::bind_method(D_METHOD("has_additional_outputs"), &DisplayServer::has_additional_outputs);

#ifndef DISABLE_DEPRECATED
BIND_ENUM_CONSTANT(FEATURE_GLOBAL_MENU);
#endif
Expand Down
6 changes: 6 additions & 0 deletions servers/display_server.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ class DisplayServer : public Object {
RID _get_rid_from_name(NativeMenu *p_nmenu, const String &p_menu_root) const;
#endif

LocalVector<ObjectID> additional_outputs;

public:
_FORCE_INLINE_ static DisplayServer *get_singleton() {
return singleton;
Expand Down Expand Up @@ -582,6 +584,10 @@ class DisplayServer : public Object {

virtual bool is_window_transparency_available() const { return false; }

void register_additional_output(Object *p_output);
void unregister_additional_output(Object *p_output);
bool has_additional_outputs() const { return additional_outputs.size() > 0; }

static void register_create_function(const char *p_name, CreateFunction p_function, GetRenderingDriversFunction p_get_drivers);
static int get_create_function_count();
static const char *get_create_function_name(int p_index);
Expand Down
Loading