From ab3f873a387820701c9662c8ed8a4aa68a076503 Mon Sep 17 00:00:00 2001 From: Torge Matthies Date: Wed, 25 Feb 2026 22:31:11 +0100 Subject: [PATCH] fix grid opacity not updating live --- wayvr/src/backend/openxr/helpers.rs | 12 ++++++++ wayvr/src/backend/openxr/overlay.rs | 16 +++------- wayvr/src/backend/openxr/skybox.rs | 48 +++++++++++++++++++++++------ wayvr/src/shaders/grid.frag | 7 +---- 4 files changed, 55 insertions(+), 28 deletions(-) diff --git a/wayvr/src/backend/openxr/helpers.rs b/wayvr/src/backend/openxr/helpers.rs index 722e25c8..6424fdf0 100644 --- a/wayvr/src/backend/openxr/helpers.rs +++ b/wayvr/src/backend/openxr/helpers.rs @@ -3,6 +3,18 @@ use glam::{Affine3A, Quat, Vec3, Vec3A}; use openxr::{self as xr, SessionCreateFlags, Version, sys::Handle}; use xr::OverlaySessionCreateFlagsEXTX; +macro_rules! next_chain_insert { + ($layer:expr, $payload:expr) => {{ + let payload_ptr = $payload as *mut _ as *mut xr::sys::BaseInStructure; + let new_elem = payload_ptr.as_mut().unwrap(); + let mut raw = $layer.into_raw(); + new_elem.next = raw.next as _; + raw.next = payload_ptr as *const _; + raw + }}; +} +pub(crate) use next_chain_insert; + pub(super) fn init_xr() -> Result<(xr::Instance, xr::SystemId), anyhow::Error> { let entry = xr::Entry::linked(); diff --git a/wayvr/src/backend/openxr/overlay.rs b/wayvr/src/backend/openxr/overlay.rs index ff02dad9..b4404e86 100644 --- a/wayvr/src/backend/openxr/overlay.rs +++ b/wayvr/src/backend/openxr/overlay.rs @@ -6,7 +6,10 @@ use xr::EyeVisibility; use super::{CompositionLayer, XrState, helpers, swapchain::WlxSwapchain}; use crate::{ - backend::openxr::swapchain::{SwapchainOpts, WlxSwapchainImage, create_swapchain}, + backend::openxr::{ + helpers::next_chain_insert, + swapchain::{SwapchainOpts, WlxSwapchainImage, create_swapchain}, + }, state::AppState, windowing::window::OverlayWindowData, }; @@ -20,17 +23,6 @@ pub struct OpenXrOverlayData { color_bias_khr: Option>, } -macro_rules! next_chain_insert { - ($layer:expr, $payload:expr) => {{ - let payload_ptr = $payload.as_mut() as *mut _ as *mut xr::sys::BaseInStructure; - let new_elem = payload_ptr.as_mut().unwrap(); - let mut raw = $layer.into_raw(); - new_elem.next = raw.next as _; - raw.next = payload_ptr as *const _; - raw - }}; -} - impl OverlayWindowData { pub(super) fn ensure_swapchain_acquire<'a>( &'a mut self, diff --git a/wayvr/src/backend/openxr/skybox.rs b/wayvr/src/backend/openxr/skybox.rs index b7f24131..21435cf1 100644 --- a/wayvr/src/backend/openxr/skybox.rs +++ b/wayvr/src/backend/openxr/skybox.rs @@ -14,7 +14,10 @@ use wgui::gfx::{cmd::WGfxClearMode, pipeline::WPipelineCreateInfo}; use wlx_common::config_io; use crate::{ - backend::openxr::{helpers::translation_rotation_to_posef, swapchain::SwapchainOpts}, + backend::openxr::{ + helpers::{next_chain_insert, translation_rotation_to_posef}, + swapchain::SwapchainOpts, + }, graphics::{ExtentExt, GpuFutures, dds::WlxCommandBufferDds}, state::AppState, }; @@ -28,10 +31,11 @@ pub(super) struct Skybox { view: Arc, sky: Option, grid: Option, + grid_color_scale_bias_khr: Option, } impl Skybox { - pub fn new(app: &AppState) -> anyhow::Result { + pub fn new(xr: &XrState, app: &AppState) -> anyhow::Result { let mut command_buffer = app .gfx .create_xfer_command_buffer(CommandBufferUsage::OneTimeSubmit)?; @@ -74,10 +78,27 @@ impl Skybox { let view = ImageView::new_default(maybe_image.unwrap())?; // safe unwrap + let grid_color_scale_bias_khr = xr + .instance + .exts() + .khr_composition_layer_color_scale_bias + .map(|_| xr::sys::CompositionLayerColorScaleBiasKHR { + ty: xr::StructureType::COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR, + next: std::ptr::null(), + color_bias: Default::default(), + color_scale: xr::Color4f { + r: 1.0, + g: 1.0, + b: 1.0, + a: 1.0, + }, + }); + Ok(Self { view, sky: None, grid: None, + grid_color_scale_bias_khr: grid_color_scale_bias_khr, }) } @@ -161,17 +182,13 @@ impl Skybox { .into_iter() .next() .unwrap(); - let set0 = pipeline.uniform_buffer_upload( - 0, - vec![app.session.config.grid_opacity * app.session.config.grid_opacity], - )?; let pass = pipeline.create_pass( tgt.extent_f32(), [0.0, 0.0], app.gfx_extras.quad_verts.clone(), 0..4, 0..1, - vec![set0], + vec![], &Default::default(), )?; @@ -236,8 +253,10 @@ impl Skybox { .lower_vertical_angle(LO_VERT_ANGLE); self.grid.as_mut().unwrap().ensure_image_released()?; - let grid = xr::CompositionLayerQuad::new() - .layer_flags(xr::CompositionLayerFlags::BLEND_TEXTURE_SOURCE_ALPHA) + let flags = xr::CompositionLayerFlags::BLEND_TEXTURE_SOURCE_ALPHA + | xr::CompositionLayerFlags::UNPREMULTIPLIED_ALPHA; + let mut grid = xr::CompositionLayerQuad::new() + .layer_flags(flags) .pose(*GRID_POSE) .size(xr::Extent2Df { width: 10.0, @@ -247,6 +266,15 @@ impl Skybox { .eye_visibility(xr::EyeVisibility::BOTH) .space(&xr.stage); + if let Some(grid_color_scale_bias_khr) = self.grid_color_scale_bias_khr.as_mut() { + let grid_opacity = app.session.config.grid_opacity; + grid_color_scale_bias_khr.color_scale.a = grid_opacity * grid_opacity; + unsafe { + let raw = next_chain_insert!(grid, grid_color_scale_bias_khr); + grid = xr::CompositionLayerQuad::from_raw(raw); + } + } + Ok(vec![ CompositionLayer::Equirect2(sky), CompositionLayer::Quad(grid), @@ -258,5 +286,5 @@ pub(super) fn create_skybox(xr: &XrState, app: &AppState) -> Option { xr.instance .exts() .khr_composition_layer_equirect2 - .and_then(|_| Skybox::new(app).ok()) + .and_then(|_| Skybox::new(xr, app).ok()) } diff --git a/wayvr/src/shaders/grid.frag b/wayvr/src/shaders/grid.frag index 9daa2fc0..467aec41 100644 --- a/wayvr/src/shaders/grid.frag +++ b/wayvr/src/shaders/grid.frag @@ -4,10 +4,6 @@ precision highp float; layout (location = 0) in vec2 in_uv; layout (location = 0) out vec4 out_color; -layout (set = 0, binding = 0) uniform OpacityBlock { - uniform float opacity; -}; - void main() { float fade = max(1.0 - 2.0 * length(in_uv.xy + vec2(-0.5, -0.5)), 0.0); @@ -18,6 +14,5 @@ void main() } else { grid = 0.0; } - out_color = vec4(1.0, 1.0, 1.0, grid * fade * opacity); + out_color = vec4(1.0, 1.0, 1.0, grid * fade); } -