mittorn/virglrenderer-android

virgl-overlay app crashes on Android 10

Opened this issue · 11 comments

Hello,
I am trying to get virgl working on ExaGear on my Android 10 phone but I am having some trouble to get it working properly.
I noticed that the virgl-overlay app crashes on Android 10 (Xiaomi Black Shark 3, Snapdragon 865) and Android Studio reports a crash on the process p1.
This is the crash log:
https://cdn.discordapp.com/attachments/344928388265279501/776389879105585172/virgl-crash.txt

I then tested the app on my Galaxy S5 with Android 7 (Lineage OS) and there it works properly (I tested it on the S5 with an armhf Ubuntu chroot and glxgears/glmark2 and I also ran it successfully on ExaGear).
Interestingly, virgl-overlay works fine when I run it on my Black Shark 3 through VMOS, an Android 7 VM on Android.
Another problem that I am experiencing is that the OpenGL performance is very low when I run virgl through a TCP socket, it is much slower than software rendering (LLVMpipe) would be.

Here is a test that I performed on the Black Shark 3 with virgl-overlay running in VMOS and ExaGear running natively:
https://www.youtube.com/watch?v=3exEFyv-Aq0

It works for me only on Nvidia Shield and does not show good performance. It failed to draw anything on mali720 and crashes on adreno 305 when creating second opengl context (need for blitter), so only able to run glxgears. Original virgl seems only support mesa. It even do not work with amdgpu-pro driver and shows very bad performance on different drivers, Original implementations use drm extensions directly not even alowing to run it on non-mesa driver.
Other issue is multiprocess renderer. virgl need multiple contexts, but we cannot share surfaces between processes (ok, since android 8 we can, but it was developed to 7 and earlier. I just not implemented it because stopped any work on it)
I think, it's better to implement zink renderer or proxy for gles2/3 with gl4es (and angle on renderer optionally).
Android emulators and vmos already have some glue to translate gles between processes.
What about android 10? It seems to break libc compatibility. It was build on termux with some custom toolchain, build it with usual ndk toolchain should help. Or using LD_PRELOAD with some library which implements __aeabi_idiv,

Thanks for the more detailed information.
Zink seems to be a good idea but at the moment it doesn't seem to have been ported to Android (and unfortunately I don't have the necessary coding/graphics API knowledge to port it on my own), but I will keep an eye on the project.
Would android-gl-streaming (https://github.com/khanhduytran0/android-gl-streaming) combined with GL4ES (or Regal) be a good idea as far as the GLES-proxy with a GL to GLES wrapper idea is concerned?
I was also thinking of another solution but I am not sure if it would work: Newer Android versions seem to use DRM/KMS (I can see a /dev/dri/card0 device on my Android 10 phone), so could I make a chroot and then compile Mesa with Freedreno and DRM arguments to get 3D acceleration that way? Afterwards I could install box86 and Wine to get the same functionality that ExaGear provides, just with hopefully working 3D acceleration.

zink should be compatible with android as mesa supports android, but it:s not easy to build.
gl-streaming is good idea, but it supports very small subset and needs to be extended.
Real devices almost do not use drm/kms except of custom mainline kernels

There us cropengl (used in virtualbox) and some wrapper used in android emulators and vmos. It is more complete than gl-streaming

Здравствуйте!
Могу я узнать, какую версию Mesa Вы использовали для сборки libGL.so.1-i386.1 для VirGL? Модифицировали ли Вы код Mesa? Я пытаюсь воспроизвести Ваш результат, но если применить параметры meson, указанные Вами:
meson . build -Dgallium-va=false -Ddri-drivers= -Dgallium-drivers=virgl -Ddri3=false -Dvulkan-drivers= -Dglx=gallium-xlib -Dplatforms=x11 -Dtools
то meson даже не дает сконфигурировать сборку, выдавая ошибку "Gallium-xlib based GLX requires softpipe or llvmpipe".
При попытке обойти это, сборка оканчивается ошибками на этапе линковки.

https://github.com/mittorn/mesa
Здесь. Я сначала заставил его собираться без llvmpipe, потом добавил shm ring и костыль чтобы определять координаты окна и смещать соотвтественно оверлей.
к сожалению оно у меня нормально ни на одном устройстве не заработало. glxgears можно заставить рисоваться много где, а что-то сложнее уже нет.

Спасибо! У меня на Pocophone F1 (Android 9) в Exagear через VTEST_SOCK= работают тесты glxgears, glmark2, а также почти все тесты directx: EnvMapping+DX9 (Cubemap.exe и Spheremap.exe), DolphinVS+DX8 (DolphinVS.exe) и даже завелся "тяжелый" тест AquaMark3 (правда с багами текстур).
https://www.youtube.com/watch?v=snHB3q9wPt4
https://www.youtube.com/watch?v=Pyx9m1ub9Xc
Однако тест OpenGL (например wglgears.exe) показывает черный экран, а другие программы вообще не определяют рендер OpenGL и вылетают.

На днях почитал тему на 4pda, там GFOXSH описывает аналогичную проблему с программным рендером Mesa, т.е. работает в принципе все, кроме .exe'шных OpenGL-тестов. Решением оказалось закомментировать две строки в коде, которые делали return GL_FALSE. Возможно и здесь аналогичный случай?
https://4pda.ru/forum/index.php?s=&showtopic=992239&view=findpost&p=98035515

Upd: действительно, проблема была в этих двух строках кода. Пересобрал libGL, теперь запускается wglgears.exe, Furmark.exe. Большое Вам спасибо за Ваш труд!

Значит , на современных устройствах virgl более полезен. Но всё равно 10fps
Лучше заюзать то, что используется для проброса графики в эмуляторах андройда и поверх него gl4es

Для прикола запустил Furmark в разрешении 800x600 на своем ноутбуке с AMD Radeon R5 M430 и с win10 - выдало 8 fps.
https://thumbsnap.com/i/nStDL75Z.jpg
VirGL с Exagear выдал 10 fps. Не знаю, насколько корректно это сравнивать, но производительность как минимум на уровне ноутбуков начального уровня)

Но нрутбуки начального уровня очень слабые.
чтобы нормально юзать это с exagear надо интегрировать как-то с wine чтобы получать координаты, размеры окна и мыши и пересчитывать. Я это всё делал с расчётом на использование вместе с иксами под exagear desktop. Впрочем, принципиальной разницы нет.
можно ещё ring попытаться заюзать, но для этого понадобится доступный пользователю shm. Без root можно реализовать, но придётся как-то взаимодействоватьтс эмулятором ipc который испрльзуется в exagear. ashmem под exagear не работает.

Доброго дня! Я смог пересобрать virgl-overlay.apk вместе с кодом для нативной библиотеки при помощи Android Studio.
На двух устройствах с Android 10 приложение работает. Также работает на Android 9.
Разрешите ли Вы как автор выложить apk и проект, к примеру на 4pda, чтобы другие люди смогли попробовать?