Vulkan Memory Allocator

提供: MonoBook
2024年4月18日 (木) 01:28時点におけるAdministrator (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

Vulkan Memory Allocator(通称:VMA)とは、GPUOpen(実質AMD)がオープンソースのもとで開発している「VulkanGPUごと(どころかデバイスドライバごと)にメモリアライメント仕様がバラバラ」という絶望的な問題を全自動で解決してくれるライブラリです。


PCは実質NVIDIAAMDIntelの3社しかなく、マイクロソフトが音頭を取りデバイスドライバのアップデートも半ば強制なので割とマシです。

問題はスマホAndroid向けを中心にクソ仕様のデバイスドライバが量産され続けており、かつほとんどのスマホはデバイスドライバが更新されずに(そもそもOSが更新されずに)放置されていることもあり、本プロジェクトのソースコードは今なお勢いよく更新され続けています。

使い方

このライブラリの基本的な使い方はとてもシンプルだ。グローバルなVmaAllocatorオブジェクトを作成した後、バッファを作成するために必要な完全なコードは次のようになります。

Vulkan Memory Allocatorを使ってVkBufferを確保する例
VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
bufferInfo.size = 65536;
bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;

VmaAllocationCreateInfo allocInfo = {};
allocInfo.usage = VMA_MEMORY_USAGE_AUTO;

VkBuffer buffer;
VmaAllocation allocation;
vmaCreateBuffer(allocator, &bufferInfo, &allocInfo, &buffer, &allocation, nullptr);

この1回の関数呼び出しで

  1. VkBuffer が作成されます。
  2. 必要に応じて VkDeviceMemory ブロックが割り当てられます。
  3. メモリブロックの未使用領域がこのバッファにバインドされます。

VmaAllocation は、このバッファに割り当てられたメモリを表すオブジェクトです。VkDeviceMemory のハンドルやオフセットなどのパラメータを問い合わせることができます。

関連項目

外部リンク