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那些的,如果用对了 则更为高效,至少它提供了这种机会
3render passes 对应metal里render pass
4显式 render state声明,这样driver可以更早的知道整个管线的状态,就可以根据整个状态提前做一些事情,不用运行时做了(对shader的一些事情 根据管线状态对shader 进行配置优化这种)
==============================================
memory
三种格式
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-introduction-to-vulkan-part-5
powervr是uma 不是dma 即cpu gpu的memory在一起 所以上述不是很要紧
powervr上推荐 不要频繁调用vkAllocatieMemory 一次几十MB
pipeline
管线相关状态都封在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生成
descriptor set
管线上要绑一个descriptor set
set size一样可以放pool里用flag
Push constants
在 onchip上做 比较快
Queue
graphic,compute,present
cb
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
Render Pass
对应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
MSAA -VK_ATTACHMENT_STORE_OP_DONT_CARE
imagelayout
http://cdn.imgtec.com/sdk-documentation/PowerVR.Performance+Recommendations.pdf
https://developer.apple.com/documentation/metal/setting_resource_storage_modes/choosing_a_resource_storage_mode_in_ios_and_tvos?language=objc
metal memory