ディスプレイ コントローラーを内蔵の Intel グラフィックスではなく Radeon に切り替えるにはどうすればよいですか?

ディスプレイ コントローラーを内蔵の Intel グラフィックスではなく Radeon に切り替えるにはどうすればよいですか?

ディストリビューション:ポップOS19.10
ラップトップ:HP ノートブック 15-bs185tx

グラフィックスカード:

  • AMD Radeon™ 520 グラフィックス (2 GB DDR3 専用)
  • インテルコーポレーション UHD グラフィックス 620

オンラインで入手できるほぼすべての解決策を試しましたが、何も機能しません。VGA とディスプレイ コントローラーは両方とも、内蔵の Intel グラフィックス上で実行されています。このコマンドを含む複数のコマンドを使用して、lspci -k | grep -EA3 'VGA|3D|Display'アクティブなグラフィックス アダプターを確認しました。この問題に関して質問がある場合は、お知らせください。

ありがとう!

答え1

TL;DR (ただし、値は1 0システムによって正しくない可能性があります):

$ xrandr --setprovideroffloadsink 1 0
$ export DRI_PRIME=1
$ glxinfo | grep "OpenGL renderer string"

この機能がハードウェア レベルで存在しない場合は不可能ですが、代替手段は存在します。

これは、VGA Switcheroo ドキュメント:

vga_switcheroo は、ラップトップ ハイブリッド グラフィックス用の Linux サブシステムです。これには 2 つの種類があります。

  • muxed: GPU 間の出力を切り替えるマルチプレクサ チップを備えたデュアル GPU。
  • マルチプレクサレス: デュアルGPUですが、そのうちの1つだけが出力に接続されます。もう1つはレンダリングの負荷を軽減するために使用されます。、その結果はPCIe経由でフレームバッファにコピーされます。Linuxでは、これは ドライプライム

ハイブリッド グラフィックスは 2000 年代後半に登場し始め、当初はすべて多重化されていました。新しいラップトップはコスト上の理由からマルチプレクサレスアーキテクチャに移行しました注目すべき例外は、引き続き mux を使用している MacBook Pro です。

あなたのハードウェアはマルチプレクサレス、 このような:

      ╔═══════════════╗
      ║               ║
      ║    display    ║
      ║               ║
      ╚═══════════════╝
       ╭───╯       X
       │           ┊
┌────────┐       ┌────────┐
│        │       │        │
│  iGPU  │───────│  dGPU  │
│        │       │        │
└────────┘       └────────┘

いくつかの優れたドキュメントは見つかりますが(例:アーチリナックス)、私は見つけられなかった正式の使用に関する信頼できる決定的なドキュメントDRI_PRIME。私が見つけた唯一の半公式のドキュメントは...Nvidiaのnouveauドライバーと言葉遊びオプティマスプライム:

オプティマス/プライムの使用

「PRIME GPU オフロード」と「リバース PRIME」は、Linux カーネルでマルチプレクサレス ハイブリッド グラフィックスをサポートするための試みです。

この名前はおそらく初期の Nvidia サポートに由来していますが、もちろん汎用的な名前であり、AMD でも動作します。

設定を照会したり変更したりするには、xrandr指示:

--listproviders
利用可能なプロバイダーに関する情報を報告します。

--setprovideroutputsource provider source
ソースをプロバイダーの表示出力画像のソースとして設定します。これは、ソースとプロバイダーにそれぞれソース出力機能とシンク出力機能がある場合にのみ可能です。ソースが 0x0 の場合、プロバイダーは現在の出力ソースから切断されます。

--setprovideroffloadsink provider sink
プロバイダーをシンクのレンダリング オフロード デバイスとして設定します。これは、プロバイダーとシンクがそれぞれソースオフロード機能とシンクオフロード機能を持っている場合にのみ可能です。シンクが 0x0 の場合、プロバイダーは現在のレンダリング オフロード シンクから切断されます。

たとえば、Intel iGPU と AMD dGPU を搭載したラップトップの場合:

$ xrandr --listproviders
Provider 0: id: 0x68 cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 4 outputs: 3 associated providers: 0 name:Intel
Provider 1: id: 0x41 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 2 outputs: 0 associated providers: 0 name:AMD Radeon (TM) HD8530M @ pci:0000:04:00.0

プロバイダ1にはoutputs: 0、他のプロパティが何であっても出力できないということに注意してください。ソース出力そしてシンク出力と言うかもしれません。あなたのシステムがするdGPU のプロパティに 0 以外の値を表示する場合は、この回答ではカバーされていないoutputs:他のオプション (直接表示、場合によっては Reverse PRIME と組み合わせて使用​​) を使用できる可能性があります。--setprovideroutputsource

dGPU にオフロードされた (3D) GPU タスクの使用を準備するには、前の例を使用して次のようにします。

$ xrandr --setprovideroffloadsink 'AMD Radeon (TM) HD8530M @ pci:0000:04:00.0' Intel

名前の代わりに、ID、またはもっと簡単にインデックスを使用できます。以下の 2 つのコマンドでも同じことができます。方向を逆にしないように注意する必要があります。そうしないと、問題が発生する可能性があります。

$ xrandr --setprovideroffloadsink 0x41 0x68
$ xrandr --setprovideroffloadsink 1 0

そしていま:

$ xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x68 cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 4 outputs: 3 associated providers: 1 name:Intel
Provider 1: id: 0x41 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 2 outputs: 0 associated providers: 1 name:AMD Radeon (TM) HD8530M @ pci:0000:04:00.0

これで 2 つのプロバイダーが関連付けられ、特別な (mesa への) 変数をエクスポートすると、DRI_PRIME=1レンダリングに使用する dGPU が選択されます。

$ DRI_PRIME=0 glxinfo | grep "OpenGL renderer string"
OpenGL renderer string: Mesa DRI Intel(R) Haswell Mobile 
$ DRI_PRIME=1 glxinfo | grep "OpenGL renderer string"
OpenGL renderer string: AMD Radeon (TM) HD8530M (OLAND, DRM 3.36.0, 5.6.3-amd64, LLVM 6.0.0)

したがって、 という GPU を多用する 3D プログラムを実行するにはmyhungrygame、次のようにすることになります (dGPU が iGPU の後に来る場合)。

$ xrandr --setprovideroffloadsink 1 0 # X11-wide setting
$ export DRI_PRIME=1
$ ./myhungrygame

デスクトップ環境がロードされる前に最初の 2 つのことを実行すると、すべてがデフォルトで 3D オフロードに dGPU を使用するようになりますが、これはおそらくラップトップには適していません。

関連情報