Expand description
Backend GPU directo (Fases 2 + 3 del SDD §“GPU directo wgpu”).
Cuatro pipelines wgpu cacheadas en GpuPipelines (lines / tris /
rects / discs) + un acumulador GpuBatch que las apps usan por frame para
emitir centenares de miles a millones de primitivos en una draw call
por tipo, sin pasar por vello.
Diseño minimal Fase 2/3:
- Vertex format triángulos:
[x: f32, y: f32, rgba: u32](12 B/vert). - Instance format líneas:
[x0, y0, x1, y1, rgba](20 B/seg). - Instance format rects:
[x, y, w, h, rgba](20 B/rect). - Instance format discos:
[cx, cy, r, stroke, rgba](20 B/disco). - Sin texturas. Rects/líneas/tris obtienen AA de bordes vía MSAA 4×
(ver más abajo); los discos SÍ traen AA por SDF en el fragment
(smoothstep sobre
fwidth), que MSAA respeta. Así rects/tris/líneas instanciados salen con bordes suaves sin que el caller toque nada. - Blending alfa habilitado: el alpha del color es respetado.
- El viewport
(width, height)se pasa al flush y va en un uniform — los shaders convierten pixel → NDC ahí.
Cache de pipelines: una sola instancia de GpuPipelines por
(device, color_format). Construirla compila los 3 pipelines en
caliente (~ms en hardware moderno). Los callers la mantienen viva
entre frames (en su Model o vía OnceLock).
Grow strategy: flush crea un buffer por tipo no vacío en el
mismo frame. Sin reuso entre frames — Fase 4 (GpuSceneCanvas)
introducirá el GpuBuffers persistente que dobla capacidad si
aparece la necesidad.
§MSAA 4× (antialiasing de bordes)
El pase no dibuja directo sobre el view que recibe flush. En su
lugar rasteriza todos los primitivos a una textura multisample 4×
(cleared a transparente), la resuelve a una textura single-sample
scratch y compone con alpha ese resultado sobre el view. Así:
- Los bordes de rects/tris/líneas quedan suaves (4 muestras/pixel), no escalonados.
- El contenido previo del
view(lo que vello pintó) se preserva, porque el composite es alpha-over conLoadOp::Load— exactamente la semántica que tenía el viejo render pass directo conLoadOp::Load. LoadOp::Clear(c)se respeta: elviewse limpia acantes del composite (equivalente a la pasada directa anterior).
Backward-compat: la firma pública de flush / GpuPipelines::new no
cambia. Las texturas MSAA + scratch se crean por-flush dimensionadas
al viewport (mismo patrón que los buffers por-frame), así el resize
“sale gratis” — cada frame usa el tamaño que se le pasa, sin estado
persistente que recrear. El pipeline de composite se compila una vez
y se cachea en GpuPipelines (es Sync, vive en OnceLock).
Structs§
- GpuBatch
- Acumulador de primitivas por frame. Construir →
add_*→flush. - GpuPipelines
- Pipelines cacheadas. Crear uno por proceso (o por surface format).