Dar sentido a las versiones de glxinfo OpenGL

¿Cuál es la diferencia entre todas las diferentes cadenas de versión en la salida del comando glxinfo?

Ya he preguntado esto aquí , pero no recibí muchas respuestas y, de todos modos, parece que hay más preguntas relacionadas en AskUbuntu.

La salida de glxinfo|grep OpenGL sigue,

  glxinfo |grep Open Vendor: Intel Open Source Technology Center (0x8086) OpenGL vendor string: Intel Open Source Technology Center OpenGL renderer string: Mesa DRI Intel(R) HD Graphics 520 (Skylake GT2) OpenGL core profile version string: 4.5 (Core Profile) Mesa 13.0.2 OpenGL core profile shading language version string: 4.50 OpenGL core profile context flags: (none) OpenGL core profile profile mask: core profile OpenGL core profile extensions: OpenGL version string: 3.0 Mesa 13.0.2 OpenGL shading language version string: 1.30 OpenGL context flags: (none) OpenGL extensions: OpenGL ES profile version string: OpenGL ES 3.2 Mesa 13.0.2 OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20 OpenGL ES profile extensions: . 

¿Por qué es el “perfil principal” 4.5, mientras que la cadena de la versión OpenGL es 3.0?

OpenGL ES es un subconjunto de la especificación original de OpenGL y está diseñado para sistemas integrados como teléfonos inteligentes. No estoy 100% seguro de por qué los números de versión no corresponden, pero no lo hacen. La última versión es 4.5 para OpenGL y 3.2 para OpenGL ES. Esto explica la razón de la parte OpenGL ES de su salida. En su caso, tiene soporte para las últimas versiones de OpenGL y OpenGL ES.

Notará que las entradas OpenGL y OpenGL ES tienen una cadena de versión y una cadena de versión de idioma de sombreado. Antes de OpenGL 3.3, el número de versión de OpenGL y el número de versión del idioma de sombreado no coincidían. Creo que esta es la razón por la que tienen entradas separadas en la salida (ya que obviamente pueden ser diferentes para el hardware más antiguo). Como se ve en su salida, el número de versión (4.5) coincide con la versión del idioma de sombreado (también 4.5).

La parte más difícil (y la parte de la que no estoy 100% seguro) es la “cadena de versión OpenGL”.

Por lo que he visto en varias máquinas completamente diferentes, esto parece estar limitado en la versión 3.0. La versión de idioma de sombreado para 3.0 es 1.3, por lo que la cadena de versión de lenguaje de sombreado tiene sentido para esta versión de OpenGL. Sin embargo, ¿por qué la versión está limitada a 3.0? Mis pensamientos son los siguientes:

La versión 3.0 introdujo la desaprobación (ver este enlace ). Aquí también es de donde provienen los dos perfiles separados, “Núcleo” y “Compatibilidad”. Cualquier implementación de OpenGL solo tiene que implementar la especificación “central” para que sea válida.

Si lees las notas de la versión de Mesa para una versión en particular, verás una statement relacionada con este problema de perfil de compatibilidad / núcleo. Lo siguiente se tomó de las notas de la versión de la última versión 17.0.0 aquí :

 Mesa 17.0.0 implements the OpenGL 4.5 API, but the version reported by glGetString(GL_VERSION) or glGetIntegerv(GL_MAJOR_VERSION) / glGetIntegerv(GL_MINOR_VERSION) depends on the particular driver being used. Some drivers don't support all the features required in OpenGL 4.5. OpenGL 4.5 is only available if requested at context creation because compatibility contexts are not supported. 

Tenga en cuenta la última parte “OpenGL 4.5 solo está disponible si se solicita en la creación de contexto porque los contextos de compatibilidad no son compatibles” . Por lo tanto, creo que la “cadena de versión de OpenGL” es la versión compatible para un contexto de perfil de “compatibilidad” (o, en otras palabras, para el soporte de cualquier función en desuso antes de la versión 3.0).