LINUX.ORG.RU

Raspberry Pi 3B, браузер, старый драйвер

 , , , ,


0

2

На самом деле всё прекрасно, просто хочется странного. Раньше были проблемы с тем, что браузер несколько раз в минуту лагал. В этот момент внизу появлялась плашечка «Ожидание кэша...». Из-за этого, видео приходилось смотреть в стороннем плеере, потому что, хоть и плавно воспроизводилось, но потом вставало на паузу на несколько секунд, чтобы потом снова начало воспроизводиться плавно.

Сейчас быстрая флешка быстро кэширует, а блок питания на 2,4 А. от Belkin выдаёт стабильную работу без значка молнии, символизирующем «Under-voltage» и троттлинг. Работает аппаратное ускорение - причём как OpenGL для скроллинга страниц, так и OpenMAX (или MMAL) для видео (на RPi 3 поддерживается только h264). Короче, всё прекрасно.

Вопрос в следующем. Есть два видеодрайвера, открытый и закрытый. Закрытый драйвер использовался с момента релиза устройства в 2012 году под управлением Raspbian 7. В ноябре 2017 года прилетело обновление, добавляющее открытый драйвер в актуальный на тот момент Raspbian 8. Начиная с Raspbian 9, открытый драйвер используется по умолчанию. Однако даже в Raspbian 10 есть выбор между драйверами (старый драйвер обозначен как Legacy).

У меня нет никаких результатов бенчмарков. У меня есть лишь две нативные игры, скомпилированные с закрытым драйвером - это ioquake3 и SuperTuxKart, и по субъективному ощущению, на закрытом драйвере лучше. И ещё мне кажется, что проприетарный драйвер, это тот самый драйвер, который используется в Android-смартфонах на чипах VideoCore IV. Драйвер адаптирован для работы в x11 вместо сервера, который используется в Андроиде вместо «иксов».

В общем, мне хочется использовать Legacy-драйвер, потому что, во-первых, его по-прежнему можно выбрать, во-вторых, по субъективному ощущению он быстрее, в-третьих раз уж его используют в Android, значит написание драйвера завершено на 100% самим производителем, тогда как драйвер из состава Mesa ещё нет.

Единственная прога, в которой я пользуюсь ускорением, это браузер. При переключении на проприетарный драйвер, продолжает работать ускорение h264 (как оказалось, открытый драйвер пока что не включает в себя аппаратное ускорение, и поэтому используется OpenMAX из закрытого драйвера, а именно - библиотеки из /opt/vc/lib/). А вот ускорение OpenGL не работает. Из-за этого скроллинг страниц грузит CPU, а интерфейс YouTube, рисуемый через Canvas, тормозит (хорошо что интерфейс исчезает, когда мышку не трогаешь).

Так вот. В открытом драйвере доступны как OpenGL и GLX, так и OpenGL ES и EGL. В проприетарном доступны только OpenGL ES и EGL. Причём EGL используется не месовская библиотека libEGL.so.1, а проприетарная libEGL.so из директории /opt/vc/lib/. Да, именно .so, без суффикса. Прям как в -dev пакете. Также в открытом драйвере некоторые расширения OpenGL реализованы на CPU, потому что отсутствуют в GPU (GPU изначально мобильный). Потом всё недостающее добавили в VideoCore VI.

Переключаюсь на проприетарный драйвер. Браузер говорит «нет OpenGL, работаю через llvmpipe». Ага, это попытка воспользоваться месовской libGL.so.1. Запускаю с параметром --use-gl=egl, чтобы заставить его использовать OpenGL ES вместо OpenGL. То же самое. Тогда я иду в /usr/lib/ и вместо библиотеки libEGL.so.1 делаю симлинк на приприетарный libEGL.so, то же самое проделываю с libGLESv2.so.2 => /opt/vc/lib/libGLESv2.so

