From b5d0a3eb67247a8ed5e43a9161f7e9567e1c1ea7 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 21 Sep 2015 11:39:34 +0200 Subject: Convert GLX to the new design --- src/api/glx/mod.rs | 62 ++++++++++++++++++++++++--------------------------- src/api/x11/window.rs | 9 ++++---- 2 files changed, 34 insertions(+), 37 deletions(-) diff --git a/src/api/glx/mod.rs b/src/api/glx/mod.rs index 6a4461c..7f54760 100644 --- a/src/api/glx/mod.rs +++ b/src/api/glx/mod.rs @@ -1,13 +1,14 @@ #![cfg(all(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd"), feature = "window"))] -use BuilderAttribs; use ContextError; use CreationError; +use GlAttributes; use GlContext; use GlProfile; use GlRequest; use Api; use PixelFormat; +use PixelFormatRequirements; use Robustness; use libc; @@ -34,14 +35,14 @@ fn with_c_str(s: &str, f: F) -> T where F: FnOnce(*const libc::c_char) -> } impl Context { - pub fn new<'a>(glx: ffi::glx::Glx, xlib: &ffi::Xlib, builder: &'a BuilderAttribs<'a>, - display: *mut ffi::Display) + pub fn new<'a>(glx: ffi::glx::Glx, xlib: &ffi::Xlib, pf_reqs: &PixelFormatRequirements, + opengl: &'a GlAttributes<&'a Context>, display: *mut ffi::Display) -> Result, CreationError> { // finding the pixel format we want let (fb_config, pixel_format) = { let configs = unsafe { try!(enumerate_configs(&glx, xlib, display)) }; - try!(builder.choose_pixel_format(configs.into_iter())) + try!(pf_reqs.choose_pixel_format(configs.into_iter())) }; // getting the visual infos @@ -57,7 +58,7 @@ impl Context { Ok(ContextPrototype { glx: glx, - builder: builder, + opengl: opengl, display: display, fb_config: fb_config, visual_infos: unsafe { mem::transmute(visual_infos) }, @@ -120,7 +121,7 @@ impl Drop for Context { pub struct ContextPrototype<'a> { glx: ffi::glx::Glx, - builder: &'a BuilderAttribs<'a>, + opengl: &'a GlAttributes<&'a Context>, display: *mut ffi::Display, fb_config: ffi::glx::types::GLXFBConfig, visual_infos: ffi::XVisualInfo, @@ -133,16 +134,9 @@ impl<'a> ContextPrototype<'a> { } pub fn finish(self, window: ffi::Window) -> Result { - let share = if let Some(win) = self.builder.opengl.sharing { - match win { - &PlatformWindow::X(ref win) => match win.x.context { - ::api::x11::Context::Glx(ref c) => c.context, - _ => panic!("Cannot share contexts between different APIs") - }, - _ => panic!("Cannot use glx on a non-X11 window.") - } - } else { - ptr::null() + let share = match self.opengl.sharing { + Some(ctxt) => ctxt.context, + None => ptr::null() }; // loading the list of extensions @@ -160,46 +154,46 @@ impl<'a> ContextPrototype<'a> { }); // creating GL context - let context = match self.builder.opengl.version { + let context = match self.opengl.version { GlRequest::Latest => { if let Ok(ctxt) = create_context(&self.glx, &extra_functions, &extensions, (3, 2), - self.builder.opengl.profile, self.builder.opengl.debug, - self.builder.opengl.robustness, share, + self.opengl.profile, self.opengl.debug, + self.opengl.robustness, share, self.display, self.fb_config, &self.visual_infos) { ctxt } else if let Ok(ctxt) = create_context(&self.glx, &extra_functions, &extensions, - (3, 1), self.builder.opengl.profile, - self.builder.opengl.debug, - self.builder.opengl.robustness, share, self.display, + (3, 1), self.opengl.profile, + self.opengl.debug, + self.opengl.robustness, share, self.display, self.fb_config, &self.visual_infos) { ctxt } else { try!(create_context(&self.glx, &extra_functions, &extensions, (1, 0), - self.builder.opengl.profile, self.builder.opengl.debug, - self.builder.opengl.robustness, + self.opengl.profile, self.opengl.debug, + self.opengl.robustness, share, self.display, self.fb_config, &self.visual_infos)) } }, GlRequest::Specific(Api::OpenGl, (major, minor)) => { try!(create_context(&self.glx, &extra_functions, &extensions, (major, minor), - self.builder.opengl.profile, self.builder.opengl.debug, - self.builder.opengl.robustness, share, self.display, self.fb_config, + self.opengl.profile, self.opengl.debug, + self.opengl.robustness, share, self.display, self.fb_config, &self.visual_infos)) }, GlRequest::Specific(_, _) => panic!("Only OpenGL is supported"), GlRequest::GlThenGles { opengl_version: (major, minor), .. } => { try!(create_context(&self.glx, &extra_functions, &extensions, (major, minor), - self.builder.opengl.profile, self.builder.opengl.debug, - self.builder.opengl.robustness, share, self.display, self.fb_config, + self.opengl.profile, self.opengl.debug, + self.opengl.robustness, share, self.display, self.fb_config, &self.visual_infos)) }, }; // vsync - if self.builder.opengl.vsync { + if self.opengl.vsync { unsafe { self.glx.MakeCurrent(self.display as *mut _, window, context) }; if extra_functions.SwapIntervalEXT.is_loaded() { @@ -209,7 +203,8 @@ impl<'a> ContextPrototype<'a> { } // checking that it worked - if self.builder.strict { + // TODO: handle this + /*if self.builder.strict { let mut swap = unsafe { mem::uninitialized() }; unsafe { self.glx.QueryDrawable(self.display as *mut _, window, @@ -221,7 +216,7 @@ impl<'a> ContextPrototype<'a> { return Err(CreationError::OsError(format!("Couldn't setup vsync: expected \ interval `1` but got `{}`", swap))); } - } + }*/ // GLX_MESA_swap_control is not official /*} else if extra_functions.SwapIntervalMESA.is_loaded() { @@ -234,9 +229,10 @@ impl<'a> ContextPrototype<'a> { extra_functions.SwapIntervalSGI(1); } - } else if self.builder.strict { + }/* else if self.builder.strict { + // TODO: handle this return Err(CreationError::OsError(format!("Couldn't find any available vsync extension"))); - } + }*/ unsafe { self.glx.MakeCurrent(self.display as *mut _, 0, ptr::null()) }; } diff --git a/src/api/x11/window.rs b/src/api/x11/window.rs index 0a9189a..8447c7f 100644 --- a/src/api/x11/window.rs +++ b/src/api/x11/window.rs @@ -349,22 +349,23 @@ impl Window { Egl(::api::egl::ContextPrototype<'a>), } let builder_clone = builder.clone(); - let builder_clone_opengl = builder_clone.opengl.clone().map_sharing(|_| unimplemented!()); + let builder_clone_opengl_glx = builder_clone.opengl.clone().map_sharing(|_| unimplemented!()); // FIXME: + let builder_clone_opengl_egl = builder_clone.opengl.clone().map_sharing(|_| unimplemented!()); // FIXME: let context = match builder.opengl.version { GlRequest::Latest | GlRequest::Specific(Api::OpenGl, _) | GlRequest::GlThenGles { .. } => { // GLX should be preferred over EGL, otherwise crashes may occur // on X11 – issue #314 if let Some(ref glx) = display.glx { - Prototype::Glx(try!(GlxContext::new(glx.clone(), &display.xlib, &builder_clone, display.display))) + Prototype::Glx(try!(GlxContext::new(glx.clone(), &display.xlib, &builder_clone.pf_reqs, &builder_clone_opengl_glx, display.display))) } else if let Some(ref egl) = display.egl { - Prototype::Egl(try!(EglContext::new(egl.clone(), &builder_clone.pf_reqs, &builder_clone_opengl, egl::NativeDisplay::X11(Some(display.display as *const _))))) + Prototype::Egl(try!(EglContext::new(egl.clone(), &builder_clone.pf_reqs, &builder_clone_opengl_egl, egl::NativeDisplay::X11(Some(display.display as *const _))))) } else { return Err(CreationError::NotSupported); } }, GlRequest::Specific(Api::OpenGlEs, _) => { if let Some(ref egl) = display.egl { - Prototype::Egl(try!(EglContext::new(egl.clone(), &builder_clone.pf_reqs, &builder_clone_opengl, egl::NativeDisplay::X11(Some(display.display as *const _))))) + Prototype::Egl(try!(EglContext::new(egl.clone(), &builder_clone.pf_reqs, &builder_clone_opengl_egl, egl::NativeDisplay::X11(Some(display.display as *const _))))) } else { return Err(CreationError::NotSupported); } -- cgit v1.2.3