名称

glMemoryBarrier —定义对内存事务进行排序的屏障

C 规范

void glMemoryBarrier( GLbitfield barriers);

void glMemoryBarrierByRegion( GLbitfield barriers);

参数

barriers
指定要插入的障碍。必须为 GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT, GL_ELEMENT_ARRAY_BARRIER_BIT, GL_UNIFORM_BARRIER_BIT, GL_TEXTURE_FETCH_BARRIER_BIT, GL_SHADER_IMAGE_ACCESS_BARRIER_BIT, GL_COMMAND_BARRIER_BIT, GL_PIXEL_BUFFER_BARRIER_BIT, GL_TEXTURE_UPDATE_BARRIER_BIT, GL_BUFFER_UPDATE_BARRIER_BIT, GL_FRAMEBUFFER_BARRIER_BIT, GL_TRANSFORM_FEEDBACK_BARRIER_BIT, GL_ATOMIC_COUNTER_BARRIER_BIT, 或 GL_SHADER_STORAGE_BARRIER_BIT的按位组合. 如果指定了特殊值GL_ALL_BARRIER_BITS,将插入所有受支持的障碍。

描述

glMemoryBarrier定义一个屏障,相对于在屏障之后发出的事务,该屏障对在命令之前发出的内存事务进行排序。出于此排序的目的,由着色器执行的内存事务被视为由触发着色器执行的渲染命令发出。 barriers是一个位域,指示与着色器存储同步的一组操作;屏障中使用的位如下:

GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT
如果设置,则从障碍之后的缓冲区对象获取的顶点数据将反映在障碍之前由着色器写入的数据。受此位影响的一组缓冲区对象是从用于GL_VERTEX_ATTRIB_ARRAY_BUFFER绑定的通用顶点属性使用的缓冲区对象绑定派生的。

GL_ELEMENT_ARRAY_BARRIER_BIT
如果设置,从屏障后的缓冲区对象获得的顶点数组索引将反映屏障之前着色器写入的数据。受此位影响的缓冲区对象是从GL_ELEMENT_ARRAY_BUFFER绑定派生的。

GL_UNIFORM_BARRIER_BIT
从障碍之后的缓冲区对象获取的着色器统一将反映在障碍之前由着色器写入的数据。

GL_TEXTURE_FETCH_BARRIER_BIT
从着色器获取纹理,包括在障碍之后通过缓冲区纹理从缓冲区对象内存获取的内容,将反映着色器在障碍之前写入的数据。

GL_SHADER_IMAGE_ACCESS_BARRIER_BIT
使用在隔离器之后发出的着色器图像加载,存储和原子内置函数进行的内存访问将反映着色器在隔离器之前写入的数据。另外,在屏障完成之前,直到所有存储器访问(例如,加载,存储,纹理获取,顶点获取)之后,在屏障之后发出的图像存储和原子才会执行。

GL_COMMAND_BARRIER_BIT
障碍之后,通过Draw * Indirect命令从缓冲区对象中获取的命令数据将反映着色器在障碍之前写入的数据。受此位影响的缓冲区对象是从GL_DRAW_INDIRECT_BUFFER绑定派生的。

GL_PIXEL_BUFFER_BARRIER_BIT
屏障之后,通过GL_PIXEL_PACK_BUFFER和GL_PIXEL_UNPACK_BUFFER绑定(通过glReadPixels,glTexSubImage等)对缓冲区对象的读写将反映着色器在屏障之前写入的数据。此外,在屏障之后发出的缓冲区对象写操作将等待在屏障之前启动的所有着色器写操作完成。

GL_TEXTURE_UPDATE_BARRIER_BIT
在障碍之后,通过glTex(Sub)Image *,glCopyTex(Sub)Image *,glCompressedTex(Sub)Image *写入纹理将反映着色器在障碍之前写入的数据。此外,直到在屏障完成之前启动所有着色器写入之后,在屏障之后发出的这些命令的纹理写入才会执行。

GL_BUFFER_UPDATE_BARRIER_BIT
在障碍之后,通过glBufferSubData,glCopyBufferSubData进行的读取或写入操作或对glMapBufferRange映射的缓冲区对象内存的读取将反映着色器在障碍之前写入的数据。另外,通过在屏障之后发出的这些命令进行的写操作将等待对着色器对屏障之前启动的相同内存的所有写入操作完成。

GL_FRAMEBUFFER_BARRIER_BIT
屏障之后通过帧缓冲区对象附件进行的读取和写入将反映着色器在屏障之前写入的数据。此外,在屏障之后发出的帧缓冲区写入将等待在屏障之前发出的所有着色器写入的完成。

GL_TRANSFORM_FEEDBACK_BARRIER_BIT
障碍之后通过变换反馈绑定进行的写入将反映着色器在障碍之前写入的数据。此外,在屏障之后发出的变换反馈写入将等待在屏障之前发出的所有着色器写入的完成。