Теперь браузер говорит «нет OpenGL, работаю через SwiftShader». Ого. То есть теперь программный рендеринг осуществляется не силами Mesa, а силами браузера (у него где-то есть библиотека SwiftShader).

При этом - в логах вот это:

[4374:4374:1206/045723.497716:ERROR:gl_surface_egl.cc(943)] EGL display query failed with error EGL_SUCCESS
[4374:4374:1206/045723.498296:ERROR:gl_surface_egl.cc(957)] eglInitialize Default failed with error EGL_BAD_DISPLAY
[4374:4374:1206/045723.498442:ERROR:gl_initializer_x11.cc(154)] GLSurfaceEGL::InitializeOneOff failed.
[4374:4374:1206/045723.517910:ERROR:viz_main_impl.cc(170)] Exiting GPU process due to errors during initialization

Гуглил, искал, что за ошибка такая. Нашёл тред 5-летней давности, что такая ошибка была на GPU Mali 400, и пофиксилась этим патчем. У кого-нибудь получилось заставить работать Chromium с Legacy-драйвером, и как? Я бы проверил патч, но на столь медленном CPU и 1 Гб памяти боюсь, что не скомпилируется.

Браузер - едва ли не единственная прога, которая использует OpenGL ES. Игр у меня, можно сказать, нет. Можно ли как-то сделать так, чтобы он определял, какой именно драйвер сейчас активен, открытый или закрытый, и уже на основе этого выбирал, или с Mesa ему работать, или с /opt/vc/lib/libbrcmEGL.so? И вообще, нормально ли это, что бинарник, предназначенный для одного OpenGL ES, не работает с другим OpenGL ES? Я думал, OpenGL как раз стирает границы между производителями разных «железок» и развязывает руки производителям софта... Хм, а Qt5-софт работает с обоими драйверами нормально.

Разработчики софтины jogl вывели алгоритм, позволяющий определить, какой драйвер сейчас активен. Это можно косвенно определить по наличию/отсутствию файлов библиотек и блочных устройств - например если есть файл /dev/dri/card0, значит используется открытый драйвер.

P.S. На гибтахе проприетарного драйвера пишут, что в него добавлена поддержка VideoCore VI. Изначально же, новый GPU работал только под управлением открытого драйвера.

★★★★★

Последнее исправление: ZenitharChampion (всего исправлений: 1)

Legacy-драйвер не интегрирован с X11. X11 и legacy-драйвер выводят изображения на разные слои GPU (см. dispmanx), программы использующие legacy-драйвер не зависят от X11 и могут работать даже если X11 не запущен. Для того чтобы браузер мог работать с legacy-драйвером необходимо весь графический вывод делать напрямую, без X11. Нагугливаются попытки сделать это, например, https://forums.balena.io/t/fullscreen-webkit-browser-with-hw-accelerated-css-webgl-and-html5-video-on-the-raspberrypi-3/741 , не знаю насколько это работоспособно. В моих OpenGL-поделках legacy-драйвер был в 2-3 раза быстрее нового драйвера.

No ★★
()
Ответ на: комментарий от No

Спасибо. Очень интересная информация.

Так вот почему с проприетарным нельзя ни Alt-Tab-нуться, ни сделать Ctrl-Alt-F1, в тот момент, когда активно OpenGL ES-приложение (такое как Quake, демосцена какая-нибудь, или omxplayer). Ну, с другой стороны, в этом есть и плюс. Видео воспроизводится без тиринга.

ZenitharChampion ★★★★★
() автор топика
Последнее исправление: ZenitharChampion (всего исправлений: 3)
Ответ на: комментарий от No

Смотри. А вот ты говоришь, что проприетарный OpenGL ES умеет работать только на полный экран. Но в дистрибутиве Raspbian есть игра Minecraft for Raspberry Pi, которая работает в окне. Правда, позиционирование окна почему-то неправильное (игра рисуется поверх своей же рамки).

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от anonymous

> Не подскажешь, что включить в ядро, чтобы youtube шустрее проигрывался?

