use serde::{Deserialize, Serialize};
pub const BENCH_SAMPLES_ENV: &str = "WATERUI_BENCH_SAMPLES";
pub const BENCH_WARMUPS_ENV: &str = "WATERUI_BENCH_WARMUPS";
pub const BENCH_REPETITIONS_ENV: &str = "WATERUI_BENCH_REPETITIONS";
pub const BENCH_REPORT_DIR_ENV: &str = "WATERUI_BENCH_REPORT_DIR";
pub const BENCH_MAX_P95_US_ENV: &str = "WATERUI_BENCH_MAX_P95_US";
pub const BENCH_MAX_MEAN_US_ENV: &str = "WATERUI_BENCH_MAX_MEAN_US";
pub const BENCH_MAX_REBUILD_RATIO_ENV: &str = "WATERUI_BENCH_MAX_REBUILD_RATIO";
pub const BENCH_MAX_SCENE_LAYERS_ENV: &str = "WATERUI_BENCH_MAX_SCENE_LAYERS";
pub const BENCH_MAX_GPU_SURFACE_LAYERS_ENV: &str = "WATERUI_BENCH_MAX_GPU_SURFACE_LAYERS";
pub const BENCH_MAX_CLIP_LAYERS_ENV: &str = "WATERUI_BENCH_MAX_CLIP_LAYERS";
#[must_use]
pub fn bench_report_file_name(crate_name: &str, bench_name: &str) -> String {
format!("{crate_name}__{bench_name}.json")
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BenchReport {
pub crate_name: String,
pub bench_name: String,
pub config: BenchRunConfig,
pub budgets: BenchBudgets,
pub measurements: Vec<PerfMeasurement>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct BenchRunConfig {
pub warmups: u32,
pub samples: u32,
pub repetitions: u32,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Serialize, Deserialize)]
pub struct BenchBudgets {
pub max_p95_us: Option<u64>,
pub max_mean_us: Option<u64>,
pub max_rebuild_ratio: Option<f64>,
pub max_scene_layers: Option<u64>,
pub max_gpu_surface_layers: Option<u64>,
pub max_clip_layers: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerfMeasurement {
pub name: String,
pub samples: u64,
pub mean_us: u64,
pub median_us: u64,
pub p95_us: u64,
pub min_us: u64,
pub max_us: u64,
pub rebuilt_frames: u64,
pub rendered_frames: u64,
pub idle_frames: u64,
pub rendered_mean_us: u64,
pub rendered_p95_us: u64,
pub rendered_max_us: u64,
pub missed_120fps_frames: u64,
pub missed_60fps_frames: u64,
pub measurement_cache_hits: u64,
pub measurement_cache_misses: u64,
pub scene_layers: u64,
pub vello_scene_layers: u64,
pub gpu_surface_layers: u64,
pub clip_layers: u64,
pub max_clip_depth: u64,
pub applied_filter_count: u64,
pub applied_filter_capture_us: u64,
pub applied_filter_effect_us: u64,
pub phases: PerfPhases,
pub frames: Vec<PerfFrame>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct PerfPhases {
pub rebuild_mean_us: u64,
pub rebuild_p95_us: u64,
pub build_content_mean_us: u64,
pub build_content_p95_us: u64,
pub scene_dispatch_mean_us: u64,
pub scene_dispatch_p95_us: u64,
pub scene_finish_mean_us: u64,
pub scene_finish_p95_us: u64,
pub render_mean_us: u64,
pub render_p95_us: u64,
pub animation_mean_us: u64,
pub input_mean_us: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerfFrame {
pub index: u64,
pub total_us: u64,
pub rebuild_us: u64,
pub build_content_us: u64,
pub scene_dispatch_us: u64,
pub scene_finish_us: u64,
pub render_us: u64,
pub acquire_us: u64,
pub present_us: u64,
pub animation_us: u64,
pub input_us: u64,
pub executor_before_us: u64,
pub executor_after_us: u64,
pub rebuilt: bool,
pub rendered: bool,
pub captured_snapshot: bool,
pub cpu_percent: f64,
pub memory_bytes: u64,
pub gpu_frame_us: u64,
pub measurement_cache_hits: u64,
pub measurement_cache_misses: u64,
pub scene_layers: u64,
pub vello_scene_layers: u64,
pub gpu_surface_layers: u64,
pub clip_layers: u64,
pub max_clip_depth: u64,
pub applied_filter_count: u64,
pub applied_filter_capture_us: u64,
pub applied_filter_effect_us: u64,
}