Hardware Matlab falha OpenGL no Ubuntu 16.04.3 - Não é possível inicializar recursos compartilhados

0

Primeiro, minhas informações do sistema:

  • 4.13.0-26-genérico # 29 ~ 16.04.2-Ubuntu SMP Ter Jan 9 22:00:44 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux
  • Instalação limpa do Matlab R2016b (64 bits)
  • Placa de vídeo: AMD / ATI Pitcairn PRO (Radeon HD 7850)

Problemas com a instalação do Vanilla

Então, eu inicio o Matlab a partir da linha de comando sem argumentos. Eu configurei duas variáveis de ambiente, LIBGL_DEBUG=verbose e MESA_DEBUG=1 , para obter impressões detalhadas de quaisquer bugs. O software é iniciado sem erros. Em seguida, eu emito um comando de plotagem simples:

plot(1,1, 'b*'); grid on;

O Matlab cria o enredo com sucesso, mas emite uma série de erros, dizendo que houve um erro gráfico de baixo nível. Na linha de comando, vejo as seguintes mensagens:

libGL: pci id for fd 570: 1002:6819, driver radeonsi
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/tls/radeonsi_dri.so
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so
libGL: dlopen /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so failed (/opt/local/MATLAB/R2016b/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6: version 'GLIBCXX_3.4.21' not found (required by /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so))

Existem muitos mais, mas o resultado final é o mesmo: o linker não pode carregar os drivers gráficos com o libstdc ++. então o arquivo Matlab foi carregado. Para corrigir esse problema, renomeio as bibliotecas relevantes que vêm com o Matlab para forçá-lo a usar as bibliotecas do sistema (que incluem a versão GLIBCXX_3.4.21 ):

cd /opt/local/MATLAB/R2016b/sys/os/glnxa64
mv libstdc++.so.6 libstdc++.so.6.bak
mv libstdc++.so.6.0.20 libstdc++.so.6.0.20.bak

Problemas com a instalação modificada

Com as bibliotecas C ++ renomeadas para forçar o Matlab a se vincular às bibliotecas do sistema, eu reinicio o Matlab. As variáveis de ambiente ainda estão definidas, portanto, qualquer erro de libgl ou mesa deve ser reportado ao terminal. Imediatamente após o início do programa, recebo o seguinte erro no Matlab:

com.jogamp.opengl.GLException: X11GLXDrawableFactory - Could not initialize shared resources for X11GraphicsDevice[type .x11, connection :1, unitID 0, handle 0x0, owner false, ResourceToolkitLock[obj 0x7c1bc33e, isOwner false, <2af5b1a, 46860956>[count 0, qsz 0, owner <NULL>]]]
    at jogamp.opengl.x11.glx.X11GLXDrawableFactory$SharedResourceImplementation.createSharedResource(X11GLXDrawableFactory.java:326)
at jogamp.opengl.SharedResourceRunner.run(SharedResourceRunner.java:297)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.java:688)
at jogamp.opengl.GLContextImpl.makeCurrent(GLContextImpl.java:580)
at jogamp.opengl.x11.glx.X11GLXDrawableFactory$SharedResourceImplementation.createSharedResource(X11GLXDrawableFactory.java:297)
... 2 more
Exception in thread "Startup Class Loader" java.lang.InternalError: XXX0 profile[1]: GL3bc -> profileImpl GL4bc !!! not mapped 
at com.jogamp.opengl.GLProfile.computeProfileMap(GLProfile.java:2047)
at com.jogamp.opengl.GLProfile.initProfilesForDeviceCritical(GLProfile.java:1917)
at com.jogamp.opengl.GLProfile.initProfilesForDevice(GLProfile.java:1866)
at com.jogamp.opengl.GLProfile.initProfilesForDefaultDevices(GLProfile.java:1835)
at com.jogamp.opengl.GLProfile.access$000(GLProfile.java:79)
at com.jogamp.opengl.GLProfile$1.run(GLProfile.java:229)
at java.security.AccessController.doPrivileged(Native Method)
at com.jogamp.opengl.GLProfile.initSingleton(GLProfile.java:215)
at com.mathworks.hg.peer.JavaSceneServerPeer.initializeJOGL(JavaSceneServerPeer.java:147)
at com.mathworks.hg.peer.JavaSceneServerPeer.<clinit>(JavaSceneServerPeer.java:117)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at com.mathworks.mde.desk.StartupClassLoader.loadClass(StartupClassLoader.java:262)
at com.mathworks.mde.desk.StartupClassLoader.access$900(StartupClassLoader.java:25)
at com.mathworks.mde.desk.StartupClassLoader$2.run(StartupClassLoader.java:248)
at java.lang.Thread.run(Unknown Source)

Além disso, as seguintes mensagens são exibidas na saída do Terminal:

libGL: pci id for fd 570: 1002:6819, driver radeonsi
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/tls/radeonsi_dri.so
libGL: OpenDriver: trying /usr/lib/x86_64-linux-gnu/dri/radeonsi_dri.so
libGL: Using DRI3 for screen 0

