From fc2abfe59ce647cb92f2c0f9cd2aa1db17a49b5e Mon Sep 17 00:00:00 2001 From: Nova Date: Fri, 4 Aug 2023 21:20:32 -0400 Subject: [PATCH] feat(wayland): cleanup --- src/main.rs | 25 +++--- .../drawable/{shaders.rs => shaders/mod.rs} | 7 +- .../drawable}/shaders/shader_unlit_gamma.hlsl | 0 .../drawable}/shaders/shader_unlit_gamma.sks | Bin .../shaders/shader_unlit_simula.hlsl | 0 .../drawable}/shaders/shader_unlit_simula.sks | Bin src/wayland/mod.rs | 50 ++++++++---- src/wayland/shaders/gamma.frag | 16 ---- src/wayland/shaders/mod.rs | 13 --- src/wayland/shaders/simula.frag | 75 ------------------ src/wayland/shaders/simula.vert | 61 -------------- src/wayland/state.rs | 14 ++-- src/wayland/surface.rs | 4 +- 13 files changed, 60 insertions(+), 205 deletions(-) rename src/nodes/drawable/{shaders.rs => shaders/mod.rs} (92%) rename src/{wayland => nodes/drawable}/shaders/shader_unlit_gamma.hlsl (100%) rename src/{wayland => nodes/drawable}/shaders/shader_unlit_gamma.sks (100%) rename src/{wayland => nodes/drawable}/shaders/shader_unlit_simula.hlsl (100%) rename src/{wayland => nodes/drawable}/shaders/shader_unlit_simula.sks (100%) delete mode 100644 src/wayland/shaders/gamma.frag delete mode 100644 src/wayland/shaders/mod.rs delete mode 100644 src/wayland/shaders/simula.frag delete mode 100644 src/wayland/shaders/simula.vert diff --git a/src/main.rs b/src/main.rs index 852f4c2..6b49a74 100644 --- a/src/main.rs +++ b/src/main.rs @@ -188,7 +188,7 @@ fn main() { let _tokio_handle = event_loop_info.tokio_handle.enter(); #[cfg(feature = "wayland")] - let mut wayland = Some(wayland::Wayland::new().expect("Could not initialize wayland")); + let mut wayland = wayland::Wayland::new().expect("Could not initialize wayland"); info!("Stardust ready!"); let mut startup_child = if let Some(project_dirs) = project_dirs.as_ref() { @@ -213,12 +213,9 @@ fn main() { ); #[cfg(feature = "wayland")] { - startup_command.env("WAYLAND_DISPLAY", &wayland.as_ref().unwrap().socket_name); + startup_command.env("WAYLAND_DISPLAY", &wayland.socket_name); #[cfg(feature = "xwayland")] - startup_command.env( - "DISPLAY", - format!(":{}", wayland.as_ref().unwrap().xwayland_state.display), - ); + startup_command.env("DISPLAY", format!(":{}", wayland.xwayland_state.display)); startup_command.env("GDK_BACKEND", "wayland"); startup_command.env("QT_QPA_PLATFORM", "wayland"); startup_command.env("MOZ_ENABLE_WAYLAND", "1"); @@ -233,15 +230,14 @@ fn main() { let mut last_frame_delta = Duration::ZERO; let mut sleep_duration = Duration::ZERO; debug_span!("StereoKit").in_scope(|| { - sk.run_stateful( - &mut wayland, - move |wayland, _, sk| { + sk.run( + move |sk| { let _span = debug_span!("StereoKit step"); let _span = _span.enter(); hmd::frame(sk); #[cfg(feature = "wayland")] - wayland.as_mut().unwrap().frame_event(sk); + wayland.frame_event(sk); destroy_queue::clear(); if let Some(mouse_pointer) = &mut mouse_pointer { @@ -271,21 +267,18 @@ fn main() { ); #[cfg(feature = "wayland")] - wayland.as_mut().unwrap().update(sk); + wayland.update(sk); drawable::draw(sk); audio::update(sk); #[cfg(feature = "wayland")] - wayland.as_mut().unwrap().make_context_current(); + wayland.make_context_current(); }, - |wayland, _sk| { + |_sk| { info!("Cleanly shut down StereoKit"); if let Some(mut startup_child) = startup_child.take() { let _ = startup_child.kill(); } - - #[cfg(feature = "wayland")] - wayland.take(); }, ) }); diff --git a/src/nodes/drawable/shaders.rs b/src/nodes/drawable/shaders/mod.rs similarity index 92% rename from src/nodes/drawable/shaders.rs rename to src/nodes/drawable/shaders/mod.rs index ed0ed94..016884a 100644 --- a/src/nodes/drawable/shaders.rs +++ b/src/nodes/drawable/shaders/mod.rs @@ -1,5 +1,4 @@ #![allow(dead_code)] - use smithay::backend::renderer::gles::{ ffi::{self, Gles2, FRAGMENT_SHADER, VERTEX_SHADER}, GlesError, @@ -8,6 +7,12 @@ use std::mem::transmute; use stereokit::Shader; use tracing::error; +// Simula shader with fancy lanzcos sampling +pub const UNLIT_SHADER_BYTES: &[u8] = include_bytes!("shader_unlit_gamma.sks"); + +// Simula shader with fancy lanzcos sampling +pub const PANEL_SHADER_BYTES: &[u8] = include_bytes!("shader_unlit_simula.sks"); + struct FfiAssetHeader { asset_type: i32, asset_state: i32, diff --git a/src/wayland/shaders/shader_unlit_gamma.hlsl b/src/nodes/drawable/shaders/shader_unlit_gamma.hlsl similarity index 100% rename from src/wayland/shaders/shader_unlit_gamma.hlsl rename to src/nodes/drawable/shaders/shader_unlit_gamma.hlsl diff --git a/src/wayland/shaders/shader_unlit_gamma.sks b/src/nodes/drawable/shaders/shader_unlit_gamma.sks similarity index 100% rename from src/wayland/shaders/shader_unlit_gamma.sks rename to src/nodes/drawable/shaders/shader_unlit_gamma.sks diff --git a/src/wayland/shaders/shader_unlit_simula.hlsl b/src/nodes/drawable/shaders/shader_unlit_simula.hlsl similarity index 100% rename from src/wayland/shaders/shader_unlit_simula.hlsl rename to src/nodes/drawable/shaders/shader_unlit_simula.hlsl diff --git a/src/wayland/shaders/shader_unlit_simula.sks b/src/nodes/drawable/shaders/shader_unlit_simula.sks similarity index 100% rename from src/wayland/shaders/shader_unlit_simula.sks rename to src/nodes/drawable/shaders/shader_unlit_simula.sks diff --git a/src/wayland/mod.rs b/src/wayland/mod.rs index 61440f2..68ef0c7 100644 --- a/src/wayland/mod.rs +++ b/src/wayland/mod.rs @@ -2,7 +2,6 @@ mod compositor; mod data_device; mod decoration; mod seat; -mod shaders; mod state; mod surface; // mod xdg_activation; @@ -22,7 +21,11 @@ use smithay::backend::allocator::dmabuf::Dmabuf; use smithay::backend::egl::EGLContext; use smithay::backend::renderer::gles::GlesRenderer; use smithay::backend::renderer::ImportDma; +use smithay::reexports::wayland_server::backend::ClientId; +use smithay::reexports::wayland_server::DisplayHandle; use smithay::reexports::wayland_server::{backend::GlobalId, Display, ListeningSocket}; +use std::mem::ManuallyDrop; +use std::os::fd::OwnedFd; use std::os::unix::prelude::AsRawFd; use std::{ ffi::c_void, @@ -62,15 +65,33 @@ fn get_sk_egl() -> Result { static GLOBAL_DESTROY_QUEUE: OnceCell> = OnceCell::new(); +pub struct DisplayWrapper(Mutex>, DisplayHandle); +impl DisplayWrapper { + pub fn handle(&self) -> DisplayHandle { + self.1.clone() + } + pub fn dispatch_clients(&self, state: &mut WaylandState) -> Result { + self.0.lock().dispatch_clients(state) + } + pub fn flush_clients(&self, client: Option) { + if let Some(mut lock) = self.0.try_lock() { + let _ = lock.backend().flush(client); + } + } + pub fn poll_fd(&self) -> Result { + self.0.lock().backend().poll_fd().try_clone_to_owned() + } +} + pub struct Wayland { - display: Arc>>, + display: Arc, pub socket_name: String, join_handle: JoinHandle>, renderer: GlesRenderer, dmabuf_rx: UnboundedReceiver, wayland_state: Arc>, #[cfg(feature = "xwayland")] - pub xwayland_state: xwayland::XWaylandState, + pub xwayland_state: ManuallyDrop, } impl Wayland { pub fn new() -> Result { @@ -87,11 +108,10 @@ impl Wayland { let display_handle = display.handle(); let (dmabuf_tx, dmabuf_rx) = mpsc::unbounded_channel(); - let display = Arc::new(Mutex::new(display)); + let display = Arc::new(DisplayWrapper(Mutex::new(display), display_handle.clone())); #[cfg(feature = "xwayland")] - let xwayland_state = xwayland::XWaylandState::create(&display_handle).unwrap(); - let wayland_state = - WaylandState::new(display.clone(), display_handle, &renderer, dmabuf_tx); + let xwayland_state = ManuallyDrop::new(xwayland::XWaylandState::create(&display_handle)?); + let wayland_state = WaylandState::new(display_handle, &renderer, dmabuf_tx); let (global_destroy_queue_in, global_destroy_queue) = mpsc::channel(8); GLOBAL_DESTROY_QUEUE.set(global_destroy_queue_in).unwrap(); @@ -123,7 +143,7 @@ impl Wayland { } fn start_loop( - display: Arc>>, + display: Arc, socket: ListeningSocket, state: Arc>, mut global_destroy_queue: mpsc::Receiver, @@ -131,10 +151,10 @@ impl Wayland { let listen_async = AsyncUnixListener::from_std(unsafe { UnixListener::from_raw_fd(socket.as_raw_fd()) })?; - let dispatch_poll_fd = display.lock().backend().poll_fd().try_clone_to_owned()?; + let dispatch_poll_fd = display.poll_fd()?; let dispatch_poll_listener = AsyncFd::new(dispatch_poll_fd)?; - let dh1 = display.lock().handle(); + let dh1 = display.handle(); let mut dh2 = dh1.clone(); Ok(task::new(|| "wayland loop", async move { @@ -148,6 +168,7 @@ impl Wayland { acc = listen_async.accept() => { // New client connected let (stream, _) = acc?; let client_state = Arc::new(ClientState { + id: OnceCell::new(), compositor_state: Default::default(), display: Arc::downgrade(&display), seat: SeatData::new(&dh1) @@ -158,9 +179,8 @@ impl Wayland { e = dispatch_poll_listener.readable() => { // Dispatch let mut guard = e?; debug_span!("Dispatch wayland event").in_scope(|| -> Result<(), color_eyre::Report> { - let mut display = display.lock(); display.dispatch_clients(&mut *state.lock())?; - display.flush_clients()?; + display.flush_clients(None); Ok(()) })?; guard.clear_ready(); @@ -179,14 +199,14 @@ impl Wayland { core_surface.process(sk, &mut self.renderer); } - self.display.lock().flush_clients().unwrap(); + self.display.flush_clients(None); } pub fn frame_event(&self, sk: &impl StereoKitDraw) { - let state = self.wayland_state.lock(); + let output = self.wayland_state.lock().output.clone(); for core_surface in CORE_SURFACES.get_valid_contents() { - core_surface.frame(sk, state.output.clone()); + core_surface.frame(sk, output.clone()); } } diff --git a/src/wayland/shaders/gamma.frag b/src/wayland/shaders/gamma.frag deleted file mode 100644 index 0752cbb..0000000 --- a/src/wayland/shaders/gamma.frag +++ /dev/null @@ -1,16 +0,0 @@ -#version 320 es -precision mediump float; -precision highp int; - -layout(binding = 0) uniform highp sampler2D diffuse; - -layout(location = 0) in highp vec2 fs_uv; -layout(location = 0) out highp vec4 _entryPointOutput; - -void main() -{ - highp vec4 _101 = texture(diffuse, fs_uv); - highp vec3 _104 = pow(_101.xyz, vec3(2.2000000476837158203125)); - _entryPointOutput = vec4(_104.x, _104.y, _104.z, _101.w); -} - diff --git a/src/wayland/shaders/mod.rs b/src/wayland/shaders/mod.rs deleted file mode 100644 index c199917..0000000 --- a/src/wayland/shaders/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -#![allow(dead_code)] - -// Basic gamma correction shader -// pub const PANEL_SHADER_BYTES: &[u8] = include_bytes!("shader_unlit_gamma.sks"); - -// Simula shader with fancy lanzcos sampling -pub const PANEL_SHADER_BYTES: &[u8] = include_bytes!("shader_unlit_simula.sks"); - -// Simula text shader (fragment) -// pub const SIMULA_FRAG_STR: &str = include_str!("simula.frag"); - -// Simula text shader (vertex) -// pub const SIMULA_VERT_STR: &str = include_str!("simula.vert"); diff --git a/src/wayland/shaders/simula.frag b/src/wayland/shaders/simula.frag deleted file mode 100644 index c0b310f..0000000 --- a/src/wayland/shaders/simula.frag +++ /dev/null @@ -1,75 +0,0 @@ -#version 320 es -#extension GL_OES_EGL_image_external : require -precision mediump float; -precision highp int; - -layout(binding = 0, std140) uniform _Global -{ - highp vec4 diffuse_i; - highp vec2 uv_scale; - highp vec2 uv_offset; - highp float fcFactor; - highp float ripple; - highp float alpha_min; - highp float alpha_max; -} uniforms; - -layout(binding = 0) uniform highp samplerExternalOES diffuse; - -layout(location = 0) in highp vec2 fs_uv; -layout(location = 0) out highp vec4 fragColor; - -void main() -{ - highp vec2 dx_uv = dFdx(fs_uv); - highp vec2 dy_uv = dFdy(fs_uv); - highp vec2 width = fs_uv * uniforms.diffuse_i.xy; - ivec2 _475 = ivec2(width); - highp vec2 _477 = clamp(floor(abs(vec2(dx_uv.x, dy_uv.y)) * uniforms.diffuse_i.xy), vec2(1.0), vec2(2.0)); - ivec2 _480 = ivec2(_477); - ivec2 _481 = _475 - _480; - ivec2 _485 = _475 + _480; - int _487 = _481.y; - highp vec4 _671; - highp float _672; - _672 = 0.0; - _671 = vec4(0.0); - highp vec4 _679; - highp float _681; - for (int _670 = _487; _670 <= _485.y; _672 = _681, _671 = _679, _670++) - { - int _496 = _481.x; - _681 = _672; - _679 = _671; - highp vec4 _553; - highp float _556; - for (int _673 = _496; _673 <= _485.x; _681 = _556, _679 = _553, _673++) - { - highp float _509 = float(_673); - highp float _514 = (uniforms.fcFactor * (width.x - _509)) / _477.x; - highp float _520 = float(_670); - highp float _525 = (uniforms.fcFactor * (width.y - _520)) / _477.y; - highp float _533 = sqrt((_514 * _514) + (_525 * _525)); - highp float _675; - do - { - if (_533 > 1.0) - { - _675 = 0.0; - break; - } - highp float _592 = pow(uniforms.ripple * sqrt(1.0 - (_533 * _533)), 2.0); - _675 = 1.0 + (_592 * (0.25 + (_592 * (0.015625 + (_592 * (0.00043402801384218037128448486328125 + (_592 * (6.7816799855791032314300537109375e-06 + (_592 * (6.7816799287356843706220388412476e-08 + (_592 * (4.709500012189948847662890329957e-10 + (_592 * (2.4028099388645474121517509047408e-12 + (_592 * (9.3859703944590075486154034933861e-15 + (_592 * (2.8968999943407451927966655969016e-17 + (7.242260299760125752555485045131e-20 * _592))))))))))))))))))); - break; - } while(false); - _553 = _679 + (texture2D(diffuse, (vec2(_509, _520) + vec2(0.5)) / uniforms.diffuse_i.xy) * _675); - _556 = _681 + _675; - } - } - highp vec4 _568 = _671 / vec4(_672); - highp vec3 _417 = pow(_568.xyz, vec3(2.2000000476837158203125)); - highp vec4 _669 = vec4(_417.x, _417.y, _417.z, _568.w); - _669.w = uniforms.alpha_min + (_568.w * (uniforms.alpha_max - uniforms.alpha_min)); - fragColor = _669; -} - diff --git a/src/wayland/shaders/simula.vert b/src/wayland/shaders/simula.vert deleted file mode 100644 index ac8602c..0000000 --- a/src/wayland/shaders/simula.vert +++ /dev/null @@ -1,61 +0,0 @@ -#version 320 es -// #ifdef GL_AMD_vertex_shader_layer -// #extension GL_AMD_vertex_shader_layer : enable -// #elif defined(GL_NV_viewport_array2) -// #extension GL_NV_viewport_array2 : enable -// #else -// #define gl_Layer int _dummy_gl_layer_var -// #endif - -struct Inst -{ - mat4 world; - vec4 color; -}; - -layout(binding = 1, std140) uniform StereoKitBuffer -{ - layout(row_major) mat4 sk_view[2]; - layout(row_major) mat4 sk_proj[2]; - layout(row_major) mat4 sk_proj_inv[2]; - layout(row_major) mat4 sk_viewproj[2]; - vec4 sk_lighting_sh[9]; - vec4 sk_camera_pos[2]; - vec4 sk_camera_dir[2]; - vec4 sk_fingertip[2]; - vec4 sk_cubemap_i; - float sk_time; - uint sk_view_count; -} _38; - -layout(binding = 2, std140) uniform TransformBuffer -{ - layout(row_major) Inst sk_inst[819]; -} _56; - -layout(binding = 0, std140) uniform _Global -{ - vec4 diffuse_i; - vec2 uv_scale; - vec2 uv_offset; - float fcFactor; - float ripple; - float alpha_min; - float alpha_max; -} _91; - -layout(location = 0) in vec4 input_pos; -layout(location = 1) in vec3 input_norm; -layout(location = 2) in vec2 input_uv; -layout(location = 0) out vec2 fs_uv; - -mat4 spvWorkaroundRowMajor(mat4 wrap) { return wrap; } - -void main() -{ - uint _155 = uint(gl_InstanceID) % _38.sk_view_count; - gl_Position = spvWorkaroundRowMajor(_38.sk_viewproj[_155]) * vec4((spvWorkaroundRowMajor(_56.sk_inst[uint(gl_InstanceID) / _38.sk_view_count].world) * vec4(input_pos.xyz, 1.0)).xyz, 1.0); - fs_uv = (input_uv + _91.uv_offset) * _91.uv_scale; - // gl_Layer = int(_155); -} - diff --git a/src/wayland/state.rs b/src/wayland/state.rs index ab73ca7..b78b51a 100644 --- a/src/wayland/state.rs +++ b/src/wayland/state.rs @@ -1,4 +1,5 @@ use crate::wayland::seat::SeatData; +use once_cell::sync::OnceCell; use parking_lot::Mutex; use smithay::{ backend::{ @@ -17,7 +18,7 @@ use smithay::{ wayland_server::{ backend::{ClientData, ClientId, DisconnectReason}, protocol::{wl_buffer::WlBuffer, wl_data_device_manager::WlDataDeviceManager}, - Display, DisplayHandle, + DisplayHandle, }, }, utils::{Size, Transform}, @@ -36,20 +37,24 @@ use std::sync::{Arc, Weak}; use tokio::sync::mpsc::UnboundedSender; use tracing::{info, warn}; +use super::DisplayWrapper; + pub struct ClientState { + pub id: OnceCell, pub compositor_state: CompositorClientState, - pub display: Weak>>, + pub display: Weak, pub seat: Arc, } impl ClientState { pub fn flush(&self) { let Some(display) = self.display.upgrade() else {return}; - let _ = display.lock().flush_clients(); + let _ = display.flush_clients(self.id.get().cloned()); } } impl ClientData for ClientState { fn initialized(&self, client_id: ClientId) { info!("Wayland client {:?} connected", client_id); + let _ = self.id.set(client_id); } fn disconnected(&self, client_id: ClientId, reason: DisconnectReason) { @@ -62,7 +67,6 @@ impl ClientData for ClientState { pub struct WaylandState { pub weak_ref: Weak>, - pub display: Arc>>, pub display_handle: DisplayHandle, pub compositor_state: CompositorState, @@ -76,7 +80,6 @@ pub struct WaylandState { impl WaylandState { pub fn new( - display: Arc>>, display_handle: DisplayHandle, renderer: &GlesRenderer, dmabuf_tx: UnboundedSender, @@ -154,7 +157,6 @@ impl WaylandState { Arc::new_cyclic(|weak| { Mutex::new(WaylandState { weak_ref: weak.clone(), - display, display_handle, compositor_state, diff --git a/src/wayland/surface.rs b/src/wayland/surface.rs index 2ee0b55..f62e706 100644 --- a/src/wayland/surface.rs +++ b/src/wayland/surface.rs @@ -1,7 +1,7 @@ -use super::{shaders::PANEL_SHADER_BYTES, state::WaylandState}; +use super::state::WaylandState; use crate::{ core::{delta::Delta, destroy_queue, registry::Registry}, - nodes::drawable::model::ModelPart, + nodes::drawable::{model::ModelPart, shaders::PANEL_SHADER_BYTES}, }; use mint::Vector2; use once_cell::sync::OnceCell;