Files
fn_registry/cpp/functions/gfx/gl_loader.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.9 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, framework, 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 framework params output
gl_loader function cpp gfx 1.1.0 impure bool gl_loader_init() Loader minimo de simbolos OpenGL 2.0+ para cross-compile a Windows. En Linux es no-op (simbolos resueltos via GL_GLEXT_PROTOTYPES). En Windows resuelve punteros con wglGetProcAddress. Redirige las llamadas con macros para que el codigo fuente sea portable.
opengl
loader
windows
cross-compile
gfx
false error_go_core
windows.h
GL/gl.h
GL/glext.h
false
cpp/functions/gfx/gl_loader.cpp opengl
true si todos los simbolos se resolvieron (Linux siempre true; Windows depende de que el contexto GL este activo antes de llamar). false si algun simbolo no esta disponible en el driver.

gl_loader

Loader minimo de simbolos OpenGL 2.0+ sin dependencias externas (sin GLAD, GLEW, gl3w). Resuelve el problema de que opengl32.dll en Windows solo exporta OpenGL 1.1 — todo lo moderno (shaders, FBO, VAO) requiere resolucion dinamica via wglGetProcAddress.

Uso

#include "gfx/gl_loader.h"

// Despues de crear el contexto GL (p.ej. tras el primer frame de ImGui):
fn::gfx::gl_loader_init();

// A partir de aqui, todos los simbolos funcionan identicamente en Linux y Windows:
glCreateShader(GL_FRAGMENT_SHADER);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
// ...

Como funciona

En Windows, el header declara extern PFNGL... por cada simbolo y los renombra con macros: #define glCreateShader fn_glCreateShader. El .cpp instancia los punteros y los resuelve con wglGetProcAddress en gl_loader_init().

En Linux, el header activa GL_GLEXT_PROTOTYPES e incluye <GL/gl.h> + <GL/glext.h> directamente; los simbolos son exportados por libGL y no hace falta resolver nada.

Anadir un simbolo nuevo

  1. Declarar extern PFNGL<NAME>PROC fn_gl<Name>; en el .h.
  2. Anadir #define gl<Name> fn_gl<Name> en el bloque #ifdef _WIN32.
  3. Instanciar el puntero en el .cpp y anadir LOAD(gl<Name>); dentro de gl_loader_init().

Cobertura [v1.1]

Funciones cubiertas (todas con macro #define gl* fn_gl* y LOAD() en el init):

Grupo Simbolos
Shaders / programs glCreateShader, glShaderSource, glCompileShader, glGetShaderiv, glGetShaderInfoLog, glCreateProgram, glAttachShader, glLinkProgram, glGetProgramiv, glGetProgramInfoLog, glUseProgram, glDeleteShader, glDeleteProgram
Uniforms glGetUniformLocation, glUniform1f, glUniform1i, glUniform2f, glUniform3f, glUniform4f, glUniform4fv
Buffers + VAO glGenBuffers, glBindBuffer, glDeleteBuffers, glBufferData, glGenVertexArrays, glBindVertexArray, glDeleteVertexArrays, glEnableVertexAttribArray, glVertexAttribPointer, glVertexAttribDivisor
Framebuffers + renderbuffers glGenFramebuffers, glBindFramebuffer, glDeleteFramebuffers, glFramebufferTexture, glFramebufferTexture2D, glGenRenderbuffers, glBindRenderbuffer, glDeleteRenderbuffers, glRenderbufferStorage, glFramebufferRenderbuffer
Draw glDrawArraysInstanced (resto de glDraw* viene en opengl32.dll)

v1.1 (2026-04-25) anade los grupos Buffers/VAO, Framebuffers/renderbuffers y Draw para que graph_renderer_cpp_viz y otros consumidores compilen en cross-compile MinGW. Funciones de opengl32.dll 1.1 (glClear, glEnable, glViewport, glDrawArrays, etc.) se siguen resolviendo estaticamente — no necesitan loader.

Compilador MinGW

El cross-compile a Windows requiere MinGW-w64 con thread model -posix para que std::mutex / std::thread funcionen (otros primitivos como process_runner y toast lo necesitan). Configurado en cpp/toolchains/mingw-w64.cmake via x86_64-w64-mingw32-gcc-posix / g++-posix + link static de libwinpthread.