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.
36 lines
1.4 KiB
Diff
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
|
|
}
|