GLSL中的memoryBarrier和OpenGL API中的glMemoryBarrier有什么区别

时间:2014-08-09 18:37:35

标签: glsl opengl-4

是否GLSL中的memoryBarrier在单个着色器调用中命令内存事务,并且OpenGL API中的glMemoryBarrier在多个着色器调用(不一定是同一个程序)中对内存事务进行排序。

1 个答案:

答案 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的内存屏障功能至关重要。