Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
937 changes: 463 additions & 474 deletions Cargo.lock

Large diffs are not rendered by default.

14 changes: 7 additions & 7 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ block2 = { version = "0.6" }
color-eyre = { version = "0.6" }
device_query = { version = "4.0" }
directories = { version = "6.0" }
egui = { version = "0.33" }
egui-phosphor = { version = "0.11", features = ["fill"] }
egui-wgpu = { version = "0.33" }
egui-winit = { version = "0.33" }
egui = { version = "0.34" }
egui-phosphor = { version = "0.12", features = ["fill"] }
egui-wgpu = { version = "0.34" }
egui-winit = { version = "0.34" }
global-hotkey = { version = "0.7", features = ["tracing"] }
image = { version = "0.25", default-features = false, features = ["png"] }
objc = { version = "0.2" }
Expand All @@ -37,12 +37,12 @@ objc2-vision = { version = "0.3" }
pollster = { version = "0.4" }
serde = { version = "1.0", features = ["derive"] }
thiserror = { version = "2.0" }
toml = { version = "1.0" }
toml = { version = "1.1" }
tracing = { version = "0.1" }
tracing-appender = { version = "0.2" }
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
tray-icon = { version = "0.21" }
wgpu = { version = "27.0" }
tray-icon = { version = "0.22" }
wgpu = { version = "29.0" }
winit = { version = "0.30", features = ["rwh_06"] }
xcap = { version = "0.9" }

Expand Down
4 changes: 2 additions & 2 deletions apps/rsnap/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ path = "src/main.rs"

[dependencies]
color-eyre = { workspace = true }
core-foundation = "0.10"
core-foundation = { version = "0.10" }
directories = { workspace = true }
egui = { workspace = true }
egui-phosphor = { workspace = true }
Expand All @@ -40,7 +40,7 @@ wgpu = { workspace = true }
winit = { workspace = true }

[dev-dependencies]
criterion = { version = "0.7", features = ["html_reports"] }
criterion = { version = "0.8", features = ["html_reports"] }

