1#![allow(non_camel_case_types)]
13
14use std::os::raw::{c_char, c_int, c_void};
15
16pub enum drmtap_ctx {}
18
19#[repr(C)]
21pub struct drmtap_config {
22 pub device_path: *const c_char,
23 pub crtc_id: u32,
24 pub helper_path: *const c_char,
25 pub debug: c_int,
26}
27
28#[repr(C)]
30#[derive(Clone, Copy)]
31pub struct drmtap_display {
32 pub crtc_id: u32,
33 pub connector_id: u32,
34 pub name: [c_char; 32],
35 pub x: u32,
36 pub y: u32,
37 pub width: u32,
38 pub height: u32,
39 pub refresh_hz: u32,
40 pub active: c_int,
41}
42
43#[repr(C)]
45pub struct drmtap_frame_info {
46 pub data: *mut c_void,
47 pub dma_buf_fd: c_int,
48 pub width: u32,
49 pub height: u32,
50 pub stride: u32,
51 pub format: u32,
52 pub modifier: u64,
53 pub fb_id: u32,
54 pub _priv: *mut c_void,
55}
56
57#[repr(C)]
59pub struct drmtap_cursor_info {
60 pub x: i32,
61 pub y: i32,
62 pub hot_x: i32,
63 pub hot_y: i32,
64 pub width: u32,
65 pub height: u32,
66 pub pixels: *mut u32,
67 pub visible: c_int,
68 pub _priv: *mut c_void,
69}
70
71#[repr(C)]
73pub struct drmtap_rect {
74 pub x: u32,
75 pub y: u32,
76 pub w: u32,
77 pub h: u32,
78}
79
80pub const DRMTAP_EOTF_SDR: u32 = 0;
82pub const DRMTAP_EOTF_PQ: u32 = 2;
83pub const DRMTAP_EOTF_HLG: u32 = 3;
84
85#[repr(C)]
89pub struct drmtap_dmabuf_desc {
90 pub dma_buf_fd: c_int,
91 pub width: u32,
92 pub height: u32,
93 pub format: u32,
94 pub modifier: u64,
95 pub fb_id: u32,
96 pub num_planes: u32,
97 pub offsets: [u32; 4],
98 pub pitches: [u32; 4],
99 pub hdr_eotf: u32,
100 pub hdr_max_nits: u32,
101}
102
103extern "C" {
104 pub fn drmtap_version() -> c_int;
106
107 pub fn drmtap_open(config: *const drmtap_config) -> *mut drmtap_ctx;
109 pub fn drmtap_close(ctx: *mut drmtap_ctx);
110
111 pub fn drmtap_open_render(render_node: *const c_char) -> *mut drmtap_ctx;
113 pub fn drmtap_convert_dmabuf(
114 ctx: *mut drmtap_ctx,
115 desc: *const drmtap_dmabuf_desc,
116 frame: *mut drmtap_frame_info,
117 ) -> c_int;
118
119 pub fn drmtap_list_displays(
121 ctx: *mut drmtap_ctx,
122 displays: *mut drmtap_display,
123 max_count: c_int,
124 ) -> c_int;
125 pub fn drmtap_displays_changed(ctx: *mut drmtap_ctx) -> c_int;
126
127 pub fn drmtap_grab(ctx: *mut drmtap_ctx, frame: *mut drmtap_frame_info) -> c_int;
129 pub fn drmtap_grab_mapped(ctx: *mut drmtap_ctx, frame: *mut drmtap_frame_info) -> c_int;
130 pub fn drmtap_frame_release(ctx: *mut drmtap_ctx, frame: *mut drmtap_frame_info);
131
132 pub fn drmtap_get_cursor(ctx: *mut drmtap_ctx, cursor: *mut drmtap_cursor_info) -> c_int;
134 pub fn drmtap_cursor_release(ctx: *mut drmtap_ctx, cursor: *mut drmtap_cursor_info);
135
136 pub fn drmtap_error(ctx: *const drmtap_ctx) -> *const c_char;
138 pub fn drmtap_gpu_driver(ctx: *mut drmtap_ctx) -> *const c_char;
139
140 pub fn drmtap_deswizzle(
142 src: *const c_void,
143 dst: *mut c_void,
144 width: u32,
145 height: u32,
146 src_stride: u32,
147 dst_stride: u32,
148 modifier: u64,
149 src_size: usize,
150 ) -> c_int;
151 pub fn drmtap_convert_format(
152 src: *const c_void,
153 dst: *mut c_void,
154 width: u32,
155 height: u32,
156 src_stride: u32,
157 dst_stride: u32,
158 src_format: u32,
159 dst_format: u32,
160 ) -> c_int;
161
162 pub fn drmtap_diff_frames(
164 frame_a: *const c_void,
165 frame_b: *const c_void,
166 width: u32,
167 height: u32,
168 stride: u32,
169 rects_out: *mut drmtap_rect,
170 max_rects: c_int,
171 tile_size: c_int,
172 ) -> c_int;
173}
174
175#[cfg(test)]
176mod tests {
177 use super::*;
178
179 #[test]
180 fn test_version() {
181 let major: i32 = env!("CARGO_PKG_VERSION_MAJOR").parse().unwrap();
185 let minor: i32 = env!("CARGO_PKG_VERSION_MINOR").parse().unwrap();
186 let patch: i32 = env!("CARGO_PKG_VERSION_PATCH").parse().unwrap();
187 let expected = (major << 16) | (minor << 8) | patch;
188 let v = unsafe { drmtap_version() };
189 assert_eq!(v, expected);
190 }
191
192 #[test]
193 fn test_config_size() {
194 assert!(std::mem::size_of::<drmtap_config>() > 0);
196 assert!(std::mem::size_of::<drmtap_display>() > 0);
197 assert!(std::mem::size_of::<drmtap_frame_info>() > 0);
198 assert!(std::mem::size_of::<drmtap_cursor_info>() > 0);
199 }
200}