// Jank-hunt: per-frame draw-op census. Answers "is the scene we hand to // Skia/Mali unnecessarily big or expensive?" A scrolling 3-column grid of // thumbnails should be a few dozen cheap ops per frame; if the counts (or // the total drawn area, or the image upscale ratio) are large or growing, // that explains the Mali GPU backpressure. See docs/BUGS/scroll-jank-120hz.md. use std::sync::atomic::{AtomicU64, Ordering}; pub static SCN_RECT: AtomicU64 = AtomicU64::new(0); pub static SCN_RECT_AREA: AtomicU64 = AtomicU64::new(0); pub static SCN_IMG: AtomicU64 = AtomicU64::new(0); pub static SCN_IMG_AREA: AtomicU64 = AtomicU64::new(0); /// Max (drawn area / source area) x 100, i.e. a value of 200 = drawn at 2x /// the source area (a 1.41x linear upscale). High values = the GPU is /// upscaling small textures a lot (or the "source" is a tiny fallback). pub static SCN_IMG_UP: AtomicU64 = AtomicU64::new(0); pub static SCN_TEXT: AtomicU64 = AtomicU64::new(0); pub static SCN_BORDER: AtomicU64 = AtomicU64::new(0); pub static SCN_SHADOW: AtomicU64 = AtomicU64::new(0); pub static SCN_CLIP: AtomicU64 = AtomicU64::new(0); pub fn reset() { for s in [ &SCN_RECT, &SCN_RECT_AREA, &SCN_IMG, &SCN_IMG_AREA, &SCN_IMG_UP, &SCN_TEXT, &SCN_BORDER, &SCN_SHADOW, &SCN_CLIP, ] { s.store(0, Ordering::Relaxed); } } /// Add a value to an atomic (relaxed), used by the item renderer. #[inline] pub fn add(slot: &AtomicU64, v: u64) { slot.fetch_add(v, Ordering::Relaxed); } #[inline] pub fn inc(slot: &AtomicU64) { slot.fetch_add(1, Ordering::Relaxed); } #[inline] pub fn max(slot: &AtomicU64, v: u64) { let _ = slot.fetch_max(v, Ordering::Relaxed); } pub fn report(frame: u64) { let rect = SCN_RECT.load(Ordering::Relaxed); let img = SCN_IMG.load(Ordering::Relaxed); let text = SCN_TEXT.load(Ordering::Relaxed); let border = SCN_BORDER.load(Ordering::Relaxed); let shadow = SCN_SHADOW.load(Ordering::Relaxed); let clip = SCN_CLIP.load(Ordering::Relaxed); let rect_area = SCN_RECT_AREA.load(Ordering::Relaxed); let img_area = SCN_IMG_AREA.load(Ordering::Relaxed); let img_up = SCN_IMG_UP.load(Ordering::Relaxed); let total = rect + img + text + border + shadow; log::info!( "SCN f={} rect={} rarea={} img={} iarea={} iup={} text={} border={} shadow={} clip={} total={}ops", frame, rect, rect_area, img, img_area, img_up, text, border, shadow, clip, total ); }