Note
|
これらは非公式に「クリーンアップ拡張機能」と呼ばれている拡張機能です。Vulkan Guide では、ちょっとした機能を追加するだけのものや、目的が非常にシンプルで分かりやすい拡張であるという性質から、クリーンアップ拡張と定義されています。 |
Note
|
Vulkan 1.2でコアに昇格 |
この拡張機能は、各実装に関するクエリに、より多くの情報を追加します。VkDriverId は、その実装の登録ベンダーの ID になります。VkConformanceVersion は、実装が合格した Vulkan Conformance Test Suite のバージョンを表示します。
Note
|
Vulkan 1.2でコアに昇格 |
この拡張機能により、アプリケーションはホストから vkCmdResetQueryPool
をサブミットするロジックをセットアップする代わりに、vkResetQueryPool
を呼び出すことができます。
Note
|
Vulkan 1.2でコアに昇格 |
この拡張機能は、深度/ステンシルフォーマットを使用するアプリケーションが、深度とステンシルのそれぞれに対して個別に画像変換を行えるようにします。Vulkan 1.2以降、この機能はすべての実装に必要です。
Note
|
Vulkan 1.2でコアに昇格 |
深度とステンシルの両方の使用法を表現するフォーマットがありますが、それらの異なる使用法をリストアップする方法はありませんでした。VkImageStencilUsageCreateInfo
では、アプリケーションがイメージのステンシルの使用法について、別の VkImageUsageFlags
を渡すことができるようになりました。深度の使用法は、VkImageCreateInfo::usage
に渡された元の使用法であり、VkImageStencilUsageCreateInfo
を使用しなくても、ステンシルの使用法は同様に同じになります。
VK_KHR_image_format_list 拡張機能を使用する場合が良い使用例です。これは、アプリケーションが作成時にその VkImage
の可能なイメージビューをより明示的に記述する方法を提供します。これにより、いくつかの実装では、設定された使用法に応じて実装に依存した最適化を行うことができます。
Note
|
Vulkan 1.1でコアに昇格 |
通常、アプリケーションは VkDeviceMemory
に大きなチャンクを割り当て、その後、さまざまなバッファやイメージにサブアロケートします。しかし、VkImage
や VkBuffer
に専用の割り当てがあった方が良い場合もあるでしょう。アプリケーションは VkMemoryDedicatedRequirements
を vkGetBufferMemoryRequirements2
や vkGetImageMemoryRequirements2
に渡すことで、専用の割り当てが望ましいか必要かを知ることができます。外部メモリを扱う場合、しばしば専用の割り当てが必要になります。
Note
|
Vulkan 1.2でコアに昇格 |
デフォルトでは、線形フィルタリングを使用する Vulkan サンプラは、提供されたテクスチャ座標の近傍にあるテクセルのコレクションの加重平均を計算することによって生成されたフィルタリングされたテクセル値を返します。この拡張機能は、アプリケーションが、通常は平均化されるテクセルのコンポーネント単位の最小値(VK_SAMPLER_REDUCTION_MODE_MIN
)または最大値(VK_SAMPLER_REDUCTION_MODE_MAX
)を計算することによって、フィルタリングされたテクセル値を生成できるようにする、新しいサンプラパラメータを提供します。これは GL_EXT_texture_filter_minmax に似ています。
Note
|
Vulkan 1.2でコアに昇格 |
この拡張機能では、新しいサンプラアドレスモード(VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE
)が追加されています。このモードでは、元の画像の2倍の大きさのテクスチャマップを効果的に使用し、新しい画像の追加の半分は元の画像の鏡像となります。この新しいモードでは、元の画像を使って一致する「鏡像」を生成することで、反対側のエッジが一致する画像を生成する必要性が緩和されます。このモードでは、テクスチャを負の s
、t
、r
方向に一度だけミラーリングすることができます。
Note
|
Vulkan 1.3でコアに昇格 |
これらの拡張機能は、もともと仕様になかった新しい VkFormat
を追加します。
Note
|
Vulkan 1.3でコアに昇格 |
この拡張機能は、新しい VkFormatFeatureFlagBits2KHR
64ビットのフォーマット機能フラグタイプを追加して、31フラグに制限されている既存の VkFormatFeatureFlagBits
を拡張します。
この拡張機能は、検証レイヤに VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16
の例外を追加して、フォーマットにレンダリングできるようにします。
メンテナンス拡張機能は、オリジナルの Vulkan 1.0リリース時には意図的に省かれていた、または見落とされていたマイナーな機能をまとめて追加するものです。
現在、6つのメンテナンス拡張機能があり、最初の3つは Vulkan 1.1にコアとしてバンドルされています。各拡張機能の詳細は、拡張機能の付録ページに記載されています。
-
VK_KHR_maintenance1 - Vulkan 1.1コア
-
VK_KHR_maintenance2 - Vulkan 1.1コア
-
VK_KHR_maintenance3 - Vulkan 1.1コア
-
VK_KHR_maintenance4 - Vulkan 1.3コア
-
VK_KHR_maintenance5 - Vulkan 1.4コア
-
VK_KHR_maintenance6 - Vulkan 1.4コア
オリジナルの Vulkan 1.0仕様に含まれるいくつかの構造体は、sType
/pNext
が欠けているため、適切な拡張ができないことに Vulkan のワーキンググループが気付きました。
バージョン間の後方互換性を維持することは非常に重要であるため、最善の解決策は、ミスを修正するための拡張機能を作成することでした。これらの拡張機能は主に新しい構造体ですが、新しい構造体を利用するために新しい関数のエントリポイントも作成する必要があります。
現在、このカテゴリーに当てはまる拡張子のリストは以下の通りです。
-
VK_KHR_get_memory_requirements2
-
Vulkan 1.1でコアに追加されました
-
-
VK_KHR_get_physical_device_properties2
-
Vulkan 1.1でコアに追加されました
-
-
VK_KHR_bind_memory2
-
Vulkan 1.1でコアに追加されました
-
-
VK_KHR_create_renderpass2
-
Vulkan 1.2でコアに追加されました
-
-
VK_KHR_copy_commands2
-
Vulkan 1.3でコアに追加されました
-
これらはいずれも非常にシンプルな拡張機能で、それぞれのバージョンでコアに昇格したことで、対応のクエリをしなくても簡単に使えるようになりました。
Note
|
|
標準の vkBindImageMemory
を使用する代わりに、VK_KHR_bind_memory2
を例として使用します。
// VkImage images[3]
// VkDeviceMemory memories[2];
vkBindImageMemory(myDevice, images[0], memories[0], 0);
vkBindImageMemory(myDevice, images[1], memories[0], 64);
vkBindImageMemory(myDevice, images[2], memories[1], 0);
一括して行えるようになりました。
// VkImage images[3];
// VkDeviceMemory memories[2];
VkBindImageMemoryInfo infos[3];
infos[0] = {VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, NULL, images[0], memories[0], 0};
infos[1] = {VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, NULL, images[1], memories[0], 64};
infos[2] = {VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, NULL, images[2], memories[1], 0};
vkBindImageMemory2(myDevice, 3, infos);
VK_KHR_sampler_ycbcr_conversion
のようないくつかの拡張機能では,pNext
に渡すことができる構造体を公開しています.
VkBindImagePlaneMemoryInfo plane_info[2];
plane_info[0] = {VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO, NULL, VK_IMAGE_ASPECT_PLANE_0_BIT};
plane_info[1] = {VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO, NULL, VK_IMAGE_ASPECT_PLANE_1_BIT};
// vkBindImageMemory() で欠落した pNext に他の拡張機能の構造体を渡せるようになりました。
VkBindImageMemoryInfo infos[2];
infos[0] = {VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, &plane_info[0], image, memories[0], 0};
infos[1] = {VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO, &plane_info[1], image, memories[1], 0};
vkBindImageMemory2(myDevice, 2, infos);
アプリケーションが上記の拡張機能に依存した拡張機能のいずれかを使用する必要がない限り、通常はオリジナルの関数/構造体を使用しても問題ありません。
このような場合、次のように対処することができます。
void HandleVkBindImageMemoryInfo(const VkBindImageMemoryInfo* info) {
// ...
}
//
// ツール/実装へのエントリーポイント
//
void vkBindImageMemory(VkDevice device,
VkImage image,
VkDeviceMemory memory,
VkDeviceSize memoryOffset)
{
VkBindImageMemoryInfo info;
// 元の呼び出しは pNext や sType を持たない
info.sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
info.pNext = nullptr;
// 構造体の残りの部分は同じにする
info.image = image;
info.memory = memory;
info.memoryOffset = memoryOffset;
HandleVkBindImageMemoryInfo(&info);
}
void vkBindImageMemory2(VkDevice device,
uint32_t bindInfoCount,
const VkBindImageMemoryInfo* pBindInfos)
{
for (uint32_t i = 0; i < bindInfoCount; i++) {
HandleVkBindImageMemoryInfo(pBindInfos[i]);
}
}