• 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 

  • 相关阅读:
    带你看懂MySQL执行计划
    MySQL rename table方法大全
    MySQL慢日志全解析
    mybatis-通用mapper
    springboot-数据访问
    docker-1常用命令
    springboot-错误处理
    springboot-配置1
    react--temp
    了解react记录2-生命周期
  • 原文地址:https://www.cnblogs.com/minggoddess/p/10481890.html
Copyright © 2020-2023  润新知