Vulkanのsparse resourcesについて
通常のリソースが vkBindBufferMemory() や vkBindImageMemory() を呼び出すのとは異なり、スパースメモリは キュー操作 vkQueueBindSparse() を介してバインドされます。
Sparse resources
- Sparse resources can be bound non-contiguously to one or more VkDeviceMemory allocations.
- Sparse resources can be re-bound to different memory allocations over the lifetime of the resource.
- Sparse resources can have descriptors generated and used orthogonally with memory binding commands.
(日本語訳)
- まばらな資源は1つまたは複数のVkDeviceMemoryに非連続的に割り合てることができる
- まばらな資源はその資源の生涯のなかでメモリーの異なる箇所に割り合てることができる
- まばらな資源はメモリの割当コマンドと直交して作成され使用される記述子を持つことができる
VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT
VkBuffer objects created with the VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT bit allow the buffer to be made only partially resident.
(日本語訳)
VK_BUFFER_CREATE_SPARSE_RESIDENCY_BITを有効にして作成されたVkBufferオブジェクトについては、そのバッファーを部分的にだけメモリに置くことができる。
Resouces(資源)とはバッファーとイメージのこと。
- 資源をばらばらに、複数のメモリのいろいろな領域と関連づけることができる
- 資源とメモリの領域の関連づけを後から変えることができる
- 記述子の作成や使用と、資源とメモリの領域との関連づけは直交して行うことができる
- 使用するときに資源は部分的にだけメモリと関連づけられているだけでいい
そんな感じ。
パッケージgpu-vulkanでは「資源と関連づけられていないメモリー領域には意味がない」という思想から、メモリーの確保と資源の関連づけは同時に行い、メモリーを表すデータ型は資源の型のリストを型引数として持つ。
まばらな資源を使う場合、まず考えるのは複数の資源のリストとイメージまたはバッファーの一部を指す型のリストのリストを与えて、それらに対応するメモリーを作成することだ。これは、まあ理論的にはうまくいきそうだ。
問題は「あとからメモリと資源の関連づけを変える」という話と「部分的な関連づけ」だ。
完全に「安全」を確保するのは、コストがかかりすぎるので、どこかでunsafeFooみたいなのを定義することになるだろう。
でもPartiallyBinded '[a, b, c] '[b]みたいな感じの型を作るのは、まあ可能な気はする。
toPartially :: B os -> PartiallyBinded os '[]
fromPartially :: PartiallyBinded os os -> Binded os
unsafeFromPartially :: Partillybinded os os' -> Binded os
みたいなの型変換関数を作るか。で、VkQueueBindSparseはPartiallyBindedなBufferやImageを引数や返り値にとるような感じにする。