Intel 显卡

来自 ArchWiki
(重定向自 I915)

由于 Intel 提供并支持开源驱动程序,因此 Intel 显卡基本上是即插即用的。

有关 Intel GPU 型号以及相应的芯片组和 CPU 的完整列表,请参阅 Wikipedia:Intel Graphics TechnologyGentoo:Intel#Feature support

注意
  • PowerVR 显卡(GMA 3600 系列)不受开源驱动程序支持。
  • Intel 的 GenN 硬件不是指 CPU 的代数,而是指 GPU 的代数,这与 CPU 的代数不同。
  • 请参阅 Xorg#驱动程序安装 以识别您的显卡。

安装

  • 安装 以下软件包之一,它们提供用于 3D 加速的 DRI 驱动程序。
    • mesa 是最新的 Mesa 软件包,其中包括用于 Gen 3 硬件及更高版本的现代 Gallium3D 驱动程序。 这是推荐的选择。
    • mesa-amber 是旧版 Mesa 软件包,其中包括从 Gen 2 到 Gen 11 硬件的经典(非 Gallium3D)驱动程序。 对于 Gen 7 和更旧的硬件,此驱动程序可能具有更好的性能或稳定性,但已不再维护。
  • 为了获得 32 位应用程序支持,还要从 multilib 仓库安装 lib32-mesalib32-mesa-amber 软件包。
  • 对于在 Xorg 中提供 2D 加速的 DDX 驱动程序,请使用以下驱动程序之一
    • 包含在 xorg-server 软件包中的 modesetting 驱动程序是 Gen 4 硬件及更高版本的推荐选择。 它使用 DRI 驱动程序通过 glamor 进行加速。
    • xf86-video-intel 软件包提供从 Gen 2 到 Gen 9 硬件的旧版 intel DDX 驱动程序。 通常不推荐使用此软件包,请参阅下面的注释。
  • 为了获得 Vulkan 支持(Broadwell 及更新版本;对早期芯片的支持不完整或缺失),请安装 vulkan-intel 软件包。 为了获得 32 位 Vulkan 支持,请安装 lib32-vulkan-intel 软件包。

另请参阅 硬件视频加速

注意

加载

Intel 内核模块应在系统启动时自动加载。

如果未发生这种情况,则

  • 请确保您没有nomodeset 作为内核参数,因为 Intel 需要内核模式设置。
  • 此外,请检查您是否没有通过在 /etc/modprobe.d//usr/lib/modprobe.d/ 中使用任何 modprobe 黑名单来禁用 Intel。

早期 KMS

内核模式设置 (KMS) 由 i915xe 驱动程序支持,并且自 mkinitcpio v32 起已提前启用,因为 kms hook 默认包含在内。 对于其他设置,请参阅 内核模式设置#早期 KMS 启动,以获取有关如何在启动过程中尽快启用 KMS 的说明。

启用 GuC / HuC 固件加载

从 Gen9(Skylake 及更高版本)开始,Intel GPU 包括一个图形微控制器 (μ) (GuC),它提供以下功能

  • 将一些媒体解码功能从 CPU 卸载到 HEVC/H.265 微控制器 (μ) (HuC)。 仅在使用 intel-media-driver 进行 硬件视频加速 时适用。 随 Gen9 引入。
  • 使用 GuC 进行调度、上下文提交和电源管理。 随 Alder Lake-P (Mobile) 在 Gen12 中引入。

要使用此功能,首先请确保已安装 linux-firmware,因为它提供 GuC 和 HuC 固件文件。

接下来,必须加载 GuC 固件。 关于 HuC 支持,某些视频功能(例如 SKL 低功耗编码模式下的 CBR 速率控制)也需要加载 HuC 固件 [6]

新的实验性 xe 驱动程序默认启用 Guc 和 Huc 功能。

对于 i915 驱动程序,GuC 功能由 i915.enable_guc 内核参数 控制。 其用法如下

本文或本节的客观准确性存在争议。

