この例では、 VK_KHR_8bit_storage と SPV_KHR_8bit_storage を使用して、UniformAndStorageBuffer8BitAccess
機能を公開します。SPIR-V を逆アセンブルすると、以下のようになります。
OpCapability Shader
OpCapability UniformAndStorageBuffer8BitAccess
OpExtension "SPV_KHR_8bit_storage"
-
SPIR-V の拡張機能と機能が Vulkan で利用可能であることを確認します。
-
必要な Vulkan の拡張機能、機能、バージョンがサポートされているか確認します。
-
必要な場合、Vulkan 拡張機能と機能を有効にします。
-
必要な場合、使用する高レベルシェーディング言語(例:GLSL または HLSL)に一致する拡張機能があるかどうかを確認します。
各ステップをより詳細に説明します。
シェーダの機能によっては、OpExtension
または OpCapability
だけが必要な場合があります。この例では、UniformAndStorageBuffer8BitAccess
は SPV_KHR_8bit_storage 拡張機能に含まれます。
SPIR-V 拡張機能がサポートされているかどうかを確認するには、Vulkan Spec の対応している SPIR-V 拡張機能表をご覧ください。
また、Vulkan Spec の対応している SPIR-V 機能表もご覧ください。
Note
|
表には |
幸いなことに、もし確認を忘れたとしても、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
拡張機能が含まれています。
glslang
や SPIRV-Tools
などのツールは、一致する OpExtension
と OpCapability
が使用されていることを確認します。