The open source OpenXR runtime
0
fork

Configure Feed

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

st/oxr: Add OXR_FRAME_TIMING_SPEW var to print basic frame timing information

+49
+5
src/xrt/state_trackers/oxr/oxr_objects.h
··· 1331 1331 float ipd_meters; 1332 1332 1333 1333 /*! 1334 + * Frame timing debug output. 1335 + */ 1336 + bool frame_timing_spew; 1337 + 1338 + /*! 1334 1339 * To pipe swapchain creation to right code. 1335 1340 */ 1336 1341 XrResult (*create_swapchain)(struct oxr_logger *,
+44
src/xrt/state_trackers/oxr/oxr_session.c
··· 44 44 45 45 46 46 DEBUG_GET_ONCE_NUM_OPTION(ipd, "OXR_DEBUG_IPD_MM", 63) 47 + DEBUG_GET_ONCE_BOOL_OPTION(frame_timing_spew, "OXR_FRAME_TIMING_SPEW", false) 47 48 48 49 #define CALL_CHK(call) \ 49 50 if ((call) == XRT_ERROR_IPC_FAILURE) { \ ··· 499 500 return oxr_session_success_result(sess); 500 501 } 501 502 503 + static double 504 + ns_to_ms(int64_t ns) 505 + { 506 + double ms = ((double)ns) * 1. / 1000. * 1. / 1000.; 507 + return ms; 508 + } 509 + 510 + static double 511 + ts_ms(struct oxr_session *sess) 512 + { 513 + timepoint_ns now = time_state_get_now(sess->sys->inst->timekeeping); 514 + int64_t monotonic = 515 + time_state_ts_to_monotonic_ns(sess->sys->inst->timekeeping, now); 516 + return ns_to_ms(monotonic); 517 + } 518 + 502 519 XrResult 503 520 oxr_session_frame_wait(struct oxr_logger *log, 504 521 struct oxr_session *sess, ··· 525 542 sess->active_wait_frames++; 526 543 os_mutex_unlock(&sess->active_wait_frames_lock); 527 544 545 + if (sess->frame_timing_spew) { 546 + oxr_log(log, "Called at %8.3fms", ts_ms(sess)); 547 + } 548 + 528 549 // A subsequent xrWaitFrame call must: block until the previous frame 529 550 // has been begun 530 551 os_semaphore_wait(&sess->sem, 0); 552 + 553 + if (sess->frame_timing_spew) { 554 + oxr_log(log, 555 + "Finished waiting for previous frame begin at %8.3fms", 556 + ts_ms(sess)); 557 + } 531 558 532 559 uint64_t predicted_display_time; 533 560 uint64_t predicted_display_period; ··· 551 578 log, XR_ERROR_RUNTIME_FAILURE, 552 579 "Time_state_monotonic_to_ts_ns returned '%" PRIi64 "'", 553 580 frameState->predictedDisplayTime); 581 + } 582 + 583 + if (sess->frame_timing_spew) { 584 + oxr_log(log, 585 + "Waiting finished at %8.3fms. Predicted display time " 586 + "%8.3fms, " 587 + "period %8.3fms", 588 + ts_ms(sess), ns_to_ms(predicted_display_time), 589 + ns_to_ms(predicted_display_period)); 554 590 } 555 591 556 592 return oxr_session_success_result(sess); ··· 1867 1903 frameEndInfo->displayTime); 1868 1904 } 1869 1905 1906 + int64_t timestamp = time_state_ts_to_monotonic_ns( 1907 + sess->sys->inst->timekeeping, frameEndInfo->displayTime); 1908 + if (sess->frame_timing_spew) { 1909 + oxr_log(log, "End frame at %8.3fms with display time %8.3fms", 1910 + ts_ms(sess), ns_to_ms(timestamp)); 1911 + } 1912 + 1870 1913 struct xrt_compositor *xc = sess->compositor; 1871 1914 1872 1915 /* ··· 2250 2293 } 2251 2294 2252 2295 sess->ipd_meters = debug_get_num_option_ipd() / 1000.0f; 2296 + sess->frame_timing_spew = debug_get_bool_option_frame_timing_spew(); 2253 2297 2254 2298 oxr_session_change_state(log, sess, XR_SESSION_STATE_IDLE); 2255 2299 oxr_session_change_state(log, sess, XR_SESSION_STATE_READY);