53402d84d5
Wave 1 de parallel-fix-issues integrada a master: - 0025: text_editor_cpp_core + file_watcher_cpp_core - 0026: gl_texture_load_cpp_gfx (vendor: stb_image v2.30) Ademas se commitea WIP previo de master que estaba sin commitear (cambios en shaders_lab, dag_*, framework, tokens, kpi_card, gl_loader.md, etc.) para dejar HEAD buildable. Notas: - Algunos deps del gallery (button.cpp, toolbar.cpp, modal_dialog.cpp...) siguen UNTRACKED — gating con FN_BUILD_GALLERY=ON (default OFF) para que master build (sin flag) no los necesite. - Build OK con y sin flag. fn index registra 904 functions. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
65 lines
3.6 KiB
Markdown
65 lines
3.6 KiB
Markdown
---
|
|
name: dag_compile
|
|
kind: function
|
|
lang: cpp
|
|
domain: gfx
|
|
version: "1.0.0"
|
|
purity: pure
|
|
signature: "std::string compile_dag_to_glsl(const std::vector<DagStep>& pipeline)"
|
|
description: "Compila un pipeline DAG a GLSL 330 core listo para pasarle a gl_shader::compile_fragment. Emite uniform vec4 u_params[16], una funcion node_<i> por paso y void main() que encadena los outputs. Blends usan source_id para fan-in estable ante reorders."
|
|
tags: [dag, shader, glsl, compiler, gfx, pipeline]
|
|
uses_functions:
|
|
- dag_catalog_cpp_gfx
|
|
uses_types:
|
|
- dag_types_cpp_gfx
|
|
returns: []
|
|
returns_optional: false
|
|
error_type: ""
|
|
imports: [dag_compile, dag_catalog, dag_types, string, vector, sstream, algorithm]
|
|
tested: false
|
|
tests: []
|
|
test_file_path: ""
|
|
file_path: "cpp/functions/gfx/dag_compile.cpp"
|
|
params:
|
|
- name: pipeline
|
|
desc: "Vector de DagStep. Cada paso tiene un nombre de nodo del catalogo, params array<float,4> y source_id para blends."
|
|
output: "String GLSL que se pega tras el preamble de gl_shader (que ya declara #version 330 core, fragColor, u_time, u_resolution, u_mouse). Incluye uniform vec4 u_params[16], funciones node_<i> y void main()."
|
|
---
|
|
|
|
## Estructura del GLSL emitido
|
|
|
|
```glsl
|
|
uniform vec4 u_params[16];
|
|
|
|
vec4 node_0(vec4 c, vec2 uv) { ... }
|
|
vec4 node_1(vec4 a, vec4 b, vec2 uv) { ... } // blend
|
|
|
|
void main() {
|
|
vec2 uv = gl_FragCoord.xy / u_resolution;
|
|
vec4 c = vec4(0.04, 0.04, 0.06, 1.0);
|
|
vec4 out_0 = node_0(vec4(0.0, 0.0, 0.0, 1.0), uv);
|
|
vec4 out_1 = node_1(out_0, out_0, uv);
|
|
fragColor = out_1;
|
|
}
|
|
```
|
|
|
|
## Notas
|
|
|
|
- El preamble de gl_shader::compile_fragment ya declara los 3 uniforms basicos. compile_dag_to_glsl NO los redeclara.
|
|
- Si el pipeline esta vacio, emite void main() que pinta gris oscuro (0.04, 0.04, 0.06).
|
|
- MAX_NODES = 16. Pipelines mas largos se truncan silenciosamente.
|
|
- source_id fallback: si el id no se encuentra o apunta a un indice >= idx, usa max(0, idx-2).
|
|
|
|
## Cambios 2026-04-25 (Fase 5 + Fase 7 shaders_lab)
|
|
|
|
- **Layout de params dinámico**: el array global pasa de `vec4 u_params[16]` (1 vec4 por nodo) a `vec4 u_params[64]` (`MAX_PARAM_VEC4S`). Cada nodo ocupa `dag_vec4_count(param_count)` vec4s consecutivos. Helper público `dag_param_layout(pipeline) -> vector<int>` devuelve el índice base por nodo y se comparte con `dag_uniforms_apply`.
|
|
- **Strict output**: el fallback `last_valid_out` que filtraba el output del último nodo cuando `Output` no tenía source o no existía está eliminado. Ahora la regla es: solo se emite lo conectado al `Output`; en cualquier otro caso `seed()` (gris oscuro). El `resolve()` interno también devuelve `vec4(0,0,0,1)` para slots de input vacíos (antes caía a `last_valid_out`).
|
|
- **Test 4b nuevo**: nodo sin Output → seed final aparece después de las branches de preview (`fragColor = vec4(0.04` después del último `if (u_preview_target ==`).
|
|
- **Variante baked: `compile_dag_to_glsl_baked(pipeline)`** (nuevo en `.h` + `.cpp`):
|
|
- Sustituye `uniform vec4 u_params[64];` por `const vec4 u_params[N] = vec4[N](vec4(...), ...);` con los valores actuales del pipeline empaquetados (mismo layout que `dag_uniforms_apply`).
|
|
- Sustituye `uniform int u_preview_target;` por `const int u_preview_target = -1;`. Las branches de preview quedan muertas.
|
|
- Sustitución vía `std::regex_replace`. `total = max(base[i] + dag_vec4_count(pc))` o 1 (GLSL prohíbe arrays de tamaño 0).
|
|
- Caso de uso: panel `Generated GLSL` de shaders_lab muestra el baked, paste-able en el editor `Code` para reproducir el render del DAG sin uniforms externos. Test 7 verifica ausencia de `uniform vec4 u_params` y presencia de `const vec4 u_params[`.
|
|
|
|
Cobertura tests: 7/7 (strict + 4b) → **8/8** (incluye baked).
|