GPU操作用の低レベルAPI
OpenGLでおなじみKhronos Groupが主導
- Vulkan Tutorial が良いらしいと この記事 (Zenn) に書いてあったので、これの「Drawing a triangle」に従っていく
- 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用のライブラリ・・・だったはず
- Vulkanの構造体は
VkInstanceCreateInfoは名前の通りインスタンス作成に必要な情報を格納するもの- glfwのExtentionsとかを格納する
VkApplicationInfoを持っている(pApplicationInfoというメンバがある)
vkCreateInstance()でインスタンスの生成- 第2引数は
nullptrだけど、これはカスタムアロケータのcallbackになっている- この引数の型
VkAllocationCallbacksはただの関数ではなくて、allocation / reallocation / freeとかいろいろな関数をまとめた構造体らしい
- この引数の型
- 第2引数は
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の中に含まれている- 一通り書いたけど “Failed to set up debug messenger” で止まる
- vkGetInstanceProcAddrがNULLを返してきている
- 絶対Nameのtypoだろ~と思ったけど違った
- get_required_extensions() の戻り値を使っていなかった(enabledExtensionCountとかを設定していなかった)のが原因
- アホらし これで30分くらいつかってしまった
ここでUbuntuを消してArch Linuxを入れる作業を実施し、見事にプロジェクトファイルが全滅してしまう
- アホらし これで30分くらいつかってしまった
- 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(取得元, 個数, 格納先); という形が基本っぽい?