Files
fn_registry/cpp/functions/gfx/gl_loader.md
T
egutierrez 958189227d chore(registry): notes en huerfanas usadas por framework/apps
Auditoria del issue 0044: anota en notes: el contexto de consumo de
huerfanos que no pueden registrarse en uses_functions porque sus
consumidores no son funciones del registry:
- consumido por cpp/framework/app_base.cpp (framework no indexado)
- consumido por cpp/apps/{shaders_lab,chart_demo,text_editor_smoke}/main.cpp
- scaffolding/demo en primitives_gallery

31 huerfanas anotadas. Las que quedan en uses_functions=[] tras esto
son hojas legitimas (no llaman a nada) o realmente sin uso (lista
DEAD reportada en el issue 0044).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 23:40:51 +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, notes
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 notes
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. scaffolding/demo en primitives_gallery

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.