Files
fn_registry/cpp/functions/gfx/dag_compile.md
T
egutierrez 53402d84d5 docs(issues): marcar 0025 y 0026 como completados + WIP master
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>
2026-04-25 21:14:15 +02:00

3.6 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path, params, output
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports tested tests test_file_path file_path params output
dag_compile function cpp gfx 1.0.0 pure std::string compile_dag_to_glsl(const std::vector<DagStep>& pipeline) 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.
dag
shader
glsl
compiler
gfx
pipeline
dag_catalog_cpp_gfx
dag_types_cpp_gfx
false
dag_compile
dag_catalog
dag_types
string
vector
sstream
algorithm
false
cpp/functions/gfx/dag_compile.cpp
name desc
pipeline Vector de DagStep. Cada paso tiene un nombre de nodo del catalogo, params array<float,4> y source_id para blends.
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

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).