是否GLSL中的memoryBarrier在单个着色器调用中命令内存事务,并且OpenGL API中的glMemoryBarrier在多个着色器调用(不一定是同一个程序)中对内存事务进行排序。
答案 0 :(得分:2)
是否GLSL中的memoryBarrier命令内存中的事务处理 一个着色器调用和OpenGL API中的glMemoryBarrier 在多个着色器调用中对内存事务进行排序(其中 不一定是同一个程序。)
不完全是。您应首先明确着色器调用是什么:处理单个输入权限的着色器代码的执行。因此,对于您进行的绘制调用的每个顶点都有一个顶点着色器调用,并且对于光栅化生成的每个片段至少有一次片段着色器(在某些类型的多重采样中它将不止一个)。不同绘制调用(可能不同)的着色器调用当然也是不同的调用。但通常情况下,当一个人谈到"多次调用"时,同一个着色器的一种方法,在同一个绘制调用期间(都可能并行执行)。
GLSL spec (version 4.40)(第8.17节)对此有关内存障碍的说法:
所有类型的着色器都可以读取和写入纹理和内容 缓冲对象使用图像变量。而阅读的顺序和 在单个着色器调用中写入是明确定义的,相对的 读取和写入单个共享内存地址的顺序 多个单独的着色器调用很大程度上是未定义的。命令 由一个着色器调用执行的内存访问,如 其他着色器调用,也很大程度上未定义但可以 通过记忆控制功能进行控制。
所以,这可能或者可能不是你对上述陈述的意思,取决于你的意思"单一调用&#34 ;.,但只有你把它解释为"所有的调用单个抽奖电话"。
这是来自OpenGL 4.4 core profile specification,第7.12.2节
需要显式同步以确保效果 由着色器执行的缓冲区和纹理数据存储将是可见的 后续操作使用相同的对象,不会覆盖 数据仍然需要先前请求的操作读取。没有 手动同步,“新”原语的着色器存储可以 在处理“旧”原语完成之前完成。 此外,可能无法完成“旧”原语的存储 在处理“新”原语开始之前。
所以这也不是关于下面的绘制调用的着色器调用。它根本不需要新的着色器调用:如果以下GL命令使用或覆盖着色器已写入的数据,则必须手动同步它。请注意,这仅在着色器写入缓冲区或纹理时才相关,它与"普通"无关。 framebuffer通过管道写道:
相同着色器类型的调用的相对顺序是 未定义。在处理原始B时由着色器发布的商店 即使原始A,也可能在原始A的商店之前完成 在原语B之前指定。这甚至适用于片段 着色器;片段着色器输出被写入帧缓冲区 按原始顺序,由片段着色器调用执行的存储是 不
我建议你阅读整篇7.12节,这篇文章太长了,无法在此处粘贴,但对于理解GL的内存屏障功能至关重要。