微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在OpenGL上下文之间同步资源时是否需要调用glFinish?

我在应用程序中使用了两个OpenGL上下文。

一个用于渲染数据,第二个用于后台加载并生成VBO和纹理。

当我的加载上下文生成VBO并将其发送到渲染线程时,除非在加载上创建VBO之后调用glFlushglFinish,否则我的VBO中会得到无效数据(全零)上下文。

我认为这是由于我的加载上下文没有任何缓冲区交换或任何要告诉GPU开始在其命令队列上工作而什么都不做的事情(这导致渲染上下文侧的VBO为空)。

从我所看到的情况来看,在Windows上不需要刷新(使用Nvidia GPU测试,即使没有刷新也可以使用),但是在linux / macOS上是必需的。

Apple文档上的此页面上说,必须呼叫glFlushhttps://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESApplicationDesign/OpenGLESApplicationDesign.html

如果您的应用在多个上下文之间共享OpenGL ES对象(例如顶点缓冲区或纹理),则应调用glFlush函数来同步对这些资源的访问。例如,在一个上下文中加载顶点数据之后,应调用glFlush函数,以确保其内容已准备好被另一上下文检索。

但是需要调用glFinishglFlush还是有更简单/更轻便的命令可用来实现相同的结果? (glFlushglFinish是必需的?)

此外,是否有文档或参考文献讨论此问题?我找不到任何提及,而且似乎在实现之间的工作方式有所不同。

解决方法

如果您操纵线程A中任何对象的内容,则其他线程B until two things have happened看不到那些内容:

  1. 修改对象的命令带有completedglFlush未完成命令;您必须使用glFinishsync object来确保命令完成。

    请注意,需要将完成传递给线程B,但是必须在线程A上发出同步命令。因此,如果线程A使用glFinish,则它现在必须使用一些CPU同步来传达该线程完成到线程B的操作。如果改为使用围栏同步对象,则需要在线程A上创建围栏,然后将其移交给可以在该围栏上测试/等待的线程B。

  2. 必须将对象重新绑定到线程B的上下文。也就是说,您必须在命令完成后直接将其绑定到该上下文(可以直接使用glBind*命令,也可以通过间接绑定附加了此对象的容器对象。

这在OpenGL规范的第5章中有详细介绍。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。