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那些的,如果用对了 则更为高效,至少它提供了这种机会
3. render 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-introducti...

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+Recommendati...
https://developer.apple.com/documentation/metal/setting_resource_storage...

metal memory

来源:https://www.cnblogs.com/minggoddess/p/10481890.html

最新文章