2025/11/16 19:45 Linux mode setting, from the comfort of OCaml

やあ、ロボ子。今日はLinuxのKMS APIを使ってディスプレイ設定をいじる話じゃ。

KMS APIですか、博士。なんだか難しそうですね。

大丈夫だぞ! `libdrm-ocaml`っていうライブラリを使えば、OCamlで簡単に操作できるのじゃ。まずは環境構築からじゃな。Nixかopamで`libdrm`と`utop`をインストールするのじゃ。

なるほど。記事にも「`git clone https://github.com/talex5/libdrm-ocaml`」とありますね。これでインタラクティブにコマンドを実行できるんですね。

そうじゃ! インストールが終わったら、グラフィックスデバイスをリスト表示してみるのじゃ。デバイスの主要ノードとかレンダーノードとか、色々見えてくるぞ。

主要ノードとレンダーノードですか。それらは具体的に何をするものなんですか?

主要ノードは、ディスプレイの設定とか、モードの設定とか、そういう重要なことをするのじゃ。レンダーノードは、3Dアニメーションのレンダリングとか、GPUを使う処理を担当するのじゃ。

なるほど! 役割が違うんですね。記事には、コネクタの詳細情報を取得して、接続状態を確認するとも書いてありますね。

そうじゃ。コネクタっていうのは、ディスプレイを接続するポートのことじゃ。HDMIとかDisplayPortとかじゃな。そのコネクタが接続されているか、どんなモードが使えるか、色々調べられるのじゃ。

モードというのは、解像度とかリフレッシュレートのことですか?

その通り! コネクタがサポートしているモードの詳細を表示できるのじゃ。あと、リソースのプロパティも取得できるぞ。`atomic`機能を有効にすると、追加のプロパティも取得できるらしいのじゃ。

`atomic`機能ですか。それは何をするものなんですか?

`atomic`機能は、複数のディスプレイ設定をまとめて変更するためのものじゃ。これを使うと、画面がちらついたりするのを防げるのじゃ。

なるほど! 重要な機能なんですね。記事には、フレームバッファの形式についても説明があると書いてありますね。

フレームバッファは、画面に表示する内容を一時的に保存しておく場所じゃ。形式っていうのは、色の表現方法のことじゃな。XR24とか、色々な形式があるのじゃ。

ふむふむ。そして、VulkanバッファをDumb Bufferの代わりに利用して、3Dレンダリングもできるんですね。

そうじゃ! Vulkanバッファをdmabuf FDとしてエクスポートして、`Drm.Dmabuf.to_handle`でインポートするのじゃ。`K.Crtc.page_flip`を使ってフレームバッファを更新すれば、テアリングも回避できるぞ。

テアリングというのは、画面がずれて表示される現象のことですよね。

その通り! 最後に、デバッグ方法も書いてあるぞ。カーネルからのエラーコードを調べるには、`/sys/module/drm/parameters/debug`を使ってKMSデバッグメッセージを有効にするのじゃ。

なるほど。色々な情報が詰まってますね。OCamlトップレベルからlibdrm APIをインタラクティブに探索できるのは便利ですね。

じゃろ? `ocaml-ctypes`を使ってCバインディングを作成しているのもポイントじゃな。C APIの型の不整合には気を付けるのじゃぞ!

はい、博士。勉強になりました!

ところでロボ子、ディスプレイの設定をいじりすぎて画面が真っ暗になったら、どうする?

ええと…、再起動ですか?

正解! …って、普通に再起動するしかないのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。