gpt4 book ai didi

opengl - 在 OpenGL 上下文之间同步资源时是否需要调用 glFinish?

转载 作者:行者123 更新时间:2023-12-03 16:20:22 24 4
gpt4 key购买 nike

我在我的应用程序中使用了两个 OpenGL 上下文。
第一个用于渲染数据,第二个用于后台加载和生成 VBO 和纹理。
当我的加载上下文生成一个 VBO 并将其发送到我的渲染线程时,除非我调用 glFlush,否则我会在我的 VBO 中获得无效数据(全为零)或 glFinish在加载上下文中创建 VBO 之后。
我认为这是由于我的加载上下文没有任何缓冲区交换或任何告诉 GPU 开始处理其命令队列并且什么都不做(这导致渲染上下文侧的 VBO 为空)。
据我所见,这种刷新在 Windows 上不是必需的(使用 Nvidia GPU 测试,即使没有刷新也可以工作),但在 linux/macOS 上是必需的。
Apple 文档上的这个页面说调用 glFlush是必要的(https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESApplicationDesign/OpenGLESApplicationDesign.html)

If your app shares OpenGL ES objects (such as vertex buffers or textures) between multiple contexts, you should call the glFlush function to synchronize access to these resources. For example, you should call the glFlush function after loading vertex data in one context to ensure that its contents are ready to be retrieved by another context.


但是正在调用 glFinishglFlush有必要还是有更简单/更轻的命令来实现相同的结果? (哪个是必要的, glFlushglFinish ?)
此外,在某处是否有关于此的文档或引用资料?我找不到任何提及,并且它似乎在实现之间的工作方式不同。

最佳答案

如果您在线程 A 中操作任何对象的内容,则这些内容对其他线程 B 是不可见的 until two things have happened :

  • 修改对象的命令有completed . glFlush不完成命令;您必须使用 glFinishsync object以确保命令完成。
    请注意,完成需要传达给线程 B,但必须在线程 A 上发出同步命令。因此,如果线程 A 使用 glFinish ,它现在必须使用一些 CPU 同步来向线程 B 传达线程已完成的信息。如果您使用栅栏同步对象,则需要在线程 A 上创建栅栏,然后将其交给可以测试/等待的线程 B那个栅栏。
  • 该对象必须重新绑定(bind)到线程 B 的上下文。也就是说,您必须在命令完成后将其绑定(bind)到该上下文(直接使用 glBind* 命令或通过绑定(bind)具有该对象的容器对象间接绑定(bind)附在上面)。

  • 这在 OpenGL 规范的第 5 章中有详细说明。

    关于opengl - 在 OpenGL 上下文之间同步资源时是否需要调用 glFinish?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63934706/

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