diff options
Diffstat (limited to 'src/win32')
-rw-r--r-- | src/win32/ffi.rs | 18 | ||||
-rw-r--r-- | src/win32/init.rs | 21 | ||||
-rw-r--r-- | src/win32/mod.rs | 21 | ||||
-rw-r--r-- | src/win32/monitor.rs | 2 |
4 files changed, 49 insertions, 13 deletions
diff --git a/src/win32/ffi.rs b/src/win32/ffi.rs index 2385954..71f8d55 100644 --- a/src/win32/ffi.rs +++ b/src/win32/ffi.rs @@ -7,12 +7,26 @@ use libc; /// WGL bindings pub mod wgl { - generate_gl_bindings!("wgl", "core", "1.0", "static") + generate_gl_bindings! { + api: "wgl", + profile: "core", + version: "1.0", + generator: "static" + } } /// Functions that are not necessarly always available pub mod wgl_extra { - generate_gl_bindings!("wgl", "core", "1.0", "struct", [ "WGL_ARB_create_context" ]) + generate_gl_bindings! { + api: "wgl", + profile: "core", + version: "1.0", + generator: "struct", + extensions: [ + "WGL_ARB_create_context", + "WGL_EXT_swap_control" + ] + } } // http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx diff --git a/src/win32/init.rs b/src/win32/init.rs index bb3f53b..5168cc6 100644 --- a/src/win32/init.rs +++ b/src/win32/init.rs @@ -2,7 +2,7 @@ extern crate native; use self::native::NativeTaskBuilder; use std::task::TaskBuilder; -use std::sync::atomics::AtomicBool; +use std::sync::atomic::AtomicBool; use std::ptr; use super::{event, ffi}; use super::Window; @@ -16,7 +16,7 @@ local_data_key!(WINDOW: (ffi::HWND, Sender<Event>)) pub fn new_window(builder_dimensions: Option<(uint, uint)>, builder_title: String, builder_monitor: Option<super::MonitorID>, - builder_gl_version: Option<(uint, uint)>, + builder_gl_version: Option<(uint, uint)>, builder_vsync: bool, builder_headless: bool) -> Result<Window, String> { use std::mem; @@ -346,6 +346,23 @@ pub fn new_window(builder_dimensions: Option<(uint, uint)>, builder_title: Strin lib }; + // handling vsync + if builder_vsync { + if extra_functions.SwapIntervalEXT.is_loaded() { + unsafe { ffi::wgl::MakeCurrent(hdc, context) }; + if extra_functions.SwapIntervalEXT(1) == 0 { + tx.send(Err(format!("wglSwapIntervalEXT failed"))); + unsafe { ffi::wgl::DeleteContext(context); } + unsafe { ffi::DestroyWindow(real_window); } + return; + } + + // it is important to remove the current context, otherwise you get very weird + // errors + unsafe { ffi::wgl::MakeCurrent(ptr::null(), ptr::null()); } + } + } + // building the struct let window = Window{ window: real_window, diff --git a/src/win32/mod.rs b/src/win32/mod.rs index 8be3fdb..3cfdc7e 100644 --- a/src/win32/mod.rs +++ b/src/win32/mod.rs @@ -1,5 +1,6 @@ -use std::sync::atomics::AtomicBool; +use std::sync::atomic::AtomicBool; use std::ptr; +use libc; use Event; #[cfg(feature = "window")] @@ -24,7 +25,7 @@ impl HeadlessContext { /// See the docs in the crate root file. pub fn new(builder: HeadlessRendererBuilder) -> Result<HeadlessContext, String> { let HeadlessRendererBuilder { dimensions, gl_version } = builder; - init::new_window(Some(dimensions), "".to_string(), None, gl_version, true) + init::new_window(Some(dimensions), "".to_string(), None, gl_version, false, true) .map(|w| HeadlessContext(w)) } @@ -67,15 +68,15 @@ pub struct Window { impl Window { /// See the docs in the crate root file. pub fn new(builder: WindowBuilder) -> Result<Window, String> { - let WindowBuilder { dimensions, title, monitor, gl_version } = builder; - init::new_window(dimensions, title, monitor, gl_version, false) + let WindowBuilder { dimensions, title, monitor, gl_version, vsync } = builder; + init::new_window(dimensions, title, monitor, gl_version, vsync, false) } } impl Window { /// See the docs in the crate root file. pub fn is_closed(&self) -> bool { - use std::sync::atomics::Relaxed; + use std::sync::atomic::Relaxed; self.is_closed.load(Relaxed) } @@ -170,7 +171,7 @@ impl Window { // if one of the received events is `Closed`, setting `is_closed` to true if events.iter().find(|e| match e { &&::Closed => true, _ => false }).is_some() { - use std::sync::atomics::Relaxed; + use std::sync::atomic::Relaxed; self.is_closed.store(true, Relaxed); } @@ -185,7 +186,7 @@ impl Window { // if the received event is `Closed`, setting `is_closed` to true match ev { ::Closed => { - use std::sync::atomics::Relaxed; + use std::sync::atomic::Relaxed; self.is_closed.store(true, Relaxed); }, _ => () @@ -198,7 +199,7 @@ impl Window { }, Err(_) => { - use std::sync::atomics::Relaxed; + use std::sync::atomic::Relaxed; self.is_closed.store(true, Relaxed); vec![] } @@ -233,6 +234,10 @@ impl Window { ffi::SwapBuffers(self.hdc); } } + + pub fn platform_display(&self) -> *mut libc::c_void { + unimplemented!() + } } #[unsafe_destructor] diff --git a/src/win32/monitor.rs b/src/win32/monitor.rs index a45c8fb..3e6b79a 100644 --- a/src/win32/monitor.rs +++ b/src/win32/monitor.rs @@ -101,7 +101,7 @@ pub fn get_primary_monitor() -> MonitorID { } } - fail!("Failed to find the primary monitor") + panic!("Failed to find the primary monitor") } impl MonitorID { |