lts24-lts26-upgrade: Firefox renders on CPU on NVIDIA after the upgrade

The mozillateam Firefox package enforces its own AppArmor profile,
which shadows Ubuntu's unconfined stub and keeps gfxtest away from the
NVIDIA driver, so Firefox falls back to software WebRender. Note how to
prove it with aa-exec, disable the profile, and enable hardware video
decoding via nvidia-vaapi-driver from the menu entry and XFCE helper.
This commit is contained in:
4aiman 2026-11-08 12:40:09 +03:00
commit 85d00e3234

View file

@ -0,0 +1,79 @@
# firefox на nvidia - рисует процессором, видео 30 fps
После апгрейда ютуб в фаерфоксе (deb из PPA mozillateam, 159) стал дёргаться: 60, потом хрясь - 30. Хоть 1080, хоть 2К, хоть в отдельном плеере.<br>
Композитор не виноват: счётчик кадров в моём xfwm4 показывал, что он ни разу не опоздал - просто фаерфокс сам отдавал 16-48 кадров.
В `about:support` -> Графика:
```
Композитинг WebRender (Software)
OPENGL_COMPOSITING ... FEATURE_FAILURE_GLXTEST_FAILED
X11_EGL ... glxtest could not use EGL
```
То есть вся страница и видео рисуются процессором. Флаги в about:config (`gfx.webrender.all` и компания) тут не помогают - фаер честно пишет "force enabled by pref", а потом всё равно уходит в софтвар.
## Причина - аппармор
На 26.04 пакет фаерфокса из mozillateam тащит свой профиль `/etc/apparmor.d/usr.bin.firefox` в режиме enforce. Он называется так же (`firefox`), как пустышка Убунты `/etc/apparmor.d/firefox` (там `flags=(unconfined)`), и перебивает её. Смотреть надо не на файл, а на то, что загружено - в выводе фаера из терминала видно `label="firefox (enforce)"`.
В профиле есть доступ к mesa, а к nvidia - нет. Фаер при старте гоняет тест графики `gfxtest`, тот под профилем не может открыть драйвер - и всё, чёрный список на всё ускорение.
Проверить без гаданий:
```
/usr/lib/firefox/gfxtest glx
```
```
aa-exec -p firefox -- /usr/lib/firefox/gfxtest glx
```
Первое видит RTX и OpenGL 4.6, второе пишет `libEGL initialize failed`. Вот и весь диагноз.
Добавить в `local/usr.bin.firefox` строку `include <abstractions/opengl>` - не помогает: драйвер ещё лезет пересоздавать `/dev/char/195:*`. Ковырять профиль по одному правилу смысла нет, отключаем:
```
sudo ln -s /etc/apparmor.d/usr.bin.firefox /etc/apparmor.d/disable/usr.bin.firefox
```
```
sudo apparmor_parser -R /etc/apparmor.d/usr.bin.firefox
```
```
sudo apparmor_parser -r /etc/apparmor.d/firefox
```
Фаер перезапустить полностью. Бонусом в `about:support` -> Песочница "Пользовательские пространства имён" становится true.
Вернуть как было:
```
sudo rm /etc/apparmor.d/disable/usr.bin.firefox && sudo apparmor_parser -r /etc/apparmor.d/usr.bin.firefox
```
## about:config
```
gfx.webrender.all true
gfx.webrender.software false
gfx.x11-egl.force-enabled true
widget.dmabuf.force-enabled true
media.hardware-video-decoding.force-enabled true
```
`gfx.webrender.software.opengl` не трогать - это про то, как выводить картинку, которую всё равно нарисовал процессор.
## Декодирование видео на видеокарте
После аппармора рисует уже видюха, но видео всё ещё декодирует проц (процесс `rdd` ~40% CPU). В about:support:
```
HARDWARE_VIDEO_DECODING ... FEATURE_HARDWARE_VIDEO_DECODING_NO_LINUX_NVIDIA
```
Это чёрный список самого фаера, force-enabled его не перебивает. Нужен `nvidia-vaapi-driver` и две переменные (из README драйвера):
```
LIBVA_DRIVER_NAME=nvidia MOZ_DISABLE_RDD_SANDBOX=1 firefox
```
Вторая снимает песочницу с процесса декодера - без неё драйвер в нём не заводится.
Чтобы не запускать из терминала - копия ярлыка в `~/.local/share/applications/firefox.desktop` (перекрывает системный, обновления её не трогают), во всех трёх `Exec=`:
```
Exec=env LIBVA_DRIVER_NAME=nvidia MOZ_DISABLE_RDD_SANDBOX=1 firefox %u
```
И для ссылок из других программ, если фаер стоит браузером по умолчанию в XFCE, - копия помощника `~/.local/share/xfce4/helpers/firefox.desktop`:
```
X-XFCE-Commands=env LIBVA_DRIVER_NAME=nvidia MOZ_DISABLE_RDD_SANDBOX=1 %B;
X-XFCE-CommandsWithParameter=env LIBVA_DRIVER_NAME=nvidia MOZ_DISABLE_RDD_SANDBOX=1 %B "%s";
```
Итог: основной процесс фаера 84% -> 32% CPU, декодер 42% -> 9%, видюха декодирует, ровные 60.