diff --git a/src/lib.rs b/src/lib.rs index 7a64e708..0e61649b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -94,6 +94,7 @@ pub struct WindowBuilder<'a> { gl_debug: bool, vsync: bool, visible: bool, + multisampling: Option, } #[cfg(feature = "window")] @@ -109,6 +110,7 @@ impl<'a> WindowBuilder<'a> { gl_debug: cfg!(ndebug), vsync: false, visible: true, + multisampling: None, } } @@ -173,6 +175,18 @@ impl<'a> WindowBuilder<'a> { self } + /// Sets the multisampling level to request. + /// + /// # Panic + /// + /// Will panic if `samples` is not a power of two. + pub fn with_multisampling(mut self, samples: u16) -> WindowBuilder<'a> { + use std::num::UnsignedInt; + assert!(samples.is_power_of_two()); + self.multisampling = Some(samples); + self + } + /// Builds the window. /// /// Error should be very rare and only occur in case of permission denied, incompatible system, diff --git a/src/win32/init.rs b/src/win32/init.rs index 29b45cb4..62c1f54a 100644 --- a/src/win32/init.rs +++ b/src/win32/init.rs @@ -16,7 +16,8 @@ pub fn new_window(builder_dimensions: Option<(uint, uint)>, builder_title: Strin builder_monitor: Option, builder_gl_version: Option<(uint, uint)>, builder_debug: bool, builder_vsync: bool, builder_hidden: bool, - builder_sharelists: Option) -> Result + builder_sharelists: Option, builder_multisampling: Option) + -> Result { use std::mem; use std::os; diff --git a/src/win32/mod.rs b/src/win32/mod.rs index ef2e3eab..f08c033e 100644 --- a/src/win32/mod.rs +++ b/src/win32/mod.rs @@ -26,7 +26,7 @@ impl HeadlessContext { pub fn new(builder: HeadlessRendererBuilder) -> Result { let HeadlessRendererBuilder { dimensions, gl_version, gl_debug } = builder; init::new_window(Some(dimensions), "".to_string(), None, gl_version, gl_debug, false, true, - None) + None, None) .map(|w| HeadlessContext(w)) } @@ -70,9 +70,9 @@ impl Window { /// See the docs in the crate root file. pub fn new(builder: WindowBuilder) -> Result { let WindowBuilder { dimensions, title, monitor, gl_version, - gl_debug, vsync, visible, sharing } = builder; + gl_debug, vsync, visible, sharing, multisampling } = builder; init::new_window(dimensions, title, monitor, gl_version, gl_debug, vsync, - !visible, sharing.map(|w| w.window.context)) + !visible, sharing.map(|w| w.window.context), multisampling) } } diff --git a/src/x11/window/mod.rs b/src/x11/window/mod.rs index 8662fdce..72c7133b 100644 --- a/src/x11/window/mod.rs +++ b/src/x11/window/mod.rs @@ -58,7 +58,7 @@ impl Window { // getting the FBConfig let fb_config = unsafe { - const VISUAL_ATTRIBUTES: [libc::c_int, ..23] = [ + let mut visual_attributes = vec![ ffi::GLX_X_RENDERABLE, 1, ffi::GLX_DRAWABLE_TYPE, ffi::GLX_WINDOW_BIT, ffi::GLX_RENDER_TYPE, ffi::GLX_RGBA_BIT, @@ -73,10 +73,17 @@ impl Window { 0 ]; + if let Some(val) = builder.multisampling { + visual_attributes.push(ffi::glx::SAMPLE_BUFFERS as libc::c_int); + visual_attributes.push(1); + visual_attributes.push(ffi::glx::SAMPLES as libc::c_int); + visual_attributes.push(val as libc::c_int); + } + let mut num_fb: libc::c_int = mem::uninitialized(); let fb = ffi::glx::ChooseFBConfig(display, ffi::XDefaultScreen(display), - VISUAL_ATTRIBUTES.as_ptr(), &mut num_fb); + visual_attributes.as_ptr(), &mut num_fb); if fb.is_null() { return Err(OsError(format!("glx::ChooseFBConfig failed"))); }