Skip to content

Latest commit

 

History

History
80 lines (52 loc) · 5.87 KB

spirv_extensions.adoc

File metadata and controls

80 lines (52 loc) · 5.87 KB

SPIR-V 拡張機能の使い方

SPIR-VvkCreateShaderModule 時に使用されるシェーダ表現です。Vulkan と同様に、SPIR-V にも拡張機能機能システムがあります。

SPIR-V は中間言語であり、API ではないことを忘れてはいけません。SPIR-V は、実行時にアプリケーションで利用できる機能を公開するために、Vulkan のような API に依存しているのです。本章では、SPIR-V クライアント API である Vulkan が、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. SPIR-V の拡張機能と機能が Vulkan で利用可能であることを確認します。

  2. 必要な Vulkan の拡張機能、機能、バージョンがサポートされているか確認します。

  3. 必要な場合、Vulkan 拡張機能と機能を有効にします。

  4. 必要な場合、使用する高レベルシェーディング言語(例:GLSL または HLSL)に一致する拡張機能があるかどうかを確認します。

各ステップをより詳細に説明します。

SPIR-V 機能がサポートされているか確認する

シェーダの機能によっては、OpExtension または OpCapability だけが必要な場合があります。この例では、UniformAndStorageBuffer8BitAccessSPV_KHR_8bit_storage 拡張機能に含まれます。

SPIR-V 拡張機能がサポートされているかどうかを確認するには、Vulkan Spec の対応している SPIR-V 拡張機能表をご覧ください。

spirv_extensions_8bit_extension

また、Vulkan Spec の対応している SPIR-V 機能表もご覧ください。

spirv_extensions_8bit_capability
Note

表には VkPhysicalDeviceVulkan12Features::uniformAndStorageBuffer8BitAccess と書いてありますが、ここでは VkPhysicalDevice8BitStorageFeatures::uniformAndStorageBuffer8BitAccess がエイリアスであると考えることができます。

幸いなことに、もし確認を忘れたとしても、Vulkan Validation Layers には自動生成された検証が用意されています。Validation Layers も Vulkan Spec 表も、すべて ./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 拡張機能が含まれています。

glslangSPIRV-Tools などのツールは、一致する OpExtensionOpCapability が使用されていることを確認します。