Electron中神秘的无效OpenGL上下文

12

我创建了一个由GLX和GLEW支持的C++ & OpenGL动画引擎,并通过SWIG将其封装在Node.js模块中。目标是在Electron应用程序的浏览器进程中使用该引擎。

该引擎似乎非常稳定。它具有多上下文感知能力,在所有相关操作之前绑定正确的OpenGL上下文,几乎在每个可能的操作后都检查错误,并由相当大的测试套件支持。

在electron应用程序之外,一切都运行良好。然而,神秘的是,通常在Electron之外可以正常工作的简单脚本在Electron应用程序的浏览器进程或渲染器进程中失败了。

症状

  • glGenX生成的任何内容都会返回0
  • glGetString(GL_VERSION)返回null,然后glGetError不返回任何错误

事实

按照以下顺序:

  • OpenGL上下文使用合理的FB配置使用glXCreateContextAttribsARB创建。返回值为非零。
  • 调用XSync(display, false)等待X错误。没有错误会导致程序崩溃,设置X错误处理程序没有结果。
  • 使用glXMakeCurrent使上下文当前,glGetError没有报告任何错误。
  • 上下文是直接的,使用glXIsDirect进行检查。
  • 使用glewInit初始化GLEW,并返回GLEW_OK
  • 在本例中,操作发生在同一个线程中。在Electron应用程序中,上下文立即在同一进程中创建并使用; 上下文本身的创建在同一方法内查询版本。Electron应用程序“准备”之前和之后都出现了相同的症状。

我非常困惑。我检查的所有内容似乎表明上下文已正确创建,但它似乎被损坏或无法正常工作。

发生了什么?还有什么其他方面可以检查吗?


Node.js始终是多线程的,您是否异步调用了C++? - Dietrich Epp
更准确地说,我所有的C++调用都是同步的。上下文的创建和版本查询发生在同一个C++方法中;除非Node.js正在执行我不知道的某些魔法(并且仅限于Electron内部),否则这些操作肯定应该在同一线程上进行。 - Litty
1
你能提供一些代码吗? - DaOnlyOwner
@geza确实。如果没有设置错误处理程序,GLX会抛出一个错误。我已经设置了一个错误处理程序以防万一,但它也没有捕获到任何东西。 - Litty
@mascoj,mikep的回答中链接的问题表明他们并不不支持它,如果这样说有意义的话。无论是官方还是非官方,旧版本的Electron都支持它。 - Litty
显示剩余4条评论
1个回答

3

Boo。那肯定可以解释了,感谢您的研究。 - Litty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接