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] f43: Update to v26.9 (fedora#2532595).
Date: Sat, 12 Sep 2026 21:49:12 GMT	[thread overview]
Message-ID: <178924975284.1.7577792270775654248.rpms-wivrn-bd9ffd0dc8fd@fedoraproject.org> (raw)

A new commit has been pushed.

Repo   : rpms/wivrn
Branch : f43
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=f43

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:49 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=178924975284.1.7577792270775654248.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