我有一个带有主窗口的应用程序。它拥有自己的线程和opengl上下文。此应用程序每个处理器还有一个工作线程,用于创建和上载软件渲染纹理。这非常有效。
我担心工作线程opengl上下文是使用主窗口的device_context创建的。因此,在双处理器系统的情况下,这意味着3个opengl上下文绑定到相同的窗口device_context。它们都是在主窗口线程中创建的,然后调用sharelist使它们共享纹理,然后每个gl_context只在一个线程中激活,一个用于主窗口线程,一个用于每个工作线程。
正如我之前所写的那样,这在我测试过的所有机器上都能完美运行,但我没有看到描述我在做什么的文档,也是我唯一确认的内容。做得很好我发现这是对此链接的最后评论:OpenGL multiple rendering contexts in one window。
所以,我希望有人知道这可以在所有系统上运行。
编辑:我之前忘了提到它,但是有一个问题,就是如果两个工作线程同时调用wglmakecurrent(common_window_device_context,private_opengl_context),其中一个将失败,并且glgeterror = GL_INVALID_OPERATION。在这种情况下,解决方案是调用sleep(1)以允许在其他线程中完成相同调用的时间,然后再次调用wglmakecurrent,然后一切都工作得非常流畅。至少在我测试的所有机器上。
答案 0 :(得分:1)
所以,我希望有人知道这可以在所有系统上运行。
让来自不同线程的多个OpenGL上下文在同一设备上下文中处于活动状态是完全正常的。可能发生的最糟糕的情况是,OpenGL同步点的交互会产生严重的性能问题和未定义的渲染结果。如果您从多个OpenGL上下文进行渲染调用,这只是一个问题。但是,您似乎只想将它们用于I / O工作,即加载VBO数据的纹理。只要你不从渲染线程中引用工作线程操纵的数据对象,就不会发生同步点副作用,而且你是清楚的。
多个上下文交互的确切语义在OpenGL-3和更高版本的规范中定义。我建议你看看。