2022-03-22 12:41:54 +01:00
|
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
|
|
2022-07-04 15:29:31 +02:00
|
|
|
use anyhow::{anyhow, Context, Result};
|
2022-03-22 12:41:54 +01:00
|
|
|
use smithay::{
|
|
|
|
|
backend::{
|
|
|
|
|
allocator::Format,
|
2022-07-04 15:29:31 +02:00
|
|
|
drm::{DrmNode, NodeType},
|
2022-03-22 12:41:54 +01:00
|
|
|
},
|
|
|
|
|
reexports::{
|
2022-07-04 15:29:31 +02:00
|
|
|
calloop::RegistrationToken,
|
|
|
|
|
wayland_server::{Client, DisplayHandle, backend::GlobalId},
|
2022-03-22 12:41:54 +01:00
|
|
|
},
|
2022-07-04 15:29:31 +02:00
|
|
|
wayland::{
|
|
|
|
|
dmabuf::DmabufGlobal,
|
|
|
|
|
socket::ListeningSocketSource,
|
2022-03-22 12:41:54 +01:00
|
|
|
},
|
|
|
|
|
};
|
2022-07-04 15:29:31 +02:00
|
|
|
use std::sync::Arc;
|
2022-03-22 12:41:54 +01:00
|
|
|
|
2022-07-04 15:29:31 +02:00
|
|
|
use crate::{
|
|
|
|
|
state::{ClientState, Data},
|
|
|
|
|
utils::prelude::*,
|
|
|
|
|
};
|
2022-03-22 12:41:54 +01:00
|
|
|
|
|
|
|
|
pub struct Socket {
|
|
|
|
|
pub token: RegistrationToken,
|
2022-07-04 15:29:31 +02:00
|
|
|
pub drm_global: GlobalId,
|
|
|
|
|
pub dmabuf_global: DmabufGlobal,
|
2022-03-22 12:41:54 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl State {
|
|
|
|
|
pub(super) fn create_socket(
|
|
|
|
|
&mut self,
|
2022-07-04 15:29:31 +02:00
|
|
|
dh: &DisplayHandle,
|
2022-03-22 12:41:54 +01:00
|
|
|
render_node: DrmNode,
|
|
|
|
|
formats: impl Iterator<Item = Format>,
|
|
|
|
|
) -> Result<Socket> {
|
|
|
|
|
let formats = formats.collect::<Vec<_>>();
|
2022-07-04 15:29:31 +02:00
|
|
|
let socket_name = format!(
|
2022-03-22 12:41:54 +01:00
|
|
|
"{}-{}",
|
|
|
|
|
&self.common.socket.to_string_lossy(),
|
|
|
|
|
render_node
|
|
|
|
|
.dev_path()
|
|
|
|
|
.unwrap()
|
|
|
|
|
.file_name()
|
|
|
|
|
.unwrap()
|
|
|
|
|
.to_string_lossy()
|
2022-07-04 15:29:31 +02:00
|
|
|
);
|
2022-03-22 12:41:54 +01:00
|
|
|
|
|
|
|
|
// initialize globals
|
2022-07-04 15:29:31 +02:00
|
|
|
let filter = move |client: &Client| {
|
|
|
|
|
let dev_id = client.get_data::<ClientState>().unwrap().drm_node.unwrap();
|
|
|
|
|
dev_id == render_node
|
2022-03-22 12:41:54 +01:00
|
|
|
};
|
|
|
|
|
|
2022-07-04 15:29:31 +02:00
|
|
|
let dmabuf_global = self.common.dmabuf_state.create_global_with_filter::<State, _, _>(
|
|
|
|
|
dh,
|
2022-03-22 12:41:54 +01:00
|
|
|
formats.clone(),
|
2022-07-04 15:29:31 +02:00
|
|
|
filter,
|
|
|
|
|
None,
|
2022-03-22 12:41:54 +01:00
|
|
|
);
|
2022-07-04 15:29:31 +02:00
|
|
|
|
|
|
|
|
let drm_global_id = self.common.wl_drm_state.create_global_with_filter::<State, _>(
|
|
|
|
|
dh,
|
|
|
|
|
render_node
|
|
|
|
|
.dev_path_with_type(NodeType::Render)
|
|
|
|
|
.or_else(|| render_node.dev_path())
|
|
|
|
|
.ok_or(anyhow!("Could not determine path for gpu node: {}", render_node))?,
|
2022-03-22 12:41:54 +01:00
|
|
|
formats,
|
2022-07-04 15:29:31 +02:00
|
|
|
&dmabuf_global,
|
2022-03-22 12:41:54 +01:00
|
|
|
filter,
|
|
|
|
|
);
|
2022-07-04 15:29:31 +02:00
|
|
|
|
|
|
|
|
// add a special socket for the gpu
|
|
|
|
|
let listener = ListeningSocketSource::with_name(&socket_name, None)
|
|
|
|
|
.with_context(|| format!("Failed to bind socket to {}", socket_name))?;
|
|
|
|
|
let token = self
|
|
|
|
|
.common
|
|
|
|
|
.event_loop_handle
|
|
|
|
|
.insert_source(
|
|
|
|
|
listener,
|
|
|
|
|
move |client_stream, _, data: &mut Data| {
|
|
|
|
|
if let Err(err) = data
|
|
|
|
|
.display
|
|
|
|
|
.handle()
|
|
|
|
|
.insert_client(client_stream, Arc::new(data.state.new_client_state_with_node(render_node)))
|
|
|
|
|
{
|
|
|
|
|
slog_scope::warn!("Error adding wayland client ({}): {}", render_node, err);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
.context("Failed to add gpu-wayland socket to the event loop")?;
|
|
|
|
|
|
2022-03-22 12:41:54 +01:00
|
|
|
|
|
|
|
|
slog_scope::info!(
|
2022-07-04 15:29:31 +02:00
|
|
|
"Added socket at {} for gpu {}",
|
|
|
|
|
socket_name,
|
|
|
|
|
render_node,
|
2022-03-22 12:41:54 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
Ok(Socket {
|
|
|
|
|
token,
|
2022-07-04 15:29:31 +02:00
|
|
|
drm_global: drm_global_id,
|
|
|
|
|
dmabuf_global,
|
2022-03-22 12:41:54 +01:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|