use oxigdal_gpu::WorkgroupTuner;
use wgpu::Limits;
fn limits_with(max_x: u32, max_y: u32, max_total: u32) -> Limits {
Limits {
max_compute_workgroup_size_x: max_x,
max_compute_workgroup_size_y: max_y,
max_compute_invocations_per_workgroup: max_total,
..Limits::default()
}
}
#[test]
fn test_tuner_picks_16x16_when_limits_unbounded() {
let tuner = WorkgroupTuner::derive_from_limits(&Limits::default());
assert_eq!(tuner.raster_2d, (16, 16));
assert_eq!(tuner.reduction, 256);
assert_eq!(tuner.fft, 64);
}
#[test]
fn test_tuner_falls_back_8x8_on_low_end_adapter() {
let tuner = WorkgroupTuner::derive_from_limits(&limits_with(8, 8, 64));
assert_eq!(tuner.raster_2d, (8, 8));
}
#[test]
fn test_tuner_falls_back_4x4_on_minimum_adapter() {
let tuner = WorkgroupTuner::derive_from_limits(&limits_with(4, 4, 16));
assert_eq!(tuner.raster_2d, (4, 4));
}
#[test]
fn test_tuner_respects_max_invocations_per_workgroup() {
let tuner = WorkgroupTuner::derive_from_limits(&limits_with(32, 32, 64));
assert_eq!(tuner.raster_2d, (8, 8));
}
#[test]
fn test_tuner_16x16_requires_both_axis_and_total() {
let tuner = WorkgroupTuner::derive_from_limits(&limits_with(16, 16, 64));
assert_eq!(tuner.raster_2d, (8, 8));
}
#[test]
fn test_tuner_reduction_capped_at_256() {
let tuner = WorkgroupTuner::derive_from_limits(&Limits::default());
assert!(tuner.reduction <= 256);
let constrained = limits_with(128, 128, 128);
let tuner2 = WorkgroupTuner::derive_from_limits(&constrained);
assert!(tuner2.reduction <= 128);
}
#[test]
fn test_tuner_reduction_respects_max_x_cap() {
let tuner = WorkgroupTuner::derive_from_limits(&limits_with(64, 256, 256));
assert!(tuner.reduction <= 64);
assert_eq!(tuner.reduction, 64);
}
#[test]
fn test_tuner_fft_capped_at_64() {
let tuner = WorkgroupTuner::derive_from_limits(&Limits::default());
assert!(tuner.fft <= 64);
assert_eq!(tuner.fft, 64);
}
#[test]
fn test_tuner_fft_respects_low_adapter_limits() {
let tuner = WorkgroupTuner::derive_from_limits(&limits_with(32, 32, 32));
assert!(tuner.fft <= 32);
assert_eq!(tuner.fft, 32);
}
#[test]
fn test_tuner_unlimited_returns_max_defaults() {
let tuner = WorkgroupTuner::unlimited();
assert_eq!(tuner.raster_2d, (16, 16));
assert_eq!(tuner.reduction, 256);
assert_eq!(tuner.fft, 64);
}
#[test]
fn test_tuner_default_equals_unlimited() {
let a = WorkgroupTuner::default();
let b = WorkgroupTuner::unlimited();
assert_eq!(a, b);
}
#[test]
fn test_tuner_clone_and_copy() {
let a = WorkgroupTuner::unlimited();
let b = a; let c = a; assert_eq!(b, c);
assert_eq!(a, b);
}
#[test]
fn test_tuner_debug_format() {
let tuner = WorkgroupTuner::unlimited();
let s = format!("{tuner:?}");
assert!(s.contains("WorkgroupTuner"));
assert!(s.contains("raster_2d"));
assert!(s.contains("reduction"));
assert!(s.contains("fft"));
}
#[test]
fn test_tuner_equality_distinguishes_different_sizes() {
let a = WorkgroupTuner::unlimited();
let b = WorkgroupTuner::derive_from_limits(&limits_with(8, 8, 64));
assert_ne!(a, b);
assert_eq!(b.raster_2d, (8, 8));
}