GPU driver
As duas pilhas gráficas da imagem, qual delas inicia e como trocar
A imagem traz dois jeitos de controlar a Mali-G31: o driver binário da ARM (libmali no espaço de usuário, mali_kbase no kernel) e o Mesa 26.1.3 com o driver Gallium Panfrost. Os dois são compilados e instalados, e só um fica ativo por vez.
O sistema inicia com a libmali. Esse é o padrão atual, não o Panfrost.
Por que a libmali é o padrão hoje
A chave gpu.driver não vem escrita no system.cfg da imagem, então numa instalação nova o script de boot encontra o valor vazio e grava libmali ele mesmo.
O seletor também está escondido de propósito. O EmulationStation só mostra a linha GPU DRIVER quando existe /usr/bin/gpudriver, e o ArchR instala esse auxiliar em /usr/lib/archr/gpudriver. O motivo registrado no pacote é que o caminho do Panfrost ainda não é confiável nas placas clone de RK3326: em algumas delas o probe trava o kernel, e o mali_kbase não pode ser descarregado com segurança para se recuperar disso. Enquanto isso não estiver resolvido, a troca fica fora do menu.
Trocar mesmo assim
Por SSH, edite /storage/.config/system/configs/system.cfg e coloque:
gpu.driver=panfrostDepois reinicie. Para voltar, escreva libmali no mesmo lugar. Não há mais nada a mudar: o script de boot lê essa única chave.
O que acontece no boot
Um gancho de autostart roda /usr/lib/archr/gpudriver --start, que:
- Lê
gpu.driver, usandolibmaliquando está vazio. - Carrega o módulo de kernel correspondente,
mali_kbaseoupanfrost. - Monta por bind as bibliotecas de GL correspondentes. Para a libmali isso significa
/usr/lib/mali/*por cima dolibEGL.so, dolibGLESv2.soe companhia do Mesa, mais/dev/nullpor cima dolibGL.sopara nada pegar o Mesa por engano. Para o Panfrost ele desfaz tudo isso, e o Mesa volta a aparecer. - Confere se o driver realmente se ligou: existe uma placa DRM, existe o nó específico do driver (
/sys/bus/platform/drivers/panfrost/*.gpuou/dev/mali0) e pelo menos um conector respondeconnected. - Se essa checagem falha, ele carrega o outro driver e salva esse como o novo
gpu.driver, de modo que você termina com uma tela funcionando em vez de uma tela preta.
Tudo o que ele faz vai para /storage/.config/gpudriver.log, que sobrevive a reinicializações. Com o Panfrost selecionado, ele também guarda ali as mensagens do kernel em volta do probe.
Proteção contra boot loop
Antes de mexer no driver, o script grava o nome do driver em /storage/.config/gpudriver.attempting com escrita síncrona, e apaga o arquivo assim que o driver sobe. Se ele ainda estiver lá no boot seguinte, é porque a tentativa anterior travou a placa antes de conseguir se recuperar, então o script força libmali e reescreve a configuração. É isso que impede um probe ruim do Panfrost de virar um ciclo infinito de reinício.
As diferenças que importam
| libmali | Panfrost | |
|---|---|---|
| Origem | Driver binário da ARM, versão g24p0 para a G31 | Mesa 26.1.3, código aberto |
| Lado do kernel | mali_kbase, fora da árvore | panfrost, no kernel mainline |
| API | OpenGL ES | OpenGL e OpenGL ES |
| Vulkan | não nesta placa | não nesta placa |
| Atualizações | o que vier no pacote do fornecedor | acompanha os lançamentos do Mesa |
Nenhum driver Vulkan é compilado para o RK3326, de um jeito nem do outro. O Mesa é configurado com -Dvulkan-drivers= vazio, e o pacote da libmali só instala bibliotecas Vulkan em outros SoCs. Emuladores que procuram por Vulkan aqui não vão achar e caem para GLES.
Ajustes do Mesa
O /etc/profile.d/041-panfrost é lido pelo /etc/profile, então isto chega a todo emulador lançado pelo runemu.sh e pelos scripts start_*.sh:
PAN_MESA_DEBUG=forcepack # empacota atributos de vértice, menos draw calls na G31
MESA_NO_ERROR=1 # emuladores não checam glGetError
MESA_SHADER_CACHE_DIR=/var/cache/mesa
MESA_SHADER_CACHE_MAX_SIZE=128MBO /var/cache/mesa é um link para /storage/.cache/mesa_shader_cache, então o cache de shaders sobrevive ao reinício.
O /etc/profile.d/mali-priority.sh define MALI_SCHED_RT_THREAD_PRIORITY=95 para o caminho da libmali.
Quando dá errado
Tela preta depois de colocar gpu.driver=panfrost. Desligue, tire o cartão, monte a partição de storage num PC e volte para gpu.driver=libmali. Se a placa conseguiu reiniciar sozinha, a sentinela já deve ter feito isso por você.
Você escolheu panfrost e o sistema subiu com libmali. A checagem de bind falhou e o fallback entrou. O /storage/.config/gpudriver.log diz qual das três condições (placa, bind, display) não foi atendida, com as linhas de dmesg correspondentes logo abaixo.
A troca não parece valer na hora. E não vale mesmo. Nenhum dos dois módulos pode ser descarregado com segurança enquanto o outro está rodando, então a mudança só se aplica no próximo boot.