[target.'cfg(target_os = "macos")'.dependencies]
objc2 = { workspace = true }
Expand Down
8 changes: 5 additions & 3 deletions apps/rsnap/src/settings_window/bench_support.rs
Original file line number Diff line number Diff line change
Expand Up @@ -195,14 +195,16 @@ impl SettingsUiBenchHarness {
let mut settings_changed = false;
let host = &mut self.host;
let settings = &mut self.settings;
let full_output = self.ctx.run(raw_input, |ctx| {
CentralPanel::default().show(ctx, |ui| {
let full_output = self.ctx.run_ui(raw_input, |ui| {
let ctx = ui.ctx().clone();

CentralPanel::default().show_inside(ui, |ui| {
sections::with_settings_density(ui, combo_width, |ui| {
ScrollArea::vertical().auto_shrink([false, false]).show(ui, |ui| {
settings_changed |= sections::render_all_sections_with_defaults(
host,
ui,
ctx,
&ctx,
settings,
section_defaults,
);
Expand Down
17 changes: 10 additions & 7 deletions apps/rsnap/src/settings_window/chrome.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,22 @@ use crate::settings_window::{
use rsnap_overlay::ThemeMode;

impl SettingsWindow {
pub(super) fn ui(&mut self, ctx: &Context, settings: &mut AppSettings) -> bool {
self.sync_theme(ctx, settings.theme_mode);
self.maybe_autosize_window(ctx);
pub(super) fn ui(&mut self, root_ui: &mut Ui, settings: &mut AppSettings) -> bool {
let ctx = root_ui.ctx().clone();

self.sync_theme(&ctx, settings.theme_mode);
self.maybe_autosize_window(&ctx);

let mut changed = false;

CentralPanel::default().show(ctx, |ui| {
CentralPanel::default().show_inside(root_ui, |ui| {
let ctx = ui.ctx().clone();
let combo_width = self.combo_width;

sections::with_settings_density(ui, combo_width, |ui| {
changed |= self.render_titlebar_controls(ui, ctx, settings);
changed |= self.render_titlebar_controls(ui, &ctx, settings);
ScrollArea::vertical().auto_shrink([false, false]).show(ui, |ui| {
changed |= sections::render_all_sections(self, ui, ctx, settings);
changed |= sections::render_all_sections(self, ui, &ctx, settings);
});
});
});
Expand All @@ -39,7 +42,7 @@ impl SettingsWindow {
return;
}

let font_id = TextStyle::Body.resolve(&ctx.style());
let font_id = TextStyle::Body.resolve(&ctx.global_style());
let measure = |text: &str| -> f32 {
ctx.fonts_mut(|fonts| {
fonts.layout_no_wrap(text.to_owned(), font_id.clone(), Color32::WHITE).size().x
Expand Down
101 changes: 80 additions & 21 deletions apps/rsnap/src/settings_window/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,13 @@ use std::time::Instant;
use color_eyre::eyre::{self, Result, WrapErr};
use egui::ViewportId;
use egui_wgpu::ScreenDescriptor;
use wgpu::CurrentSurfaceTexture;
use wgpu::ExperimentalFeatures;
use wgpu::Features;
use wgpu::InstanceDescriptor;
use wgpu::LoadOp;
use wgpu::MemoryHints;
use wgpu::PowerPreference;
use wgpu::StoreOp;
use wgpu::SurfaceError;
use wgpu::SurfaceTexture;
use wgpu::TextureFormat;
use wgpu::TextureUsages;
Expand All @@ -24,6 +23,29 @@ use winit::window::Window;
use crate::settings::AppSettings;
use crate::settings_window::SettingsWindow;

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
enum SurfaceFrameSkipReason {
Timeout,
Occluded,
}
impl SurfaceFrameSkipReason {
const fn as_str(self) -> &'static str {
match self {
Self::Timeout => "timeout",
Self::Occluded => "occluded",
}
}

const fn should_request_redraw(self) -> bool {
matches!(self, Self::Timeout)
}
}

enum AcquiredSurfaceFrame {
Ready(SurfaceTexture),
Skipped(SurfaceFrameSkipReason),
}

impl SettingsWindow {
pub fn draw(&mut self, settings: &mut AppSettings) -> Result<bool> {
if self.last_redraw.elapsed().as_millis() > 1_500 {
Expand All @@ -35,8 +57,8 @@ impl SettingsWindow {
let raw_input = self.egui_state.take_egui_input(&self.window);
let mut settings_changed = false;
let egui_ctx = self.egui_ctx.clone();
let full_output = egui_ctx.run(raw_input, |ctx| {
settings_changed = self.ui(ctx, settings);
let full_output = egui_ctx.run_ui(raw_input, |ui| {
settings_changed = self.ui(ui, settings);
});

if let Some(repaint_delay) = full_output
Expand Down Expand Up @@ -65,7 +87,22 @@ impl SettingsWindow {
size_in_pixels: [size.width.max(1), size.height.max(1)],
pixels_per_point: self.window.scale_factor() as f32,
};
let frame = self.acquire_frame()?;
let frame = match self.acquire_frame()? {
AcquiredSurfaceFrame::Ready(frame) => frame,
AcquiredSurfaceFrame::Skipped(reason) => {
tracing::trace!(
window_id = ?self.window.id(),
reason = reason.as_str(),
"Skipped settings window frame acquisition."
);

if reason.should_request_redraw() {
self.window.request_redraw();
}

return Ok(settings_changed);
},
};
let view = frame.texture.create_view(&TextureViewDescriptor::default());
let mut encoder = self.gpu.device.create_command_encoder(&wgpu::CommandEncoderDescriptor {
label: Some("rsnap-settings encoder"),
Expand All @@ -80,7 +117,7 @@ impl SettingsWindow {
);

{
let panel_fill = self.egui_ctx.style().visuals.panel_fill;
let panel_fill = self.egui_ctx.global_style().visuals.panel_fill;
let clear = wgpu::Color {
r: f64::from(panel_fill.r()) / 255.0,
g: f64::from(panel_fill.g()) / 255.0,
Expand All @@ -98,6 +135,7 @@ impl SettingsWindow {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
multiview_mask: None,
};
let mut rpass = encoder.begin_render_pass(&rpass_desc).forget_lifetime();

Expand All @@ -110,21 +148,42 @@ impl SettingsWindow {
Ok(settings_changed)
}

fn acquire_frame(&mut self) -> Result<SurfaceTexture> {
match self.surface.get_current_texture() {
Ok(frame) => Ok(frame),
Err(SurfaceError::Outdated) => {
self.reconfigure_surface();

self.surface.get_current_texture().wrap_err("get_current_texture after reconfigure")
},
Err(SurfaceError::Lost) => {
self.recreate_surface().wrap_err("recreate surface")?;

self.surface.get_current_texture().wrap_err("get_current_texture after recreate")
},
Err(err) => Err(eyre::eyre!("get_current_texture failed: {err:?}")),
fn acquire_frame(&mut self) -> Result<AcquiredSurfaceFrame> {
for attempt in 0..2 {
match self.surface.get_current_texture() {
CurrentSurfaceTexture::Success(frame) => {
return Ok(AcquiredSurfaceFrame::Ready(frame));
},
CurrentSurfaceTexture::Suboptimal(frame) => {
return Ok(AcquiredSurfaceFrame::Ready(frame));
},
CurrentSurfaceTexture::Outdated if attempt == 0 => {
self.reconfigure_surface();
},
CurrentSurfaceTexture::Lost if attempt == 0 => {
self.recreate_surface().wrap_err("recreate surface")?;
},
CurrentSurfaceTexture::Outdated => {
return Err(eyre::eyre!(
"get_current_texture stayed outdated after reconfigure"
));
},
CurrentSurfaceTexture::Lost => {
return Err(eyre::eyre!("get_current_texture stayed lost after recreate"));
},
CurrentSurfaceTexture::Timeout => {
return Ok(AcquiredSurfaceFrame::Skipped(SurfaceFrameSkipReason::Timeout));
},
CurrentSurfaceTexture::Occluded => {
return Ok(AcquiredSurfaceFrame::Skipped(SurfaceFrameSkipReason::Occluded));
},
CurrentSurfaceTexture::Validation => {
return Err(eyre::eyre!("get_current_texture hit a validation error"));
},
}
}

unreachable!("surface acquisition attempts are bounded")
}

fn recreate_surface(&mut self) -> Result<()> {
Expand Down Expand Up @@ -168,7 +227,7 @@ impl GpuContext {
pub(super) fn new_with_surface(
window: std::sync::Arc<Window>,
) -> Result<(Self, Surface<'static>, wgpu::SurfaceConfiguration)> {
let instance = wgpu::Instance::new(&InstanceDescriptor::default());
let instance = wgpu::Instance::default();
let surface =
instance.create_surface(std::sync::Arc::clone(&window)).wrap_err("create_surface")?;
let adapter = pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions {
Expand Down
6 changes: 3 additions & 3 deletions packages/rsnap-overlay/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ egui-winit = { workspace = true }
image = { workspace = true }
pollster = { workspace = true }
serde = { workspace = true }
serde_json = "1.0"
serde_json = { version = "1.0" }
thiserror = { workspace = true }
tracing = { workspace = true }
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] }
Expand All @@ -39,7 +39,7 @@ xcap = { workspace = true }

[target.'cfg(target_os = "macos")'.dependencies]
block2 = { workspace = true }
dispatch2 = "0.3"
dispatch2 = { version = "0.3" }
objc = { workspace = true }
objc2 = { workspace = true }
objc2-app-kit = { workspace = true }
Expand All @@ -53,7 +53,7 @@ objc2-vision = { workspace = true }
raw-window-handle = { workspace = true }

[dev-dependencies]
criterion = { version = "0.7", features = ["html_reports"] }
criterion = { version = "0.8", features = ["html_reports"] }

[[bench]]
harness = false
Expand Down
Loading
Loading