Vulkan PhysicalDevice
Vulkan
物理设备 (PhysicalDevice
) 一般是指支持 Vulkan
的物理硬件,通常是系统的一部分-- 显卡、加速器、数字信号处理器或者其他的组件。
系统里有固定数量的物理设备,每个物理设备都有自己的一组固定的功能
在 Vulkan
编程中,我们通常需要枚举出所有的物理设备,并且找到我们需要的那个:
枚举物理设备
使用 vkEnumeratePhysicalDevices
枚举出所有的物理设备:
VkResult vkEnumeratePhysicalDevices(
VkInstance instance,
uint32_t* pPhysicalDeviceCount,
VkPhysicalDevice* pPhysicalDevices);
instance
是之前使用vkCreateInstance
创建的VkInstance handle
pPhysicalDeviceCount
是用于指定或获取的物理设备数量,通过这个值返回物理设备的数量pPhysicalDevices
要么是nullptr
要么是数量不小于pPhysicalDeviceCount
的VkPhysicalDevice
数组,通过这个值返回物理设备的属性
需要注意的是,如果pPhysicalDeviceCount
中指定的数量小于系统中的物理设备数量,则 pPhysicalDevices
中写入的物理设备不是所有,vkEnumeratePhysicalDevices
只会写入传入的 pPhysicalDeviceCount
个物理设备属性到 pPhysicalDevices
并返回 VkResult::VK_INCOMPLET
如果所有物理设备成功写入,则会返回 VkResult::VK_SUCCESS
获取物理设备属性
使用 vkGetPhysicalDeviceProperties
函数获取物理设备信息
获取到的 PhysicalDeviceProperties
的含义如下:
typedef struct VkPhysicalDeviceProperties {
uint32_t apiVersion;
uint32_t driverVersion;
uint32_t vendorID;
uint32_t deviceID;
VkPhysicalDeviceType deviceType;
char deviceName[VK_MAX_PHYSICAL_DEVICE_NAME_SIZE];
uint8_t pipelineCacheUUID[VK_UUID_SIZE];
VkPhysicalDeviceLimits limits;
VkPhysicalDeviceSparseProperties sparseProperties;
} VkPhysicalDeviceProperties;
apiVersion
该设备驱动支持的 Vulkan 版本driverVersion
该设备驱动版本vendorID
设备供应商的 IDdeviceID
设备的 IDdeviceType
设备类型deviceName
设备名称pipelineCacheUUID
设备的通用唯一识别码( universally unique identifier )limits
设备的限制信息sparseProperties
稀疏数据属性
其中的 deviceType 设备类型是下面的几种之一:
typedef enum VkPhysicalDeviceType {
VK_PHYSICAL_DEVICE_TYPE_OTHER = 0,
// 集成显卡
VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU = 1,
// 独立显卡
VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU = 2,
// 虚拟环境中虚拟显卡
VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU = 3,
// 中央处理器
VK_PHYSICAL_DEVICE_TYPE_CPU = 4,