libdrm_amdgpu_sys/drm_mode/
mod.rs

1mod resource;
2pub use resource::*;
3
4mod connector;
5pub use connector::*;
6
7mod crtc;
8pub use crtc::*;
9
10mod object_property;
11pub use object_property::*;
12
13mod property;
14pub use property::*;
15
16mod property_blob;
17pub use property_blob::*;
18
19mod mode_info;
20#[allow(unused_imports)]
21pub use mode_info::*;
22
23// TODO: encoder
24
25pub(crate) fn c_char_to_string(c: &[core::ffi::c_char]) -> String {
26    let c_name: Vec<u8> = c.iter().map(|c| *c as u8).collect();
27
28    if let Some(index) = c_name.iter().position(|&x| x == 0) {
29        String::from_utf8_lossy(c_name.get(..index).unwrap_or_default())
30    } else {
31        String::from_utf8_lossy(&c_name)
32    }.to_string()
33}
34
35use crate::bindings;
36use crate::LibDrm;
37
38pub use bindings::{
39    DRM_CLIENT_CAP_STEREO_3D,
40    DRM_CLIENT_CAP_UNIVERSAL_PLANES,
41    DRM_CLIENT_CAP_ATOMIC,
42    DRM_CLIENT_CAP_ASPECT_RATIO,
43    DRM_CLIENT_CAP_WRITEBACK_CONNECTORS,
44    DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT,
45};
46
47impl LibDrm {
48    pub fn set_client_caps(&self, fd: i32, cap: u64, val: u64) -> i32 {
49        #[cfg(feature = "link_drm")]
50        let func = bindings::drmSetClientCap;
51        #[cfg(feature = "dynamic_loading")]
52        let func = self.libdrm.drmSetClientCap;
53
54        unsafe { func(fd, cap, val) }
55    }
56
57    pub fn set_all_client_caps(&self, fd: i32) {
58        for cap in [
59            DRM_CLIENT_CAP_STEREO_3D,
60            DRM_CLIENT_CAP_UNIVERSAL_PLANES,
61            DRM_CLIENT_CAP_ATOMIC,
62            DRM_CLIENT_CAP_ASPECT_RATIO,
63            DRM_CLIENT_CAP_WRITEBACK_CONNECTORS,
64            DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT,
65        ] {
66            let _ = self.set_client_caps(fd, cap as u64, 1);
67        }
68    }
69}
70
71#[cfg(feature = "link_drm")]
72pub fn set_client_caps(fd: i32, cap: u64, val: u64) -> i32 {
73    unsafe { bindings::drmSetClientCap(fd, cap, val) }
74}
75
76#[cfg(feature = "link_drm")]
77pub fn set_all_client_caps(fd: i32) {
78    for cap in [
79        DRM_CLIENT_CAP_STEREO_3D,
80        DRM_CLIENT_CAP_UNIVERSAL_PLANES,
81        DRM_CLIENT_CAP_ATOMIC,
82        DRM_CLIENT_CAP_ASPECT_RATIO,
83        DRM_CLIENT_CAP_WRITEBACK_CONNECTORS,
84        DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT,
85    ] {
86        let _ = unsafe { bindings::drmSetClientCap(fd, cap as u64, 1) };
87    }
88}