Acelerando vídeo por hardware (UVD) con tarjetas AMD ATI en Debian Jessie y Stretch

viernes, mayo 01, 2015 0 Comments



Introducción:

Las ventajas de la aceleración de vídeo por GPU frente a la CPU son evidentes, la GPU lo hace más rápido y mejor, utilizando un menor consumo. 
En linux también nos podemos aprovechar de esta ventaja, para ello disponemos e dos alternativas, usando el driver propietario o usando el driver OpenSource (Radeon)
En este artículo habláramos de como lograrlo con el driver de código abierto conocido como Radeon.

Instalando el firmware necesario para cada tarjeta:



Cada tarjeta gráfica usa un firmware diferente, y no todos están incluidos en el repositorio de Debian, con lo cual en el caso de que parte de ellos no estén disponibles, tendremos que descargarlos uno a uno.
Tened en cuenta que si tenemos descargado todo el firmware necesario, la aceleración por GPU no funcionará.
Para ello, gracias a Gentoo Linux, disponemos de una tabla que nos ayudará a identificarlo de un modo muy sencillo:


FamilyChipset nameProduct nameFirmware
R600R600, RV610, RV630, RV620, RV635, RV670HD2400-2900, HD3450-3870radeon/R600_rlc.bin radeon/R600_uvd.bin
RS780, RS880HD3200, HD3300, HD4200radeon/R600_rlc.bin radeon/RS780_uvd.bin
R700RV710HD4300, HD4500radeon/R700_rlc.bin radeon/RV710_smc.bin radeon/RV710_uvd.bin
RV730HD4600, HD5100, HD500Vradeon/R700_rlc.bin radeon/RV730_smc.bin radeon/RV710_uvd.bin
RV740HD4770radeon/R700_rlc.bin radeon/RV740_smc.bin radeon/RV710_uvd.bin
RV790, RV770HD4730, HD4830-HD4890radeon/R700_rlc.bin radeon/RV770_smc.bin radeon/RV770_uvd.bin
EvergreenCEDARHD5450, HD6350, HD7350, R5 220radeon/CEDAR_me.bin radeon/CEDAR_pfp.bin radeon/CEDAR_rlc.bin radeon/CEDAR_smc.bin radeon/CYPRESS_uvd.bin
REDWOODHD5550, HD5570, HD5670radeon/REDWOOD_me.bin radeon/REDWOOD_pfp.bin radeon/REDWOOD_rlc.bin radeon/REDWOOD_smc.bin radeon/CYPRESS_uvd.bin
JUNIPERHD5750, HD5770radeon/JUNIPER_me.bin radeon/JUNIPER_pfp.bin radeon/JUNIPER_rlc.bin radeon/JUNIPER_smc.bin radeon/CYPRESS_uvd.bin
CYPRESSHD5830, HD5850, HD5870, HD5970radeon/CYPRESS_me.bin radeon/CYPRESS_pfp.bin radeon/CYPRESS_rlc.bin radeon/CYPRESS_smc.bin radeon/CYPRESS_uvd.bin
PALM (Wrestler)HD6250, HD6310, HD7310, HD7340radeon/PALM_me.bin radeon/PALM_pfp.bin radeon/SUMO_rlc.bin radeon/SUMO_uvd.bin
SUMOHD6290, HD6320, HD6480Gradeon/SUMO_me.bin radeon/SUMO_pfp.bin radeon/SUMO_rlc.bin radeon/SUMO_uvd.bin
SUMO2HD6370D, HD6410Dradeon/SUMO2_me.bin radeon/SUMO2_pfp.bin radeon/SUMO_rlc.bin radeon/SUMO_uvd.bin
Northern IslandsCAICOSHD6450, HD64xxM, R5 235, R5 235Xradeon/BTC_rlc.bin radeon/CAICOS_mc.bin radeon/CAICOS_me.bin radeon/CAICOS_pfp.bin radeon/CAICOS_smc.bin radeon/SUMO_uvd.bin
TURKSHD6570, HD6670, HD7550M/7570M/7650Mradeon/BTC_rlc.bin radeon/TURKS_mc.bin radeon/TURKS_me.bin radeon/TURKS_pfp.bin radeon/TURKS_smc.bin radeon/SUMO_uvd.bin
BARTSHD6790, HD6850, HD6870, HD67xxMradeon/BTC_rlc.bin radeon/BARTS_mc.bin radeon/BARTS_me.bin radeon/BARTS_pfp.bin radeon/BARTS_smc.bin radeon/SUMO_uvd.bin
CAYMANHD6950, HD6970, HD6990, HD69xxMradeon/CAYMAN_mc.bin radeon/CAYMAN_me.bin radeon/CAYMAN_pfp.bin radeon/CAYMAN_rlc.bin radeon/CAYMAN_smc.bin radeon/SUMO_uvd.bin
ARUBAHD7400D/G, HD7500D/G, HD7600D/G, HD7660D, HD8310G, HD8410G-HD8670Gradeon/ARUBA_me.bin radeon/ARUBA_pfp.bin radeon/ARUBA_rlc.bin radeon/TAHITI_uvd.bin
Southern IslandsCAPE VERDEHD7750, HD7770, R7 250XKernel 3.16 and older: radeon/VERDE_ce.bin radeon/VERDE_mc.bin radeon/VERDE_mc2.bin radeon/VERDE_me.bin radeon/VERDE_pfp.bin radeon/VERDE_rlc.bin radeon/VERDE_smc.bin radeon/TAHITI_uvd.bin
Kernel 3.17 and newer: radeon/verde_ce.bin radeon/verde_mc.bin radeon/verde_me.bin radeon/verde_pfp.bin radeon/verde_rlc.bin radeon/verde_smc.bin radeon/TAHITI_uvd.bin
PITCAIRNHD7800, R9 270XKernel 3.16 and older:radeon/PITCAIRN_ce.bin radeon/PITCAIRN_mc.bin radeon/PITCAIRN_mc2.bin radeon/PITCAIRN_me.bin radeon/PITCAIRN_pfp.bin radeon/PITCAIRN_rlc.bin radeon/PITCAIRN_smc.bin radeon/TAHITI_uvd.bin
Kernel 3.17 and newer:radeon/pitcairn_ce.bin radeon/pitcairn_mc.bin radeon/pitcairn_me.bin radeon/pitcairn_pfp.bin radeon/pitcairn_rlc.bin radeon/pitcairn_smc.bin radeon/TAHITI_uvd.bin
TAHITIHD7870 XT, HD7900, R9 280XKernel 3.16 and older:radeon/TAHITI_ce.bin radeon/TAHITI_mc.bin radeon/TAHITI_mc2.bin radeon/TAHITI_me.bin radeon/TAHITI_pfp.bin radeon/TAHITI_rlc.bin radeon/TAHITI_smc.bin radeon/TAHITI_uvd.bin
Kernel 3.17 and newer:radeon/tahiti_ce.bin radeon/tahiti_mc.bin radeon/tahiti_me.bin radeon/tahiti_pfp.bin radeon/tahiti_rlc.bin radeon/tahiti_smc.bin radeon/TAHITI_uvd.bin
OLANDHD8550M-HD8790M, R7 240, R7 250Kernel 3.16 and older:radeon/OLAND_ce.bin radeon/OLAND_mc.bin radeon/OLAND_mc2.bin radeon/OLAND_me.bin radeon/OLAND_pfp.bin radeon/OLAND_rlc.bin radeon/OLAND_smc.bin radeon/TAHITI_uvd.bin
Kernel 3.17 and newer:radeon/oland_ce.bin radeon/oland_mc.bin radeon/oland_me.bin radeon/oland_pfp.bin radeon/oland_rlc.bin radeon/oland_smc.bin radeon/TAHITI_uvd.bin
HAINANHD8970MKernel 3.16 and older:radeon/HAINAN_ce.bin radeon/HAINAN_mc.bin radeon/HAINAN_mc2.bin radeon/HAINAN_me.bin radeon/HAINAN_pfp.bin radeon/HAINAN_rlc.bin radeon/HAINAN_smc.bin radeon/TAHITI_uvd.bin
Kernel 3.17 and newer:radeon/hainan_ce.bin radeon/hainan_mc.bin radeon/hainan_me.bin radeon/hainan_pfp.bin radeon/hainan_rlc.bin radeon/hainan_smc.bin radeon/TAHITI_uvd.bin
Sea IslandsBONAIREHD7790, R7 260, R7 260XKernel 3.16 and older:radeon/BONAIRE_ce.bin radeon/BONAIRE_mc.bin radeon/BONAIRE_mc2.bin radeon/BONAIRE_me.bin radeon/BONAIRE_mec.bin radeon/BONAIRE_pfp.bin radeon/BONAIRE_rlc.bin radeon/BONAIRE_sdma.bin radeon/BONAIRE_smc.bin radeon/BONAIRE_uvd.bin radeon/BONAIRE_vce.bin
Kernel 3.17 and newer:radeon/bonaire_ce.bin radeon/bonaire_mc.bin radeon/bonaire_me.bin radeon/bonaire_mec.bin radeon/bonaire_pfp.bin radeon/bonaire_rlc.bin radeon/bonaire_sdma.bin radeon/bonaire_smc.bin radeon/BONAIRE_uvd.bin radeon/BONAIRE_vce.bin
KABINIHD8180-HD8400Kernel 3.16 and older:radeon/KABINI_ce.bin radeon/KABINI_me.bin radeon/KABINI_mec.bin radeon/KABINI_pfp.bin radeon/KABINI_rlc.bin radeon/KABINI_sdma.bin radeon/BONAIRE_uvd.bin radeon/BONAIRE_vce.bin
Kernel 3.17 and newer:radeon/kabini_ce.bin radeon/kabini_me.bin radeon/kabini_mec.bin radeon/kabini_pfp.bin radeon/kabini_rlc.bin radeon/kabini_sdma.bin radeon/BONAIRE_uvd.bin radeon/BONAIRE_vce.bin
KAVERIKernel 3.16 and older:radeon/KAVERI_ce.bin radeon/KAVERI_me.bin radeon/KAVERI_mec.bin radeon/KAVERI_pfp.bin radeon/KAVERI_rlc.bin radeon/KAVERI_sdma.bin radeon/BONAIRE_uvd.bin radeon/BONAIRE_vce.bin
Kernel 3.17 and newer:radeon/kaveri_ce.bin radeon/kaveri_me.bin radeon/kaveri_mec2.bin radeon/kaveri_mec.bin radeon/kaveri_pfp.bin radeon/kaveri_rlc.bin radeon/kaveri_sdma.bin radeon/BONAIRE_uvd.bin radeon/BONAIRE_vce.bin
HAWAIIR9 290, R9 290XKernel 3.16 and older:radeon/HAWAII_ce.bin radeon/HAWAII_mc.bin radeon/HAWAII_mc2.bin radeon/HAWAII_me.bin radeon/HAWAII_mec.bin radeon/HAWAII_pfp.bin radeon/HAWAII_rlc.bin radeon/HAWAII_sdma.bin radeon/HAWAII_smc.bin radeon/BONAIRE_uvd.bin radeon/BONAIRE_vce.bin
Kernel 3.17 and newer:radeon/hawaii_ce.bin radeon/hawaii_mc.bin radeon/hawaii_me.bin radeon/hawaii_mec.bin radeon/hawaii_pfp.bin radeon/hawaii_rlc.bin radeon/hawaii_sdma.bin radeon/hawaii_smc.bin radeon/BONAIRE_uvd.bin radeon/BONAIRE_vce.bin
MULLINSKernel 3.16 and older:radeon/MULLINS_ce.bin radeon/MULLINS_me.bin radeon/MULLINS_mec.bin radeon/MULLINS_pfp.bin radeon/MULLINS_rlc.bin radeon/MULLINS_sdma.bin radeon/BONAIRE_uvd.bin radeon/BONAIRE_vce.bin
Kernel 3.17 and newer:radeon/mullins_ce.bin radeon/mullins_me.bin radeon/mullins_mec.bin radeon/mullins_pfp.bin radeon/mullins_rlc.bin radeon/mullins_sdma.bin radeon/BONAIRE_uvd.bin radeon/BONAIRE_vce.bin

