繁体   English   中英

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

[英]Memory coherency with compute shaders and imageStore

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

这与“正常”渲染命令(glDraw)混合到屏幕或帧缓冲区,但是这些命令不使用imageStoreimageLoad (仅使用texturetexelFetch )。

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

我的假设如下:

  • 如果做一个imageStore ,我需要做glMemoryBarrier做一个前imageLoad在后面的计算着色器或texturetexelFetch在后面的片段着色器。
  • 我根本不需要使用coherent的内容。
  • 我根本不需要使用glSync
  • 我并不需要使用glMemoryBarrier使用帧缓冲区写入到纹理,然后用阅读后imageLoad
  • OpenGL将按请求的顺序运行计算着色器和“常规”绘制操作。 假设在glMemoryBarrier调用之间使用glMemoryBarrier ,则没有“线程问题”。

他们正确吗?

所有这些都是正确的,但“可能”除外:

我根本不需要使用coherent的内容。

您可能需要coherent ,具体取决于您的计算着色器正在做什么。 如果您的计算着色器写入图像,然后从同一调度中的另一个调用写入的数据中读取数据,那么您需要coherent 因此,如果您执行imageStore ,发出计算着色器barrier()调用,然后执行imageLoad来读取其他调用的值,那么您需要coherent限定符。

coherent是关于确保渲染命令中的可见性 (CS调度在OpenGL中被视为“渲染命令”)。 如果您不需要内部可见性,那么就不需要coherent


我想对此进行详细说明,因为这是造成混淆的常见原因:

我并不需要使用glMemoryBarrier使用帧缓冲区写入到纹理,然后用阅读后imageLoad

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

当然,假设您没有使用从imageLoad到该操作的相同操作渲染到该帧缓冲区 该规则仍然适用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM