libdrm_amdgpu_sys/drm_mode/
property_blob.rs1use 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}