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 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 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 pub unsafe fn end_frame_capture(&self, device: sys::RENDERDOC_DevicePointer, window: sys::RENDERDOC_WindowHandle) {
70 self.table.EndFrameCapture.unwrap()(device, window);
71 }
72}