Una vez tenemos localizado el nombre de los archivos que necesitamos, procedemos a instalar el firmware de la tarjeta:
apt-get install firmware-linux-nonfree
Ahora vamos a ver si todo está correcto, vamos a la siguiente ruta :
/lib/firmware/radeon
y comprobamos disponemos de todos los ficheros necesarios, en caso negativo tendremos que ir a la siguiente url y descargar el que nos falta, por descontado queda que debemos copiarlo dentro de la carpeta radeon.

Comprobando el kernel:


Necesitamos comprobar la versión del kernel a partir de la cual UVD está soportado para nuestro modelo de tarjeta. Por citar un ejemplo, para los chips RV770, RS780/880, R6xx requieren como mínimo usar un kernel 3.18, si el kernel es inferior no funcionará el UVD aunque si el driver 2D y 3D.
Para ello debemos ir a la página oficial del driver y comprobarlo en la tabla
Instalando software:


En este punto ya deberíamos de tener el kernel y el firmware configurados. Ahora es el turno del software. UVD usa la API de vdpau, con lo cual vamos a necesitar instalarlo en el caso de que no lo tengamos:

apt-get install xserver-xorg-video-radeon vdpauinfo mesa-vdpau-drivers libvdpau-dev libvdpau1 vdpau-va-driver 

