Vulkan Descriptor

難しい。分からない。

Descriptor

Vulkan でのリソース単位。リソースバインドの単位。
Sampler, Texture, Uniform Buffer のようなものが1つの Descriptor として定義されている。

DescriptorPool

Descriptor を作る前に、最初に DescriptorPool を作成しておかないといけない。DescriptorPool を作成するためには、引数としてこれから作成する Descriptor の個数や種類をあらかじめ指定する必要がある。でないと Pool サイズが決まらないため。DescriptorSet は DescriptorPool から作成される。DescriptorPool には作成できる DescriptorSet の最大個数なども指定する。これも、確保する Pool サイズを決めるためだと思われる。Thread ごとに Pool を持つと効率的に Descriptor の割り当てが可能になる。

DescriptorSet

Descriptor をグループ化したもの。Descriptor は個々にバインドされずに、DescriptorSet に統合されて照される。DescriptorSet を作るためには、先に何の Descriptor が何個あるかを定義した DescriptorSetLayout を作る必要がある。DescriptorSetLayout のインストタンスとして DescriptorSet が作られるイメージ。DescriptorSet を作るときは、あらかじめ確保した DescriptorPool を使って作られるため、関数が vkCreate ではなく、vkAllocate という名前。描画時に vkCmdBindDescriptorSets() に対して使用する VkDescriptorSet を設定する。

DescriptorSetLayout

Descriptor の定義構造と DescriptorPool を関連づけるために必要?vkCreateDescriptorSetLayout() によって 新しい Descriptor Set Layout が作成される。 C 言語の構造体定義のようなもので、Descriptor の種類と数を決定する。この情報は、DescriptorSet を作る時に構造体として渡される。

DescriptorSetLayoutBinding

DescriptorSetLayout を作るための構造体。リソースのバインディング位置 (シェダーから参照する binding 値) や、Type、個数、どのシェーダーステージからアクセス可能かのフラグ指定などの項目を持っている。DescriptorSetLayout と PipelineLayout を作るために両方で使用される。PipelineLayout がなぜ、DescriptorSetLayoutBinding 情報が必要なのかは分からない。

WriteDescriptorSet

1つの DescriptorSet の中に 2つの Descriptor があれば、書き込むために WriteDescriptorSet write[2] で定義する。write の中に Descriptor の Buffer, Type, Count などを指定できる。

AllocateDescriptorSets

DescriptorPool から DescriptorSet の領域を確保する。

UpdateDescriptorSets

DescriptorSet を実際のバッファと関連づける。更新する場合は WriteDescriptorSet を使用する。

Vulkan の Descriptor Type

DirectX12 の Descriptor Type

  • Shader Resource View (SRV)
  • Constant Buffer View (CBV)
  • Unordered Access View (UAV)
  • Sampler

SAMPLER

  • Read Only
  • VK_DESCRIPTOR_TYPE_SAMPLER
  • DirectX で言う SamplerState
  • Sampler オブジェクトに関連づけられており、 サンプリングイメージに対して実行される、サンプリング操作の動作を制御する。

SAMPLED_IMAGE

  • Read Only
  • VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
  • DirectX で言う Texture
  • Image View を介して Image Resouce に関連づけられており、 Smpling Op (Load?) を実行できる。

STORAGE_IMAGE

  • Read Write
  • VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
  • DirectX で言う RWTexture
  • Image View を介して Image Resource に関連づけられており、 Load, Store, Atomic Op を実行できる。

COMBINED_IMAGE_SAMPLER

  • Read Only
  • VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
  • Sampler と Image Resource に関連づけられており、 一つの Discriptor で両方を結合している。

UNIFORM_TEXEL_BUFFER

  • Read Only
  • VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER
  • DirectX で言う Buffer
  • Buffer View を介して Buffer Resource に関連づけられており、 フォーマットされた Load を実行できる。

STORAGE_TEXEL_BUFFER

  • Read Write
  • VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER
  • DirectX で言う RWBuffer
  • Buffer View を介して Buffer Resource に関連づけられており、 フォーマットされた、Load, Store, Atomic Op を実行できる。

UNIFORM_BUFFER

  • Read Only
  • VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
  • DirectX で言う Constant Buffer
  • Buffer Resource に直接関連づけられており、 Load を実行できる。

STORAGE_BUFFER

  • Read Write
  • DirectX で言う Byte Address Buffer や Structured Buffer や Append/Consume Buffer など
  • VK_DESCRIPTOR_TYPE_STRAGE_BUFFER
  • Buffer Resource に直接関連づけられており、 Load, Store, Atomic Op を実行できる。

UNIFORM_BUFFER_DYNAMIC

  • Read Only
  • VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC
  • Uniform Buffer とほぼ同じ。バッファへのオフセットの指定方法が異なるだけ。

STORAGE_BUFFER_DYNAMIC

  • Read Write
  • VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC
  • Storage Buffet とほぼ同じ。バッファへのオフセットの指定方法が異なるだけ。

INPUT_ATTACHEMENT

  • VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
  • Image View を介して Image Resource に関連づけられており、 Fragment Buffer Local Load 操作に使用される。

INLINE_UNIFORM_BLOCK

  • VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT
  • Uniform Buffert とほぼ同じ。

Vulkan の API Dump

Vulkan Validation and Debugging Layers
https://vulkan.lunarg.com/doc/view/1.0.13.0/windows/layers.html

Using the Vulkan Validation Layers
https://gpuopen.com/using-the-vulkan-validation-layers/

Architecture of the Vulkan Loader Interfaces
https://vulkan.lunarg.com/doc/view/1.0.54.0/windows/LoaderAndLayerInterface.html

※ 検索にヒットした URL を載せているので、バージョンに一貫性が無い

Windows であれば VK_LAYER_LUNARG_api_dump をアプリケーションに設定し、Layer の設定ファイルが記述されている vk_layer_settings.txt ファイルを exe と同じ階層に配置する。

vk_layer_settings.txt は SDK/Config 以下にあり、ファイルの一番下に api_dump の記述がある。デフォルトだと lunarg_api_dump.file = FALSE になっているので TRUE に変更する。

実行すると vk_apidump.txt が exe と同じフォルダに出力される。

Vulkan 開発とデバッグマーカー

Examples and demos for the new Vulkan API
https://github.com/SaschaWillems/Vulkan

Vulkan Tutorial
https://vulkan-tutorial.com/

Tutorial on using Vulkan’s VK_EXT_debug_marker with RenderDoc
https://www.saschawillems.de/blog/2016/05/28/tutorial-on-using-vulkans-vk_ext_debug_marker-with-renderdoc/

Renderdoc
https://renderdoc.org/

Debug Marker

Unreal Engine 4 だと SCOPED_DRAW_EVENTF() で Debug Marker が埋め込まれている。Renderdoc のEvent Browser で拾える名前はここで設定されている。