// ============================================================================= // llimphi-cpu :: Llimphi sin GPU (W1 de 03_ukupacha/wawa/PLAN-LLIMPHI.md) // ----------------------------------------------------------------------------- // Durante dos años la doctrina fue que Llimphi no podía correr en wawa porque // arrastra wgpu/winit/std. El spike de W0 la tumbó: TODO el stack de Linebender // —vello_cpu, vello_common, peniko, kurbo— es `no_std`, y con SSE encendido // cruza a `x86_64-wawa` sin tocarle una línea. Este crate es lo que faltaba en // el medio. // // El problema concreto: `llimphi-compositor` pinta contra `vello::Scene`, que // es un BUFFER CODIFICADO para que después la GPU lo devore de un saque. // `vello_cpu` no tiene `Scene` — su API es imperativa y con estado. Las dos // mitades no se enchufan. // // La pieza tiene tres partes, y ninguna es lista: // // escena — una `Escena` que expone los OCHO métodos de `vello::Scene` que el // compositor usa, con la MISMA firma, y en vez de dibujar los // graba. Grabar es lo que hace posible `append`, sin el cual el // compositor no puede reciclar subárboles cacheados. // pintor — reproduce esa lista contra un `vello_cpu::RenderContext` y deja // un `Pixmap`. // lienzo — vuelca el `Pixmap` al framebuffer real, con su stride y su orden // de canales. // // `no_std + alloc` de nacimiento, no como concesión: el consumidor final es el // kernel de wawa, donde no hay `std` que valga. En Linux compila igual —un // crate `no_std` es perfectamente utilizable desde uno con `std`— y la feature // `std` sólo agrega la detección de SIMD en tiempo de ejecución. // // Lo que este crate NO hace, a propósito: texto. El shaping vive en // `llimphi-text`, que sigue atado a `std` y a las fuentes del sistema — es W2, // la fase más cara del plan, y mezclarla acá sería empantanar las dos. // ============================================================================= // `no_std` cuando se pide el perfil bare-metal (`--no-default-features // --features libm`). Con `std` —el default, y el único perfil coherente cuando // vello convive con vello_cpu; ver el porqué en Cargo.toml— y bajo `cargo test`, // se usa la stdlib. Lo que se compila para wawa es el primer perfil, y ése es // `no_std` puro. #![cfg_attr(not(any(feature = "std", test)), no_std)] extern crate alloc; pub mod escena; pub mod lienzo; pub mod pintor; pub use escena::{Escena, Forma, Glifo, Orden}; pub use lienzo::{volcar, FormatoPixel}; pub use pintor::Pintor; // Se reexporta el sustrato para que quien use este crate no tenga que declarar // `vello_cpu` por su cuenta ni —peor— arriesgarse a traer OTRA versión de peniko // y terminar con dos tipos `Color` incompatibles que el compilador reporta como // «expected Color, found Color». pub use vello_cpu::{kurbo, peniko, Pixmap}; #[cfg(test)] mod pruebas;