На самом деле всё прекрасно, просто хочется странного. Раньше были проблемы с тем, что браузер несколько раз в минуту лагал. В этот момент внизу появлялась плашечка «Ожидание кэша...». Из-за этого, видео приходилось смотреть в стороннем плеере, потому что, хоть и плавно воспроизводилось, но потом вставало на паузу на несколько секунд, чтобы потом снова начало воспроизводиться плавно.
Сейчас быстрая флешка быстро кэширует, а блок питания на 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 работал только под управлением открытого драйвера.