diff options
| author | tomaka <pierre.krieger1708@gmail.com> | 2015-06-17 07:36:00 +0200 | 
|---|---|---|
| committer | tomaka <pierre.krieger1708@gmail.com> | 2015-06-17 07:36:00 +0200 | 
| commit | 90b28c205219df732d83e403f98abab31e6e52d4 (patch) | |
| tree | 1008d78cf5c7280c9ddeea512033a92e07f989d1 /src/api | |
| parent | 2d1e503f77434fc0dd3f2715625ce1a972fdf62f (diff) | |
| parent | f6c26ec593ba96d89cb3476c815d6f33a915bfdd (diff) | |
| download | glutin-90b28c205219df732d83e403f98abab31e6e52d4.tar.gz glutin-90b28c205219df732d83e403f98abab31e6e52d4.zip  | |
Merge pull request #486 from tomaka/context-error
Handle errors from MakeCurrent and SwapBuffers
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/android/mod.rs | 5 | ||||
| -rw-r--r-- | src/api/caca/mod.rs | 7 | ||||
| -rw-r--r-- | src/api/cocoa/headless.rs | 8 | ||||
| -rw-r--r-- | src/api/cocoa/mod.rs | 7 | ||||
| -rw-r--r-- | src/api/egl/mod.rs | 23 | ||||
| -rw-r--r-- | src/api/emscripten/mod.rs | 11 | ||||
| -rw-r--r-- | src/api/glx/mod.rs | 13 | ||||
| -rw-r--r-- | src/api/osmesa/mod.rs | 18 | ||||
| -rw-r--r-- | src/api/wayland/mod.rs | 6 | ||||
| -rw-r--r-- | src/api/wgl/mod.rs | 18 | ||||
| -rw-r--r-- | src/api/win32/mod.rs | 5 | ||||
| -rw-r--r-- | src/api/x11/window.rs | 9 | 
12 files changed, 87 insertions, 43 deletions
diff --git a/src/api/android/mod.rs b/src/api/android/mod.rs index d1281e3..1649772 100644 --- a/src/api/android/mod.rs +++ b/src/api/android/mod.rs @@ -15,6 +15,7 @@ use std::collections::VecDeque;  use Api;  use BuilderAttribs; +use ContextError;  use CursorState;  use GlContext;  use GlRequest; @@ -213,7 +214,7 @@ unsafe impl Send for Window {}  unsafe impl Sync for Window {}  impl GlContext for Window { -    unsafe fn make_current(&self) { +    unsafe fn make_current(&self) -> Result<(), ContextError> {          self.context.make_current()      } @@ -225,7 +226,7 @@ impl GlContext for Window {          self.context.get_proc_address(addr)      } -    fn swap_buffers(&self) { +    fn swap_buffers(&self) -> Result<(), ContextError> {          self.context.swap_buffers()      } diff --git a/src/api/caca/mod.rs b/src/api/caca/mod.rs index 06a6931..4c54434 100644 --- a/src/api/caca/mod.rs +++ b/src/api/caca/mod.rs @@ -6,6 +6,7 @@ use api::osmesa::{OsMesaContext, OsMesaCreationError};  use Api;  use BuilderAttribs; +use ContextError;  use CreationError;  use Event;  use GlContext; @@ -209,7 +210,7 @@ impl Window {  }  impl GlContext for Window { -    unsafe fn make_current(&self) { +    unsafe fn make_current(&self) -> Result<(), ContextError> {          self.opengl.make_current()      } @@ -221,7 +222,7 @@ impl GlContext for Window {          self.opengl.get_proc_address(addr)      } -    fn swap_buffers(&self) { +    fn swap_buffers(&self) -> Result<(), ContextError> {          unsafe {              let canvas = (self.libcaca.caca_get_canvas)(self.display);              let width = (self.libcaca.caca_get_canvas_width)(canvas); @@ -235,6 +236,8 @@ impl GlContext for Window {                                                buffer.as_ptr() as *const _);              (self.libcaca.caca_refresh_display)(self.display);          }; + +        Ok(())      }      fn get_api(&self) -> Api { diff --git a/src/api/cocoa/headless.rs b/src/api/cocoa/headless.rs index 75cca8d..7cd0f88 100644 --- a/src/api/cocoa/headless.rs +++ b/src/api/cocoa/headless.rs @@ -1,3 +1,4 @@ +use ContextError;  use CreationError;  use CreationError::OsError;  use BuilderAttribs; @@ -61,7 +62,7 @@ impl HeadlessContext {  }  impl GlContext for HeadlessContext { -    unsafe fn make_current(&self) { +    unsafe fn make_current(&self) -> Result<(), ContextError> {          self.context.makeCurrentContext();          gl::GenFramebuffersEXT(1, &mut framebuffer); @@ -78,6 +79,8 @@ impl GlContext for HeadlessContext {          if status != gl::FRAMEBUFFER_COMPLETE_EXT {              panic!("Error while creating the framebuffer");          } + +        Ok(())      }      fn is_current(&self) -> bool { @@ -96,7 +99,8 @@ impl GlContext for HeadlessContext {          symbol as *const libc::c_void      } -    fn swap_buffers(&self) { +    fn swap_buffers(&self) -> Result<(), ContextError> { +        Ok(())      }      fn get_api(&self) -> ::Api { diff --git a/src/api/cocoa/mod.rs b/src/api/cocoa/mod.rs index d080d06..5cb7edb 100644 --- a/src/api/cocoa/mod.rs +++ b/src/api/cocoa/mod.rs @@ -8,6 +8,7 @@ use libc;  use Api;  use BuilderAttribs; +use ContextError;  use GlContext;  use GlProfile;  use GlRequest; @@ -781,9 +782,10 @@ impl Window {  }  impl GlContext for Window { -    unsafe fn make_current(&self) { +    unsafe fn make_current(&self) -> Result<(), ContextError> {          let _: () = msg_send![*self.context, update];          self.context.makeCurrentContext(); +        Ok(())      }      fn is_current(&self) -> bool { @@ -810,8 +812,9 @@ impl GlContext for Window {          symbol as *const _      } -    fn swap_buffers(&self) { +    fn swap_buffers(&self) -> Result<(), ContextError> {          unsafe { self.context.flushBuffer(); } +        Ok(())      }      fn get_api(&self) -> ::Api { diff --git a/src/api/egl/mod.rs b/src/api/egl/mod.rs index 3335de0..7b31017 100644 --- a/src/api/egl/mod.rs +++ b/src/api/egl/mod.rs @@ -2,6 +2,7 @@  #![allow(unused_variables)]  use BuilderAttribs; +use ContextError;  use CreationError;  use GlContext;  use GlRequest; @@ -161,11 +162,18 @@ impl Context {  }  impl GlContext for Context { -    unsafe fn make_current(&self) { +    unsafe fn make_current(&self) -> Result<(), ContextError> {          let ret = self.egl.MakeCurrent(self.display, self.surface, self.surface, self.context);          if ret == 0 { -            panic!("eglMakeCurrent failed"); +            if self.egl.GetError() as u32 == ffi::egl::CONTEXT_LOST { +                return Err(ContextError::ContextLost); +            } else { +                panic!("eglMakeCurrent failed"); +            } + +        } else { +            Ok(())          }      } @@ -181,13 +189,20 @@ impl GlContext for Context {          }      } -    fn swap_buffers(&self) { +    fn swap_buffers(&self) -> Result<(), ContextError> {          let ret = unsafe {              self.egl.SwapBuffers(self.display, self.surface)          };          if ret == 0 { -            panic!("eglSwapBuffers failed"); +            if unsafe { self.egl.GetError() } as u32 == ffi::egl::CONTEXT_LOST { +                return Err(ContextError::ContextLost); +            } else { +                panic!("eglSwapBuffers failed"); +            } + +        } else { +            Ok(())          }      } diff --git a/src/api/emscripten/mod.rs b/src/api/emscripten/mod.rs index 48b31a9..04746b1 100644 --- a/src/api/emscripten/mod.rs +++ b/src/api/emscripten/mod.rs @@ -5,6 +5,7 @@ use libc;  use {Event, BuilderAttribs, CreationError, MouseCursor};  use Api;  use PixelFormat; +use ContextError;  use GlContext;  use std::collections::VecDeque; @@ -191,9 +192,10 @@ impl Window {  }  impl GlContext for Window { -    unsafe fn make_current(&self) { +    unsafe fn make_current(&self) -> Result<(), ContextError> {          // TOOD: check if == EMSCRIPTEN_RESULT          ffi::emscripten_webgl_make_context_current(self.context); +        Ok(())      }      fn is_current(&self) -> bool { @@ -209,10 +211,9 @@ impl GlContext for Window {          }      } -    fn swap_buffers(&self) { -        unsafe { -            ffi::emscripten_sleep(1);   // FIXME:  -        } +    fn swap_buffers(&self) -> Result<(), ContextError> { +        unsafe { ffi::emscripten_sleep(1); }  // FIXME:   +        Ok(())      }      fn get_api(&self) -> Api { diff --git a/src/api/glx/mod.rs b/src/api/glx/mod.rs index 885339f..455f6a5 100644 --- a/src/api/glx/mod.rs +++ b/src/api/glx/mod.rs @@ -1,6 +1,7 @@  #![cfg(all(target_os = "linux", feature = "window"))]  use BuilderAttribs; +use ContextError;  use CreationError;  use GlContext;  use GlProfile; @@ -139,11 +140,13 @@ impl Context {  }  impl GlContext for Context { -    unsafe fn make_current(&self) { +    unsafe fn make_current(&self) -> Result<(), ContextError> { +        // TODO: glutin needs some internal changes for proper error recovery          let res = self.glx.MakeCurrent(self.display as *mut _, self.window, self.context);          if res == 0 {              panic!("glx::MakeCurrent failed");          } +        Ok(())      }      fn is_current(&self) -> bool { @@ -158,10 +161,10 @@ impl GlContext for Context {          }      } -    fn swap_buffers(&self) { -        unsafe { -            self.glx.SwapBuffers(self.display as *mut _, self.window) -        } +    fn swap_buffers(&self) -> Result<(), ContextError> { +        // TODO: glutin needs some internal changes for proper error recovery +        unsafe { self.glx.SwapBuffers(self.display as *mut _, self.window); } +        Ok(())      }      fn get_api(&self) -> ::Api { diff --git a/src/api/osmesa/mod.rs b/src/api/osmesa/mod.rs index 26808f7..daaba52 100644 --- a/src/api/osmesa/mod.rs +++ b/src/api/osmesa/mod.rs @@ -4,6 +4,7 @@ extern crate osmesa_sys;  use Api;  use BuilderAttribs; +use ContextError;  use CreationError;  use GlContext;  use PixelFormat; @@ -67,14 +68,18 @@ impl OsMesaContext {  }  impl GlContext for OsMesaContext { -    unsafe fn make_current(&self) { -        let ret = osmesa_sys::OSMesaMakeCurrent(self.context, -            self.buffer.as_ptr() as *mut libc::c_void, -            0x1401, self.width as libc::c_int, self.height as libc::c_int); +    unsafe fn make_current(&self) -> Result<(), ContextError> { +        let ret = osmesa_sys::OSMesaMakeCurrent(self.context, self.buffer.as_ptr() +                                                as *mut libc::c_void, 0x1401, self.width +                                                as libc::c_int, self.height as libc::c_int); +        // an error can only happen in case of invalid parameter, which would indicate a bug +        // in glutin          if ret == 0 { -            panic!("OSMesaMakeCurrent failed") +            panic!("OSMesaMakeCurrent failed");          } + +        Ok(())      }      fn is_current(&self) -> bool { @@ -88,7 +93,8 @@ impl GlContext for OsMesaContext {          }      } -    fn swap_buffers(&self) { +    fn swap_buffers(&self) -> Result<(), ContextError> { +        Ok(())      }      fn get_api(&self) -> Api { diff --git a/src/api/wayland/mod.rs b/src/api/wayland/mod.rs index b9bfa18..d711110 100644 --- a/src/api/wayland/mod.rs +++ b/src/api/wayland/mod.rs @@ -9,6 +9,7 @@ use api::dlopen;  use api::egl::Context as EglContext;  use BuilderAttribs; +use ContextError;  use CreationError;  use Event;  use PixelFormat; @@ -282,8 +283,7 @@ impl Window {  }  impl GlContext for Window { - -    unsafe fn make_current(&self) { +    unsafe fn make_current(&self) -> Result<(), ContextError> {          self.context.make_current()      } @@ -295,7 +295,7 @@ impl GlContext for Window {          self.context.get_proc_address(addr)      } -    fn swap_buffers(&self) { +    fn swap_buffers(&self) -> Result<(), ContextError> {          self.context.swap_buffers()      } diff --git a/src/api/wgl/mod.rs b/src/api/wgl/mod.rs index d1f42d2..c33054e 100644 --- a/src/api/wgl/mod.rs +++ b/src/api/wgl/mod.rs @@ -1,6 +1,7 @@  #![cfg(any(target_os = "windows"))]  use BuilderAttribs; +use ContextError;  use CreationError;  use GlContext;  use GlRequest; @@ -156,9 +157,12 @@ impl Context {  }  impl GlContext for Context { -    unsafe fn make_current(&self) { -        // TODO: check return value -        gl::wgl::MakeCurrent(self.hdc as *const _, self.context.0 as *const _); +    unsafe fn make_current(&self) -> Result<(), ContextError> { +        if gl::wgl::MakeCurrent(self.hdc as *const _, self.context.0 as *const _) != 0 { +            Ok(()) +        } else { +            Err(ContextError::IoError(io::Error::last_os_error())) +        }      }      fn is_current(&self) -> bool { @@ -176,9 +180,11 @@ impl GlContext for Context {          }      } -    fn swap_buffers(&self) { -        unsafe { -            gdi32::SwapBuffers(self.hdc); +    fn swap_buffers(&self) -> Result<(), ContextError> { +        if unsafe { gdi32::SwapBuffers(self.hdc) } != 0 { +            Ok(()) +        } else { +            Err(ContextError::IoError(io::Error::last_os_error()))          }      } diff --git a/src/api/win32/mod.rs b/src/api/win32/mod.rs index af339c5..9efdc93 100644 --- a/src/api/win32/mod.rs +++ b/src/api/win32/mod.rs @@ -11,6 +11,7 @@ use std::sync::{  };  use std::sync::mpsc::Receiver;  use libc; +use ContextError;  use {CreationError, Event, MouseCursor};  use CursorState;  use GlContext; @@ -315,7 +316,7 @@ impl Window {  }  impl GlContext for Window { -    unsafe fn make_current(&self) { +    unsafe fn make_current(&self) -> Result<(), ContextError> {          match self.context {              Context::Wgl(ref c) => c.make_current(),              Context::Egl(ref c) => c.make_current(), @@ -336,7 +337,7 @@ impl GlContext for Window {          }      } -    fn swap_buffers(&self) { +    fn swap_buffers(&self) -> Result<(), ContextError> {          match self.context {              Context::Wgl(ref c) => c.swap_buffers(),              Context::Egl(ref c) => c.swap_buffers(), diff --git a/src/api/x11/window.rs b/src/api/x11/window.rs index ba0fe52..c0c5917 100644 --- a/src/api/x11/window.rs +++ b/src/api/x11/window.rs @@ -9,6 +9,7 @@ use std::collections::VecDeque;  use std::sync::{Arc, Mutex};  use Api; +use ContextError;  use CursorState;  use GlContext;  use GlRequest; @@ -800,11 +801,11 @@ impl Window {  }  impl GlContext for Window { -    unsafe fn make_current(&self) { +    unsafe fn make_current(&self) -> Result<(), ContextError> {          match self.x.context {              Context::Glx(ref ctxt) => ctxt.make_current(),              Context::Egl(ref ctxt) => ctxt.make_current(), -            Context::None => {} +            Context::None => Ok(())          }      } @@ -824,11 +825,11 @@ impl GlContext for Window {          }      } -    fn swap_buffers(&self) { +    fn swap_buffers(&self) -> Result<(), ContextError> {          match self.x.context {              Context::Glx(ref ctxt) => ctxt.swap_buffers(),              Context::Egl(ref ctxt) => ctxt.swap_buffers(), -            Context::None => {} +            Context::None => Ok(())          }      }  | 
