Vulkan
GPU操作用の低レベルAPI
OpenGLでおなじみKhronos Groupが主導
Zennのほう、見たことある(というかTwitterでフォローしてる)人の記事だ
VkApplicationInfo は必須ではないものの、いろいろな情報を伝えることができて便利なので追加しておく
Vulkanの構造体は sType をちゃんと指定させるものが多いらしい
As mentioned before って書いてあるけどここに来るまでのやつ全然読んでないからわからん(いつか読み直したい)
VkApplicationInfo appInfo{}; と、わざわざ {} を付けてるのはなぜだろう
We're using value initialization here to leave it as nullptr. って書いてあるけどどういうことですか
というかこれclassじゃなくてstructだっけ
Vulkanは本来C用のライブラリ・・・だったはず
VkInstanceCreateInfo は名前の通りインスタンス作成に必要な情報を格納するもの
glfwのExtentionsとかを格納する
VkApplicationInfo を持っている(pApplicationInfo というメンバがある)
vkCreateInstance() でインスタンスの生成
第2引数は nullptr だけど、これはカスタムアロケータのcallbackになっている
この引数の型 VkAllocationCallbacks はただの関数ではなくて、allocation / reallocation / freeとかいろいろな関数をまとめた構造体らしい
vkDestroyInstance() の第2引数もカスタムアロケータ
一瞬だけ vkSetCustomAllocator() とか作ったほうが良かったのでは?と思ってしまったけど、これステートフルなOpenGLに逆行している感じもあるな
カスタムアロケータをいつ使うのかもわかってないのでこんな事を言っているのかも
チュートリアルに背いてデストラクタを追加し、そこで cleanup() を呼んでいたんだけど、run()の最後にある cleanup() を消し忘れていたので終了時にセグフォしてしまった(double freeみたいな感じになってた)
vkEnumerateInstanceExtensionProperties() はサポートされているextensionのリストを得ることが出来る
第2引数に渡した変数に個数が、第3引数に渡した配列にextensionの情報が格納される
チュートリアルでは個数だけ先に取得してからリストを得るけど、これ一度にやれば良いんじゃね?ってやった結果、何も持ってこれませんでした
そもそもvectorの初期化にextensionの個数使ってるだろ
Vulkanはミニマルを好むのでエラーハンドルをしない、nullptrとか渡したらクラッシュしたり未定義動作キメたりするかも ここでValidationLayerというラッパをかませる
VK_LAYER_KHRONOS_validation というレイヤーがVulkan SDKの中に含まれている
Ubuntu 22.04では vulkan-validationlayers-dev をインストールしないと動きませんでした
一通り書いたけど "Failed to set up debug messenger" で止まる
vkGetInstanceProcAddrがNULLを返してきている
絶対Nameのtypoだろ~と思ったけど違った
get_required_extensions() の戻り値を使っていなかった(enabledExtensionCountとかを設定していなかった)のが原因
アホらし これで30分くらいつかってしまった
ここでUbuntuを消してArch Linuxを入れる作業を実施し、見事にプロジェクトファイルが全滅してしまう
Arch Linuxでvkcubeを実行しようとすると、installable client driver (ICD) がないみたいなエラーが出てくる
何かのはずみで amdvlk がインストールされていて(インストールで楽するために vulkan-devel でインストールしたのが駄目だったかも)、/usr/share/vulkan/icd.dにamd関連ファイルが置かれていたことが原因
Physical devices and queue families
VkPhysicalDevicePropertiesとVkPhysicalDeviceFeaturesの2つを取ってくる
前者は名前や対応しているVulkanのバージョン、後者は名前そのまま機能(テクスチャ圧縮・64ビット浮動小数点数計算・複数viewportのレンダリングなど)を表す
isDeviceSuitableという関数を作る
サンプルコードばっかりで今回実装するやつがどれかわからない(ちゃんと本文を読んでいなかったせい)
QueueFamilyという概念があって、メモリ転送専用のQueueFamilyにはメモリ転送に関するQueueがあるみたいな感じらしい
PhysicalDeviceが持っている情報
取得するやつはvkGetFooBar(取得元, 個数, 格納先); という形が基本っぽい?