i3-wmをNVIDIA RTX4070 Raptop上で回した話

# TL;DR
[ArchWiki NVIDIA Optimus](https://wiki.archlinux.jp/index.php/NVIDIA_Optimus#NVIDIA_.E3.82.B0.E3.83.A9.E3.83.95.E3.82.A3.E3.83.83.E3.82.AF.E3.82.B9.E3.81.AE.E3.81.BF.E3.82.92.E4.BD.BF.E3.81.86)と[ASUS Linux](https://asus-linux.org/)の中に全部書いてある。手順通りにやれば(私と同じ環境なら)多分動く。ティアリング対応は[追記](#追記)を参照...

# 経緯
今年のはじめからArch Linuxを使い始めて、これは便利すぎると普段使いしていた今日この頃、Asusが出しているROG STRIXシリーズなるものを購入し、オレオレ環境のインストールとか色々に手こずったので備忘録。
同じ感じにArch+NVIDIAでハマってしまった人の助けになれば良いなぁ...

# 目次
- [今回使用した環境](#今回使用した環境)
- [下準備](#下準備)
- [Intel+MesaからNVIDIAへ移行](#nvidiaドライバへ移行)
- [動作確認](#動作確認)
- [まとめ](#まとめ)
- [追記](#追記)

# 今回使用した環境
- PC: **ASUS ROG STRIX G614**
- CPU: **Core i9 14世代(内蔵GPU有)**
- GPU: **NVIDIA GeForce RTX 4070(ラップトップ用)**
- Display Manager: **LightDM**
- Greeter: **LightDM GTK Greeter**
- Window Manager: **i3**

# 下準備
※この記事ではArch Linuxのインストール方法については書きません。インストール方法について詳しく知りたい方は`archlinux install`とかで調べるとたくさん記事が出てきます。~~いい感じの記事がたくさんあるので今回はそっちに丸投げします。~~

早速、[このサイト](https://asus-linux.org/guides)の***Arch Setup Guide***に載っているガイドに従って必要なものをインストールする。(以下はサイトより参考にし一部を改変)

以下のコマンドでpacmanのリポジトリのキーを追加
```zsh
sudo pacman-key --recv-keys 8F654886F17D497FEFE3DB448B15A6B0E9A3FA35
sudo pacman-key --finger 8F654886F17D497FEFE3DB448B15A6B0E9A3FA35
sudo pacman-key --lsign-key 8F654886F17D497FEFE3DB448B15A6B0E9A3FA35
sudo pacman-key --finger 8F654886F17D497FEFE3DB448B15A6B0E9A3FA35
```
`/etc/pacman.conf`を開き
```zsh
sudo vim /etc/pacman.conf
```
次の内容を追記して保存
```conf
[g14]
Server = https://arch.asus-linux.org
```
pacmanを更新しつつ、必要なパッケージをインストール
```zsh
sudo pacman -Syu asusctl power-profiles-daemon supergfxctl switcheroo-control rog-control-center
```
必要なデーモンを起動
```zsh
sudo systemctl enable --now power-profiles-daemon.service
sudo systemctl enable --now supergfxd
sudo systemctl enable --now switcheroo-control
```
完了！

※サイトではこのあとにカスタムカーネルのインストールについて色々書かれていますが、私が試した限りでは音が出なくなる等の問題が発生したため使用はおすすめできません。今回は安定している通常のカーネルを使用する想定で話を進めるのでここでは割愛します。

# NVIDIAドライバへ移行
[ArchWiki NVIDIA Optimus](https://wiki.archlinux.jp/index.php/NVIDIA_Optimus)の***NVIDIA グラフィックスのみを使う***に従って必要な設定ファイルやら何やらを書く。(以下はサイトを参考にし一部を改変)

`NVIDIA`のドライバをインストールする。(今回は`nvidia`をインストール)
※カスタムカーネルを使用している場合は`nvidia-dkms`をインストールする。
(どのドライバをインストールすればいいかわからない場合は[ここ](https://wiki.archlinux.jp/index.php/NVIDIA)の***インストール***を参照。)
```zsh
sudo pacman -S nvidia
```
ついでに便利なやつらをインストールしておく(必須ではない)
```zsh
sudo pacman -S nvidia-utils nvidia-settings nvtop mesa-utils
```
次に、`/etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf`を新規作成して開き
```zsh
sudo vim /etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
```
次の内容を書いて保存
```conf
Section "OutputClass"
    Identifier "intel"
    MatchDriver "i915"
    Driver "modesetting"
EndSection

Section "OutputClass"
    Identifier "nvidia"
    MatchDriver "nvidia-drm"
    Driver "nvidia"
    Option "AllowEmptyInitialConfiguration"
    Option "PrimaryGPU" "yes"
    ModulePath "/usr/lib/nvidia/xorg"
    ModulePath "/usr/lib/xorg/modules"
EndSection
```
最後に、使っているディスプレイマネージャ(もしくは`xinitrc`)に合わせて設定を書く。
(今回は`LightDM`の場合のみ紹介)

まず、`/etc/lightdm/display_setup.sh`を新規作成して開き
```zsh
sudo vim /etc/lightdm/display_setup.sh
```
次の内容を書いて保存
```sh
#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
```
実行権限を付与する
```zsh
sudo chmod +x /etc/lightdm/display_setup.sh
```

最後に`LightDM`の設定を変更
`/etc/lightdm/lightdm.conf`を新規作成して開き
```zsh
sudo vim /etc/lightdm/lightdm.conf
```
`[Seat:*]`のセクション内にある`#display-setup-script=`をアンコメントしてさっきのシェルスクリプトのパスを書く
```conf
[Seat:*]
...
display-setup-script=/etc/lightdm/display_setup.sh
...
```
完了！

# 動作確認
再起動してから次のコマンドを実行
```zsh
glxinfo | grep NVIDIA
```
こんな感じのが出れば成功！
```zsh
server glx vendor string: NVIDIA Corporation
client glx vendor string: NVIDIA Corporation
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: NVIDIA GeForce RTX 4070 Laptop GPU/PCIe/SSE2
OpenGL core profile version string: 4.6.0 NVIDIA 560.35.03
OpenGL core profile shading language version string: 4.60 NVIDIA
OpenGL version string: 4.6.0 NVIDIA 560.35.03
OpenGL shading language version string: 4.60 NVIDIA
OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 560.35.03
```

# まとめ
今回はAsusのROG STRIXシリーズにArch Linuxを入れて、NVIDIAのドライバを使ってみました〜
参考になったら嬉しいです (^^)
それではまたどこかでお会いしましょう〜 ﾉｼ

# 追記
## 2024/09/05
GPUをNVIDIAに切り替えてから次のような問題が起こるようになりました...

- 使っているターミナル上の文字が激しくティアリングを起こす
- 前のフレームの情報を次フレームで重ねて表示してしまう

原因がよく分からず、ターミナルを変えても発生したので頭を悩ませていたのですが、解決方法がわかったので追記しておきます。
(以下は[ArchWiki](https://wiki.archlinux.jp/index.php/NVIDIA/%E3%83%92%E3%83%B3%E3%83%88%E3%81%A8%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF)を参考にし一部を改変)

まず、`/etc/modprobe.d/nvidia.conf`を開き
```zsh
sudo vim /etc/modprobe.d/nvidia.conf
```
次の内容を書いて保存
```conf
options nvidia NVreg_RegistryDwords="PowerMizerEnable=0x1;  PerfLevelSrc=0x2222; PowerMizerLevel=0x3; PowerMizerDefault=0x3 PowerMizerLevelAC=0x3"
options nvidia NVreg_UsePageAttributeTable=1

```
再起動する

私の環境ではこれで問題が解決しました。
垂直同期(Vsync)がGPU側で有効化できていなかったことが原因だったみたいです...
以上、2024/09/05追記でした〜