`glGetString(...)`在VM中的有效Linux上下文中返回null

时间:2015-01-24 21:18:09

标签: opengl x11 glx

我正在调用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项使用该上下文创建具有glXCreateContextAttribsARB 1 的上下文。第4项取消基本上下文(不必要)(再次glXMakeCurrent)。第5项是将属性上下文设置到窗口(再次glXMakeCurrent)。

在此之后,立即调用glGetString并返回null。根据文档,这意味着发生了错误。但是,使用glGetError进行检查会产生错误。如果我没有得到字符串并且只是继续绘图,那么一切都很好,表明属性上下文确实设置正确且合法。

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

  1. Linux正在VirtualBox VM中运行。我没有测试过真正的发行版,但目前会这样做。
  2. 设置上下文的窗口是不显示的虚拟窗口。然而,它是mapped/unmapped with XMapWindow/XUnmapWindow,以便X服务器知道它。
  3. 问题:发生了什么事?

    1 在Windows上,必须首先创建虚拟上下文以加载属性上下文扩展功能。为了简化代码,我在Linux上执行相同的过程。

1 个答案:

答案 0 :(得分:0)

创建OpenGL上下文后,您必须在正在运行的线程中使用drawable。使用glXMakeCurrent或glXMakeContextCurrent。