From 6c8905126f9e33be5466d69a78443a3fa6f33746 Mon Sep 17 00:00:00 2001 From: Glenn Watson Date: Tue, 1 Dec 2015 05:40:00 +1000 Subject: [PATCH] Add debug option to disable vsync for profiling. --- components/util/opts.rs | 11 +++++++++++ ports/glutin/window.rs | 26 +++++++++++++++----------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/components/util/opts.rs b/components/util/opts.rs index 1b74e142408..03355e12a63 100644 --- a/components/util/opts.rs +++ b/components/util/opts.rs @@ -188,6 +188,9 @@ pub struct Opts { /// Do not use native titlebar pub no_native_titlebar: bool, + + /// Enable vsync in the compositor + pub enable_vsync: bool, } fn print_usage(app: &str, opts: &Options) { @@ -277,6 +280,9 @@ pub struct DebugOptions { /// Load web fonts synchronously to avoid non-deterministic network-driven reflows. pub load_webfonts_synchronously: bool, + + /// Disable vsync in the compositor + pub disable_vsync: bool, } @@ -312,6 +318,7 @@ impl DebugOptions { "replace-surrogates" => debug_options.replace_surrogates = true, "gc-profile" => debug_options.gc_profile = true, "load-webfonts-synchronously" => debug_options.load_webfonts_synchronously = true, + "disable-vsync" => debug_options.disable_vsync = true, "" => {}, _ => return Err(option) }; @@ -358,6 +365,8 @@ pub fn print_debug_usage(app: &str) -> ! { print_option("gc-profile", "Log GC passes and their durations."); print_option("load-webfonts-synchronously", "Load web fonts synchronously to avoid non-deterministic network-driven reflows"); + print_option("disable-vsync", + "Disable vsync mode in the compositor to allow profiling at more than monitor refresh rate"); println!(""); @@ -488,6 +497,7 @@ pub fn default_opts() -> Opts { convert_mouse_to_touch: false, exit_after_load: false, no_native_titlebar: false, + enable_vsync: true, } } @@ -722,6 +732,7 @@ pub fn from_cmdline_args(args: &[String]) -> ArgumentParsingResult { convert_mouse_to_touch: debug_options.convert_mouse_to_touch, exit_after_load: opt_match.opt_present("x"), no_native_titlebar: opt_match.opt_present("b"), + enable_vsync: !debug_options.disable_vsync, }; set_defaults(opts); diff --git a/ports/glutin/window.rs b/ports/glutin/window.rs index 421f45dfd91..1978148eac0 100644 --- a/ports/glutin/window.rs +++ b/ports/glutin/window.rs @@ -86,17 +86,21 @@ impl Window { pub fn new(is_foreground: bool, window_size: TypedSize2D, parent: Option) -> Rc { - let mut glutin_window = glutin::WindowBuilder::new() - .with_title("Servo".to_string()) - .with_decorations(!opts::get().no_native_titlebar) - .with_vsync() - .with_dimensions(window_size.to_untyped().width, window_size.to_untyped().height) - .with_gl(Window::gl_version()) - .with_visibility(is_foreground) - .with_parent(parent) - .with_multitouch() - .build() - .unwrap(); + let width = window_size.to_untyped().width; + let height = window_size.to_untyped().height; + let mut builder = glutin::WindowBuilder::new().with_title("Servo".to_string()) + .with_decorations(!opts::get().no_native_titlebar) + .with_dimensions(width, height) + .with_gl(Window::gl_version()) + .with_visibility(is_foreground) + .with_parent(parent) + .with_multitouch(); + + if opts::get().enable_vsync { + builder = builder.with_vsync(); + } + + let mut glutin_window = builder.build().unwrap(); unsafe { glutin_window.make_current().expect("Failed to make context current!") }