diff options
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 91419e2..efdc759 100644 --- a/src/x11/window/mod.rs +++ b/src/x11/window/mod.rs @@ -303,7 +303,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() { @@ -350,9 +350,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 { | 
