metal 和vulkan可以对比着看了 包括dx12它们都是 适合modern gpu archti 的api
metal有很多适合tbdr的
本文主要内容是PowerVR 的tiled renderer对vulkan的使用状况的理解和优化建议
跨平台
多线程 low cpu overhead
独立object orientated(device,cmd queue, cmd buffer,state, rescouce这些都是obj)
vulkan有利于tile based的地方
1. 显式依赖声明(旧的做法是 不声明然后让driver去猜 就是validate那步这样cpu开销很高),这种显示声明对tb还有个更重要的好处是driver可以直接把他们按照tiler包起来给硬件用
2. 合适粒度的同步 给application更多的同步控制权限,用barrier sephonore那些的,如果用对了 则更为高效,至少它提供了这种机会
3. render passes 对应metal里render pass
4. 显式 render state声明,这样driver可以更早的知道整个管线的状态,就可以根据整个状态提前做一些事情,不用运行时做了(对shader的一些事情 根据管线状态对shader 进行配置优化这种)
==============================================
<strong>memory</strong>
三种格式
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT ---初始化的时候创建一次 只给device用的 (没有cpu host访问 srv的texture似乎应该放这里 还有不改动的vb ib---device local memory
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT ---传数据到device用( staging buffer)申请的数据在cpu,cpu可以各种访问然后copy到 device upload heap到default heap (descriptor)给device --staging memory
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT --每帧更新的数据 ubo 有cpu 和device之间同步数据的选项可选 每帧更新的vb应该也是在这里了 ---immediate memory
这里有个staging buffer的概念 stage 分阶段的意思 cpu host访问之后 复制一次 给gpu device用 有些flag可以设置
https://vulkan-tutorial.com/Vertex_buffers/Staging_buffer
https://software.intel.com/en-us/articles/api-without-secrets-introduct…
PowerVR是uma 不是dma 即cpu gpu的memory在一起 所以上述不是很要紧
PowerVR上推荐 不要频繁调用vkAllocatieMemory 一次几十MB
<strong>pipeline</strong>
管线相关状态都封在pso里面 包括
primitive type
depth/stencil test
blending
which shader to use
vertex layout
multi-sampling
face culling
polygon winding
用descriptor定义 有了这个shader就可以根据input output来优化 在建立obj的时候validate而不用draw的时候由显卡来做 提升performance
barrier
barrier没什么开销 如果他没有引发wait。。。
最高效的状态是vs ps并行起来 所以要尽量去掉管线中的barrier和despency这样才能让前者更好的并行
smart sub-pass barrier 会改善 pipeline bubbles 用了barrier会减少bubbles 能更好的排布,只有在需要的时候才卡住 有资源了就进行下去,例子 subpass---frag stage wait vertex stage
数据安全方面例子 input 设置barrier给fragementshader
pipeline cache
开始时创建好,之后尽量用cache里面的pso 不需要warmup,vulkan做了优化创建时就会加到cache里面不需要load时
衍生pipeline可以通过parent生成
<strong>descriptor set</strong>
管线上要绑一个descriptor set
set size一样可以放pool里用flag
<strong>Push constants</strong>
在 onchip上做 比较快
<strong>Queue</strong>
graphic,compute,present
<strong>cb</strong>
primary cmd buffer可以提交到queue上second cmd只能提交到primary上面
cmd usage flags
VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT
如果cmd会被多次提交 driver在他提交完之后会保留这个cmd的一个副本,留着下次提交用,这个flag应该被开在secondary cmd上primary会每次重建,sec被加到prim上时 就会copy scond
VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
secondary cmd buffer 建立多个secondary cmd buffers给 multi thread 多线程组这个cmd组好了 enqueue 到primary cmd buffer
<strong>Render Pass</strong>
对应metal里render pass 切换rt有开销,所以建议用的renderpass 尽量少
framebuffer的理解 render pass 的destination 的memory的集合
有subpass subpass都在pixel local storeage 要确保只用当前像素
可以设置load store action和metal一样
还有个 transient attachments 是subpass间共同引用的资源,也在onchip mem上不会写到framebuffer
<strong>MSAA</strong> -VK_ATTACHMENT_STORE_OP_DONT_CARE
<strong>imagelayout</strong>
http://cdn.imgtec.com/sdk-documentation/PowerVR.Performance+Recommendat…
https://developer.apple.com/documentation/metal/setting_resource_storag…
metal memory