(扉絵についてはポチるときに使わせていただいたPhysical Computing Labさんのページから引用しました)
どうも皆様こんにちは。イプシロンソフトウェアで代表をやっております、渡部です。突然ですが私はシングルボードコンピューター(SBC)が大好きでございまして、この小さなボディの中に無限の可能性を秘めている感じというか、あぁもう言葉にならない感情というのが心の奥底から湧き上がってくr(萌) 最近ではASUS TinkerBoard 2Sを触って遊んでおりましt じゃなくて真面目に仕事してますよ、えぇ、きっと。
そんなこんなで私もソフトウェアエンジニアとしてまだまだ現役として加わっておりまして、開発者の気持ちがわかると言うか比較的働きやすい環境が整っているんじゃないかなと思います。うちの会社では一緒に働いてくれる仲間を募集しておりますのでもしよければ一番下のリンクから話を聞きに来ていただけると小躍りして喜びます。
ASUS TinkerBoardシリーズって何
(画像は公式サイトより引用させていただきました)
ASUS TinkerBoardというのはASUSTeK Computerが開発しているカードサイズのシングルボードコンピューターです。すごく乱暴に言っちゃえばRaspberry Piっぽい感じのものですがお値段とスペックはこっちのほうが高めです。個人的には、あんまり細かいことはここでは書けないのですが初代TinkerBoardにかなりお世話になったことがありまして、TinkerBoardに対する愛が止まらない感じになっております。
TinkerBoard 2Sは名前のとおりスペック的には2世代目であり、Sと名前についているものはeMMC(オンボードフラッシュメモリ)が搭載されています。通常版はMicroSDカードに情報を入れてブートする必要がありますが、Sのシリーズだと直接ボード自体にOSを書き込めばブートできる感じです。便利ですね。じゃあMicroSDカードは使えないのかと言われればそんなことはなく、スロットもちゃんとあるので普通に使えます。単純に機能的に見ればプラスですという感じですね。
今回の目標
(画像はKHRONOS GROUPのサイトより引用させていただきました)
さてさて、今回の目標はTinkerBoard 2SでVulkanを動かして遊んでみよう!というものです。Vulkanというのはグラフィクスの仕組み(API)でして、「この命令を使えば絵が描けるよ」というような感じのものです。そういえばWeb界隈が進化してからAPIと言ったらRESTful APIのことを指すことがわりと一般的になりつつありますが、今回のようなOS等に対して命令を出してアプリをプログラミングをしていくインターフェイスのこともAPIといいます。
TinkerBoardはARM Mali-T860を搭載している(厳密に言えばRockchip RK3399 SoCの中に入っている)となっています。ARMの公式サイトを見ますと、Vulkanをサポートしているとなっておりまして、これは動かしてみたいねとなったわけです。
(公式サイトに燦然と輝くVulkanの文字)
まずはTinker OSで試してみる
まずは公式で配布されているTinker OSで試してみることにしました。Tinker OSとしてダウンロード可能なものはDebianベースのものとAndroidベースのものがありまして、今回はいろいろコマンド打って試したいのでDebianベースのものを使ってみることにしました。
インストール完了後、描画関連の状況はどういう感じになっとるんじゃろかと調べていっていたらいきなり不穏な空気感になってきました。
$ glxinfo -B
libGL error: unable to load driver: rockchip_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: rockchip
libGL error: unable to load driver: rockchip_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: rockchip
なんかエラーがめっちゃ出ちゃいました、私の環境だけなのかもしれませんが。エラー名で調べてみるとフォーラムとかが引っかかって、なんか無視しても問題ないみたいなことが結構アレコレ言われているわけです。表示される情報としてもllvmpipeが使われているとかって出てきまして、ん、これってソフトウェアラスタライザーってことはハードウェアアクセラレーション効いてないのかなって話ですね。
今回の調査ではDebian 10ベースで進めておりまして、Debian 11だとどうなるのかとも思ったのですが、どうやら直近でリリースが予定されている模様…というか調査時点では2023年8月にリリース予定とされていたのですが、7月末日にリリースされていたのですね。このあたり新しいディストリビューションだとまた様子は違うかもしれませんが、調査時点ではいったんTinker OSでのVulkan動作は諦めることにしました。
Armbianだったらどうなるのか
(画像はArmbianの公式サイトより引用させていただきました)
もう一つのオプションとしてArmbianを試してみることにしました。Armbianはメインのところではシングルボードコンピューター向けのビルドフレームワークで、様々なボード向けのイメージを提供しています。TinkerBoard 2向けのイメージもありまして、次にこれをインストールしてみることにしました。インストール自体はTinker OSと同じくEtcherを使ってわりとすんなりいきました。
調べてみると、OpenGLはハードウェアアクセラレーションがしっかり効いており、デフォルトインストール時点で特にエラーもなく使えるようになっているようですがVulkanに関しては使えない状況になっている模様。
$ sudo apt-get install vulkan-tools
$ vulkaninfo
これがエラーになっているようだったので、次はここでVulkanが動くように準備してみましょうということで先に進んでみることにしました。
mesaを手動ビルドして頑張る
mesaを手動でビルドしてなんとかVulkanのドライバが入らないかなーと目論んでいました。調べてみるとARM Mali向けにはPanfrostを使えば良さそうで、ここにMali T-860もバッチリ列挙されているので動きそうな雰囲気はあります。元々PanVkとして開発が進んでいたような感じみたいです。公式サイトには
Other graphics APIs (Vulkan, OpenCL) are not supported at this time.
みたいな表記が残ったままになっていましたが、多分過渡期ゆえのドキュメントの更新し忘れなのかなと判断することにしました。知らんけど。ビルドするときの meson に渡すオプションで -Dvulkan-drivers=panfrost みたいなの渡せばやれそうな気がするなーと思っておもむろにビルドしてみながら何度か必要なライブラリを入れたりしてエラーと格闘してなんとかビルドが通りました。インストールしたときに入ったjsonのファイルをVK_ICD_FILENAMES環境変数にセットして動くかなーえいやーと思って動かしてみたわけです。
$ vulkaninfo
Mali T-860 (Panfrost) not supported.
え
え、嘘や…ろ…
確かに見ました、えぇ見ました。ARMの公式サイトで見ました私。
API Supportにありました、Vulkan 1.0って。見間違いじゃないよね?
$ vulkaninfo
Mali T-860 (Panfrost) not supported.
やっぱエラーになりますなぁ、ドライバをビルドするのにミスったのかな、と思いまして何度も何度も試してみましたが状況は変わらず。最終的にはOSの再インストールからもう一度構築したりしましたが状況は変わりません。
うーん、なにかがおかしい
このエラーメッセージってどこから来てるのかなと思ってソースコードを調べてみることにしました。そうしたらエラーメッセージの箇所が分かりまして、どうやらGPUのアーキテクチャのバージョン番号みたいなのをチェックしているところみたいでした。若干ソースコードをいじってみて、TinkerBoard 2Sに搭載されているMali T-860のバージョン番号を見てみると5になっていることが分かりました。この番号はPanfrostの公式サイトに載っているArchitectureの列と一緒なのかなとピンと来まして、ただソースコードを見ると5以下はサポート外みたいな感じでなっています。これは…もしかしたらソースコードが違ってるのかなと思ってじっくりgit blameを見て調べてみることにしました。本当は5未満でエラーにしなきゃいけないんじゃないのか、いや、きっとそうだよな。そしたら見つけてしまったのです。
panvk: Drop support for Midgard
ギャー、サポート切られてるじゃん。そうね。そういうことだったのね。昔のバージョンのアーキテクチャまでサポートしようとするとコードが複雑になりすぎるから切り捨てられたのね。つまり使えない、と。残念ですね。よくよく調べてみると22.2.0でサポートがなくなっていることが確認できます。
だったら前のバージョンで試せばいいじゃない
そうだ。サポートが切られているのであればサポートが効いている昔のバージョンのmesaでビルドすれば行けるはずです。昔のタグをgit checkoutしてリビルド、これで…!
$ vulkaninfo
(ずらずらずら…)
おぉ、出た、出ました! 大勝利! 私勝ちました。これでTinkerBoard 2SでVulkanが動作するようになりました。早速遊んでみましょう。まずはキューブを回してみます!とぉりゃ!
$ vkcube
vkEnumerateInstanceExtensionProperties failed to find the VK_KHR_surface extension.
Do you have a compatible Vulkan installable client driver (ICD) installed?
Please look at the Getting Started guide for additional information.
え
え、そんな…
VK_KHR_surfaceは描画内容を画面に出すために必須というか、これナシで描画する方法を知りません。どうすればいいんだ…。ということでPanfrost (panvk) の開発状況からVK_KHR_surfaceの状態を調べてみました。
ぐぬぬ…! つまりなんとか動くようにバージョンを落としたことが今度は機能不足を招いてしまっていたのか…不覚! もうダメだ、諦めます。残念です。TinkerBoardのことを愛しているのでVulkanを動かして愛をもっと深められればと思ったのですが今回はここまでですね。
願わくば
残念ながら今回は目標を諦めるという選択をすることになってしまいました。もしかしたら将来の対応だとかでこのあたりが変わってくるかなとも思っておりますし、あるいはまだまだこういう方法ならなんとかなるよとかブログの内容が間違ってるよとか、いろいろあればと願っています。本当、ブログの内容が間違っていて、すんなりとTinkerBoardでVulkanが動けば最高なんですけどね。ということで若干他力本願寺みたいな感じになっちゃいますが今日はこんなところでペンを置きたいと思います。