Grafica Ibrida AMD/Intel su linux

Wed 04 December 2013 | in Misc | tags: Linux

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.

social