diff options
author | Pierre Krieger <pierre.krieger1708@gmail.com> | 2015-01-23 09:31:05 +0100 |
---|---|---|
committer | Pierre Krieger <pierre.krieger1708@gmail.com> | 2015-01-23 09:33:22 +0100 |
commit | b05ef16d817af85d175d60422591d90fe3ec4218 (patch) | |
tree | b0a55aecc955cfadbebcc20183c9a7eabdcc033b /src/x11 | |
parent | 1d6b863cd454839b8e3cf1e296cbf8f31fb70029 (diff) | |
download | glutin-b05ef16d817af85d175d60422591d90fe3ec4218.tar.gz glutin-b05ef16d817af85d175d60422591d90fe3ec4218.zip |
Implement vsync for x11 and add vsync example
Diffstat (limited to 'src/x11')
-rw-r--r-- | src/x11/window/mod.rs | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/src/x11/window/mod.rs b/src/x11/window/mod.rs index f4c296a..d3c5163 100644 --- a/src/x11/window/mod.rs +++ b/src/x11/window/mod.rs @@ -298,7 +298,7 @@ impl Window { // creating GL context - let context = unsafe { + let (context, extra_functions) = unsafe { let mut attributes = Vec::new(); if builder.gl_version.is_some() { @@ -345,9 +345,52 @@ impl Window { return Err(OsError(format!("GL context creation failed"))); } - context + (context, extra_functions) }; + // vsync + if builder.vsync { + unsafe { ffi::glx::MakeCurrent(display, window, context) }; + + if extra_functions.SwapIntervalEXT.is_loaded() { + // this should be the most common extension + unsafe { + extra_functions.SwapIntervalEXT(display as *mut _, window, 1); + } + + // checking that it worked + if builder.strict { + let mut swap = unsafe { mem::uninitialized() }; + unsafe { + ffi::glx::QueryDrawable(display, window, + ffi::glx_extra::SWAP_INTERVAL_EXT as i32, + &mut swap); + } + + if swap != 1 { + return Err(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() { + unsafe { + extra_functions.SwapIntervalMESA(1); + }*/ + + } else if extra_functions.SwapIntervalSGI.is_loaded() { + unsafe { + extra_functions.SwapIntervalSGI(1); + } + + } else if builder.strict { + return Err(OsError(format!("Couldn't find any available vsync extension"))); + } + + unsafe { ffi::glx::MakeCurrent(display, 0, ptr::null()) }; + } + // creating the window object let window = Window { x: Arc::new(XWindow { |