Vida útil del controlador de visualización EGL vs Vida útil del objeto estático.
Estoy depurando un segfault-on-exit que sospecho que se debe a un cambio reciente en nuestra configuración de renderizado fuera de pantalla de OpenGL a través de EGL. Todo se ejecuta en Ubuntu con gráficos integrados de Intel. El segfault solo aparece cuando se incluye y se utiliza highgui de OpenCV. Probablemente esto solo sea la punta del iceberg, por así decirlo, y el problema parece provenir de la duración de los objetos.
Tenemos una clase EGLContext
que gestiona todo lo relacionado con EGL. Esto significa elegir un identificador de archivo dev/dri/xyz
para el dispositivo que se va a utilizar y luego obtener un identificador de pantalla. Utilizamos las extensiones EGL_EXT_platform_base
, EGL_EXT_platform_device
, EGL_EXT_device_base
, EGL_EXT_device_query
y EGL_EXT_device_enumeration
.
Duración del identificador de pantalla `EGLDisplay`
Este EGLContext
solía funcionar bien, sin embargo, desde una optimización reciente, es propiedad de un objeto estático y, por lo tanto, se destruye mucho más tarde que antes. En el destructor, llamamos a eglDestroyContext()
y eglTerminate()
, ambos devuelven un error EGL_BAD_DISPLAY
. ¿Existe una duración inherente a estos identificadores, que es más corta que la de los objetos estáticos? En ninguna parte de nuestro código destruimos la conexión de pantalla antes de este momento.
Identificador de pantalla `EGL_PLATFORM_DEVICE_EXT`
Mientras depuraba el problema anterior, noté que obtenemos identificadores de pantalla diferentes en cada llamada a eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, devicedrm, display_attr)
. Los documentos de la extensión indican que:
Múltiples llamadas a eglGetPlatformDisplayEXT con el mismo
<platform>
y<native_display>
devolverán el mismo identificadorEGLDisplay
.
¿Alguien sabe cuál podría ser la causa de esto? ¿Me estoy perdiendo algo?
davy.ai
Parece que el problema con la violación de segmento al salir puede estar relacionado con los ciclos de vida de los objetos en el código que gestiona todo lo relacionado con EGL a través de la clase
EGLContext
. La propiedad estática del objetoEGLContext
puede estar causando un retraso en el destructor, lo que provoca errores al llamar aeglDestroyContext()
yeglTerminate()
.Respecto al identificador de pantalla
EGL_PLATFORM_DEVICE_EXT
, en la documentación de la extensión se indica que múltiples llamadas aeglGetPlatformDisplayEXT
con la misma plataforma y pantalla nativa deben devolver el mismo identificadorEGLDisplay
. El hecho de que se devuelvan identificadores diferentes sugiere que puede haber un problema con la pantalla nativa o con los parámetros que se pasan a la función. Puede ser necesario realizar una investigación adicional para determinar la causa raíz de este problema.