diff --git a/Cargo.toml b/Cargo.toml index ea27abb..6f790bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,14 +1,14 @@ [package] name = "glyphon" description = "Fast, simple 2D text rendering for wgpu" -version = "0.6.0" +version = "0.8.0" edition = "2021" homepage = "https://github.com/grovesNL/glyphon.git" repository = "https://github.com/grovesNL/glyphon" license = "MIT OR Apache-2.0 OR Zlib" [dependencies] -wgpu = { version = "22", default-features = false, features = ["wgsl"] } +wgpu = { version = "24", default-features = false, features = ["wgsl"] } etagere = "0.2.10" cosmic-text = "0.12" lru = { version = "0.12.1", default-features = false } @@ -16,6 +16,11 @@ rustc-hash = "2.0" [dev-dependencies] winit = "0.30.3" -wgpu = "22" -resvg = { version = "0.42", default-features = false } -pollster = "0.3.0" +wgpu = "24" +resvg = { version = "0.44", default-features = false } +pollster = "0.4.0" +criterion = { version = "0.5", features = ["html_reports"] } + +[[bench]] +name = "prepare" +harness = false diff --git a/benches/prepare.rs b/benches/prepare.rs new file mode 100644 index 0000000..8907e20 --- /dev/null +++ b/benches/prepare.rs @@ -0,0 +1,121 @@ +use cosmic_text::{Attrs, Buffer, Color, Family, FontSystem, Metrics, Shaping, SwashCache}; +use criterion::{criterion_group, criterion_main, Criterion}; +use glyphon::{ + Cache, ColorMode, Resolution, TextArea, TextAtlas, TextBounds, TextRenderer, Viewport, Weight, +}; +use wgpu::{MultisampleState, TextureFormat}; + +mod state; + +fn run_bench(ctx: &mut Criterion) { + let mut group = ctx.benchmark_group("Prepare"); + group.noise_threshold(0.02); + + let state = state::State::new(); + + // Set up text renderer + let mut font_system = FontSystem::new(); + let mut swash_cache = SwashCache::new(); + let cache = Cache::new(&state.device); + let mut viewport = Viewport::new(&state.device, &cache); + let mut atlas = TextAtlas::with_color_mode( + &state.device, + &state.queue, + &cache, + TextureFormat::Bgra8Unorm, + ColorMode::Web, + ); + let mut text_renderer = + TextRenderer::new(&mut atlas, &state.device, MultisampleState::default(), None); + + let attrs = Attrs::new() + .family(Family::SansSerif) + .weight(Weight::NORMAL); + let shaping = Shaping::Advanced; + viewport.update( + &state.queue, + Resolution { + width: 1000, + height: 1000, + }, + ); + + for (test_name, text_areas) in &[ + ( + "Latin - Single Text Area", + vec![include_str!("../samples/latin.txt")], + ), + ( + "Arabic - Single Text Area", + vec![include_str!("../samples/arabic.txt")], + ), + ( + "Latin - Many Text Areas", + include_str!("../samples/latin.txt") + .repeat(100) + .split('\n') + .collect(), + ), + ( + "Arabic - Many Text Areas", + include_str!("../samples/arabic.txt") + .repeat(20) + .split('\n') + .collect(), + ), + ] { + let buffers: Vec = text_areas + .iter() + .copied() + .map(|s| { + let mut text_buffer = Buffer::new(&mut font_system, Metrics::relative(1.0, 10.0)); + text_buffer.set_size(&mut font_system, Some(20.0), None); + text_buffer.set_text(&mut font_system, s, attrs, shaping); + text_buffer.shape_until_scroll(&mut font_system, false); + text_buffer + }) + .collect(); + + group.bench_function(*test_name, |b| { + b.iter(|| { + let text_areas: Vec