Compare commits

...
Sign in to create a new pull request.

32 commits

Author SHA1 Message Date
Fedora Release Engineering
2a08f5b11e Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild 2026-07-17 08:50:47 +00:00
Jonathan Steffan
87c7bfbe88 Update to v26.6.2 (fedora#2500002). 2026-07-15 10:08:28 -06:00
Jonathan Steffan
5f848a58e8 Add copr xrizer to OVR_COMPAT_SEARCH_PATH. 2026-07-12 11:10:46 -06:00
Jonathan Steffan
a701af39c2 Set PRESSURE_VESSEL_IMPORT_OPENXR_1_RUNTIMES. 2026-07-11 12:52:39 -06:00
Jonathan Steffan
75cb9e1382 Update to v26.6.1 (fedora#2490713). 2026-06-21 11:24:53 -06:00
Yaakov Selkowitz
779d640f0c Rebuilt for openssl 4.0 2026-06-12 20:05:30 -04:00
Jonathan Steffan
078b99f733 Update to 26.6 (fedora#2487858). 2026-06-11 09:02:10 -06:00
Jan Grulich
a172e8cdc1 Rebuild (qt6) 2026-05-14 09:12:29 +02:00
Jonathan Steffan
0788d160ac Disable ppc64le (fedora#2459412). 2026-04-18 10:41:08 -06:00
Jan Grulich
03d092d358 Rebuild (qt6) 2026-04-16 12:34:47 +02:00
Jonathan Steffan
6c65671668 Add missing kirigami addons. 2026-03-09 09:38:35 -06:00
Jonathan Steffan
39a5a53ee5 Update to v26.2.3 (fedora#2441659). 2026-02-21 12:07:41 -07:00
Jonathan Steffan
63072bb6d9 Update to v26.2.2 (fedora#2440001). 2026-02-15 10:05:35 -07:00
Jonathan Steffan
d8a92b79c6 Update to v26.2.1 (fedora#2439213). 2026-02-12 08:17:26 -07:00
Jonathan Steffan
47bce81817 Fix FTBFS on ppc64le. 2026-02-08 11:29:59 -07:00
Jonathan Steffan
3a1f39a022 Update to v26.2 (fedora#2437602). 2026-02-08 10:48:08 -07:00
Jonathan Steffan
eddf61bf28 Fix FTBFS (fedora#2435188). 2026-02-01 09:16:42 -07:00
Fedora Release Engineering
ab991d68ab Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild 2026-01-17 20:16:57 +00:00
Jonathan Steffan
7103e06440 Update to v25.12 (fedora#2423980). 2025-12-20 10:17:10 -07:00
Jonathan Steffan
06332b094e Enable WIVRN_FEATURE_STEAMVR_LIGHTHOUSE 2025-12-16 08:48:43 -07:00
Jonathan Steffan
56fb0d69f5 Update to v25.11.1 (fedora#2413936). 2025-11-11 11:27:58 -07:00
Jonathan Steffan
304f49bd5d Update to v25.11 (fedora#2413550). 2025-11-08 09:12:15 -07:00
Dominik 'Rathann' Mierzejewski
56a638ef9c Rebuilt for FFmpeg 8 2025-10-31 19:05:32 +01:00
Jonathan Steffan
b6b0cfc320 Resolve Build Failures
- ffmpeg 8 support
- eigen3 v5 support
- update to latest commit
2025-10-25 11:03:48 -06:00
Jonathan Steffan
b9107acdf1 Apply APK download fix. 2025-09-24 08:26:52 -06:00
Jonathan Steffan
d0c02cfb76 Update to v25.9 (fedora#2396284). 2025-09-18 07:46:58 -06:00
Jonathan Steffan
c7a2415cac Add instructions for keeping envision-wivrn updated. 2025-09-07 12:50:24 -06:00
Jonathan Steffan
784d07c05d Update to 25.8 (fedora#2387471). 2025-08-10 10:48:21 -06:00
Fedora Release Engineering
8016bf0637 Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild 2025-07-25 20:27:47 +00:00
Jonathan Steffan
a10904a200 Update to v25.6.1 (fedora#2375418). 2025-07-03 08:45:37 -06:00
Jonathan Steffan
aa7cd8a904 Update to v25.6 (fedora#2375082). 2025-06-28 10:59:19 -06:00
Jonathan Steffan
7bf8486974 Update to 0.25 (fedora#2367081). 2025-05-22 09:15:54 -06:00
22 changed files with 355 additions and 4167 deletions

25
.gitignore vendored
View file

@ -5,3 +5,28 @@
/WiVRn-0.24.tar.gz
/monado-src-848a24aa106758fd6c7afcab6d95880c57dbe450.tar.bz2
/WiVRn-0.24.1.tar.gz
/WiVRn-0.25.tar.gz
/monado-src-2a6932d46dad9aa957205e8a47ec2baa33041076.tar.bz2
/WiVRn-25.6.tar.gz
/monado-src-bb9bcee2a3be75592de819d9e3fb2c8ed27bb7dc.tar.bz2
/WiVRn-25.6.1.tar.gz
/WiVRn-25.8.tar.gz
/monado-src-5c137fe28b232fe460f9b03defa7749adc32ee48.tar.bz2
/WiVRn-25.9.tar.gz
/monado-src-7a4018e2d89151e60e562fac79eba90ca7a328d8.tar.bz2
/WiVRn-de32f6e24f1f457dcea78974b945e1cb3ac6dee8.tar.gz
/monado-src-06e62fc7d9c5cbcbc43405bb86dfde3bf01ce043.tar.bz2
/WiVRn-25.11.tar.gz
/WiVRn-25.11.1.tar.gz
/WiVRn-25.12.tar.gz
/monado-src-20e0dacbdd2de863923790326beec76e848b056a.tar.bz2
/WiVRn-26.2.tar.gz
/monado-src-9dcc3e1de2f7449d9757f5db332c867b4d794fb3.tar.bz2
/WiVRn-26.2.1.tar.gz
/monado-src-723652b545a79609f9f04cb89fcbf807d9d6451a.tar.bz2
/WiVRn-26.2.2.tar.gz
/WiVRn-v26.2.3.tar.gz
/WiVRn-v26.6.tar.gz
/monado-src-1b526bb3a0ff326ecd05af4c2c541407f53c6d4b.tar.bz2
/WiVRn-v26.6.1.tar.gz
/WiVRn-v26.6.2.tar.gz

View file

@ -1,7 +1,7 @@
From a0e439f723394452ab79a09c04df5135c3613d11 Mon Sep 17 00:00:00 2001
From de3b592fc26d7b26b4850fcc78d7e6b21147f76b Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Tue, 22 Oct 2024 15:23:19 +0200
Subject: [PATCH 01/13] c/multi: early wake of compositor
Subject: [PATCH 1/8] c/multi: early wake of compositor
---
.../compositor/multi/comp_multi_compositor.c | 14 +++++++++
@ -10,10 +10,10 @@ Subject: [PATCH 01/13] c/multi: early wake of compositor
3 files changed, 41 insertions(+), 7 deletions(-)
diff --git a/src/xrt/compositor/multi/comp_multi_compositor.c b/src/xrt/compositor/multi/comp_multi_compositor.c
index 2895ccb0f..0c940cb3a 100644
index 33675d43f..71c5ebf9e 100644
--- a/src/xrt/compositor/multi/comp_multi_compositor.c
+++ b/src/xrt/compositor/multi/comp_multi_compositor.c
@@ -231,7 +231,21 @@ wait_for_scheduled_free(struct multi_compositor *mc)
@@ -236,7 +236,21 @@ wait_for_scheduled_free(struct multi_compositor *mc)
os_mutex_lock(&mc->slot_lock);
slot_move_and_clear_locked(mc, &mc->scheduled, &mc->progress);
os_mutex_unlock(&mc->slot_lock);
@ -36,10 +36,10 @@ index 2895ccb0f..0c940cb3a 100644
static void *
diff --git a/src/xrt/compositor/multi/comp_multi_private.h b/src/xrt/compositor/multi/comp_multi_private.h
index 3351defa4..e8f0c8295 100644
index 6c7ec05f8..588878e38 100644
--- a/src/xrt/compositor/multi/comp_multi_private.h
+++ b/src/xrt/compositor/multi/comp_multi_private.h
@@ -359,6 +359,10 @@ struct multi_system_compositor
@@ -365,6 +365,10 @@ struct multi_system_compositor
*/
struct os_mutex list_and_timing_lock;
@ -51,19 +51,19 @@ index 3351defa4..e8f0c8295 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 b06b03a58..249e07d7d 100644
index 5a4f35b81..cbda39c24 100644
--- a/src/xrt/compositor/multi/comp_multi_system.c
+++ b/src/xrt/compositor/multi/comp_multi_system.c
@@ -23,6 +23,8 @@
#include "util/u_trace_marker.h"
#include "util/u_distortion_mesh.h"
@@ -14,6 +14,8 @@
#include "xrt/xrt_defines.h"
#include "xrt/xrt_session.h"
+#include "math/m_api.h"
+
#ifdef XRT_OS_LINUX
#include "util/u_linux.h"
#endif
@@ -392,17 +394,24 @@ broadcast_timings_to_pacers(struct multi_system_compositor *msc,
#include "os/os_time.h"
#include "os/os_threading.h"
@@ -426,17 +428,24 @@ broadcast_timings_to_pacers(struct multi_system_compositor *msc,
}
static void
@ -93,7 +93,7 @@ index b06b03a58..249e07d7d 100644
}
static void
@@ -525,10 +534,13 @@ multi_main_loop(struct multi_system_compositor *msc)
@@ -562,10 +571,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 b06b03a58..249e07d7d 100644
// Now we know the diff, broadcast to pacers.
broadcast_timings_to_pacers(msc, predicted_display_time_ns, predicted_display_period_ns, diff_ns);
@@ -705,6 +717,8 @@ system_compositor_destroy(struct xrt_system_compositor *xsc)
@@ -785,6 +797,8 @@ system_compositor_destroy(struct xrt_system_compositor *xsc)
xrt_comp_native_destroy(&msc->xcn);
os_mutex_destroy(&msc->list_and_timing_lock);
@ -118,8 +118,8 @@ index b06b03a58..249e07d7d 100644
free(msc);
}
@@ -759,6 +773,8 @@ comp_multi_create_system_compositor(struct xrt_compositor_native *xcn,
msc->sessions.state = do_warm_start ? MULTI_SYSTEM_STATE_INIT_WARM_START : MULTI_SYSTEM_STATE_STOPPED;
@@ -843,6 +857,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);
+ os_mutex_init(&msc->wake_mutex);
@ -128,5 +128,5 @@ index b06b03a58..249e07d7d 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.48.1
2.54.0

View file

@ -1,26 +1,26 @@
From 95631921f2dd8f422281d5d94bca167bcb773471 Mon Sep 17 00:00:00 2001
From 22d9bf87e9dd6a0d5970258a6b6cd6ca82c3bb26 Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Tue, 8 Oct 2024 22:13:15 +0200
Subject: [PATCH 03/10] Use extern socket fd
Subject: [PATCH 2/8] Use extern socket fd
---
src/xrt/ipc/server/ipc_server_mainloop_linux.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/xrt/ipc/server/ipc_server_mainloop_linux.c b/src/xrt/ipc/server/ipc_server_mainloop_linux.c
index ad6b473b7..ea6fad65b 100644
index a0bef3dde..453dd38ca 100644
--- a/src/xrt/ipc/server/ipc_server_mainloop_linux.c
+++ b/src/xrt/ipc/server/ipc_server_mainloop_linux.c
@@ -55,6 +55,8 @@
*/
DEBUG_GET_ONCE_BOOL_OPTION(skip_stdin, "XRT_NO_STDIN", false)
@@ -50,6 +50,8 @@
#endif
+extern int listen_socket;
+
/*
*
* Static functions.
@@ -63,6 +65,12 @@ DEBUG_GET_ONCE_BOOL_OPTION(skip_stdin, "XRT_NO_STDIN", false)
@@ -58,6 +60,12 @@
static int
get_systemd_socket(struct ipc_server_mainloop *ml, int *out_fd)
{
@ -34,5 +34,5 @@ index ad6b473b7..ea6fad65b 100644
// We may have been launched with socket activation
int num_fds = sd_listen_fds(0);
--
2.48.0
2.54.0

View file

@ -1,25 +0,0 @@
From 6e5926f76f8a7ee66eff164ebe630c65d024237f Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Tue, 2 Apr 2024 17:14:42 +0200
Subject: [PATCH 02/10] ipc/server: Always listen to stdin
---
src/xrt/ipc/server/ipc_server_mainloop_linux.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/xrt/ipc/server/ipc_server_mainloop_linux.c b/src/xrt/ipc/server/ipc_server_mainloop_linux.c
index d364fbed3..ad6b473b7 100644
--- a/src/xrt/ipc/server/ipc_server_mainloop_linux.c
+++ b/src/xrt/ipc/server/ipc_server_mainloop_linux.c
@@ -186,7 +186,7 @@ init_epoll(struct ipc_server_mainloop *ml)
struct epoll_event ev = {0};
- if (!ml->launched_by_socket && !debug_get_bool_option_skip_stdin()) {
+ if (!debug_get_bool_option_skip_stdin()) {
// Can't do this when launched by systemd socket activation by
// default.
// This polls stdin.
--
2.48.0

View file

@ -1,17 +1,17 @@
From 9a3e2f9bdc3149aaa6db1c54c95b0b4f9ab379ff Mon Sep 17 00:00:00 2001
From 3c7450d800b0e3f35440f41d3bfcf5b5abe6dfe8 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 05/10] change environment blend mode selection logic
Subject: [PATCH 3/8] 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 b7d2c2174..62a5a0c27 100644
index cbda39c24..c0c6c9f60 100644
--- a/src/xrt/compositor/multi/comp_multi_system.c
+++ b/src/xrt/compositor/multi/comp_multi_system.c
@@ -232,23 +232,31 @@ find_active_blend_mode(struct multi_compositor **overlay_sorted_clients, size_t
@@ -231,23 +231,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 b7d2c2174..62a5a0c27 100644
}
--
2.48.0
2.54.0

View file

@ -1,25 +0,0 @@
From c95362727746c19ff039168ebec3e6e21e6bcc3c Mon Sep 17 00:00:00 2001
From: galister <3123227-galister@users.noreply.gitlab.com>
Date: Mon, 19 Aug 2024 18:51:45 +0900
Subject: [PATCH 04/10] c/render: Add storage usage to distortion mesh
---
src/xrt/compositor/render/render_distortion.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/xrt/compositor/render/render_distortion.c b/src/xrt/compositor/render/render_distortion.c
index 8ac24db8e..5a7e400c3 100644
--- a/src/xrt/compositor/render/render_distortion.c
+++ b/src/xrt/compositor/render/render_distortion.c
@@ -42,7 +42,7 @@ create_distortion_image_and_view(struct vk_bundle *vk,
vk, // vk_bundle
extent, // extent
format, // format
- VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, // usage
+ VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, // usage
&device_memory, // out_device_memory
&image); // out_image
VK_CHK_AND_RET(ret, "vk_create_image_simple");
--
2.48.0

View file

@ -0,0 +1,47 @@
From b26876c29205f2d2fb07fbdbe009d5635eb32bfd 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
---
src/xrt/compositor/main/comp_compositor.c | 2 +-
src/xrt/state_trackers/oxr/oxr_api_session.c | 6 +-----
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
--- 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
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
- if (result == XRT_SUCCESS)
+ if (result == XRT_SUCCESS && display_refresh_rate_hz > 0)
c->frame_interval_ns = U_TIME_1S_IN_NS / display_refresh_rate_hz;
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
--- 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)
OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess, "xrRequestDisplayRefreshRateFB");
OXR_VERIFY_SESSION_NOT_LOST(&log, sess);
- if (displayRefreshRate == 0.0f) {
- return XR_SUCCESS;
- }
-
/*
* For the requested display refresh rate, truncating to two decimal
* places and checking if it's in the supported refresh rates.
*/
- bool found = false;
+ bool found = displayRefreshRate == 0.0f;
for (int i = 0; i < (int)sess->sys->xsysc->info.refresh_rate_count; ++i) {
if ((int)(displayRefreshRate * 100.0f) == (int)(sess->sys->xsysc->info.refresh_rates_hz[i] * 100.0f)) {
found = true;
--
2.54.0

View file

@ -0,0 +1,25 @@
From 7230746571d1256d32557fd99528ac90a1d75957 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
---
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
--- 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
// Include the HMD
if (svrs->ctx->hmd) {
- if (svrs->ctx->hmd->variant == VIVE_VARIANT_PRO2 && !svrs->ctx->hmd->init_vive_pro_2(xp)) {
+ if (xp && svrs->ctx->hmd->variant == VIVE_VARIANT_PRO2 && !svrs->ctx->hmd->init_vive_pro_2(xp)) {
U_LOG_IFL_W(level, "Found Vive Pro 2, but failed to initialize.");
}
--
2.54.0

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,27 @@
From f400f0e63259bcadd9a7955ae0275caa5aea3ded 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
profile changes to NULL
---
src/xrt/state_trackers/oxr/actions/oxr_input.c | 3 ---
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
--- 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,
#define POPULATE_PROFILE(X) \
do { \
XrPath path = profiles.X != NULL ? profiles.X->path : XR_NULL_PATH; \
- if (path == XR_NULL_PATH) { \
- break; /* Only update on "active" interaction profiles per sub-action path. */ \
- } \
if (action_context->X != path) { \
action_context->X = path; \
interaction_profile_changed = true; \
--
2.54.0

View file

@ -1,719 +0,0 @@
From cf75548500d8aff912f2e63d68e0ea3628941bf8 Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Wed, 11 Sep 2024 22:56:29 +0200
Subject: [PATCH 07/10] Convert to YCbCr in Monado
---
src/xrt/compositor/main/comp_renderer.c | 6 +-
src/xrt/compositor/main/comp_target.h | 3 +-
src/xrt/compositor/render/render_compute.c | 104 +++++++++++++------
src/xrt/compositor/render/render_interface.h | 15 ++-
src/xrt/compositor/render/render_resources.c | 35 +++++--
src/xrt/compositor/shaders/distortion.comp | 55 +++++++---
src/xrt/compositor/util/comp_render.h | 12 ++-
src/xrt/compositor/util/comp_render_cs.c | 41 +++++---
8 files changed, 186 insertions(+), 85 deletions(-)
diff --git a/src/xrt/compositor/main/comp_renderer.c b/src/xrt/compositor/main/comp_renderer.c
index 104f761bf..3b3439d5a 100644
--- a/src/xrt/compositor/main/comp_renderer.c
+++ b/src/xrt/compositor/main/comp_renderer.c
@@ -1009,7 +1009,8 @@ dispatch_compute(struct comp_renderer *r,
// Target Vulkan resources..
VkImage target_image = r->c->target->images[r->acquired_buffer].handle;
- VkImageView target_image_view = r->c->target->images[r->acquired_buffer].view;
+ VkImageView target_image_view_y = r->c->target->images[r->acquired_buffer].view;
+ VkImageView target_image_view_cbcr = r->c->target->images[r->acquired_buffer].view_cbcr;
// Target view information.
struct render_viewport_data views[XRT_MAX_VIEWS];
@@ -1020,7 +1021,8 @@ dispatch_compute(struct comp_renderer *r,
comp_render_cs_initial_init( //
&data, // data
target_image, // target_image
- target_image_view, // target_unorm_view
+ target_image_view_y, // target_unorm_view_y
+ target_image_view_cbcr, // target_unorm_view_cbcr
fast_path, // fast_path
do_timewarp); // do_timewarp
diff --git a/src/xrt/compositor/main/comp_target.h b/src/xrt/compositor/main/comp_target.h
index 876ff8cd9..924b4ea08 100644
--- a/src/xrt/compositor/main/comp_target.h
+++ b/src/xrt/compositor/main/comp_target.h
@@ -61,7 +61,8 @@ enum comp_target_display_timing_usage
struct comp_target_image
{
VkImage handle;
- VkImageView view;
+ VkImageView view; // Y
+ VkImageView view_cbcr;
};
/*!
diff --git a/src/xrt/compositor/render/render_compute.c b/src/xrt/compositor/render/render_compute.c
index 131b97066..a9552cf2c 100644
--- a/src/xrt/compositor/render/render_compute.c
+++ b/src/xrt/compositor/render/render_compute.c
@@ -66,8 +66,8 @@ calc_dispatch_dims_views(const struct render_viewport_data views[XRT_MAX_VIEWS],
#undef IMAX
// Power of two divide and round up.
- w = uint_divide_and_round_up(w, 8);
- h = uint_divide_and_round_up(h, 8);
+ w = uint_divide_and_round_up(w, 16);
+ h = uint_divide_and_round_up(h, 16);
*out_w = w;
*out_h = h;
@@ -86,8 +86,10 @@ update_compute_layer_descriptor_set(struct vk_bundle *vk,
VkSampler src_samplers[RENDER_MAX_IMAGES_SIZE],
VkImageView src_image_views[RENDER_MAX_IMAGES_SIZE],
uint32_t image_count,
- uint32_t target_binding,
- VkImageView target_image_view,
+ uint32_t target_binding_y,
+ uint32_t target_binding_cbcr,
+ VkImageView target_image_view_y,
+ VkImageView target_image_view_cbcr,
uint32_t ubo_binding,
VkBuffer ubo_buffer,
VkDeviceSize ubo_size,
@@ -100,8 +102,13 @@ update_compute_layer_descriptor_set(struct vk_bundle *vk,
src_image_info[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
}
- VkDescriptorImageInfo target_image_info = {
- .imageView = target_image_view,
+ VkDescriptorImageInfo target_image_info_y = {
+ .imageView = target_image_view_y,
+ .imageLayout = VK_IMAGE_LAYOUT_GENERAL,
+ };
+
+ VkDescriptorImageInfo target_image_info_cbcr = {
+ .imageView = target_image_view_cbcr,
.imageLayout = VK_IMAGE_LAYOUT_GENERAL,
};
@@ -111,7 +118,7 @@ update_compute_layer_descriptor_set(struct vk_bundle *vk,
.range = ubo_size,
};
- VkWriteDescriptorSet write_descriptor_sets[3] = {
+ VkWriteDescriptorSet write_descriptor_sets[4] = {
{
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
.dstSet = descriptor_set,
@@ -123,10 +130,10 @@ update_compute_layer_descriptor_set(struct vk_bundle *vk,
{
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
.dstSet = descriptor_set,
- .dstBinding = target_binding,
+ .dstBinding = target_binding_y,
.descriptorCount = 1,
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
- .pImageInfo = &target_image_info,
+ .pImageInfo = &target_image_info_y,
},
{
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
@@ -136,6 +143,14 @@ update_compute_layer_descriptor_set(struct vk_bundle *vk,
.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.pBufferInfo = &buffer_info,
},
+ {
+ .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
+ .dstSet = descriptor_set,
+ .dstBinding = target_binding_cbcr,
+ .descriptorCount = 1,
+ .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
+ .pImageInfo = &target_image_info_cbcr,
+ },
};
vk->vkUpdateDescriptorSets( //
@@ -154,8 +169,10 @@ update_compute_shared_descriptor_set(struct vk_bundle *vk,
uint32_t distortion_binding,
VkSampler distortion_samplers[3 * XRT_MAX_VIEWS],
VkImageView distortion_image_views[3 * XRT_MAX_VIEWS],
- uint32_t target_binding,
- VkImageView target_image_view,
+ uint32_t target_binding_y,
+ uint32_t target_binding_cbcr,
+ VkImageView target_image_view_y,
+ VkImageView target_image_view_cbcr,
uint32_t ubo_binding,
VkBuffer ubo_buffer,
VkDeviceSize ubo_size,
@@ -176,8 +193,13 @@ update_compute_shared_descriptor_set(struct vk_bundle *vk,
distortion_image_info[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
}
- VkDescriptorImageInfo target_image_info = {
- .imageView = target_image_view,
+ VkDescriptorImageInfo target_image_y_info = {
+ .imageView = target_image_view_y,
+ .imageLayout = VK_IMAGE_LAYOUT_GENERAL,
+ };
+
+ VkDescriptorImageInfo target_image_cbcr_info = {
+ .imageView = target_image_view_cbcr,
.imageLayout = VK_IMAGE_LAYOUT_GENERAL,
};
@@ -187,7 +209,7 @@ update_compute_shared_descriptor_set(struct vk_bundle *vk,
.range = ubo_size,
};
- VkWriteDescriptorSet write_descriptor_sets[4] = {
+ VkWriteDescriptorSet write_descriptor_sets[5] = {
{
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
.dstSet = descriptor_set,
@@ -207,10 +229,10 @@ update_compute_shared_descriptor_set(struct vk_bundle *vk,
{
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
.dstSet = descriptor_set,
- .dstBinding = target_binding,
+ .dstBinding = target_binding_y,
.descriptorCount = 1,
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
- .pImageInfo = &target_image_info,
+ .pImageInfo = &target_image_y_info,
},
{
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
@@ -220,6 +242,14 @@ update_compute_shared_descriptor_set(struct vk_bundle *vk,
.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
.pBufferInfo = &buffer_info,
},
+ {
+ .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
+ .dstSet = descriptor_set,
+ .dstBinding = target_binding_cbcr,
+ .descriptorCount = 1,
+ .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
+ .pImageInfo = &target_image_cbcr_info,
+ },
};
vk->vkUpdateDescriptorSets( //
@@ -409,7 +439,8 @@ render_compute_layers(struct render_compute *render,
VkSampler src_samplers[RENDER_MAX_IMAGES_SIZE],
VkImageView src_image_views[RENDER_MAX_IMAGES_SIZE],
uint32_t num_srcs,
- VkImageView target_image_view,
+ VkImageView target_image_view_y,
+ VkImageView target_image_view_cbcr,
const struct render_viewport_data *view,
bool do_timewarp)
{
@@ -429,8 +460,10 @@ render_compute_layers(struct render_compute *render,
src_samplers, //
src_image_views, //
num_srcs, //
- r->compute.target_binding, //
- target_image_view, //
+ r->compute.target_binding_y, //
+ r->compute.target_binding_cbcr, //
+ target_image_view_y, //
+ target_image_view_cbcr, //
r->compute.ubo_binding, //
ubo, //
VK_WHOLE_SIZE, //
@@ -473,7 +506,8 @@ render_compute_projection_timewarp(struct render_compute *render,
const struct xrt_fov src_fovs[XRT_MAX_VIEWS],
const struct xrt_pose new_poses[XRT_MAX_VIEWS],
VkImage target_image,
- VkImageView target_image_view,
+ VkImageView target_image_view_y,
+ VkImageView target_image_view_cbcr,
const struct render_viewport_data views[XRT_MAX_VIEWS])
{
assert(render->r != NULL);
@@ -542,8 +576,10 @@ render_compute_projection_timewarp(struct render_compute *render,
r->compute.distortion_binding, //
distortion_samplers, //
r->distortion.image_views, //
- r->compute.target_binding, //
- target_image_view, //
+ r->compute.target_binding_y, //
+ r->compute.target_binding_cbcr, //
+ target_image_view_y, //
+ target_image_view_cbcr, //
r->compute.ubo_binding, //
r->compute.distortion.ubo.buffer, //
VK_WHOLE_SIZE, //
@@ -581,7 +617,7 @@ render_compute_projection_timewarp(struct render_compute *render,
.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT,
.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT,
.oldLayout = VK_IMAGE_LAYOUT_GENERAL,
- .newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
+ .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = target_image,
@@ -607,7 +643,8 @@ render_compute_projection(struct render_compute *render,
VkImageView src_image_views[XRT_MAX_VIEWS],
const struct xrt_normalized_rect src_norm_rects[XRT_MAX_VIEWS],
VkImage target_image,
- VkImageView target_image_view,
+ VkImageView target_image_view_y,
+ VkImageView target_image_view_cbcr,
const struct render_viewport_data views[XRT_MAX_VIEWS])
{
assert(render->r != NULL);
@@ -666,8 +703,10 @@ render_compute_projection(struct render_compute *render,
r->compute.distortion_binding, //
distortion_samplers, //
r->distortion.image_views, //
- r->compute.target_binding, //
- target_image_view, //
+ r->compute.target_binding_y, //
+ r->compute.target_binding_cbcr, //
+ target_image_view_y, //
+ target_image_view_cbcr, //
r->compute.ubo_binding, //
r->compute.distortion.ubo.buffer, //
VK_WHOLE_SIZE, //
@@ -705,7 +744,7 @@ render_compute_projection(struct render_compute *render,
.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT,
.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT,
.oldLayout = VK_IMAGE_LAYOUT_GENERAL,
- .newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
+ .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = target_image,
@@ -728,7 +767,8 @@ render_compute_projection(struct render_compute *render,
void
render_compute_clear(struct render_compute *render,
VkImage target_image,
- VkImageView target_image_view,
+ VkImageView target_image_view_y,
+ VkImageView target_image_view_cbcr,
const struct render_viewport_data views[XRT_MAX_VIEWS])
{
assert(render->r != NULL);
@@ -795,8 +835,10 @@ render_compute_clear(struct render_compute *render,
r->compute.distortion_binding, //
distortion_samplers, //
r->distortion.image_views, //
- r->compute.target_binding, //
- target_image_view, //
+ r->compute.target_binding_y, //
+ r->compute.target_binding_cbcr, //
+ target_image_view_y, //
+ target_image_view_cbcr, //
r->compute.ubo_binding, //
r->compute.clear.ubo.buffer, //
VK_WHOLE_SIZE, // ubo_size
@@ -834,7 +876,7 @@ render_compute_clear(struct render_compute *render,
.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT,
.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT,
.oldLayout = VK_IMAGE_LAYOUT_GENERAL,
- .newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
+ .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.image = target_image,
diff --git a/src/xrt/compositor/render/render_interface.h b/src/xrt/compositor/render/render_interface.h
index aab965e0c..b0e568401 100644
--- a/src/xrt/compositor/render/render_interface.h
+++ b/src/xrt/compositor/render/render_interface.h
@@ -488,7 +488,8 @@ struct render_resources
uint32_t distortion_binding;
//! Writing the image out too.
- uint32_t target_binding;
+ uint32_t target_binding_y;
+ uint32_t target_binding_cbcr;
//! Uniform data binding.
uint32_t ubo_binding;
@@ -1374,7 +1375,8 @@ render_compute_layers(struct render_compute *render,
VkSampler src_samplers[RENDER_MAX_IMAGES_SIZE],
VkImageView src_image_views[RENDER_MAX_IMAGES_SIZE],
uint32_t num_srcs,
- VkImageView target_image_view,
+ VkImageView target_image_view_y,
+ VkImageView target_image_view_cbcr,
const struct render_viewport_data *view,
bool timewarp);
@@ -1390,7 +1392,8 @@ render_compute_projection_timewarp(struct render_compute *render,
const struct xrt_fov src_fovs[XRT_MAX_VIEWS],
const struct xrt_pose new_poses[XRT_MAX_VIEWS],
VkImage target_image,
- VkImageView target_image_view,
+ VkImageView target_image_view_y,
+ VkImageView target_image_view_cbcr,
const struct render_viewport_data views[XRT_MAX_VIEWS]);
/*!
@@ -1402,7 +1405,8 @@ render_compute_projection(struct render_compute *render,
VkImageView src_image_views[XRT_MAX_VIEWS],
const struct xrt_normalized_rect src_rects[XRT_MAX_VIEWS],
VkImage target_image,
- VkImageView target_image_view,
+ VkImageView target_image_view_y,
+ VkImageView target_image_view_cbcr,
const struct render_viewport_data views[XRT_MAX_VIEWS]);
/*!
@@ -1411,7 +1415,8 @@ render_compute_projection(struct render_compute *render,
void
render_compute_clear(struct render_compute *render,
VkImage target_image,
- VkImageView target_image_view,
+ VkImageView target_image_view_y,
+ VkImageView target_image_view_cbcr,
const struct render_viewport_data views[XRT_MAX_VIEWS]);
diff --git a/src/xrt/compositor/render/render_resources.c b/src/xrt/compositor/render/render_resources.c
index b9b8d4a22..cd9d82072 100644
--- a/src/xrt/compositor/render/render_resources.c
+++ b/src/xrt/compositor/render/render_resources.c
@@ -184,14 +184,15 @@ init_mesh_ubo_buffers(struct vk_bundle *vk, struct render_buffer ubo[XRT_MAX_VIE
XRT_CHECK_RESULT static VkResult
create_compute_layer_descriptor_set_layout(struct vk_bundle *vk,
uint32_t src_binding,
- uint32_t target_binding,
+ uint32_t target_binding_y,
+ uint32_t target_binding_cbcr,
uint32_t ubo_binding,
uint32_t source_images_count,
VkDescriptorSetLayout *out_descriptor_set_layout)
{
VkResult ret;
- VkDescriptorSetLayoutBinding set_layout_bindings[3] = {
+ VkDescriptorSetLayoutBinding set_layout_bindings[4] = {
{
.binding = src_binding,
.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
@@ -199,7 +200,7 @@ create_compute_layer_descriptor_set_layout(struct vk_bundle *vk,
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
},
{
- .binding = target_binding,
+ .binding = target_binding_y,
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
.descriptorCount = 1,
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
@@ -210,6 +211,12 @@ create_compute_layer_descriptor_set_layout(struct vk_bundle *vk,
.descriptorCount = 1,
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
},
+ {
+ .binding = target_binding_cbcr,
+ .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
+ .descriptorCount = 1,
+ .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
+ },
};
VkDescriptorSetLayoutCreateInfo set_layout_info = {
@@ -235,13 +242,14 @@ XRT_CHECK_RESULT static VkResult
create_compute_distortion_descriptor_set_layout(struct vk_bundle *vk,
uint32_t src_binding,
uint32_t distortion_binding,
- uint32_t target_binding,
+ uint32_t target_binding_y,
+ uint32_t target_binding_cbcr,
uint32_t ubo_binding,
VkDescriptorSetLayout *out_descriptor_set_layout)
{
VkResult ret;
- VkDescriptorSetLayoutBinding set_layout_bindings[4] = {
+ VkDescriptorSetLayoutBinding set_layout_bindings[5] = {
{
.binding = src_binding,
.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
@@ -255,7 +263,7 @@ create_compute_distortion_descriptor_set_layout(struct vk_bundle *vk,
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
},
{
- .binding = target_binding,
+ .binding = target_binding_y,
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
.descriptorCount = 1,
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
@@ -266,6 +274,12 @@ create_compute_distortion_descriptor_set_layout(struct vk_bundle *vk,
.descriptorCount = 1,
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
},
+ {
+ .binding = target_binding_cbcr,
+ .descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
+ .descriptorCount = 1,
+ .stageFlags = VK_SHADER_STAGE_COMPUTE_BIT,
+ },
};
VkDescriptorSetLayoutCreateInfo set_layout_info = {
@@ -601,8 +615,9 @@ render_resources_init(struct render_resources *r,
}
r->compute.src_binding = 0;
r->compute.distortion_binding = 1;
- r->compute.target_binding = 2;
+ r->compute.target_binding_y = 2;
r->compute.ubo_binding = 3;
+ r->compute.target_binding_cbcr = 4;
r->compute.layer.image_array_size =
MIN(vk->features.max_per_stage_descriptor_sampled_images, RENDER_MAX_IMAGES_COUNT(r));
@@ -919,7 +934,8 @@ render_resources_init(struct render_resources *r,
ret = create_compute_layer_descriptor_set_layout( //
vk, // vk_bundle
r->compute.src_binding, // src_binding,
- r->compute.target_binding, // target_binding,
+ r->compute.target_binding_y, // target_binding_y,
+ r->compute.target_binding_cbcr, // target_binding_cbcr,
r->compute.ubo_binding, // ubo_binding,
r->compute.layer.image_array_size, // source_images_count,
&r->compute.layer.descriptor_set_layout); // out_descriptor_set_layout
@@ -1000,7 +1016,8 @@ render_resources_init(struct render_resources *r,
vk, // vk_bundle
r->compute.src_binding, // src_binding,
r->compute.distortion_binding, // distortion_binding,
- r->compute.target_binding, // target_binding,
+ r->compute.target_binding_y, // target_binding_y,
+ r->compute.target_binding_cbcr, // target_binding_cbcr,
r->compute.ubo_binding, // ubo_binding,
&r->compute.distortion.descriptor_set_layout); // out_descriptor_set_layout
VK_CHK_WITH_RET(ret, "create_compute_distortion_descriptor_set_layout", false);
diff --git a/src/xrt/compositor/shaders/distortion.comp b/src/xrt/compositor/shaders/distortion.comp
index 9a09c03db..461aeb4ec 100644
--- a/src/xrt/compositor/shaders/distortion.comp
+++ b/src/xrt/compositor/shaders/distortion.comp
@@ -18,7 +18,7 @@ layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(set = 0, binding = 0) uniform sampler2D source[2];
layout(set = 0, binding = 1) uniform sampler2D distortion[6];
-layout(set = 0, binding = 2) uniform writeonly restrict image2D target;
+layout(set = 0, binding = 2) uniform writeonly restrict image2D luma;
layout(set = 0, binding = 3, std140) uniform restrict Config
{
ivec4 views[2];
@@ -26,7 +26,20 @@ layout(set = 0, binding = 3, std140) uniform restrict Config
vec4 post_transform[2];
mat4 transform[2];
} ubo;
+layout(set = 0, binding = 4) uniform writeonly restrict image2D chroma;
+const mat3 color_space = mat3(
+// clang-format off
+// R G B
+/* Y */ 0.2126, 0.7152, 0.0722,
+/* Cb*/-0.1146, -0.3854, 0.5,
+/* Cr*/ 0.5 , -0.4542, -0.0458);
+//clang-format: on
+
+vec3 rgb_to_ycbcr(vec3 color)
+{
+ return transpose(color_space) * color + vec3(0, 0.5, 0.5);
+}
vec2 position_to_uv(ivec2 extent, uint ix, uint iy)
{
@@ -124,30 +137,40 @@ mat3x2 source_coord(ivec3 xyv, ivec2 extent)
void main()
{
- uint ix = gl_GlobalInvocationID.x;
- uint iy = gl_GlobalInvocationID.y;
uint iz = gl_GlobalInvocationID.z;
ivec2 offset = ivec2(ubo.views[iz].xy);
ivec2 extent = ivec2(ubo.views[iz].zw);
+ vec2 cbcrs[4];
+ for (int k = 0; k < 2; k += 1) {
+ uint iy = gl_GlobalInvocationID.y * 2 + k;
+ for (int j = 0; j < 2; j += 1) {
+ uint ix = gl_GlobalInvocationID.x * 2 + j;
- if (ix >= extent.x || iy >= extent.y) {
- return;
- }
+ vec2 dist_uv = position_to_uv(extent, ix, iy);
- vec2 dist_uv = position_to_uv(extent, ix, iy);
+ vec2 uv = texture(distortion[iz + 0], dist_uv).xy;
+ vec2 lod = texture(distortion[iz + 2], dist_uv).xy;
- vec2 uv = texture(distortion[iz + 0], dist_uv).xy;
- vec2 lod = texture(distortion[iz + 2], dist_uv).xy;
+ // Do any transformation needed.
+ uv = transform_uv(uv, iz);
- // Do any transformation needed.
- uv = transform_uv(uv, iz);
+ // Sample the source
+ vec3 colour = textureLod(source[iz], uv, mix(lod.x, lod.y, 0.5)).rgb;
- // Sample the source
- vec4 colour = textureLod(source[iz], uv, mix(lod.x, lod.y, 0.5));
+ colour = rgb_to_ycbcr(from_linear_to_srgb(colour));
- // Do colour correction here since there are no automatic conversion in hardware available.
- colour = vec4(from_linear_to_srgb(colour.rgb), 1);
+ int i = k * 2 + j;
+ cbcrs[i] = colour.yz;
- imageStore(target, ivec2(offset.x + ix, offset.y + iy), colour);
+ if (ix < extent.x && iy < extent.y) {
+ imageStore(luma, ivec2(offset.x + ix, offset.y + iy), vec4(colour.x));
+ }
+ }
+ }
+ if (gl_GlobalInvocationID.x >= extent.x || gl_GlobalInvocationID.y >= extent.y) {
+ return;
+ }
+ vec2 cbcr = mix(mix(cbcrs[0], cbcrs[1], 0.5), mix(cbcrs[2], cbcrs[3], 0.5), 0.5);
+ imageStore(chroma, ivec2(offset.xy/2 + gl_GlobalInvocationID.xy), vec4(cbcr.x, cbcr.y, 0, 0));
}
diff --git a/src/xrt/compositor/util/comp_render.h b/src/xrt/compositor/util/comp_render.h
index e6fd072be..d0733b650 100644
--- a/src/xrt/compositor/util/comp_render.h
+++ b/src/xrt/compositor/util/comp_render.h
@@ -166,7 +166,8 @@ struct comp_render_dispatch_data
VkImage target_image;
//! Target image view for distortion.
- VkImageView target_unorm_view;
+ VkImageView target_unorm_view_y;
+ VkImageView target_unorm_view_cbcr;
} cs;
};
@@ -432,7 +433,8 @@ comp_render_gfx_dispatch(struct render_gfx *render,
static inline void
comp_render_cs_initial_init(struct comp_render_dispatch_data *data,
VkImage target_image,
- VkImageView target_unorm_view,
+ VkImageView target_unorm_view_y,
+ VkImageView target_unorm_view_cbcr,
bool fast_path,
bool do_timewarp)
{
@@ -442,7 +444,8 @@ comp_render_cs_initial_init(struct comp_render_dispatch_data *data,
data->do_timewarp = do_timewarp;
data->cs.target_image = target_image;
- data->cs.target_unorm_view = target_unorm_view;
+ data->cs.target_unorm_view_y = target_unorm_view_y;
+ data->cs.target_unorm_view_cbcr = target_unorm_view_cbcr;
}
/*!
@@ -534,7 +537,8 @@ comp_render_cs_layer(struct render_compute *render,
const struct xrt_pose *world_pose,
const struct xrt_pose *eye_pose,
const VkImage target_image,
- const VkImageView target_image_view,
+ const VkImageView target_image_view_y,
+ const VkImageView target_image_view_cbcr,
const struct render_viewport_data *target_view,
bool do_timewarp);
diff --git a/src/xrt/compositor/util/comp_render_cs.c b/src/xrt/compositor/util/comp_render_cs.c
index fc11a0521..3db6c8d2e 100644
--- a/src/xrt/compositor/util/comp_render_cs.c
+++ b/src/xrt/compositor/util/comp_render_cs.c
@@ -430,11 +430,12 @@ crc_clear_output(struct render_compute *render, const struct comp_render_dispatc
}
- render_compute_clear( //
- render, //
- d->cs.target_image, //
- d->cs.target_unorm_view, // target_image_view
- target_viewport_datas); // views
+ render_compute_clear( //
+ render, //
+ d->cs.target_image, //
+ d->cs.target_unorm_view_y, // target_image_view_y
+ d->cs.target_unorm_view_cbcr, // target_image_view_cbcr
+ target_viewport_datas); // views
}
/*
@@ -480,14 +481,15 @@ crc_distortion_after_squash(struct render_compute *render, const struct comp_ren
target_viewport_datas[i] = viewport_data;
}
- render_compute_projection( //
- render, //
- src_samplers, //
- src_image_views, //
- src_norm_rects, //
- d->cs.target_image, //
- d->cs.target_unorm_view, // target_image_view
- target_viewport_datas); // views
+ render_compute_projection( //
+ render, //
+ src_samplers, //
+ src_image_views, //
+ src_norm_rects, //
+ d->cs.target_image, //
+ d->cs.target_unorm_view_y, // target_image_view_y
+ d->cs.target_unorm_view_cbcr, // target_image_view_cbcr
+ target_viewport_datas); // views
}
/// Fast path
@@ -559,7 +561,8 @@ crc_distortion_fast_path(struct render_compute *render,
src_image_views, //
src_norm_rects, //
d->cs.target_image, //
- d->cs.target_unorm_view, //
+ d->cs.target_unorm_view_y, //
+ d->cs.target_unorm_view_cbcr, //
target_viewport_datas); //
} else {
render_compute_projection_timewarp( //
@@ -571,7 +574,8 @@ crc_distortion_fast_path(struct render_compute *render,
src_fovs, //
world_poses, //
d->cs.target_image, //
- d->cs.target_unorm_view, //
+ d->cs.target_unorm_view_y, //
+ d->cs.target_unorm_view_cbcr, //
target_viewport_datas); //
}
}
@@ -592,7 +596,8 @@ comp_render_cs_layer(struct render_compute *render,
const struct xrt_pose *world_pose,
const struct xrt_pose *eye_pose,
const VkImage target_image,
- const VkImageView target_image_view,
+ const VkImageView target_image_view_y,
+ const VkImageView target_image_view_cbcr,
const struct render_viewport_data *target_view,
bool do_timewarp)
{
@@ -749,7 +754,8 @@ comp_render_cs_layer(struct render_compute *render,
src_samplers, //
src_image_views, //
cur_image, //
- target_image_view, //
+ target_image_view_y, //
+ target_image_view_cbcr, //
target_view, //
do_timewarp); //
}
@@ -785,6 +791,7 @@ comp_render_cs_layers(struct render_compute *render,
&view->eye_pose, //
view->image, //
view->cs.unorm_view, //
+ view->cs.unorm_view, //
&view->layer_viewport_data, //
d->do_timewarp); //
}
--
2.48.0

View file

@ -0,0 +1,33 @@
From 0832cc9a2ccd0f67b3bd3a11ec1b1d1398dfebda 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
---
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
--- 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
"XrGraphicsBindingOpenGLXlibKHR::glxDrawable is NULL");
}
- if (next->glxFBConfig == NULL) {
- return oxr_error(log, XR_ERROR_GRAPHICS_DEVICE_INVALID,
- "XrGraphicsBindingOpenGLXlibKHR::glxFBConfig is NULL");
- }
-
- if (next->visualid == 0) {
- return oxr_error(log, XR_ERROR_GRAPHICS_DEVICE_INVALID,
- "XrGraphicsBindingOpenGLXlibKHR::visualid is 0");
- }
-
return XR_SUCCESS;
}
--
2.54.0

View file

@ -0,0 +1,37 @@
From d79de5d82def9641484b8d88212d3c2e97e38734 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
---
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
--- a/src/xrt/auxiliary/util/CMakeLists.txt
+++ b/src/xrt/auxiliary/util/CMakeLists.txt
@@ -10,11 +10,6 @@
# by applications like the OpenXR runtime library.
#
-configure_file(
- "${CMAKE_CURRENT_SOURCE_DIR}/u_git_tag.c.in" "${CMAKE_CURRENT_BINARY_DIR}/u_git_tag.c"
- @ONLY
- )
-
add_library(
aux_util STATIC
u_autoexpgain.c
@@ -120,7 +115,7 @@ add_library(
u_worker.cpp
u_worker.h
u_worker.hpp
- "${CMAKE_CURRENT_BINARY_DIR}/u_git_tag.c"
+ "${U_GIT_TAG_CPP}"
)
target_link_libraries(
aux_util
--
2.54.0

View file

@ -1,186 +0,0 @@
From 9e0dc33f7b1895e084e70b0b18d84510eb6e0219 Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Tue, 31 Dec 2024 11:01:12 +0100
Subject: [PATCH 09/10] Revert "a/bindings: improve reproducibility of bindings
generation"
This reverts commit d2fbd3ce8d962e4a46351df0f34f14de71871e00.
---
src/xrt/auxiliary/bindings/bindings.py | 41 +++++++++++--------
.../auxiliary/bindings/steamvr_profiles.py | 2 +-
2 files changed, 24 insertions(+), 19 deletions(-)
diff --git a/src/xrt/auxiliary/bindings/bindings.py b/src/xrt/auxiliary/bindings/bindings.py
index 3039629ef..28d4395ff 100755
--- a/src/xrt/auxiliary/bindings/bindings.py
+++ b/src/xrt/auxiliary/bindings/bindings.py
@@ -7,7 +7,8 @@ bindings."""
import argparse
import json
import copy
-from operator import attrgetter
+import itertools
+
def find_component_in_list_by_name(name, component_list, subaction_path=None, identifier_json_path=None):
"""Find a component with the given name in a list of components."""
@@ -123,6 +124,7 @@ class Component:
Turn a Identifier's component paths into a list of Component objects.
"""
+ monado_bindings = json_subpath["monado_bindings"]
component_list = []
for component_name in json_subpath["components"]: # click, touch, ...
matched_dpad_emulation = None
@@ -130,7 +132,9 @@ class Component:
json_subpath["dpad_emulation"]["position"] == component_name):
matched_dpad_emulation = json_subpath["dpad_emulation"]
- monado_binding = json_subpath["monado_bindings"].get(component_name, None)
+ monado_binding = None
+ if component_name in monado_bindings:
+ monado_binding = monado_bindings[component_name]
steamvr_path = steamvr_subpath_name(identifier_json_path, json_subpath["type"])
if "steamvr_path" in json_subpath:
@@ -220,9 +224,10 @@ class Identifier:
identifier_list = []
for subaction_path in json_subaction_paths: # /user/hand/*
- for json_path in sorted(json_subpaths.keys()): # /input/*, /output/*
+ for json_sub_path_itm in json_subpaths.items(): # /input/*, /output/*
+ json_path = json_sub_path_itm[0] # /input/trackpad
# json object associated with a subpath (type, localized_name, ...)
- json_subpath = json_subpaths[json_path]
+ json_subpath = json_sub_path_itm[1]
# Oculus Touch a,b/x,y components only exist on one controller
if "side" in json_subpath and "/user/hand/" + json_subpath["side"] != subaction_path:
@@ -262,7 +267,7 @@ class Identifier:
self.components = component_list
self.dpad = dpad
return
-
+
class FeatureSet:
"""An AND of requirements (versions and/or extensions) under which a binding becomes available"""
@@ -317,7 +322,7 @@ class Availability:
if not optimize:
self.feature_sets = set(feature_sets)
return
-
+
self.feature_sets = set()
for feature_set in feature_sets:
self.add_in_place(feature_set)
@@ -460,8 +465,8 @@ class Profile:
def __update_component_list(self):
self.components = []
for identifier in self.identifiers:
- self.components += identifier.components
- self.components = sorted(self.components, key=attrgetter("steamvr_path"))
+ for component in identifier.components:
+ self.components.append(component)
def availability(self):
result = Availability(feature_sets=[])
@@ -499,8 +504,8 @@ class Bindings:
def __init__(self, json_root):
"""Construct a bindings from a dictionary of profiles."""
- self.profiles = [Profile(profile_name, json_root["profiles"][profile_name]) for
- profile_name in sorted(json_root["profiles"].keys())]
+ self.profiles = [Profile(profile_name, json_profile) for
+ profile_name, json_profile in json_root["profiles"].items()]
self.__set_parent_profile_refs()
self.__mine_for_diamond_errors()
@@ -526,7 +531,7 @@ class Bindings:
if profile.name in parent_path_set:
return True
parent_path_set.append(profile.name)
- for parent in sorted(profile.parent_profiles, key=attrgetter("name")):
+ for parent in profile.parent_profiles:
if self.__has_diamonds(parent, parent_path_set):
return True
return False
@@ -572,7 +577,7 @@ def write_verify_switch_body(f, dict_of_lists, profile, profile_name, tab_char):
Input is a file to write the code into, a dict where keys are length and
the values are lists of strings of that length. And a suffix if any."""
f.write(f"{tab_char}\tswitch (length) {{\n")
- for length in sorted(dict_of_lists.keys()):
+ for length in dict_of_lists.keys():
f.write(f"{tab_char}\tcase {str(length)}:\n\t\t{tab_char}")
for path in sorted(dict_of_lists[length]):
f.write(if_strcmp.format(exttab=tab_char, check=path))
@@ -613,7 +618,7 @@ def write_verify_func_switch(f, dict_of_lists, profile, profile_name, availabili
closing.append(f'{tab_char}}}\n#endif // {ext_defines}\n')
write_verify_switch_body(f, dict_of_lists, profile, profile_name, tab_char)
-
+
for closer in reversed(closing):
f.write(closer)
@@ -624,7 +629,7 @@ def write_verify_func_body(f, profile, dict_name, availability):
profile, dict_name), profile, profile.name, availability)
if profile.parent_profiles is None:
return
- for pp in sorted(profile.parent_profiles, key=attrgetter("name")):
+ for pp in profile.parent_profiles:
write_verify_func_body(f, pp, dict_name, availability.intersection(pp.availability()))
@@ -832,7 +837,7 @@ def generate_bindings_c(file, b):
f.write('{\n')
f.write('\tswitch(input)\n')
f.write('\t{\n')
- for input in sorted(inputs):
+ for input in inputs:
f.write(f'\tcase {input}: return "{input}";\n')
f.write(f'\tdefault: return "UNKNOWN";\n')
f.write('\t}\n')
@@ -841,7 +846,7 @@ def generate_bindings_c(file, b):
f.write('enum xrt_input_name\n')
f.write('xrt_input_name_enum(const char *input)\n')
f.write('{\n')
- for input in sorted(inputs):
+ for input in inputs:
f.write(f'\tif(strcmp("{input}", input) == 0) return {input};\n')
f.write(f'\treturn XRT_INPUT_GENERIC_TRACKER_POSE;\n')
f.write('}\n')
@@ -851,7 +856,7 @@ def generate_bindings_c(file, b):
f.write('{\n')
f.write('\tswitch(output)\n')
f.write('\t{\n')
- for output in sorted(outputs):
+ for output in outputs:
f.write(f'\tcase {output}: return "{output}";\n')
f.write(f'\tdefault: return "UNKNOWN";\n')
f.write('\t}\n')
@@ -860,7 +865,7 @@ def generate_bindings_c(file, b):
f.write('enum xrt_output_name\n')
f.write('xrt_output_name_enum(const char *output)\n')
f.write('{\n')
- for output in sorted(outputs):
+ for output in outputs:
f.write(f'\tif(strcmp("{output}", output) == 0) return {output};\n')
f.write(f'\treturn XRT_OUTPUT_NAME_SIMPLE_VIBRATION;\n')
f.write('}\n')
diff --git a/src/xrt/auxiliary/bindings/steamvr_profiles.py b/src/xrt/auxiliary/bindings/steamvr_profiles.py
index f54a303f9..abcbfabe6 100644
--- a/src/xrt/auxiliary/bindings/steamvr_profiles.py
+++ b/src/xrt/auxiliary/bindings/steamvr_profiles.py
@@ -114,7 +114,7 @@ def main():
# print("Creating SteamVR input profile", f.name)
- json.dump(j, f, indent=2, sort_keys=True)
+ json.dump(j, f, indent=2)
f.close()
--
2.48.0

View file

@ -1,94 +0,0 @@
From e17739a88a15ac26dfe9ccb9ffc97ff029fa7764 Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Sun, 3 Nov 2024 13:40:00 +0100
Subject: [PATCH 10/10] store alpha channel in layer 1
---
src/xrt/compositor/shaders/clear.comp | 4 ++--
src/xrt/compositor/shaders/distortion.comp | 18 ++++++++++++------
2 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/src/xrt/compositor/shaders/clear.comp b/src/xrt/compositor/shaders/clear.comp
index 036da401a..db8e5178e 100644
--- a/src/xrt/compositor/shaders/clear.comp
+++ b/src/xrt/compositor/shaders/clear.comp
@@ -10,7 +10,7 @@
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
-layout(set = 0, binding = 2) uniform writeonly restrict image2D target;
+layout(set = 0, binding = 2) uniform writeonly restrict image2DArray target;
layout(set = 0, binding = 3) uniform restrict Config
{
ivec4 views[2];
@@ -35,5 +35,5 @@ void main()
vec4 colour = vec4(from_linear_to_srgb(vec3(0.1)), 1.0);
- imageStore(target, ivec2(offset.x + ix, offset.y + iy), colour);
+ imageStore(target, ivec3(offset.x + ix, offset.y + iy, 0), colour);
}
diff --git a/src/xrt/compositor/shaders/distortion.comp b/src/xrt/compositor/shaders/distortion.comp
index 461aeb4ec..237221a54 100644
--- a/src/xrt/compositor/shaders/distortion.comp
+++ b/src/xrt/compositor/shaders/distortion.comp
@@ -18,7 +18,7 @@ layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout(set = 0, binding = 0) uniform sampler2D source[2];
layout(set = 0, binding = 1) uniform sampler2D distortion[6];
-layout(set = 0, binding = 2) uniform writeonly restrict image2D luma;
+layout(set = 0, binding = 2) uniform writeonly restrict image2DArray luma;
layout(set = 0, binding = 3, std140) uniform restrict Config
{
ivec4 views[2];
@@ -26,7 +26,7 @@ layout(set = 0, binding = 3, std140) uniform restrict Config
vec4 post_transform[2];
mat4 transform[2];
} ubo;
-layout(set = 0, binding = 4) uniform writeonly restrict image2D chroma;
+layout(set = 0, binding = 4) uniform writeonly restrict image2DArray chroma;
const mat3 color_space = mat3(
// clang-format off
@@ -142,6 +142,7 @@ void main()
ivec2 offset = ivec2(ubo.views[iz].xy);
ivec2 extent = ivec2(ubo.views[iz].zw);
vec2 cbcrs[4];
+ vec4 alpha;
for (int k = 0; k < 2; k += 1) {
uint iy = gl_GlobalInvocationID.y * 2 + k;
for (int j = 0; j < 2; j += 1) {
@@ -156,15 +157,16 @@ void main()
uv = transform_uv(uv, iz);
// Sample the source
- vec3 colour = textureLod(source[iz], uv, mix(lod.x, lod.y, 0.5)).rgb;
+ vec4 colour = textureLod(source[iz], uv, mix(lod.x, lod.y, 0.5));
- colour = rgb_to_ycbcr(from_linear_to_srgb(colour));
+ colour.rgb = rgb_to_ycbcr(from_linear_to_srgb(colour.rgb));
int i = k * 2 + j;
cbcrs[i] = colour.yz;
+ alpha[i] = colour.a;
if (ix < extent.x && iy < extent.y) {
- imageStore(luma, ivec2(offset.x + ix, offset.y + iy), vec4(colour.x));
+ imageStore(luma, ivec3(offset.x + ix, offset.y + iy, 0), vec4(colour.x));
}
}
}
@@ -172,5 +174,9 @@ void main()
return;
}
vec2 cbcr = mix(mix(cbcrs[0], cbcrs[1], 0.5), mix(cbcrs[2], cbcrs[3], 0.5), 0.5);
- imageStore(chroma, ivec2(offset.xy/2 + gl_GlobalInvocationID.xy), vec4(cbcr.x, cbcr.y, 0, 0));
+ imageStore(chroma, ivec3(offset.xy/2 + gl_GlobalInvocationID.xy, 0), vec4(cbcr.x, cbcr.y, 0, 0));
+
+ imageStore(chroma, ivec3(offset.xy/2 + gl_GlobalInvocationID.xy, 1), vec4(0.5, 0.5, 0, 0));
+ alpha = vec4(mix(mix(alpha[0], alpha[1], 0.5), mix(alpha[2], alpha[3], 0.5), 0.5));
+ imageStore(luma, ivec3(offset.xy/2 + gl_GlobalInvocationID.xy, 1), alpha);
}
--
2.48.0

View file

@ -1,40 +0,0 @@
From 6321ad3eee7d4a8b304a36de008d8fb8359f3dfe Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Wed, 19 Feb 2025 10:13:36 +0100
Subject: [PATCH] st/oxr: bind to dynamic role's profile
---
src/xrt/state_trackers/oxr/oxr_binding.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/src/xrt/state_trackers/oxr/oxr_binding.c b/src/xrt/state_trackers/oxr/oxr_binding.c
index eb8bb5489..b04977a8b 100644
--- a/src/xrt/state_trackers/oxr/oxr_binding.c
+++ b/src/xrt/state_trackers/oxr/oxr_binding.c
@@ -380,6 +380,23 @@ oxr_find_profile_for_device(struct oxr_logger *log,
return;
}
+ // Have bindings for the dynamic role's profile been suggested?
+#define FIND_PROFILE(X) \
+ { \
+ struct xrt_device *role_xdev = GET_XDEV_BY_ROLE(sess->sys, X); \
+ if (role_xdev == xdev) { \
+ enum xrt_device_name profile = GET_PROFILE_NAME_BY_ROLE(sess->sys, X); \
+ oxr_get_profile_for_device_name(log, sess, profile, out_p); \
+ if (*out_p != NULL) { \
+ return; \
+ } \
+ } \
+ }
+ FIND_PROFILE(left);
+ FIND_PROFILE(right);
+ FIND_PROFILE(gamepad);
+#undef FIND_PROFILE
+
// Have bindings for this device's interaction profile been suggested?
oxr_get_profile_for_device_name(log, sess, xdev->name, out_p);
if (*out_p != NULL) {
--
2.48.1

View file

@ -1,65 +0,0 @@
From a2f80c1c92619ad57516e24539047d4d30d8cca7 Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Sun, 23 Feb 2025 11:12:14 +0100
Subject: [PATCH] ipc: Initialize hmd data from static role
Make sure the xdev used to read the hmd part is the one from head static
role. This fixes issues in case more than one hmd is available.
---
src/xrt/ipc/server/ipc_server_process.c | 33 ++++++++++++-------------
1 file changed, 16 insertions(+), 17 deletions(-)
diff --git a/src/xrt/ipc/server/ipc_server_process.c b/src/xrt/ipc/server/ipc_server_process.c
index 6b6da45a4..21796fb08 100644
--- a/src/xrt/ipc/server/ipc_server_process.c
+++ b/src/xrt/ipc/server/ipc_server_process.c
@@ -357,23 +357,6 @@ init_shm(struct ipc_server *s)
isdev->stage_supported = xdev->stage_supported;
isdev->battery_status_supported = xdev->battery_status_supported;
- // Is this a HMD?
- if (xdev->hmd != NULL) {
- // set view count
- ism->hmd.view_count = xdev->hmd->view_count;
- for (uint32_t view = 0; view < xdev->hmd->view_count; ++view) {
- ism->hmd.views[view].display.w_pixels = xdev->hmd->views[view].display.w_pixels;
- ism->hmd.views[view].display.h_pixels = xdev->hmd->views[view].display.h_pixels;
- }
-
- for (size_t i = 0; i < xdev->hmd->blend_mode_count; i++) {
- // Not super necessary, we also do this assert in oxr_system.c
- assert(u_verify_blend_mode_valid(xdev->hmd->blend_modes[i]));
- ism->hmd.blend_modes[i] = xdev->hmd->blend_modes[i];
- }
- ism->hmd.blend_mode_count = xdev->hmd->blend_mode_count;
- }
-
// Setup the tracking origin.
isdev->tracking_origin_index = (uint32_t)-1;
for (uint32_t k = 0; k < XRT_SYSTEM_MAX_DEVICES; k++) {
@@ -428,6 +411,22 @@ init_shm(struct ipc_server *s)
}
}
+ // Setup the HMD
+ // set view count
+ assert(s->xsysd->static_roles.head->hmd);
+ ism->hmd.view_count = s->xsysd->static_roles.head->hmd->view_count;
+ for (uint32_t view = 0; view < s->xsysd->static_roles.head->hmd->view_count; ++view) {
+ ism->hmd.views[view].display.w_pixels = s->xsysd->static_roles.head->hmd->views[view].display.w_pixels;
+ ism->hmd.views[view].display.h_pixels = s->xsysd->static_roles.head->hmd->views[view].display.h_pixels;
+ }
+
+ for (size_t i = 0; i < s->xsysd->static_roles.head->hmd->blend_mode_count; i++) {
+ // Not super necessary, we also do this assert in oxr_system.c
+ assert(u_verify_blend_mode_valid(s->xsysd->static_roles.head->hmd->blend_modes[i]));
+ ism->hmd.blend_modes[i] = s->xsysd->static_roles.head->hmd->blend_modes[i];
+ }
+ ism->hmd.blend_mode_count = s->xsysd->static_roles.head->hmd->blend_mode_count;
+
// Finally tell the client how many devices we have.
s->ism->isdev_count = count;
--
2.48.1

View file

@ -1,82 +0,0 @@
From edd3447b25387908acbe005f1cbee5f17bae0260 Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Thu, 27 Feb 2025 22:45:36 +0100
Subject: [PATCH] c/main: allow custom pacing app factory
---
src/xrt/compositor/main/comp_compositor.c | 10 ++++++----
src/xrt/compositor/main/comp_main_interface.h | 4 ++++
src/xrt/targets/common/target_instance.c | 2 +-
3 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/src/xrt/compositor/main/comp_compositor.c b/src/xrt/compositor/main/comp_compositor.c
index 26c341385..36e3297f7 100644
--- a/src/xrt/compositor/main/comp_compositor.c
+++ b/src/xrt/compositor/main/comp_compositor.c
@@ -983,6 +983,7 @@ compositor_init_renderer(struct comp_compositor *c)
xrt_result_t
comp_main_create_system_compositor(struct xrt_device *xdev,
const struct comp_target_factory *ctf,
+ struct u_pacing_app_factory *upaf,
struct xrt_system_compositor **out_xsysc)
{
COMP_TRACE_MARKER();
@@ -1183,10 +1184,11 @@ comp_main_create_system_compositor(struct xrt_device *xdev,
}
// Standard app pacer.
- struct u_pacing_app_factory *upaf = NULL;
- xrt_result_t xret = u_pa_factory_create(&upaf);
- assert(xret == XRT_SUCCESS && upaf != NULL);
- (void)xret;
+ if (upaf == NULL) {
+ xrt_result_t xret = u_pa_factory_create(&upaf);
+ assert(xret == XRT_SUCCESS && upaf != NULL);
+ (void)xret;
+ }
return comp_multi_create_system_compositor(&c->base.base, upaf, sys_info, !c->deferred_surface, out_xsysc);
}
diff --git a/src/xrt/compositor/main/comp_main_interface.h b/src/xrt/compositor/main/comp_main_interface.h
index 0f0678358..f60568b43 100644
--- a/src/xrt/compositor/main/comp_main_interface.h
+++ b/src/xrt/compositor/main/comp_main_interface.h
@@ -15,6 +15,7 @@
#include "xrt/xrt_compositor.h"
struct comp_target_factory;
+struct u_pacing_app_factory;
#ifdef __cplusplus
extern "C" {
@@ -31,11 +32,14 @@ extern "C" {
* @param xdev The head device
* @param ctf A compositor target factory to force the output device, must remain valid for the lifetime of the
* compositor. If NULL, factory is automatically selected
+ * @param upaf A pacing app factory to customize the application pacer, compositor takes ownership.
+ * If NULL, a default factory is used
* @param out_xsysc The output compositor
*/
xrt_result_t
comp_main_create_system_compositor(struct xrt_device *xdev,
const struct comp_target_factory *ctf,
+ struct u_pacing_app_factory *upaf,
struct xrt_system_compositor **out_xsysc);
diff --git a/src/xrt/targets/common/target_instance.c b/src/xrt/targets/common/target_instance.c
index 617561c37..e10ba8358 100644
--- a/src/xrt/targets/common/target_instance.c
+++ b/src/xrt/targets/common/target_instance.c
@@ -109,7 +109,7 @@ t_instance_create_system(struct xrt_instance *xinst,
#ifdef XRT_MODULE_COMPOSITOR_MAIN
if (xret == XRT_SUCCESS && xsysc == NULL) {
- xret = comp_main_create_system_compositor(head, NULL, &xsysc);
+ xret = comp_main_create_system_compositor(head, NULL, NULL, &xsysc);
}
#else
if (!use_null) {
--
2.48.1

View file

@ -1,33 +0,0 @@
From b9bef34f0362677d2a58c0b2b331c98e2f74f9b2 Mon Sep 17 00:00:00 2001
From: Patrick Nicolas <patricknicolas@laposte.net>
Date: Sat, 15 Mar 2025 22:19:48 +0100
Subject: [PATCH] st/oxr: forward 0 refresh rate
---
src/xrt/state_trackers/oxr/oxr_api_session.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/src/xrt/state_trackers/oxr/oxr_api_session.c b/src/xrt/state_trackers/oxr/oxr_api_session.c
index c84806bde..955019957 100644
--- a/src/xrt/state_trackers/oxr/oxr_api_session.c
+++ b/src/xrt/state_trackers/oxr/oxr_api_session.c
@@ -644,15 +644,11 @@ oxr_xrRequestDisplayRefreshRateFB(XrSession session, float displayRefreshRate)
OXR_VERIFY_SESSION_AND_INIT_LOG(&log, session, sess, "xrRequestDisplayRefreshRateFB");
OXR_VERIFY_SESSION_NOT_LOST(&log, sess);
- if (displayRefreshRate == 0.0f) {
- return XR_SUCCESS;
- }
-
/*
* For the requested display refresh rate, truncating to two decimal
* places and checking if it's in the supported refresh rates.
*/
- bool found = false;
+ bool found = displayRefreshRate == 0.0f;
for (int i = 0; i < (int)sess->sys->xsysc->info.refresh_rate_count; ++i) {
if ((int)(displayRefreshRate * 100.0f) == (int)(sess->sys->xsysc->info.refresh_rates_hz[i] * 100.0f)) {
found = true;
--
2.48.1

67
LicenseBreakdown Normal file
View file

@ -0,0 +1,67 @@
CECILL-C
_deps/monado-src/src/external/imgui/imgui/imconfig.h
CC0-1.0 AND Apache-2.0
_deps/monado-src/src/external/glad/*
Unlicense
_deps/monado-src/src/external/imgui/imgui/backends/imgui_impl_opengl3_loader.h
Apache-2.0
_deps/monado-src/gradle*
_deps/monado-src/src/external/{flexkalman,glad,mermaid,nvpro_pyramid,openxr_includes}/*
_deps/monado-src/src/xrt/auxiliary/math/m_quatexpmap.cpp
gradle*
resources/values/ic_wivrn_launcher_background.xml
Apache-2.0 OR MIT
_deps/monado-src/doc/doxygen-awesome-css/doxygen-awesome-*
BSD-2-Clause
_deps/monado-src/cmake/FindEigen3.cmake
_deps/monado-src/src/external/hungarian/*
_deps/monado-src/src/external/tracy/{client,common}/*
_deps/monado-src/cmake/{FindEGL.cmake,FindSystemd.cmake,OptionWithDeps.cmake}
_deps/monado-src/src/external/openvr_includes/*
_deps/monado-src/src/external/tinyceres/*
_deps/monado-src/src/external/tracy/libbacktrace/*
_deps/monado-src/src/xrt/drivers/north_star/distortion_3d/*
_deps/monado-src/src/xrt/tracking/hand/mercury/kine_lm/lm_rotations_ceres.inl
BSD-3-Clause AND BSL-1.0
_deps/monado-src/src/xrt/targets/steamvr_drv/*
BSL-1.0
_deps/monado-src/{CMakeLists.txt,CompilerFlags.cmake,build.gradel}
_deps/monado-src/cmake/{CleanDirectoryList.cmake,FindHIDAPI.cmake,FindLeapV2.cmake,FindLibcheck.cmake,FindLibusb1.cmake,FindONNXRuntime.cmake,FindOpenGLES.cmake,FindOpenHMD.cmake,FindPercetto.cmake,Findbluetooth.cmake,FindcJSON.cmake,Findudev.cmake,GenerateKhrManifest.cmake,GenerateKhrManifestInternals.cmake.in,GenerateOpenXRRuntimeManifest.cmake,GenerateVulkanApiLayerManifest.cmake,GetGitRevisionDescription.cmake,GetGitRevisionDescription.cmake.in,PrefixListGlob.cmake,ProgramFilesGlob.cmake,SPIR-V.cmake,openxr_manifest.in.json.license}
_deps/monado-src/src/external/{Catch2,android-jni-wrap,flexkalman,imgui,nvpro_pyramid,openxr_includes,solarxr,util-headers,vit_includes}
_deps/monado-src/src/xrt/auxiliary/{android,bindings,d3d,gsteamer,math,ogl,os,tracking,util,vive,vk}/*
_deps/monado-src/src/xrt/compositor/*
_deps/monado-src/src/xrt/drivers/{android,arduino,daydream,depthai,euroc,hdk,ht,ht_ctrl_emu,hydra,illixr,multi_wrapper,north_star,ohmd,opengloves,psmv,qwerty,realsense,remote,rift_s,rokid,sample,simula,simulated,solarxr,steamvr_lh,survive,twrap,ultraleap_v2,v4l2,vf,vive,wmr,xreal_air}/*
_deps/monado-src/src/xrt/include/tracking/t_hand_tracking.h
_deps/monado-src/src/xrt/include/xrt/*
_deps/monado-src/src/xrt/{ipc,state_trackers,targets,tracking}/*
_deps/monado-src/tests/*
server/{main.cpp,start_application.cpp,target_instance_wivrn.cpp}
BSL-1.0 AND CC0-1.0
_deps/monado-src/{doc,scripts}/*
GPL-2.0-or-later
tools/wireshark/dissector.cpp
GPL-3.0-or-later
{client,common,dashboard,server}/*
MIT-Khronos-old
_deps/monado-src/src/external/glad/include/KHR/khrplatform.h
MIT
_deps/monado-src/cmake/sanitizers/{FindASan.cmake,FindMSan.cmake,FindSanitizers.cmake,FindTSan.cmake,FindUBSan.cmake,asan-wrapper,sanitize-helpers.cmake}
_deps/monado-src/doc/doxygen-awesome-css/*
_deps/monado-src/src/external/{cjson,imgui,jnipp,mermaid,renderdoc_api,solarxr,stb,tracy,valve-file-vdf}/*
_deps/monado-src/src/xrt/targets/android_common/src/main/res/raw/*
external/{magic_enum.hpp,magic_enum_containers.hpp,vk_mem_alloc.h}
Zlib
_deps/monado-src/src/external/nanopb/*

View file

@ -1,2 +1,2 @@
SHA512 (WiVRn-0.24.1.tar.gz) = f946f815568bf757cb069b247e00c9d9a116829c64a18cebd95a6989a5a573a1b49afcfa78323befa641f34f553497fa88cd24bad686c22f3a10b15ddd1ef857
SHA512 (monado-src-848a24aa106758fd6c7afcab6d95880c57dbe450.tar.bz2) = c11b883dc216864b7265a76ebab212503e20246ac2895b145d9017a861220a8091b4a637fa2b7cd62ad4248688791ff6d6ef080360e2c9a9b63394f6e9d9d3c0
SHA512 (WiVRn-v26.6.2.tar.gz) = ce210881d43a09a4fc8a6c6fe6e40b6925a110d715a3f15ad38d5210b9ef06361e62ee6e267ffcb8fbc0f50ff9a71254c6bcd3a3e13c7bff2b09eb2532fc0db8
SHA512 (monado-src-1b526bb3a0ff326ecd05af4c2c541407f53c6d4b.tar.bz2) = 662bf90d5a38e05c5909ed8d1a5c099979ae49ec6f7a71552a9d0c625ddda29f6b631e0feca8a01a6bb6eefcd6aacfbc81207f2852466165c561973df1cddf97

View file

@ -2,113 +2,65 @@
%bcond_with x264
%global forgeurl0 https://github.com/WiVRn/WiVRn
%global wivrn_version 0.24.1
%global tag0 v%{wivrn_version}
%global date 20250410
%global tag0 v%{version}
# WiVRn is based on Monado, we need the full source
# Monado base source (find in CMakeLists.txt FetchContent_Declare(monado))
# Monado base source (find in monado-rev file)
%global forgeurl1 https://gitlab.freedesktop.org/monado/monado
%global commit1 848a24aa106758fd6c7afcab6d95880c57dbe450
%global monado_version 24.0.0
%global commit1 1b526bb3a0ff326ecd05af4c2c541407f53c6d4b
%global monado_version 25.1.0
%forgemeta
Name: wivrn
Version: %{wivrn_version}
Version: 26.6.2
Release: %autorelease
Summary: An OpenXR streaming application to a standalone headset
License: GPL-3.0-or-later AND Apache-2.0 AND BSD-2-Clause AND BSD-3-Clause AND BSL-1.0 AND CECILL-C AND CC0-1.0 AND CC-BY-4.0 AND MIT-Khronos-old AND Unlicense AND Zlib AND GPL-2.0-or-later AND MIT AND OFL-1.1
# CECILL-C
# _deps/monado-src/src/external/imgui/imgui/imconfig.h
# CC0-1.0 AND Apache-2.0
# _deps/monado-src/src/external/glad/*
# Unlicense
# _deps/monado-src/src/external/imgui/imgui/backends/imgui_impl_opengl3_loader.h
# Apache-2.0
# _deps/monado-src/gradle*
# _deps/monado-src/src/external/{flexkalman,glad,mermaid,nvpro_pyramid,openxr_includes}/*
# _deps/monado-src/src/xrt/auxiliary/math/m_quatexpmap.cpp
# gradle*
# resources/values/ic_wivrn_launcher_background.xml
# Apache-2.0 OR MIT
# _deps/monado-src/doc/doxygen-awesome-css/doxygen-awesome-*
# BSD-2-Clause
# _deps/monado-src/cmake/FindEigen3.cmake
# _deps/monado-src/src/external/hungarian/*
# _deps/monado-src/src/external/tracy/{client,common}/*
# _deps/monado-src/cmake/{FindEGL.cmake,FindSystemd.cmake,OptionWithDeps.cmake}
# _deps/monado-src/src/external/openvr_includes/*
# _deps/monado-src/src/external/tinyceres/*
# _deps/monado-src/src/external/tracy/libbacktrace/*
# _deps/monado-src/src/xrt/drivers/north_star/distortion_3d/*
# _deps/monado-src/src/xrt/tracking/hand/mercury/kine_lm/lm_rotations_ceres.inl
# BSD-3-Clause AND BSL-1.0
# _deps/monado-src/src/xrt/targets/steamvr_drv/*
# BSL-1.0
# _deps/monado-src/{CMakeLists.txt,CompilerFlags.cmake,build.gradel}
# _deps/monado-src/cmake/{CleanDirectoryList.cmake,FindHIDAPI.cmake,FindLeapV2.cmake,FindLibcheck.cmake,FindLibusb1.cmake,FindONNXRuntime.cmake,FindOpenGLES.cmake,FindOpenHMD.cmake,FindPercetto.cmake,Findbluetooth.cmake,FindcJSON.cmake,Findudev.cmake,GenerateKhrManifest.cmake,GenerateKhrManifestInternals.cmake.in,GenerateOpenXRRuntimeManifest.cmake,GenerateVulkanApiLayerManifest.cmake,GetGitRevisionDescription.cmake,GetGitRevisionDescription.cmake.in,PrefixListGlob.cmake,ProgramFilesGlob.cmake,SPIR-V.cmake,openxr_manifest.in.json.license}
# _deps/monado-src/src/external/{Catch2,android-jni-wrap,flexkalman,imgui,nvpro_pyramid,openxr_includes,solarxr,util-headers,vit_includes}
# _deps/monado-src/src/xrt/auxiliary/{android,bindings,d3d,gsteamer,math,ogl,os,tracking,util,vive,vk}/*
# _deps/monado-src/src/xrt/compositor/*
# _deps/monado-src/src/xrt/drivers/{android,arduino,daydream,depthai,euroc,hdk,ht,ht_ctrl_emu,hydra,illixr,multi_wrapper,north_star,ohmd,opengloves,psmv,qwerty,realsense,remote,rift_s,rokid,sample,simula,simulated,solarxr,steamvr_lh,survive,twrap,ultraleap_v2,v4l2,vf,vive,wmr,xreal_air}/*
# _deps/monado-src/src/xrt/include/tracking/t_hand_tracking.h
# _deps/monado-src/src/xrt/include/xrt/*
# _deps/monado-src/src/xrt/{ipc,state_trackers,targets,tracking}/*
# _deps/monado-src/tests/*
# server/{main.cpp,start_application.cpp,target_instance_wivrn.cpp}
# BSL-1.0 AND CC0-1.0
# _deps/monado-src/{doc,scripts}/*
# GPL-2.0-or-later
# tools/wireshark/dissector.cpp
# GPL-3.0-or-later
# {client,common,dashboard,server}/*
# MIT-Khronos-old
# _deps/monado-src/src/external/glad/include/KHR/khrplatform.h
# MIT
# _deps/monado-src/cmake/sanitizers/{FindASan.cmake,FindMSan.cmake,FindSanitizers.cmake,FindTSan.cmake,FindUBSan.cmake,asan-wrapper,sanitize-helpers.cmake}
# _deps/monado-src/doc/doxygen-awesome-css/*
# _deps/monado-src/src/external/{cjson,imgui,jnipp,mermaid,renderdoc_api,solarxr,stb,tracy,valve-file-vdf}/*
# _deps/monado-src/src/xrt/targets/android_common/src/main/res/raw/*
# external/{magic_enum.hpp,magic_enum_containers.hpp,vk_mem_alloc.h}
# Zlib
# _deps/monado-src/src/external/nanopb/*
License: %{shrink:
Apache-2.0
AND BSD-2-Clause
AND BSD-3-Clause
AND BSL-1.0
AND CC-BY-4.0
AND CC0-1.0
AND CECILL-C
AND GPL-2.0-or-later
AND GPL-3.0-or-later
AND MIT
AND MIT-Khronos-old
AND OFL-1.1
AND Unlicense
AND Zlib
}
# For a per-file license breakdown see LicenseBreakdown.
URL: %{forgeurl0}
Source0: %{forgesource0}
# License: GPL-3.0-or-later
Source1: %{forgeurl1}/-/archive/%{commit1}/monado-src-%{commit1}.tar.bz2
# Check for new/removed patches when updating: https://github.com/WiVRn/WiVRn/tree/master/patches/monado/ (check the tag)
# For tagged releases: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%%{tag0}/patches/monado/
# For commit releases: https://raw.githubusercontent.com/WiVRn/WiVRn/%%{commit0}/patches/monado/
# Make sure to re-pull the patches every release. They are rebased and need to be updated!
# downstream-only - WiVRn specific Monado patches
Patch0001: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0001-c-multi-early-wake-of-compositor.patch
# downstream-only - WiVRn specific Monado patches
Patch0002: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0002-ipc-server-Always-listen-to-stdin.patch
Patch0002: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0002-Use-extern-socket-fd.patch
# downstream-only - WiVRn specific Monado patches
Patch0003: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0003-Use-extern-socket-fd.patch
Patch0003: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0003-change-environment-blend-mode-selection-logic.patch
# downstream-only - WiVRn specific Monado patches
Patch0004: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0004-c-render-Add-storage-usage-to-distortion-mesh.patch
Patch0004: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0004-st-oxr-forward-0-refresh-rate.patch
# downstream-only - WiVRn specific Monado patches
Patch0005: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0005-change-environment-blend-mode-selection-logic.patch
Patch0005: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0005-d-steamvr_lh-prevent-crash-on-vive-pro2-WiVRn.patch
# downstream-only - WiVRn specific Monado patches
Patch0006: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0006-Use-mipmaps-for-distortion-shader.patch
Patch0006: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0006-st-oxr-push-XrEventDataInteractionProfileChanged-whe.patch
# downstream-only - WiVRn specific Monado patches
Patch0007: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0007-Convert-to-YCbCr-in-Monado.patch
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
Patch0009: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0009-Revert-a-bindings-improve-reproducibility-of-binding.patch
# downstream-only - WiVRn specific Monado patches
Patch0010: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0010-store-alpha-channel-in-layer-1.patch
# downstream-only - WiVRn specific Monado patches
Patch0011: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0011-st-oxr-bind-to-dynamic-role-s-profile.patch
# downstream-only - WiVRn specific Monado patches
Patch0012: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0012-ipc-Initialize-hmd-data-from-static-role.patch
# downstream-only - WiVRn specific Monado patches
Patch0013: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0013-c-main-allow-custom-pacing-app-factory.patch
# downstream-only - WiVRn specific Monado patches
Patch0014: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0014-st-oxr-forward-0-refresh-rate.patch
Patch0008: https://raw.githubusercontent.com/WiVRn/WiVRn/refs/tags/%{tag0}/patches/monado/0008-configure-u_git_tag-in-WiVRn.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
@ -121,6 +73,7 @@ BuildRequires: kf6-kcoreaddons-devel
BuildRequires: kf6-ki18n-devel
BuildRequires: kf6-kiconthemes-devel
BuildRequires: kf6-kirigami-devel
BuildRequires: kf6-kirigami-addons-devel
BuildRequires: libappstream-glib
BuildRequires: librsvg2-tools
BuildRequires: ninja-build
@ -137,6 +90,7 @@ BuildRequires: pkgconfig(gstreamer-1.0)
BuildRequires: pkgconfig(gstreamer-app-1.0)
BuildRequires: pkgconfig(gstreamer-video-1.0)
BuildRequires: pkgconfig(hidapi-libusb)
BuildRequires: pkgconfig(libarchive)
BuildRequires: pkgconfig(libavcodec)
BuildRequires: pkgconfig(libavfilter)
BuildRequires: pkgconfig(libavutil)
@ -150,6 +104,7 @@ BuildRequires: pkgconfig(libpipewire-0.3)
BuildRequires: pkgconfig(libudev)
BuildRequires: pkgconfig(libusb-1.0)
BuildRequires: pkgconfig(libuvc)
BuildRequires: pkgconfig(librsvg-2.0)
BuildRequires: pkgconfig(libswscale)
BuildRequires: pkgconfig(libva)
BuildRequires: pkgconfig(nlohmann_json)
@ -176,7 +131,10 @@ BuildRequires: pkgconfig(x264)
%endif
BuildRequires: pkgconfig(xrandr)
BuildRequires: qcoro-qt6-devel
BuildRequires: qt6-qtbase-private-devel
BuildRequires: qt6-qtdeclarative-devel
BuildRequires: qt6qml(org.kde.desktop)
BuildRequires: spirv-tools
BuildRequires: systemd-rpm-macros
Requires: android-tools
@ -188,9 +146,10 @@ Recommends: %{name}-dashboard
Provides: bundled(monado) = %{monado_version}
# no big-endian support, vulkan 32bit headers broken
# no big-endian support, vulkan 32bit headers broken, android-tools not available on ppc64le
# https://github.com/WiVRn/WiVRn/issues/271
ExcludeArch: s390x %{ix86}
# https://src.fedoraproject.org/rpms/android-tools/c/38eea7154cb5930259f7a3ae59cdb123fb7d2862?branch=rawhide
ExcludeArch: s390x %{ix86} ppc64le
%description
WiVRn wirelessly connects a standalone VR headset to a Linux computer.
@ -199,9 +158,10 @@ on the computer.
Supports a wide range of headsets such as:
Quest 1 / 2 / Pro / 3 / 3S
Meta Quest 1, 2, 3, 3S, pro
Pico Neo 4
HTC Vive Focus 3 / HTC Vive XR elite
HTC Vive Focus 3, XR Elite
Samsung Galaxy XR
and most other Android based headsets
@ -209,6 +169,7 @@ and most other Android based headsets
Summary: WiVRn dashboard
Requires: %{name}%{?_isa} = %{version}-%{release}
Requires: hicolor-icon-theme
Requires: kf6-kirigami-addons
Requires: qt6qml(org.kde.desktop)
%description -n %{name}-dashboard
@ -219,12 +180,12 @@ and to assist in pairing the headset with the server.
%prep
%forgesetup
%setup -q -n WiVRn-%{version}
# Extract libraries that are bundled
mkdir -p _deps/monado-src
tar -xvf %{SOURCE1} --strip-components 1 -C _deps/monado-src
# Apply WiVRn downstream patches
# Apply WiVRn downstream Monado patches
pushd _deps/monado-src
%patch -P0001 -p1
%patch -P0002 -p1
@ -233,12 +194,7 @@ pushd _deps/monado-src
%patch -P0005 -p1
%patch -P0006 -p1
%patch -P0007 -p1
%patch -P0009 -p1
%patch -P0010 -p1
%patch -P0011 -p1
%patch -P0012 -p1
%patch -P0013 -p1
%patch -P0014 -p1
%patch -P0008 -p1
popd
@ -251,12 +207,14 @@ popd
-DFETCHCONTENT_BASE_DIR="_deps" \
-DFETCHCONTENT_FULLY_DISCONNECTED=ON \
-DGIT_DESC=v%{version} \
-DOVR_COMPAT_SEARCH_PATH=%{_libdir}/opencomposite/runtime \
-DGIT_COMMIT=v%{version} \
-DOVR_COMPAT_SEARCH_PATH=%{_libdir}/opencomposite/runtime:%{_libdir}/xrizer/runtime:/opt/opencomposite:/opt/xrizer \
-DWIVRN_BUILD_CLIENT=OFF \
-DWIVRN_BUILD_DASHBOARD=ON \
-DWIVRN_BUILD_DISSECTOR=OFF \
-DWIVRN_BUILD_SERVER=ON \
-DWIVRN_BUILD_WIVRNCTL=ON \
-DWIVRN_FEATURE_STEAMVR_LIGHTHOUSE=ON \
-DWIVRN_USE_NVENC=ON \
-DWIVRN_USE_PIPEWIRE=ON \
-DWIVRN_USE_PULSEAUDIO=OFF \
@ -279,6 +237,10 @@ popd
install -m 0755 -vd %{buildroot}%{_sysconfdir}/ld.so.conf.d
echo "%{_libdir}/%{name}" > %{buildroot}%{_sysconfdir}/ld.so.conf.d/%{name}.conf
# Import the WiVRn OpenXR runtime into Steam's pressure-vessel container
install -m 0755 -vd %{buildroot}%{_environmentdir}
echo "PRESSURE_VESSEL_IMPORT_OPENXR_1_RUNTIMES=1" > %{buildroot}%{_environmentdir}/%{name}.conf
%find_lang %{name}-dashboard
%check
@ -289,19 +251,19 @@ appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/*.metainfo.xml
%files -f %{name}-dashboard.lang
%license COPYING LICENSE-OFL-1.1 _deps/monado-src/LICENSES/*
%doc README.md docs/
%caps(cap_sys_nice=ep) %{_bindir}/wivrn-server
%{_bindir}/wivrn-server
%{_bindir}/wivrnctl
%dir %{_libdir}/%{name}
%{_libdir}/%{name}/libopenxr_wivrn.so
%{_libdir}/%{name}/libmonado_wivrn.so
%{_libdir}/%{name}/libmonado_wivrn.so.24
%{_libdir}/%{name}/libmonado_wivrn.so.24.0.0
%{_libdir}/%{name}/libmonado_wivrn.so.25
%{_libdir}/%{name}/libmonado_wivrn.so.25.1.0
%{_datarootdir}/openxr/1/openxr_wivrn.json
%{_userunitdir}/wivrn.service
%{_userunitdir}/wivrn-application.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
%{_bindir}/wivrn-dashboard
@ -311,15 +273,12 @@ appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/*.metainfo.xml
%post
%systemd_user_post %{name}.service
%systemd_user_post %{name}-application.service
%preun
%systemd_user_preun %{name}.service
%systemd_user_preun %{name}-application.service
%postun
%systemd_user_postun %{name}.service
%systemd_user_postun %{name}-application.service
%changelog