libdrm_amdgpu_sys/drm_mode/
property_blob.rs

1use crate::{bindings, LibDrm};
2use core::ptr::addr_of;
3
4pub use bindings::drmModePropertyBlobPtr;
5
6#[allow(dead_code)]
7#[derive(Clone)]
8pub struct drmModePropertyBlob {
9    pub(crate) ptr: drmModePropertyBlobPtr,
10    pub(crate) lib: LibDrm,
11}
12
13impl LibDrm {
14    pub fn get_drm_mode_property_blob(&self, fd: i32, blob_id: u32) -> Option<drmModePropertyBlob> {
15        #[cfg(feature = "link_drm")]
16        let func = bindings::drmModeGetPropertyBlob;
17        #[cfg(feature = "dynamic_loading")]
18        let func = self.libdrm.drmModeGetPropertyBlob;
19
20        let blob_ptr = unsafe { func(fd, blob_id) };
21
22        if blob_ptr.is_null() {
23            None
24        } else {
25            Some(drmModePropertyBlob { ptr: blob_ptr, lib: self.clone() })
26        }
27    }
28}
29
30impl drmModePropertyBlob {
31    #[cfg(feature = "link_drm")]
32    pub fn get(fd: i32, blob_id: u32) -> Option<Self> {
33        let blob_ptr = unsafe { bindings::drmModeGetPropertyBlob(
34            fd,
35            blob_id,
36        ) };
37
38        if blob_ptr.is_null() {
39            None
40        } else {
41            Some(Self { ptr: blob_ptr, lib: LibDrm::new().unwrap() })
42        }
43    }
44
45    pub fn id(&self) -> u32 {
46        unsafe { addr_of!((*self.ptr).id).read() }
47    }
48
49    pub fn length(&self) -> u32 {
50        unsafe { addr_of!((*self.ptr).length).read() }
51    }
52
53    pub fn data(&self) -> Vec<u8> {
54        let ptr = unsafe { addr_of!((*self.ptr).data).read() };
55        let len = self.length() as usize;
56
57        if ptr.is_null() {
58            Vec::new()
59        } else {
60            unsafe { std::slice::from_raw_parts(ptr as *const u8, len) }.to_vec()
61        }
62    }
63}
64
65impl Drop for drmModePropertyBlob {
66    fn drop(&mut self) {
67        #[cfg(feature = "link_drm")]
68        let func = bindings::drmModeFreePropertyBlob;
69        #[cfg(feature = "dynamic_loading")]
70        let func = self.lib.libdrm.drmModeFreePropertyBlob;
71
72	    unsafe { func(self.ptr); }
73    }
74}