aboutsummaryrefslogtreecommitdiffstats
path: root/src/x11/headless.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/x11/headless.rs')
-rw-r--r--src/x11/headless.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/x11/headless.rs b/src/x11/headless.rs
new file mode 100644
index 0000000..4f4eb16
--- /dev/null
+++ b/src/x11/headless.rs
@@ -0,0 +1,47 @@
+use HeadlessRendererBuilder;
+use libc;
+use std::{mem, ptr};
+use super::ffi;
+
+pub struct HeadlessContext {
+ context: ffi::OSMesaContext,
+ buffer: Vec<u32>,
+ width: uint,
+ height: uint,
+}
+
+impl HeadlessContext {
+ pub fn new(builder: HeadlessRendererBuilder) -> Result<HeadlessContext, String> {
+ Ok(HeadlessContext {
+ width: builder.dimensions.0,
+ height: builder.dimensions.1,
+ buffer: Vec::from_elem(builder.dimensions.0 * builder.dimensions.1, unsafe { mem::uninitialized() }),
+ context: unsafe {
+ // TODO: check errors
+ ffi::OSMesaCreateContext(0x1908, ptr::null())
+ }
+ })
+ }
+
+ pub unsafe fn make_current(&self) {
+ ffi::OSMesaMakeCurrent(self.context,
+ self.buffer.as_ptr() as *mut libc::c_void,
+ 0x1401, self.width as libc::c_int, self.height as libc::c_int);
+ }
+
+ pub fn get_proc_address(&self, addr: &str) -> *const () {
+ use std::c_str::ToCStr;
+
+ unsafe {
+ addr.with_c_str(|s| {
+ ffi::OSMesaGetProcAddress(mem::transmute(s)) as *const ()
+ })
+ }
+ }
+}
+
+impl Drop for HeadlessContext {
+ fn drop(&mut self) {
+ unsafe { ffi::OSMesaDestroyContext(self.context) }
+ }
+}