public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Jonathan Steffan <jsteffan@fedoraproject.org>
To: git-commits@fedoraproject.org
Subject: [rpms/wivrn] f45: Update to v26.9 (fedora#2532595).
Date: Sat, 12 Sep 2026 21:47:53 GMT [thread overview]
Message-ID: <178924967312.1.6335110993759067127.rpms-wivrn-bd9ffd0dc8fd@fedoraproject.org> (raw)
A new commit has been pushed.
Repo : rpms/wivrn
Branch : f45
Commit : bd9ffd0dc8fdfd1b69e4e86f12b43174819d844b
Author : Jonathan Steffan <jsteffan@fedoraproject.org>
Date : 2026-09-12T14:20:03-06:00
Stats : +308/-53 in 14 file(s)
URL : https://src.fedoraproject.org/rpms/wivrn/c/bd9ffd0dc8fdfd1b69e4e86f12b43174819d844b?branch=f45
Log:
Update to v26.9 (fedora#2532595).
---
diff --git a/.gitignore b/.gitignore
index 95390de..ef984b7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,5 @@
/monado-src-1b526bb3a0ff326ecd05af4c2c541407f53c6d4b.tar.bz2
/WiVRn-v26.6.1.tar.gz
/WiVRn-v26.6.2.tar.gz
+/WiVRn-v26.9.tar.gz
+/monado-src-f037264d23e2472a444a157370647fcd601ed81b.tar.bz2
diff --git a/0001-c-multi-early-wake-of-compositor.patch b/0001-c-multi-early-wake-of-compositor.patch
index 03cb41e..a269ca4 100644
--- a/0001-c-multi-early-wake-of-compositor.patch
+++ b/0001-c-multi-early-wake-of-compositor.patch
@@ -1,7 +1,7 @@
-From de3b592fc26d7b26b4850fcc78d7e6b21147f76b Mon Sep 17 00:00:00 2001
+From 0276080e671cdefb7e88eda9492049727223689a Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Tue, 22 Oct 2024 15:23:19 +0200
-Subject: [PATCH 1/8] c/multi: early wake of compositor
+Subject: [PATCH 1/9] c/multi: early wake of compositor
---
.../compositor/multi/comp_multi_compositor.c | 14 +++++++++
@@ -51,11 +51,11 @@ index 6c7ec05f8..588878e38 100644
{
int64_t predicted_display_time_ns;
diff --git a/src/xrt/compositor/multi/comp_multi_system.c b/src/xrt/compositor/multi/comp_multi_system.c
-index 5a4f35b81..cbda39c24 100644
+index 51d1c2827..363def34f 100644
--- a/src/xrt/compositor/multi/comp_multi_system.c
+++ b/src/xrt/compositor/multi/comp_multi_system.c
-@@ -14,6 +14,8 @@
- #include "xrt/xrt_defines.h"
+@@ -15,6 +15,8 @@
+ #include "xrt/xrt_results.h"
#include "xrt/xrt_session.h"
+#include "math/m_api.h"
@@ -63,7 +63,7 @@ index 5a4f35b81..cbda39c24 100644
#include "os/os_time.h"
#include "os/os_threading.h"
-@@ -426,17 +428,24 @@ broadcast_timings_to_pacers(struct multi_system_compositor *msc,
+@@ -427,17 +429,24 @@ broadcast_timings_to_pacers(struct multi_system_compositor *msc,
}
static void
@@ -93,7 +93,7 @@ index 5a4f35b81..cbda39c24 100644
}
static void
-@@ -562,10 +571,13 @@ multi_main_loop(struct multi_system_compositor *msc)
+@@ -574,10 +583,13 @@ multi_main_loop(struct multi_system_compositor *msc)
broadcast_timings_to_clients(msc, predicted_display_time_ns);
// Now we can wait.
@@ -109,7 +109,7 @@ index 5a4f35b81..cbda39c24 100644
// Now we know the diff, broadcast to pacers.
broadcast_timings_to_pacers(msc, predicted_display_time_ns, predicted_display_period_ns, diff_ns);
-@@ -785,6 +797,8 @@ system_compositor_destroy(struct xrt_system_compositor *xsc)
+@@ -797,6 +809,8 @@ system_compositor_destroy(struct xrt_system_compositor *xsc)
xrt_comp_native_destroy(&msc->xcn);
os_mutex_destroy(&msc->list_and_timing_lock);
@@ -118,7 +118,7 @@ index 5a4f35b81..cbda39c24 100644
free(msc);
}
-@@ -843,6 +857,8 @@ comp_multi_create_system_compositor(struct xrt_compositor_native *xcn,
+@@ -855,6 +869,8 @@ comp_multi_create_system_compositor(struct xrt_compositor_native *xcn,
msc->get_view_config_callback = get_view_config_callback;
os_mutex_init(&msc->list_and_timing_lock);
@@ -128,5 +128,5 @@ index 5a4f35b81..cbda39c24 100644
//! @todo Make the clients not go from IDLE to READY before we have completed a first frame.
// Make sure there is at least some sort of valid frame data here.
--
-2.54.0
+2.55.0
diff --git a/0002-Use-extern-socket-fd.patch b/0002-Use-extern-socket-fd.patch
index 8f507e1..353ae8a 100644
--- a/0002-Use-extern-socket-fd.patch
+++ b/0002-Use-extern-socket-fd.patch
@@ -1,7 +1,7 @@
-From 22d9bf87e9dd6a0d5970258a6b6cd6ca82c3bb26 Mon Sep 17 00:00:00 2001
+From fb7e9dcb19dc23cb5a20cbfede6f3bd96a02b2b9 Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Tue, 8 Oct 2024 22:13:15 +0200
-Subject: [PATCH 2/8] Use extern socket fd
+Subject: [PATCH 2/9] Use extern socket fd
---
src/xrt/ipc/server/ipc_server_mainloop_linux.c | 8 ++++++++
@@ -34,5 +34,5 @@ index a0bef3dde..453dd38ca 100644
// We may have been launched with socket activation
int num_fds = sd_listen_fds(0);
--
-2.54.0
+2.55.0
diff --git a/0003-change-environment-blend-mode-selection-logic.patch b/0003-change-environment-blend-mode-selection-logic.patch
index 2529eaa..e297482 100644
--- a/0003-change-environment-blend-mode-selection-logic.patch
+++ b/0003-change-environment-blend-mode-selection-logic.patch
@@ -1,17 +1,17 @@
-From 3c7450d800b0e3f35440f41d3bfcf5b5abe6dfe8 Mon Sep 17 00:00:00 2001
+From 6d0479029790d9db188b0111bf7301e2dcf6e10c Mon Sep 17 00:00:00 2001
From: galister <85970-galister@users.noreply.gitlab.freedesktop.org>
Date: Sat, 23 Nov 2024 02:42:12 +0900
-Subject: [PATCH 3/8] change environment blend mode selection logic
+Subject: [PATCH 3/9] change environment blend mode selection logic
---
src/xrt/compositor/multi/comp_multi_system.c | 26 +++++++++++++-------
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/src/xrt/compositor/multi/comp_multi_system.c b/src/xrt/compositor/multi/comp_multi_system.c
-index cbda39c24..c0c6c9f60 100644
+index 363def34f..b98d9b27d 100644
--- a/src/xrt/compositor/multi/comp_multi_system.c
+++ b/src/xrt/compositor/multi/comp_multi_system.c
-@@ -231,23 +231,31 @@ find_active_blend_mode(struct multi_compositor **overlay_sorted_clients, size_t
+@@ -232,23 +232,31 @@ find_active_blend_mode(struct multi_compositor **overlay_sorted_clients, size_t
if (overlay_sorted_clients == NULL)
return XRT_BLEND_MODE_OPAQUE;
@@ -53,5 +53,5 @@ index cbda39c24..c0c6c9f60 100644
}
--
-2.54.0
+2.55.0
diff --git a/0004-st-oxr-forward-0-refresh-rate.patch b/0004-st-oxr-forward-0-refresh-rate.patch
index 6a4fecf..7b046a5 100644
--- a/0004-st-oxr-forward-0-refresh-rate.patch
+++ b/0004-st-oxr-forward-0-refresh-rate.patch
@@ -1,7 +1,7 @@
-From b26876c29205f2d2fb07fbdbe009d5635eb32bfd Mon Sep 17 00:00:00 2001
+From d03b94d252682b5da6ac80bbf1e4346575c78cf3 Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Sat, 15 Mar 2025 22:19:48 +0100
-Subject: [PATCH 4/8] st/oxr: forward 0 refresh rate
+Subject: [PATCH 4/9] st/oxr: forward 0 refresh rate
---
src/xrt/compositor/main/comp_compositor.c | 2 +-
@@ -9,10 +9,10 @@ Subject: [PATCH 4/8] st/oxr: forward 0 refresh rate
2 files changed, 2 insertions(+), 6 deletions(-)
diff --git a/src/xrt/compositor/main/comp_compositor.c b/src/xrt/compositor/main/comp_compositor.c
-index b44271622..a1e112e89 100644
+index a8fbd01d8..88e43be19 100644
--- a/src/xrt/compositor/main/comp_compositor.c
+++ b/src/xrt/compositor/main/comp_compositor.c
-@@ -391,7 +391,7 @@ compositor_request_display_refresh_rate(struct xrt_compositor *xc, float display
+@@ -399,7 +399,7 @@ compositor_request_display_refresh_rate(struct xrt_compositor *xc, float display
if (c->target && c->target->request_refresh_rate) {
xrt_result_t result = comp_target_request_refresh_rate(c->target, display_refresh_rate_hz);
// Assume refresh rate change is immediate
@@ -22,7 +22,7 @@ index b44271622..a1e112e89 100644
return result;
}
diff --git a/src/xrt/state_trackers/oxr/oxr_api_session.c b/src/xrt/state_trackers/oxr/oxr_api_session.c
-index 09297f885..9f3a7ebc2 100644
+index 1e19da2c6..86633ef71 100644
--- a/src/xrt/state_trackers/oxr/oxr_api_session.c
+++ b/src/xrt/state_trackers/oxr/oxr_api_session.c
@@ -455,15 +455,11 @@ oxr_xrRequestDisplayRefreshRateFB(XrSession session, float displayRefreshRate)
@@ -43,5 +43,5 @@ index 09297f885..9f3a7ebc2 100644
if ((int)(displayRefreshRate * 100.0f) == (int)(sess->sys->xsysc->info.refresh_rates_hz[i] * 100.0f)) {
found = true;
--
-2.54.0
+2.55.0
diff --git a/0005-d-steamvr_lh-prevent-crash-on-vive-pro2-WiVRn.patch b/0005-d-steamvr_lh-prevent-crash-on-vive-pro2-WiVRn.patch
index 698c0ad..06437d8 100644
--- a/0005-d-steamvr_lh-prevent-crash-on-vive-pro2-WiVRn.patch
+++ b/0005-d-steamvr_lh-prevent-crash-on-vive-pro2-WiVRn.patch
@@ -1,17 +1,17 @@
-From 7230746571d1256d32557fd99528ac90a1d75957 Mon Sep 17 00:00:00 2001
+From cee540ab542a1e1386b86f437aa05cb758e7b5b6 Mon Sep 17 00:00:00 2001
From: no name <git-am@invalid>
Date: Sun, 28 Sep 2025 11:33:10 +0200
-Subject: [PATCH 5/8] d/steamvr_lh: prevent crash on vive pro2/WiVRn
+Subject: [PATCH 5/9] d/steamvr_lh: prevent crash on vive pro2/WiVRn
---
src/xrt/drivers/steamvr_lh/steamvr_lh.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/xrt/drivers/steamvr_lh/steamvr_lh.cpp b/src/xrt/drivers/steamvr_lh/steamvr_lh.cpp
-index 347d22068..d34d3331e 100644
+index 947376ca8..45443180e 100644
--- a/src/xrt/drivers/steamvr_lh/steamvr_lh.cpp
+++ b/src/xrt/drivers/steamvr_lh/steamvr_lh.cpp
-@@ -985,7 +985,7 @@ steamvr_lh_create_devices(struct xrt_prober *xp, struct xrt_system_devices **out
+@@ -1019,7 +1019,7 @@ steamvr_lh_create_devices(struct xrt_prober *xp, struct xrt_system_devices **out
// Include the HMD
if (svrs->ctx->hmd) {
@@ -21,5 +21,5 @@ index 347d22068..d34d3331e 100644
}
--
-2.54.0
+2.55.0
diff --git a/0006-st-oxr-push-XrEventDataInteractionProfileChanged-whe.patch b/0006-st-oxr-push-XrEventDataInteractionProfileChanged-whe.patch
index 44f0322..8588e78 100644
--- a/0006-st-oxr-push-XrEventDataInteractionProfileChanged-whe.patch
+++ b/0006-st-oxr-push-XrEventDataInteractionProfileChanged-whe.patch
@@ -1,7 +1,7 @@
-From f400f0e63259bcadd9a7955ae0275caa5aea3ded Mon Sep 17 00:00:00 2001
+From cf589697b28a175802d9a61d2baf498211cdde53 Mon Sep 17 00:00:00 2001
From: Sapphire <imsapphire0@gmail.com>
Date: Fri, 7 Nov 2025 20:41:16 -0600
-Subject: [PATCH 6/8] st/oxr: push XrEventDataInteractionProfileChanged when
+Subject: [PATCH 6/9] st/oxr: push XrEventDataInteractionProfileChanged when
profile changes to NULL
---
@@ -9,10 +9,10 @@ Subject: [PATCH 6/8] st/oxr: push XrEventDataInteractionProfileChanged when
1 file changed, 3 deletions(-)
diff --git a/src/xrt/state_trackers/oxr/actions/oxr_input.c b/src/xrt/state_trackers/oxr/actions/oxr_input.c
-index 2bd3ea009..93659ba35 100644
+index 9d677282d..ee65741a3 100644
--- a/src/xrt/state_trackers/oxr/actions/oxr_input.c
+++ b/src/xrt/state_trackers/oxr/actions/oxr_input.c
-@@ -1932,9 +1932,6 @@ session_update_action_bindings(struct oxr_logger *log,
+@@ -1922,9 +1922,6 @@ session_update_action_bindings(struct oxr_logger *log,
#define POPULATE_PROFILE(X) \
do { \
XrPath path = profiles.X != NULL ? profiles.X->path : XR_NULL_PATH; \
@@ -23,5 +23,5 @@ index 2bd3ea009..93659ba35 100644
action_context->X = path; \
interaction_profile_changed = true; \
--
-2.54.0
+2.55.0
diff --git a/0007-don-t-verify-GL-stuff.patch b/0007-don-t-verify-GL-stuff.patch
index d3b28c4..ca92f97 100644
--- a/0007-don-t-verify-GL-stuff.patch
+++ b/0007-don-t-verify-GL-stuff.patch
@@ -1,17 +1,17 @@
-From 0832cc9a2ccd0f67b3bd3a11ec1b1d1398dfebda Mon Sep 17 00:00:00 2001
+From 766d4264e50911205b9041e56978780b324e7486 Mon Sep 17 00:00:00 2001
From: no name <git-am@invalid>
Date: Sun, 25 Jan 2026 10:09:10 +0100
-Subject: [PATCH 7/8] don't verify GL stuff
+Subject: [PATCH 7/9] don't verify GL stuff
---
src/xrt/state_trackers/oxr/oxr_verify.c | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/src/xrt/state_trackers/oxr/oxr_verify.c b/src/xrt/state_trackers/oxr/oxr_verify.c
-index 8f35222cf..1418a8231 100644
+index dcdb12d96..051291e2c 100644
--- a/src/xrt/state_trackers/oxr/oxr_verify.c
+++ b/src/xrt/state_trackers/oxr/oxr_verify.c
-@@ -610,16 +610,6 @@ oxr_verify_XrGraphicsBindingOpenGLXlibKHR(struct oxr_logger *log, const XrGraphi
+@@ -676,16 +676,6 @@ oxr_verify_XrGraphicsBindingOpenGLXlibKHR(struct oxr_logger *log, const XrGraphi
"XrGraphicsBindingOpenGLXlibKHR::glxDrawable is NULL");
}
@@ -29,5 +29,5 @@ index 8f35222cf..1418a8231 100644
}
--
-2.54.0
+2.55.0
diff --git a/0008-configure-u_git_tag-in-WiVRn.patch b/0008-configure-u_git_tag-in-WiVRn.patch
index 2ba5f58..b638716 100644
--- a/0008-configure-u_git_tag-in-WiVRn.patch
+++ b/0008-configure-u_git_tag-in-WiVRn.patch
@@ -1,14 +1,14 @@
-From d79de5d82def9641484b8d88212d3c2e97e38734 Mon Sep 17 00:00:00 2001
+From f7f1e6fa6dfc8cd6fc58617d9fca49c9bbae3373 Mon Sep 17 00:00:00 2001
From: no name <git-am@invalid>
Date: Fri, 20 Mar 2026 16:51:18 +0100
-Subject: [PATCH 8/8] configure u_git_tag in WiVRn
+Subject: [PATCH 8/9] configure u_git_tag in WiVRn
---
src/xrt/auxiliary/util/CMakeLists.txt | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/src/xrt/auxiliary/util/CMakeLists.txt b/src/xrt/auxiliary/util/CMakeLists.txt
-index 79646b181..21adcd446 100644
+index 0ec4e95ee..9f82f915e 100644
--- a/src/xrt/auxiliary/util/CMakeLists.txt
+++ b/src/xrt/auxiliary/util/CMakeLists.txt
@@ -10,11 +10,6 @@
@@ -23,7 +23,7 @@ index 79646b181..21adcd446 100644
add_library(
aux_util STATIC
u_autoexpgain.c
-@@ -120,7 +115,7 @@ add_library(
+@@ -128,7 +123,7 @@ add_library(
u_worker.cpp
u_worker.h
u_worker.hpp
@@ -33,5 +33,5 @@ index 79646b181..21adcd446 100644
target_link_libraries(
aux_util
--
-2.54.0
+2.55.0
diff --git a/0009-ipc-join-client-threads-before-teardown.patch b/0009-ipc-join-client-threads-before-teardown.patch
new file mode 100644
index 0000000..cfea77c
--- /dev/null
+++ b/0009-ipc-join-client-threads-before-teardown.patch
@@ -0,0 +1,62 @@
+From 3f4451bf117b197b0177844f8fa818a838ebf965 Mon Sep 17 00:00:00 2001
+From: no name <git-am@invalid>
+Date: Sun, 28 Jun 2026 11:36:08 -0600
+Subject: [PATCH 9/9] ipc: join client threads before teardown
+
+On shutdown main_loop() returns as soon as s->running is cleared, but the
+per-client threads may still be in common_shutdown() destroying their
+compositor and dereferencing s->xsysd/s->xso. teardown_all() then frees
+those resources concurrently, so a client thread can lock a mutex the main
+thread has already destroyed (assert om->initialized in
+multi_compositor_destroy). Join the client threads first.
+---
+ src/xrt/ipc/server/ipc_server_process.c | 28 +++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+diff --git a/src/xrt/ipc/server/ipc_server_process.c b/src/xrt/ipc/server/ipc_server_process.c
+index 4f9a6e2a4..3cad2dab1 100644
+--- a/src/xrt/ipc/server/ipc_server_process.c
++++ b/src/xrt/ipc/server/ipc_server_process.c
+@@ -163,11 +163,39 @@ print_linux_end_user_started_information(enum u_logging_level log_level)
+ U_LOG_IFL_I(log_level, "%s", sink.buffer);
+ }
+
++/*!
++ * Join any still-running per-client threads.
++ *
++ * On shutdown @ref main_loop returns as soon as `s->running` is cleared, but the
++ * per-client threads may still be inside common_shutdown(), which destroys each
++ * client's compositor and dereferences `s->xsysd` / `s->xso`. Waiting for them
++ * here, before teardown_all() destroys those resources, avoids a race where a
++ * client thread locks a mutex the teardown below has already freed (observed as
++ * an `om->initialized` assertion in multi_compositor_destroy). `s->running` is
++ * already false by this point, so each client loop exits within its poll timeout.
++ */
++static void
++join_all_client_threads(struct ipc_server *s)
++{
++ for (uint32_t i = 0; i < IPC_MAX_CLIENTS; i++) {
++ struct ipc_thread *it = &s->threads[i];
++ if (it->state == IPC_THREAD_READY) {
++ continue;
++ }
++ os_thread_join(&it->thread);
++ os_thread_destroy(&it->thread);
++ it->state = IPC_THREAD_READY;
++ }
++}
++
+ static void
+ teardown_all(struct ipc_server *s)
+ {
+ u_var_remove_root(s);
+
++ // Client threads reference the resources destroyed below; wait them out first.
++ join_all_client_threads(s);
++
+ xrt_syscomp_destroy(&s->xsysc);
+
+ xrt_space_overseer_destroy(&s->xso);
+--
+2.55.0
+
diff --git a/0010-a-math-Add-m_relation_history_get_clamped.patch b/0010-a-math-Add-m_relation_history_get_clamped.patch
new file mode 100644
index 0000000..d523a49
--- /dev/null
+++ b/0010-a-math-Add-m_relation_history_get_clamped.patch
@@ -0,0 +1,138 @@
+From 99722fde70de23bad66f47ab7a53748ce0e498d0 Mon Sep 17 00:00:00 2001
+From: Sapphire <imsapphire0@gmail.com>
+Date: Wed, 26 Aug 2026 06:14:13 -0500
+Subject: [PATCH 1/2] a/math: Add m_relation_history_get_clamped
+
+Signed-off-by: Sapphire <imsapphire0@gmail.com>
+---
+ src/xrt/auxiliary/math/m_relation_history.cpp | 33 ++++++++++++++++---
+ src/xrt/auxiliary/math/m_relation_history.h | 23 ++++++++++++-
+ 2 files changed, 50 insertions(+), 6 deletions(-)
+
+diff --git a/src/xrt/auxiliary/math/m_relation_history.cpp b/src/xrt/auxiliary/math/m_relation_history.cpp
+index 700f9e7fc..47a61ed6d 100644
+--- a/src/xrt/auxiliary/math/m_relation_history.cpp
++++ b/src/xrt/auxiliary/math/m_relation_history.cpp
+@@ -84,15 +84,20 @@ m_relation_history_push(struct m_relation_history *rh, struct xrt_space_relation
+ }
+
+ enum m_relation_history_result
+-m_relation_history_get(const struct m_relation_history *rh,
+- int64_t at_timestamp_ns,
+- struct xrt_space_relation *out_relation)
++m_relation_history_get_clamped(const struct m_relation_history *rh,
++ int64_t at_timestamp_ns,
++ int64_t max_extrapolation_ns,
++ int64_t *out_timestamp_ns,
++ struct xrt_space_relation *out_relation)
+ {
+ XRT_TRACE_MARKER();
+ std::unique_lock<os::Mutex> lock(rh->mutex);
+ try {
+ if (rh->impl.empty() || at_timestamp_ns == 0) {
+ // Do nothing. You push nothing to the buffer you get nothing from the buffer.
++ if (out_timestamp_ns) {
++ *out_timestamp_ns = 0;
++ }
+ *out_relation = {};
+ return M_RELATION_HISTORY_RESULT_INVALID;
+ }
+@@ -111,18 +116,26 @@ m_relation_history_get(const struct m_relation_history *rh,
+ // The desired timestamp is after what our buffer contains.
+ // (pose-prediction)
+ // Output flags match the most recent buffer entry.
+- int64_t diff_prediction_ns = static_cast<int64_t>(at_timestamp_ns) - rh->impl.back().timestamp;
++ int64_t diff_prediction_ns = MIN(
++ static_cast<int64_t>(at_timestamp_ns) - rh->impl.back().timestamp, max_extrapolation_ns);
+ double delta_s = time_ns_to_s(diff_prediction_ns);
+
+ U_LOG_T("Extrapolating %f s past the back of the buffer!", delta_s);
+
+ m_predict_relation(&rh->impl.back().relation, delta_s, out_relation);
++ if (out_timestamp_ns) {
++ // We extrapolated to the requested timestamp.
++ *out_timestamp_ns = at_timestamp_ns + diff_prediction_ns;
++ }
+ return M_RELATION_HISTORY_RESULT_PREDICTED;
+ }
+ if (at_timestamp_ns == it->timestamp) {
+ // exact match:
+ // Flags copied directly along with everything else.
+ U_LOG_T("Exact match in the buffer!");
++ if (out_timestamp_ns) {
++ *out_timestamp_ns = at_timestamp_ns;
++ }
+ *out_relation = it->relation;
+ return M_RELATION_HISTORY_RESULT_EXACT;
+ }
+@@ -131,10 +144,16 @@ m_relation_history_get(const struct m_relation_history *rh,
+ // The desired timestamp is before what our buffer contains.
+ // (an edge case where somebody asks for a really old pose and we do our best)
+ // Output flags are the same as the input flags for the history entry we use
+- int64_t diff_prediction_ns = static_cast<int64_t>(at_timestamp_ns) - rh->impl.front().timestamp;
++ int64_t diff_prediction_ns =
++ -MIN(abs(static_cast<int64_t>(at_timestamp_ns) - rh->impl.front().timestamp),
++ max_extrapolation_ns);
+ double delta_s = time_ns_to_s(diff_prediction_ns);
+ U_LOG_T("Extrapolating %f s before the front of the buffer!", delta_s);
+ m_predict_relation(&rh->impl.front().relation, delta_s, out_relation);
++ if (out_timestamp_ns) {
++ // We extrapolated to the requested timestamp.
++ *out_timestamp_ns = at_timestamp_ns + diff_prediction_ns;
++ }
+ return M_RELATION_HISTORY_RESULT_REVERSE_PREDICTED;
+ }
+ U_LOG_T("Interpolating within buffer!");
+@@ -174,6 +193,10 @@ m_relation_history_get(const struct m_relation_history *rh,
+ result.linear_velocity = m_vec3_lerp(predecessor.relation.linear_velocity,
+ successor.relation.linear_velocity, amount_to_lerp);
+ }
++ if (out_timestamp_ns) {
++ // We interpolated to the requested timestamp.
++ *out_timestamp_ns = at_timestamp_ns;
++ }
+ *out_relation = result;
+ return M_RELATION_HISTORY_RESULT_INTERPOLATED;
+
+diff --git a/src/xrt/auxiliary/math/m_relation_history.h b/src/xrt/auxiliary/math/m_relation_history.h
+index 86e08ef5e..5aaa94404 100644
+--- a/src/xrt/auxiliary/math/m_relation_history.h
++++ b/src/xrt/auxiliary/math/m_relation_history.h
+@@ -83,12 +83,33 @@ m_relation_history_push_with_motion_estimation(struct m_relation_history *rh,
+ * Read-only operation - doesn't remove anything from the buffer or anything like that - you can call this as often
+ * as you want.
+ *
++ * @param max_extrapolation_ns Maximum time the pose may be extrapolated to. INT64_MAX means extrapolation is unlimited.
++ * @param out_timestamp_ns Optional out parameter for the timestamp of the pose.
++ * @param out_relation Out parameter for the resulting @ref xrt_space_relation.
++ *
+ * @public @memberof m_relation_history
+ */
+ enum m_relation_history_result
++m_relation_history_get_clamped(const struct m_relation_history *rh,
++ int64_t at_timestamp_ns,
++ int64_t max_extrapolation_ns,
++ int64_t *out_timestamp_ns,
++ struct xrt_space_relation *out_relation);
++
++/*!
++ * Wrapper for @ref m_relation_history_get_clamped with unlimited extrapolation.
++ *
++ * @copydoc m_relation_history_get_clamped
++ *
++ * @public @memberof m_relation_history
++ */
++static inline enum m_relation_history_result
+ m_relation_history_get(const struct m_relation_history *rh,
+ int64_t at_timestamp_ns,
+- struct xrt_space_relation *out_relation);
++ struct xrt_space_relation *out_relation)
++{
++ return m_relation_history_get_clamped(rh, at_timestamp_ns, INT64_MAX, NULL, out_relation);
++}
+
+ /*!
+ * Get the latest report in the buffer, if any.
+--
+2.55.0
+
diff --git a/0011-d-steamvr_lh-Add-LH_MAX_EXTRAPOLATION_MS.patch b/0011-d-steamvr_lh-Add-LH_MAX_EXTRAPOLATION_MS.patch
new file mode 100644
index 0000000..0d80366
--- /dev/null
+++ b/0011-d-steamvr_lh-Add-LH_MAX_EXTRAPOLATION_MS.patch
@@ -0,0 +1,44 @@
+From d098ae99f41017945c2bacb8fcdb317c8b859085 Mon Sep 17 00:00:00 2001
+From: Sapphire <imsapphire0@gmail.com>
+Date: Wed, 26 Aug 2026 06:17:10 -0500
+Subject: [PATCH 2/2] d/steamvr_lh: Add LH_MAX_EXTRAPOLATION_MS
+
+Signed-off-by: Sapphire <imsapphire0@gmail.com>
+---
+ src/xrt/drivers/steamvr_lh/device.cpp | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/src/xrt/drivers/steamvr_lh/device.cpp b/src/xrt/drivers/steamvr_lh/device.cpp
+index fc3da6066..29304677f 100644
+--- a/src/xrt/drivers/steamvr_lh/device.cpp
++++ b/src/xrt/drivers/steamvr_lh/device.cpp
+@@ -53,6 +53,7 @@
+ DEBUG_GET_ONCE_BOOL_OPTION(lh_emulate_hand, "LH_EMULATE_HAND", true)
+ DEBUG_GET_ONCE_FLOAT_OPTION(lh_override_ipd, "LH_OVERRIDE_IPD_MM", -1.0f)
+ DEBUG_GET_ONCE_BOOL_OPTION(lh_standby_on_exit, "LH_STANDBY_ON_EXIT", false)
++DEBUG_GET_ONCE_NUM_OPTION(lh_max_extrapolation_ms, "LH_MAX_EXTRAPOLATION_MS", 50)
+
+ // Each device will have its own input class.
+ struct InputClass
+@@ -740,7 +741,17 @@ ControllerDevice::get_hand_tracking(enum xrt_input_name name,
+ void
+ Device::get_pose(uint64_t at_timestamp_ns, xrt_space_relation *out_relation)
+ {
+- m_relation_history_get(this->relation_hist, at_timestamp_ns, out_relation);
++ static const int64_t max_extrapolation_ns = []() -> int64_t {
++ int64_t raw = debug_get_num_option_lh_max_extrapolation_ms();
++ if (raw == -1) {
++ return INT64_MAX;
++ }
++
++ return raw * U_TIME_1MS_IN_NS;
++ }();
++
++ m_relation_history_get_clamped(this->relation_hist, at_timestamp_ns, max_extrapolation_ns, nullptr,
++ out_relation);
+ }
+
+ xrt_result_t
+--
+2.55.0
+
diff --git a/sources b/sources
index a0f8e38..d42ace0 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
-SHA512 (WiVRn-v26.6.2.tar.gz) = ce210881d43a09a4fc8a6c6fe6e40b6925a110d715a3f15ad38d5210b9ef06361e62ee6e267ffcb8fbc0f50ff9a71254c6bcd3a3e13c7bff2b09eb2532fc0db8
-SHA512 (monado-src-1b526bb3a0ff326ecd05af4c2c541407f53c6d4b.tar.bz2) = 662bf90d5a38e05c5909ed8d1a5c099979ae49ec6f7a71552a9d0c625ddda29f6b631e0feca8a01a6bb6eefcd6aacfbc81207f2852466165c561973df1cddf97
+SHA512 (WiVRn-v26.9.tar.gz) = 4a550ccc698a2c8926d5d71b91551df1bb00976540b3920e90b52231d615559d4adef882afb22ded7a6789bdd71e3a52a299b0d1cee5f56a7c9bf811c41f8d47
+SHA512 (monado-src-f037264d23e2472a444a157370647fcd601ed81b.tar.bz2) = e81ae6e0afd23873e40a98506873e98ac86e9390368f52d72f19cfbe19fd2d5fb392f79071618f55a760d67ae9ba4369cf35b877318752172ab6169e0221616c
diff --git a/wivrn.spec b/wivrn.spec
index 73be60b..b8038fe 100644
--- a/wivrn.spec
+++ b/wivrn.spec
@@ -7,13 +7,13 @@
# WiVRn is based on Monado, we need the full source
# Monado base source (find in monado-rev file)
%global forgeurl1 https://gitlab.freedesktop.org/monado/monado
-%global commit1 1b526bb3a0ff326ecd05af4c2c541407f53c6d4b
+%global commit1 f037264d23e2472a444a157370647fcd601ed81b
%global monado_version 25.1.0
%forgemeta
Name: wivrn
-Version: 26.6.2
+Version: 26.9
Release: %autorelease
Summary: An OpenXR streaming application to a standalone headset
@@ -57,10 +57,14 @@ Patch0006: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/
Patch0007: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0007-don-t-verify-GL-stuff.patch
# downstream-only - WiVRn specific Monado patches
Patch0008: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0008-configure-u_git_tag-in-WiVRn.patch
+# downstream-only - WiVRn specific Monado patches
+Patch0009: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0009-ipc-join-client-threads-before-teardown.patch
+# downstream-only - WiVRn specific Monado patches
+Patch0010: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0010-a-math-Add-m_relation_history_get_clamped.patch
+# downstream-only - WiVRn specific Monado patches
+Patch0011: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0011-d-steamvr_lh-Add-LH_MAX_EXTRAPOLATION_MS.patch
-# If BuildRequires change, be sure to update envision-wivrn Requires
-# https://src.fedoraproject.org/rpms/envision/blob/rawhide/f/envision.spec
BuildRequires: boost-devel
BuildRequires: cmake
BuildRequires: desktop-file-utils
@@ -195,6 +199,9 @@ pushd _deps/monado-src
%patch -P0006 -p1
%patch -P0007 -p1
%patch -P0008 -p1
+%patch -P0009 -p1
+%patch -P0010 -p1
+%patch -P0011 -p1
popd
@@ -248,11 +255,13 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/io.github.wivrn.wivrn
appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/*.metainfo.xml
-%files -f %{name}-dashboard.lang
+%files
%license COPYING LICENSE-OFL-1.1 _deps/monado-src/LICENSES/*
%doc README.md docs/
%{_bindir}/wivrn-server
%{_bindir}/wivrnctl
+%{_datadir}/bash-completion/completions/wivrnctl
+%{_datadir}/zsh/site-functions/_wivrnctl
%dir %{_libdir}/%{name}
%{_libdir}/%{name}/libopenxr_wivrn.so
%{_libdir}/%{name}/libmonado_wivrn.so
@@ -261,14 +270,14 @@ appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/*.metainfo.xml
%{_datarootdir}/openxr/1/openxr_wivrn.json
%{_userunitdir}/wivrn.service
%{_prefix}/lib/firewalld/services/wivrn.xml
-%{_metainfodir}/io.github.wivrn.wivrn.metainfo.xml
%{_sysconfdir}/ld.so.conf.d/%{name}.conf
%{_environmentdir}/%{name}.conf
-%files -n %{name}-dashboard
+%files -n %{name}-dashboard -f %{name}-dashboard.lang
%{_bindir}/wivrn-dashboard
%{_datarootdir}/applications/io.github.wivrn.wivrn.desktop
%{_datarootdir}/icons/hicolor/scalable/apps/io.github.wivrn.wivrn.svg
+%{_metainfodir}/io.github.wivrn.wivrn.metainfo.xml
%post
reply other threads:[~2026-09-12 21:47 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=178924967312.1.6335110993759067127.rpms-wivrn-bd9ffd0dc8fd@fedoraproject.org \
--to=jsteffan@fedoraproject.org \
--cc=git-commits@fedoraproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox