2022/11/27

AMD製GPU搭載PCとモニタをHDMI接続してLinux上でFreeSyncは使えるか?

はじめに要約すると、使えることは使える。ただし、2022年秋時点ではGPUの世代によっては面倒。

なお、PC側とディスプレイ側の両方がDisplayPortに対応していれば、そちらを使うのが楽と思われる。

  1. AMD製GPUでは世代によっては正常に動作しない?
  2. リフレッシュレート範囲をハードコーディングしてカーネルビルドで動作する?
    1. 注意点など

AMD製GPUでは世代によっては正常に動作しない?

Linux 5.13時点ではHDMI接続でのFreeSync(可変リフレッシュレート実装の1つ)は対応済みとされている。

AMD製GPUではその細かな世代ごとに用意されたバイナリファームウェア(ソースは公開されていない)の中でディスプレイのEDIDを読み込んで必要な情報を取得する作りになっているようだ。

ソース: https://github.com/torvalds/linux/commit/f9b4f20c4777bd305ef04f9485294692bc65968c

問題なのは、幾つかのFreeSync対応の世代のAMD製GPUを搭載したシステムにおいては既に正常に動作しているようなのだが、手元のAthlon 220GEの内蔵グラフィック(Radeon Vega 3 Graphics)環境では、手元のFreeSync対応ディスプレイ(Dell SE2422H)と接続しても有効とは認識されなかった。

なお、将来のlinux-firmwareの更新によって、2022年秋時点でうまく動かない構成における動作が改善される可能性は考えられる。

FreeSyncはIntel製やNVIDIA製のGPUの中にも対応しているものがあるが、それらのLinux対応状況は不明。

リフレッシュレート範囲をハードコーディングしてカーネルビルドで動作する?

手元の環境と同様にLinux 5.13でも正常に動作しなかった環境のとあるユーザがカーネルのamdgpuドライバ内のコードを編集してリフレッシュレートの変動範囲を直接ソースに記述することを試し、FreeSyncの動作に成功したという報告があり、他の複数のユーザからも成功の報告があった。

記事: https://www.reddit.com/r/linux_gaming/comments/upc1lx/psa_hdmi_freesync_can_be_enabled_on_polaris/

そこで、記事からリンクされているコード編集例を参考にして、手元のモニタのマニュアルのリフレッシュレートの範囲を調べ(“48-75Hz” と書かれていた)、ソースをそれに合わせて

  • amdgpu_dm_connector->min_vfreq = 48;
  • amdgpu_dm_connector->max_vfreq = 75;
  • connector->display_info.monitor_range.min_vfreq = 48;
  • connector->display_info.monitor_range.max_vfreq = 75;
  • freesync_capable = true;

となるように編集して差分をパッチとして保存し、linux-tkgのユーザパッチ機能に合わせたディレクトリ(今回は5.19系を使ったのでlinux519-tkg-userpatches)にパッチを入れてビルドしてそのカーネルをインストールし、ブートローダからそのカーネルを選択した結果、Plasma Wayland環境ではシステム設定の “ディスプレイとモニタ” に “Adaptive sync” の項目が出てくるようになり、X.org環境ではXの設定ファイル(Ubuntu 22.10では/usr/share/X11/xorg.conf.d/10-amdgpu.conf)にOption "VariableRefresh" "true"を挿入することで

https://github.com/Nixola/VRRTest

のようなテストプログラムで48-59fps程度のフレームレートのときでも映像が乱れずにかつ規則正しく動くようになった。ただ、今回はXの設定ファイルにOption "TearFree" "true"も追加しないと映像の乱れは完全には改善しなかった。

linux-tkgを用いたカーネルビルドの手順はここでは扱わない。

注意点など

ソースを編集する際には、ディスプレイの不具合や故障を確実に防ぐため、必ずディスプレイのマニュアルを参照して正しい値を記述し、ソースを変更したカーネルで起動する際には使用対象のディスプレイ以外とは接続しないように十分注意する。

実際の3Dゲームなどで体感的にFreeSyncの効果が実感できたかどうかというと、特に48-59fps辺りの範囲で安定して(大幅に落ち込むこともなく)フレームレートが推移するゲームがあれば実感できた可能性もあるのだが、残念ながらPCのスペック不足もあって2022年秋時点では実感には至っていない。

Plasma Wayland環境で “Adaptive sync” を “Always” にした後でスリープから復帰したときに画面が黒くチカチカするような不具合を1回経験したので、その後は “Automatic” にしているが、手元のWayland環境では現状ではFreeSyncが実際に効いているかどうかを目で見て判別するのは困難。時々設定値が勝手に “Never” になっていることがある気もするが、詳細はよく分からない。

使用したバージョン:
  • Linux 5.19.x (5.19.17など)
  • xorg-server 21.1.4
  • xserver-xorg-video-amdgpu 22.0.0
  • Plasma 5.25.5, 5.26.x (5.26.3など)