Fixes in EGL context creation

This commit is contained in:
Pierre Krieger 2015-05-12 20:59:45 +02:00
parent 3279f15f9f
commit b3044809c2
2 changed files with 29 additions and 11 deletions

View file

@ -65,7 +65,9 @@ fn main() {
gl_generator::registry::Ns::Egl, gl_generator::registry::Ns::Egl,
gl_generator::Fallbacks::All, gl_generator::Fallbacks::All,
khronos_api::EGL_XML, khronos_api::EGL_XML,
vec![], vec![
"EGL_KHR_create_context".to_string()
],
"1.5", "core", &mut file).unwrap(); "1.5", "core", &mut file).unwrap();
} }
@ -74,7 +76,10 @@ fn main() {
gl_generator::generate_bindings(gl_generator::StaticStructGenerator, gl_generator::generate_bindings(gl_generator::StaticStructGenerator,
gl_generator::registry::Ns::Egl, gl_generator::registry::Ns::Egl,
gl_generator::Fallbacks::All, gl_generator::Fallbacks::All,
khronos_api::EGL_XML, vec![], khronos_api::EGL_XML,
vec![
"EGL_KHR_create_context".to_string()
],
"1.5", "core", &mut file).unwrap(); "1.5", "core", &mut file).unwrap();
} }

View file

@ -9,7 +9,7 @@ use PixelFormat;
use Api; use Api;
use libc; use libc;
use std::ffi::CString; use std::ffi::{CStr, CString};
use std::{mem, ptr}; use std::{mem, ptr};
pub mod ffi; pub mod ffi;
@ -323,24 +323,37 @@ unsafe fn create_context(egl: &ffi::egl::Egl, display: ffi::egl::types::EGLDispl
gl_debug: bool) gl_debug: bool)
-> Result<ffi::egl::types::EGLContext, ()> -> Result<ffi::egl::types::EGLContext, ()>
{ {
let extensions = if egl_version >= &(1, 2) {
let p = CStr::from_ptr(egl.QueryString(display, ffi::egl::EXTENSIONS as i32));
String::from_utf8(p.to_bytes().to_vec()).unwrap_or_else(|_| format!(""))
} else {
format!("")
};
let mut context_attributes = vec![]; let mut context_attributes = vec![];
if egl_version >= &(1, 5) { if egl_version >= &(1, 5) ||
extensions.contains("EGL_KHR_create_context ") ||
extensions.ends_with("EGL_KHR_create_context")
{
context_attributes.push(ffi::egl::CONTEXT_MAJOR_VERSION as i32); context_attributes.push(ffi::egl::CONTEXT_MAJOR_VERSION as i32);
context_attributes.push(version.0 as i32); context_attributes.push(version.0 as i32);
context_attributes.push(ffi::egl::CONTEXT_MINOR_VERSION as i32); context_attributes.push(ffi::egl::CONTEXT_MINOR_VERSION as i32);
context_attributes.push(version.1 as i32); context_attributes.push(version.1 as i32);
if gl_debug { if gl_debug {
context_attributes.push(ffi::egl::CONTEXT_OPENGL_DEBUG as i32); if egl_version >= &(1, 5) {
context_attributes.push(ffi::egl::TRUE as i32); context_attributes.push(ffi::egl::CONTEXT_OPENGL_DEBUG as i32);
context_attributes.push(ffi::egl::TRUE as i32);
} else {
context_attributes.push(ffi::egl::CONTEXT_FLAGS_KHR as i32);
context_attributes.push(ffi::egl::CONTEXT_OPENGL_DEBUG_BIT_KHR as i32);
}
} }
} else { } else if egl_version >= &(1, 3) && api == Api::OpenGlEs {
if api == Api::OpenGlEs { context_attributes.push(ffi::egl::CONTEXT_CLIENT_VERSION as i32);
context_attributes.push(ffi::egl::CONTEXT_CLIENT_VERSION as i32); context_attributes.push(version.0 as i32);
context_attributes.push(version.0 as i32);
}
} }
context_attributes.push(ffi::egl::NONE as i32); context_attributes.push(ffi::egl::NONE as i32);