Cromo acelerado por GPU

11

Estoy ejecutando una nueva instalación de Xubuntu 12.04 y me gustaría saber cómo puedo activar la aceleración de la GPU de mi tarjeta nVidia dentro del último Chromium estable. Quería reproducir un archivo MP4 sin que la CPU disparara al 100%.

He instalado mplayer y vdpau (y funcionan bien), pero hasta ahora no he podido usarlos dentro de Chromium. Hace un par de años, usé gecko-mediaplayer pero el complemento ha sido incluido en la lista negra ...

¿Algunas ideas?

Aquí está la salida de glxinfo | grep render:

direct rendering: Yes
OpenGL renderer string: GeForce GT 520M/PCIe/SSE2
    GL_NV_blend_square, GL_NV_compute_program5, GL_NV_conditional_render, 
    GL_NV_parameter_buffer_object2, GL_NV_path_rendering, 
    GL_NVX_conditional_render, GL_NVX_gpu_memory_info, 

y aquí está la salida de lspci | grep -i vga:

02:00.0 VGA compatible controller: NVIDIA Corporation GF119 [GeForce GT 520M] (rev a1)

Chromium genera muchas advertencias cada vez que abro la página, como puede ver aquí, y acabo de encontrar una pista prometedora, perdida en un mar de advertencias de rendimiento:

NVIDIA: could not open the device file /dev/nvidia0 (Operation not permitted).

Después de agregar al usuario al grupo de video, Chromium ahora no puede reproducir MP4 (sí, ni siquiera usando la CPU). Recibí los mismos mensajes de error que antes, pero también apareció uno nuevo:

[4296: 4296: 0827/100001: ERROR: gpu_video_decode_accelerator.cc (208)] No implementado alcanzado en contenido vacío :: GpuVideoDecodeAccelerator :: Initialize (media :: VideoCodecProfile, IPC :: Message *) ** La aceleración de decodificación de video HW no está disponible **.
João Pereira
fuente
¿Por qué el uso de tu CPU aumenta al 100%? Incluso sin HWA (sin GPU), puedo reproducir videos mp4 a través de Google Chrome y el uso de la CPU es <20%.
44
Videos de 1080p en una computadora de 4 años y 300 $.
João Pereira

Respuestas:

7

TL; DR: a menos que haya intentado todo lo que se muestra a continuación y ahora aparezca una pantalla negra que afecta a este error solucionado en particular , su problema ya debería estar resuelto. Si ahora obtienes:

ERROR:gpu_video_decode_accelerator.cc(208)] Not implemented reached in void content::GpuVideoDecodeAccelerator::Initialize(media::VideoCodecProfile, IPC::Message\*) HW video decode acceleration not available.

después de probar todo lo siguiente, debería intentar iniciar Chrome / ium con --disable-gpu-sandboxo --blacklist-accelerated-compositing. Si los problemas persisten, revertir todos los cambios e informar de un error que detalla lo que es su problema, ¿qué has intentado, y es posible todos los datos: about:gpu, about:version, los conductores que está utilizando, versión del kernel, etc. Para los que todavía quieren poner a prueba su Por suerte, use el interruptor mencionado anteriormente, si tiene problemas con las tarjetas AMD, la sección "Forzar Chrome / ium a usar HWA" funciona para usted. Aquellos que usan controladores privativos de Nvidia o xorg-ppa-edge, deben probar con Firefox y ver si el problema también ocurre allí.

Problemas de permisos de Nvidia

NVIDIA: no se pudo abrir el archivo del dispositivo / dev / nvidia0 (Operación no permitida).

Esto significa que no eres parte del videogrupo. Esto se resuelve tan fácil como podría ser:

sudo adduser Hal video

Luego reinicie su sesión y ya está allí.

Fuente: http://forums.gentoo.org/viewtopic-p-7232328.html?sid=900a2d59cdb52e1a5f530598dfa1be24#7232328

Obligar a Chrome / ium a usar HWA

Deberías consultar tu about:gpusección en Chrome / ium. En las PC más antiguas, la aceleración de hardware está deshabilitada de manera predeterminada y solo puede habilitarla anulando la configuración en about:flags.

  • Abra el about:flagsen su barra de direcciones
  • Busque la lista de redención de software de anulación
  • Haga clic en "Habilitar"
  • Reiniciar Chrome / ium

