aboutsummaryrefslogtreecommitdiffstats
path: root/src/osx/headless.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/osx/headless.rs')
-rw-r--r--src/osx/headless.rs110
1 files changed, 0 insertions, 110 deletions
diff --git a/src/osx/headless.rs b/src/osx/headless.rs
deleted file mode 100644
index cc19457..0000000
--- a/src/osx/headless.rs
+++ /dev/null
@@ -1,110 +0,0 @@
-use CreationError;
-use CreationError::OsError;
-use BuilderAttribs;
-use libc;
-use std::ptr;
-
-use core_foundation::base::TCFType;
-use core_foundation::string::CFString;
-use core_foundation::bundle::{CFBundleGetBundleWithIdentifier, CFBundleGetFunctionPointerForName};
-use cocoa::base::{id, nil};
-use cocoa::appkit::*;
-
-mod gl {
- include!(concat!(env!("OUT_DIR"), "/gl_bindings.rs"));
-}
-
-static mut framebuffer: u32 = 0;
-static mut texture: u32 = 0;
-
-pub struct HeadlessContext {
- width: u32,
- height: u32,
- context: id,
-}
-
-impl HeadlessContext {
- pub fn new(builder: BuilderAttribs) -> Result<HeadlessContext, CreationError> {
- let (width, height) = builder.dimensions.unwrap_or((1024, 768));
- let context = unsafe {
- let attributes = [
- NSOpenGLPFADoubleBuffer as u32,
- NSOpenGLPFAClosestPolicy as u32,
- NSOpenGLPFAColorSize as u32, 24,
- NSOpenGLPFAAlphaSize as u32, 8,
- NSOpenGLPFADepthSize as u32, 24,
- NSOpenGLPFAStencilSize as u32, 8,
- NSOpenGLPFAOffScreen as u32,
- 0
- ];
-
- let pixelformat = NSOpenGLPixelFormat::alloc(nil).initWithAttributes_(&attributes);
- if pixelformat == nil {
- return Err(OsError(format!("Could not create the pixel format")));
- }
- let context = NSOpenGLContext::alloc(nil).initWithFormat_shareContext_(pixelformat, nil);
- if context == nil {
- return Err(OsError(format!("Could not create the rendering context")));
- }
- context
- };
-
- let headless = HeadlessContext {
- width: width,
- height: height,
- context: context,
- };
-
- // Load the function pointers as we need them to create the FBO
- gl::load_with(|s| headless.get_proc_address(s) as *const libc::c_void);
-
- Ok(headless)
- }
-
- pub unsafe fn make_current(&self) {
- self.context.makeCurrentContext();
-
- gl::GenFramebuffersEXT(1, &mut framebuffer);
- gl::BindFramebufferEXT(gl::FRAMEBUFFER_EXT, framebuffer);
- gl::GenTextures(1, &mut texture);
- gl::BindTexture(gl::TEXTURE_2D, texture);
- gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::LINEAR as i32);
- gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::LINEAR as i32);
- gl::TexImage2D(gl::TEXTURE_2D, 0, gl::RGBA8 as i32, self.width as i32, self.height as i32,
- 0, gl::RGBA, gl::UNSIGNED_BYTE, ptr::null());
- gl::FramebufferTexture2DEXT(gl::FRAMEBUFFER_EXT, gl::COLOR_ATTACHMENT0_EXT,
- gl::TEXTURE_2D, texture, 0);
- let status = gl::CheckFramebufferStatusEXT(gl::FRAMEBUFFER_EXT);
- if status != gl::FRAMEBUFFER_COMPLETE_EXT {
- panic!("Error while creating the framebuffer");
- }
- }
-
- pub fn get_proc_address(&self, _addr: &str) -> *const () {
- let symbol_name: CFString = _addr.parse().unwrap();
- let framework_name: CFString = "com.apple.opengl".parse().unwrap();
- let framework = unsafe {
- CFBundleGetBundleWithIdentifier(framework_name.as_concrete_TypeRef())
- };
- let symbol = unsafe {
- CFBundleGetFunctionPointerForName(framework, symbol_name.as_concrete_TypeRef())
- };
- symbol as *const ()
- }
-
- pub fn get_api(&self) -> ::Api {
- ::Api::OpenGl
- }
-}
-
-unsafe impl Send for HeadlessContext {}
-unsafe impl Sync for HeadlessContext {}
-
-impl Drop for HeadlessContext {
- fn drop(&mut self) {
- unsafe {
- gl::DeleteTextures(1, &texture);
- gl::DeleteFramebuffersEXT(1, &framebuffer);
- }
- }
-}