原因: 尽管有 Intel 的文档,但 Tiger Lake 和 Rocket Lake GPU 实际上可能支持 enable_guc=3,并且默认值为 enable_guc=1。 (在 Talk:Intel graphics#TGL/RKL GuC Submission 中讨论)
enable_guc 值 GuC 提交 HuC 固件加载 平台的默认值 平台上支持
0 Tiger Lake、Rocket Lake 和 Pre-Gen12 [7] 全部
1 Alder Lake-P (Mobile) 及更高版本
2 Alder Lake-S (Desktop) [8] [9] Gen9 及更高版本
3 Alder Lake-P (Mobile) 及更高版本 Gen 9.5 及更高版本(某些情况下更好)

如果您的 GPU 默认未启用 GuC 提交或 HuC 固件加载,您可以手动启用它。

警告: 手动启用 GuC / HuC 固件加载会污染内核,即使该功能不受支持。 此外,启用 GuC/HuC 固件加载可能会在某些系统上导致问题; 如果您遇到冻结(例如,从休眠状态恢复后),请禁用它。

设置 i915.enable_guc 内核参数,例如使用

/etc/modprobe.d/i915.conf
options i915 enable_guc=2

重新生成 initramfs,在下次启动时,您可以使用 dmesg 验证 GuC 和 HuC 是否都已启用

# dmesg | grep -i -e 'huc' -e 'guc'
[30130.586970] i915 0000:00:02.0: [drm] GuC firmware i915/icl_guc_33.0.0.bin version 33.0 submission:disabled
[30130.586973] i915 0000:00:02.0: [drm] HuC firmware i915/icl_huc_9.0.0.bin version 9.0 authenticated:yes

如果您的图形适配器不支持它们,您将看到

# dmesg | grep -i -e 'huc' -e 'guc'
[    0.571339] i915 0000:00:02.0: [drm] Incompatible option enable_guc=2 - GuC is not supported!
[    0.571340] i915 0000:00:02.0: [drm] Incompatible option enable_guc=2 - HuC is not supported!

或者,使用以下命令检查

# less /sys/kernel/debug/dri/*/gt0/uc/guc_info
# less /sys/kernel/debug/dri/*/gt0/uc/huc_info
注意: 当 GuC/HuC 也启用时,截至 linux 4.20.11,通过设置 i915.enable_gvt=1 使用 GVT-g 显卡虚拟化 不受支持。 i915 模块将无法初始化,如系统日志中所示。
# journalctl
... kernel: [drm:intel_gvt_init [i915]] *ERROR* i915 GVT-g loading failed due to Graphics virtualization is not yet supported with GuC submission
... kernel: i915 0000:00:02.0: [drm:i915_driver_load [i915]] Device initialization failed (-5)
... kernel: i915: probe of 0000:00:02.0 failed with error -5
... kernel: snd_hda_intel 0000:00:1f.3: failed to add i915 component master (-19)

请注意,相关的警告不是致命的,如 [10] 中所述

# journalctl -b 
... kernel: i915 0000:00:02.0: Direct firmware load for i915/gvt/vid_0x8086_did_0x5916_rid_0x02.golden_hw_state failed with error -2

Xorg 配置

通常不需要任何配置即可运行 Xorg

但是,要利用某些驱动程序选项,或者如果 Xorg 未启动,您可以创建 Xorg 配置文件。

使用 modesetting 驱动

如果您已安装 xf86-video-intel,但想要显式加载 modesetting 驱动程序而不是让 DDX 驱动程序优先,例如在尝试比较它们时

/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
  Identifier "Intel Graphics"
  Driver "modesetting"
EndSection

使用 Intel 驱动

注意: 以下操作需要安装 xf86-video-intel 软件包。

创建一个类似于下面的 Xorg 配置文件

/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
  Identifier "Intel Graphics"
  Driver "intel"
EndSection

用户可以在 Driver 行下方的新行中添加其他选项。有关完整选项列表,请参阅 intel(4) 手册页。

注意: 您可能需要添加比上面列出的设备节更多的设备节。这将在必要时指出。

AccelMethod

创建配置文件时,您可能需要指定 Option "AccelMethod",经典选项有 UXASNA(默认)和 BLT

如果您在使用默认的 SNA 时遇到问题(例如像素化图形、文本损坏等),请尝试使用 UXA,这可以通过在您的 配置文件 中添加以下行来完成

Option      "AccelMethod"  "uxa"

请参阅 intel(4) § CONFIGURATION DETAILS 下的 "AccelMethod" 选项。

在新 GPU 上使用 Intel DDX 驱动程序

对于 Gen8 (Broadwell) 及更新型号的 Intel GPU,需要 Iris Mesa 驱动程序

Option      "DRI"  "iris"

禁用 TearFree、TripleBuffer、SwapbuffersWait

如果您使用合成器(现代桌面环境如 GNOME、KDE Plasma、Xfce 等中的默认设置),通常可以禁用 TearFree、TripleBuffer 和 SwapbuffersWait 以提高性能并降低功耗。

Option      "TearFree"        "false"
Option      "TripleBuffer"    "false"
Option      "SwapbuffersWait" "false"

基于模块的选项

i915 内核模块允许通过 模块选项 进行配置。 一些模块选项会影响省电功能。

可以使用以下命令生成包含所有选项以及简短描述和默认值的列表

$ modinfo -p i915

要检查当前启用了哪些选项,请运行

# systool -m i915 -av

您会注意到许多选项默认值为 -1,这导致每个芯片都使用省电默认值。 但是,可以通过使用 模块选项 来配置更激进的省电模式。

注意: 从 Linux 3.18 开始,偏离默认值会将内核标记为 已污染。 这基本上意味着使用非每芯片默认值的其他选项被认为是实验性的,并且不受开发者支持。

帧缓冲压缩 (enable_fbc)

帧缓冲压缩 (FBC) 是一项可以减少屏幕刷新期间的功耗和内存带宽的功能。

如果硬件支持该功能,它将自动启用。 您可以使用以下命令验证是否已启用

$ modinfo i915 | grep enable_fbc
parm:           enable_fbc:Enable frame buffer compression for power savings (default: -1 (use per-chip default)) (int)

如果 parm 设置为 -1,则无需执行任何操作。 否则,要强制启用 FBC,请使用 i915.enable_fbc=1 作为 内核参数 或在 /etc/modprobe.d/i915.conf 中设置

/etc/modprobe.d/i915.conf
options i915 enable_fbc=1
注意: 在 Sandy Bridge(第 6 代)之前的 Intel GPU 世代上,帧缓冲压缩可能不可靠或不可用。 这会导致系统日志中记录类似于以下内容的消息
kernel: drm: not enough stolen space for compressed buffer, disabling.

在 Sandy Bridge 之前的 CPU 上启用帧缓冲压缩会导致无休止的错误消息

# dmesg
[ 2360.475430] [drm] not enough stolen space for compressed buffer (need 4325376 bytes), disabling
[ 2360.475437] [drm] hint: you may be able to increase stolen memory size in the BIOS to avoid this
解决方案是禁用帧缓冲压缩,这将微乎其微地增加功耗(约 0.06 瓦)。 为了禁用它,请将 i915.enable_fbc=0 添加到内核行参数中。 有关禁用压缩结果的更多信息,请参见 此处

Fastboot

注意: 此参数默认情况下已为 Skylake 及更新型号[11] 以及 Bay- 和 Cherry-Trail (VLV/CHV)[12] 自 Linux 5.1[13] 起启用,但自 Linux 6.7[14] 起已完全移除,并且自 Linux 6.9[15] 起,已为所有 GPU 世代(包括早于 Skylake 的型号)启用 fastboot。

Intel Fastboot 的目标是保留 BIOS 或 引导加载程序 设置的帧缓冲,以避免在 Xorg 启动之前出现任何闪烁。[16][17]

要在默认情况下未启用的平台上强制启用 fastboot,请将 i915.fastboot=1 设置为 内核参数 或在 /etc/modprobe.d/i915.conf 中设置

/etc/modprobe.d/i915.conf
options i915 fastboot=1

Intel GVT-g 图形虚拟化支持

有关详细信息,请参阅 Intel GVT-g

启用性能支持

本文或章节需要扩充。

原因: Mesa 实际使用性能计数器做什么? 这有什么影响? 一些报告指出在 Intel Tiger Lake 上性能大幅提升,这归因于对动态调优的支持 [18]。(在 Talk:Intel graphics#通过观察架构实现的潜在性能提升 中讨论)

从 Gen6(Sandy Bridge 及更新型号)开始,Intel GPU 提供性能计数器,用于向驱动程序公开内部性能数据。 驱动程序和硬件寄存器将此基础架构称为观察架构(内部称为 "OA")[19],但 Intel 的文档更普遍地将此功能称为提供可观察性性能计数器 [20][死链 2023-09-16 ⓘ] [21][死链 2023-09-16 ⓘ]

默认情况下,只有以 CAP_SYS_ADMIN(等同于 root)或 CAP_PERFMON capabilities 运行的程序才能使用观察架构 [22] [23]。 大多数应用程序将在没有这些权限的情况下运行,从而导致以下警告

MESA-INTEL: warning: Performance support disabled, consider sysctl dev.i915.perf_stream_paranoid=0

要在不使用 capabilities(或 root)的情况下启用性能支持,请按照 sysctl 中的描述设置内核参数。

警告: perf_event_paranoid 系列选项的限制性默认值存在,因为允许应用程序访问性能数据存在风险 [24]。 话虽如此,dev.i915.perf_stream_paranoid 仅影响对 GPU 性能计数器的访问,这比 CPU 架构执行上下文寄存器等风险更低。

技巧和窍门

设置缩放模式

这对于某些全屏应用程序可能很有用

$ xrandr --output LVDS1 --set PANEL_FITTING param

其中 param 可以是

  • center:分辨率将完全保持定义不变,不会进行缩放,
  • full:缩放分辨率以使其使用整个屏幕,或
  • full_aspect:将分辨率缩放到最大可能值,但保持纵横比。

如果它不起作用,请尝试

$ xrandr --output LVDS1 --set "scaling mode" param

其中 param"Full""Center""Full aspect" 之一。

注意: 此选项目前不适用于外部显示器(例如 VGA、DVI、HDMI、DP)。 [25]

GMA 4500 上的硬件加速 H.264 解码

libva-intel-driver 软件包仅为某些 GMA 4500 系列 GPU 提供硬件加速 MPEG-2 解码,而不提供 H.264 解码。 要检查这是否影响您的特定 GPU,请同时安装该驱动程序和 libva-utils 软件包,然后检查 vainfo 工具的输出中是否存在以 VAProfileH264 开头的条目。

H.264 解码支持维护在一个单独的 g45-h264 分支中,可以通过安装 libva-intel-driver-g45-h264AUR 软件包来使用。 但是请注意,此支持是实验性的,并且其开发已被放弃。 在 GMA 4500 系列 GPU 上将 VA-API 与此驱动程序一起使用将卸载 CPU 负载,但可能无法实现与非加速播放一样流畅的播放。 使用 mplayer 进行的测试表明,使用 vaapi 播放 H.264 编码的 1080p 视频将 CPU 负载减半(与 XV 叠加相比),但导致播放非常卡顿,而 720p 工作得相当好 [26]。 其他经验也证实了这一点 [27]。 在 BIOS 中将预分配的显存大小设置得更高会导致硬件解码播放效果更好。 如果这样做,即使是 1080p h264 也能很好地工作[28]。 使用 mpv-gitAUR 结合 ffmpeg-gitAURlibva-intel-driver-g45-h264AUR,流畅播放 (1080p/720p) 也能正常工作。 配合 MPV 和 Firefox 插件 "Send to MPV player"[29],可以观看硬件加速的 YouTube 视频。

覆盖报告的 OpenGL 版本

MESA_GL_VERSION_OVERRIDE 环境变量 可用于覆盖报告给任何应用程序的 OpenGL 版本。 例如,设置 MESA_GL_VERSION_OVERRIDE=4.5 将报告 OpenGL 4.5。

注意: 您可以使用此变量报告任何已知的 OpenGL 版本,即使 GPU 不支持该版本。 某些应用程序可能不再崩溃,有些可能开始崩溃 - 您可能不想全局设置此变量。

监控

本文或章节是与 硬件视频加速#验证 合并的候选对象。

备注: 这与先前链接页面上的内容重叠,并且可能更适合放在通用页面中,而不是这个专门用于 Intel GPU 的页面中。 否则,应修改 硬件视频加速#验证 以链接到每个专用页面,而不是复制内容。(在 Talk:Intel graphics 中讨论)
  • intel_gpu_top — 用于 Intel GPU 的类似 top 的任务监视器(需要 root 权限)。
https://gitlab.freedesktop.org/drm/igt-gpu-tools || intel-gpu-tools
  • nvtop — 用于 AMD、Intel 和 NVIDIA 的 GPU 进程监控(目前对 Intel GPU 的支持非常基础)。
https://github.com/Syllo/nvtop || nvtop

设置亮度和伽玛

请参阅 背光

测试新的实验性 Xe 驱动程序

要尝试(实验性)新的 Xe 驱动程序,您需要

使用以下命令注意您的 PCI ID

$ lspci -nn | grep VGA
00:02.0 VGA compatible controller [0300]: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] [8086:9a49] (rev 01)

然后将以下内容添加到您的 内核参数 中,并使用适当的 PCI ID

... i915.force_probe=!9a49 xe.force_probe=9a49

确保您有备用启动解决方案,以便在必要时恢复。

故障排除

画面撕裂

使用 Intel 驱动

SNA 加速方法在某些机器上会导致画面撕裂。为了解决这个问题,请在 xf86-video-intel 驱动中启用 TearFree 选项,方法是将以下行添加到你的配置文件

/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
  Identifier "Intel Graphics"
  Driver "intel"
  Option "TearFree" "true"
EndSection

参阅原始错误报告以获取更多信息。

注意
  • SwapbuffersWaitfalse 时,此选项可能不起作用。
  • 此选项可能会显著增加内存分配并降低性能。[30]
  • 此选项对于对垂直同步时序非常敏感的应用程序(如 Super Meat Boy)可能存在问题。
  • 此选项不适用于 UXA 加速方法,仅适用于 SNA。
  • 对于 Intel UHD 620 或 630,你需要添加 Option "TripleBuffer" "true" 才能使 TearFree 生效。
  • 可能需要通过添加 Option "DRI" "2" 来禁用 DRI3,否则任何全屏应用程序(如视频播放)都可能破坏 TearFree。[31]

使用 modesetting 驱动

TearFree 支持已添加到 modesetting 驱动程序[32][33]。由于非 XWayland 服务器的最后一个版本是 2021 年的 21.1 版本,此补丁尚未到达稳定版本,因此你需要 xorg-server-gitAUR 直到那时。

/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
  Identifier "Intel Graphics"
  Driver "modesetting"
  Option "TearFree" "true"
EndSection

禁用垂直同步 (VSYNC)

以下情况有用:

  • Chromium/Chrome 由于 GPU 出现延迟和性能缓慢,但使用 --disable-gpu 开关后运行流畅
  • glxgears 测试未显示期望的性能

intel-driver 使用三倍缓冲进行垂直同步;这允许充分发挥性能并避免画面撕裂。要关闭垂直同步(例如用于基准测试),请在你的主目录中使用此 .drirc

~/.drirc
<device screen="0" driver="dri2">
	<application name="Default">
		<option name="vblank_mode" value="0"/>
	</application>
</device>

DRI3 问题

DRI3xf86-video-intel 中的默认 DRI 版本。在某些系统上,这可能会导致问题,例如这个。要切换回 DRI2,请将以下行添加到你的配置文件

Option "DRI" "2"

对于 modesetting 驱动程序,此禁用 DRI3 的方法不起作用。相反,可以设置环境变量 LIBGL_DRI3_DISABLE=1

GTK 应用程序中的字体和屏幕损坏(挂起/恢复后缺少字形)

如果你在 GTK 应用程序中遇到缺少字体字形的情况,以下解决方法可能会有所帮助。编辑 /etc/environment 以添加以下行

/etc/environment
COGL_ATLAS_DEFAULT_BLIT_MODE=framebuffer

另请参阅FreeDesktop 错误 88584

使用 intel 驱动程序时 X 冻结/崩溃

一些 X 崩溃、GPU 挂起或 X 冻结的问题可以通过禁用 GPU 使用率和 NoAccel 选项来修复 - 将以下行添加到你的配置文件

  Option "NoAccel" "True"

或者,尝试仅使用 DRI 选项禁用 3D 加速

  Option "DRI" "False"

添加未检测到的分辨率

此问题在 Xrandr 页面上进行了介绍。

背光不可调节

如果在从挂起恢复后,用于更改屏幕亮度的热键不起作用,请对照 Backlight 文章检查你的配置。

如果问题仍然存在,请尝试以下内核参数之一

acpi_osi=Linux
acpi_osi="!Windows 2012"
acpi_osi=

还要确保你没有使用快速启动模式(i915.fastboot 内核参数),已知它会导致背光控制中断。

Chromium 和 Firefox 中的损坏或无响应

如果你在 Chromium 和/或 Firefox 中遇到损坏、无响应、延迟或性能缓慢,一些可能的解决方案是

内核在 Broadwell/Core-M 芯片上使用 4.0+ 内核时崩溃

在 X/Wayland 加载几秒钟后,机器将冻结,并且 journalctl 将记录如下引用 Intel 显卡的内核崩溃

Jun 16 17:54:03 hostname kernel: BUG: unable to handle kernel NULL pointer dereference at           (null)
Jun 16 17:54:03 hostname kernel: IP: [<          (null)>]           (null)
...
Jun 16 17:54:03 hostname kernel: CPU: 0 PID: 733 Comm: gnome-shell Tainted: G     U     O    4.0.5-1-ARCH #1
...
Jun 16 17:54:03 hostname kernel: Call Trace:
Jun 16 17:54:03 hostname kernel:  [<ffffffffa055cc27>] ? i915_gem_object_sync+0xe7/0x190 [i915]
Jun 16 17:54:03 hostname kernel:  [<ffffffffa0579634>] intel_execlists_submission+0x294/0x4c0 [i915]
Jun 16 17:54:03 hostname kernel:  [<ffffffffa05539fc>] i915_gem_do_execbuffer.isra.12+0xabc/0x1230 [i915]
Jun 16 17:54:03 hostname kernel:  [<ffffffffa055d349>] ? i915_gem_object_set_to_cpu_domain+0xa9/0x1f0 [i915]
Jun 16 17:54:03 hostname kernel:  [<ffffffff811ba2ae>] ? __kmalloc+0x2e/0x2a0
Jun 16 17:54:03 hostname kernel:  [<ffffffffa0555471>] i915_gem_execbuffer2+0x141/0x2b0 [i915]
Jun 16 17:54:03 hostname kernel:  [<ffffffffa042fcab>] drm_ioctl+0x1db/0x640 [drm]
Jun 16 17:54:03 hostname kernel:  [<ffffffffa0555330>] ? i915_gem_execbuffer+0x450/0x450 [i915]
Jun 16 17:54:03 hostname kernel:  [<ffffffff8122339b>] ? eventfd_ctx_read+0x16b/0x200
Jun 16 17:54:03 hostname kernel:  [<ffffffff811ebc36>] do_vfs_ioctl+0x2c6/0x4d0
Jun 16 17:54:03 hostname kernel:  [<ffffffff811f6452>] ? __fget+0x72/0xb0
Jun 16 17:54:03 hostname kernel:  [<ffffffff811ebec1>] SyS_ioctl+0x81/0xa0
Jun 16 17:54:03 hostname kernel:  [<ffffffff8157a589>] system_call_fastpath+0x12/0x17
Jun 16 17:54:03 hostname kernel: Code:  Bad RIP value.
Jun 16 17:54:03 hostname kernel: RIP  [<          (null)>]           (null)

这可以通过禁用 execlist 支持来修复,该支持在内核 4.0 中被更改为默认开启。添加以下内核参数

i915.enable_execlists=0

已知至少在内核 4.0.5 版本之前是有问题的。

Windows 虚拟机中的延迟

VirtualBox 中 Windows 虚拟机的视频输出有时会卡顿,直到主机强制屏幕更新(例如,移动鼠标光标)。删除 enable_fbc=1 选项可以解决此问题。

屏幕闪烁

面板自刷新 (PSR) 是 Intel iGPU 使用的省电功能,已知在某些情况下会导致闪烁 FS#49628 FS#49371 FS#50605。临时解决方案是使用内核参数 i915.enable_psr=0xe.enable_psr=0 禁用此功能。

使用 i915 驱动程序的 OpenGL 2.1

包含在 mesa-amber 软件包中的 Gen 3 GPU 的经典 mesa 驱动程序默认报告 OpenGL 2.0,因为硬件与 OpenGL 2.1 不完全兼容。[34] 可以通过设置 /etc/drirc~/.drirc 选项手动启用 OpenGL 2.1 支持,例如

/etc/drirc
<driconf>
...
    <device driver="i915">
        <application name="Default">
            <option name="stub_occlusion_query" value="true" />
            <option name="fragment_shader" value="true" />
        </application>
    </device>
...
</driconf>
注意
  • 这一退步的原因是 Chromium 和其他应用程序的不良体验。如果需要,你可以以“应用特定”的风格编辑 drirc 文件,请参阅此处,以禁用例如可执行文件 chromium 上的 OpenGL 2.1。
  • 包含在 mesa 软件包中的基于 Gallium 的新 i915 驱动程序始终报告 OpenGL 2.1,因此该设置对于该驱动程序是不需要的。

KMS 问题:控制台被限制在小区域

启动时可能启用了其中一个低分辨率视频端口,这导致终端仅使用屏幕的一小部分区域。要修复此问题,请在引导加载程序中的内核命令行参数中使用 video=SVIDEO-1:d 的 i915 模块设置显式禁用该端口。有关更多信息,请参阅 内核参数

如果这不起作用,请尝试禁用 TV1 或 VGA1 而不是 SVIDEO-1。视频端口名称可以使用 xrandr 列出。

Haswell CPU 上 HDMI 没有声音

根据Linux 内核问题,如果 intel_iommu=on,声音将不会通过 HDMI 输出。要解决此问题,请使用以下内核参数

intel_iommu=on,igfx_off

或者,也可以禁用 IOMMU

intel_iommu=off

低功耗 Intel CPU 上的崩溃/冻结

本文或本节的客观准确性存在争议。

原因: enable_dc=0 可能不会像此处声称的那样妨碍电源管理。(在 Talk:Intel graphics#Incorrect statements regarding power usage penalty of enable_dc=0 中讨论)

低功耗 Intel 处理器和/或笔记本电脑处理器由于低功耗 Intel 芯片中的电源管理功能问题,往往会随机挂起或崩溃。如果发生此类崩溃,你将不会看到任何报告此问题的日志。添加以下内核参数可能有助于解决问题。

注意: 不建议同时使用以下所有三个内核参数。
intel_idle.max_cstate=1 i915.enable_dc=0 ahci.mobile_lpm_policy=1

ahci.mobile_lpm_policy=1 修复了由于有问题的 SATA 控制器电源管理导致的多个 Lenovo 笔记本电脑和一些 Acer 笔记本电脑上的卡顿。该解决方法严格来说与 Intel 显卡无关,但它确实解决了相关问题。添加此内核参数会将理从固件默认值设置为最大性能,并且还可以解决在某些 Lenovo 机器上更改显示亮度时发生的卡顿,但会使现代超极本的空闲功耗增加 1-1.5 瓦。有关更多信息,特别是关于其他状态的信息,请参阅 Linux 内核邮件列表Red Hat 文档

i915.enable_dc=0 禁用 GPU 电源管理。这确实解决了某些 Intel 系统(尤其是 Goldmount 和 Kaby Lake Refresh 芯片)上的随机卡顿问题。使用此参数会导致更高的功耗和更短的笔记本电脑/笔记本续航时间。

intel_idle.max_cstate=1 限制处理器睡眠状态,它阻止处理器进入深度睡眠状态。这绝对不是理想的,并且会导致更高的功耗和更短的电池续航时间。但是,它确实解决了许多 Intel 系统上的随机卡顿问题。如果你的芯片是 Intel Baytrail 或 Kaby Lake Refresh 芯片,请使用此参数。Intel "Baytrail" 芯片已知在没有此内核参数的情况下会随机卡顿,这是由于硬件缺陷造成的,理论上已于2019-04-26 修复。有关 max_cstate 参数的更多信息可以在 内核文档中找到,有关 cstate 的一般信息可以在 GitHub 上的文章中找到。

如果你尝试添加 intel_idle.max_cstate=1 i915.enable_dc=0 ahci.mobile_lpm_policy=1 以希望修复频繁卡顿,并且这解决了问题,你应该稍后逐个删除它们,看看其中哪一个实际上帮助你解决了问题。如果实际问题与 SATA 电源管理有关,并且 ahci.mobile_lpm_policy=1 是真正解决问题的那个,则不建议在禁用 cstate 和显示电源管理的情况下运行。

查看 Linux Reviews 了解更多详情。

更高的 C 状态阻止从 S3 唤醒

如果你偶尔唤醒后出现黑屏,但系统在日志中显示 CPU pipe A FIFO underrun 消息的情况下仍然可以正常恢复,并且限制 intel_idle.max_cstate=1 可以可靠地防止这种情况,你可以使用 Suspend and hibernate#Sleep hookscpupower-idle-set(1) 来有效控制挂起周期附近的 C 状态,使用 -D0-E 以避免 CPU 永久运行在最低 C 状态。

添加对 165Hz 显示器的支持

本文或本节内容可能需要与 Kernel mode setting#Forcing modes and EDID 合并。

注意: 此技术似乎并非 i915 特有。在合并之前,应验证安装脚本是否必要,以及是否有更简单的方法将 EDID BIN 添加到 initramfs。(在 Talk:Intel graphics 中讨论)

对于某些 165Hz 显示器,xrandr 可能不显示 165Hz 选项,并且 #添加未检测到的分辨率 中的修复方法无法解决此问题。在这种情况下,请参阅 i915-driver-stuck-at-40hz-on-165hz-screen

注意: 除了创建 /etc/initramfs-tools/hooks/edid 之外,还应该创建一个 mkinitcpio hook
/etc/initcpio/install/edid
#!/bin/bash

build() {
    add_file /lib/firmware/edid/edid.bin
}

help() {
    cat <<HELPEOF
This hook add support for 165Hz
HELPEOF
}

然后将 edid 附加到 /etc/mkinitcpio.conf 的 HOOKS 中,就像这样

/etc/mkinitcpio.conf
HOOKS=(... fsck edid)

然后重新生成 initramfs

在 Raptor Lake 和 Alder Lake-P 上从睡眠/挂起唤醒后冻结

使用来自不同供应商的 Raptor Lake 和 Alder Lake-P 第 12 代移动处理器笔记本电脑的用户,在从挂起状态唤醒后遇到了冻结和黑屏问题。这是因为许多笔记本电脑供应商出厂时使用了不正确的 VBT(视频 BIOS 表),正如 freedesktop 问题 5531 6401 中所述,该表错误地描述了连接到 iGPU 的实际端口。在这种情况下,所有记录在案的案例都与重复的 eDP 条目有关。

考虑到大多数供应商 不会 为 Windows 操作系统正常工作的笔记本电脑发布 BIOS 更新,Linux 用户只能在内核端解决此问题。用户有两种方法可以防止重复的 eDP 条目影响内核:修补内核加载修改后的 VBT

对于修补内核,需要通过分析以下输出识别重复的 eDP 条目

# intel_vbt_decode /sys/kernel/debug/dri/1/i915_vbt
 Child device info:
        Device handle: 0x0008 (LFP 1 (eDP))
        Device type: 0x1806 (unknown)
 ...
 Child device info:
        Device handle: 0x0080 (LFP 2 (eDP))
        Device type: 0x1806 (unknown)

这表明实际上存在重复的 eDP,内核应该忽略第二个条目,但仍然鼓励用户检查这一点。然后可以使用以下内核补丁对其进行修补,如果需要,可以将重复屏幕的索引替换为 ignoreEntry = 1

--- a/drivers/gpu/drm/i915/display/intel_bios.c
+++ b/drivers/gpu/drm/i915/display/intel_bios.c
@@ -3688,6 +3688,14 @@
{
       struct intel_bios_encoder_data *devdata;

+       int ignoreEntry = 0;
+
       list_for_each_entry(devdata, &i915->display.vbt.display_devices, node)
-               func(i915, devdata);
+       {
+               if (ignoreEntry != 1)
+               {
+                       func(i915, devdata);
+                       ignoreEntry++;
+               }
+       }
}


解决此问题的第二种方法是通过直接 从 VBT 中删除重复条目 来编辑 VBT。

此方法的工作原理是复制 VBT 并使用十六进制编辑器对其进行编辑,并将与重复设备句柄对应的设备类型更改为 00 00

$ cat /sys/kernel/debug/dri/0/i915_vbt > vbt
--- vbt
+++ modified_vbt
@@ -22,10 +22,10 @@
 00000150  00 08 00 20 00 08 00 10  00 08 00 02 00 08 00 01  |... ............|
 00000160  00 08 00 00 01 08 00 00  00 04 00 00 00 40 00 00  |.............@..|
 00000170  00 20 00 00 00 10 00 00  00 02 00 00 00 01 00 00  |. ..............|
-00000180  00 00 01 00 00 02 8b 01  02 04 00 00 27 08 00 06  |............'...|
-00000190  18 00 00 00 00 00 00 00  00 00 00 00 00 0a 00 00  |................|
+00000180  00 00 01 00 00 02 8b 01  02 04 00 00 27 08 00 00  |............'...|
+00000190  00 00 00 00 00 00 00 00  00 00 00 00 00 0a 00 00  |................|
 000001a0  03 00 00 00 c0 00 40 00  20 00 00 00 00 00 00 00  |......@. .......|
-000001b0  00 00 20 00 80 00 06 18  00 00 00 00 00 00 00 00  |.. .............|
+000001b0  00 00 20 00 80 00 00 00  00 00 00 00 00 00 00 00  |.. .............|
 000001c0  00 00 00 00 07 00 00 00  00 00 00 c0 00 10 00 20  |............... |
 000001d0  00 00 00 00 00 00 00 00  00 20 00 04 00 d2 60 00  |......... ....`.|
 000001e0  10 10 00 23 21 10 00 00  00 00 00 07 00 00 02 00  |...#!...........|

然后可以通过将其复制到 /lib/firmware/modified_vbt,传递 i915.vbt_firmware=modified_vbt 作为内核参数,并在需要时 重新生成 initramfs 来加载修改后的 VBT。

色彩失真

默认情况下,某些显示器可能无法被 Intel GPU 正确识别,并且颜色会失真,因为它未处于全范围 RGB 模式。

修复 Wayland 的颜色

/etc/udev/rules.d/80-i915.rules
ACTION=="add", SUBSYSTEM=="module", KERNEL=="i915", RUN+="/usr/local/bin/intel-wayland-fix-full-color"
/usr/local/bin/intel-wayland-fix-full-color
#!/bin/bash

readarray -t proptest_result <<<"$(/usr/bin/proptest -M i915 -D /dev/dri/card0 | grep -E 'Broadcast|Connector')"

for ((i = 0; i < ${#proptest_result[*]}; i += 2)); do
    connector=$(echo ${proptest_result[i]} | awk '{print $2}')
    connector_id=$(echo ${proptest_result[i + 1]} | awk '{print $1}')

    /usr/bin/proptest -M i915 $connector connector $connector_id 1
done

如果您正在使用 GNOME另一种方法 是将 <rgbrange>full</rgbrange> 添加到 ~/.config/monitors.xml 配置文件中。例如

~/.config/monitors.xml
<monitors version="2">
  <configuration>
    <layoutmode>logical</layoutmode>
    <logicalmonitor>
      <x>0</x>
      <y>0</y>
      <primary>yes</primary>
      <monitor>
        <monitorspec>
          <connector>HDMI-1</connector>
          <vendor>MetaProduct's Inc.</vendor>
          <product>MetaMonitor</product>
          <serial>0x123456</serial>
        </monitorspec>
        <mode>
          <width>1920</width>
          <height>1080</height>
          <rate>60.000</rate>
        </mode>
        <rgbrange>full</rgbrange>
      </monitor>
    </logicalmonitor>
  </configuration>
</monitors>
注意
  • 如果在任何其他方式中重新排列显示器或更改显示设置,则可能会将不包含 <rgbrange>full</rgbrange> 标签的新布局添加到 monitors.xml 文件中。为了确保 RGB 范围在不同布局中保持一致设置,请考虑将该标签添加到逻辑监视器的每个重复条目中。
  • 如果 GDM 登录屏幕未使用全 RGB 范围,请将用户的 monitors.xml 复制到 gdm 的主目录。请参阅 GDM#设置默认显示器设置

修复 X11/Xorg 的颜色

# xrandr --output NAME_OF_YOUR_OUTPUT --set "Broadcast RGB" "Full"

另请参阅