También puede comenzar a usar Chrome, chrome --ignore-gpu-blacklistpero tener que hacerlo cada vez no es lo ideal.

Esta es mi página de GPU

Estas son mis banderas

Braiam
fuente
1
Bueno, habilité la "lista de renderización de software de anulación" en chrome: // gpu, volví a abrir Chrome y abrí una página local que contenía una etiqueta de video incrustada HTML5 (la fuente es un MP4), pero la CPU todavía está funcionando por encima del 100%. Luego, instalé gecko-mediaplayer, reinicié y volví a abrir el cromo con el parámetro ignorar lista negra, pero no tuve tanta suerte. ¿Alguna otra idea? El estado de mis características gráficas es idéntico al tuyo.
João Pereira
No estoy seguro de si la decodificación de video realmente funciona. Estoy ejecutando Chrome 29 en Ubuntu 12.04 y veo "La decodificación de video acelerada no está disponible en Mac y Linux .: 137247, 133828", así que me sorprende ver que lo tienes en "Hardware acelerado".
gertvdijk
Ahora, si pudiéramos hacer que Chromium ponga su dinero donde está su boca ...
João Pereira
1
@Braiam Lo siento si no estaba realmente claro, también me lo muestra, pero parece que no funciona como se muestra en la salida "problemas detectados" (cuando se desactivan las opciones de forzado). Consulte también el informe de error ( code.google.com/p/chromium/issues/detail?id=137247 )
gertvdijk
1
@gertvdijk Sí, he visto ese informe antes. En realidad, es una política bastante tonta: no nos gustan los informes de errores, por lo que (realmente) activamos lentamente las tarjetas que creemos que no tienen problemas (que son minoritarios) y dejamos a los usuarios que tienen tarjetas que podrían funcionar bien correr con solo el 0.1% de su rendimiento real.
Braiam
0

Solución para decodificación de video en linux / chromium:

La función GpuVideoDecodeAccelerator se ha deshabilitado en el código linux de chromium durante algunos meses (a excepción de ChromiumOS obviamente), por lo que tendrá que parchear el cromo de esta manera:

https://bazaar.launchpad.net/~saiarcot895/chromium-browser/chromium-browser.utopic.beta/view/head:/debian/patches/enable_vaapi_on_linux.diff

o use este gran PPA:

https://launchpad.net/~saiarcot895/+archive/ubuntu/chromium-beta

Probado con libva en Intel SandyBridge para H264, funciona muy bien. No sé sobre VP8.

Según lo solicitado aquí está el parche completo:

Index: beta.vivid/content/common/gpu/media/gpu_video_decode_accelerator.cc
===================================================================
--- beta.vivid.orig/content/common/gpu/media/gpu_video_decode_accelerator.cc    2014-12-04 09:32:45.344607112 -0500
+++ beta.vivid/content/common/gpu/media/gpu_video_decode_accelerator.cc 2014-12-04 09:32:45.341607169 -0500
@@ -31,7 +31,7 @@
 #elif defined(OS_CHROMEOS) && defined(ARCH_CPU_ARMEL) && defined(USE_X11)
 #include "content/common/gpu/media/v4l2_video_decode_accelerator.h"
 #include "content/common/gpu/media/v4l2_video_device.h"
-#elif defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) && defined(USE_X11)
+#elif (defined(OS_CHROMEOS) || defined(OS_LINUX)) && defined(ARCH_CPU_X86_FAMILY) && defined(USE_X11)
 #include "content/common/gpu/media/vaapi_video_decode_accelerator.h"
 #include "ui/gl/gl_context_glx.h"
 #include "ui/gl/gl_implementation.h"
@@ -272,7 +272,7 @@
       make_context_current_,
       device.Pass(),
       io_message_loop_));
-#elif defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) && defined(USE_X11)
+#elif (defined(OS_CHROMEOS) || defined(OS_LINUX)) && defined(ARCH_CPU_X86_FAMILY) && defined(USE_X11)
   if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL) {
     VLOG(1) << "HW video decode acceleration not available without "
                "DesktopGL (GLX).";
Index: beta.vivid/content/content_common.gypi
===================================================================
--- beta.vivid.orig/content/content_common.gypi 2014-12-04 09:32:45.344607112 -0500
+++ beta.vivid/content/content_common.gypi  2014-12-04 09:32:45.341607169 -0500
@@ -769,7 +769,7 @@
         '<(DEPTH)/third_party/khronos',
       ],
     }],
