启用特性
特性分类
Vulkan 中的所有功能特性可分为 3 种
- 1.0 核心功能
- 这是从最初的 Vulkan1.0 版本就有的功能,功能列表可在 VkPhysicalDeviceFeatures 中找到
- 补充核心功能
- 从Vulkan 1.1+ 开始,Vulkan核心版本增加了一些新功能。为了保证
VkPhysicalDeviceFeatures
的向后兼容,创建了下面两个新结构来保存新特性。 - VkPhysicalDeviceVulkan11Features
- VkPhysicalDeviceVulkan12Features
- 从Vulkan 1.1+ 开始,Vulkan核心版本增加了一些新功能。为了保证
- 扩展功能
- 有一些扩展的功能,可以通过开关来启用其中的一部分,这些扩展特性被标记为
VkPhysicalDevice[ExtensionName]Features
- 有一些扩展的功能,可以通过开关来启用其中的一部分,这些扩展特性被标记为
如何启用这些特性
所有特性功能必须在创建VkDevice
时在 VkDeviceCreateInfo 结构中指定。
提示
不要忘记先使用vkGetPhysicalDeviceFeatures
或vkGetPhysicalDeviceFeatures2
查询支持的功能。
对于 Core 1.0 的特性功能,只需在VkDeviceCreateInfo::pEnabledFeatures
中开启所需功能:
VkPhysicalDeviceFeatures features = {};
vkGetPhysicalDeviceFeatures(physical_device, &features);
// Logic if feature is not supported
if (features.robustBufferAccess == VK_FALSE) {
}
VkDeviceCreateInfo info = {};
info.pEnabledFeatures = &features;
所有特性功能可以使用VkPhysicalDeviceFeatures2
传递给VkDeviceCreateInfo.pNext
:
VkPhysicalDeviceShaderDrawParametersFeatures ext_feature = {};
VkPhysicalDeviceFeatures2 physical_features2 = {};
physical_features2.pNext = &ext_feature;
vkGetPhysicalDeviceFeatures2(physical_device, &physical_features2);
// Logic if feature is not supported
if (ext_feature.shaderDrawParameters == VK_FALSE) {
}
VkDeviceCreateInfo info = {};
info.pNext = &physical_features2;
包括“补充核心扩展”:
VkPhysicalDeviceVulkan11Features features11 = {};
VkPhysicalDeviceFeatures2 physical_features2 = {};
physical_features2.pNext = &features11;
vkGetPhysicalDeviceFeatures2(physical_device, &physical_features2);
// Logic if feature is not supported
if (features11.shaderDrawParameters == VK_FALSE) {
}
VkDeviceCreateInfo info = {};
info.pNext = &physical_features2;