mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-01 04:36:07 +00:00
ipc: Use wait helper to implement wait frame
This commit is contained in:
parent
a0d63d2f9c
commit
1772baa90e
|
@ -11,12 +11,14 @@
|
||||||
#include "xrt/xrt_device.h"
|
#include "xrt/xrt_device.h"
|
||||||
#include "xrt/xrt_compositor.h"
|
#include "xrt/xrt_compositor.h"
|
||||||
#include "xrt/xrt_defines.h"
|
#include "xrt/xrt_defines.h"
|
||||||
|
#include "xrt/xrt_config_os.h"
|
||||||
#include "util/u_misc.h"
|
|
||||||
#include "util/u_trace_marker.h"
|
|
||||||
|
|
||||||
#include "os/os_time.h"
|
#include "os/os_time.h"
|
||||||
|
|
||||||
|
#include "util/u_wait.h"
|
||||||
|
#include "util/u_misc.h"
|
||||||
|
#include "util/u_trace_marker.h"
|
||||||
|
|
||||||
#include "shared/ipc_protocol.h"
|
#include "shared/ipc_protocol.h"
|
||||||
#include "client/ipc_client.h"
|
#include "client/ipc_client.h"
|
||||||
#include "ipc_client_generated.h"
|
#include "ipc_client_generated.h"
|
||||||
|
@ -70,6 +72,9 @@ struct ipc_client_compositor
|
||||||
//! Has the native compositor been created, only supports one for now.
|
//! Has the native compositor been created, only supports one for now.
|
||||||
bool compositor_created;
|
bool compositor_created;
|
||||||
|
|
||||||
|
//! To get better wake up in wait frame.
|
||||||
|
struct os_precise_sleeper sleeper;
|
||||||
|
|
||||||
#ifdef IPC_USE_LOOPBACK_IMAGE_ALLOCATOR
|
#ifdef IPC_USE_LOOPBACK_IMAGE_ALLOCATOR
|
||||||
//! To test image allocator.
|
//! To test image allocator.
|
||||||
struct xrt_image_native_allocator loopback_xina;
|
struct xrt_image_native_allocator loopback_xina;
|
||||||
|
@ -508,44 +513,12 @@ ipc_compositor_wait_frame(struct xrt_compositor *xc,
|
||||||
out_predicted_display_time, // Display time
|
out_predicted_display_time, // Display time
|
||||||
out_predicted_display_period)); // Current period
|
out_predicted_display_period)); // Current period
|
||||||
|
|
||||||
uint64_t now_ns = os_monotonic_get_ns();
|
// Wait until the given wake up time.
|
||||||
|
u_wait_until(&icc->sleeper, wake_up_time_ns);
|
||||||
// Lets hope its not to late.
|
|
||||||
if (wake_up_time_ns <= now_ns) {
|
|
||||||
res = ipc_call_compositor_wait_woke(icc->ipc_c, *out_frame_id);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint64_t _1ms_in_ns = 1000 * 1000;
|
|
||||||
const uint64_t measured_scheduler_latency_ns = 50 * 1000;
|
|
||||||
|
|
||||||
// Within one ms, just release the app right now.
|
|
||||||
if (wake_up_time_ns - _1ms_in_ns <= now_ns) {
|
|
||||||
res = ipc_call_compositor_wait_woke(icc->ipc_c, *out_frame_id);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is how much we should sleep.
|
|
||||||
uint64_t diff_ns = wake_up_time_ns - now_ns;
|
|
||||||
|
|
||||||
// A minor tweak that helps achieve the timing better.
|
|
||||||
diff_ns -= measured_scheduler_latency_ns;
|
|
||||||
|
|
||||||
os_nanosleep(diff_ns);
|
|
||||||
|
|
||||||
|
// Signal that we woke up.
|
||||||
res = ipc_call_compositor_wait_woke(icc->ipc_c, *out_frame_id);
|
res = ipc_call_compositor_wait_woke(icc->ipc_c, *out_frame_id);
|
||||||
|
|
||||||
#if 0
|
|
||||||
uint64_t then_ns = now_ns;
|
|
||||||
now_ns = os_monotonic_get_ns();
|
|
||||||
|
|
||||||
diff_ns = now_ns - then_ns;
|
|
||||||
uint64_t ms100 = diff_ns / (1000 * 10);
|
|
||||||
|
|
||||||
U_LOG_D("%s: Slept %i.%02ims", __func__, (int)ms100 / 100,
|
|
||||||
(int)ms100 % 100);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -799,6 +772,8 @@ ipc_compositor_destroy(struct xrt_compositor *xc)
|
||||||
|
|
||||||
IPC_CALL_CHK(ipc_call_session_destroy(icc->ipc_c));
|
IPC_CALL_CHK(ipc_call_session_destroy(icc->ipc_c));
|
||||||
|
|
||||||
|
os_precise_sleeper_deinit(&icc->sleeper);
|
||||||
|
|
||||||
icc->compositor_created = false;
|
icc->compositor_created = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -827,6 +802,9 @@ ipc_compositor_init(struct ipc_client_compositor *icc, struct xrt_compositor_nat
|
||||||
icc->base.base.destroy = ipc_compositor_destroy;
|
icc->base.base.destroy = ipc_compositor_destroy;
|
||||||
icc->base.base.poll_events = ipc_compositor_poll_events;
|
icc->base.base.poll_events = ipc_compositor_poll_events;
|
||||||
|
|
||||||
|
// Using in wait frame.
|
||||||
|
os_precise_sleeper_init(&icc->sleeper);
|
||||||
|
|
||||||
// Fetch info from the compositor, among it the format format list.
|
// Fetch info from the compositor, among it the format format list.
|
||||||
get_info(&(icc->base.base), &icc->base.base.info);
|
get_info(&(icc->base.base), &icc->base.base.info);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue