makepad/libs/render_kernels/tests/task_pool.rs
Admin 53e0e85b92 draw and widgets: Slug text everywhere, no blank glyphs, slimmer widgets
All outline text draws with Slug curves on every platform (SDF/MSDF stays
selectable per size); a frame never presents a blank glyph and retained draw
lists keep theirs. One coverage model for vector feathering, widget families
split out of the core crate, fewer steady-state allocations, video keeps its
aspect (Contain/Cover), render and SSAO pass unification.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 12:26:21 +02:00

39 lines
1.9 KiB
Rust

//! The engine on the platform's `TaskPool` (Heavy lane): installed once,
//! jobs of every priority and a pipeline run on it, bit-identical to a run
//! on the caller alone. (Its own test binary: the engine is per process.)
use makepad_platform::Cx;
use makepad_render_kernels::dispatch::sched::{InlineExecutor, Job, Priority};
use makepad_render_kernels::pipeline::Count;
use makepad_render_kernels::{engine, install, Pipeline};
const SRC: &str = "let pos = output(vec3)\nlet amp = param(1)\nfn vertex(i) { let x = float(i % 512) * 0.1\n let z = float(i / 512) * 0.1\n pos[i] = vec3(x, fbm2(vec2(x, z), 4, 2.0, 0.5) * amp, z) }";
#[test]
fn kernel_jobs_run_on_the_platform_task_pool() {
let cx = Cx::new(Box::new(|_, _| {}));
assert!(install(&cx), "the first install wins");
assert!(!install(&cx), "and only the first");
let e = engine();
assert!(e.on_task_pool());
let k = makepad_render_kernels::compile(SRC, &[], &[]).unwrap();
let n = 512 * 300;
let mut reference = Job::new(k.clone(), n);
reference.output_u32("pos", vec![0; n * 3]).unwrap();
reference.set_param("amp", 3.0);
reference.run(&InlineExecutor, 1).unwrap();
let want = reference.take_output_u32("pos").unwrap();
for p in [Priority::MustComplete, Priority::Near, Priority::Far, Priority::Cosmetic] {
let mut job = Job::new(k.clone(), n);
job.output_u32("pos", vec![0; n * 3]).unwrap();
job.set_param("amp", 3.0);
let mut job = e.run(job, p).unwrap_or_else(|(_, err)| panic!("{:?}: {}", p, err));
assert_eq!(job.take_output_u32("pos").unwrap(), want, "{:?}", p);
}
let mut pipe = Pipeline::new();
pipe.pass(k, Count::Fixed(n)).set_param("amp", 3.0);
pipe.run_on(e, Priority::Near).unwrap();
assert_eq!(pipe.buffer("pos").unwrap(), &want[..]);
assert!(e.scheduler().stats().completed >= 4);
assert!(cx.task_pool_summary().contains("pool"), "{}", cx.task_pool_summary());
}