与计算着色器和 imageStore 的内存一致性
Memory coherency with compute shaders and imageStore
我想在多个计算着色器中使用imageStore
和imageLoad
。
这与 "normal" 渲染命令 (glDraw) 混合到屏幕或帧缓冲区,但这些不使用 imageStore
或 imageLoad
(仅 texture
或 texelFetch
).
我只有一个 OpenGL 上下文和线程。
我的假设如下:
- 在执行
imageStore
时,我需要先执行 glMemoryBarrier
,然后再在稍后的计算着色器中执行 imageLoad
或 texture
或 texelFetch
后来的片段着色器。
- 我根本不需要使用
coherent
。
- 我根本不需要使用
glSync
。
- 在使用帧缓冲区写入纹理然后使用
imageLoad
读取纹理后,我不需要使用 glMemoryBarrier
- OpenGL 将 运行 计算着色器和 "normal" 绘制操作按照请求的顺序进行。假设我在调用之间使用
glMemoryBarrier
,则没有 "threading issues".
他们正确吗?
除了“'possible'”之外,每个都是正确的:
I don't need to use coherent
at all.
您可能需要 coherent
,具体取决于您的计算着色器正在做什么。如果您的计算着色器写入图像,然后从另一个 invocation within the same dispatch, then you need coherent
. So if you do an imageStore
, issue a compute shader barrier()
call, then do an imageLoad
to read some other invocation 的值写入的数据中读取,那么您需要 coherent
限定符。
coherent
是为了确保 visibility within a rendering command(CS 调度在 OpenGL 中被视为 "rendering commands")。如果不需要内部可见性,则不需要 coherent
.
我想详细说明一下,因为这是一个常见的混淆来源:
I don't need to use glMemoryBarrier
after writing to a texture using a framebuffer and then reading it with imageLoad
这是绝对正确的。内存屏障是关于确保不连贯写入内存的可见性(和同步)。渲染到帧缓冲区是 而不是 不连贯的写入。因此,您可以在此类数据上使用 imageLoad
而无需显式同步。
当然假设你不是rendering to that framebuffer in the same operation you're imageLoad
ing from it。该规则仍然适用。
我想在多个计算着色器中使用imageStore
和imageLoad
。
这与 "normal" 渲染命令 (glDraw) 混合到屏幕或帧缓冲区,但这些不使用 imageStore
或 imageLoad
(仅 texture
或 texelFetch
).
我只有一个 OpenGL 上下文和线程。
我的假设如下:
- 在执行
imageStore
时,我需要先执行glMemoryBarrier
,然后再在稍后的计算着色器中执行imageLoad
或texture
或texelFetch
后来的片段着色器。 - 我根本不需要使用
coherent
。 - 我根本不需要使用
glSync
。 - 在使用帧缓冲区写入纹理然后使用
imageLoad
读取纹理后,我不需要使用 - OpenGL 将 运行 计算着色器和 "normal" 绘制操作按照请求的顺序进行。假设我在调用之间使用
glMemoryBarrier
,则没有 "threading issues".
glMemoryBarrier
他们正确吗?
除了“'possible'”之外,每个都是正确的:
I don't need to use
coherent
at all.
您可能需要 coherent
,具体取决于您的计算着色器正在做什么。如果您的计算着色器写入图像,然后从另一个 invocation within the same dispatch, then you need coherent
. So if you do an imageStore
, issue a compute shader barrier()
call, then do an imageLoad
to read some other invocation 的值写入的数据中读取,那么您需要 coherent
限定符。
coherent
是为了确保 visibility within a rendering command(CS 调度在 OpenGL 中被视为 "rendering commands")。如果不需要内部可见性,则不需要 coherent
.
我想详细说明一下,因为这是一个常见的混淆来源:
I don't need to use
glMemoryBarrier
after writing to a texture using a framebuffer and then reading it withimageLoad
这是绝对正确的。内存屏障是关于确保不连贯写入内存的可见性(和同步)。渲染到帧缓冲区是 而不是 不连贯的写入。因此,您可以在此类数据上使用 imageLoad
而无需显式同步。
当然假设你不是rendering to that framebuffer in the same operation you're imageLoad
ing from it。该规则仍然适用。