Skip to main content

Module gpu

Module gpu 

Source
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 con LoadOp::Load — exactamente la semántica que tenía el viejo render pass directo con LoadOp::Load.
  • LoadOp::Clear(c) se respeta: el view se limpia a c antes 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).