Android akceleracja 3D w AndroVM z Primusrun?


19

Próbowałem wirtualnej maszyny z Androidem o nazwie androVM na 32-bitowym laptopie Ubuntu 12.04 z hybrydową konfiguracją grafiki Intel / Nvidia jako systemem operacyjnym gościa (szczegóły na temat kart graficznych poniżej). Testowałem niektóre z aplikacji intensywnie korzystających z grafiki, takie jak Angry Birds i AnTuTu, aplikacja do testowania wydajności, działająca virtualboxi działająca AndroVMplayerz primusrun, ale wydają się one bardzo powolne, bez różnicy jak w przypadku uruchamiania bez nich primusrun. Próbowałem również optirun, który po prostu zawiesza się z segfault. Jak mogę włączyć akcelerację OpenGL dla tej maszyny wirtualnej w moim hybrydowym systemie graficznym?

Używana przeze mnie wersja AndroVM to:

androVM_vbox86tp_4.1.1_r6.1-20130222-gapps-houdini-flash.ova

I postępuję zgodnie z instrukcjami instalacji, jak wyjaśniono tutaj:
AndroVM 20130222 release | Blog AndroVM

W Virtualbox mam przełączone opcje grafiki ustawione na 128 MB pamięci wideo i włączoną akcelerację 3D i akcelerację 2D. BIOS mojego hosta ma włączone opcje wirtualizacji. Oto szczegóły mojego sprzętu:

sudo primusrun lshw -class display

*-display               
   description: VGA compatible controller
   product: GT218 [GeForce 310M]
   vendor: NVIDIA Corporation
   physical id: 0
   bus info: pci@0000:01:00.0
   version: a2
   width: 64 bits
   clock: 33MHz
   capabilities: pm msi pciexpress vga_controller bus_master cap_list rom
   configuration: driver=nvidia latency=0
   resources: irq:16 memory:d2000000-d2ffffff memory:c0000000-cfffffff memory:d0000000-d1ffffff ioport:d000(size=128) memory:d3000000-d307ffff
*-display
   description: VGA compatible controller
   product: Core Processor Integrated Graphics Controller
   vendor: Intel Corporation
   physical id: 2
   bus info: pci@0000:00:02.0
   version: 18
   width: 64 bits
   clock: 33MHz
   capabilities: msi pm vga_controller bus_master cap_list rom
   configuration: driver=i915 latency=0
   resources: irq:52 memory:d3400000-d37fffff memory:b0000000-bfffffff ioport:e080(size=8)

Podczas korzystania optirun ./AndroVMplayerotrzymuję to:

[VGL] WARNING: The OpenGL rendering context obtained on X display
[VGL]    :8 is indirect, which may cause performance to suffer.
[VGL]    If :8 is a local X display, then the framebuffer device
[VGL]    permissions may be set incorrectly.
Got command 1002
Got command 1002
Got command 1
Got command 1002
Segmentation fault (core dumped)

A oto szczegóły mojej instalacji Virtualbox:

 dpkg -l virtualbox* | grep ii    

ii  virtualbox                                4.1.12-dfsg-2ubuntu0.2                               x86 virtualization solution - base binaries
ii  virtualbox-dkms                           4.1.12-dfsg-2ubuntu0.2                               x86 virtualization solution - kernel module sources for dkms
ii  virtualbox-guest-additions                4.1.12-1                                             transitional package for virtualbox-guest-additions-iso
ii  virtualbox-guest-additions-iso            4.1.12-1                                             guest additions iso image for VirtualBox
ii  virtualbox-guest-dkms                     4.1.12-dfsg-2ubuntu0.2                               x86 virtualization solution - guest addition module source for dkms
ii  virtualbox-guest-utils                    4.1.12-dfsg-2ubuntu0.2                               x86 virtualization solution - non-X11 guest utilities
ii  virtualbox-guest-x11                      4.1.12-dfsg-2ubuntu0.2                               x86 virtualization solution - X11 guest utilities
ii  virtualbox-qt                             4.1.12-dfsg-2ubuntu0.2                               x86 virtualization solution - Qt based user interface

Jeśli go uruchomię optirun, pojawia się następujący błąd:

> [VGL] WARNING: The OpenGL rendering context obtained on X display
> [VGL]    :8 is indirect, which may cause performance to suffer. [VGL] 
> If :8 is a local X display, then the framebuffer device [VGL]   
> permissions may be set incorrectly.
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glCompileShader:351
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetShaderiv:1215
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetShaderInfoLog:1238
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetUniformLocation:1382
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glCompileShader:351
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetShaderiv:1215
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetShaderInfoLog:1238
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetUniformLocation:1382
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetUniformLocation:1382
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glCompileShader:351
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetShaderiv:1215
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetShaderInfoLog:1238
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetUniformLocation:1382
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetUniformLocation:1382
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glCompileShader:351
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetShaderiv:1215
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetShaderInfoLog:1238
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetUniformLocation:1382
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetUniformLocation:1382
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetUniformLocation:1382
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glCompileShader:351
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetShaderiv:1215
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetShaderInfoLog:1238
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetUniformLocation:1382
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glGetUniformLocation:1382
> error 0x501
> sdk/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp:glUseProgram:1913
> error 0x501 AndroVMplayer: ../../src/xcb_conn.c:180: write_vec:
> Assertion `!c->out.queue_len' failed. Aborted (core dumped)

Poprawiłem swój wynik do tego, co dostaję podczas działania sudo primusrun lshw -class displayi obie karty się pokazują. Ponadto po uruchomieniu primusrun firefoxuzyskuję około 40-50 fps na tej stronie webglsamples.googlecode.com/hg/aquarium/aquarium.html . Dostaję tylko około 5 klatek na sekundę bez primusrun.
719016

hmmm - być może nie jest to wymagane - czy masz ustawienie włączania sprzętu zdefiniowane w androvm zgodnie z androvm.org/blog/androvm-documentation ?
fossfreedom

Tak, kiedy dzwonię ./AndroVMplayerpo raz pierwszy na nowej maszynie wirtualnej, klikam „Włącz przyspieszenie sprzętowe”.
719016

... i podążałeś za sekcją opengl sprzętu w tym linku, aby skonfigurować sieć i uruchomić ją za pomocą skryptu run.sh - lub wariantu skryptu, który używa primusrun?
fossfreedom

1
Przyspieszenie 2D powinno być wyłączone, metinks. Tylko 3D.
Cubiq,

Odpowiedzi:


1

openGL używa określonych reguł podczas uruchamiania środowiska Android. Nie jestem w stanie odpowiedzieć w pełni na twoje pytanie, ale mogę polecić Ci zestaw deweloperski Androida. developer.android.com/sdk/ Po skonfigurowaniu automatycznie skonfiguruje konfigurację w celu optymalnego wykorzystania renderowania i może udostępnić środowisko 3d z Androidem.


1

Próbujesz GenyMotion . To tylko jedno kliknięcie, aby skonfigurować i działa w trybie x86.

Jest to naprawdę szybki emulator Androida.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.