Skip to main content

drm_mode/
drm_mode.rs

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}