Vulkan® A Specification::Chapter 4::Devices and Queues(设备和队列)

原文链接: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,用来提示不是所有的物理设备都返回了。

有效参数(隐示)


  • instance必须是有效的VkInstance句柄
  • pPhysicalDeviceCount必须是有效的uint32_t类型指针
  • 如果pPhysicalDeviceCount不是0并且pPhysicalDevices不是空的话。
  • pPhysicalDevices必须指向有效的长度为pPhysicalDeviceCount的VKPhysicalDevice类型的数组

返回值


成功

  • VK_SUCCESS
  • VK_INCOMPLETE

失败

  • VK_ERROR_OUT_OF_HOST_MEMORY
  • VK_ERROR_OUT_OF_DEVICE_MEMORY
  • VK_ERROR_INITIALIZATION_FAILED

 

       在获取了物理设备句柄后可以通过调用vkGetPhysicalDeviceProperties函数获取设备通用属性。

void vkGetPhysicalDeviceProperties(
    VkPhysicalDevice                            physicalDevice,
    VkPhysicalDeviceProperties*                 pProperties
);
  • physicalDevice::之前查询获取的物理设备句柄
  • pProperties::返回的物理设备属性信息,VkPhysicalDeviceProperties类型指针。

有效参数(隐示)


  • physicalDevice必须是有效的VkPhysicalDevice句柄
  • 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中的结构体包括相应的属性和限制。

 

有效参数(隐示)


  • physicalDevice必须是有效的VkPhysicalDevice句柄
  • pProperties必须指向有效的VkPhysicalDeviceProperties2结构体对象。

 

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获取。

有效参数(隐示)


  • sType必须是VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2
  • 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

  • pNext链中的结构体必须唯一,不能重复

 

未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值