По какой-то причине, YouTube у меня начал тормозить. Я не знаю из-за чего. Браузер Chromium 84, а плагин h264ify установлен (он предустановлен в дистр). Когда я нажимаю «показать информацию для сисадмина», он показывает, что используется мультимедиа-кодек av1. Неужели плагин h264ify не работает?

Я попробовал плагины h264ify-extended и «not yet, AV1». Ничего не поменялось. Смотрю видео в 240p :-(

ZenitharChampion ★★★★★
() автор топика
Последнее исправление: ZenitharChampion (всего исправлений: 1)
Ответ на: комментарий от anonymous

Вот как скачивать видео с YouTube, сжатые кодеком h264

Как посмотреть, какие качества видео и аудио доступны

Если youtube-dl лежит в /usr/bin/youtube-dl

youtube-dl -F https://www.youtube.com/watch?v=видео-ID

или:

youtube-dl -F видео-ID

Если youtube-dl лежит в /home/pi/Downloads

cd ~/Downloads
python youtube-dl -F https://www.youtube.com/watch?v=видео-ID

Вы получите список доступных форматов. Как правило, нас интересует номер 22 (h264 720p). Скачать можно так:

python youtube-dl -f 22 https://www.youtube.com/watch?v=видео-ID

Без параметра «-f 22» будет скачиваться рекомендуемый формат (VP9 + opus).

Просмотр видео на YouTube в качестве 720p, не скачивая его (1080p нельзя, только скачивать)

omxplayer -o hdmi `youtube-dl -g -f 22 https://www.youtube.com/watch?v=видео-ID`

Параметр «-o hdmi» отправляет звук на hdmi. omxplayer плюёт на общесистемные настройки, и выводит звук по умолчанию на разъём для наушников, даже если в микшере указан вывод звука по умолчанию через HDMI.

Просмотр видео на YouTube в качестве 1080p, скачивая его

python youtube-dl -f 137+140 https://www.youtube.com/watch?v=видео-ID
vlc название_файла.mp4

Согласно выводу команды -F, 137 это «video only», а 140 это «audio only». 137+140 скачает их оба, а ffmpeg их объединит с «-c copy».

Просмотр стрима на YouTube

omxplayer -o hdmi `youtube-dl -g -f 94 https://www.youtube.com/watch?v=видео-ID`

А вот стримы-то как раз можно и в 1080p смотреть. Правда, если смотреть в omxplayer, будет задержка, которой не было бы, если бы мы смотрели в браузере. Возможно, плеер буферизирует.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от ZenitharChampion

Когда я нажимаю «показать информацию для сисадмина», он показывает, что используется мультимедиа-кодек av1. Неужели плагин h264ify не работает? Я попробовал плагины h264ify-extended и «not yet, AV1». Ничего не поменялось. Смотрю видео в 240p :-(

Ну типа уже прилично как по времени YouTube для видео в 480 p и ниже отдаёт дефолтом AV1.

И ты не путаешь AVC1 (и есть H.264) с AV1? А то я что-то сомневаюсь, что оно AV1 потянет и в 260p 🙂

fornlr ★★★★★
()
Последнее исправление: fornlr (всего исправлений: 1)
Ответ на: комментарий от fornlr

Они что-то не торопятся вводить этот av1 на самом деле. Проверяю через youtube-dl - только где-то треть видео что я смотрю в него закодировано вообще.

anonymous
()
Ответ на: комментарий от ZenitharChampion

А вот ты говоришь, что проприетарный OpenGL ES умеет работать только на полный экран.

Нет, этого я не говорил, API dispmanx позволяет создавать слои разного размера.

Но в дистрибутиве Raspbian есть игра Minecraft for Raspberry Pi, которая работает в окне. Правда, позиционирование окна почему-то неправильное (игра рисуется поверх своей же рамки).

Другие окна могут перекрывать изображение Minecraft?

No ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.