The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

st/oxr: Complete implementation of extension [XR_FB_display_refresh_rate]

authored by

Zhongwang Zhang and committed by
Jakob Bornecrantz
ccb9f957 74df016d

+99 -5
+22 -5
src/xrt/state_trackers/oxr/oxr_api_session.c
··· 557 557 * 558 558 */ 559 559 560 - #ifdef XR_FB_display_refresh_rate 560 + #ifdef OXR_HAVE_FB_display_refresh_rate 561 561 562 562 XRAPI_ATTR XrResult XRAPI_CALL 563 563 oxr_xrEnumerateDisplayRefreshRatesFB(XrSession session, ··· 599 599 return XR_ERROR_RUNTIME_FAILURE; 600 600 } 601 601 602 - *displayRefreshRate = sess->sys->xsysc->info.refresh_rates_hz[0]; 603 - return XR_SUCCESS; 602 + return oxr_session_get_display_refresh_rate(&log, sess, displayRefreshRate); 604 603 } 605 604 606 605 XRAPI_ATTR XrResult XRAPI_CALL ··· 611 610 OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess, "xrRequestDisplayRefreshRateFB"); 612 611 OXR_VERIFY_SESSION_NOT_LOST(&log, sess); 613 612 614 - //! @todo support for changing refresh rates 615 - return XR_SUCCESS; 613 + if (displayRefreshRate == 0.0f) { 614 + return XR_SUCCESS; 615 + } 616 + 617 + /* 618 + * For the requested display refresh rate, truncating to two decimal 619 + * places and checking if it's in the supported refresh rates. 620 + */ 621 + bool found = false; 622 + for (int i = 0; i < (int)sess->sys->xsysc->info.refresh_rate_count; ++i) { 623 + if ((int)(displayRefreshRate * 100.0f) == (int)(sess->sys->xsysc->info.refresh_rates_hz[i] * 100.0f)) { 624 + found = true; 625 + break; 626 + } 627 + } 628 + if (!found) { 629 + return XR_ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB; 630 + } 631 + 632 + return oxr_session_request_display_refresh_rate(&log, sess, displayRefreshRate); 616 633 } 617 634 618 635 #endif
+24
src/xrt/state_trackers/oxr/oxr_event.c
··· 262 262 263 263 return ret; 264 264 } 265 + 266 + #ifdef OXR_HAVE_FB_display_refresh_rate 267 + XrResult 268 + oxr_event_push_XrEventDataDisplayRefreshRateChangedFB(struct oxr_logger *log, 269 + struct oxr_session *sess, 270 + float fromDisplayRefreshRate, 271 + float toDisplayRefreshRate) 272 + { 273 + struct oxr_instance *inst = sess->sys->inst; 274 + XrEventDataDisplayRefreshRateChangedFB *changed; 275 + struct oxr_event *event = NULL; 276 + 277 + ALLOC(log, inst, &event, &changed); 278 + changed->type = XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB; 279 + changed->fromDisplayRefreshRate = fromDisplayRefreshRate; 280 + changed->toDisplayRefreshRate = toDisplayRefreshRate; 281 + event->result = XR_SUCCESS; 282 + lock(inst); 283 + push(inst, event); 284 + unlock(inst); 285 + 286 + return XR_SUCCESS; 287 + } 288 + #endif // OXR_HAVE_FB_display_refresh_rate
+16
src/xrt/state_trackers/oxr/oxr_objects.h
··· 951 951 XrResult 952 952 oxr_event_push_XrEventDataInteractionProfileChanged(struct oxr_logger *log, struct oxr_session *sess); 953 953 954 + #ifdef OXR_HAVE_FB_display_refresh_rate 955 + XrResult 956 + oxr_event_push_XrEventDataDisplayRefreshRateChangedFB(struct oxr_logger *log, 957 + struct oxr_session *sess, 958 + float fromDisplayRefreshRate, 959 + float toDisplayRefreshRate); 960 + #endif // OXR_HAVE_FB_display_refresh_rate 961 + 954 962 /*! 955 963 * This clears all pending events refers to the given session. 956 964 */ ··· 1658 1666 default: return XR_SESSION_NOT_FOCUSED; 1659 1667 } 1660 1668 } 1669 + 1670 + #ifdef OXR_HAVE_FB_display_refresh_rate 1671 + XrResult 1672 + oxr_session_get_display_refresh_rate(struct oxr_logger *log, struct oxr_session *sess, float *displayRefreshRate); 1673 + 1674 + XrResult 1675 + oxr_session_request_display_refresh_rate(struct oxr_logger *log, struct oxr_session *sess, float displayRefreshRate); 1676 + #endif // OXR_HAVE_FB_display_refresh_rate 1661 1677 1662 1678 /*! 1663 1679 * dpad settings we need extracted from XrInteractionProfileDpadBindingEXT
+37
src/xrt/state_trackers/oxr/oxr_session.c
··· 257 257 time_state_monotonic_to_ts_ns(sess->sys->inst->timekeeping, xce.loss_pending.loss_time_ns)); 258 258 break; 259 259 case XRT_COMPOSITOR_EVENT_LOST: sess->has_lost = true; break; 260 + case XRT_COMPOSITOR_EVENT_DISPLAY_REFRESH_RATE_CHANGE: 261 + oxr_event_push_XrEventDataDisplayRefreshRateChangedFB(log, sess, 262 + xce.display.from_display_refresh_rate_hz, 263 + xce.display.to_display_refresh_rate_hz); 264 + break; 260 265 default: U_LOG_W("unhandled event type! %d", xce.type); break; 261 266 } 262 267 } ··· 1240 1245 } 1241 1246 1242 1247 #endif // OXR_HAVE_KHR_visibility_mask 1248 + 1249 + #ifdef OXR_HAVE_FB_display_refresh_rate 1250 + XrResult 1251 + oxr_session_get_display_refresh_rate(struct oxr_logger *log, struct oxr_session *sess, float *displayRefreshRate) 1252 + { 1253 + struct xrt_compositor *xc = &sess->xcn->base; 1254 + 1255 + if (xc == NULL) { 1256 + return oxr_session_success_result(sess); 1257 + } 1258 + 1259 + xrt_result_t xret = xrt_comp_get_display_refresh_rate(xc, displayRefreshRate); 1260 + OXR_CHECK_XRET(log, sess, xret, xrt_comp_get_display_refresh_rate); 1261 + 1262 + return XR_SUCCESS; 1263 + } 1264 + 1265 + XrResult 1266 + oxr_session_request_display_refresh_rate(struct oxr_logger *log, struct oxr_session *sess, float displayRefreshRate) 1267 + { 1268 + struct xrt_compositor *xc = &sess->xcn->base; 1269 + 1270 + if (xc == NULL) { 1271 + return oxr_session_success_result(sess); 1272 + } 1273 + 1274 + xrt_result_t xret = xrt_comp_request_display_refresh_rate(xc, displayRefreshRate); 1275 + OXR_CHECK_XRET(log, sess, xret, xrt_comp_request_display_refresh_rate); 1276 + 1277 + return XR_SUCCESS; 1278 + } 1279 + #endif // OXR_HAVE_FB_display_refresh_rate