自分用メモ。DescriptorSet アップデート手順のメモ

はじめに

アロケートした DescriptorPool に Sampler 等を元に Descriptor を書き込む手順の説明。

VkSampler

フィルタ情報を保持するオブジェクト、vkCreateSampler() で生成する。引数はデバイスとVkSamplerCreateInfo という情報クラスを受け取る。デバイスが必要なのはサポートできるフィルタ設定のエラーチェックと GPU によってはサンプラをグローバルに管理しないといけない物があるからと推測される。

参考:Vulkan Cookbook p.234

DescriptorSet のアップデート

  • VkSampler sampler を生成する
  • VkImage sampledImage を生成する
  • DescriptorSetLayout/DescriptorPool の構築

上記は済ませているとする。vkUpdateDescriptorSets() をコールする事で実際にでスクリプタが書き込まれる。以下、引数の説明

  • VkDevice device
  • uint32_t descriptorWriteCount
    pDescriptorWrites の配列サイズを指定する
  • const VkWriteDescriptorSet* pDescriptorWrites
    書き込み先のデスクリプタセット、書き込む VkSampler の情報を保持している。詳細は後述。
  • uint32_t descriptorCopyCount
    デスクリプタセットのコピーをしない時は 0
  • const VkCopyDescriptorSet* pDescriptorCopies
    今回は使わないので割愛

VkWriteDescriptorSet、これを構築して vkUpdateDescriptorSets() に渡せればアロケートした DescriptorPool 上に書き込める。VkWriteDescriptorSet は一時変数でいい、vkUpdateDescriptorSets() コール後は破棄可能。以下、各メンバ変数です。

  • VkStructureType sType
  • const void * pNext
  • VkDescriptorSet dstSet
  • uint32_t dstBinding
  • uint32_t dstArrayElement
  • uint32_t descriptorCount
  • VkDescriptorType descriptorType
  • const VkDescriptorImageInfo * pImageInfo
  • const VkDescriptorBufferInfo * pBufferInfo
  • const VkBufferView * pTexelBufferView

VkDescriptorImageInfo、これが使用する VkSampler のポインタを持っている。以下、各メンバ変数です。VkSampler 等は恐らくハンドラなのでポインタになっていない。

  • VkSampler sampler
  • VkImageView imageView
  • VkImageLayout imageLayout

View もわざわざ vkCreateImageView() で作っている…。単に Info から Create() するというインターフェース統一のためかな?