Open GBM main device
Not yet used.
This commit is contained in:
parent
9a822bd76d
commit
6fc90b6f2c
4 changed files with 106 additions and 2 deletions
77
Cargo.lock
generated
77
Cargo.lock
generated
|
|
@ -732,6 +732,7 @@ dependencies = [
|
||||||
"cosmic-client-toolkit",
|
"cosmic-client-toolkit",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
|
"gbm",
|
||||||
"libcosmic",
|
"libcosmic",
|
||||||
"tokio",
|
"tokio",
|
||||||
"wayland-protocols 0.31.0",
|
"wayland-protocols 0.31.0",
|
||||||
|
|
@ -984,6 +985,41 @@ version = "1.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
|
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]]
|
[[package]]
|
||||||
name = "either"
|
name = "either"
|
||||||
version = "1.9.0"
|
version = "1.9.0"
|
||||||
|
|
@ -1376,6 +1412,30 @@ dependencies = [
|
||||||
"slab",
|
"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]]
|
[[package]]
|
||||||
name = "generic-array"
|
name = "generic-array"
|
||||||
version = "0.14.7"
|
version = "0.14.7"
|
||||||
|
|
@ -1989,9 +2049,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.149"
|
version = "0.2.150"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
|
checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libcosmic"
|
name = "libcosmic"
|
||||||
|
|
@ -2344,6 +2404,17 @@ dependencies = [
|
||||||
"pin-utils",
|
"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]]
|
[[package]]
|
||||||
name = "nom"
|
name = "nom"
|
||||||
version = "7.1.3"
|
version = "7.1.3"
|
||||||
|
|
@ -4186,7 +4257,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af"
|
checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dlib",
|
"dlib",
|
||||||
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
|
"memoffset 0.9.0",
|
||||||
"pkg-config",
|
"pkg-config",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ calloop = "0.12.3"
|
||||||
cctk = { package = "cosmic-client-toolkit", git = "https://github.com/pop-os/cosmic-protocols" }
|
cctk = { package = "cosmic-client-toolkit", git = "https://github.com/pop-os/cosmic-protocols" }
|
||||||
env_logger = "0.10.0"
|
env_logger = "0.10.0"
|
||||||
futures-channel = "0.3.25"
|
futures-channel = "0.3.25"
|
||||||
|
gbm = "0.13.0"
|
||||||
libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = false, features = ["tokio", "wayland"] }
|
libcosmic = { git = "https://github.com/pop-os/libcosmic", default-features = false, features = ["tokio", "wayland"] }
|
||||||
tokio = "1.23.0"
|
tokio = "1.23.0"
|
||||||
wayland-protocols = "0.31.0"
|
wayland-protocols = "0.31.0"
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,8 @@ use cctk::{
|
||||||
wayland_client::{protocol::wl_buffer, Connection, QueueHandle},
|
wayland_client::{protocol::wl_buffer, Connection, QueueHandle},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use std::{fs, io, os::unix::fs::MetadataExt};
|
||||||
|
|
||||||
use wayland_protocols::wp::linux_dmabuf::zv1::client::{
|
use wayland_protocols::wp::linux_dmabuf::zv1::client::{
|
||||||
zwp_linux_buffer_params_v1::ZwpLinuxBufferParamsV1,
|
zwp_linux_buffer_params_v1::ZwpLinuxBufferParamsV1,
|
||||||
zwp_linux_dmabuf_feedback_v1::ZwpLinuxDmabufFeedbackV1,
|
zwp_linux_dmabuf_feedback_v1::ZwpLinuxDmabufFeedbackV1,
|
||||||
|
|
@ -24,6 +26,19 @@ impl DmabufHandler for AppData {
|
||||||
_proxy: &ZwpLinuxDmabufFeedbackV1,
|
_proxy: &ZwpLinuxDmabufFeedbackV1,
|
||||||
feedback: DmabufFeedback,
|
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);
|
self.dmabuf_feedback = Some(feedback);
|
||||||
}
|
}
|
||||||
fn created(
|
fn created(
|
||||||
|
|
@ -50,4 +65,16 @@ impl DmabufHandler for AppData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn find_gbm_device(dev: u64) -> io::Result<Option<gbm::Device<fs::File>>> {
|
||||||
|
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);
|
sctk::delegate_dmabuf!(AppData);
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ use futures_channel::mpsc;
|
||||||
use std::{
|
use std::{
|
||||||
cell::RefCell,
|
cell::RefCell,
|
||||||
collections::{HashMap, HashSet},
|
collections::{HashMap, HashSet},
|
||||||
|
fs,
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
thread,
|
thread,
|
||||||
};
|
};
|
||||||
|
|
@ -107,6 +108,7 @@ pub struct AppData {
|
||||||
capture_filter: CaptureFilter,
|
capture_filter: CaptureFilter,
|
||||||
captures: RefCell<HashMap<CaptureSource, Arc<Capture>>>,
|
captures: RefCell<HashMap<CaptureSource, Arc<Capture>>>,
|
||||||
dmabuf_feedback: Option<DmabufFeedback>,
|
dmabuf_feedback: Option<DmabufFeedback>,
|
||||||
|
gbm: Option<gbm::Device<fs::File>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AppData {
|
impl AppData {
|
||||||
|
|
@ -247,6 +249,7 @@ fn start(conn: Connection) -> mpsc::Receiver<Event> {
|
||||||
capture_filter: CaptureFilter::default(),
|
capture_filter: CaptureFilter::default(),
|
||||||
captures: RefCell::new(HashMap::new()),
|
captures: RefCell::new(HashMap::new()),
|
||||||
dmabuf_feedback: None,
|
dmabuf_feedback: None,
|
||||||
|
gbm: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
app_data.send_event(Event::Seats(app_data.seat_state.seats().collect()));
|
app_data.send_event(Event::Seats(app_data.seat_state.seats().collect()));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue