原文链接:https://vulkan.lunarg.com/doc/view/1.2.135.0/windows/chunked_spec/chap4.html#devsandqueues
更新记录:
2020/4/27 增加 4设备和队列,增加4.1 物理设备(翻译到获取额外信息处)
4 设备和队列
一旦Vulkan初始化完成,设备和队列将会成为应用与Vukan交互的主要对象。
Vulkan中分有物理设备(physical device)和逻辑设备(logical device)。一个物理设备就代表一个对于本地有效并完整的Vulkan实现(包括实例(instance)级别的函数),物理设备是有限的。逻辑设备是基于物理设备创建的,一个逻辑设备包括设备自身的状态和与其他逻辑设备的依赖。
物理设备使用VkPhysicalDevice句柄定义:
VK_DEFINE_HANDLE(VkPhysicalDevice)
4.1 物理设备
为了查找系统中的物理设备集,可通过调用vkEnumeratePhysicalDevices函数获取
VkResult vkEnumeratePhysicalDevices(
VkInstance instance,
uint32_t* pPhysicalDeviceCount,
VkPhysicalDevice* pPhysicalDevices
);
- Instance::Vulkan实例,之前通过vkCreateInstance创建的。
- pPhysicalDeviceCount::指向有关物理设备数量的整数,后面有具体说明
- pPhysicalDevices::如果不是空(nullptr)的话就需要是一个有效的VkPhysicalDevice数组指针。
如果pPhysicalDevices是空的话,则调用该函数会将可用的物理设备的个数写入pPhysicalDeviceCount参数中。否则会将pPhysicalDeviceCount个物理设备句柄写入pPhysicalDevices数组中。如果pPhysicalDeviceCount中的个数小于Vulkan支持的设备总数的话,Vulkan能写多少个就写多少个,并且返回VK_INCOMPLETE而不是VK_SUCCESS,用来提示不是所有的物理设备都返回了。
有效参数(隐示)
|
返回值成功
失败
|
在获取了物理设备句柄后可以通过调用vkGetPhysicalDeviceProperties函数获取设备通用属性。
void vkGetPhysicalDeviceProperties(
VkPhysicalDevice physicalDevice,
VkPhysicalDeviceProperties* pProperties
);
- physicalDevice::之前查询获取的物理设备句柄
- pProperties::返回的物理设备属性信息,VkPhysicalDeviceProperties类型指针。
有效参数(隐示)
|
VkPhysicalDeviceProperties结构体定义如下
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::供应商提供的驱动版本
- venderID::物理设备供应商的唯一识别号
- deviceID::物理设备供应商提供的设备ID
- deviceType::VkPhysicalDeviceType类型参数,表示设备类型
- deviceName::类型为char长度为VK_MAX_PHYSICAL_DEVICE_NAME_SIZE的以\0结尾的UTF-8字符数组,表示设备名称
- pipelineCacheUUID::类型为uint8_t长度为VK_UUID_SIZE的数组。表示设备的通用唯一标识符。
- limit::VkPhysicalDeviceLimits类型结构体参数。表示设备限制信息。
- sparseProperties:: VkPhysicalDeviceSparseProperties类型结构体参数,表示设备稀疏相关属性。
注::
VkPhysicalDeviceProperties中的apiVersion和vkEnumerateInstanceVersion函数返回的apiVersion可能不相同,在这种情况下禁止使用不支持的高版本。
vkEnumerateInstanceVersion返回的是VkInstance和其子对象相关的版本,VkPhysicalDevice和其子对象被排除在外。VkPhysicalDeviceProperties::apiVersion是与VkPhysicalDevice及其子对象相关的Vulkan版本。(可以理解成一个是系统上支持的Vulkan版本,一个是设备上内嵌的Vulkan版本,需要使用具有兼容性的版本号。)
提供的vendorID和deviceID用与应用查找其他Vulkan中没有提供的设备信息。这包括设备的性能概括,硬件勘误等等。
vendorID所代表的的供应商是VkPhysicalDevice实现者。
注::
例如独立显卡的是由GPU芯片供应商提供。例如Soc硬件集成加速器是由硅IP供应商提供。
如果供应商有PCI的ID号的话,venderID的低16位是PCI供应商ID号,剩下的位数必须为0否则返回的是Khronos供应商ID。Khronos供应商ID是从0x10000开始的,为了区分PCI供应商,Khronos供应商ID在VkVendorId中定义好了。
供应商同样需要负责返回deviceID的值,如果Vulkan是通过PCI的ID驱动PCI设备的话deivceID的低16位是 PCI设备ID号,剩下的位数必须是0。否则返回的值由操作系统或平台特性决定,这需要操作系统或平台提供识别号版本和任何关键配置(例如多核心设备的核心数)。
注::
固定版本的物理设备实现和配置需要使用相同的设备ID。例如所有硅IP版本和配置需要使用相同的设备ID,即使是使用不同的SoCs。(这一段不太清楚说的啥)
VkPhysicalDeviceProperties::vendorID可能返回的Khronos供应商ID如下:
typedef enum VkVendorId {
VK_VENDOR_ID_VIV = 0x10001,
VK_VENDOR_ID_VSI = 0x10002,
VK_VENDOR_ID_KAZAN = 0x10003,
VK_VENDOR_ID_CODEPLAY = 0x10004,
VK_VENDOR_ID_MAX_ENUM = 0x7FFFFFFF
} VkVendorId;
注::
Khronos供应商ID可以随时由供应商分配。只有最新版本的规范在vk.xml中有相应的API注册,并且相应的vulkan_core,h头文件也必然包括所有保留的Khronos供应商ID。
只有Khronos供应商ID提供了符号枚举表示,PCI供应商ID需要查看PCI-SIG数据库。
物理设备类型由VkPhysicalDeviceType表示
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,
VK_PHYSICAL_DEVICE_TYPE_MAX_ENUM = 0x7FFFFFFF
} VkPhysicalDeviceType;
- VK_PHYSICAL_DEVICE_TYPE_OTHER::当前未知类型
- VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU:: 集成设备(集显)
- VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU::独立显卡
- VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU::虚拟GPU
- VK_PHYSICAL_DEVICE_TYPE_CPU ::CPU
返回的设备类型仅仅用于参考不会直接影响系统的操作。设备类型可能与系统上的其他属性相关,比如设备的内存堆。
如果想要查询额外的物理设备信息,调用vkGetPhysicalDeviceProperties2函数和与其等价的vkGetPhysicalDeviceProperties2KHR函数来获取
void vkGetPhysicalDeviceProperties2(
VkPhysicalDevice physicalDevice,
VkPhysicalDeviceProperties2* pProperties
);
void vkGetPhysicalDeviceProperties2KHR(
VkPhysicalDevice physicalDevice,
VkPhysicalDeviceProperties2* pProperties
);
- physicalDevice::有效的物理设备句柄。
- pProperties:: VkPhysicalDeviceProperties2结构体类型的参数。表示物理属性信息。
每一个pProperties和pNext中的结构体包括相应的属性和限制。
有效参数(隐示)
|
VkPhysicalDeviceProperties2结构体定义如下
typedef struct VkPhysicalDeviceProperties2 {
VkStructureType sType;
void* pNext;
VkPhysicalDeviceProperties properties;
} VkPhysicalDeviceProperties2;
或者与其等价的
typedef VkPhysicalDeviceProperties2 VkPhysicalDeviceProperties2KHR;
- sType::表示该结构体的类型。必须是VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2
- pNext::空或者指向一个扩展结构体
- properties:: VkPhysicalDeviceProperties类型结构体参数,表示物理设备的属性。该结构体获取的值与调用vkGetPhysicalDeviceProperties函数获取的值相同。
额外的物理信息是通过pNext获取。
有效参数(隐示)
VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT, VkPhysicalDeviceConservativeRasterizationPropertiesEXT, VkPhysicalDeviceCooperativeMatrixPropertiesNV, VkPhysicalDeviceDepthStencilResolveProperties, VkPhysicalDeviceDescriptorIndexingProperties, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV, VkPhysicalDeviceDiscardRectanglePropertiesEXT, VkPhysicalDeviceDriverProperties, VkPhysicalDeviceExternalMemoryHostPropertiesEXT, VkPhysicalDeviceFloatControlsProperties, VkPhysicalDeviceFragmentDensityMapPropertiesEXT, VkPhysicalDeviceIDProperties, VkPhysicalDeviceInlineUniformBlockPropertiesEXT, VkPhysicalDeviceLineRasterizationPropertiesEXT, VkPhysicalDeviceMaintenance3Properties, VkPhysicalDeviceMeshShaderPropertiesNV, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, VkPhysicalDeviceMultiviewProperties, VkPhysicalDevicePCIBusInfoPropertiesEXT, VkPhysicalDevicePerformanceQueryPropertiesKHR, VkPhysicalDevicePointClippingProperties, VkPhysicalDeviceProtectedMemoryProperties, VkPhysicalDevicePushDescriptorPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesNV, VkPhysicalDeviceSampleLocationsPropertiesEXT, VkPhysicalDeviceSamplerFilterMinmaxProperties, VkPhysicalDeviceShaderCoreProperties2AMD, VkPhysicalDeviceShaderCorePropertiesAMD, VkPhysicalDeviceShaderSMBuiltinsPropertiesNV, VkPhysicalDeviceShadingRateImagePropertiesNV, VkPhysicalDeviceSubgroupProperties, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT, VkPhysicalDeviceTimelineSemaphoreProperties, VkPhysicalDeviceTransformFeedbackPropertiesEXT, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT, VkPhysicalDeviceVulkan11Properties, VkPhysicalDeviceVulkan12Properties
|
未完待续