Estas mensagens não indicam problemas; parece que o objeto radeonsi_dri foi carregado com sucesso. Quando tento o mesmo comando de plotagem acima, recebo a seguinte mensagem no Matlab:

Caught unexpected fl::except::IInternalException

A figura mostra uma imagem vazia; o enredo não foi criado.

Outras notas

  • Eu também tentei renomear a biblioteca libgcc_s.so.1 no diretório do Matlab para que ele use a versão do sistema, mas isso não muda nada.
  • Não há erros (EE) no meu arquivo Xorg.0.log
  • Eu testei com sucesso o OpenGL e a placa de vídeo com glmark2 , ou seja, o OpenGL funciona muito bem com a aceleração de hardware na minha máquina, mas o Matlab tem alguns problemas.
  • O Matlab R2016b é fornecido com libGL.so.1.6.0 (em R2016b/sys/opengl/lib/glnxa64 ), mas minha versão do SO é libGL.so.1.2.0 ). Isso poderia causar um problema? Eu tentei renomear os arquivos libGL enviados com o Matlab para forçá-lo a usar as versões do sistema, mas as mensagens de erro ainda são as mesmas.
  • Com os arquivos libstdc ++ modificados, posso executar o Matlab no modo de software openGL por meio do comando matlab -softwareopengl . A plotagem funciona bem, embora Mesa exiba o aviso / erro, User error: GL_INVALID_ENUM in glGetIntegerv(pname=GL_MAJOR_VERSION)
por AndrewCox 20.01.2018 / 01:44

1 resposta

0

Esta solução é originária do meu postagem idêntica no fórum do Matlab. Como descoberto por outros no fórum do Matlab, isso parece ser um bug em jogl relacionado à detecção dos drivers do Mesa por correspondência de strings para "Gallium" na string glRenderer. O pessoal do Mesa aparentemente implementou recentemente uma mudança em como o driver / versão de código aberto é relatado.

O passo 1 (abaixo) só precisa ser completado uma vez, enquanto os passos 2, 3, 4 devem ser preenchidos para cada versão do Matlab instalado em sua máquina.

  1. Instale a biblioteca libjogl2 de ponta:
#Add Xenial-Proposed repository (necessary as of Feb. 2018)
sudo sh -c "echo 'deb http://archive.ubuntu.com/ubuntu/ \
xenial-proposed restricted main multiverse universe' \
> /etc/apt/sources.list.d/xenial-proposed.list"

sudo apt update -y

# ONLY INSTALL THE FOLLOWING from xenial-proposed!
# (you don't want to upgrade ALL your packages to bleeding-edge)
sudo apt install -y libjogl2-java/xenial-proposed #includes libjogl2-jni

# REMOVE XENIAL-PROPOSED to avoid unwanted updates to other packages
sudo rm /etc/apt/sources.list.d/xenial-proposed.list
sudo apt update -y
  1. Renomear arquivos da biblioteca padrão C ++ (repetido acima, acima). Isso garante que os drivers gráficos sejam carregados com a mesma biblioteca padrão que eles precisam, em vez daqueles que o Matlab vem junto.
cd $matlabroot/sys/os/glnxa64
mv libstdc++.so.6 libstdc++.so.6.bak
mv libstdc++.so.6.0.20 libstdc++.so.6.0.20.bak
  1. Altere os arquivos classpath.txt e librarypath.txt em $matlabroot/toolbox/local . Usando meus caminhos originais, esse caminho se expande para /opt/local/MATLAB/R2017b/toolbox/local

    • Em classpath.txt , localize e comente as duas linhas a seguir:
$matlabroot/java/jarext/gluegen-rt.jar
$matlabroot/java/jarext/jogl-all.jar

E substitua-os pelos seguintes

/usr/share/java/jogl2.jar
/usr/share/java/gluegen2-rt.jar
  • Em librarypath.txt , adicione uma nova linha no final do arquivo com
/usr/lib/jni
  1. De acordo com o script original fornecido acima, o Matlab agora deve ser executado sem erros. No entanto, para garantir que as bibliotecas incluídas padrão não interfiram, renomeie as seguintes bibliotecas em $matlabroot/bin/glnxa64 :
cd $matlabroot/bin/glnxa64
sudo mv libjogl_desktop.so libjogl_desktop.so.bak
sudo mv libgluegen-rt.so libgluegen-rt.so.bak
sudo mv libnativewindow_awt.so libnativewindow_awt.so.bak
sudo mv libnativewindow_x11.so libnativewindow_x11.so.bak

Por fim, em $matlabroot/toolbox/local/classpath renomeie o arquivo 3p_jogl :

cd $matlabroot/toolbox/local/classpath
sudo mv 3p_jogl.jcp 3p_jogl.jcp.bak

E é isso! Problema resolvido! Espero que esses pacotes propostos pelo Xenial sejam lançados no ramo estável em um futuro não muito distante.

    
por 10.02.2018 / 00:03