GtkGLArea:未找到 GL_ARB_create_context_profile 扩展
Posted
技术标签:
【中文标题】GtkGLArea:未找到 GL_ARB_create_context_profile 扩展【英文标题】:GtkGLArea: GL_ARB_create_context_profile extension not found 【发布时间】:2015-04-02 11:09:28 【问题描述】:我正在尝试让 GTK+ 3.16 的新 GLArea 小部件工作。它旨在提供内置的 OpenGL 支持,而不依赖于过时的 GtkGLExt/GtkGLArea 项目。由于我还不愿意将我的工作发行版更新到 Gnome 3.16,所以我使用 Gnome Boxes 在虚拟机上安装了 Fedora 22 Alpha。
在ebassi's blog post 之后,我在我的窗口 UI 文件中添加了一个 GLArea 子项:
<child>
<object class="GtkGLArea" id="gl_drawing_area">
<signal name="realize" handler="gl_init" swapped="yes"/>
<signal name="unrealize" handler="gl_fini" swapped="yes"/>
<signal name="render" handler="gl_draw" swapped="yes"/>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
</object>
</child>
并连接信号。我应该说我正在使用 Vala 作为我的 UI 代码。实际的 OpenGL 代码旨在进入我将从 gl_draw
Vala 方法调用的 C 函数。目前,三个 Vala 函数只打印它们的名称。
确实,gl_init
和 gl_fini
被调用。但 GLArea 小部件显示此错误消息:
创建核心配置文件所需的 GLX_ARB_create_context_profile 扩展不可用
我还尝试运行 ebassi 自己的 example program (GitHub)。它甚至不显示 UI 而是输出
glarea:找不到当前的 GLX 或 EGL 上下文。
马上在终端上。
但是,运行 glxinfo
告诉我我安装了该扩展:
name of display: :0
display: :0 screen: 0
direct rendering: Yes
server glx vendor string: SGI
server glx version string: 1.4
server glx extensions:
GLX_ARB_multisample, GLX_EXT_import_context, GLX_EXT_texture_from_pixmap,
GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_MESA_copy_sub_buffer,
GLX_OML_swap_method, GLX_SGIS_multisample, GLX_SGIX_fbconfig,
GLX_SGIX_pbuffer, GLX_SGI_make_current_read
client glx vendor string: Mesa Project and SGI
client glx version string: 1.4
client glx extensions:
GLX_ARB_create_context, GLX_ARB_create_context_profile,
GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float,
GLX_ARB_framebuffer_sRGB, GLX_ARB_get_proc_address, GLX_ARB_multisample,
GLX_EXT_buffer_age, GLX_EXT_create_context_es2_profile,
...
glxgears
也可以正常运行。
此外,我克隆了GNOME/gtkglarea repo in Github,自己编译并运行示例,没有任何问题。 我知道这个项目在 GLArea 小部件被正式包含在 GTK 之前开发了它?(我错了。)
【问题讨论】:
您给出的glxinfo
输出确实不 将GLX_ARB_create_context_profile
列为可用。您的服务器显然缺乏对此的支持。基本上,您只能使用客户端和服务器同时支持的内容。这也是glxinfo
在“服务器 glx 扩展”和“客户端 glx 扩展”之后明确列出“GLX 扩展”的原因。
【参考方案1】:
在虚拟化环境下运行总是相当棘手。
即使您看到扩展,您也可能无法创建正确的 GLX 上下文,因为 GTK+ 使用的最低版本(即 3.2)有要求; Mesa 中的 llvmpipe 软件光栅化器不完全支持 OpenGL 3.2,因为一些必需的扩展已获得专利保护。详情请见bug 744407,以及未来的计划。
顺便说一句:通常,能够运行glxgears
并不意味着能够使用 OpenGL — 除了非常古老的 1.x 固定管道 API。就像它不是 OpenGL 基准测试一样,glxgears
恐怕也不是 OpenGL 可用性的一个很好的指标。
【讨论】:
那很不幸;在这种情况下,我将不得不考虑将我的主机升级到 Gnome 3.16。首先非常感谢您的回答和您出色的博客文章。我对 OpenGL 和 Gtk 还很陌生,还有很多关于我仍然不理解的机制。那么为什么我能够运行 GNOME/gtkglarea 存储库中的示例呢? gtkglarea 是一个老图书馆;原始代码使用 GTK+ 2,最近有一个 GTK+ 3 端口。该端口正在使用已弃用的 API,它没有与 GTK 绘图周期集成(因此它利用了可能在任何时候中断的未定义行为),并且它仍然基于已弃用的旧版 GL 上下文。对于 GTK+ 3.16,我们决定不同时支持旧版和核心 GL 配置文件,因为它无法可靠地检测到用户将使用什么。希望 Mesa 能尽快修复。 我明白了。我没有意识到这是旧的 GtkGLArea。它的名字有点混乱。再次感谢。我在我的机器和installed Gnome 3.16 via JHBuild 上创建了一个新用户,现在它可以工作了。 @ebassiglxgears -info | head -n5
> GL_RENDERER = GeForce GTX 1050 Ti/PCIe/SSE2 > GL_VERSION = 4.5.0 NVIDIA 384.59 > GL_VENDOR = NVIDIA Corporation 相当不错的指标,但我通常运行 glmark2以上是关于GtkGLArea:未找到 GL_ARB_create_context_profile 扩展的主要内容,如果未能解决你的问题,请参考以下文章