From b3044809c229cdda865728308b2653b116bb63ce Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 12 May 2015 20:59:45 +0200 Subject: [PATCH] Fixes in EGL context creation --- build.rs | 9 +++++++-- src/api/egl/mod.rs | 31 ++++++++++++++++++++++--------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/build.rs b/build.rs index d73eb34c..a4f744d0 100644 --- a/build.rs +++ b/build.rs @@ -65,7 +65,9 @@ fn main() { gl_generator::registry::Ns::Egl, gl_generator::Fallbacks::All, khronos_api::EGL_XML, - vec![], + vec![ + "EGL_KHR_create_context".to_string() + ], "1.5", "core", &mut file).unwrap(); } @@ -74,7 +76,10 @@ fn main() { gl_generator::generate_bindings(gl_generator::StaticStructGenerator, gl_generator::registry::Ns::Egl, 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(); } diff --git a/src/api/egl/mod.rs b/src/api/egl/mod.rs index 8f9ebcfe..a97ef624 100644 --- a/src/api/egl/mod.rs +++ b/src/api/egl/mod.rs @@ -9,7 +9,7 @@ use PixelFormat; use Api; use libc; -use std::ffi::CString; +use std::ffi::{CStr, CString}; use std::{mem, ptr}; pub mod ffi; @@ -323,24 +323,37 @@ unsafe fn create_context(egl: &ffi::egl::Egl, display: ffi::egl::types::EGLDispl gl_debug: bool) -> Result { + 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![]; - 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(version.0 as i32); context_attributes.push(ffi::egl::CONTEXT_MINOR_VERSION as i32); context_attributes.push(version.1 as i32); if gl_debug { - context_attributes.push(ffi::egl::CONTEXT_OPENGL_DEBUG as i32); - context_attributes.push(ffi::egl::TRUE as i32); + if egl_version >= &(1, 5) { + 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 { - if api == Api::OpenGlEs { - context_attributes.push(ffi::egl::CONTEXT_CLIENT_VERSION as i32); - context_attributes.push(version.0 as i32); - } + } else if egl_version >= &(1, 3) && api == Api::OpenGlEs { + context_attributes.push(ffi::egl::CONTEXT_CLIENT_VERSION as i32); + context_attributes.push(version.0 as i32); } context_attributes.push(ffi::egl::NONE as i32);