我创建了一个由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应用程序“准备”之前和之后都出现了相同的症状。
我非常困惑。我检查的所有内容似乎表明上下文已正确创建,但它似乎被损坏或无法正常工作。
发生了什么?还有什么其他方面可以检查吗?