2025-02-15

Clangd with cross compile toolchain

職業柄よくC/C++クロスコンパイラを使うのだが,Language ServerのClangdを使うと適切な型エイリアス等が解決されず困っていた.
VSCodeのIntelli Senseのノリで,compile_commands.jsonにクロスコンパイラを渡してあげたら勝手にincludeディレクトリ等を解決してくれると思っていたのだが,そうではなかったらしい.

クロスコンパイラから適切なヘッダを読み込むには,--query-driverオプションをclangdの呼び出し時に与える必要があるとのこと.
System headers

自分はNeoVimにMasonを導入してLSPを管理しているので,mason-lspconfigで設定する.
環境によってコンパイラのパスが違うので,上手いこと動的にフルパスを引っ張ってくるようにした(ロードが遅くなるのには目をつぶり…).

    require("mason-lspconfig").setup_handlers({
        ...
        ["clangd"] = function()
            -- Get cross compiler path for query driver
            local cross_compilers = {
                "riscv64-unknown-linux-gnu-gcc",
                "riscv64-unknown-linux-gnu-g++",
            }
            local cross_compilers_path = {}
            for _, val in ipairs(cross_compilers) do
                local res = h.binary_path(val)
                if res ~= nil then
                    table.insert(cross_compilers_path, res)
                end
            end
 
            -- consruct clangd command args
            local clangd_cmd = { "clangd" }
            if next(cross_compilers_path) ~= nil then
                local query_drivers = table.concat(cross_compilers_path, ",")
                table.insert(clangd_cmd, "--query-driver=" .. query_drivers)
            end
 
            require("lspconfig").clangd.setup({
                on_attach = on_attach,
                capabilities = capabilities,
                handlers = handlers,
                cmd = clangd_cmd,
            })
        end,
    })

ドキュメントによると--query-driverはあくまでAllow Listで,compile_commands.json内でマッチするコンパイラが指定されていた場合に発動するらしい.

ポインタサイズが正しくとれてなくて,キャストするたびに警告吐かれてたのが消えてスッキリした.

2025-02-14

Wezterm on wayland with NVIDIAの描画遅延

それなりに前からだが,weztermをNVIDIA GPU下のwayland環境で使用すると,描画遅延がひどくて使い物にならないケースがあった.

原因はやはりNVIDIA周りのようで,Intel iGPU下では同様の症状が出たことがない.ほんとにNVIDIAとLinuxの相性の悪さはいつになってのご健在だなぁ…とつくづく思う.これでも相当マシになってきてる方だけど.

GPU要因なのでGraphic Accelerationを切ればいいのだが,それはそれで問題なので,Xwayland動作でしばらく運用していた.
ただXwaylandはHiDPI環境でのスケーリングがダメで,AAなしジャギー状態のような描画になってしまう.
自分は4Kモニター複数枚運用の人なので,1xスケールでの運用は結構厳しい.しばらく使っていたものの,描画範囲が大きすぎるが故の遅延などが出ることもあって実用に耐えなかった.

なんとかWaylandネイティブで遅延が発生しないようにする術はないかと試行錯誤していたところ,wezterm側の描画フロントエンドをWebGPUにしただけで解決してしまった.なんとも拍子抜けな…
ちなみにデフォルトのフロントエンドはOpenGL.

設定はwezterm.luaに以下を入れるだけでよい.

config.front_end = "WebGpu"

WebGPUに変更したことによる見た目の変化はほとんどない.若干フォントの鮮明さが落ちた雰囲気があるが,使用上の支障はないだろう.

ドキュメントによれば.Platformごとに適したbackendが使われるらしい.

The WebGpu front end allows wezterm to use GPU acceleration provided by a number of platform-specific backends:

  • Metal (on macOS)
  • Vulkan
  • DirectX 12 (on Windows)