tawasuyu/llimphi
Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.
chore: refresco desde el monorepo — vello 0.9 / wgpu 29, 120 miembros
1// =============================================================================
2// llimphi-cpu :: Llimphi sin GPU (W1 de 03_ukupacha/wawa/PLAN-LLIMPHI.md)
3// -----------------------------------------------------------------------------
4// Durante dos años la doctrina fue que Llimphi no podía correr en wawa porque
5// arrastra wgpu/winit/std. El spike de W0 la tumbó: TODO el stack de Linebender
6// —vello_cpu, vello_common, peniko, kurbo— es `no_std`, y con SSE encendido
7// cruza a `x86_64-wawa` sin tocarle una línea. Este crate es lo que faltaba en
8// el medio.
9//
10// El problema concreto: `llimphi-compositor` pinta contra `vello::Scene`, que
11// es un BUFFER CODIFICADO para que después la GPU lo devore de un saque.
12// `vello_cpu` no tiene `Scene` — su API es imperativa y con estado. Las dos
13// mitades no se enchufan.
14//
15// La pieza tiene tres partes, y ninguna es lista:
16//
17// escena — una `Escena` que expone los OCHO métodos de `vello::Scene` que el
18// compositor usa, con la MISMA firma, y en vez de dibujar los
19// graba. Grabar es lo que hace posible `append`, sin el cual el
20// compositor no puede reciclar subárboles cacheados.
21// pintor — reproduce esa lista contra un `vello_cpu::RenderContext` y deja
22// un `Pixmap`.
23// lienzo — vuelca el `Pixmap` al framebuffer real, con su stride y su orden
24// de canales.
25//
26// `no_std + alloc` de nacimiento, no como concesión: el consumidor final es el
27// kernel de wawa, donde no hay `std` que valga. En Linux compila igual —un
28// crate `no_std` es perfectamente utilizable desde uno con `std`— y la feature
29// `std` sólo agrega la detección de SIMD en tiempo de ejecución.
30//
31// Lo que este crate NO hace, a propósito: texto. El shaping vive en
32// `llimphi-text`, que sigue atado a `std` y a las fuentes del sistema — es W2,
33// la fase más cara del plan, y mezclarla acá sería empantanar las dos.
34// =============================================================================
35
36// `no_std` cuando se pide el perfil bare-metal (`--no-default-features
37// --features libm`). Con `std` —el default, y el único perfil coherente cuando
38// vello convive con vello_cpu; ver el porqué en Cargo.toml— y bajo `cargo test`,
39// se usa la stdlib. Lo que se compila para wawa es el primer perfil, y ése es
40// `no_std` puro.
41#![cfg_attr(not(any(feature = "std", test)), no_std)]
42
43extern crate alloc;
44
45pub mod escena;
46pub mod lienzo;
47pub mod pintor;
48
49pub use escena::{Escena, Forma, Glifo, Orden};
50pub use lienzo::{volcar, FormatoPixel};
51pub use pintor::Pintor;
52
53// Se reexporta el sustrato para que quien use este crate no tenga que declarar
54// `vello_cpu` por su cuenta ni —peor— arriesgarse a traer OTRA versión de peniko
55// y terminar con dos tipos `Color` incompatibles que el compilador reporta como
56// «expected Color, found Color».
57pub use vello_cpu::{kurbo, peniko, Pixmap};
58
59#[cfg(test)]
60mod pruebas;