前回の記事(イントロダクション)
この記事ではまずVulkanにおけるバッファについて短く説明する。
簡単に言えばGPUでプログラムを処理するときに使う、CPUから送りこむデータの事を指す
バッファ?
GPUに送り込むデータを格納する箱、またはデータの集まりとなる。
Vulkanでは、バッファとは、C/C++に例えると
コンテナ(vectorのようなやつ)に近い。以下のC++疑似コードを
想像して欲しい
VK_STORAGE_BUFFER buffer[bufferSize];
VK_STORAGE_BUFFERという構造体(バッファ)を宣言して、その配列数を宣言している。
以下のVulkanBufferCreateInfoはこの疑似コードの宣言の仕方をベースに、バッファの構造体の型(sType),用途(usage),Vulkanの中核であるコマンドに関わるshareingModeの設定を行う
(SharingModeについてはコマンドの記事で説明を行う)
VkBufferCreateInfo bufferCreateInfo{};
bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
//この構造体を定義するよ
bufferCreateInfo.size = bufferSize;
bufferCreateInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
//このバッファはストレージバッファとして使うよ
bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
//Vulkanの基本設定。バッファの最適化が基本的に無駄なく行われる。
最後にバッファを作成(ストレージバッファ)
if (vkCreateBuffer(device, &bufferCreateInfo, nullptr, &buffer) != VK_SUCCESS) {
throw std::runtime_error("ストレージバッファの作成に失敗しました。 failed to create storage buffer");
}
ストレージバッファの作成
ストレージバッファはCPUとGPU間でデータをやり取りするための往復荷物みたいなものである。
お互いのプロセッサでここに情報を読み書きしたのち、その内容を別のバッファにコピーする
ここで先ほどのバッファーの作り方にならい、
ストレージバッファを宣言、設定を以下のように詰めていく
VkBufferCreateInfo bufferCreateInfo{};
bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;//このクリエイトインフォの型
bufferCreateInfo.size = bufferSize;
//バッファの要素数
bufferCreateInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
//バッファは何に使うのか?を定義
//ストレージバッファだよね
bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
//詳しくは別記事の予定であるコマンドの説明で
この章の範囲を超えるため、詳しくは別の記事で説明するものの、バッファを作成した後は
論理デバイスオブジェクトを使って、GPUドライバーを通じてGPUにバッファのデータや命令を送る
if (vkCreateBuffer(device, &bufferCreateInfo, nullptr, &buffer) != VK_SUCCESS) {
throw std::runtime_error("ストレージバッファの作成に失敗しました。 failed to create storage buffer");
}
次の記事でディスクリプタの説明に移る
ディスクリプタはバッファに格納したデータの使い方を説明したデータや配列のようなものになる
次回の記事