From 18abfc66f28685dcd3030876fbafedeea9cdb056 Mon Sep 17 00:00:00 2001 From: Jonathan Johnson Date: Sun, 17 Mar 2024 08:44:02 -0700 Subject: [PATCH] Added ability to disable vsync --- CHANGELOG.md | 1 + Cargo.lock | 96 +++++++++++++++++++++++++-------------------------- src/window.rs | 23 +++++++++++- 3 files changed, 71 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd32bd3..80cd79e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -233,6 +233,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 for a given `LoadedFont`. - `Graphics::font_system()` returns a reference to the underlying Cosmic Text `FontSystem`. +- `Window::vsync` is a new setting that allows disabling VSync for that window. [plotters]: https://github.com/plotters-rs/plotters diff --git a/Cargo.lock b/Cargo.lock index 192e546..63fe025 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -172,7 +172,7 @@ dependencies = [ "attribute-derive-macro", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -188,7 +188,7 @@ dependencies = [ "proc-macro2", "quote", "quote-use 0.7.2", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -257,28 +257,28 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.15.3" +version = "3.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "bytemuck" -version = "1.14.3" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" +checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -349,9 +349,9 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" [[package]] name = "clipboard-win" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f9a0700e0127ba15d1d52dd742097f821cd9c65939303a44d970465040a297" +checksum = "d517d4b86184dbb111d3556a10f1c8a04da7428d2987bf1081602bf11c3aa9ee" dependencies = [ "error-code", ] @@ -586,7 +586,7 @@ dependencies = [ "proc-macro2", "quote", "quote-use 0.8.0", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -608,7 +608,7 @@ checksum = "62d671cc41a825ebabc75757b62d3d168c577f9149b2d49ece1dad1f72119d25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -755,9 +755,9 @@ dependencies = [ [[package]] name = "font-types" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd7f3ea17572640b606b35df42cfb6ecdf003704b062580e59918692190b73d" +checksum = "5b7f6040d337bd44434ab21fc6509154edf2cece88b23758d9d64654c4e7730b" [[package]] name = "fontconfig-parser" @@ -800,7 +800,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1099,9 +1099,9 @@ checksum = "d7e253b574775d0ebd7975c471fc18f72f0775a4d42b563b5fbc3c4068aa1075" [[package]] name = "kempt" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a37a6bdb52eae6acb1efbab069af766555a6d77712380fd48876b83543d3071" +checksum = "35bf4433cfb4933c3e4ad1964ec3dcb183a07154174b96944c20d7f0ae4b1f1b" [[package]] name = "khronos-egl" @@ -1123,7 +1123,7 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" [[package]] name = "kludgine" version = "0.7.0" -source = "git+https://github.com/khonsulabs/kludgine#f2bc0d6ea9ebe2709ab208723fc7a072cf87164f" +source = "git+https://github.com/khonsulabs/kludgine#c87af7ebc008842f6ed2584e4b0f004cfe5d0f1c" dependencies = [ "ahash", "alot", @@ -1279,7 +1279,7 @@ dependencies = [ "manyhow-macros 0.8.1", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1291,7 +1291,7 @@ dependencies = [ "manyhow-macros 0.10.4", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1459,7 +1459,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1573,7 +1573,7 @@ checksum = "e8890702dbec0bad9116041ae586f84805b13eecd1d8b1df27c29998a9969d6d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1641,7 +1641,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1735,7 +1735,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1760,9 +1760,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -1808,7 +1808,7 @@ checksum = "a7b5abe3fe82fdeeb93f44d66a7b444dedf2e4827defb0a8e69c437b2de2ef94" dependencies = [ "quote", "quote-use-macros 0.7.2", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1830,7 +1830,7 @@ dependencies = [ "derive-where", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1843,7 +1843,7 @@ dependencies = [ "proc-macro-utils", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -1916,9 +1916,9 @@ dependencies = [ [[package]] name = "read-fonts" -version = "0.15.6" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea23eedb4d938031b6d4343222444608727a6aa68ec355e13588d9947ffe92" +checksum = "81c524658d3b77930a391f559756d91dbe829ab6cf4687083f615d395df99722" dependencies = [ "font-types", ] @@ -2090,7 +2090,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -2216,9 +2216,9 @@ checksum = "f83ba502a3265efb76efb89b0a2f7782ad6f2675015d4ce37e4b547dda42b499" [[package]] name = "swash" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d06ff4664af8923625604261c645f5c4cc610cc83c84bec74b50d76237089de7" +checksum = "9af636fb90d39858650cae1088a37e2862dab4e874a0bb49d6dfb5b2dacf0e24" dependencies = [ "read-fonts", "yazi", @@ -2238,9 +2238,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.52" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ "proc-macro2", "quote", @@ -2267,22 +2267,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -2382,7 +2382,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] @@ -2539,7 +2539,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", "wasm-bindgen-shared", ] @@ -2573,7 +2573,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3082,9 +3082,9 @@ checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winit" -version = "0.29.14" +version = "0.29.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a3db69ffbe53a9babec7804da7a90f21020fcce1f2f5e5291e2311245b993d" +checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca" dependencies = [ "ahash", "android-activity", @@ -3238,7 +3238,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.53", ] [[package]] diff --git a/src/window.rs b/src/window.rs index d3b2105..bc8ad4c 100644 --- a/src/window.rs +++ b/src/window.rs @@ -475,6 +475,13 @@ where pub cursive_font_family: FontFamilyList, /// A collection of fonts that this window will load. pub fonts: FontCollection, + /// When true, Cushy will try to use "vertical sync" to try to eliminate + /// graphical tearing that can occur if the graphics card has a new frame + /// presented while the monitor is currently rendering another frame. + /// + /// Under the hood, Cushy uses `wgpu::PresentMode::AutoVsync` when true and + /// `wgpu::PresentMode::AutoNoVsync` when false. + pub vsync: bool, on_closed: Option, inner_size: Option>>, @@ -642,6 +649,7 @@ where fonts.push(include_bytes!("../assets/RobotoFlex.ttf").to_vec()); fonts }, + vsync: true, } } } @@ -689,6 +697,7 @@ where fantasy_font_family: self.fantasy_font_family, monospace_font_family: self.monospace_font_family, cursive_font_family: self.cursive_font_family, + vsync: self.vsync, }), }, )?; @@ -767,6 +776,7 @@ struct OpenWindow { fonts: FontState, cushy: Cushy, on_closed: Option, + vsync: bool, } impl OpenWindow @@ -1124,6 +1134,7 @@ where let theme = settings.theme.take().unwrap_or_default(); let inner_size = settings.inner_size.clone(); let on_closed = settings.on_closed.take(); + let vsync = settings.vsync; inner_size.set(window.inner_size()); @@ -1179,6 +1190,7 @@ where fonts, cushy, on_closed, + vsync, } } @@ -1212,7 +1224,6 @@ where let fonts_changed = self.fonts.next_frame(graphics.font_system().db_mut()); if fonts_changed { - println!("Rebuilding font system"); graphics.rebuild_font_system(); } let graphics = self.contents.new_frame(graphics); @@ -1707,6 +1718,14 @@ where self.prepare(window, graphics); } + fn present_mode(&self) -> wgpu::PresentMode { + if self.vsync { + wgpu::PresentMode::AutoVsync + } else { + wgpu::PresentMode::AutoNoVsync + } + } + fn focus_changed( &mut self, window: kludgine::app::Window<'_, WindowCommand>, @@ -1986,6 +2005,7 @@ pub(crate) mod sealed { pub cursive_font_family: FontFamilyList, pub font_data_to_load: FontCollection, pub on_closed: Option, + pub vsync: bool, } #[derive(Debug, Clone)] @@ -2514,6 +2534,7 @@ impl CushyWindowBuilder { cursive_font_family: FontFamilyList::default(), font_data_to_load: FontCollection::default(), on_closed: None, + vsync: false, }, );