「Vulkan Memory Allocator」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の6版が非表示)
1行目: 1行目:
'''Vulkan Memory Allocator'''(通称:VMA)とは、[[GPUOpen]](実質[[AMD]])が[[オープンソース]]のもとで[[開発]]している「[[Vulkan]]は[[GPU]]ごと(どころか[[デバイスドライバ]]ごと)に[[メモリアライメント]]の[[仕様]]がバラバラ」という絶望的な全自動で問題を解決してくれる[[ライブラリ]]です。
+
'''Vulkan Memory Allocator'''(通称:VMA)とは、[[GPUOpen]](実質[[AMD]])が[[オープンソース]]のもとで[[開発]]している「[[Vulkan]]は[[GPU]]ごと(どころか[[デバイスドライバ]]ごと)に[[メモリアライメント]]の[[仕様]]がバラバラ」という絶望的な問題を全自動で解決してくれる[[ライブラリ]]です。
 +
 
 +
[[PC]]は実質[[NVIDIA]]、[[AMD]]、[[Intel]]の3社しかなく、[[Windows]]は[[マイクロソフト]]が音頭を取り、[[Linux]]は[[Steam]]の[[中の人]]が音頭を取り、[[デバイスドライバ]]のアップデートを半ば強制しているので割とマシです。
 +
 
 +
問題は[[スマホ]]。[[Android]]向けのクソ仕様の[[デバイスドライバ]]が量産され続けており、かつほとんどの[[スマホ]]はデバイスドライバが更新されずに(そもそも[[OS]]が更新されずに)放置されています。そのためほぼ同じ[[GPU]]でもスマホごとにデバイスドライバのバージョンが異なり、メモリアライメントの仕様も異なるというふざけた状況に陥っています。
 +
 
 +
そんなこともあり本プロジェクトの[[ソースコード]]は今なお勢いよく更新され続けています。
  
 
== 使い方 ==
 
== 使い方 ==
 
この[[ライブラリ]]の基本的な使い方はとてもシンプルだ。グローバルなVmaAllocatorオブジェクトを作成した後、バッファを作成するために必要な完全なコードは次のようになります。
 
この[[ライブラリ]]の基本的な使い方はとてもシンプルだ。グローバルなVmaAllocatorオブジェクトを作成した後、バッファを作成するために必要な完全なコードは次のようになります。
 +
 +
; Vulkan Memory Allocatorを使ってVkBufferを確保する例
 
<source lang="c">
 
<source lang="c">
 
VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
 
VkBufferCreateInfo bufferInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

2024年4月18日 (木) 01:32時点における最新版

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

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

問題はスマホAndroid向けのクソ仕様のデバイスドライバが量産され続けており、かつほとんどのスマホはデバイスドライバが更新されずに(そもそもOSが更新されずに)放置されています。そのためほぼ同じGPUでもスマホごとにデバイスドライバのバージョンが異なり、メモリアライメントの仕様も異なるというふざけた状況に陥っています。

そんなこともあり本プロジェクトのソースコードは今なお勢いよく更新され続けています。

使い方[編集 | ソースを編集]

このライブラリの基本的な使い方はとてもシンプルだ。グローバルな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 のハンドルやオフセットなどのパラメータを問い合わせることができます。

関連項目[編集 | ソースを編集]

外部リンク[編集 | ソースを編集]