内存与计算着色器和imageStore的一致性

时间:2015-12-03 15:34:30

标签: c++ opengl memory shader compute-shader

我想在多个计算着色器中使用imageStoreimageLoad

这与" normal"混合将命令(glDraw)渲染到屏幕或帧缓冲区,但这些命令不会使用imageStoreimageLoad(仅texturetexelFetch)。

我只有一个OpenGL上下文和线程。

我的假设如下:

  • 在执行imageStore时,我需要先执行glMemoryBarrier,然后在稍后的计算着色器中执行imageLoad,或在后续片段中执行texturetexelFetch着色器。
  • 我根本不需要使用coherent
  • 我根本不需要使用glSync
  • 使用帧缓冲区写入纹理然后使用glMemoryBarrier
  • 读取纹理后,我不需要使用imageLoad
  • OpenGL将运行计算着色器和"正常"按照请求的顺序绘制操作。假设我在调用之间使用glMemoryBarrier,则没有"线程问题"。

它们是否正确?

1 个答案:

答案 0 :(得分:3)

每一个都是正确的,可能的''''一个例外:

  

我根本不需要使用coherent

您可能需要coherent,具体取决于您的计算着色器正在执行的操作。如果您的计算着色器写入图像,然后从另一个invocation within the same dispatch写入的数据中读取,则需要coherent。因此,如果您执行imageStore,请发出计算着色器barrier(),然后执行imageLoad以阅读其他invocation的值,那么您需要coherent限定符。

coherent是关于确保visibility within a rendering command(CS调度被认为是"渲染命令"在OpenGL中)。如果您不需要内部可见性,那么您就不需要coherent

我想详细说明这一点,因为它是混淆的常见原因:

  

在使用帧缓冲区写入纹理然后使用glMemoryBarrier

读取纹理后,我不需要使用imageLoad

这是绝对正确的。内存障碍是关于确保对内存的不连贯写入的可见性(和同步)。渲染到帧缓冲区是不是不连贯的写入。因此,您可以对此类数据使用imageLoad,而无需显式同步。

当然假设你不是rendering to that framebuffer in the same operation you're imageLoading from it。该规则仍然适用。