4.1同步对象和栅栏
使用方法是把同步对象插入gl命令流来实现,比glfinish更加灵活。
栅栏的本质是命令流中的一个标记,它在GPU的绘制或者状态变化命令过程中被发送,起始时是无信号的状态(unsigaled),在触发之后,变成有信号的状态(signaled)。
glFenceSync
当我们调用glFenceSync之后,会生成一个新的栅栏对象,并且在opengl命令流中插入这个栅栏。
栅栏一旦变成有信号的状态,那么命令流当中,栅栏之前的所有命令都已经执行完毕。
glDeleteSync
当我们完成等待一个同步对象时,或者不需要再等待它的状态变化时,应该删除这个同步对象。
4.1.1同步对象的等待
clientwaitsync
会强制客户端等待,直到服务端达到栅栏位置。
waitsync
用于服务端等待,与client不同的是,他用于阻塞GPU。
更多的是用于不同上下文之间的同步,比如,在一个上下文中使用transform feedback将数据写入缓存中,然后在另外一个环境中使用这些数据:
A线程通过绘制命令不断更新transform feedback 缓存的内容,然后通过调用fencesync启用栅栏。
B线程通过waitsync等待栅栏收到信号再继续执行绘制命令来读取数据。
4.1.2有信号
啥是有信号的状态?</