autocommit 2022-03-11 20:04:41 CET
This commit is contained in:
parent
0ae73ab9c4
commit
eb1d500561
10 changed files with 93 additions and 75 deletions
|
|
@ -164,7 +164,7 @@ async fn run_(state: Rc<State>) -> Result<(), MetalError> {
|
||||||
struct MetalInputDevice {
|
struct MetalInputDevice {
|
||||||
slot: usize,
|
slot: usize,
|
||||||
id: InputDeviceId,
|
id: InputDeviceId,
|
||||||
devnum: c::dev_t,
|
_devnum: c::dev_t,
|
||||||
fd: CloneCell<Option<Rc<OwnedFd>>>,
|
fd: CloneCell<Option<Rc<OwnedFd>>>,
|
||||||
inputdev: Cell<Option<RegisteredDevice>>,
|
inputdev: Cell<Option<RegisteredDevice>>,
|
||||||
devnode: CString,
|
devnode: CString,
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,12 @@ use crate::metal::video::PendingDrmDevice;
|
||||||
use crate::metal::{MetalBackend, MetalDevice, MetalDrmDevice, MetalError, MetalInputDevice};
|
use crate::metal::{MetalBackend, MetalDevice, MetalDrmDevice, MetalError, MetalInputDevice};
|
||||||
use crate::org::freedesktop::login1::session::{PauseDevice, ResumeDevice};
|
use crate::org::freedesktop::login1::session::{PauseDevice, ResumeDevice};
|
||||||
use crate::udev::UdevDevice;
|
use crate::udev::UdevDevice;
|
||||||
|
use crate::utils::nonblock::set_nonblock;
|
||||||
use crate::ErrorFmt;
|
use crate::ErrorFmt;
|
||||||
use bstr::ByteSlice;
|
use bstr::ByteSlice;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use uapi::{c, OwnedFd};
|
use uapi::{c, OwnedFd};
|
||||||
use crate::utils::nonblock::set_nonblock;
|
|
||||||
|
|
||||||
const DRM: &[u8] = b"drm";
|
const DRM: &[u8] = b"drm";
|
||||||
const INPUT: &[u8] = b"input";
|
const INPUT: &[u8] = b"input";
|
||||||
|
|
@ -82,7 +82,7 @@ impl MetalBackend {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_drm_device_resume(self: &Rc<Self>, dev: &Rc<MetalDrmDevice>, fd: Rc<OwnedFd>) {
|
fn handle_drm_device_resume(self: &Rc<Self>, dev: &Rc<MetalDrmDevice>, _fd: Rc<OwnedFd>) {
|
||||||
log::info!("Device resumed: {}", dev.dev.devnode.to_bytes().as_bstr());
|
log::info!("Device resumed: {}", dev.dev.devnode.to_bytes().as_bstr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -224,7 +224,7 @@ impl MetalBackend {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_drm_change(self: &Rc<Self>, dev: UdevDevice) -> Option<()> {
|
fn handle_drm_change(self: &Rc<Self>, _dev: UdevDevice) -> Option<()> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -266,7 +266,7 @@ impl MetalBackend {
|
||||||
let dev = Rc::new(MetalInputDevice {
|
let dev = Rc::new(MetalInputDevice {
|
||||||
slot,
|
slot,
|
||||||
id: device_id,
|
id: device_id,
|
||||||
devnum,
|
_devnum: devnum,
|
||||||
fd: Default::default(),
|
fd: Default::default(),
|
||||||
inputdev: Default::default(),
|
inputdev: Default::default(),
|
||||||
devnode: devnode.to_owned(),
|
devnode: devnode.to_owned(),
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
|
use crate::async_engine::{AsyncFd, SpawnedFuture};
|
||||||
use crate::backend::{BackendEvent, Output, OutputId};
|
use crate::backend::{BackendEvent, Output, OutputId};
|
||||||
use crate::drm::drm::{ConnectorStatus, ConnectorType, DrmBlob, DrmConnector, DrmCrtc, DrmEncoder, DrmError, DrmFb, DrmFramebuffer, DrmMaster, DrmModeInfo, DrmObject, DrmPlane, DrmProperty, DrmPropertyDefinition, DrmPropertyType, PropBlob, DRM_CLIENT_CAP_ATOMIC, DRM_MODE_ATOMIC_ALLOW_MODESET, DRM_MODE_ATOMIC_NONBLOCK, DRM_MODE_PAGE_FLIP_EVENT, DrmEvent};
|
use crate::drm::drm::{
|
||||||
|
ConnectorStatus, ConnectorType, DrmBlob, DrmConnector, DrmCrtc, DrmEncoder, DrmError, DrmEvent,
|
||||||
|
DrmFb, DrmFramebuffer, DrmMaster, DrmModeInfo, DrmObject, DrmPlane, DrmProperty,
|
||||||
|
DrmPropertyDefinition, DrmPropertyType, PropBlob, DRM_CLIENT_CAP_ATOMIC,
|
||||||
|
DRM_MODE_ATOMIC_ALLOW_MODESET, DRM_MODE_ATOMIC_NONBLOCK, DRM_MODE_PAGE_FLIP_EVENT,
|
||||||
|
};
|
||||||
use crate::drm::gbm::{GbmDevice, GBM_BO_USE_RENDERING, GBM_BO_USE_SCANOUT};
|
use crate::drm::gbm::{GbmDevice, GBM_BO_USE_RENDERING, GBM_BO_USE_SCANOUT};
|
||||||
use crate::drm::{ModifiedFormat, INVALID_MODIFIER};
|
use crate::drm::{ModifiedFormat, INVALID_MODIFIER};
|
||||||
use crate::format::{Format, XRGB8888};
|
use crate::format::{Format, XRGB8888};
|
||||||
|
|
@ -14,7 +20,6 @@ use std::ffi::CString;
|
||||||
use std::fmt::{Debug, Formatter};
|
use std::fmt::{Debug, Formatter};
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use uapi::c;
|
use uapi::c;
|
||||||
use crate::async_engine::{AsyncFd, SpawnedFuture};
|
|
||||||
|
|
||||||
pub struct PendingDrmDevice {
|
pub struct PendingDrmDevice {
|
||||||
pub id: DrmId,
|
pub id: DrmId,
|
||||||
|
|
@ -462,14 +467,14 @@ impl MetalBackend {
|
||||||
|
|
||||||
let connectors = get_connectors(&self.state, &dev, &resources.connectors)?;
|
let connectors = get_connectors(&self.state, &dev, &resources.connectors)?;
|
||||||
|
|
||||||
let slf = Rc::new(MetalDrmDevice {
|
let slf = Rc::new(MetalDrmDevice { dev, connectors });
|
||||||
dev,
|
|
||||||
connectors,
|
|
||||||
});
|
|
||||||
|
|
||||||
self.reset_drm_device(&slf)?;
|
self.reset_drm_device(&slf)?;
|
||||||
|
|
||||||
let handler = self.state.eng.spawn(self.clone().handle_drm_events(slf.clone()));
|
let handler = self
|
||||||
|
.state
|
||||||
|
.eng
|
||||||
|
.spawn(self.clone().handle_drm_events(slf.clone()));
|
||||||
slf.dev.handle_events.handle_events.set(Some(handler));
|
slf.dev.handle_events.handle_events.set(Some(handler));
|
||||||
|
|
||||||
self.state.render_ctx.set(Some(egl));
|
self.state.render_ctx.set(Some(egl));
|
||||||
|
|
@ -498,13 +503,23 @@ impl MetalBackend {
|
||||||
|
|
||||||
fn handle_drm_event(self: &Rc<Self>, event: DrmEvent, dev: &Rc<MetalDrmDevice>) {
|
fn handle_drm_event(self: &Rc<Self>, event: DrmEvent, dev: &Rc<MetalDrmDevice>) {
|
||||||
match event {
|
match event {
|
||||||
DrmEvent::FlipComplete { tv_sec, tv_usec, sequence, crtc_id } => self.handle_drm_flip_event(
|
DrmEvent::FlipComplete {
|
||||||
dev, crtc_id, tv_sec, tv_usec, sequence
|
tv_sec,
|
||||||
),
|
tv_usec,
|
||||||
|
sequence,
|
||||||
|
crtc_id,
|
||||||
|
} => self.handle_drm_flip_event(dev, crtc_id, tv_sec, tv_usec, sequence),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_drm_flip_event(self: &Rc<Self>, dev: &Rc<MetalDrmDevice>, crtc_id: DrmCrtc, _tv_sec: u32, _tv_usec: u32, _sequence: u32) {
|
fn handle_drm_flip_event(
|
||||||
|
self: &Rc<Self>,
|
||||||
|
dev: &Rc<MetalDrmDevice>,
|
||||||
|
crtc_id: DrmCrtc,
|
||||||
|
_tv_sec: u32,
|
||||||
|
_tv_usec: u32,
|
||||||
|
_sequence: u32,
|
||||||
|
) {
|
||||||
let crtc = match dev.dev.crtcs.get(&crtc_id) {
|
let crtc = match dev.dev.crtcs.get(&crtc_id) {
|
||||||
Some(c) => c,
|
Some(c) => c,
|
||||||
_ => return,
|
_ => return,
|
||||||
|
|
@ -559,15 +574,26 @@ impl MetalBackend {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_scanout_buffers(&self, dev: &Rc<MetalDrmDevice>, connector: &Rc<MetalConnector>, format: &ModifiedFormat, width: i32, height: i32) -> Result<[RenderBuffer; 2], MetalError> {
|
fn create_scanout_buffers(
|
||||||
|
&self,
|
||||||
|
dev: &Rc<MetalDrmDevice>,
|
||||||
|
connector: &Rc<MetalConnector>,
|
||||||
|
format: &ModifiedFormat,
|
||||||
|
width: i32,
|
||||||
|
height: i32,
|
||||||
|
) -> Result<[RenderBuffer; 2], MetalError> {
|
||||||
let create = || self.create_scanout_buffer(dev, connector, format, width, height);
|
let create = || self.create_scanout_buffer(dev, connector, format, width, height);
|
||||||
Ok([
|
Ok([create()?, create()?])
|
||||||
create()?,
|
|
||||||
create()?,
|
|
||||||
])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_scanout_buffer(&self, dev: &Rc<MetalDrmDevice>, connector: &Rc<MetalConnector>, format: &ModifiedFormat, width: i32, height: i32) -> Result<RenderBuffer, MetalError> {
|
fn create_scanout_buffer(
|
||||||
|
&self,
|
||||||
|
dev: &Rc<MetalDrmDevice>,
|
||||||
|
connector: &Rc<MetalConnector>,
|
||||||
|
format: &ModifiedFormat,
|
||||||
|
width: i32,
|
||||||
|
height: i32,
|
||||||
|
) -> Result<RenderBuffer, MetalError> {
|
||||||
let bo = dev.dev.gbm.create_bo(
|
let bo = dev.dev.gbm.create_bo(
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
|
|
@ -628,7 +654,13 @@ impl MetalBackend {
|
||||||
format: XRGB8888,
|
format: XRGB8888,
|
||||||
modifier: INVALID_MODIFIER,
|
modifier: INVALID_MODIFIER,
|
||||||
};
|
};
|
||||||
let buffers = self.create_scanout_buffers(dev, connector, &format, mode.hdisplay as _, mode.vdisplay as _)?;
|
let buffers = self.create_scanout_buffers(
|
||||||
|
dev,
|
||||||
|
connector,
|
||||||
|
&format,
|
||||||
|
mode.hdisplay as _,
|
||||||
|
mode.vdisplay as _,
|
||||||
|
)?;
|
||||||
let mut changes = connector.master.change(DRM_MODE_ATOMIC_ALLOW_MODESET);
|
let mut changes = connector.master.change(DRM_MODE_ATOMIC_ALLOW_MODESET);
|
||||||
changes.change_object(connector.id, |c| {
|
changes.change_object(connector.id, |c| {
|
||||||
c.change(connector.crtc_id.id, crtc.id.0 as _);
|
c.change(connector.crtc_id.id, crtc.id.0 as _);
|
||||||
|
|
@ -694,9 +726,13 @@ impl MetalBackend {
|
||||||
};
|
};
|
||||||
let buffer = &buffers[connector.next_buffer.fetch_add(1) % buffers.len()];
|
let buffer = &buffers[connector.next_buffer.fetch_add(1) % buffers.len()];
|
||||||
if let Some(node) = self.state.root.outputs.get(&connector.output_id) {
|
if let Some(node) = self.state.root.outputs.get(&connector.output_id) {
|
||||||
buffer.egl.render(&*node, &self.state, Some(node.position.get()));
|
buffer
|
||||||
|
.egl
|
||||||
|
.render(&*node, &self.state, Some(node.position.get()));
|
||||||
}
|
}
|
||||||
let mut changes = connector.master.change(DRM_MODE_ATOMIC_NONBLOCK | DRM_MODE_PAGE_FLIP_EVENT);
|
let mut changes = connector
|
||||||
|
.master
|
||||||
|
.change(DRM_MODE_ATOMIC_NONBLOCK | DRM_MODE_PAGE_FLIP_EVENT);
|
||||||
changes.change_object(plane.id, |c| {
|
changes.change_object(plane.id, |c| {
|
||||||
c.change(plane.fb_id.id, buffer.drm.id().0 as _);
|
c.change(plane.fb_id.id, buffer.drm.id().0 as _);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,19 @@
|
||||||
mod sys;
|
mod sys;
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use crate::drm::drm::sys::{
|
||||||
use crate::drm::drm::sys::{create_lease, drm_mode_modeinfo, get_cap, get_device_name_from_fd2, get_minor_name_from_fd, get_node_type_from_fd, get_nodes, is_master, mode_addfb2, mode_atomic, mode_create_blob, mode_destroy_blob, mode_get_resources, mode_getconnector, mode_getencoder, mode_getplane, mode_getplaneresources, mode_getproperty, mode_obj_getproperties, mode_rmfb, set_client_cap, DRM_DISPLAY_MODE_LEN, DRM_MODE_ATOMIC_TEST_ONLY, DRM_MODE_FB_MODIFIERS, DRM_MODE_OBJECT_BLOB, DRM_MODE_OBJECT_CONNECTOR, DRM_MODE_OBJECT_CRTC, DRM_MODE_OBJECT_ENCODER, DRM_MODE_OBJECT_FB, DRM_MODE_OBJECT_MODE, DRM_MODE_OBJECT_PLANE, DRM_MODE_OBJECT_PROPERTY, gem_close, prime_fd_to_handle, drm_event, drm_event_vblank};
|
create_lease, drm_event, drm_event_vblank, drm_mode_modeinfo, gem_close, get_cap,
|
||||||
|
get_device_name_from_fd2, get_minor_name_from_fd, get_node_type_from_fd, get_nodes, is_master,
|
||||||
|
mode_addfb2, mode_atomic, mode_create_blob, mode_destroy_blob, mode_get_resources,
|
||||||
|
mode_getconnector, mode_getencoder, mode_getplane, mode_getplaneresources, mode_getproperty,
|
||||||
|
mode_obj_getproperties, mode_rmfb, prime_fd_to_handle, set_client_cap, DRM_DISPLAY_MODE_LEN,
|
||||||
|
DRM_MODE_ATOMIC_TEST_ONLY, DRM_MODE_FB_MODIFIERS, DRM_MODE_OBJECT_BLOB,
|
||||||
|
DRM_MODE_OBJECT_CONNECTOR, DRM_MODE_OBJECT_CRTC, DRM_MODE_OBJECT_ENCODER, DRM_MODE_OBJECT_FB,
|
||||||
|
DRM_MODE_OBJECT_MODE, DRM_MODE_OBJECT_PLANE, DRM_MODE_OBJECT_PROPERTY,
|
||||||
|
};
|
||||||
use crate::utils::oserror::OsError;
|
use crate::utils::oserror::OsError;
|
||||||
use ahash::AHashMap;
|
use ahash::AHashMap;
|
||||||
use bstr::{BString, ByteSlice};
|
use bstr::{BString, ByteSlice};
|
||||||
|
use std::cell::RefCell;
|
||||||
use std::ffi::CString;
|
use std::ffi::CString;
|
||||||
use std::fmt::{Debug, Display, Formatter};
|
use std::fmt::{Debug, Display, Formatter};
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
@ -17,12 +26,12 @@ use uapi::{c, Errno, OwnedFd, Ustring};
|
||||||
use crate::drm::gbm::GbmBo;
|
use crate::drm::gbm::GbmBo;
|
||||||
use crate::drm::INVALID_MODIFIER;
|
use crate::drm::INVALID_MODIFIER;
|
||||||
use crate::utils::stack::Stack;
|
use crate::utils::stack::Stack;
|
||||||
|
use crate::utils::syncqueue::SyncQueue;
|
||||||
use crate::ErrorFmt;
|
use crate::ErrorFmt;
|
||||||
pub use sys::{
|
pub use sys::{
|
||||||
DRM_CLIENT_CAP_ATOMIC, DRM_MODE_ATOMIC_ALLOW_MODESET, DRM_MODE_ATOMIC_NONBLOCK,
|
DRM_CLIENT_CAP_ATOMIC, DRM_MODE_ATOMIC_ALLOW_MODESET, DRM_MODE_ATOMIC_NONBLOCK,
|
||||||
DRM_MODE_PAGE_FLIP_EVENT,
|
DRM_MODE_PAGE_FLIP_EVENT,
|
||||||
};
|
};
|
||||||
use crate::utils::syncqueue::SyncQueue;
|
|
||||||
|
|
||||||
#[derive(Debug, Error)]
|
#[derive(Debug, Error)]
|
||||||
pub enum DrmError {
|
pub enum DrmError {
|
||||||
|
|
@ -188,6 +197,7 @@ impl DrmMaster {
|
||||||
mode_get_resources(self.raw())
|
mode_get_resources(self.raw())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn get_cap(&self, cap: u64) -> Result<u64, OsError> {
|
pub fn get_cap(&self, cap: u64) -> Result<u64, OsError> {
|
||||||
get_cap(self.raw(), cap)
|
get_cap(self.raw(), cap)
|
||||||
}
|
}
|
||||||
|
|
@ -329,7 +339,7 @@ impl DrmMaster {
|
||||||
crtc_id: DrmCrtc(event.crtc_id),
|
crtc_id: DrmCrtc(event.crtc_id),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
_ => { },
|
_ => {}
|
||||||
}
|
}
|
||||||
buf = &mut buf[len as usize..];
|
buf = &mut buf[len as usize..];
|
||||||
}
|
}
|
||||||
|
|
@ -586,6 +596,7 @@ pub struct ObjectChange<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Change {
|
impl Change {
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn test(&self) -> Result<(), DrmError> {
|
pub fn test(&self) -> Result<(), DrmError> {
|
||||||
mode_atomic(
|
mode_atomic(
|
||||||
self.master.raw(),
|
self.master.raw(),
|
||||||
|
|
|
||||||
|
|
@ -212,6 +212,7 @@ struct drm_mode_get_property {
|
||||||
|
|
||||||
const DRM_IOCTL_MODE_GETPROPERTY: u64 = drm_iowr::<drm_mode_get_property>(0xaa);
|
const DRM_IOCTL_MODE_GETPROPERTY: u64 = drm_iowr::<drm_mode_get_property>(0xaa);
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
const DRM_MODE_PROP_PENDING: u32 = 1 << 0;
|
const DRM_MODE_PROP_PENDING: u32 = 1 << 0;
|
||||||
const DRM_MODE_PROP_RANGE: u32 = 1 << 1;
|
const DRM_MODE_PROP_RANGE: u32 = 1 << 1;
|
||||||
const DRM_MODE_PROP_IMMUTABLE: u32 = 1 << 2;
|
const DRM_MODE_PROP_IMMUTABLE: u32 = 1 << 2;
|
||||||
|
|
@ -397,8 +398,10 @@ pub const DRM_MODE_OBJECT_PROPERTY: u32 = 0xb0b0b0b0;
|
||||||
pub const DRM_MODE_OBJECT_FB: u32 = 0xfbfbfbfb;
|
pub const DRM_MODE_OBJECT_FB: u32 = 0xfbfbfbfb;
|
||||||
pub const DRM_MODE_OBJECT_BLOB: u32 = 0xbbbbbbbb;
|
pub const DRM_MODE_OBJECT_BLOB: u32 = 0xbbbbbbbb;
|
||||||
pub const DRM_MODE_OBJECT_PLANE: u32 = 0xeeeeeeee;
|
pub const DRM_MODE_OBJECT_PLANE: u32 = 0xeeeeeeee;
|
||||||
|
#[allow(dead_code)]
|
||||||
pub const DRM_MODE_OBJECT_ANY: u32 = 0;
|
pub const DRM_MODE_OBJECT_ANY: u32 = 0;
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
pub const DRM_MODE_CONNECTOR_Unknown: u32 = 0;
|
pub const DRM_MODE_CONNECTOR_Unknown: u32 = 0;
|
||||||
pub const DRM_MODE_CONNECTOR_VGA: u32 = 1;
|
pub const DRM_MODE_CONNECTOR_VGA: u32 = 1;
|
||||||
pub const DRM_MODE_CONNECTOR_DVII: u32 = 2;
|
pub const DRM_MODE_CONNECTOR_DVII: u32 = 2;
|
||||||
|
|
@ -948,6 +951,7 @@ struct drm_mode_fb_cmd2 {
|
||||||
modifier: [u64; 4],
|
modifier: [u64; 4],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
pub const DRM_MODE_FB_INTERLACED: u32 = 1 << 0;
|
pub const DRM_MODE_FB_INTERLACED: u32 = 1 << 0;
|
||||||
pub const DRM_MODE_FB_MODIFIERS: u32 = 1 << 1;
|
pub const DRM_MODE_FB_MODIFIERS: u32 = 1 << 1;
|
||||||
|
|
||||||
|
|
@ -1023,19 +1027,18 @@ struct drm_gem_close {
|
||||||
const DRM_IOCTL_GEM_CLOSE: u64 = drm_iow::<drm_gem_close>(0x09);
|
const DRM_IOCTL_GEM_CLOSE: u64 = drm_iow::<drm_gem_close>(0x09);
|
||||||
|
|
||||||
pub fn gem_close(fd: c::c_int, handle: u32) -> Result<(), OsError> {
|
pub fn gem_close(fd: c::c_int, handle: u32) -> Result<(), OsError> {
|
||||||
let mut res = drm_gem_close {
|
let mut res = drm_gem_close { handle, pad: 0 };
|
||||||
handle,
|
|
||||||
pad: 0,
|
|
||||||
};
|
|
||||||
unsafe {
|
unsafe {
|
||||||
ioctl(fd, DRM_IOCTL_GEM_CLOSE, &mut res)?;
|
ioctl(fd, DRM_IOCTL_GEM_CLOSE, &mut res)?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const DRM_EVENT_VBLANK : u32 = 0x01;
|
#[allow(dead_code)]
|
||||||
pub const DRM_EVENT_FLIP_COMPLETE : u32 = 0x02;
|
pub const DRM_EVENT_VBLANK: u32 = 0x01;
|
||||||
pub const DRM_EVENT_CRTC_SEQUENCE : u32 = 0x03;
|
pub const DRM_EVENT_FLIP_COMPLETE: u32 = 0x02;
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub const DRM_EVENT_CRTC_SEQUENCE: u32 = 0x03;
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct drm_event {
|
pub struct drm_event {
|
||||||
|
|
@ -1043,7 +1046,7 @@ pub struct drm_event {
|
||||||
pub length: u32,
|
pub length: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl Pod for drm_event { }
|
unsafe impl Pod for drm_event {}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct drm_event_vblank {
|
pub struct drm_event_vblank {
|
||||||
|
|
@ -1055,4 +1058,4 @@ pub struct drm_event_vblank {
|
||||||
pub crtc_id: u32,
|
pub crtc_id: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl Pod for drm_event_vblank { }
|
unsafe impl Pod for drm_event_vblank {}
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,11 @@ use crate::drm::dma::{DmaBuf, DmaBufPlane};
|
||||||
use crate::drm::drm::{Drm, DrmError};
|
use crate::drm::drm::{Drm, DrmError};
|
||||||
use crate::drm::{ModifiedFormat, INVALID_MODIFIER};
|
use crate::drm::{ModifiedFormat, INVALID_MODIFIER};
|
||||||
use crate::format::formats;
|
use crate::format::formats;
|
||||||
use crate::utils::oserror::OsError;
|
|
||||||
use std::fmt::{Debug, Formatter};
|
use std::fmt::{Debug, Formatter};
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
use uapi::{c, Errno, OwnedFd};
|
use uapi::{c, OwnedFd};
|
||||||
|
|
||||||
#[derive(Debug, Error)]
|
#[derive(Debug, Error)]
|
||||||
pub enum GbmError {
|
pub enum GbmError {
|
||||||
|
|
@ -21,8 +20,6 @@ pub enum GbmError {
|
||||||
UnknownFormat,
|
UnknownFormat,
|
||||||
#[error("Could not retrieve a drm-buf fd")]
|
#[error("Could not retrieve a drm-buf fd")]
|
||||||
DrmFd,
|
DrmFd,
|
||||||
#[error("Could not retrieve a GEM handle")]
|
|
||||||
GemHandle(#[source] OsError),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Device = u8;
|
type Device = u8;
|
||||||
|
|
@ -39,16 +36,6 @@ pub const GBM_BO_USE_LINEAR: u32 = 1 << 4;
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub const GBM_BO_USE_PROTECTED: u32 = 1 << 5;
|
pub const GBM_BO_USE_PROTECTED: u32 = 1 << 5;
|
||||||
|
|
||||||
#[allow(non_camel_case_types)]
|
|
||||||
#[repr(C)]
|
|
||||||
union gbm_bo_handle {
|
|
||||||
ptr: *mut u8,
|
|
||||||
s32: i32,
|
|
||||||
u32: u32,
|
|
||||||
s64: i64,
|
|
||||||
u64: u64,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[link(name = "gbm")]
|
#[link(name = "gbm")]
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn gbm_create_device(fd: c::c_int) -> *mut Device;
|
fn gbm_create_device(fd: c::c_int) -> *mut Device;
|
||||||
|
|
@ -72,7 +59,6 @@ extern "C" {
|
||||||
fn gbm_bo_get_modifier(bo: *mut Bo) -> u64;
|
fn gbm_bo_get_modifier(bo: *mut Bo) -> u64;
|
||||||
fn gbm_bo_get_stride_for_plane(bo: *mut Bo, plane: c::c_int) -> u32;
|
fn gbm_bo_get_stride_for_plane(bo: *mut Bo, plane: c::c_int) -> u32;
|
||||||
fn gbm_bo_get_fd_for_plane(bo: *mut Bo, plane: c::c_int) -> c::c_int;
|
fn gbm_bo_get_fd_for_plane(bo: *mut Bo, plane: c::c_int) -> c::c_int;
|
||||||
fn gbm_bo_get_handle_for_plane(bo: *mut Bo, plane: c::c_int) -> gbm_bo_handle;
|
|
||||||
fn gbm_bo_get_offset(bo: *mut Bo, plane: c::c_int) -> u32;
|
fn gbm_bo_get_offset(bo: *mut Bo, plane: c::c_int) -> u32;
|
||||||
fn gbm_bo_get_format(bo: *mut Bo) -> u32;
|
fn gbm_bo_get_format(bo: *mut Bo) -> u32;
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
|
|
@ -97,7 +83,6 @@ struct BoHolder {
|
||||||
pub struct GbmBo {
|
pub struct GbmBo {
|
||||||
_bo: BoHolder,
|
_bo: BoHolder,
|
||||||
dma: DmaBuf,
|
dma: DmaBuf,
|
||||||
handles: Vec<u32>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn export_bo(bo: *mut Bo) -> Result<DmaBuf, GbmError> {
|
unsafe fn export_bo(bo: *mut Bo) -> Result<DmaBuf, GbmError> {
|
||||||
|
|
@ -132,18 +117,6 @@ unsafe fn export_bo(bo: *mut Bo) -> Result<DmaBuf, GbmError> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn export_handles(bo: *mut Bo) -> Result<Vec<u32>, GbmError> {
|
|
||||||
let mut planes = vec![];
|
|
||||||
for plane in 0..gbm_bo_get_plane_count(bo) {
|
|
||||||
let handle = gbm_bo_get_handle_for_plane(bo, plane);
|
|
||||||
if handle.s32 < 0 {
|
|
||||||
return Err(GbmError::GemHandle(Errno::default().into()));
|
|
||||||
}
|
|
||||||
planes.push(handle.u32);
|
|
||||||
}
|
|
||||||
Ok(planes)
|
|
||||||
}
|
|
||||||
|
|
||||||
impl GbmDevice {
|
impl GbmDevice {
|
||||||
pub fn new(drm: &Drm) -> Result<Self, GbmError> {
|
pub fn new(drm: &Drm) -> Result<Self, GbmError> {
|
||||||
let drm = drm.dup_unprivileged()?;
|
let drm = drm.dup_unprivileged()?;
|
||||||
|
|
@ -182,11 +155,9 @@ impl GbmDevice {
|
||||||
}
|
}
|
||||||
let bo = BoHolder { bo };
|
let bo = BoHolder { bo };
|
||||||
let dma = export_bo(bo.bo)?;
|
let dma = export_bo(bo.bo)?;
|
||||||
let handles = export_handles(bo.bo)?;
|
|
||||||
Ok(GbmBo {
|
Ok(GbmBo {
|
||||||
_bo: bo,
|
_bo: bo,
|
||||||
dma,
|
dma,
|
||||||
handles,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -204,10 +175,6 @@ impl GbmBo {
|
||||||
pub fn dma(&self) -> &DmaBuf {
|
pub fn dma(&self) -> &DmaBuf {
|
||||||
&self.dma
|
&self.dma
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn gem(&self) -> &[u32] {
|
|
||||||
&self.handles
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for BoHolder {
|
impl Drop for BoHolder {
|
||||||
|
|
|
||||||
|
|
@ -29,11 +29,11 @@ pub fn formats() -> &'static AHashMap<u32, &'static Format> {
|
||||||
&*FORMATS_MAP
|
&*FORMATS_MAP
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
|
||||||
const fn fourcc_code(a: char, b: char, c: char, d: char) -> u32 {
|
const fn fourcc_code(a: char, b: char, c: char, d: char) -> u32 {
|
||||||
(a as u32) | ((b as u32) << 8) | ((c as u32) << 16) | ((d as u32) << 24)
|
(a as u32) | ((b as u32) << 8) | ((c as u32) << 16) | ((d as u32) << 24)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn debug(fourcc: u32) -> impl Debug {
|
pub fn debug(fourcc: u32) -> impl Debug {
|
||||||
debug_fn(move |fmt| {
|
debug_fn(move |fmt| {
|
||||||
fmt.write_char(fourcc as u8 as char)?;
|
fmt.write_char(fourcc as u8 as char)?;
|
||||||
|
|
|
||||||
|
|
@ -284,6 +284,7 @@ impl<'a> UdevListEntry<'a> {
|
||||||
|
|
||||||
macro_rules! strfn {
|
macro_rules! strfn {
|
||||||
($f:ident, $raw:ident) => {
|
($f:ident, $raw:ident) => {
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn $f(&self) -> Option<&CStr> {
|
pub fn $f(&self) -> Option<&CStr> {
|
||||||
let res = unsafe { $raw(self.device) };
|
let res = unsafe { $raw(self.device) };
|
||||||
if res.is_null() {
|
if res.is_null() {
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ pub mod debug_fn;
|
||||||
pub mod errorfmt;
|
pub mod errorfmt;
|
||||||
pub mod hex;
|
pub mod hex;
|
||||||
pub mod linkedlist;
|
pub mod linkedlist;
|
||||||
|
pub mod nonblock;
|
||||||
pub mod numcell;
|
pub mod numcell;
|
||||||
pub mod oserror;
|
pub mod oserror;
|
||||||
pub mod ptr_ext;
|
pub mod ptr_ext;
|
||||||
|
|
@ -21,4 +22,3 @@ pub mod tri;
|
||||||
pub mod vasprintf;
|
pub mod vasprintf;
|
||||||
pub mod vec_ext;
|
pub mod vec_ext;
|
||||||
pub mod vecstorage;
|
pub mod vecstorage;
|
||||||
pub mod nonblock;
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
use uapi::{c};
|
|
||||||
use crate::utils::oserror::OsError;
|
use crate::utils::oserror::OsError;
|
||||||
|
use uapi::c;
|
||||||
|
|
||||||
pub fn set_nonblock(fd: c::c_int) -> Result<(), OsError> {
|
pub fn set_nonblock(fd: c::c_int) -> Result<(), OsError> {
|
||||||
let fl = uapi::fcntl_getfl(fd)?;
|
let fl = uapi::fcntl_getfl(fd)?;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue