diff --git a/src/backend.rs b/src/backend.rs index 31da3cfb..f497dded 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -8,8 +8,9 @@ use { drm_feedback::DrmFeedback, format::Format, gfx_api::{FdSync, GfxApi, GfxFramebuffer}, - video::drm::{ConnectorType, DrmConnector, DrmError, DrmVersion}, + video::drm::{ConnectorType, DrmError, DrmVersion}, }, + jay_video_types::drm::DrmConnector, std::{ any::Any, error::Error, diff --git a/src/video/drm.rs b/src/video/drm.rs index 53ca3ae5..ee39ad29 100644 --- a/src/video/drm.rs +++ b/src/video/drm.rs @@ -21,17 +21,15 @@ use { drm::sys::{ DRM_CAP_ATOMIC_ASYNC_PAGE_FLIP, DRM_CAP_CURSOR_HEIGHT, DRM_CAP_CURSOR_WIDTH, 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_PLANE, - DRM_MODE_OBJECT_PROPERTY, FORMAT_BLOB_CURRENT, auth_magic, create_lease, drm_event, + FORMAT_BLOB_CURRENT, auth_magic, create_lease, drm_event, drm_event_crtc_sequence, drm_event_vblank, drm_format_modifier, - drm_format_modifier_blob, drop_master, gem_close, get_cap, - get_device_name_from_fd2, get_minor_name_from_fd, get_node_type_from_fd, get_nodes, - get_version, mode_addfb2, mode_atomic, mode_create_blob, mode_destroy_blob, - mode_get_resources, mode_getconnector, mode_getencoder, mode_getplane, - mode_getplaneresources, mode_getprobblob, mode_getproperty, mode_obj_getproperties, - mode_rmfb, mode_supports_get_resources, prime_fd_to_handle, queue_sequence, - revoke_lease, set_client_cap, + drm_format_modifier_blob, drop_master, gem_close, get_cap, get_device_name_from_fd2, + get_minor_name_from_fd, get_node_type_from_fd, get_nodes, get_version, mode_addfb2, + mode_atomic, mode_create_blob, mode_destroy_blob, mode_get_resources, + mode_getconnector, mode_getencoder, mode_getplane, mode_getplaneresources, + mode_getprobblob, mode_getproperty, mode_obj_getproperties, mode_rmfb, + mode_supports_get_resources, prime_fd_to_handle, queue_sequence, revoke_lease, + set_client_cap, }, }, }, @@ -51,6 +49,9 @@ use { }; pub use { consts::*, + jay_video_types::drm::{ + DrmBlob, DrmConnector, DrmCrtc, DrmEncoder, DrmFb, DrmObject, DrmPlane, DrmProperty, + }, sys::{ DRM_CLIENT_CAP_ATOMIC, DRM_MODE_ATOMIC_ALLOW_MODESET, DRM_MODE_ATOMIC_NONBLOCK, DRM_MODE_PAGE_FLIP_ASYNC, DRM_MODE_PAGE_FLIP_EVENT, drm_mode_modeinfo, @@ -719,46 +720,6 @@ pub struct DrmPropertyValue { pub value: u64, } -pub trait DrmObject { - const TYPE: u32; - const NONE: Self; - fn id(&self) -> u32; - fn is_some(&self) -> bool; - fn is_none(&self) -> bool; -} - -macro_rules! drm_obj { - ($name:ident, $ty:expr) => { - #[repr(transparent)] - #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Default, Ord, PartialOrd)] - pub struct $name(pub u32); - - impl DrmObject for $name { - const TYPE: u32 = $ty; - const NONE: Self = Self(0); - - fn id(&self) -> u32 { - self.0 - } - - fn is_some(&self) -> bool { - self.0 != 0 - } - - fn is_none(&self) -> bool { - self.0 == 0 - } - } - }; -} -drm_obj!(DrmCrtc, DRM_MODE_OBJECT_CRTC); -drm_obj!(DrmConnector, DRM_MODE_OBJECT_CONNECTOR); -drm_obj!(DrmEncoder, DRM_MODE_OBJECT_ENCODER); -drm_obj!(DrmProperty, DRM_MODE_OBJECT_PROPERTY); -drm_obj!(DrmFb, DRM_MODE_OBJECT_FB); -drm_obj!(DrmBlob, DRM_MODE_OBJECT_BLOB); -drm_obj!(DrmPlane, DRM_MODE_OBJECT_PLANE); - #[derive(Debug, Default)] pub struct DrmCardResources { pub _min_width: u32, @@ -1115,15 +1076,28 @@ num!(i64); num!(u64); num!(bool); -impl ObjectChangeValue for T -where - T: DrmObject, -{ - fn into_u64(self) -> u64 { - self.id() as u64 - } +macro_rules! drm_object_value { + ($($ty:ty,)*) => { + $( + impl ObjectChangeValue for $ty { + fn into_u64(self) -> u64 { + self.id() as u64 + } + } + )* + }; } +drm_object_value!( + DrmBlob, + DrmConnector, + DrmCrtc, + DrmEncoder, + DrmFb, + DrmPlane, + DrmProperty, +); + #[expect(non_camel_case_types)] #[derive(Copy, Clone, Debug)] pub enum ConnectorType { diff --git a/src/video/drm/sys.rs b/src/video/drm/sys.rs index 715882dc..61f2a766 100644 --- a/src/video/drm/sys.rs +++ b/src/video/drm/sys.rs @@ -408,13 +408,6 @@ pub fn mode_obj_getproperties( Ok(props) } -pub const DRM_MODE_OBJECT_CRTC: u32 = 0xcccccccc; -pub const DRM_MODE_OBJECT_CONNECTOR: u32 = 0xc0c0c0c0; -pub const DRM_MODE_OBJECT_ENCODER: u32 = 0xe0e0e0e0; -pub const DRM_MODE_OBJECT_PROPERTY: u32 = 0xb0b0b0b0; -pub const DRM_MODE_OBJECT_FB: u32 = 0xfbfbfbfb; -pub const DRM_MODE_OBJECT_BLOB: u32 = 0xbbbbbbbb; -pub const DRM_MODE_OBJECT_PLANE: u32 = 0xeeeeeeee; #[expect(dead_code)] pub const DRM_MODE_OBJECT_ANY: u32 = 0; diff --git a/video-types/src/drm.rs b/video-types/src/drm.rs new file mode 100644 index 00000000..26a5ea83 --- /dev/null +++ b/video-types/src/drm.rs @@ -0,0 +1,48 @@ +pub const DRM_MODE_OBJECT_CRTC: u32 = 0xcccccccc; +pub const DRM_MODE_OBJECT_CONNECTOR: u32 = 0xc0c0c0c0; +pub const DRM_MODE_OBJECT_ENCODER: u32 = 0xe0e0e0e0; +pub const DRM_MODE_OBJECT_PROPERTY: u32 = 0xb0b0b0b0; +pub const DRM_MODE_OBJECT_FB: u32 = 0xfbfbfbfb; +pub const DRM_MODE_OBJECT_BLOB: u32 = 0xbbbbbbbb; +pub const DRM_MODE_OBJECT_PLANE: u32 = 0xeeeeeeee; + +pub trait DrmObject { + const TYPE: u32; + const NONE: Self; + fn id(&self) -> u32; + fn is_some(&self) -> bool; + fn is_none(&self) -> bool; +} + +macro_rules! drm_obj { + ($name:ident, $ty:expr) => { + #[repr(transparent)] + #[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Default, Ord, PartialOrd)] + pub struct $name(pub u32); + + impl DrmObject for $name { + const TYPE: u32 = $ty; + const NONE: Self = Self(0); + + fn id(&self) -> u32 { + self.0 + } + + fn is_some(&self) -> bool { + self.0 != 0 + } + + fn is_none(&self) -> bool { + self.0 == 0 + } + } + }; +} + +drm_obj!(DrmCrtc, DRM_MODE_OBJECT_CRTC); +drm_obj!(DrmConnector, DRM_MODE_OBJECT_CONNECTOR); +drm_obj!(DrmEncoder, DRM_MODE_OBJECT_ENCODER); +drm_obj!(DrmProperty, DRM_MODE_OBJECT_PROPERTY); +drm_obj!(DrmFb, DRM_MODE_OBJECT_FB); +drm_obj!(DrmBlob, DRM_MODE_OBJECT_BLOB); +drm_obj!(DrmPlane, DRM_MODE_OBJECT_PLANE); diff --git a/video-types/src/lib.rs b/video-types/src/lib.rs index 52fdd41d..c01c353c 100644 --- a/video-types/src/lib.rs +++ b/video-types/src/lib.rs @@ -1,3 +1,4 @@ +pub mod drm; pub mod dmabuf; pub type Modifier = u64;