Как активировать основной профиль OpenGL 3.3 в программном рендере lvvmpipe? - PullRequest
0 голосов
/ 14 марта 2020

У меня есть система Linux с программным драйвером Mesa3D и llvmpipe.

отчеты glxinfo

Extended renderer info (GLX_MESA_query_renderer):
Vendor: VMware, Inc. (0xffffffff)
Device: llvmpipe (LLVM 9.0, 128 bits) (0xffffffff)
Version: 19.2.8
Accelerated: no
Video memory: 65482MB
Unified memory: no
Preferred profile: core (0x1)
Max core profile version: 3.3
Max compat profile version: 3.1
Max GLES1 profile version: 1.1
Max GLES[23] profile version: 3.0

Если я правильно читаю эту информацию, OpenGL 3.3 должен поддерживаться в профиле ядра. , К сожалению, любая программа OpenGL запускается только в режиме OpenGL 3.1 (профиль совместимости). Например,

~$ xvfb-run glxgears -info
GL_RENDERER   = llvmpipe (LLVM 9.0, 128 bits)
GL_VERSION    = 3.1 Mesa 19.2.8
GL_VENDOR     = VMware, Inc.
...

Есть ли способ запустить программы OpenGL с профилем ядра 3.3?

1 Ответ

1 голос
/ 14 марта 2020

К сожалению, любая программа OpenGL запускается только в режиме OpenGL 3.1.

Не любая программа GL сделает это. Только старые программы, использующие создание устаревшего контекста (поэтому они даже не знают или не заботятся о существовании различных профилей), получат эту версию.

(профиль совместимости).

На самом деле, профиль совместимости OpenGL 3.1 даже не существует. Профили были введены в OpenGL 3.2, даже если его интерпретация немного отличается. Технически, mesa llvmpipe просто не поддерживает профили совместимости.

Есть ли способ запуска программ OpenGL с профилем ядра 3.3?

Бесполезно. Если программа использует создание унаследованного контекста, она либо не знает о более новых функциях GL (и не сможет их использовать как следствие), либо просто ломается и просто предполагает получить более новую версию GL, которая является ничем на программу можно положиться в соответствии со спецификацией c.

В любом случае, если программа не написана для основного профиля OpenGL, она, скорее всего, будет работать неправильно, поскольку многие устаревшие функциональные возможности устарели. просто недоступен в профилях ядра.

Ваш пример glxgears просто сгенерирует много ошибок GL и покажет только черный экран, который не запускается в профиле ядра, потому что он использует списки отображения и команды рендеринга в непосредственном режиме и конвейер с фиксированными функциями, которых нет в профиле ядра OpenGL.

Несмотря на то, что, скорее всего, совершенно бесполезно, чтобы программа использовала профиль ядра OpenGL, который его не запрашивает, вы можете изменить исходный код, или вы можете как-то вмешиваться в его создание контекста п операций. В какой-то иронии c поворота событий я сам всего за несколько дней go добавил некоторую функциональность в мой glx_hook хак, который фактически позволяет изменять контекст, который запрашивает приложение без необходимости изменения исходного кода.

...