[英]Memory coherency with compute shaders and imageStore
我想在多个计算着色器中使用imageStore
和imageLoad
。
这与“正常”渲染命令(glDraw)混合到屏幕或帧缓冲区,但是这些命令不使用imageStore
或imageLoad
(仅使用texture
或texelFetch
)。
我只有一个OpenGL上下文和线程。
我的假设如下:
imageStore
,我需要做glMemoryBarrier
做一个前imageLoad
在后面的计算着色器或texture
或texelFetch
在后面的片段着色器。 coherent
的内容。 glSync
。 glMemoryBarrier
使用帧缓冲区写入到纹理,然后用阅读后imageLoad
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.