GL_ATOMIC_COUNTER_BARRIER_BIT
屏障之后对原子计数器的访问将反映屏障之前的写入。

GL_SHADER_STORAGE_BARRIER_BIT
屏障之后对着色器存储块的访问将反映屏障之前的写入。

如果障碍为GL_ALL_BARRIER_BITS,则将相对于上述所有操作同步着色器内存访问。

实现可能会缓存可由着色器在多个缓存中写入的缓冲区对象和纹理图像内存。例如,可能有用于纹理,顶点提取的单独缓存,以及用于着色器内存访问的一个或多个缓存。不需要实现以使这些缓存与着色器内存写入保持一致。由一个调用发出的存储可能无法被其他管道阶段或其他着色器调用立即观察到,因为存储的值可能保留在执行该存储的处理器本地的高速缓存中,或者因为该存储所覆盖的数据仍位于该存储中其他位置的高速缓存中。系统。调用glMemoryBarrier时,GL刷新和/或使与barriers参数指定的操作有关的所有缓存无效,以确保跨屏障的操作顺序一致。

为了允许独立的着色器调用通过对公共内存地址的读取和写入进行通信,可以将OpenGL ES着色语言中的图像变量声明为“相干”。通过此类变量访问的缓冲区对象或纹理图像内存仅在由于任何其他着色器调用发出的存储而导致缓存自动更新时才可以缓存。如果使用连贯变量和非连贯变量访问同一地址,则使用声明为连贯变量的访问将观察在其他调用中使用连贯变量存储的结果。使用声明为“相干”的变量只能保证使用相似声明的变量,着色器调用可以立即看到存储的结果。需要调用glMemoryBarrier以确保存储对于其他操作可见。

以下准则可能有助于选择何时使用相干内存访问以及何时使用屏障。

无需使用相关变量或调用MemoryBarrier()即可访问只读或常量数据。通过API调用(例如BufferSubData)对只读数据的更新将根据需要隐式地使着色器缓存无效。

在着色器调用之间以细粒度共享的数据(例如,由一个调用写入,由另一个调用消耗)应使用相干变量来读取和写入共享数据。

由一个着色器调用编写的数据以及由于执行而启动的其他着色器调用(“相关调用”)使用的数据应在产生着色器调用中使用相干变量,并在最后一次写入之后调用memoryBarrier()。消费着色器调用也应使用相干变量。

在一次渲染过程中写入图像变量并在以后的过程中由着色器读取的数据不需要使用相干变量或memoryBarrier()。必须在两次通过之间的障碍中调用SHADER_IMAGE_ACCESS_BARRIER_BIT设置为MemoryBarrier()的方法。

着色器在一个渲染过程中写入的数据并在另一遍过程中由另一种机制读取的数据(例如,顶点或索引缓冲区拉取)无需使用相干变量或memoryBarrier()。必须在两次通过之间的屏障中设置适当的位来调用glMemoryBarrier。

glMemoryBarrierByRegion的行为与glMemoryBarrier相同,但有两个区别:

所考虑的区域变窄,因此只有在对帧缓冲区较小区域调用的先前片段着色器的读/写操作才能在随后的后续片段着色器的读/写操作之前完成/反映。该区域的大小取决于实现方式,并且可以小到一个帧缓冲像素。

此障碍仅适用于可由片段着色器读取或写入的内存事务。因此,仅支持屏障位GL_ATOMIC_COUNTER_BARRIER_BIT,GL_FRAMEBUFFER_BARRIER_BIT,GL_SHADER_IMAGE_ACCESS_BARRIER_BIT,GL_SHADER_STORAGE_BARRIER_BIT,GL_TEXTURE_FETCH_BARRIER_BIT或GL_UNIFORM_BARRIER。

当障碍为GL_ALL_BARRIER_BITS时,着色器内存访问将相对于上面刚刚描述的所有操作(而不是glMemoryBarrier描述的更广泛的操作)进行同步。这意味着在glMemoryBarrierByRegion命令之后,对散布/聚集式算法的读/写可能会或可能不会完成/反映。但是,对于延迟着色之类的用途,可以构造一个可见表面的链接列表,其头部位于帧缓冲区地址,并且整个列表仅取决于该帧缓冲区地址上的先前执行情况,glMemoryBarrierByRegion可能会大大提高效率比glMemoryBarrier。
错误
如果障碍包含任何不受支持的位,或者不是特殊值GL_ALL_BARRIER_BITS,则生成GL_INVALID_VALUE。

API 支持版本

函数名 2.0 3.0 3.1 3.2
glMemoryBarrier - -
glMemoryBarrierByRegion - -

另见

glBindImageTexture, glBufferData, glMapBufferRange, glFlushMappedBufferRange

