如何将显示控制器切换为 Radeon 而不是内置 Intel 显卡?

evo*_*iar 4 linux amd-graphics

发行版: Pop OS 19.10
\n笔记本电脑: HP Notebook 15-bs185tx

\n\n

显卡:

\n\n
    \n
  • AMD Radeon\xe2\x84\xa2 520 显卡(2 GB DDR3 专用)
  • \n
  • 英特尔公司超高清显卡 620
  • \n
\n\n

我已经尝试了几乎所有在线可用的解决方案,但没有任何效果。VGA 和显示控制器都在我的内置 Intel 显卡上运行。\n我使用了多个命令(包括此命令)lspci -k | grep -EA3 'VGA|3D|Display'来查看我的活动图形适配器。如果您对此问题有任何疑问,请告诉我。

\n\n

谢谢你!

\n

A.B*_*A.B 5

TL;DR(但这些值1 0在您的系统上可能不正确):

\n\n
$ xrandr --setprovideroffloadsink 1 0\n$ export DRI_PRIME=1\n$ glxinfo | grep "OpenGL renderer string"\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

如果硬件级别不存在此功能,那么这是不可能的,但存在替代方案。

\n\n

VGA Switcheroo 文档中显示了这一点:

\n\n
\n

vga_switcheroo 是用于笔记本电脑混合显卡的 Linux 子系统。\n 有两种类型:

\n\n
    \n
  • muxed:带有多路复用器芯片的双 GPU,用于在 GPU 之间切换输出。
  • \n
  • muxless:双 GPU,但只有其中一个连接到输出。另一种仅用于卸载渲染,其结果通过 PCIe 复制到帧缓冲区中。在 Linux 上,\n DRI PRIME支持此功能 。
  • \n
\n\n

混合图形开始出现在 Naughties 后期,并且最初都是混合的。出于成本原因,较新的笔记本电脑转向无复用器架构。一个值得注意的例外是 MacBook Pro,它继续使用多路复用器。

\n
\n\n

所以我假设你的硬件是muxless,如下所示:

\n\n
      \xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n      \xe2\x95\x91               \xe2\x95\x91\n      \xe2\x95\x91    display    \xe2\x95\x91\n      \xe2\x95\x91               \xe2\x95\x91\n      \xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n           \xe2\x94\x82\n       \xe2\x95\xad\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x95\xaf       X\n       \xe2\x94\x82           \xe2\x94\x8a\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90       \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82        \xe2\x94\x82       \xe2\x94\x82        \xe2\x94\x82\n\xe2\x94\x82  iGPU  \xe2\x94\x82\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x82  dGPU  \xe2\x94\x82\n\xe2\x94\x82        \xe2\x94\x82       \xe2\x94\x82        \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n\n

虽然可以找到一些好的文档(例如:在Archlinux上),但我找不到一些关于DRI_PRIME. 我发现的唯一可能是半官方的文档是... Nvidia 的 nouveau 驱动程序和文字游戏Optimus/PRIME

\n\n
\n

使用 Optimus/Prime

\n\n

“PRIME GPU 卸载”和“反向 PRIME”是在 Linux 内核中支持无复用混合图形的尝试。

\n
\n\n

虽然这个名称可能源自最初的 Nvidia 支持,但它当然是通用的并且可以与 AMD 配合使用。

\n\n

您可以使用以下命令查询和更改设置xrandr

\n\n
\n

--listproviders
\n 报告有关可用提供程序的信息。

\n\n

--setprovideroutputsource provider source
\n 将 source 设置为提供程序的显示输出图像的来源。仅当源和提供者分别具有源输出和接收器输出功能时,这才有可能。如果源为 0x0,则提供程序与其当前输出源断开连接。

\n\n

--setprovideroffloadsink provider sink
\n 将提供程序设置为接收器的渲染卸载设备。仅当提供者和接收器分别具有源卸载和接收器卸载功能时,这才有可能。如果接收器为 0x0,则提供程序将与其当前渲染卸载接收器断开连接。

\n
\n\n

例如,对于使用 Intel iGPU 和一些 AMD dGPU 的笔记本电脑:

\n\n
$ xrandr --listproviders\nProvider 0: id: 0x68 cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 4 outputs: 3 associated providers: 0 name:Intel\nProvider 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,无论Source OutputSink Output 的outputs: 0其他属性如何,Provider 1 都无法输出。如果您的系统确实为 dGPU 的属性显示了一个不同于 0 的值,那么您可能还有其他可用选项(直接显示,也可能与使用反向 PRIME 结合使用),但本答案不会涵盖这些选项。outputs:--setprovideroutputsource

\n\n

要准备使用卸载到 dGPU 的 (3D) GPU 任务,对于前面的示例,可以这样做:

\n\n
$ xrandr --setprovideroffloadsink \'AMD Radeon (TM) HD8530M @ pci:0000:04:00.0\' Intel\n
Run Code Online (Sandbox Code Playgroud)\n\n

可以使用 ids 或更简单的索引来代替名称。下面的两个命令会执行相同的操作。一个人必须注意不要颠倒方向,否则可能会发生不好的事情。

\n\n
$ xrandr --setprovideroffloadsink 0x41 0x68\n$ xrandr --setprovideroffloadsink 1 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在:

\n\n
$ xrandr --listproviders\nProviders: number : 2\nProvider 0: id: 0x68 cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 4 outputs: 3 associated providers: 1 name:Intel\nProvider 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,两个提供程序已关联,导出特殊(到 mesa)变量DRI_PRIME=1会选择要渲染的 dGPU:

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

因此,要运行名为 的 GPU 密集型 3D 程序myhungrygame,您可能会这样做(如果 dGPU 在 iGPU 之后):

\n\n
$ xrandr --setprovideroffloadsink 1 0 # X11-wide setting\n$ export DRI_PRIME=1\n$ ./myhungrygame\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您设法在加载桌面环境之前完成前两件事,那么默认情况下所有设备都将使用 dGPU 进行 3D 卸载,这对于笔记本电脑来说可能不是一个好主意。

\n