当前位置: 首页 > news >正文

Using Vulkan -- Querying Properties, Extensions, Features, Limits, and Formats --Enabling Extensions

本节讲解启用 extensions 的具体流程。

Two types of extensions

Extensions 分为两大类:instance extensionsdevice extensions。简单来说,instance extensions 与整个VkInstance绑定,而 device extensions 只与单个VkDevice对象绑定。

这些信息在每个 extension 参考页面的Extension Type部分都有说明。示例如下:

Check for support

应用可以先查询 physical device,通过vkEnumerateInstanceExtensionPropertiesvkEnumerateDeviceExtensionProperties检查 extension 是否受支持。

// Simple example uint32_t count = 0; vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &count, nullptr); std::vector<VkExtensionProperties> extensions(count); vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &count, extensions.data()); // Checking for support of VK_KHR_bind_memory2 for (uint32_t i = 0; i < count; i++) { if (strcmp(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME, extensions[i].extensionName) == 0) { break; // VK_KHR_bind_memory2 is supported } }

Enable the Extension

即使实现支持某个 extension,如果没有在创建VkInstanceVkDevice时启用它,直接使用该 extension 的功能会导致undefined behavior

下面是启用VK_KHR_driver_properties这类 extension 的示例。

// VK_KHR_get_physical_device_properties2 is required to use VK_KHR_driver_properties // since it's an instance extension it needs to be enabled before at VkInstance creation time std::vector<const char*> instance_extensions; instance_extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); VkInstanceCreateInfo instance_create_info = {}; instance_create_info.enabledExtensionCount = static_cast<uint32_t>(instance_extensions.size()); instance_create_info.ppEnabledExtensionNames = instance_extensions.data(); vkCreateInstance(&instance_create_info, nullptr, &myInstance); // ... std::vector<const char*> device_extensions; device_extensions.push_back(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME); VkDeviceCreateInfo device_create_info = {}; device_create_info.enabledExtensionCount = static_cast<uint32_t>(device_extensions.size()); device_create_info.ppEnabledExtensionNames = device_extensions.data(); vkCreateDevice(physicalDevice, &device_create_info, nullptr, &myDevice);

Check for feature bits

需要注意:extensions 只是向 Vulkan 规范添加了功能的存在性,但这并不意味着支持 extension 就等于支持该 extension 的所有 feature bits。

例如VK_KHR_8bit_storage就在VkPhysicalDevice8BitStorageFeatures中暴露了 3 个特性。

typedef struct VkPhysicalDevice8BitStorageFeatures { VkStructureType sType; void* pNext; VkBool32 storageBuffer8BitAccess; VkBool32 uniformAndStorageBuffer8BitAccess; VkBool32 storagePushConstant8; } VkPhysicalDevice8BitStorageFeatures;

这意味着启用 extension 之后,应用仍然需要查询并启用来自该 extension 的所需特性。

Promotion Process

当 Vulkan 发布次版本时,规范中会将某些 extensionspromoted(晋升为核心功能)。晋升的目的是把 Vulkan 工作组认定为已被广泛支持的扩展功能纳入 Vulkan core 规范。更多关于 Vulkan 版本的信息见 version chapter。

例如VK_KHR_get_physical_device_properties2被大多数其他 extension 依赖。在 Vulkan 1.0 中,应用必须先查询它是否受支持,才能调用vkGetPhysicalDeviceFeatures2KHR。从 Vulkan 1.1 开始,vkGetPhysicalDeviceFeatures2函数被保证受支持。

再以VK_KHR_8bit_storage为例:从 Vulkan 1.0 开始,某些特性(如textureCompressionASTC_LDR)并非必须支持,但可以直接查询而无需启用任何 extension。当VK_KHR_8bit_storage在 Vulkan 1.2 晋升为 core 后,VkPhysicalDevice8BitStorageFeatures中的所有特性现在都可以在VkPhysicalDeviceVulkan12Features中找到。

Promotion Change of Behavior

需要注意:某些被晋升的 extension 在行为上会有细微差别。规范描述了晋升可能带来的微小变化,例如 extension 的 “Feature advertisement/enablement”。最典型的例子就是VK_KHR_8bit_storage

Vulkan 规范对 Vulkan 1.2 中的VK_KHR_8bit_storage变更说明如下:

如果VK_KHR_8bit_storageextension 不受支持,那么 shader module 中对 SPIR-VStorageBuffer8BitAccesscapability 的支持是可选的。

这里的 “不受支持” 指:某个实现可能支持 Vulkan 1.2+,但应用调用vkEnumerateDeviceExtensionProperties时,结果中可能不包含VK_KHR_8bit_storage

  • 如果vkEnumerateDeviceExtensionProperties中能找到VK_KHR_8bit_storage,则storageBuffer8BitAccess特性一定受支持
  • 如果vkEnumerateDeviceExtensionProperties找不到VK_KHR_8bit_storage,则storageBuffer8BitAccess特性可能受支持,需要通过查询VkPhysicalDeviceVulkan12Features::storageBuffer8BitAccess来确认。

所有被晋升 extensions 的特性变更列表可以在规范的 version appendix 中找到。

http://www.jsqmd.com/news/475987/

相关文章:

  • 北京联工密封科技有限公司电话查询:企业官方联系渠道指南 - 品牌推荐
  • 2019-2025年 我国区县逐年新房房价数据(Excel/Shp格式)
  • sqlloader
  • 《ShardingSphere解读》02 项目:什么是ShardingSphere ?
  • 2026年3月13日人工智能早间新闻
  • 微信 AI 入口网关设计思路优化
  • 高中数学必修一
  • 芯魂共生·智联无界:基于华为海思与鸿蒙生态的CAT.1模组全域赋能计划
  • 京沪深杭宁锡六城实测:2026高端腕表维修白皮书(卡地亚/积家/万国篇) - 时光修表匠
  • 贵港电梯广告哪个更值得选择
  • OKR2
  • 五:数据目录深度解析,每个文件都在做什么
  • 全国省份点位数据(shp格式\excel格式)2025年
  • 实战案例六:Claude Code + Git 技能自动化 PR 工作流
  • 梦行云软件——收银系统单店版 适用于:便利店,超市,水果店,干果零配食店等各类门店,可对接主流硬件设备:如条码枪,热敏打印机,电子称等。另可加购线上商城,小程序,APP
  • 书单号视频搬运软件推荐8款(2026实测版)
  • Java SE EE ME概述
  • 空间 - 通道协同注意力模块
  • 网络安全学习路线:2026年最新技术趋势与系统化成长路径
  • HE染色完全指南:从实验原理到结果判读
  • 告别“记忆黑洞”:OpenClaw + 星链4SAPI,为国产大模型打造低成本“第二大脑”
  • 嵌入式人工智能(嵌入式AI)无人机案例
  • 2026最稳的AI短剧项目:可贴牌、可独立部署、可商用的 AI 短剧创作系统,打造属于你的“纳米级”漫剧工厂
  • 程序员转行|一文读懂AI赋能:从技术到实战,附大模型系统学习路径
  • 06|AI 参与开发的安全底线:别把密钥和隐私喂进去
  • 香港科技大学广州线上专场——智能制造理学硕士学位项目26Fall招生宣讲会
  • 智慧教育+虚拟仿真:解锁煤矿专业实训新范式
  • 小型机构选系统必看:从500元到2万,这6个档位怎么选才不亏
  • Matlab实现基于CNN - LSTM - SE注意力机制的数据分类预测
  • 在深圳宝安实验室做落球冲击试验