feat(wayland): cleanup
This commit is contained in:
25
src/main.rs
25
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();
|
||||
},
|
||||
)
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
@@ -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<EGLRawHandles> {
|
||||
|
||||
static GLOBAL_DESTROY_QUEUE: OnceCell<mpsc::Sender<GlobalId>> = OnceCell::new();
|
||||
|
||||
pub struct DisplayWrapper(Mutex<Display<WaylandState>>, DisplayHandle);
|
||||
impl DisplayWrapper {
|
||||
pub fn handle(&self) -> DisplayHandle {
|
||||
self.1.clone()
|
||||
}
|
||||
pub fn dispatch_clients(&self, state: &mut WaylandState) -> Result<usize, std::io::Error> {
|
||||
self.0.lock().dispatch_clients(state)
|
||||
}
|
||||
pub fn flush_clients(&self, client: Option<ClientId>) {
|
||||
if let Some(mut lock) = self.0.try_lock() {
|
||||
let _ = lock.backend().flush(client);
|
||||
}
|
||||
}
|
||||
pub fn poll_fd(&self) -> Result<OwnedFd, std::io::Error> {
|
||||
self.0.lock().backend().poll_fd().try_clone_to_owned()
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Wayland {
|
||||
display: Arc<Mutex<Display<WaylandState>>>,
|
||||
display: Arc<DisplayWrapper>,
|
||||
pub socket_name: String,
|
||||
join_handle: JoinHandle<Result<()>>,
|
||||
renderer: GlesRenderer,
|
||||
dmabuf_rx: UnboundedReceiver<Dmabuf>,
|
||||
wayland_state: Arc<Mutex<WaylandState>>,
|
||||
#[cfg(feature = "xwayland")]
|
||||
pub xwayland_state: xwayland::XWaylandState,
|
||||
pub xwayland_state: ManuallyDrop<xwayland::XWaylandState>,
|
||||
}
|
||||
impl Wayland {
|
||||
pub fn new() -> Result<Self> {
|
||||
@@ -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<Mutex<Display<WaylandState>>>,
|
||||
display: Arc<DisplayWrapper>,
|
||||
socket: ListeningSocket,
|
||||
state: Arc<Mutex<WaylandState>>,
|
||||
mut global_destroy_queue: mpsc::Receiver<GlobalId>,
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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<ClientId>,
|
||||
pub compositor_state: CompositorClientState,
|
||||
pub display: Weak<Mutex<Display<WaylandState>>>,
|
||||
pub display: Weak<DisplayWrapper>,
|
||||
pub seat: Arc<SeatData>,
|
||||
}
|
||||
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<Mutex<WaylandState>>,
|
||||
pub display: Arc<Mutex<Display<WaylandState>>>,
|
||||
pub display_handle: DisplayHandle,
|
||||
|
||||
pub compositor_state: CompositorState,
|
||||
@@ -76,7 +80,6 @@ pub struct WaylandState {
|
||||
|
||||
impl WaylandState {
|
||||
pub fn new(
|
||||
display: Arc<Mutex<Display<WaylandState>>>,
|
||||
display_handle: DisplayHandle,
|
||||
renderer: &GlesRenderer,
|
||||
dmabuf_tx: UnboundedSender<Dmabuf>,
|
||||
@@ -154,7 +157,6 @@ impl WaylandState {
|
||||
Arc::new_cyclic(|weak| {
|
||||
Mutex::new(WaylandState {
|
||||
weak_ref: weak.clone(),
|
||||
display,
|
||||
display_handle,
|
||||
|
||||
compositor_state,
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user