memory management Vulkan
https://www.youtube.com/watch?v=rXSdDE7NWmA
vulkan/Bifrost
1. DEVICE_LOCAL_BIT | HOST_VISIBLE_BIT | HOST_COHERENT_BIT
2. DEVICE_LOCAL_BIT | HOST_VISIBLE_BIT | HOST_CACHED_BIT
3. DEVICE_LOCAL_BIT | HOST_VISIBLE_BIT | HOST_COHERENT_BIT | HOST_CACHED_BIT
4. DEVICE_LOCAL_BIT | LAZILY_ALLOCATED_BIT
vulkan/Midgard
1. DEVICE_LOCAL_BIT | HOST_VISIBLE_BIT | HOST_COHERENT_BIT
2. DEVICE_LOCAL_BIT | HOST_VISIBLE_BIT | HOST_CACHED_BIT
3. DEVICE_LOCAL_BIT | LAZILY_ALLOCATED_BIT
cache就是cpu cache了 cpu read 用
coherent看下来是cup gpu 同步 选了 硬件会保证它们一致 但是会费电。。。。选这个就不用我们手动copy来 copy去了吧
host就是cpu这边
device是gpu这边
coherent肯定就是cpu gpu都可见了
lazily是 给临时资源的 ontile的资源 不需要开framebuffer
resources:
Uniform Buffer,Dynamic VB CPU, GPU 都可见, 频繁write ---这种通常用nbuffe缓存(gl下 避免同步map 会卡住 避免invalidmap会复制 ghost,vulkan用coherent自动处理了)
Texture, IB,VB,Const Buffer CPU只写一次 CPU GPU可见----这种资源设置成write only 就不需要cache ,cpu不要读它
Framebuffer 仅GPU可见
CPU读的才要cache 这样的GPU资源很少吧。。。
1. not cached, coherent
write-only on CPU,为了不污染CPU cache,可以在cpu把小的合到一个大的buffer里给device
2.cached, incoherent
需要map出来给cpu read的资源 map出来用vkInvalidateMappedRanges
cpu 写完给gpu用时要调用 vkFlushMappedRanges
这两步操作都需要driver 维护cpu cahe 在main memory和cpu cache之间
这会是不少的开销
3.cached, coherent
此种类型仅Bifrost支持,并且需要cpu 和gpu的芯片组支持一致的协议,如果不支持会用2.cache,incoherent替代
如果不需要cpu read 就用coherent就可以了 不要用cached
4.lazily
短暂transient的gpu外不可访问的,仅在tile上的resource
看资料实在太不方便了 以后再看吧
用vulkan 做render to texture 的rt的 memory type 是啥
DEVICE_LOCAL_BIT最合适 但是mali没有可能要落到1
建议
不变的资源用1
cpu只读资源用1
用1的时候 write update的时候 用memcpy()顺着写
频繁update的buffer要map出来 比如uniform buffer , dynamic vb,map有cpu开销
cpu read要用cache
====
staging
大概是这样一种概念,cpu资源copy一份 gpu用copy的这份
知道两种用途 一种是dx9那时候 这种staging的资源 可以用于恢复device lost 的资源 再copy一次就可以了 感谢jin先生
另一种cpu写入一次的texture 资源 copy一份 给gpu bind srv,cpu就不再用这份资源了
一种类似资源uploading的概念
=======
https://www.khronos.org/assets/uploads/developers/library/2018-vulkan-devday/03-Memory.pdf
https://gpuopen.com/vulkan-device-memory/