También necesitaremos un reproductor de vídeo que soporte vdpau, yo utilizo MPV y es el que recomiendo para hacer las pruebas. No recomiendo en absoluto mplayer o mplayer2 porque en las versiones estables que se encuentran en Debian os dará problemas con LibVA.

apt-get install mpv
Tened en cuenta que tenemos que reiniciar el sistema para que esto funcione, ya que el firmware se carga en el arranque.
Comprobando con vdpauinfo:

Antes de nada vamos a lanzar el comando vdpauinfo el cual nos debería devolver una salida como esta:



Si nos fijamos, nos muestra los diferentes formatos de vídeo que puede decodificar por hardware nuestra tarjeta, así como las resoluciones máximas a las que es capaz mostrarlas, si no muestra una salida como esta o da algún error, revisar los puntos anteriores y sobre todo las dependencias.

Configurando MPV:



Ahora vamos a intentar de reproducir un vídeo usando la GPU:

mpv -vo vdpau --hwdec=vdpau nombre-del-fichero-de-video.mkv
Si no obtenemos ningún error en la consola veremos que sale algo como esto:

Trying to use hardware decoding.
AO: [pulse] 48000Hz stereo 2ch float
VO: [vdpau] 1920x800 => 1920x800 vdpau
quiere decir que estamos usando UVD, notaremos que el consumo de la CPU ha bajado de modo muy notable.
Pero si queremos ejecutar los vídeos haciendo doble click con el ratón desde el sistema gráfico, tendremos que añadir un par de líneas al fichero de configuración de MPV, para que lo que la orden que hemos escrito anteriormente la ejecute de modo automática.

Dentro de nuestro home de usuario ~/:

nano -w .config/mpv/mpv.conf
y añadimos estas dos líneas:

vo=vdpau 
hwdec=vdpau
también lo podemos editar con un editor gráfico como gedit si es que nos es más cómodo.
si queremos consultar que más opciones podemos añadir tenemos toda la documentación disponible aquí.
BUGS:

En el caso de que uses una GPU del tipo RV620, RV630, RS780, RS880 existe un bug que o bien deja un pantallazo negro o bien bloquea el equipo pasado unos minutos de reproducción.

Para resolver el problema consulta este artículo:

http://www.sargo.es/2015/05/gpu-hangs-using-uvd-hardware.html

0 comentarios: