Implemented gl_core flag

This commit is contained in:
Dzmitry Malyshau 2015-04-29 23:05:47 -04:00
parent c1ca5d1d87
commit a42f1f5833
7 changed files with 70 additions and 21 deletions

View file

@ -9,6 +9,7 @@ use libc;
use Api;
use BuilderAttribs;
use CreationError;
use GlContext;
use GlRequest;
use PixelFormat;
@ -334,7 +335,6 @@ impl Window {
Some(window) => window,
None => { return Err(OsError(format!("Couldn't create NSWindow"))); },
};
let view = match Window::create_view(*window) {
Some(view) => view,
None => { return Err(OsError(format!("Couldn't create NSView"))); },
@ -469,18 +469,17 @@ impl Window {
}
}
fn create_context(view: id, builder: &BuilderAttribs) -> (Option<IdRef>, Option<PixelFormat>) {
let profile = match builder.gl_version {
GlRequest::Latest => NSOpenGLProfileVersion4_1Core as u32,
GlRequest::Specific(Api::OpenGl, (1 ... 2, _)) => NSOpenGLProfileVersionLegacy as u32,
GlRequest::Specific(Api::OpenGl, (3, 0)) => NSOpenGLProfileVersionLegacy as u32,
GlRequest::Specific(Api::OpenGl, (3, 1 ... 2)) => NSOpenGLProfileVersion3_2Core as u32,
GlRequest::Specific(Api::OpenGl, _) => NSOpenGLProfileVersion4_1Core as u32,
GlRequest::Specific(_, _) => panic!("Only the OpenGL API is supported"), // FIXME: return Result
GlRequest::GlThenGles { opengl_version: (1 ... 2, _), .. } => NSOpenGLProfileVersionLegacy as u32,
GlRequest::GlThenGles { opengl_version: (3, 0), .. } => NSOpenGLProfileVersionLegacy as u32,
GlRequest::GlThenGles { opengl_version: (3, 1 ... 2), .. } => NSOpenGLProfileVersion3_2Core as u32,
GlRequest::GlThenGles { .. } => NSOpenGLProfileVersion4_1Core as u32,
fn create_context(view: id, builder: &BuilderAttribs) -> Result<(Option<IdRef>, Option<PixelFormat>), CreationError> {
let profile = match (builder.gl_version, builder.gl_version.to_gl_version(), builder.gl_core) {
(GlRequest::Latest, _, Some(false)) => NSOpenGLProfileVersionLegacy as u32,
(GlRequest::Latest, _, _) => NSOpenGLProfileVersion4_1Core as u32,
(_, Some(1 ... 2, _), Some(true)) |
(_, Some(3 ... 4, _), Some(false)) =>
return Err(CreationError::NotSupported),
(_, Some(1 ... 2, _), _) => NSOpenGLProfileVersionLegacy as u32,
(_, Some(3, 0 ... 2), _) => NSOpenGLProfileVersion3_2Core as u32,
(_, Some(3 ... 4, _), _) => NSOpenGLProfileVersion4_1Core as u32,
_ => return Err(CreationError::NotSupported),
};
// NOTE: OS X no longer has the concept of setting individual
@ -517,7 +516,7 @@ impl Window {
// attribute list must be null terminated.
attributes.push(0);
unsafe {
Ok(unsafe {
let pixelformat = IdRef::new(NSOpenGLPixelFormat::alloc(nil).initWithAttributes_(&attributes));
if let Some(pixelformat) = pixelformat.non_nil() {
@ -575,7 +574,7 @@ impl Window {
} else {
(None, None)
}
}
})
}
pub fn is_closed(&self) -> bool {

View file

@ -52,6 +52,16 @@ impl Context {
},
}
if let Some(core) = builder.gl_core {
attributes.push(ffi::glx_extra::CONTEXT_PROFILE_MASK_ARB as libc::c_int);
attributes.push(if core {
ffi::glx_extra::CONTEXT_CORE_PROFILE_BIT_ARB
} else {
ffi::glx_extra::CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB
} as libc::c_int
);
}
if builder.gl_debug {
attributes.push(ffi::glx_extra::CONTEXT_FLAGS_ARB as libc::c_int);
attributes.push(ffi::glx_extra::CONTEXT_DEBUG_BIT_ARB as libc::c_int);
@ -184,8 +194,6 @@ unsafe impl Sync for Context {}
impl Drop for Context {
fn drop(&mut self) {
use std::ptr;
unsafe {
// we don't call MakeCurrent(0, 0) because we are not sure that the context
// is still the current one

View file

@ -374,6 +374,22 @@ unsafe fn create_context(extra: Option<(&gl::wgl_extra::Wgl, &BuilderAttribs<'st
},
}
if let Some(core) = builder.gl_core {
if is_extension_supported(extra_functions, hdc,
"WGL_ARB_create_context_profile")
{
attributes.push(gl::wgl_extra::CONTEXT_PROFILE_MASK_ARB as libc::c_int);
attributes.push(if core {
gl::wgl_extra::CONTEXT_CORE_PROFILE_BIT_ARB
} else {
gl::wgl_extra::CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB
} as libc::c_int
);
} else {
return Err(CreationError::NotSupported);
}
}
if builder.gl_debug {
attributes.push(gl::wgl_extra::CONTEXT_FLAGS_ARB as libc::c_int);
attributes.push(gl::wgl_extra::CONTEXT_DEBUG_BIT_ARB as libc::c_int);