Some GPU/driver combinations have glxCreateContextAttribsARB present, but it fails with an X error. In this case, catch the X error and fall back to the old method of creating a context.

This commit is contained in:
Glenn Watson 2015-01-22 12:02:02 +10:00
parent 862baf8220
commit 19475f8521
2 changed files with 26 additions and 2 deletions

View file

@ -16,10 +16,18 @@ mod monitor;
static THREAD_INIT: Once = ONCE_INIT;
fn x_error_callback(_: *mut ffi::Display, event: *mut ffi::XErrorEvent) -> libc::c_int {
unsafe {
println!("x error code={} major={} minor={}!", (*event).error_code, (*event).request_code, (*event).minor_code);
}
0
}
fn ensure_thread_init() {
THREAD_INIT.call_once(|| {
unsafe {
ffi::XInitThreads();
ffi::XSetErrorHandler(x_error_callback);
}
});
}
@ -322,13 +330,17 @@ impl Window {
ptr::null()
};
let context = if extra_functions.CreateContextAttribsARB.is_loaded() {
let mut context = if extra_functions.CreateContextAttribsARB.is_loaded() {
extra_functions.CreateContextAttribsARB(display as *mut ffi::glx_extra::types::Display,
fb_config, share, 1, attributes.as_ptr())
} else {
ffi::glx::CreateContext(display, &mut visual_infos, share, 1)
ptr::null()
};
if context.is_null() {
context = ffi::glx::CreateContext(display, &mut visual_infos, share, 1)
}
if context.is_null() {
return Err(OsError(format!("GL context creation failed")));
}