版权

Copyright © 2011-2015 Khronos Group. This material may be distributed subject to the terms and conditions set forth in the Open Publication License, v 1.0, 8 June 1999. http://opencontent.org/openpub/.

GLES3.0中文API-glMemoryBarrier相关推荐

  1. GLES3.0中文API-glGetActiveUniform详解

    前言 glGetActiveUniform()函数看了官方的解释,也看了别人的一些帖子,但是基本上都没有实际的代码,没有实操总觉得隔了一层,雾里看花理解不了.下面亲自写段代码验证下这个函数. 官方文档 ...

  2. GLES3.0中文API-glViewport

    名称 glViewport- 设置视口 C规范 void glViewport(GLint x,GLint y,GLsizei width,GLsizei height); 参数 x, y 指定视口矩 ...

  3. Android 中文API (94) —— MediaController

    前言 本章内容是android.widget.MediaController,版本为Android 2.3 r1,翻译来自"唐明",再次感谢"唐明" !期待你一 ...

  4. Android 中文API (92) —— MenuInflater

    前言 本章内容是android.view.MenuInflater,版本为Android 2.3 r1,翻译来自"獨鍆躌踄",欢迎大家访问他的博客:http://www.cnblo ...

  5. Android 中文API (70) —— BluetoothDevice[蓝牙]

    前言 本章内容是 android.bluetooth.BluetoothDevice,为Android蓝牙部分的章节翻译.蓝牙设备类,代表了蓝牙通讯国足中的远端设备.版本为 Android 2.3 r ...

  6. jQuery验证控件jquery.validate.js使用说明+中文API

    官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...

  7. android 中文 API (41) —— RatingBar.OnRatingBarChangeListener

    前言 本章内容是 android.widget.RatingBar.OnRatingBarChangeListener,版本为Android 2.2 r1,翻译来自madgoat,欢迎大家访问他的博客 ...

  8. Android 中文API (91) —— GestureDetector

    前言 本章内容是android.view.GestureDetector,版本为Android 2.3 r1,翻译来自"Haiya 胡蝶",再次感谢"Haiya 胡蝶&q ...

  9. Android 中文 API (93) —— BaseExpandableListAdapter

    前言 本章内容是android.widget.BaseExpandableListAdapter,版本为Android 2.3 r1,翻译来自"天涯明月刀",欢迎大家访问他的博客: ...

  10. Android中文API(130) —— Html

    结构 继承关系 public class Html extends Object java.lang.Object android.text.Html 类概述 该类主要用来格式化html格式的文本,像 ...

最新文章

  1. matlab subs
  2. 高性能网站建设的14个原则
  3. android服务的说法错误的是,下面关于Android开发描述有误的一项是()。
  4. mysql cpu 内存占用_MySQL占用内存与CPU过高测试与解决办法
  5. 删除github上某个release/tag
  6. python简单爬虫手机号_python手机号前7位归属地爬虫代码实例
  7. 什么是 SAP Spartacus UI 的 feature level
  8. php addall,thinkphp addall() 方法设置
  9. 计算机原理与编程设计,最优化计算机原理与算法程序设计
  10. 从vSphere 5.5升级到6之2-升级vCenter Server 5.5到6.0
  11. 易筋SpringBoot 2.1 | 第十三篇:SpringBoot综合应用多个DataSoure
  12. WIN10杜比音效驱动安装[蓝奏云]
  13. 计算机安全权限不足或配置文件损坏,Windows XP用户配置文件丢失或损坏后的恢复方法...
  14. InfiniBand -- 无限带宽技术(简称IB) 基于 Ubuntu 16.04 安装 IB 驱动
  15. xtu 1369 Black White Chess
  16. ADC的计算策略.针对ADC值经常跳变的电路获取正确结果
  17. Total Phase Data Center介绍
  18. 关于macbookpro 外接显示器帧率问题
  19. 电脑:键盘快捷键的更改(主要以dell笔记本电脑为模拟对象)
  20. linux 批量ping检测

热门文章

  1. 三种迷宫算法(深度优先、随机Prim、递归分割)
  2. 极客网址导航-能访问谷歌的网址导航
  3. 西门子、施耐德、罗克韦尔等巨头告诉你,为何你大爷始终是你大爷
  4. PERT公式(附详细计算法)
  5. 计算机软件质测试标准,软件产品质量要求和测试细则 ——GB/T 25000.51—2016标准实施指南...
  6. java基于ssm的企业职工工资管理系统
  7. C++实现堆排序算法
  8. 集成运算放大器的应用——放大、加减、跟随、(滞回)比较器、阻抗匹配
  9. 普天视PTS-3130C 模拟网络AHD监控 三维云台键盘 PELCO解析程序
  10. 中国人的大师之路--《像外行一样思考,像专家一样实践》读后感