gpt4 book ai didi

linux - 与 Linux 上的 GLUT 共享上下文

转载 作者:太空宇宙 更新时间:2023-11-04 09:30:53 27 4
gpt4 key购买 nike

在我当前的设置中,我有两个显示器,它们由两个 GPU 驱动。使用 GLUT,我创建了两个窗口(每个显示器一个),并通过在绘制调用中为每个窗口调用 glutSetWindow() 从主线程渲染每个窗口。

绘制调用将 Texture2D 渲染为球体(使用 gluSphere()),但 Texture2D 每隔几秒就会换成另一个图像。我已经设置了一个包含 2 个 Texture2D 的数组,因此我可以在显示当前 Texture2D 时加载下一张图像。只要一切都在主线程中运行,这种方法就可以正常工作。

问题是调用 glTexImage2D() 以加载下一张图像会挂起我的绘制调用,因此我需要在不同的线程上调用 glTexImage2D()。在不同的线程上调用 glTexImage2D() 会崩溃,因为 OpenGL 上下文似乎没有共享。 GLUT 似乎没有提供共享上下文的方法,但我应该能够通过 glXGetCurrentContext() 在 Linux 上获取上下文。

我的问题是,如果我通过此调用获得上下文,我如何才能使其成为共享上下文?这甚至可以与 GLUT 一起使用吗?另一种选择是切换到不同的库来替换 GLUT,例如 GLFW,但在那种情况下,我将放弃一些方便的函数,例如 gluSphere()。如果无法与 GLUT 共享上下文,有什么建议吗?

最佳答案

使用 GLX 上下文共享是在上下文创建时建立的;与 WGL 不同,您不能事后才建立这种共享。由于 GLUT 没有上下文共享功能(FreeGLUT 可能有,但我不确定)这不会很简单。

I have two displays that are being driven by two GPUs.

除非这些 GPU 是 SLi-ed 或 CrossFire-ed,否则您无法在它们之间建立上下文共享。

The problem is that the call to glTexImage2D(), to load the next image, hangs my draw call, so I need to call glTexImage2D() on a different thread.

如果图像大小相同,则使用 glTexSubImage2D 替换它。还可以使用像素缓冲区对象异步加载图像数据,使用甚至不需要 OpenGL 上下文的辅助线程!

概述步骤:

在 OpenGL 上下文线程中:

正在启动传输

  • glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboID)
  • void *p = glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
  • 信号传输线程
  • 继续正常的绘图操作

在传输线程中

收到开始传输的信号

  • 复制数据到映射缓冲区
  • 信号 OpenGL 上下文线程

在 OpenGL 上下文线程中:

完成传输的信号

  • glUnmapBuffer
  • glTex[Sub]Image
  • sync = glFenceSync
  • 继续使用纹理绘制

关于绘图循环的进一步迭代

  • 使用 glClientWaitSync 使用超时 0 轮询 sync
  • 如果等待同步返回有信号切换到新纹理并删除旧纹理
  • 否则继续使用旧纹理绘制

关于linux - 与 Linux 上的 GLUT 共享上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31487426/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com