версия opengl из glxinfo - PullRequest
       12

версия opengl из glxinfo

1 голос
/ 05 июля 2019

Я пытаюсь выяснить мою версию OpenGL. Я использую гостевую версию Fedora 29 на хосте win10. Если я использую программное обеспечение рендеринга (через Mesa), я получаю

$ LIBGL_ALWAYS_SOFTWARE=1 GALLIUM_DRIVE=softpipe glxinfo | grep OpenGL
OpenGL vendor string: VMware, Inc.
OpenGL renderer string: llvmpipe (LLVM 7.0, 256 bits)
OpenGL core profile version string: 3.3 (Core Profile) Mesa 18.3.6
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.1 Mesa 18.3.6
OpenGL shading language version string: 1.40
OpenGL context flags: (none)

Почему сообщается о двух версиях: 3.3 (ядро) и 3.1? Это потому, что для 3.3 я могу получить только совместимость ядра, а для 3.1 это может быть ядро ​​или профиль совместимости? Но когда я протестировал его с кодом (используя freeglut), запрашивающим 3.3 (ядро или профиль совместимости), я смог получить только 3.1. Я проверил код с помощью softpipe и llvmpipe. Кроме того, профиль, возвращаемый в приведенном ниже коде, всегда равен 0.

glutInitContextVersion(3, 3); 
glutInitContextProfile(GLUT_CORE_PROFILE);   
std::cout << "OpenGL version: " << glGetString(GL_VERSION) << '\n';
std::cout << "GLSL version: " << glGetString(GL_SHADING_LANGUAGE_VERSION)
          << '\n';
int major = 0;
int minor = 0;
int profile = 0;
glGetIntegerv(GL_MAJOR_VERSION, &major);
glGetIntegerv(GL_MINOR_VERSION, &minor);
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
std::cout << "major:" << major << '\n'
          << "minor:" << minor << '\n'
          << "profile:" << profile << '\n';

Так почему же glxinfo сообщает о ядре 3.3 (кроме 3.1), когда я не могу запросить его? Или я неправильно читаю glxinfo?

1 Ответ

2 голосов
/ 05 июля 2019

Я знаю, это звучит немного глупо, но вы сделали вызов glutCreateWindow до вызова glGetIntegerv, верно?(Потому что иначе контекст GL еще не будет существовать, и возвращенная версия контекста будет 0).

Основная причина, по которой ядро ​​будет на уровне 3.3, а совместимость на уровне 3.1, будет связана с крайними случаями в спецификации.Например, может быть достаточно легко реализовать объекты массива вершин, которые соответствуют основной спецификации, однако может потребоваться намного больше времени, чтобы правильно работать с устаревшими устаревшими функциями (такими как скомпилированные массивы вершин, списки отображения и т. Д.).

По сути, для разработчиков драйверов требуется меньше усилий для поддержки профиля ядра - профиль совместимости по своей природе сложнее поддерживать (что было основным фактором, который определил введение профиля ядра).

...