From b6b7475ea32aa18ce58e79a23b5ae7b0f5fd912c Mon Sep 17 00:00:00 2001 From: Adrien Prokopowicz <6529475+prokopyl@users.noreply.github.com> Date: Fri, 7 Aug 2026 01:50:16 +0200 Subject: [PATCH 1/5] Add frame pacing test --- Cargo.toml | 2 +- examples/test-frame-pacing/Cargo.toml | 10 + examples/test-frame-pacing/LICENSE-Roboto | 201 ++++++++++++++++++ .../RobotoFlex-VariableFont.ttf | Bin 0 -> 227888 bytes examples/test-frame-pacing/src/main.rs | 173 +++++++++++++++ examples/test-frame-pacing/src/perf.rs | 73 +++++++ 6 files changed, 458 insertions(+), 1 deletion(-) create mode 100644 examples/test-frame-pacing/Cargo.toml create mode 100644 examples/test-frame-pacing/LICENSE-Roboto create mode 100644 examples/test-frame-pacing/RobotoFlex-VariableFont.ttf create mode 100644 examples/test-frame-pacing/src/main.rs create mode 100644 examples/test-frame-pacing/src/perf.rs diff --git a/Cargo.toml b/Cargo.toml index acc7bdcb..961b3f7c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -92,7 +92,7 @@ objc2-app-kit = { version = "0.3.2", default-features = false, features = [ ] } [workspace] -members = ["examples/open_parented", "examples/open_window", "examples/plugin_clack", "examples/render_femtovg", "examples/render_wgpu"] +members = ["examples/open_parented", "examples/open_window", "examples/plugin_clack", "examples/render_femtovg", "examples/render_wgpu", "examples/test-frame-pacing"] [lints.clippy] missing-safety-doc = "allow" diff --git a/examples/test-frame-pacing/Cargo.toml b/examples/test-frame-pacing/Cargo.toml new file mode 100644 index 00000000..315a98db --- /dev/null +++ b/examples/test-frame-pacing/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "test-frame-pacing" +version = "0.1.0" +edition = "2024" + +[dependencies] +baseview = { path = "../..", features = ["opengl", "tracing"] } +femtovg = "0.26.0" +tracing-subscriber = { workspace = true } +keyboard-types = "0.8.3" diff --git a/examples/test-frame-pacing/LICENSE-Roboto b/examples/test-frame-pacing/LICENSE-Roboto new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/examples/test-frame-pacing/LICENSE-Roboto @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/examples/test-frame-pacing/RobotoFlex-VariableFont.ttf b/examples/test-frame-pacing/RobotoFlex-VariableFont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ccade3ef330847b8d0f87e246b44d031dad9818e GIT binary patch literal 227888 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 N=BT9w;DfK&{{k^RbYK7g literal 0 HcmV?d00001 diff --git a/examples/test-frame-pacing/src/main.rs b/examples/test-frame-pacing/src/main.rs new file mode 100644 index 00000000..31e8b587 --- /dev/null +++ b/examples/test-frame-pacing/src/main.rs @@ -0,0 +1,173 @@ +use crate::perf::PerfGraph; +use baseview::dpi::LogicalSize; +use baseview::gl::{GlConfig, GlContext}; +use baseview::{ + Event, EventStatus, HandlerError, Window, WindowContext, WindowHandler, WindowSettings, + WindowSize, +}; +use femtovg::renderer::OpenGl; +use femtovg::{Align, Baseline, Canvas, Color, Paint, Renderer}; +use keyboard_types::{Key, KeyState, KeyboardEvent, NamedKey}; +use std::cell::{Cell, RefCell}; +use std::time::Instant; + +mod perf; + +const BAR_WIDTH: u32 = 10; +const BAR_COUNT: u32 = 5; +const BAR_SPEED_INCREMENTS: u32 = 3; + +struct FramePacingTest { + window_context: WindowContext, + gl_context: GlContext, + canvas: RefCell>, + perf_graph: PerfGraph, + previous_frame_time: Cell, + + bar_pos: Cell, + bar_speed: Cell, +} + +impl FramePacingTest { + fn new(window_context: WindowContext) -> Result { + let Some(gl_context) = window_context.gl_context() else { unreachable!() }; + unsafe { gl_context.make_current()? }; + + let renderer = + unsafe { OpenGl::new_from_function_cstr(|s| gl_context.get_proc_address(s)) }?; + + let mut canvas = Canvas::new(renderer)?; + let size = window_context.size(); + + canvas.set_size(size.physical.width, size.physical.height, size.scale_factor as f32); + + canvas + .add_font_mem(include_bytes!("../RobotoFlex-VariableFont.ttf")) + .expect("Cannot add font"); + + unsafe { gl_context.make_not_current()? }; + Ok(Self { + gl_context, + window_context, + canvas: canvas.into(), + perf_graph: PerfGraph::new(), + previous_frame_time: Instant::now().into(), + bar_pos: 0.into(), + bar_speed: 6.into(), + }) + } +} + +impl WindowHandler for FramePacingTest { + fn on_frame(&self) -> Result<(), HandlerError> { + let now = Instant::now(); + let dt = (now - self.previous_frame_time.get()).as_secs_f32(); + self.previous_frame_time.set(now); + + self.perf_graph.update(dt); + + unsafe { self.gl_context.make_current()? }; + + let mut canvas = self.canvas.borrow_mut(); + + let screen_height = canvas.height(); + let screen_width = canvas.width(); + + // Clear + canvas.clear_rect(0, 0, screen_width, screen_height, Color::black()); + + // Draw bar + + let spacing = (screen_width - (BAR_WIDTH * BAR_COUNT)) / (BAR_COUNT) + BAR_WIDTH; + + for i in 0..BAR_COUNT { + draw_bar_may_split( + &mut canvas, + self.bar_pos.get() + i * spacing, + screen_width, + screen_height, + BAR_WIDTH, + ); + } + + // Move bar + let bar_speed = self.bar_speed.get(); + + self.bar_pos.set((self.bar_pos.get() + bar_speed) % screen_width); + + // Extras + + let text_paint = Paint::color(Color::rgba(240, 240, 240, 255)) + .with_font_size(14.0) + .with_text_align(Align::Left) + .with_text_baseline(Baseline::Bottom); + + let _ = canvas.fill_text( + 5.0, + screen_height as f32 - 20.0, + format!("Speed: {} pixels/sec", bar_speed), + &text_paint, + ); + + canvas.restore(); + + canvas.save(); + canvas.reset(); + self.perf_graph.render(&mut canvas, 5.0, 5.0); + canvas.restore(); + + // Tell renderer to execute all drawing commands + canvas.flush(); + self.gl_context.swap_buffers()?; + unsafe { self.gl_context.make_not_current()? }; + + Ok(()) + } + + fn resized(&self, new_size: WindowSize) -> Result<(), HandlerError> { + let size = new_size.physical; + self.canvas.borrow_mut().set_size(size.width, size.height, new_size.scale_factor as f32); + + Ok(()) + } + + fn on_event(&self, event: Event) -> EventStatus { + if let Event::Keyboard(KeyboardEvent { key, state: KeyState::Down, .. }) = event { + match key { + Key::Named(NamedKey::ArrowLeft) => { + self.bar_speed.set(self.bar_speed.get().saturating_sub(BAR_SPEED_INCREMENTS)) + } + Key::Named(NamedKey::ArrowRight) => { + self.bar_speed.set(self.bar_speed.get().saturating_add(BAR_SPEED_INCREMENTS)) + } + _ => {} + } + } + + EventStatus::Captured + } +} + +fn main() -> Result<(), baseview::Error> { + tracing_subscriber::fmt::init(); + + let window_open_options = WindowSettings::new() + .with_title("Femtovg on Baseview") + .with_size(LogicalSize::new(512, 512)) + .with_gl_config(GlConfig { alpha_bits: 8, ..GlConfig::default() }); + + Window::create(window_open_options, FramePacingTest::new)?.run_until_closed()?; + Ok(()) +} + +fn draw_bar_may_split( + canvas: &mut Canvas, mut pos: u32, screen_width: u32, screen_height: u32, + bar_width: u32, +) { + pos %= screen_width; + canvas.clear_rect(pos, 0, BAR_WIDTH, screen_height, Color::white()); + + if pos + BAR_WIDTH > screen_width { + canvas.clear_rect(0, 0, BAR_WIDTH - (screen_width - pos), screen_height, Color::white()); + } +} diff --git a/examples/test-frame-pacing/src/perf.rs b/examples/test-frame-pacing/src/perf.rs new file mode 100644 index 00000000..43c43639 --- /dev/null +++ b/examples/test-frame-pacing/src/perf.rs @@ -0,0 +1,73 @@ +#![allow(unused)] + +use femtovg::{Align, Baseline, Canvas, Color, Paint, Path, Renderer}; +use std::cell::Cell; + +const HISTORY_COUNT: usize = 300; + +pub struct PerfGraph { + values: Vec>, + head: Cell, +} + +impl PerfGraph { + pub fn new() -> Self { + Self { values: vec![0.0.into(); HISTORY_COUNT], head: Default::default() } + } + + pub fn update(&self, frame_time: f32) { + self.head.set((self.head.get() + 1) % HISTORY_COUNT); + self.values[self.head.get()].set(frame_time); + } + + pub fn get_average(&self) -> f32 { + self.values.iter().map(|f| f.get()).sum::() / HISTORY_COUNT as f32 + } + + pub fn render(&self, canvas: &mut Canvas, x: f32, y: f32) { + let avg = self.get_average(); + + let w = 200.0; + let h = 35.0; + + let mut path = Path::new(); + path.rect(x, y, w, h); + canvas.fill_path(&path, &Paint::color(Color::rgba(0, 0, 0, 128))); + + let mut path = Path::new(); + path.move_to(x, y + h); + + for i in 0..HISTORY_COUNT { + let mut v = 1.0 / (0.00001 + self.values[(self.head.get() + i) % HISTORY_COUNT].get()); + if v > 80.0 { + v = 80.0; + } + let vx = x + (i as f32 / (HISTORY_COUNT - 1) as f32) * w; + let vy = y + h - ((v / 80.0) * h); + path.line_to(vx, vy); + } + + path.line_to(x + w, y + h); + canvas.fill_path(&path, &Paint::color(Color::rgba(255, 192, 0, 128))); + + let text_paint = Paint::color(Color::rgba(240, 240, 240, 255)).with_font_size(12.0); + let _ = canvas.fill_text(x + 5.0, y + 13.0, "Frame time", &text_paint); + + let text_paint = Paint::color(Color::rgba(240, 240, 240, 255)) + .with_font_size(14.0) + .with_text_align(Align::Right) + .with_text_baseline(Baseline::Top); + let _ = canvas.fill_text(x + w - 5.0, y, format!("{:.2} FPS", 1.0 / avg), &text_paint); + + let text_paint = Paint::color(Color::rgba(240, 240, 240, 200)) + .with_font_size(12.0) + .with_text_align(Align::Right) + .with_text_baseline(Baseline::Alphabetic); + let _ = canvas.fill_text( + x + w - 5.0, + y + h - 5.0, + format!("{:.2} ms", avg * 1000.0), + &text_paint, + ); + } +} From f8da2cd72f94c1e59940df1a67f5d1fa91a8662a Mon Sep 17 00:00:00 2001 From: Adrien Prokopowicz <6529475+prokopyl@users.noreply.github.com> Date: Fri, 21 Aug 2026 19:26:59 +0200 Subject: [PATCH 2/5] wip --- src/context.rs | 4 ++++ src/platform/x11/window_shared.rs | 2 ++ 2 files changed, 6 insertions(+) diff --git a/src/context.rs b/src/context.rs index 5c1ca9ca..5a1ed3a8 100644 --- a/src/context.rs +++ b/src/context.rs @@ -34,6 +34,10 @@ impl WindowContext { self.inner.request_close(); } + pub fn request_redraw(&self) { + self.inner.request_redraw() + } + /// Returns `true` if this window currently has keyboard focus, `false` otherwise. pub fn has_focus(&self) -> bool { self.inner.has_focus() diff --git a/src/platform/x11/window_shared.rs b/src/platform/x11/window_shared.rs index f885124d..61ee36a6 100644 --- a/src/platform/x11/window_shared.rs +++ b/src/platform/x11/window_shared.rs @@ -194,6 +194,8 @@ impl WindowInner { self.loop_signal.wakeup(); } + pub fn request_redraw(&self) {} + pub fn has_focus(&self) -> bool { self.is_focused.get() } From ad178113f6bb4c959481dbbdea048803f31747b8 Mon Sep 17 00:00:00 2001 From: Adrien Prokopowicz <6529475+prokopyl@users.noreply.github.com> Date: Fri, 21 Aug 2026 23:29:31 +0200 Subject: [PATCH 3/5] Frame pacing works on X11! --- Cargo.toml | 2 +- examples/open_window/src/main.rs | 16 +--- examples/test-frame-pacing/src/main.rs | 2 +- src/handler.rs | 5 +- src/platform/x11/event_loop.rs | 104 ++++++++++++++++++++++--- src/platform/x11/visibility_tree.rs | 2 +- src/platform/x11/window_shared.rs | 6 +- src/platform/x11/xcb_connection.rs | 7 ++ src/platform/x11/xcb_window.rs | 52 ++++++++++++- src/settings.rs | 10 +++ 10 files changed, 177 insertions(+), 29 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 961b3f7c..90c4cafc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,7 +40,7 @@ dpi = "0.1.2" tracing = { version = "0.1", optional = true } [target.'cfg(target_os="linux")'.dependencies] -x11rb = { version = "0.13.2", features = ["cursor", "resource_manager", "allow-unsafe-code", "dl-libxcb"], default-features = false } +x11rb = { version = "0.13.2", features = ["cursor", "dri3", "present", "resource_manager", "allow-unsafe-code", "dl-libxcb"], default-features = false } xkbcommon-dl = { version = "0.4.2", features = ["x11"] } x11-dl = { version = "2.21.0" } calloop = "0.14.4" diff --git a/examples/open_window/src/main.rs b/examples/open_window/src/main.rs index 83b299b1..1b806be3 100644 --- a/examples/open_window/src/main.rs +++ b/examples/open_window/src/main.rs @@ -24,7 +24,6 @@ struct OpenWindowExample { surface: RefCell>, mouse_pos: Cell>, is_cursor_inside: Cell, - damaged: Cell, } impl WindowHandler for OpenWindowExample { @@ -35,17 +34,12 @@ impl WindowHandler for OpenWindowExample { (NonZeroU32::new(new_size.physical.width), NonZeroU32::new(new_size.physical.height)) { self.surface.borrow_mut().resize(width, height)?; - self.damaged.set(true); } Ok(()) } - fn on_frame(&self) -> Result<(), HandlerError> { - if !self.damaged.get() { - return Ok(()); - } - + fn draw(&self) -> Result<(), HandlerError> { let mut surface = self.surface.borrow_mut(); let mut pixels = surface.buffer_mut()?; let size = self.window_context.size(); @@ -105,7 +99,6 @@ impl WindowHandler for OpenWindowExample { } pixels.present()?; - self.damaged.set(false); while let Ok(message) = self.rx.borrow_mut().pop() { println!("Message: {:?}", message); @@ -120,15 +113,15 @@ impl WindowHandler for OpenWindowExample { Event::Mouse(MouseEvent::ButtonPressed { .. }) => copy_to_clipboard("This is a test!"), Event::Mouse(MouseEvent::CursorMoved { position, .. }) => { self.mouse_pos.set(position); - self.damaged.set(true); + self.window_context.request_redraw(); } Event::Mouse(MouseEvent::CursorEntered) => { self.is_cursor_inside.set(true); - self.damaged.set(true); + self.window_context.request_redraw(); } Event::Mouse(MouseEvent::CursorLeft) => { self.is_cursor_inside.set(false); - self.damaged.set(true); + self.window_context.request_redraw(); } _ => {} } @@ -164,7 +157,6 @@ fn main() -> Result<(), baseview::Error> { rx: rx.into(), mouse_pos: PhysicalPosition::new(0., 0.).into(), is_cursor_inside: false.into(), - damaged: true.into(), }) })? .run_until_closed()?; diff --git a/examples/test-frame-pacing/src/main.rs b/examples/test-frame-pacing/src/main.rs index 31e8b587..18fa637c 100644 --- a/examples/test-frame-pacing/src/main.rs +++ b/examples/test-frame-pacing/src/main.rs @@ -59,7 +59,7 @@ impl FramePacingTest { } impl WindowHandler for FramePacingTest { - fn on_frame(&self) -> Result<(), HandlerError> { + fn draw(&self) -> Result<(), HandlerError> { let now = Instant::now(); let dt = (now - self.previous_frame_time.get()).as_secs_f32(); self.previous_frame_time.set(now); diff --git a/src/handler.rs b/src/handler.rs index 9b39cd91..4f893389 100644 --- a/src/handler.rs +++ b/src/handler.rs @@ -2,11 +2,12 @@ use super::*; use crate::platform::Result; pub trait WindowHandler: 'static { - /// Requests the handler to draw a new frame. + /// Requests the handler to draw a new frame immediately. /// /// If this returns an error, the window will be considered unable to render its contents, and /// will be subsequently closed. - fn on_frame(&self) -> core::result::Result<(), HandlerError>; + fn draw(&self) -> core::result::Result<(), HandlerError>; + /// Informs the handler that the window has been resized. /// /// # Errors diff --git a/src/platform/x11/event_loop.rs b/src/platform/x11/event_loop.rs index 2813d7b4..55e4a267 100644 --- a/src/platform/x11/event_loop.rs +++ b/src/platform/x11/event_loop.rs @@ -21,6 +21,7 @@ use std::sync::mpsc::Receiver; use std::time::{Duration, Instant}; use x11rb::connection::Connection; use x11rb::errors::ConnectionError; +use x11rb::protocol::present::CompleteKind; use x11rb::protocol::Event as XEvent; pub struct MainThreadCaller { @@ -53,7 +54,9 @@ pub(crate) struct EventLoop { new_size: Option>, new_parent_size: Option>, - exposed: bool, + draw_now: bool, + last_requested_serial: Option, + last_received_present: Option<(u32, u64)>, loop_signal: LoopSignal, @@ -75,7 +78,7 @@ impl EventLoop { ) -> Result { let loop_handle = inner.handle(); - Self::setup_fallback_frame_timer(&loop_handle)?; + // Self::setup_fallback_frame_timer(&loop_handle)?; loop_handle .insert_source( @@ -97,7 +100,9 @@ impl EventLoop { handler, new_size: None, new_parent_size: None, - exposed: false, + draw_now: false, + last_requested_serial: None, + last_received_present: None, drag_n_drop: DragNDropState::NoCurrentSession, xkb_state: XkbcommonState::new(&window.connection), run_error: None, @@ -125,7 +130,7 @@ impl EventLoop { const FRAME_INTERVAL: Duration = Duration::from_millis(15); fn handle_frame(evloop: &mut EventLoop, previous_deadline: Instant) -> TimeoutAction { - evloop.exposed = true; + evloop.draw_now = true; // We'll try to keep a consistent frame pace. If the last frame couldn't be processed in // the expected frame time, this will throttle down to prevent multiple frames from @@ -152,24 +157,57 @@ impl EventLoop { } fn handle_redraw(&mut self) { - if !self.exposed { + if !self.draw_now { return; } - self.exposed = false; + self.draw_now = false; if !self.window.visibility_state.own_window_is_viewable() { return; } - if let Err(e) = self.handler.on_frame() { + if let Err(e) = self.handler.draw() { self.trigger_fatal_error(e.into()); return; } + self.window.present_notify_requested.set(true); + // Any socket error will be handled in the next poll let _ = self.window.connection.conn.flush(); } + fn handle_present_notify(&mut self) -> Result<(), ConnectionError> { + if !self.window.present_notify_requested.get() { + return Ok(()); + } + + let (next_serial, target_msc) = + match (self.last_requested_serial, self.last_received_present) { + // First request, always send + (None, None) => (0, 0), + (Some(sent_serial), Some((received_serial, last_msc))) + if sent_serial == received_serial => + { + // TODO: why does 2 work but not 1 for next MSC?? + (sent_serial.wrapping_add(1), last_msc.wrapping_add(2)) + } + // We sent our first request but have not gotten a response yet. + // Or, we sent a request, but the last response we've gotten isn't that one. + // Do not send. + _ => { + self.window.present_notify_requested.set(false); + return Ok(()); + } + }; + + self.window.xcb_window.present_notify(target_msc, next_serial)?.check_warn(); // TODO: handle error + self.last_requested_serial = Some(next_serial); + self.window.present_notify_requested.set(false); + + Ok(()) + } + fn handle_coalesced_resize_events(&mut self) -> Result<(), FatalError> { if let Some(new_parent_size) = self.new_parent_size.take() { if new_parent_size != self.window.get_size() { @@ -210,7 +248,7 @@ impl EventLoop { } // Immediately schedule a redraw, do not wait for an "expose" event - self.exposed = true; + self.window.present_notify_requested.set(true); } Ok(()) @@ -312,6 +350,7 @@ impl EventLoop { loop { self.handle_coalesced_resize_events()?; + self.handle_present_notify()?; self.handle_redraw(); if !self.drain_xcb_events()? { @@ -422,7 +461,9 @@ impl EventLoop { } } - XEvent::Expose(e) if e.window == self.window.raw_id() => self.exposed = true, + XEvent::Expose(e) if e.window == self.window.raw_id() => { + self.window.present_notify_requested.set(true) + } //// // mouse @@ -516,7 +557,8 @@ impl EventLoop { let became_viewable = self.window.visibility_state.window_mapped(window_id); if became_viewable { - self.exposed = true; + self.window.xcb_window.present_select_input()?.unwrap().check_warn(); // TODO: unwrap: fallback to timer + self.window.present_notify_requested.set(true); } } } @@ -549,6 +591,48 @@ impl EventLoop { } } + XEvent::PresentCompleteNotify(e) => { + if e.kind != CompleteKind::NOTIFY_MSC { + return Ok(()); + } + + if e.window != self.window.raw_id() { + dbg!(e.window); + return Ok(()); + } + + let Some(last_requested_serial) = self.last_requested_serial else { + eprintln!("Received serial without request: {}", e.serial); + return Ok(()); + }; + + if last_requested_serial != e.serial { + eprintln!( + "Received serial not matching: {}, requested: {}", + e.serial, last_requested_serial + ); + return Ok(()); + } + + if let Some((last_received_serial, last_received_msc)) = self.last_received_present + { + if last_received_serial == e.serial { + eprintln!("Already handled serial: {}", last_received_serial); + return Ok(()); + } + + if e.msc <= last_received_msc { + eprintln!("Already handled MSC: {}", e.msc); + self.last_received_present = Some((e.serial, e.msc)); + //self.window.present_notify_requested.set(true); + return Ok(()); + } + } + + self.last_received_present = Some((e.serial, e.msc)); + self.draw_now = true; + } + _ => {} } diff --git a/src/platform/x11/visibility_tree.rs b/src/platform/x11/visibility_tree.rs index da367abe..067f9742 100644 --- a/src/platform/x11/visibility_tree.rs +++ b/src/platform/x11/visibility_tree.rs @@ -113,7 +113,7 @@ impl AncestorVisibilityState { } if self.own_window_viewable.get() { - return false; + return true; } let all_mapped = self.ancestry.check_all_mapped(); diff --git a/src/platform/x11/window_shared.rs b/src/platform/x11/window_shared.rs index 61ee36a6..40f0d0bd 100644 --- a/src/platform/x11/window_shared.rs +++ b/src/platform/x11/window_shared.rs @@ -59,6 +59,7 @@ pub(crate) struct WindowInner { pub(crate) is_focused: Cell, pub(crate) is_mapped: Cell, + pub(crate) present_notify_requested: Cell, pub(crate) loop_signal: LoopSignal, pub(crate) visibility_state: AncestorVisibilityState, @@ -144,6 +145,7 @@ impl WindowInner { is_focused: false.into(), is_mapped: false.into(), + present_notify_requested: false.into(), main_thread_shared: shared, visibility_state, @@ -194,7 +196,9 @@ impl WindowInner { self.loop_signal.wakeup(); } - pub fn request_redraw(&self) {} + pub fn request_redraw(&self) { + self.present_notify_requested.set(true) + } pub fn has_focus(&self) -> bool { self.is_focused.get() diff --git a/src/platform/x11/xcb_connection.rs b/src/platform/x11/xcb_connection.rs index 229238e3..2b6a4314 100644 --- a/src/platform/x11/xcb_connection.rs +++ b/src/platform/x11/xcb_connection.rs @@ -6,9 +6,11 @@ use std::cell::RefCell; use std::collections::hash_map::{Entry, HashMap}; use std::num::NonZeroU32; use std::sync::Arc; +use x11rb::connection::RequestConnection; use x11rb::cookie::VoidCookie; use x11rb::cursor::Handle as CursorHandle; use x11rb::errors::ConnectionError; +use x11rb::protocol::present; use x11rb::protocol::xproto::{ self, ChangeWindowAttributesAux, ConnectionExt, Cursor, EventMask, Screen, }; @@ -54,6 +56,8 @@ pub struct X11Connection { pub(crate) resources: resource_manager::Database, pub(crate) cursor_handle: CursorHandle, pub(crate) cursor_cache: RefCell>, + + pub(crate) present_supported: bool, } impl X11Connection { @@ -66,12 +70,15 @@ impl X11Connection { let resources = resource_manager::new_from_default(xcb_conn)?; let cursor_handle = CursorHandle::new(xcb_conn, screen.into(), &resources)?.reply()?; + let present_supported = conn.extension_information(present::X11_EXTENSION_NAME)?.is_some(); + Ok(Self { conn: Arc::new(conn), atoms, resources, cursor_handle, cursor_cache: RefCell::new(HashMap::new()), + present_supported, }) } diff --git a/src/platform/x11/xcb_window.rs b/src/platform/x11/xcb_window.rs index 252c07dc..778b1e2c 100644 --- a/src/platform/x11/xcb_window.rs +++ b/src/platform/x11/xcb_window.rs @@ -8,6 +8,8 @@ use x11rb::connection::Connection; use x11rb::cookie::VoidCookie; use x11rb::errors::{ConnectionError, ReplyOrIdError}; use x11rb::properties::WmSizeHints; +use x11rb::protocol::present; +use x11rb::protocol::present::ConnectionExt; use x11rb::protocol::xproto::{ AtomEnum, ConfigureWindowAux, ConnectionExt as _, CreateWindowAux, EventMask, PropMode, WindowClass, @@ -18,6 +20,7 @@ use x11rb::xcb_ffi::XCBConnection; pub struct XcbWindow { connection: Rc, window_id: NonZeroU32, + present_notify_event_id: Option, } impl XcbWindow { @@ -59,7 +62,33 @@ impl XcbWindow { .border_pixel(0), )?; - Ok(Self { window_id, connection }) + let present_notify_event_id = if !connection.present_supported { + None + } else { + let Some(event_id) = NonZero::new(connection.conn.generate_id()?) else { + unreachable!(); + }; + + Some(event_id) + }; + + Ok(Self { window_id, connection, present_notify_event_id }) + } + + pub fn present_select_input( + &self, + ) -> Result>, ConnectionError> { + let Some(event_id) = self.present_notify_event_id else { + return Ok(None); + }; + + eprintln!("Present input!"); + + Ok(Some(self.connection.conn.present_select_input( + event_id.get(), + self.window_id.get(), + present::EventMask::COMPLETE_NOTIFY, + )?)) } pub fn map_window(&self) -> Result, ConnectionError> { @@ -126,6 +155,16 @@ impl XcbWindow { size_hints.set_normal_hints(&self.connection.conn as &XCBConnection, self.window_id.get()) } + pub fn present_supported(&self) -> bool { + self.present_notify_event_id.is_some() + } + + pub fn present_notify( + &self, target_msc: u64, serial: u32, + ) -> Result, ConnectionError> { + self.connection.conn.present_notify_msc(self.window_id.get(), serial, target_msc, 1, 0) + } + #[inline] pub fn id(&self) -> NonZeroU32 { self.window_id @@ -134,6 +173,17 @@ impl XcbWindow { impl Drop for XcbWindow { fn drop(&mut self) { + if let Some(event_id) = self.present_notify_event_id { + match self.connection.conn.present_select_input( + event_id.get(), + self.window_id.get(), + present::EventMask::NO_EVENT, + ) { + Err(e) => crate::warn!("Failed to send request to switch XPresent off: {}", e), + Ok(cookie) => cookie.check_warn(), + } + } + match self.connection.conn.destroy_window(self.window_id.get()) { Err(e) => crate::warn!("Failed to send request to destroy X window: {}", e), Ok(cookie) => cookie.check_warn(), diff --git a/src/settings.rs b/src/settings.rs index 671f1760..01ebc2e5 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -49,6 +49,8 @@ pub struct WindowSettings { /// On macOS, this function is always a no-op. pub fallback_scale_factor: Option, + pub redraw_strategy: RedrawStrategy, + /// If provided, then an OpenGL context will be created for this window. You'll be able to /// access this context through [crate::WindowContext::gl_context]. /// @@ -146,6 +148,7 @@ impl Default for WindowSettings { resizable: true, min_size: None, max_size: None, + redraw_strategy: RedrawStrategy::Continuous, #[cfg(feature = "opengl")] gl_config: None, } @@ -193,3 +196,10 @@ impl From for ParentWindowHandle { Self { inner } } } + +#[non_exhaustive] +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum RedrawStrategy { + Continuous, + OnDemand, +} From 078accc2664398543de206e839c27f129542b19e Mon Sep 17 00:00:00 2001 From: Adrien Prokopowicz <6529475+prokopyl@users.noreply.github.com> Date: Sat, 22 Aug 2026 00:39:18 +0200 Subject: [PATCH 4/5] X11: implement on_demand redraw strategy --- examples/open_parented/src/main.rs | 4 ++-- examples/open_window/src/main.rs | 8 +++++--- examples/plugin_clack/src/window_handler.rs | 2 +- examples/render_femtovg/src/main.rs | 11 +---------- examples/render_wgpu/src/main.rs | 2 +- src/platform/x11/event_loop.rs | 15 ++++----------- src/platform/x11/window_shared.rs | 8 ++++++-- src/platform/x11/xcb_window.rs | 2 -- src/settings.rs | 6 ++++++ 9 files changed, 26 insertions(+), 32 deletions(-) diff --git a/examples/open_parented/src/main.rs b/examples/open_parented/src/main.rs index 4c9433fc..f242c742 100644 --- a/examples/open_parented/src/main.rs +++ b/examples/open_parented/src/main.rs @@ -31,7 +31,7 @@ impl ParentWindowHandler { } impl WindowHandler for ParentWindowHandler { - fn on_frame(&self) -> Result<(), HandlerError> { + fn draw(&self) -> Result<(), HandlerError> { let mut surface = self.surface.borrow_mut(); let mut buf = surface.buffer_mut()?; if self.damaged.get() { @@ -86,7 +86,7 @@ impl ChildWindowHandler { } impl WindowHandler for ChildWindowHandler { - fn on_frame(&self) -> Result<(), HandlerError> { + fn draw(&self) -> Result<(), HandlerError> { let mut surface = self.surface.borrow_mut(); let mut buf = surface.buffer_mut()?; if self.damaged.get() { diff --git a/examples/open_window/src/main.rs b/examples/open_window/src/main.rs index 1b806be3..8c00cfcb 100644 --- a/examples/open_window/src/main.rs +++ b/examples/open_window/src/main.rs @@ -8,8 +8,8 @@ use rtrb::{Consumer, RingBuffer}; use baseview::copy_to_clipboard; use baseview::dpi::{LogicalSize, PhysicalPosition}; use baseview::{ - Event, EventStatus, HandlerError, MouseEvent, Window, WindowContext, WindowHandler, - WindowSettings, WindowSize, + Event, EventStatus, HandlerError, MouseEvent, RedrawStrategy, Window, WindowContext, + WindowHandler, WindowSettings, WindowSize, }; #[derive(Debug, Clone)] @@ -133,7 +133,9 @@ impl WindowHandler for OpenWindowExample { } fn main() -> Result<(), baseview::Error> { - let window_open_options = WindowSettings::new().with_size(LogicalSize::new(512.0, 512.0)); + let window_open_options = WindowSettings::new() + .with_redraw_strategy(RedrawStrategy::OnDemand) + .with_size(LogicalSize::new(512.0, 512.0)); let (mut tx, rx) = RingBuffer::new(128); diff --git a/examples/plugin_clack/src/window_handler.rs b/examples/plugin_clack/src/window_handler.rs index 16800ba9..f74b5c32 100644 --- a/examples/plugin_clack/src/window_handler.rs +++ b/examples/plugin_clack/src/window_handler.rs @@ -29,7 +29,7 @@ impl WindowHandler for OpenWindowExample { Ok(()) } - fn on_frame(&self) -> Result<(), HandlerError> { + fn draw(&self) -> Result<(), HandlerError> { if !self.damaged.get() { return Ok(()); } diff --git a/examples/render_femtovg/src/main.rs b/examples/render_femtovg/src/main.rs index f2e3e0d5..db169e55 100644 --- a/examples/render_femtovg/src/main.rs +++ b/examples/render_femtovg/src/main.rs @@ -13,7 +13,6 @@ struct FemtovgExample { gl_context: GlContext, canvas: RefCell>, current_mouse_position: Cell>, - damaged: Cell, } impl FemtovgExample { @@ -34,18 +33,13 @@ impl FemtovgExample { gl_context, window_context, canvas: canvas.into(), - damaged: true.into(), current_mouse_position: Cell::new(PhysicalPosition::default()), }) } } impl WindowHandler for FemtovgExample { - fn on_frame(&self) -> Result<(), HandlerError> { - if !self.damaged.get() { - return Ok(()); - } - + fn draw(&self) -> Result<(), HandlerError> { let context = &self.gl_context; unsafe { context.make_current()? }; @@ -81,7 +75,6 @@ impl WindowHandler for FemtovgExample { canvas.flush(); context.swap_buffers()?; unsafe { context.make_not_current()? }; - self.damaged.set(false); Ok(()) } @@ -89,7 +82,6 @@ impl WindowHandler for FemtovgExample { fn resized(&self, new_size: WindowSize) -> Result<(), HandlerError> { let size = new_size.physical; self.canvas.borrow_mut().set_size(size.width, size.height, new_size.scale_factor as f32); - self.damaged.set(true); Ok(()) } @@ -106,7 +98,6 @@ impl WindowHandler for FemtovgExample { if position.y > 400. && !self.window_context.has_focus() { let _ = self.window_context.focus(); } - self.damaged.set(true); } event => log_event(&event), }; diff --git a/examples/render_wgpu/src/main.rs b/examples/render_wgpu/src/main.rs index 7d254377..51b4bc45 100644 --- a/examples/render_wgpu/src/main.rs +++ b/examples/render_wgpu/src/main.rs @@ -131,7 +131,7 @@ impl WgpuExample { } impl WindowHandler for WgpuExample { - fn on_frame(&self) -> Result<(), HandlerError> { + fn draw(&self) -> Result<(), HandlerError> { let mut surface = self.surface.borrow_mut(); let surface_texture = match surface.get_current_texture() { diff --git a/src/platform/x11/event_loop.rs b/src/platform/x11/event_loop.rs index 55e4a267..2426c1c4 100644 --- a/src/platform/x11/event_loop.rs +++ b/src/platform/x11/event_loop.rs @@ -8,8 +8,8 @@ use crate::platform::x11::error::FatalError; use crate::platform::x11::window_thread::{ HostCallback, WindowThreadRequest, WindowThreadResponseMessage, }; -use crate::warn; use crate::wrappers::xkbcommon::XkbcommonState; +use crate::{warn, RedrawStrategy}; use crate::{Event, MouseButton, MouseEvent, ScrollDelta, WindowEvent, WindowHandler, WindowSize}; use calloop::generic::Generic; use calloop::timer::{TimeoutAction, Timer}; @@ -171,7 +171,9 @@ impl EventLoop { return; } - self.window.present_notify_requested.set(true); + if self.window.redraw_strategy == RedrawStrategy::Continuous { + self.window.present_notify_requested.set(true); + } // Any socket error will be handled in the next poll let _ = self.window.connection.conn.flush(); @@ -597,34 +599,25 @@ impl EventLoop { } if e.window != self.window.raw_id() { - dbg!(e.window); return Ok(()); } let Some(last_requested_serial) = self.last_requested_serial else { - eprintln!("Received serial without request: {}", e.serial); return Ok(()); }; if last_requested_serial != e.serial { - eprintln!( - "Received serial not matching: {}, requested: {}", - e.serial, last_requested_serial - ); return Ok(()); } if let Some((last_received_serial, last_received_msc)) = self.last_received_present { if last_received_serial == e.serial { - eprintln!("Already handled serial: {}", last_received_serial); return Ok(()); } if e.msc <= last_received_msc { - eprintln!("Already handled MSC: {}", e.msc); self.last_received_present = Some((e.serial, e.msc)); - //self.window.present_notify_requested.set(true); return Ok(()); } } diff --git a/src/platform/x11/window_shared.rs b/src/platform/x11/window_shared.rs index 40f0d0bd..eafa9d9c 100644 --- a/src/platform/x11/window_shared.rs +++ b/src/platform/x11/window_shared.rs @@ -6,7 +6,7 @@ use crate::platform::x11::xcb_connection::get_size_hints; use crate::platform::x11::xcb_window::XcbWindow; use crate::platform::*; use crate::utils::SizingStrategy; -use crate::{warn, MouseCursor, WindowHandler, WindowSettings, WindowSize}; +use crate::{warn, MouseCursor, RedrawStrategy, WindowHandler, WindowSettings, WindowSize}; use calloop::LoopSignal; use dpi::{PhysicalSize, Size}; use raw_window_handle::{DisplayHandle, XlibWindowHandle}; @@ -54,6 +54,7 @@ pub(crate) struct WindowInner { window_size: Cell>, pub(crate) sizing_strategy: SizingStrategy, + pub(crate) redraw_strategy: RedrawStrategy, mouse_cursor: Cell, pub(crate) visual_id: Visualid, @@ -140,6 +141,7 @@ impl WindowInner { suggested: options.fallback_scale_factor.into(), }, sizing_strategy, + redraw_strategy: options.redraw_strategy, mouse_cursor: MouseCursor::default().into(), loop_signal: ev_loop.get_signal(), @@ -197,7 +199,9 @@ impl WindowInner { } pub fn request_redraw(&self) { - self.present_notify_requested.set(true) + if self.redraw_strategy == RedrawStrategy::OnDemand { + self.present_notify_requested.set(true); + } } pub fn has_focus(&self) -> bool { diff --git a/src/platform/x11/xcb_window.rs b/src/platform/x11/xcb_window.rs index 778b1e2c..97bd8479 100644 --- a/src/platform/x11/xcb_window.rs +++ b/src/platform/x11/xcb_window.rs @@ -82,8 +82,6 @@ impl XcbWindow { return Ok(None); }; - eprintln!("Present input!"); - Ok(Some(self.connection.conn.present_select_input( event_id.get(), self.window_id.get(), diff --git a/src/settings.rs b/src/settings.rs index 01ebc2e5..f681f3f4 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -128,6 +128,12 @@ impl WindowSettings { self } + #[inline] + pub fn with_redraw_strategy(mut self, redraw_strategy: RedrawStrategy) -> Self { + self.redraw_strategy = redraw_strategy; + self + } + /// Sets [`gl_config`](Self::gl_config) to the given value. #[cfg(feature = "opengl")] #[inline] From bfe03586c2881d16db86c7ac6a3d3381949e264d Mon Sep 17 00:00:00 2001 From: Adrien Prokopowicz <6529475+prokopyl@users.noreply.github.com> Date: Sat, 22 Aug 2026 06:05:08 +0200 Subject: [PATCH 5/5] wip --- src/platform/x11/event_loop.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/x11/event_loop.rs b/src/platform/x11/event_loop.rs index 2426c1c4..506149f1 100644 --- a/src/platform/x11/event_loop.rs +++ b/src/platform/x11/event_loop.rs @@ -352,8 +352,8 @@ impl EventLoop { loop { self.handle_coalesced_resize_events()?; - self.handle_present_notify()?; self.handle_redraw(); + self.handle_present_notify()?; if !self.drain_xcb_events()? { break;