Vediamo come usare la grafica ibrida AMD / Intel su linux, senza riavviare X!
Buongiorno a tutti; come molti sanno, linux è un ottimo sistema operativo per portatili, ma l'introduzione nel 2010/2011 delle tecnologie di grafica ibrida MUXLess da parte dei produttori hanno messo un po' in difficoltà i produttori di drivers Open-Source, sia per AMD che per Nvidia.
La grafica ibrida consiste nell'avere non una, ma 2 schede video sullo stesso portatile, in modo da poter passare dall'una all'altra a seconda delle necessità: mobilità o prestazioni.
Quella appena descritta è la cosiddetta Grafica Ibrida MUXed cioè dotata di un multiplexer che permette di scambiare "fisicamente" l'ingresso dello schermo da una scheda all'altra.
Purtroppo è stata introdotta anche la cosiddetta tecnologia MUXLess, dove la scheda integrata è permanentemente collegata allo schermo, mentre una seconda scheda ha il solo obiettivo di effettuare delle elaborazioni per poi mandare i risultati su schermo tramite la scheda integrata.
In questo articolo vedremo come usare quest'ultima tecnologia con i Driver OpenSource di Linux per le schede AMD ed Intel, rispettivamente i cosiddetti driver Intel e Radeon (da non confondere con Fglrx o FireGL i quali sono i driver proprietari di AMD)
Materiale Necessario
Sono necessari alcuni programmi per poter usare la nostra scheda più potente, la maggior parte dei quali sono già inclusi nella maggior parte delle distribuzioni:
- I Driver della scheda video integrata (su gentoo: xf86-video-intel)
- I Driver della scheda video "discreta" (su gentoo: xf86-video-ati)
- XRandr
- Il supporto nel kernel per i driver intel, radeon e lo switching delle schede tramite VGASwitcheroo
- Opzione di Esposizione del filesystem di debug (debugfs) attiva nel kernel
- Mesa, libdrm e tutti gli strumenti classici per far funzionare le schede grafiche
Entriamo in azione!
Per prima cosa verifichiamo che la nostra scheda AMD sia attiva con
cat /sys/kernel/debug/vgaswitcheroo/switch
Se ritorna un risultato del genere:
0:IGD:+:Pwr:0000:00:02.0 1:DIS: :Off:0000:01:00.0
La scheda AMD è spenta, (si nota da DIS: :Off), ed è necessario attivarla tramite il comando:
echo ON > /sys/kernel/debug/vgaswitcheroo/switch
Un secondo cat ci darà il risultato che volevamo:
0:IGD:+:Pwr:0000:00:02.0 1:DIS: : Pwr:0000:01:00.0
Ora facciamo in modo che i dati generati dalla scheda AMD vengano ridirezionati alla scheda Intel, usiamo il comando:
xrandr --listproviders
che ci darà un risultato simile a questo:
Providers: number : 2 Provider 0: id: 0x7b cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 3 outputs: 5 associated providers: 1 name:Intel Provider 1: id: 0x53 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 4 outputs: 0 associated providers: 1 name:radeon
Annotiamo l'id delle due schede e proseguiamo.
Nel caso xrandr visualizzasse un solo provider assicuratevi che non vi siano script all'avvio che disattivino la scheda AMD, a volte può succedere che uno script all'avvio spenga la scheda prima che X riesca a rilevarla, così Xrandr non riesce ad includerla fra i provider disponibili.
Ora diamo il "comando magico":
xrandr --setprovideroffloadsink <id radeon> <id intel>
nel mio caso:
xrandr --setprovideroffloadsink 0x53 0x7b
Bene, il più è fatto, ora per usare la scheda discreta è sufficiente avviare il programma voluto da linea di comando, preceduto da DRI_PRIME=1.
Il test
Per testare la scheda ho voluto usare gli strumenti di mesa-progs.
Prima il test campione, fatto sulla scheda integrata:
glxgears -info
Con il seguente risultato
Running synchronized to the vertical refresh. The framerate should be approximately the same as the monitor refresh rate. GL_RENDERER = Mesa DRI Intel(R) Sandybridge Mobile GL_VERSION = 3.0 Mesa 9.2.4 GL_VENDOR = Intel Open Source Technology Center GL_EXTENSIONS = GL_ARB_multisample G [...] GL_ARB_texture_storage_multisample
302 frames in 5.0 seconds = 60.392 FPS
300 frames in 5.0 seconds = 59.879 FPS
Come si vede da GL_RENDERER, il render è effettuato dalla scheda integrata Intel, aggiungendo la variabile DRI_PRIME=1, il risultato cambia, e non poco:
DRI_PRIME=1 glxgears -info
Running synchronized to the vertical refresh. The framerate should be approximately the same as the monitor refresh rate. GL_RENDERER = Gallium 0.4 on AMD CAICOS GL_VERSION = 3.0 Mesa 9.2.4 GL_VENDOR = X.Org GL_EXTENSIONS = GL_ARB_multisample [...] GL_ARB_texture_storage_multisample 15677 frames in 5.0 seconds = 3135.300 FPS 15597 frames in 5.0 seconds = 3119.350 FPS
Questa volta, GL_RENDERER ci assicura che il rendering è fatto dalla scheda AMD, con microcodici CAICOS tramite Gallium versione 0.4, un'altra cosa che ci assicura il funzionamento della scheda è l'aumento dei frame per secondo e la ventola che gira talmente forte che sembra che stia per partire un jet dal nostro portatile, a meno che il vostro sistema di raffreddamento non sia un pochino più efficiente del mio.
Quando avete finito, potete nuovamente disattivare la scheda con
echo OFF > /sys/kernel/debug/vgaswitcheroo/switch
per poter risparmiare batteria ed evitare di avere una stufetta per le mani.
Questo è quanto.
Buon divertimento a tutti!
Saluti e alla prossima
Penaz.