出于这个问题的目的,我们会说vkMapMemory
这样的设备上的所有分配都不会失败;它们很容易被主机看到,结果是直接指向主机内存的其他区域(不需要做任何工作)。
有没有办法检测这种情况?
目的是基于竞技场的分配器,它积极地映射任何主机可见内存,目标是避免在这些硬件上进行冗余分配。
答案 0 :(得分:2)
是的,可以相对可靠地检测到它。
如果vkGetPhysicalDeviceMemoryProperties
只有一个内存堆(标记为VK_MEMORY_HEAP_DEVICE_LOCAL_BIT
),则可以确定它与主机的内存相同。
用作者的话来说:
https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#memory-device
在统一内存架构(UMA)系统中,通常只有一个内存堆被认为对主机和设备同样是“本地”的,并且这样的实现必须将堆通告为设备本地
在其他情况下,如果内存位于主机上(即dGPU上的给定内存堆不设置了VK_MEMORY_HEAP_DEVICE_LOCAL_BIT
),您就会非常了解
答案 1 :(得分:1)
尽管@krOoze描述的基于UMA的系统的实现没有理由不公开直接指向缓冲区数据的指针。
你的问题似乎是从错误的假设出发。
Vulkan 不是 OpenGL。一般来说,它并不试图隐藏你的东西。如果CPU无法直接访问内存堆,则Vulkan实现不会公开该主机可见的堆的内存类型。相反,如果CPU可以直接访问内存堆 ,那么Vulkan实现将公开该主机可见的堆的内存类型。
因此,如果您可以在Vulkan中映射的设备分配,那么您应该假设您有一个指向缓冲区数据的直接指针"。