Como fazer o Unity 3D funcionar com o Bumblebee usando o chipset Intel

3

Eu tenho um laptop Sony VAIO S com o temido Optimus e finalmente consegui que o Bumblebee trabalhasse totalmente no Ubuntu 12.04 para que eu pudesse utilizar tanto a aceleração de hardware do chipset Intel quanto a da Nvidia via optirun e / ou bumble-app-settings.

No entanto, os efeitos da área de trabalho não funcionam. Mas eles deveriam, eu me lembro vagamente que eles trabalharam por um tempo antes de eu ter o Bumblebee instalado.

Isso é o que recebo com o teste de suporte:

:~$ /usr/lib/nux/unity_support_test -p
Xlib:  extension "NV-GLX" missing on display ":0".
OpenGL vendor string:   Tungsten Graphics, Inc
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Mobile 
OpenGL version string:  1.4 (2.1 Mesa 8.0.2)

Not software rendered:    yes
Not blacklisted:          yes
GLX fbconfig:             yes
GLX texture from pixmap:  yes
GL npot or rect textures: yes
GL vertex program:        yes
GL fragment program:      yes
GL vertex buffer object:  no
GL framebuffer object:    yes
GL version is 1.4+:       yes

Unity 3D supported:       no

Primeiro de tudo, eu duvido que o chipset não suporte VBOs (essencialmente um recurso padrão no GL).

Nem o Xorg.0.log nem o Xorg.8.log mostram nenhum erro em particular.

Quanto aos drivers Nvidia: Para que eles funcionassem, eu tive que instalar os drivers 304.22 (os mais antigos não funcionariam). Eles atacaram o libglx.so, então eu restabeleci o libglx.so xserver-xorg-core em seu lugar original, movi o libglx.so da Nvidia para uma pasta específica da nvidia e especifiquei essa pasta no bumblebee.config. Isso parece funcionar e não deve causar o problema que vejo aqui.

Por diversão, eu tentei usar o chipset da Nvidia para o Unity, mas também não voou:

~$ optirun /usr/lib/nux/unity_support_test -p
OpenGL vendor string:   NVIDIA Corporation
OpenGL renderer string: GeForce GT 640M LE/PCIe/SSE2
OpenGL version string:  4.2.0 NVIDIA 304.22

Not software rendered:    yes
Not blacklisted:          yes
GLX fbconfig:             yes
GLX texture from pixmap:  no
GL npot or rect textures: yes
GL vertex program:        yes
GL fragment program:      yes
GL vertex buffer object:  yes
GL framebuffer object:    yes
GL version is 1.4+:       yes

Unity 3D supported:       no
    
por EboMike 03.08.2012 / 11:02

1 resposta

2

O problema era com libGL.so.1 - aparentemente, o instalador da Nvidia também removeu o Intel e o substituiu por seu próprio.

Então eu peguei de libgl1-mesa-glx e mudei o symlink em / usr / lib para apontar para ele.

Eu não vou entrar em detalhes sobre como configurar o Bumblebee, mas há algumas partes importantes que estão faltando e que não estão realmente documentadas:

  1. O instalador do driver Nvidia provavelmente destruirá seu libglx.so existente (em / usr / lib / xorg / modules / extensions) e libGL.so (em / usr / lib). Retroceda-os antes de instalar o driver. Se você já os perdeu, você poderia recuperá-los resintalling xserver-xorg-core e libgl1-mesa-glx, mas quando tentei pela primeira vez, ele deixou meu laptop em um estado ruim (tela preta após o login, tive que ir para a recuperação), então eu recomendo obtê-los manualmente via dpkg-deb.

  2. Depois de instalar o driver da Nvidia, você notará que a Nvidia substituiu os dois arquivos listados acima por links simbólicos para as bibliotecas da Nvidia. No meu caso, por exemplo, libglx.so é um link simbólico para libglx.so.304.22.

  3. Como o Bumblebee precisa dos dois drivers, e como ele só pode diferenciar por diretório, deixe os drivers de movimento de cada adaptador gráfico em um diretório separado. O instalador da Nvidia que eu usei instalou alguns drivers em / usr / lib / nvidia-current, vamos usar isso. Tenha em mente que precisamos separar bibliotecas e módulos Xorg. Aqui estão onde eu coloquei os arquivos relevantes:

Em / usr / lib:

libGL.so.304.22   -- Nvidia's driver (unchanged where the installer put it)
libGL.so          -- symlink to libGL.so.1
libGL.so.1        -- symlink to /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1,
                     i.e. the libgl1-mesa-glx driver

Em / usr / lib / x86_64-linux-gnu / mesa:

libGL.so.1   -- symlink to libGL.so.1.2
libGL.so.1.2 -- The normal driver from libgl1-mesa-glx 

Em / usr / lib / nvidia-current:

libGL.so   -- symlink to libGL.so.1
libGL.so.1 -- symlink to /usr/lib/libGL.so.304.22 (i.e. Nvidia's driver)

Em / usr / lib / nvidia-current / xorg:

libglx.so -- symlink to /usr/lib/xorg/modules/extensions/libglx.so.304.22

Em / usr / lib / xorg / modules / extensions:

libglx.so.1       -- symlink to libglx.so.xserver
libglx.so.304.22  -- Nvidia's driver (unchanged from where the installer put it)
libglx.so.xserver -- I renamed the original libglx.so to that and put it here

Finalmente, precisamos modificar o /etc/bumblebee/bumbleebee.conf para informar ao sistema onde encontrar os drivers da Nvidia. Eu estou usando o driver nvidia (em oposição ao nouveau), então na seção nvidia, eu estou usando isso:

KernelDriver=nvidia
Module=nvidia
PMMethod=auto
# colon-separated path to the nvidia libraries
LibraryPath=/usr/lib/nvidia-current:/usr/lib32/nvidia-current
# comma-separated path of the directory containing nvidia_drv.so and the
# default Xorg modules path
XorgModulePath=/usr/lib/nvidia-current/xorg,/usr/lib/xorg/modules

Observe como o LibraryPath e o XorgModulePath apontam para os drivers da Nvidia, portanto, se o Bumblebee estiver procurando por eles, ele os encontrará. Se o Unity estiver procurando por eles, ele irá procurar em / usr / lib e / usr / lib / xorg / modules / extensions, e nós nos certificamos que esses links simbolizem os não-Nvidia.

Isso é possivelmente um pouco desajeitado em alguns lugares, mas o que posso dizer? Funciona perfeitamente:

O Unity 3D funciona com efeitos completos de desktop, e eles são rápidos, mas ainda usam o chipset Intel lento e que economiza energia. A aceleração 3D normal está disponível para aplicativos como o VirtualBox. optirun funciona, e eu tenho a opção de executar "glxspheres" (a ~ 60 fps) ou "optirun glxspheres" (a ~ 120 fps).

    
por EboMike 03.08.2012 / 11:39