1
0
Fork 0
forked from wry/wry

drm: include st_rdev in Drm object

This commit is contained in:
Julian Orth 2024-10-09 13:39:57 +02:00
parent 9a084a53aa
commit b754e37bfe
9 changed files with 41 additions and 34 deletions

View file

@ -236,7 +236,13 @@ impl MetalBackend {
return; return;
} }
}; };
let master = Rc::new(DrmMaster::new(&slf.state.ring, res.fd.clone())); let master = match DrmMaster::new(&slf.state.ring, res.fd.clone()) {
Ok(m) => Rc::new(m),
Err(e) => {
log::error!("Could not open the drm device: {}", ErrorFmt(e));
return;
}
};
let dev = match slf.create_drm_device(dev, &master) { let dev = match slf.create_drm_device(dev, &master) {
Ok(d) => d, Ok(d) => d,
Err(e) => { Err(e) => {

View file

@ -59,7 +59,7 @@ use {
rc::Rc, rc::Rc,
}, },
thiserror::Error, thiserror::Error,
uapi::{c::dev_t, Errno}, uapi::c::dev_t,
}; };
#[derive(Debug, Error)] #[derive(Debug, Error)]
@ -114,8 +114,6 @@ pub enum XBackendError {
MapWindow(#[source] XconError), MapWindow(#[source] XconError),
#[error("Could not query device")] #[error("Could not query device")]
QueryDevice(#[source] XconError), QueryDevice(#[source] XconError),
#[error("Could not fstat the drm device")]
DrmDeviceFstat(#[source] Errno),
#[error("Render device does not support XRGB8888 format")] #[error("Render device does not support XRGB8888 format")]
XRGB8888, XRGB8888,
} }
@ -174,10 +172,7 @@ pub async fn create(state: &Rc<State>) -> Result<Rc<XBackend>, XBackendError> {
Err(e) => return Err(XBackendError::DriOpen(e)), Err(e) => return Err(XBackendError::DriOpen(e)),
} }
}; };
let drm_dev = match uapi::fstat(drm.raw()) { let drm_dev = drm.dev();
Ok(s) => s.st_rdev,
Err(e) => return Err(XBackendError::DrmDeviceFstat(e)),
};
let gbm = GbmDevice::new(&drm)?; let gbm = GbmDevice::new(&drm)?;
let ctx = match state.create_gfx_context(&drm, None) { let ctx = match state.create_gfx_context(&drm, None) {
Ok(r) => r, Ok(r) => r,

View file

@ -36,11 +36,10 @@ impl DrmFeedback {
ids: &DrmFeedbackIds, ids: &DrmFeedbackIds,
render_ctx: &dyn GfxContext, render_ctx: &dyn GfxContext,
) -> Result<Self, DrmFeedbackError> { ) -> Result<Self, DrmFeedbackError> {
let drm = match render_ctx.allocator().drm() { let main_device = match render_ctx.allocator().drm() {
Some(drm) => drm.raw(), Some(drm) => drm.dev(),
_ => return Err(DrmFeedbackError::NoDrmDevice), _ => return Err(DrmFeedbackError::NoDrmDevice),
}; };
let main_device = uapi::fstat(drm).map_err(OsError::from)?.st_rdev;
let (data, index_map) = create_fd_data(render_ctx); let (data, index_map) = create_fd_data(render_ctx);
let mut memfd = let mut memfd =
uapi::memfd_create("drm_feedback", c::MFD_CLOEXEC | c::MFD_ALLOW_SEALING).unwrap(); uapi::memfd_create("drm_feedback", c::MFD_CLOEXEC | c::MFD_ALLOW_SEALING).unwrap();

View file

@ -91,8 +91,6 @@ pub enum VulkanError {
CreateInstance(#[source] vk::Result), CreateInstance(#[source] vk::Result),
#[error("Could not create a debug-utils messenger")] #[error("Could not create a debug-utils messenger")]
Messenger(#[source] vk::Result), Messenger(#[source] vk::Result),
#[error("Could not fstat the DRM FD")]
Fstat(#[source] OsError),
#[error("Could not enumerate the physical devices")] #[error("Could not enumerate the physical devices")]
EnumeratePhysicalDevices(#[source] vk::Result), EnumeratePhysicalDevices(#[source] vk::Result),
#[error("Could not find a vulkan device that matches dev_t {0}")] #[error("Could not find a vulkan device that matches dev_t {0}")]

View file

@ -104,11 +104,7 @@ impl VulkanInstance {
} }
fn find_dev(&self, drm: &Drm) -> Result<PhysicalDevice, VulkanError> { fn find_dev(&self, drm: &Drm) -> Result<PhysicalDevice, VulkanError> {
let stat = match uapi::fstat(drm.raw()) { let dev = drm.dev();
Ok(s) => s,
Err(e) => return Err(VulkanError::Fstat(e.into())),
};
let dev = stat.st_rdev;
log::log!( log::log!(
self.log_level, self.log_level,
"Searching for vulkan device with devnum {}:{}", "Searching for vulkan device with devnum {}:{}",

View file

@ -210,6 +210,8 @@ efrom!(WpDrmLeaseDeviceV1Error, ClientError);
enum ReopenError { enum ReopenError {
#[error("Could not open the dev node")] #[error("Could not open the dev node")]
OpenNode(#[source] OsError), OpenNode(#[source] OsError),
#[error("Could not create the DRM device")]
CreateDrm(#[source] DrmError),
#[error("Could not drop DRM master")] #[error("Could not drop DRM master")]
DropMaster(#[source] DrmError), DropMaster(#[source] DrmError),
} }
@ -218,7 +220,7 @@ fn reopen_card(devnode: &str) -> Result<Rc<OwnedFd>, ReopenError> {
let fd = uapi::open(devnode, c::O_RDWR | c::O_CLOEXEC, 0) let fd = uapi::open(devnode, c::O_RDWR | c::O_CLOEXEC, 0)
.map_err(|e| ReopenError::OpenNode(e.into()))?; .map_err(|e| ReopenError::OpenNode(e.into()))?;
let fd = Rc::new(fd); let fd = Rc::new(fd);
let drm = Drm::open_existing(fd.clone()); let drm = Drm::open_existing(fd.clone()).map_err(ReopenError::CreateDrm)?;
if drm.is_master() { if drm.is_master() {
drm.drop_master().map_err(ReopenError::DropMaster)?; drm.drop_master().map_err(ReopenError::DropMaster)?;
} }

View file

@ -24,7 +24,7 @@ use {
on_change::OnChange, oserror::OsError, syncqueue::SyncQueue, on_change::OnChange, oserror::OsError, syncqueue::SyncQueue,
}, },
video::{ video::{
drm::{ConnectorType, Drm}, drm::{ConnectorType, Drm, DrmError},
gbm::{GbmDevice, GbmError}, gbm::{GbmDevice, GbmError},
}, },
}, },
@ -42,6 +42,8 @@ pub enum TestBackendError {
NoDrmNode, NoDrmNode,
#[error("Could not open drm node {0}")] #[error("Could not open drm node {0}")]
OpenDrmNode(String, #[source] OsError), OpenDrmNode(String, #[source] OsError),
#[error("Could not open the drm device")]
OpenDrmDevice(#[source] DrmError),
#[error("Could not create a render context")] #[error("Could not create a render context")]
RenderContext(#[source] GfxError), RenderContext(#[source] GfxError),
#[error("Could not create a gbm device")] #[error("Could not create a gbm device")]
@ -264,7 +266,7 @@ where
)) ))
} }
}; };
let drm = Drm::open_existing(file); let drm = Drm::open_existing(file).map_err(TestBackendError::OpenDrmDevice)?;
f(drm) f(drm)
} }

View file

@ -162,13 +162,14 @@ impl UsrJayRenderCtxOwner for PortalDisplay {
fn device(&self, fd: Rc<OwnedFd>, server_formats: Option<AHashMap<u32, GfxFormat>>) { fn device(&self, fd: Rc<OwnedFd>, server_formats: Option<AHashMap<u32, GfxFormat>>) {
self.render_ctx.take(); self.render_ctx.take();
let dev_id = match uapi::fstat(fd.raw()) { let drm = match Drm::open_existing(fd) {
Ok(s) => s.st_rdev, Ok(d) => d,
Err(e) => { Err(e) => {
log::error!("Could not fstat display device: {}", ErrorFmt(e)); log::error!("Could not open the drm device: {}", ErrorFmt(e));
return; return;
} }
}; };
let dev_id = drm.dev();
let mut render_ctx = None; let mut render_ctx = None;
if let Some(ctx) = self.state.render_ctxs.get(&dev_id) { if let Some(ctx) = self.state.render_ctxs.get(&dev_id) {
if let Some(ctx) = ctx.upgrade() { if let Some(ctx) = ctx.upgrade() {
@ -176,7 +177,6 @@ impl UsrJayRenderCtxOwner for PortalDisplay {
} }
} }
if render_ctx.is_none() { if render_ctx.is_none() {
let drm = Drm::open_existing(fd);
let ctx = let ctx =
match create_gfx_context(&self.state.eng, &self.state.ring, &drm, GfxApi::OpenGl) { match create_gfx_context(&self.state.eng, &self.state.ring, &drm, GfxApi::OpenGl) {
Ok(c) => c, Ok(c) => c,

View file

@ -144,6 +144,8 @@ pub enum DrmError {
DropMaster(#[source] OsError), DropMaster(#[source] OsError),
#[error("Could not queue a CRTC sequence")] #[error("Could not queue a CRTC sequence")]
QueueSequence(#[source] OsError), QueueSequence(#[source] OsError),
#[error("Could not stat the DRM fd")]
Stat(#[source] OsError),
} }
fn render_node_name(fd: c::c_int) -> Result<Ustring, DrmError> { fn render_node_name(fd: c::c_int) -> Result<Ustring, DrmError> {
@ -177,17 +179,24 @@ fn reopen(fd: c::c_int, need_primary: bool) -> Result<Rc<OwnedFd>, DrmError> {
pub struct Drm { pub struct Drm {
fd: Rc<OwnedFd>, fd: Rc<OwnedFd>,
dev: c::dev_t,
} }
impl Drm { impl Drm {
pub fn open_existing(fd: Rc<OwnedFd>) -> Self { pub fn open_existing(fd: Rc<OwnedFd>) -> Result<Self, DrmError> {
Self { fd } let stat = uapi::fstat(fd.raw()).map_err(|e| DrmError::Stat(e.into()))?;
Ok(Self {
fd,
dev: stat.st_rdev,
})
} }
pub fn reopen(fd: c::c_int, need_primary: bool) -> Result<Self, DrmError> { pub fn reopen(fd: c::c_int, need_primary: bool) -> Result<Self, DrmError> {
Ok(Self { Self::open_existing(reopen(fd, need_primary)?)
fd: reopen(fd, need_primary)?, }
})
pub fn dev(&self) -> c::dev_t {
self.dev
} }
pub fn fd(&self) -> &Rc<OwnedFd> { pub fn fd(&self) -> &Rc<OwnedFd> {
@ -291,16 +300,16 @@ impl DrmLease {
} }
impl DrmMaster { impl DrmMaster {
pub fn new(ring: &Rc<IoUring>, fd: Rc<OwnedFd>) -> Self { pub fn new(ring: &Rc<IoUring>, fd: Rc<OwnedFd>) -> Result<Self, DrmError> {
Self { Ok(Self {
drm: Drm { fd }, drm: Drm::open_existing(fd)?,
u32_bufs: Default::default(), u32_bufs: Default::default(),
u64_bufs: Default::default(), u64_bufs: Default::default(),
gem_handles: Default::default(), gem_handles: Default::default(),
events: Default::default(), events: Default::default(),
ring: ring.clone(), ring: ring.clone(),
buf: RefCell::new(Buf::new(1024)), buf: RefCell::new(Buf::new(1024)),
} })
} }
pub fn raw(&self) -> c::c_int { pub fn raw(&self) -> c::c_int {