同步连续的OpenGL Compute Shader调用


12

我有几个需要按一定顺序执行的计算着色器,它们的输出取决于以前的输入。理想情况下,我永远不需要在客户端复制缓冲区并在GPU上完成所有工作。

考虑一下,我有两个计算着色器已编译并链接为program_oneprogram_two。假设我还有一个GL_SHADER_STORAGE_BUFFER包含由写入program_one和读取的数据的program_two。我可以简单地执行以下操作:

glUseProgram(program_one);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);

glUseProgram(program_two);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);

是否可以保证第一个计算着色器的所有调用将在第二个计算着色器的任何调用之前完成(以避免读写之间的数据争用buffer)?如果没有,如何同步它们?

Answers:


12

不可以,这是不能保证的,因为OpenGL规范允许两个Compute Shader同时运行甚至以不同的顺序运行。

您需要glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT)在第二秒之前调用,glDispatchCompute以确保可以看到来自的写入program_one


从有关内存模型的OpenGL.org Wiki文章

阶段之间的调用可以按任何顺序执行。这包括由不同的渲染命令启动的调用。虽然来自不同渲染操作的两个顶点着色器可能不太可能同时运行,但也有可能,因此OpenGL不提供任何保证

来自有关着色器存储缓冲区的Opengl.org Wiki文章

SSBO的读取和写入使用不连贯的内存访问,因此它们需要适当的屏障,就像图像加载存储操作一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.