【问题标题】:`glGetString(...)` Returning null on Valid Linux Context in VM`glGetString(...)` 在 VM 中的有效 Linux 上下文上返回 null
【发布时间】:2015-01-24 21:18:09
【问题描述】:

我正在调用 glGetString(GL_VERSION) 以获取我请求的上下文支持的 OpenGL 版本(我尝试请求 GL 2 和 GL 3 上下文、核心和兼容性)。但是,它不断返回 null。这应该适用于所有类型的上下文(参见例如GL 4 docs)。它在 Windows 上也能正常工作。

在类似的问题(例如foobarbazqux)中,我发现问题普遍在于没有首先设置 GL 上下文。为了确保我这样做,我记录了每个相关的 glX 调用以产生以下输出:

1 Created     basic context 0x17dd9d0                      on display 0x17cdcb0.
2 Setting           context 0x17dd9d0 onto window 77594626 on display 0x17cdcb0.
3 Created attribute context 0x1892e60                      on display 0x17cdcb0.
4 Setting           context     (nil) onto window        0 on display 0x17cdcb0.
5 Setting           context 0x1892e60 onto window 77594626 on display 0x17cdcb0.

第 1 项是 glXCreateContext。该上下文在虚拟窗口(第 2 项)上设置为当前 (glXMakeCurrent)。第 3 项是使用该上下文创建带有glXCreateContextAttribsARB1 的上下文。第 4 项取消设置基本上下文(不必要)(再次glXMakeCurrent)。第 5 项是在窗口上设置属性上下文(再次glXMakeCurrent)。

紧接着,glGetString 被调用并返回 null。根据文档,这意味着发生了错误。但是,使用glGetError 检查不会产生错误。如果我没有得到字符串而只是继续绘图,那么一切正常,表明属性上下文确实设置正确且合法。

我能想到的唯一可能影响这一点的因素:

  1. Linux 正在 VirtualBox VM 中运行。我还没有测试过真正的发行版,但现在会这样做。
  2. 设置上下文的窗口是一个不显示的虚拟窗口。但是它是mapped/unmapped with XMapWindow/XUnmapWindow,以便 X 服务器知道它。

问题:发生了什么?

1这种间接创建虚拟上下文首先加载属性上下文扩展函数的方法在 Windows 上是必需的。为简化代码,我在 Linux 上执行相同的过程。

【问题讨论】:

  • 如果您想避免自己实现间接寻址,而只是像在 X11 上那样在 Windows 上做一些事情,您可能想看看这个:github.com/datenwolf/wglarb
  • 我遇到了完全相同的问题!我认为这是 AMD fglrx 图形驱动程序独有的问题,但我不确定。我发现如果您在运行应用程序之前使用LD_PRELOAD=/usr/lib64/fglrx/fglrx-libGL.so.1.2 预加载库,那么 glGetString 工作正常,但这是一个非最佳解决方案,我真的不知道它是如何工作的。你找到解决问题的方法了吗?
  • @AshleySommer,没有。我的代码库中的代码现在报告了一个警告:“此驱动程序为 \"getGetString(0x1F02)\”返回了一个空字符串,表示错误情况,但实际上没有。没有更好的信息走开,libportcullis 将忽略谎言并返回一个虚拟字符串。这可能会导致以后不准确。此警告将出现一次。有关详细信息,请参阅此文件。" 文件本身详细说明,然后指出回到这个问题。

标签: opengl x11 glx


【解决方案1】:

创建 OpenGL 上下文后,您必须使其在正在运行的线程中成为当前线程并使用可绘制对象。使用 glXMakeCurrent 或 glXMakeContextCurrent。

【讨论】:

  • 谢谢,但我已经在步骤 2、4 和 5 中执行此操作。我已编辑问题以明确列出 glXMakeCurrent
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
相关资源
最近更新 更多