3-2. メモリの確保

メモリの確保は vk::DeviceallocateMemoryメソッドで確保します。そして確保したメモリを bindImageMemoryメソッドで、前節で作成したイメージに結びつけることができます。

new式などで確保する通常のメモリと違い、これから扱うメモリはGPU上のメモリです。GPU上のメモリには種類があり、どれを使うか適切に選ぶ必要があります。どんな種類のメモリがあるかはGPU依存であり、 vk::PhysicalDevicegetMemoryPropertiesメソッドで取得できます。

vk::PhysicalDeviceMemoryProperties構造体にはGPUが何種類のメモリを持っているかを表す memoryTypeCountメンバ変数、各種類のメモリに関する情報を表す memoryTypesメンバ変数(配列です)が格納されています。

また、イメージに対してどんな種類のメモリがどれだけ必要かという情報は vk::DevicegetImageMemoryRequirementsで取得できます。

vk::MemoryRequirements構造体には必要なメモリサイズを表す sizeメンバ変数、そして使用可能なメモリの種類をビットマスクで表す memoryTypeBitsメンバ変数が格納されています。

例えば memoryTypeBitsの中身が2進数で00101011だった場合、使えるメモリの種類はメモリタイプ0番、1番、3番、5番になるのでこの中から選ぶことになります。

以上を踏まえて、メモリの確保のコードを見てみましょう。

vk::MemoryAllocateInfoに必要なメモリのサイズと種類を指定して確保します。memoryTypeBitsを確認して、ビットが立っていればその番号のメモリタイプを使用します。今回は使えるメモリタイプの中から単純に一番最初に見つかったものを使用していますが、今後の記事で、ビットが立っているメモリタイプの中から更に選ぶ処理も実装するかもしれません。

メモリの確保ができたらあとはイメージにバインド(結びつける)するだけです。

第3引数の0は何かというと、確保したメモリの先頭から何バイト目を使用するかという項目です。たとえばメモリ1000バイトを要するイメージAとメモリ1500バイトを要するイメージBの2つがあったとき、2500バイトを確保して先頭から0バイト目以降をイメージAに、1000バイト目以降をイメージBにバインドするといったことができます。ここでは普通に0を指定しています。


この節ではメモリの確保をやりました。次節ではレンダーパスを作成します。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です