1use libdrm_amdgpu_sys::{LibDrm, drmModePropType};
2use std::fs::File;
3use std::os::fd::AsRawFd;
4
5fn main() {
6 let f = File::open("/dev/dri/card0").unwrap();
7 let fd = f.as_raw_fd();
8
9 let libdrm = LibDrm::new().unwrap();
10 libdrm.set_all_client_caps(fd);
11 let drm_mode_res = libdrm.get_drm_mode_resources(fd).unwrap();
12 let current_connectors = drm_mode_res.get_drm_mode_all_connector_current(fd);
13
14 for connector in current_connectors.iter() {
15 println!(
16 "Connector {} ({}-{}), {}",
17 connector.connector_id(),
18 connector.connector_type(),
19 connector.connector_type_id(),
20 connector.connection(),
21 );
22
23 let modes = connector.get_modes();
24
25 if !modes.is_empty() {
26 println!(" Modes");
27 for mode in connector.get_modes() {
28 println!(
29 " {}x{}@{:.2}{}{}",
30 mode.vdisplay,
31 mode.hdisplay,
32 mode.refresh_rate(),
33 if mode.type_is_preferred() { " preferred" } else { "" },
34 if mode.type_is_driver() { " driver" } else { "" },
35 );
36 }
37 }
38
39 if let Some(conn_prop) = connector.get_drm_mode_connector_properties(fd) {
40 let mode_props = conn_prop.get_mode_property(fd);
41
42 for (prop, value) in mode_props {
43 let type_ = prop.property_type();
44
45 println!(
46 " {:?}, id: {}, value: {}, type: {}",
47 prop.name(),
48 prop.prop_id(),
49 value,
50 type_,
51 );
52
53 match type_ {
54 drmModePropType::RANGE => println!(" values: {:?}", prop.values()),
55 drmModePropType::ENUM => {
56 print!(" enums: [");
57 for enum_ in prop.enums().iter() {
58 print!("{:?}={}, ", enum_.name(), enum_.value);
59 }
60 println!("] ");
61 },
62 drmModePropType::BLOB => {
63 if let Some(b) = libdrm.get_drm_mode_property_blob(fd, value as u32) {
64 print!(" blob:");
65
66 for (i, byte) in b.data().iter().enumerate() {
67 if (i % 16) == 0 { print!("\n "); }
68 print!("{byte:02x}");
69 }
70
71 println!();
72 }
73 },
74 _ => {},
75 }
76 }
77 }
78 println!();
79 }
80}