使用 SPIR-V 扩展

SPIR-V 是在 vkCreateShaderModule 时使用的着色器表示。就像 Vulkan 一样,SPIR-V 也有扩展和一个 能力系统

重要的是要记住,SPIR-V 是一种中间语言,而不是 API,它依赖于 API(例如 Vulkan)来公开应用程序在运行时可用的功能。本章旨在解释 Vulkan 作为 SPIR-V 客户端 API 如何与 SPIR-V 扩展和能力进行交互。

SPIR-V 扩展示例

在此示例中,将使用 VK_KHR_8bit_storageSPV_KHR_8bit_storage 来公开 UniformAndStorageBuffer8BitAccess 功能。以下是 SPIR-V 反汇编后的样子

OpCapability Shader
OpCapability UniformAndStorageBuffer8BitAccess
OpExtension  "SPV_KHR_8bit_storage"

使用 SPIR-V 功能的步骤

  1. 确保 Vulkan 中提供了 SPIR-V 扩展和功能。

  2. 检查是否支持所需的 Vulkan 扩展、特性或版本。

  3. 如果需要,启用 Vulkan 扩展和特性。

  4. 如果需要,查看是否存在正在使用的高级着色语言(例如 GLSL 或 HLSL)的匹配扩展。

更详细地分解每个步骤

检查是否支持 SPIR-V 功能

根据着色器功能,可能只需要一个 OpExtensionOpCapability。对于此示例,UniformAndStorageBuffer8BitAccessSPV_KHR_8bit_storage 扩展的一部分。

要检查是否支持 SPIR-V 扩展,请查看 Vulkan 规范中的 支持的 SPIR-V 扩展表

spirv_extensions_8bit_extension

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

spirv_extensions_8bit_capability

虽然表中说 VkPhysicalDeviceVulkan12Features::uniformAndStorageBuffer8BitAccess,但 VkPhysicalDevice8BitStorageFeatures::uniformAndStorageBuffer8BitAccess 是别名,在这里可以被认为是相同的。

幸运的是,如果您忘记检查,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::uniformAndStorageBuffer8BitAccessVkPhysicalDevice8BitStorageFeatures::uniformAndStorageBuffer8BitAccess 功能。

使用高级着色语言扩展

对于此示例,GLSL 有一个 GL_EXT_shader_16bit_storage 扩展,其中包含了匹配的 GL_EXT_shader_8bit_storage 扩展。

诸如 glslangSPIRV-Tools 之类的工具将处理以确保使用匹配的 OpExtensionOpCapability