如何在 lvvmpipe 软件渲染器中激活 OpenGL 3.3 核心配置文件?

How to activate OpenGL 3.3 core profile in lvvmpipe software renderer?

我有一个 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.
...

有没有办法用核心 3.3 配置文件启动 OpenGL 程序?

Unfortunately, any OpenGL program starts only in OpenGL 3.1 mode.

任何 GL 程序都不会这样做。只有使用遗留上下文创建的旧程序(因此它们甚至不知道或不关心不同配置文件的存在)才会获得此版本。

(compatibility profile).

实际上,OpenGL 3.1 兼容性配置文件甚至不存在。配置文件是在 OpenGL 3.2 中引入的,即使 mesa 对此的解释略有不同。从技术上讲,mesa llvmpipe 根本不支持兼容性配置文件。

Is there a way to start OpenGL programs with core 3.3 profile?

没有用。如果程序使用遗留上下文创建,它要么不知道更新的 GL 函数(因此将无法使用它们),要么它只是被破坏并简单地假设获得一些更新的 GL 版本,这没什么根据规范,程序可以依赖。

无论如何,如果程序不是为 OpenGL 核心配置文件编写的,则很可能无法正常运行,因为许多已弃用的遗留功能在核心配置文件中根本不可用。

您的示例 glxgears 将简单地生成大量 GL 错误并且仅在核心配置文件中显示黑屏 wehn 运行,因为它使用显示列表和即时模式渲染命令以及固定的-函数管线,这些在核心配置文件OpenGL中都不可用。

虽然这很可能毫无用处,但要使程序使用不需要它的核心配置文件 OpenGL,您可以修改源代码,或者以某种方式干扰其上下文创建操作。 具有讽刺意味的是,几天前我自己在 glx_hook hack which actually allows to modify the context an application is requesting 中添加了一些功能,而无需修改源代码。