From 6fc90b6f2ce4838460e46bd292a3392dc23707f2 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Wed, 8 Nov 2023 14:54:42 -0800 Subject: [PATCH] Open GBM main device Not yet used. --- Cargo.lock | 77 +++++++++++++++++++++++++++++++++++++++++-- Cargo.toml | 1 + src/wayland/dmabuf.rs | 27 +++++++++++++++ src/wayland/mod.rs | 3 ++ 4 files changed, 106 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6b88cd5..bc97f33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -732,6 +732,7 @@ dependencies = [ "cosmic-client-toolkit", "env_logger", "futures-channel", + "gbm", "libcosmic", "tokio", "wayland-protocols 0.31.0", @@ -984,6 +985,41 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +[[package]] +name = "drm" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fb1b703ffbc7ebd216eba7900008049a56ace55580ecb2ee7fa801e8d8be87" +dependencies = [ + "bitflags 2.4.1", + "bytemuck", + "drm-ffi", + "drm-fourcc", + "nix 0.27.1", +] + +[[package]] +name = "drm-ffi" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba7d1c19c4b6270e89d59fb27dc6d02a317c658a8a54e54781e1db9b5947595d" +dependencies = [ + "drm-sys", + "nix 0.27.1", +] + +[[package]] +name = "drm-fourcc" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aafbcdb8afc29c1a7ee5fbe53b5d62f4565b35a042a662ca9fecd0b54dae6f4" + +[[package]] +name = "drm-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a4f1c0468062a56cd5705f1e3b5409eb286d5596a2028ec8e947595d7e715ae" + [[package]] name = "either" version = "1.9.0" @@ -1376,6 +1412,30 @@ dependencies = [ "slab", ] +[[package]] +name = "gbm" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c97c1672f2d951da311cd20b148794c4157a8879c7650e65f76c7826e2b1c1" +dependencies = [ + "bitflags 1.3.2", + "drm", + "drm-fourcc", + "gbm-sys", + "libc", + "wayland-backend 0.3.2", + "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 = "generic-array" version = "0.14.7" @@ -1989,9 +2049,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "libcosmic" @@ -2344,6 +2404,17 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "libc", +] + [[package]] name = "nom" version = "7.1.3" @@ -4186,7 +4257,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" dependencies = [ "dlib", + "libc", "log", + "memoffset 0.9.0", "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index 4726228..765f9f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ calloop = "0.12.3" cctk = { package = "cosmic-client-toolkit", git = "https://github.com/pop-os/cosmic-protocols" } env_logger = "0.10.0" futures-channel = "0.3.25" +gbm = "0.13.0" libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = false, features = ["tokio", "wayland"] } tokio = "1.23.0" wayland-protocols = "0.31.0" diff --git a/src/wayland/dmabuf.rs b/src/wayland/dmabuf.rs index ed4a422..05f5bae 100644 --- a/src/wayland/dmabuf.rs +++ b/src/wayland/dmabuf.rs @@ -6,6 +6,8 @@ use cctk::{ wayland_client::{protocol::wl_buffer, Connection, QueueHandle}, }; +use std::{fs, io, os::unix::fs::MetadataExt}; + use wayland_protocols::wp::linux_dmabuf::zv1::client::{ zwp_linux_buffer_params_v1::ZwpLinuxBufferParamsV1, zwp_linux_dmabuf_feedback_v1::ZwpLinuxDmabufFeedbackV1, @@ -24,6 +26,19 @@ impl DmabufHandler for AppData { _proxy: &ZwpLinuxDmabufFeedbackV1, feedback: DmabufFeedback, ) { + if self.gbm.is_none() { + match find_gbm_device(feedback.main_device() as u64) { + Ok(Some(gbm)) => { + self.gbm = Some(gbm); + } + Ok(None) => { + eprintln!("Gbm main device '{}' not found", feedback.main_device()); + } + Err(err) => { + eprintln!("Failed to open gbm main device: {}", err); + } + } + } self.dmabuf_feedback = Some(feedback); } fn created( @@ -50,4 +65,16 @@ impl DmabufHandler for AppData { } } +fn find_gbm_device(dev: u64) -> io::Result>> { + for i in std::fs::read_dir("/dev/dri")? { + let i = i?; + if i.metadata()?.rdev() == dev { + let file = fs::File::options().read(true).write(true).open(i.path())?; + eprintln!("Opened gbm main device '{}'", i.path().display()); + return Ok(Some(gbm::Device::new(file)?)); + } + } + Ok(None) +} + sctk::delegate_dmabuf!(AppData); diff --git a/src/wayland/mod.rs b/src/wayland/mod.rs index 28f015e..45647c3 100644 --- a/src/wayland/mod.rs +++ b/src/wayland/mod.rs @@ -39,6 +39,7 @@ use futures_channel::mpsc; use std::{ cell::RefCell, collections::{HashMap, HashSet}, + fs, sync::Arc, thread, }; @@ -107,6 +108,7 @@ pub struct AppData { capture_filter: CaptureFilter, captures: RefCell>>, dmabuf_feedback: Option, + gbm: Option>, } impl AppData { @@ -247,6 +249,7 @@ fn start(conn: Connection) -> mpsc::Receiver { capture_filter: CaptureFilter::default(), captures: RefCell::new(HashMap::new()), dmabuf_feedback: None, + gbm: None, }; app_data.send_event(Event::Seats(app_data.seat_state.seats().collect()));