-    ['target_arch != "arm" and chromeos == 1 and use_x11 == 1', {
+    ['target_arch != "arm" and (chromeos == 1 or desktop_linux == 1) and use_x11 == 1', {
       'dependencies': [
         '../media/media.gyp:media',
         '../third_party/libyuv/libyuv.gyp:libyuv',
Index: beta.vivid/content/content_gpu.gypi
===================================================================
--- beta.vivid.orig/content/content_gpu.gypi    2014-12-04 09:32:45.344607112 -0500
+++ beta.vivid/content/content_gpu.gypi 2014-12-04 09:32:45.341607169 -0500
@@ -40,7 +40,7 @@
         ],
       },
     }],
-    ['target_arch!="arm" and chromeos == 1', {
+    ['target_arch!="arm" and (chromeos == 1 or desktop_linux == 1)', {
       'include_dirs': [
         '<(DEPTH)/third_party/libva',
       ],
Index: beta.vivid/content/content_tests.gypi
===================================================================
--- beta.vivid.orig/content/content_tests.gypi  2014-12-04 09:32:45.344607112 -0500
+++ beta.vivid/content/content_tests.gypi   2014-12-04 09:32:45.342607150 -0500
@@ -1556,7 +1556,7 @@
           },
         ]
     }],
-    ['chromeos==1 and use_x11 == 1 and target_arch != "arm"', {
+    ['(chromeos==1 or desktop_linux==1) and use_x11 == 1 and target_arch != "arm"', {
       'targets': [
           {
             'target_name': 'vaapi_h264_decoder_unittest',
Index: beta.vivid/content/public/common/content_switches.cc
===================================================================
--- beta.vivid.orig/content/public/common/content_switches.cc   2014-12-04 09:32:45.344607112 -0500
+++ beta.vivid/content/public/common/content_switches.cc    2014-12-04 09:32:45.342607150 -0500
@@ -930,7 +930,7 @@
 // Disable web audio API.
 const char kDisableWebAudio[]               = "disable-webaudio";

-#if defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
 // Disables panel fitting (used for mirror mode).
 const char kDisablePanelFitting[]           = "disable-panel-fitting";

Index: beta.vivid/content/public/common/content_switches.h
===================================================================
--- beta.vivid.orig/content/public/common/content_switches.h    2014-12-04 09:32:45.344607112 -0500
+++ beta.vivid/content/public/common/content_switches.h 2014-12-04 09:32:45.342607150 -0500
@@ -268,7 +268,7 @@

 CONTENT_EXPORT extern const char kDisableWebAudio[];

-#if defined(OS_CHROMEOS)
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
 CONTENT_EXPORT extern const char kDisablePanelFitting[];
 CONTENT_EXPORT extern const char kDisableVaapiAcceleratedVideoEncode[];
 #endif
Index: beta.vivid/media/media.gyp
===================================================================
--- beta.vivid.orig/media/media.gyp 2014-12-04 09:32:45.344607112 -0500
+++ beta.vivid/media/media.gyp  2014-12-04 09:32:45.342607150 -0500
@@ -672,7 +672,7 @@
           ],
         }],
         # For VaapiVideoEncodeAccelerator.
-        ['target_arch != "arm" and chromeos == 1 and use_x11 == 1', {
+        ['target_arch != "arm" and (chromeos == 1 or desktop_linux == 1) and use_x11 == 1', {
           'sources': [
             'filters/h264_bitstream_buffer.cc',
             'filters/h264_bitstream_buffer.h',
Index: beta.vivid/gpu/config/software_rendering_list_json.cc
===================================================================
--- beta.vivid.orig/gpu/config/software_rendering_list_json.cc  2014-12-04 09:32:45.344607112 -0500
+++ beta.vivid/gpu/config/software_rendering_list_json.cc   2014-12-04 09:32:45.343607131 -0500
@@ -508,8 +508,8 @@
     },
     {
       "id": 48,
-      "description": "Accelerated video decode is unavailable on Mac and Linux",
-      "cr_bugs": [137247, 133828],
+      "description": "Accelerated video decode is unavailable on Mac",
+      "cr_bugs": [133828],
       "exceptions": [
         {
           "os": {
@@ -525,6 +525,11 @@
           "os": {
             "type": "android"
           }
+        },
+        {
+          "os": {
+            "type": "linux"
+          }
         }
       ],
       "features": [
Index: beta.vivid/content/common/sandbox_linux/bpf_gpu_policy_linux.cc
===================================================================
--- beta.vivid.orig/content/common/sandbox_linux/bpf_gpu_policy_linux.cc    2014-12-04 09:32:45.344607112 -0500
+++ beta.vivid/content/common/sandbox_linux/bpf_gpu_policy_linux.cc 2014-12-04 09:32:45.343607131 -0500
@@ -21,6 +21,8 @@
 #include "base/logging.h"
 #include "base/memory/scoped_ptr.h"
 #include "build/build_config.h"
+// Auto-generated for dlopen libva libraries
+#include "content/common/gpu/media/va_stubs.h"
 #include "content/common/sandbox_linux/sandbox_bpf_base_policy_linux.h"
 #include "content/common/sandbox_linux/sandbox_seccomp_bpf_linux.h"
 #include "content/common/set_process_title.h"
@@ -30,6 +32,8 @@
 #include "sandbox/linux/seccomp-bpf-helpers/syscall_sets.h"
 #include "sandbox/linux/services/linux_syscalls.h"
 #include "sandbox/linux/syscall_broker/broker_process.h"
+#include "third_party/libva/va/va.h"
+#include "third_party/libva/va/va_x11.h"

 using sandbox::BrokerProcess;
 using sandbox::SyscallSets;
@@ -38,6 +42,14 @@
 using sandbox::bpf_dsl::ResultExpr;
 using sandbox::bpf_dsl::Trap;

+using content_common_gpu_media::kModuleVa;
+using content_common_gpu_media::InitializeStubs;
+using content_common_gpu_media::StubPathMap;
+
+// libva-x11 depends on libva, so dlopen libva-x11 is enough
+static const base::FilePath::CharType kVaLib[] =
+    FILE_PATH_LITERAL("libva-x11.so.1");
+
 namespace content {

 namespace {
@@ -238,19 +250,38 @@
     // Accelerated video dlopen()'s some shared objects
     // inside the sandbox, so preload them now.
     if (IsAcceleratedVideoEnabled()) {
-      const char* I965DrvVideoPath = NULL;
+      StubPathMap paths;
+      paths[kModuleVa].push_back(kVaLib);
+      if (!InitializeStubs(paths)) {
+        return false;
+      }

-      if (IsArchitectureX86_64()) {
-        I965DrvVideoPath = "/usr/lib64/va/drivers/i965_drv_video.so";
-      } else if (IsArchitectureI386()) {
-        I965DrvVideoPath = "/usr/lib/va/drivers/i965_drv_video.so";
+      // libva drivers won't get loaded even above two libraries get dlopened.
+      // Thus, libva calls will fail after post sandbox stage.
+      //
+      // To get the va driver loadded before sandboxing, upstream simply dlopen
+      // the hard-coded va driver path because ChromeOS is the only platform
+      // that Google want to support libva.
+      //
+      // While generic linux distros ship va driver as anywhere they want.
+      // Fortunately, the va driver will be loadded when vaInitialize() get
+      // called.
+      // So the following code is to call vaInitialize() before sandboxing.
+      Display* x_display = XOpenDisplay(NULL);
+      VADisplay va_display = vaGetDisplay(x_display);
+      if (!vaDisplayIsValid(va_display)) {
+        DVLOG(1) << "Failed to call vaGetDisplay()";
+        return false;
       }

-      dlopen(I965DrvVideoPath, RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE);
-      dlopen("libva.so.1", RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE);
-      dlopen("libva-x11.so.1", RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE);
-    }
-  }
+      int major_version, minor_version;
+      if (vaInitialize(va_display, &major_version, &minor_version)
+          != VA_STATUS_SUCCESS) {
+        DVLOG(1) << "Failed to call vaInitialize()";
+        return false;
+      }
+    }  // end of IsAcceleratedVideoDecodeEnabled()
+  }  // end of IsArchitectureX86_64() || IsArchitectureI386()

   return true;
 }
Michel Memeteau - EKIMIA
fuente
1
Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
MadMike
Lo que quise decir fue incluir los pasos sobre cómo obtener la fuente, aplicar el parche y compilarlo. O sobre cómo agregar apt-PPA e instalar el navegador.
MadMike