Vulkan --vulkan in powervr

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 

posted on 2019-03-06 10:50  minggoddess  阅读(612)  评论(0编辑  收藏  举报