renderdoc_api/
lib.rs

1extern crate renderdoc_api_sys as sys;
2#[cfg(unix)]
3extern crate libc;
4#[cfg(windows)]
5extern crate kernel32;
6#[cfg(windows)]
7extern crate winapi;
8
9use std::mem;
10
11use std::os::raw::{c_int, c_char};
12
13pub struct Context {
14    table: &'static sys::RENDERDOC_API_1_1_1,
15}
16
17impl Context {
18    pub fn new() -> Option<Self> {
19        #[cfg(unix)]
20        let entry = unsafe {
21            let lib = libc::dlopen(b"librenderdoc.so\0".as_ptr() as *const c_char,
22                                   libc::RTLD_NOLOAD);
23            if lib.is_null() { return None; }
24            let entry = libc::dlsym(lib, b"RENDERDOC_GetAPI\0".as_ptr() as *const c_char);
25            if entry.is_null() { return None; }
26            mem::transmute::<_, sys::pRENDERDOC_GetAPI>(entry).unwrap()
27        };
28
29        #[cfg(windows)]
30        let entry = unsafe {
31            // No drop needed here
32            let module = kernel32::GetModuleHandleA(b"renderdoc.dll\0".as_ptr() as *const c_char);
33            if module.is_null() { return None; }
34            let entry = kernel32::GetProcAddress(module, b"RENDERDOC_GetAPI\0".as_ptr() as *const c_char);
35            if entry.is_null() { return None; }
36            mem::transmute::<_, sys::pRENDERDOC_GetAPI>(entry).unwrap()
37        };
38
39        unsafe {
40            let mut table: *mut sys::RENDERDOC_API_1_1_1 = mem::uninitialized();
41            let status = entry(sys::eRENDERDOC_API_Version_1_1_1, &mut table as *mut _ as *mut _);
42            if status == 0 { return None; }
43            Some(Context { table: &*table })
44        }
45    }
46
47    pub fn get_api_version(&self) -> (c_int, c_int, c_int) {
48        unsafe {
49            let mut result: (c_int, c_int, c_int) = mem::uninitialized();
50            self.table.GetAPIVersion.unwrap()(&mut result.0, &mut result.1, &mut result.2);
51            result
52        }
53    }
54
55    /// Immediately begin a frame capture
56    ///
57    /// # Safety
58    /// `device` and `window` must be pointers supported by renderdoc for their respective types, or null.
59    pub unsafe fn start_frame_capture(&self, device: sys::RENDERDOC_DevicePointer, window: sys::RENDERDOC_WindowHandle) {
60        self.table.StartFrameCapture.unwrap()(device, window);
61    }
62
63    pub fn is_frame_capturing(&self) -> bool { unsafe { self.table.IsFrameCapturing.unwrap()() != 0 } }
64
65    /// Complete a frame capture began with `start_frame_capture`
66    ///
67    /// # Safety
68    /// `device` and `window` must be pointers supported by renderdoc for their respective types, or null.
69    pub unsafe fn end_frame_capture(&self, device: sys::RENDERDOC_DevicePointer, window: sys::RENDERDOC_WindowHandle) {
70        self.table.EndFrameCapture.unwrap()(device, window);
71    }
72}