Skip to content

Commit 0fd440e

Browse files
committed
Merge pull request godotengine#90374 from BastiaanOlij/openxr_refresh_rate_signal
OpenXR: Add refresh rate signal support
2 parents 5c5563f + 148ff6a commit 0fd440e

File tree

6 files changed

+33
-0
lines changed

6 files changed

+33
-0
lines changed

modules/openxr/doc_classes/OpenXRInterface.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,13 @@
152152
Informs the user queued a recenter of the player position.
153153
</description>
154154
</signal>
155+
<signal name="refresh_rate_changed">
156+
<param index="0" name="refresh_rate" type="float" />
157+
<description>
158+
Informs the user the HMD refresh rate has changed.
159+
[b]Node:[/b] Only emitted if XR runtime supports the refresh rate extension.
160+
</description>
161+
</signal>
155162
<signal name="session_begun">
156163
<description>
157164
Informs our OpenXR session has been started.

modules/openxr/extensions/openxr_fb_display_refresh_rate_extension.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
/**************************************************************************/
3030

3131
#include "openxr_fb_display_refresh_rate_extension.h"
32+
#include "../openxr_interface.h"
3233

3334
OpenXRDisplayRefreshRateExtension *OpenXRDisplayRefreshRateExtension::singleton = nullptr;
3435

@@ -64,6 +65,23 @@ void OpenXRDisplayRefreshRateExtension::on_instance_destroyed() {
6465
display_refresh_rate_ext = false;
6566
}
6667

68+
bool OpenXRDisplayRefreshRateExtension::on_event_polled(const XrEventDataBuffer &event) {
69+
switch (event.type) {
70+
case XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB: {
71+
const XrEventDataDisplayRefreshRateChangedFB *event_fb = (XrEventDataDisplayRefreshRateChangedFB *)&event;
72+
73+
OpenXRInterface *xr_interface = OpenXRAPI::get_singleton()->get_xr_interface();
74+
if (xr_interface) {
75+
xr_interface->on_refresh_rate_changes(event_fb->toDisplayRefreshRate);
76+
}
77+
78+
return true;
79+
} break;
80+
default:
81+
return false;
82+
}
83+
}
84+
6785
float OpenXRDisplayRefreshRateExtension::get_refresh_rate() const {
6886
float refresh_rate = 0.0;
6987

modules/openxr/extensions/openxr_fb_display_refresh_rate_extension.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class OpenXRDisplayRefreshRateExtension : public OpenXRExtensionWrapper {
5151

5252
virtual void on_instance_created(const XrInstance p_instance) override;
5353
virtual void on_instance_destroyed() override;
54+
virtual bool on_event_polled(const XrEventDataBuffer &event) override;
5455

5556
float get_refresh_rate() const;
5657
void set_refresh_rate(float p_refresh_rate);

modules/openxr/openxr_api.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ class OpenXRAPI {
336336
String get_error_string(XrResult result) const;
337337
String get_swapchain_format_name(int64_t p_swapchain_format) const;
338338

339+
OpenXRInterface *get_xr_interface() const { return xr_interface; }
339340
void set_xr_interface(OpenXRInterface *p_xr_interface);
340341
static void register_extension_wrapper(OpenXRExtensionWrapper *p_extension_wrapper);
341342
static void unregister_extension_wrapper(OpenXRExtensionWrapper *p_extension_wrapper);

modules/openxr/openxr_interface.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ void OpenXRInterface::_bind_methods() {
4343
ADD_SIGNAL(MethodInfo("session_focussed"));
4444
ADD_SIGNAL(MethodInfo("session_visible"));
4545
ADD_SIGNAL(MethodInfo("pose_recentered"));
46+
ADD_SIGNAL(MethodInfo("refresh_rate_changed", PropertyInfo(Variant::FLOAT, "refresh_rate")));
4647

4748
// Display refresh rate
4849
ClassDB::bind_method(D_METHOD("get_display_refresh_rate"), &OpenXRInterface::get_display_refresh_rate);
@@ -1258,6 +1259,10 @@ void OpenXRInterface::on_pose_recentered() {
12581259
emit_signal(SNAME("pose_recentered"));
12591260
}
12601261

1262+
void OpenXRInterface::on_refresh_rate_changes(float p_new_rate) {
1263+
emit_signal(SNAME("refresh_rate_changed"), p_new_rate);
1264+
}
1265+
12611266
/** Hand tracking. */
12621267
void OpenXRInterface::set_motion_range(const Hand p_hand, const HandMotionRange p_motion_range) {
12631268
ERR_FAIL_INDEX(p_hand, HAND_MAX);

modules/openxr/openxr_interface.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ class OpenXRInterface : public XRInterface {
174174
void on_state_focused();
175175
void on_state_stopping();
176176
void on_pose_recentered();
177+
void on_refresh_rate_changes(float p_new_rate);
177178
void tracker_profile_changed(RID p_tracker, RID p_interaction_profile);
178179

179180
/** Hand tracking. */

0 commit comments

Comments
 (0)