使用 SPIR-V 扩展
SPIR-V 是在 vkCreateShaderModule
时使用的着色器表示。就像 Vulkan 一样,SPIR-V 也有扩展和一个 能力系统。
重要的是要记住,SPIR-V 是一种中间语言,而不是 API,它依赖于 API(例如 Vulkan)来公开应用程序在运行时可用的功能。本章旨在解释 Vulkan 作为 SPIR-V 客户端 API 如何与 SPIR-V 扩展和能力进行交互。
SPIR-V 扩展示例
在此示例中,将使用 VK_KHR_8bit_storage 和 SPV_KHR_8bit_storage 来公开 UniformAndStorageBuffer8BitAccess
功能。以下是 SPIR-V 反汇编后的样子
OpCapability Shader
OpCapability UniformAndStorageBuffer8BitAccess
OpExtension "SPV_KHR_8bit_storage"
使用 SPIR-V 功能的步骤
-
确保 Vulkan 中提供了 SPIR-V 扩展和功能。
-
检查是否支持所需的 Vulkan 扩展、特性或版本。
-
如果需要,启用 Vulkan 扩展和特性。
-
如果需要,查看是否存在正在使用的高级着色语言(例如 GLSL 或 HLSL)的匹配扩展。
更详细地分解每个步骤
检查是否支持 SPIR-V 功能
根据着色器功能,可能只需要一个 OpExtension
或 OpCapability
。对于此示例,UniformAndStorageBuffer8BitAccess
是 SPV_KHR_8bit_storage 扩展的一部分。
要检查是否支持 SPIR-V 扩展,请查看 Vulkan 规范中的 支持的 SPIR-V 扩展表。

此外,请查看 Vulkan 规范中的 支持的 SPIR-V 能力表。

虽然表中说 |
幸运的是,如果您忘记检查,Vulkan 验证层会有一个 自动生成的验证。验证层和 Vulkan 规范表都基于 ./xml/vk.xml 文件。
<spirvcapability name="UniformAndStorageBuffer8BitAccess">
<enable struct="VkPhysicalDeviceVulkan12Features" feature="uniformAndStorageBuffer8BitAccess" requires="VK_VERSION_1_2,VK_KHR_8bit_storage"/>
</spirvcapability>
<spirvextension name="SPV_KHR_8bit_storage">
<enable version="VK_VERSION_1_2"/>
<enable extension="VK_KHR_8bit_storage"/>
</spirvextension>
检查支持,然后在需要时启用
在此示例中,需要 VK_KHR_8bit_storage
或 Vulkan 1.2 设备。
如果使用 Vulkan 1.0 或 1.1 设备,则需要在设备创建时 支持并启用 VK_KHR_8bit_storage
扩展。
无论使用 Vulkan 扩展还是版本,如果需要,应用程序仍然必须确保在设备创建时 支持并启用任何匹配的 Vulkan 功能。一些 SPIR-V 扩展和功能不需要 Vulkan 功能,但这都列在规范的表中。
对于此示例,必须支持并启用 VkPhysicalDeviceVulkan12Features::uniformAndStorageBuffer8BitAccess
或 VkPhysicalDevice8BitStorageFeatures::uniformAndStorageBuffer8BitAccess
功能。
使用高级着色语言扩展
对于此示例,GLSL 有一个 GL_EXT_shader_16bit_storage 扩展,其中包含了匹配的 GL_EXT_shader_8bit_storage
扩展。
诸如 glslang
和 SPIRV-Tools
之类的工具将处理以确保使用匹配的 OpExtension
和 OpCapability
。