Files
takana/recipes/incoming-kde/obs-glad-egl-loader.patch
Sergio 670a5b6b49 OBS Studio 32.2.2 — segunda app gráfica de usuario final, con el renderer portado a EGL
13 plugins sellados, entre ellos los que importan: linux-pipewire (captura de
pantalla en Wayland), obs-ffmpeg, obs-x264, obs-outputs (RTMP RTMP),
linux-pulseaudio/alsa y text-freetype2.

EL PORT. El glad de OBS hacía dlopen("libGL.so.1") + dlsym("glXGetProcAddressARB")
y devolvía 0 si no lo hallaba, o sea que el renderer no arrancaba: OBS estaba
atado a GLX —y por tanto a X11— aun corriendo en Wayland puro. Acá nadie publica
libGL.so.1 y el libglvnd del corpus va sin GLX a propósito. El parche carga por
libEGL.so.1 + eglGetProcAddress, que es lo que OBS ya usa para las extensiones.
Verificado en el artefacto, no en el log: libobs-opengl.so.30 tiene CERO
ocurrencias de glXGetProcAddressARB, sus NEEDED son libEGL.so.1 +
libwayland-egl.so.1, y el binario no filtra a glibc.

DÓNDE VIVE. En incoming-kde y no en el corpus porque su frontend es Qt6 y las 13
recetas Qt viven sólo en esa cola. Se midió antes de descartar el corpus: qtbase
sin X11 cierra en 26 nodos que YA están en el corpus, pero el qtbase de la cola va
xcb=ON, así que un qtbase de corpus tendría otro hash con el MISMO nombre de
artefacto ⇒ dos Qt peleando por /usr/lib/libQt6Core.so. Unificar obligaría a
apagarle xcb a KDE: radio 119.

Los símbolos indefinidos salieron por CAPAS y ninguno nombraba al culpable:
freetype (.a no PIC) → fontconfig (idem) → i2d_SSL_SESSION → inflateInit_. Las dos
primeras se arreglaron usando las variantes -shared que YA existían en el corpus;
las dos últimas con -lssl -lcrypto -lz, porque OBS resuelve curl con el FindCURL
de CMake, que toma libcurl.a por fichero y no lee su Libs.private. Un símbolo
indefinido nombra a la librería que lo USA, no a la que falta.

Huecos escritos en la receta para que no se descubran en la mano del usuario:
sin webcam (ENABLE_V4L2=OFF, libv4l2 no está en ninguna cola), sin salida MPEG-TS
(SRT/RIST ausentes) y sin scripting (falta swig). Grabar, capturar pantalla y
publicar por RTMP no pasan por ninguno de los tres.
2026-09-04 17:17:17 +00:00

36 lines
1.4 KiB
Diff

Cargar los punteros de GL por EGL en vez de por GLX.
El `glad` que OBS trae hace, en Linux, `dlopen("libGL.so.1")` y busca dentro
`glXGetProcAddressARB`; si no lo encuentra, `open_gl()` devuelve 0, `gladLoadGL()`
falla y el renderer de OpenGL no arranca. Eso ata a OBS a GLX —y por lo tanto a
X11— incluso corriendo en una sesión Wayland pura, que es la única que esta
distro tiene: acá nadie publica `libGL.so.1` (mesa va `glx=disabled`) y el
libglvnd del corpus se construye SIN GLX a propósito, para no arrastrar
libX11/libxcb al catálogo compartido.
EGL 1.5 resuelve funciones de GL de escritorio por `eglGetProcAddress`, que es lo
que OBS ya usa en `gl-egl-common.c` para las extensiones. El parche cambia la
librería y el símbolo; la firma es la misma (`void *(*)(const char *)`), así que
el resto de glad queda intacto.
--- a/deps/glad/src/glad.c
+++ b/deps/glad/src/glad.c
@@ -48,7 +48,7 @@
"/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL"
};
#else
- static const char *NAMES[] = {"libGL.so.1", "libGL.so"};
+ static const char *NAMES[] = {"libEGL.so.1", "libEGL.so"};
#endif
unsigned int index = 0;
@@ -60,7 +60,7 @@
return 1;
#else
gladGetProcAddressPtr = (PFNGLXGETPROCADDRESSPROC_PRIVATE)dlsym(libGL,
- "glXGetProcAddressARB");
+ "eglGetProcAddress");
return gladGetProcAddressPtr != NULL;
#endif
}