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用のライブラリ・・・だったはず
  • 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(取得元, 個数, 格納先); という形が基本っぽい?