From 199e6f70b3e90fccb5812059a72d07b17c00ee2b Mon Sep 17 00:00:00 2001 From: Nova Date: Tue, 27 Jun 2023 05:53:45 -0400 Subject: [PATCH] refactor: use dmabuf v4 instead of bind_display --- Cargo.lock | 31 ++---------------------- Cargo.toml | 3 +-- src/wayland/mod.rs | 3 +-- src/wayland/state.rs | 57 +++++++++++++++++++++++++++++++++++--------- 4 files changed, 50 insertions(+), 44 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2f94a36..527fb7e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -808,30 +808,6 @@ dependencies = [ "pin-utils", ] -[[package]] -name = "gbm" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ec389cda876966cf824111bf6e533fb934c711d473498279964a990853b3c6" -dependencies = [ - "bitflags 1.3.2", - "drm", - "drm-fourcc", - "gbm-sys", - "libc", - "wayland-backend", - "wayland-server", -] - -[[package]] -name = "gbm-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63eba9b9b7a231514482deb08759301c9f9f049ac6869403f381834ebfeaf67" -dependencies = [ - "libc", -] - [[package]] name = "getrandom" version = "0.2.10" @@ -1991,8 +1967,9 @@ dependencies = [ "calloop", "cgmath", "downcast-rs", + "drm", + "drm-ffi", "drm-fourcc", - "gbm", "gl_generator", "indexmap 1.9.3", "lazy_static", @@ -2005,12 +1982,10 @@ dependencies = [ "tempfile", "thiserror", "tracing", - "wayland-backend", "wayland-protocols", "wayland-protocols-misc", "wayland-protocols-wlr", "wayland-server", - "wayland-sys", "xkbcommon", ] @@ -2629,9 +2604,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96b2a02ac608e07132978689a6f9bf4214949c85998c247abadd4f4129b1aa06" dependencies = [ "dlib", - "libc", "log", - "memoffset 0.7.1", "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index 5891dd7..0479def 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -72,9 +72,8 @@ git = "https://github.com/smithay/smithay.git" # Until we get stereokit to under default-features = false features = [ "desktop", - "backend_egl", + "backend_drm", "renderer_gl", - "use_system_lib", "wayland_frontend", ] version = "*" diff --git a/src/wayland/mod.rs b/src/wayland/mod.rs index b29388b..06543a7 100644 --- a/src/wayland/mod.rs +++ b/src/wayland/mod.rs @@ -19,7 +19,7 @@ use sk::StereoKitDraw; use smithay::backend::allocator::dmabuf::Dmabuf; use smithay::backend::egl::EGLContext; use smithay::backend::renderer::gles::GlesRenderer; -use smithay::backend::renderer::{ImportDma, ImportEgl}; +use smithay::backend::renderer::ImportDma; use smithay::reexports::wayland_server::{backend::GlobalId, Display, ListeningSocket}; use std::os::unix::prelude::AsRawFd; use std::{ @@ -82,7 +82,6 @@ impl Wayland { let display: Display = Display::new()?; let display_handle = display.handle(); - renderer.bind_wl_display(&display_handle)?; let (dmabuf_tx, dmabuf_rx) = mpsc::unbounded_channel(); let display = Arc::new(Mutex::new(display)); diff --git a/src/wayland/state.rs b/src/wayland/state.rs index a9dcd3c..75ba131 100644 --- a/src/wayland/state.rs +++ b/src/wayland/state.rs @@ -4,6 +4,7 @@ use rustc_hash::FxHashMap; use smithay::{ backend::{ allocator::dmabuf::Dmabuf, + egl::EGLDevice, renderer::{gles::GlesRenderer, ImportDma}, }, delegate_dmabuf, delegate_output, delegate_shm, @@ -24,14 +25,17 @@ use smithay::{ wayland::{ buffer::BufferHandler, compositor::{CompositorClientState, CompositorState}, - dmabuf::{self, DmabufGlobal, DmabufHandler, DmabufState, ImportError}, + dmabuf::{ + self, DmabufFeedback, DmabufFeedbackBuilder, DmabufGlobal, DmabufHandler, DmabufState, + ImportError, + }, shell::kde::decoration::KdeDecorationState, shm::{ShmHandler, ShmState}, }, }; use std::sync::{Arc, Weak}; use tokio::sync::mpsc::UnboundedSender; -use tracing::info; +use tracing::{info, warn}; #[derive(Default)] pub struct ClientState { @@ -59,8 +63,7 @@ pub struct WaylandState { // pub xdg_activation_state: XdgActivationState, pub kde_decoration_state: KdeDecorationState, pub shm_state: ShmState, - dmabuf_state: DmabufState, - _dmabuf_global: DmabufGlobal, + dmabuf_state: (DmabufState, DmabufGlobal, Option), dmabuf_tx: UnboundedSender, pub output: Output, pub seats: FxHashMap>, @@ -78,11 +81,44 @@ impl WaylandState { let kde_decoration_state = KdeDecorationState::new::(&display_handle, DecorationMode::Server); let shm_state = ShmState::new::(&display_handle, vec![]); - let mut dmabuf_state = DmabufState::new(); - let dmabuf_global = dmabuf_state.create_global::( - &display_handle, - renderer.dmabuf_formats().collect::>(), - ); + let render_node = EGLDevice::device_for_display(renderer.egl_context().display()) + .and_then(|device| device.try_get_render_node()); + + let dmabuf_default_feedback = match render_node { + Ok(Some(node)) => { + let dmabuf_formats = renderer.dmabuf_formats().collect::>(); + let dmabuf_default_feedback = + DmabufFeedbackBuilder::new(node.dev_id(), dmabuf_formats) + .build() + .unwrap(); + Some(dmabuf_default_feedback) + } + Ok(None) => { + warn!("failed to query render node, dmabuf will use v3"); + None + } + Err(err) => { + warn!(?err, "failed to egl device for display, dmabuf will use v3"); + None + } + }; + // if we failed to build dmabuf feedback we fall back to dmabuf v3 + // Note: egl on Mesa requires either v4 or wl_drm (initialized with bind_wl_display) + let dmabuf_state = if let Some(default_feedback) = dmabuf_default_feedback { + let mut dmabuf_state = DmabufState::new(); + let dmabuf_global = dmabuf_state.create_global_with_default_feedback::( + &display_handle, + &default_feedback, + ); + (dmabuf_state, dmabuf_global, Some(default_feedback)) + } else { + let dmabuf_formats = renderer.dmabuf_formats().collect::>(); + let mut dmabuf_state = DmabufState::new(); + let dmabuf_global = + dmabuf_state.create_global::(&display_handle, dmabuf_formats); + (dmabuf_state, dmabuf_global, None) + }; + let output = Output::new( "1x".to_owned(), smithay::output::PhysicalProperties { @@ -121,7 +157,6 @@ impl WaylandState { kde_decoration_state, shm_state, dmabuf_state, - _dmabuf_global: dmabuf_global, dmabuf_tx, output, seats: FxHashMap::default(), @@ -149,7 +184,7 @@ impl ShmHandler for WaylandState { } impl DmabufHandler for WaylandState { fn dmabuf_state(&mut self) -> &mut DmabufState { - &mut self.dmabuf_state + &mut self.dmabuf_state.0 } fn dmabuf_imported(