Vulkan Programming Guide 第一章(2)

物理设备内存

在许多情况下,Vulkan设备是与主主机处理器分离的硬件的物理部件,或者工作方式不同,以便以专门的方式访问存储器。 Vulkan中的设备内存指的是设备可访问的内存,可用作纹理和其他数据的后备存储。 内存分为多种类型,每种类型都有一组属性,例如主机和设备之间的缓存标志和一致性行为。 每种类型的存储器然后由设备的堆之一支持,其中可以有几个。
要查询堆的配置和设备支持的内存类型,请调用

void vkGetPhysicalDeviceMemoryProperties  (
VkPhysicalDevice physicalDevice, 
VkPhysicalDeviceMemoryProperties* pMemoryProperties );

生成的内存结构写入VkPhysicalDeviceMemoryProperties结构,其结构在pMemoryProperties中传递。 VkPhysicalDeviceMemoryProperties结构包含设备堆及其支持的内存类型的属性。 这个结构的定义是

typedef struct VkPhysicalDeviceMemoryProperties { 
uint32_t            memoryTypeCount;

VkMemoryType       memoryTypes[VK_MAX_MEMORY_TYPES]; 
uint32_t            memoryHeapCount; 
VkMemoryHeap        memoryHeaps[VK_MAX_MEMORY_HEAPS];
} VkPhysicalDeviceMemoryProperties;

内存类型的多少在memoryTypeCount字段中获取。 可能获取的内存类型的最大数目是VK_MAX_MEMORY_TYPES的值,其定义为32. memoryTypes数组包含描述每种内存类型的memoryTypeCount VkMemoryType结构。 VkMemoryType的定义是

typedef struct VkMemoryType { 
VkMemoryPropertyFlags   propertyFlags; 
uint32_t                heapIndex; 
} VkMemoryType;

这是一个只包含一组标志和内存类型的堆索引的简单结构。 flags字段描述了存储器的类型,并由VkMemoryPropertyFlagBits标志的组合构成。 标志的含义如下:
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT 表示内存是本地的(即物理连接到)设备。如果该位未设置,则可以假定存储器对于主机是本地的。
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT 表示使用的内存分配
此类型可以由主机映射和读取或写入。如果该位未被设置,则这种类型的存储器不能被主机直接访问,而是被设备独占使用。
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT 表示当此类型的内存由主机和设备同时访问时,这些访问将在两个客户端之间一致。如果未设置此位,则设备或主机可能不会看到每个执行的写入的结果,直到高速缓存被显式刷新。
VK_MEMORY_PROPERTY_HOST_CACHED_BIT 表示此类型的内存中的数据由主机缓存。对这种类型的存储器的读取访问通常比如果该位未被设置时的读取访问更快。然而,设备的访问可以具有略高的延迟,特别是如果存储器也是一致的。
VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT 表示使用此类型分配的内存不一定立即从关联的堆消耗空间,并且驱动程序可能推迟物理内存分配,直到内存对象用于回退资源。
每种内存类型都报告在VkMemoryType结构的heapIndex字段,并且可以得到该堆消耗空间的大小。 这是从调用vkGetPhysicalDeviceMemoryProperties()得到kPhysicalDeviceMemoryProperties结构中返回的memoryHeaps数组的索引。 memoryHeaps数组的每个元素描述了设备的一个内存堆。 这个结构的定义是

typedef struct VkMemoryHeap { 
VkDeviceSize            size; 
VkMemoryHeapFlags       flags; 
} VkMemoryHeap;
Vulkan是用于图形和计算设备的编程接口。 Vulkan设备通常由处理器和多个固定功能硬件块组成,以加速在图形和计算中使用的操作。设备中的处理器通常是一个非常宽的多线程处理器,因此Vulkan中的计算模型主要基于并行计算。 Vulkan设备还可以访问可能您的应用程序运行所在的主处理器共享或可能不共享的内存。 Vulkan也暴露了这个内存给你。 Vulkan是一个显式的API。也就是说,几乎一切都是你的责任。驱动程序是一个软件,它接收形成API的命令和数据,并将它们转换为硬件可以理解的东西。在较旧的API(如OpenGL)中,驱动程序将跟踪许多对象的状态,为您管理内存和同步,并在运行时检查应用程序中的错误。这对开发人员非常有用,但是一旦应用程序调试和运行正常,就会浪费宝贵的CPU时间。 Vulkan通过将几乎所有状态跟踪,同步和内存管理置于应用程序开发人员手中,并通过对必须启用的层委派正确性的检查来解决这个问题。他们在正常情况下不参您的申请的执行。 由于这些原因,Vulkan既非常冗长又有点脆弱。你需要做大量的工作,以获得Vulkan运行良好,不正确的使用API​​通常会导致图形损坏,甚至程序崩溃,在旧的API,你会收到一个有用的错误消息。作为交换,Vulkan提供对设备的更多控制,一个干净的线程模型,以及比它取代的API更高的性能。 此外,Vulkan被设计为不仅仅是一个图形API。它可以用于异构设备,如图形处理单元(GPU),数字信号处理器(DSP)和固定功能硬件。功能分为粗粒度,宽泛重叠的类别。当前版本的Vulkan定义了传输类别,用于复制数据;计算类别,用于在计算工作负载上运行着色器;和图形类别,其中包括光栅化,图元装配,混合,深度和模板测试,以及图形编程人员熟悉的其他功能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值