Chrome accéléré par GPU

11

J'exécute une nouvelle installation de Xubuntu 12.04 et j'aimerais savoir comment activer l'accélération GPU de ma carte nVidia dans le dernier Chromium stable. Je voulais lire un fichier MP4 sans que le CPU ne tire à 100%.

J'ai installé mplayer et vdpau (et ils fonctionnent bien), mais jusqu'à présent, je n'ai pas pu les utiliser dans Chromium. Il y a quelques années, j'ai utilisé gecko-mediaplayer mais le plugin a été mis sur liste noire ...

Des idées?

Voici la sortie 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, 

et voici la sortie de lspci | grep -i vga:

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

Le chrome génère de nombreux avertissements chaque fois que j'ouvre la page, comme vous pouvez le voir ici et je viens de découvrir une piste prometteuse, perdue dans une mer d'avertissements de performances:

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

Après avoir ajouté l'utilisateur au groupe vidéo, Chromium est maintenant incapable de lire du tout les MP4 (ouaip, même pas en utilisant le CPU). J'ai les mêmes messages d'erreur qu'auparavant, mais un nouveau est également apparu:

[4296: 4296: 0827/100001: ERREUR: gpu_video_decode_accelerator.cc (208)] Non implémenté atteint dans le contenu vide :: GpuVideoDecodeAccelerator :: Initialize (media :: VideoCodecProfile, IPC :: Message *) ** Accélération de décodage vidéo HW non disponible **.
João Pereira
la source
Pourquoi votre utilisation du processeur atteint-elle 100%? Même sans HWA (pas de GPU), je peux lire des vidéos mp4 via Google Chrome et l'utilisation du processeur est <20%.
4
Vidéos 1080p sur un ordinateur de 4 ans, 300 $.
João Pereira

Réponses:

7

TL; DR: Sauf si vous avez tout essayé ci - dessous et maintenant vous avez un écran noir frapper ce particulier fixe bug , votre problème devrait être résolu maintenant. Si vous obtenez maintenant:

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.

après avoir essayé tout ci - dessous, alors vous devriez essayer de lancer Chrome / ium avec --disable-gpu-sandboxou --blacklist-accelerated-compositing. Si les problèmes persistent, annuler tous les changements et signaler un bug détaillant ce qui est votre problème, qu'avez-vous essayé, et toutes les données possibles: about:gpu, about:version, les pilotes que vous utilisez, la version du noyau, etc. Pour ceux qui veulent encore tester leur chance, utilisez le commutateur mentionné précédemment, le fait que rencontrez des problèmes avec les cartes AMD, le « Obliger Chrome / ium à utiliser HWA » section fonctionne pour vous. Ceux qui utilisent les pilotes Nvidia ou de Xorg privatifs-ppa-bord, devrait tester avec Firefox et voir si le problème se produit là aussi.

autorisations Nvidia problèmes

NVIDIA: n'a pas pu ouvrir le fichier de périphérique / dev / nvidia0 (opération non autorisée).

Cela signifie que vous n'êtes pas partie du videogroupe. Ceci est résolu aussi facile que vous pourriez être:

sudo adduser Hal video

Redémarrez ensuite votre session et que vous êtes là.

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

Forcing Chrome / ium à utiliser HWA

Vous devriez vérifier votre about:gpusection Chrome / ium. Dans l'accélération HW ancien PC est désactivé par défaut et vous ne pouvez l'activer en remplaçant les paramètres du about:flags.

  • Ouvrez le about:flagsdans votre barre d'adresse
  • Rechercher la liste de redéfinition du logiciel Override
  • Cliquez sur « Activer »
  • Redémarrer Chrome / ium

Vous pouvez également démarrer le chrome en utilisant chrome --ignore-gpu-blacklistmais d' avoir à le faire à chaque fois est pas idéal.

Ceci est ma page GPU

Ceci est mon drapeaux

Braiam
la source
1
Eh bien, j'ai activé la "liste de rendu logiciel de remplacement" dans chrome: // gpu, rouvert chrome et ouvert une page locale contenant une balise vidéo HTML5 intégrée (la source est un MP4) mais le CPU se porte toujours bien à plus de 100%. Ensuite, j'ai installé gecko-mediaplayer, redémarré et rouvert chrome avec le paramètre ignore blacklist mais pas de chance aussi. D'autres idées? Mon statut des fonctionnalités graphiques est identique au vôtre.
João Pereira
Je ne sais pas si le décodage vidéo fonctionne réellement. J'utilise Chrome 29 sur Ubuntu 12.04 et je vois "Le décodage vidéo accéléré n'est pas disponible sur Mac et Linux .: 137247, 133828", donc je suis surpris de voir que vous l'avez obtenu en "Accélération matérielle".
gertvdijk
Maintenant, si seulement nous pouvions faire en sorte que Chromium mette son argent là où se trouve sa bouche ...
João Pereira
1
@Braiam Désolé si je n'étais pas vraiment clair - cela me le montre aussi, mais il semble que cela ne fonctionne pas comme indiqué dans la sortie "problèmes détectés" (lorsque désactivé les options de forçage). Voir aussi le rapport de bogue ( code.google.com/p/chromium/issues/detail?id=137247 )
gertvdijk
1
@gertvdijk Oui, j'ai déjà vu ce rapport. En fait, c'est une politique assez stupide: nous n'aimons pas les rapports de bogues, donc nous activons (vraiment) lentement les cartes que nous pensons ne pas avoir de problèmes (qui sont la minorité) et laissons les utilisateurs qui ont des cartes qui pourraient fonctionner très bien fonctionner avec seulement 0,1% de leurs performances réelles.
Braiam
0

Solution de décodage vidéo sous linux / chrome:

La fonction GpuVideoDecodeAccelerator a été désactivée dans le code chrome linux pendant quelques mois (sauf pour ChromiumOS évidemment), vous devrez donc patcher du chrome comme ceci:

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

ou utilisez ce super PPA:

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

Testé avec libva sur Intel SandyBridge pour H264, fonctionne très bien. Je ne sais pas pour VP8.

Comme demandé ici est le patch complet:

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
la source
1
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
madmike
Ce que je voulais dire était d'inclure les étapes sur la façon d'obtenir la source, appliquer le patch et le compiler. Ou comment apt-ajouter le PPA et installer le navigateur.
madmike