GPU是高度并行的,
并行的读,并行的写,整个管线阶段也是并行执行的,
当对一个三角形着色时,在写到片元时,无法预测他们的顺序,所以图形管线实际上是一个一系列并行的阶段。
tiled gpu在光栅化时,每个tiled相互独立
一个tile的片元可能比之前进入的要更早着色(乱序)
vertex cache miss时,vertex shaders可能重复执行,但是但是。。在到了混合阶段,写入到frame buffer时可以保证顺序是按照vertex读入顺序的。。
Linear memory对于纹理并不高效。。
加入按照光栅顺序存储纹理,如果绘制三角形应用纹理,那么采样可能要跨多行。。每行读一点。以及读cache不友好。
如果按照8*8 tile 的存储那么无论是cache还是采样,换行更少。。
这就是每个gpu由自己的不同的做法,即iamge layout里的最优布局,这也就是为什么image layout是最优布局的转换无法保留之前的数据。。。
通过barrier可以变换iamge 的layout。
当两个subpass一个写入framebuffer,一个读时,要保证顺序,如果第二个pass等待第一个操作完所有framebuffer后显然是低效的(global access),只需要第二个pass等待对应的current pixel写入后就可以开始(local access)。。
例如vk里做延迟渲染,完全不用等到写入到内存里的g-buffer,在开始,可以在renderpass里配置好subpass之间的依赖,这样消耗更低,同时在移动端的tiler更高效。
pipeline barrier,在配置的点上执行完毕之前,都会阻塞之后的操作。
所以使用event,令其他独立的工作继续保持并行。。同时event在cpu端是可见的,可以在gpu端等待gpu的操作,注意的是视频里说:bear in mind if you make this the gpu wait for too long then everything will think in crashed and the whole system falls down,so don’t do that.
srcStageMask可以视为生产者,dstStageMask可以视为消耗者
多个barrier尽可能地batch。。