GPU beschleunigte Chrom

11

Ich führe eine Neuinstallation von Xubuntu 12.04 aus und möchte wissen, wie ich die GPU-Beschleunigung meiner nVidia-Karte im neuesten stabilen Chromium aktivieren kann. Ich wollte eine MP4-Datei abspielen, ohne dass die CPU zu 100% ausgelöst wird.

Ich habe mplayer und vdpau installiert (und sie funktionieren einwandfrei), aber bisher konnte ich sie in Chromium nicht verwenden. Vor ein paar Jahren habe ich Gecko-Mediaplayer verwendet, aber das Plugin wurde auf die schwarze Liste gesetzt ...

Irgendwelche Ideen?

Hier ist die Ausgabe von 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, 

und hier ist die Ausgabe von lspci | grep -i vga:

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

Chromium gibt beim Öffnen der Seite viele Warnungen aus , wie Sie hier sehen können, und ich habe gerade einen vielversprechenden Hinweis gefunden, der in einem Meer von Leistungswarnungen verloren gegangen ist:

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

Nach dem Hinzufügen des Benutzers zur Videogruppe kann Chromium jetzt überhaupt keine MP4-Dateien mehr abspielen (ja, nicht einmal mit der CPU). Ich habe die gleichen Fehlermeldungen wie zuvor erhalten, aber es ist auch eine neue aufgetaucht:

[4296: 4296: 0827/100001: FEHLER: gpu_video_decode_accelerator.cc (208)] Nicht implementiert in ungültigem Inhalt erreicht :: GpuVideoDecodeAccelerator :: Initialize (media :: VideoCodecProfile, IPC :: Message *) ** HW-Videodecodierungsbeschleunigung nicht verfügbar **.
João Pereira
quelle
Warum steigt Ihre CPU-Auslastung auf 100%? Auch ohne HWA (keine GPU) kann ich MP4-Videos über Google Chrome abspielen und die CPU-Auslastung beträgt <20%.
4
1080p-Videos auf einem 4 Jahre alten 300-Dollar-Computer.
João Pereira

Antworten:

7

TL; DR: Es sei denn , Sie unten alles versucht haben und Sie jetzt einen schwarzen Bildschirm schlagen diese erhalten insbesondere feste Fehler , Ihr Problem jetzt gelöst werden sollte. Wenn Sie jetzt bekommen:

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.

Nachdem Sie alles unten ausprobiert haben, sollten Sie versuchen, Chrome / ium mit --disable-gpu-sandboxoder zu starten --blacklist-accelerated-compositing. Wenn die Probleme weiterhin bestehen, alle Änderungen rückgängig machen und Fehler melden detailliert , was dein Problem ist, was haben Sie versucht, und alle Daten möglich: about:gpu, about:versiondie Treiber , die Sie verwenden, Kernel - Version, usw. Für diejenigen , die immer noch ihre testen wollen Glücklicherweise verwenden Sie den oben genannten Schalter. Wenn Probleme mit AMD-Karten auftreten, funktioniert der Abschnitt "Erzwingen der Verwendung von HWA durch Chrome / ium" für Sie. Diejenigen, die Nvidia Privatives-Treiber oder den xorg-ppa-edge verwenden, sollten mit Firefox testen und prüfen, ob das Problem auch dort auftritt.

Probleme mit Nvidia-Berechtigungen

NVIDIA: Die Gerätedatei / dev / nvidia0 konnte nicht geöffnet werden (Vorgang nicht zulässig).

Dies bedeutet, dass Sie nicht Teil der videoGruppe sind. Dies ist so einfach wie möglich zu lösen:

sudo adduser Hal video

Starten Sie dann Ihre Sitzung neu und Sie sind da.

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

Erzwingen, dass Chrome / ium HWA verwendet

Sie sollten Ihren about:gpuAbschnitt in Chrome / ium überprüfen . In älteren PCs ist die HW-Beschleunigung standardmäßig deaktiviert und kann nur durch Überschreiben der Einstellungen in aktiviert werden about:flags.

  • Öffnen Sie die about:flagsin Ihrer Adressleiste
  • Suchen Sie nach der Liste zum Überschreiben der Software
  • Klicken Sie auf "Aktivieren"
  • Starten Sie Chrome / ium neu

Sie können Chrome auch mit verwenden chrome --ignore-gpu-blacklist, dies ist jedoch nicht jedes Mal ideal.

Dies ist meine GPU-Seite

Das sind meine Flaggen

Braiam
quelle
1
Nun, ich habe die "Software-Rendering-Liste überschreiben" in chrome: // gpu aktiviert, Chrom wieder geöffnet und eine lokale Seite mit einem HTML5-eingebetteten Video-Tag geöffnet (die Quelle ist ein MP4), aber die CPU arbeitet immer noch weit über 100%. Dann habe ich den Gecko-Mediaplayer installiert, Chrom neu gestartet und mit dem Parameter "Blacklist ignorieren" wieder geöffnet, aber auch kein Glück. Irgendwelche anderen Ideen? Der Status meiner Grafikfunktionen ist identisch mit Ihrem.
João Pereira
Ich bin mir nicht sicher, ob die Videodekodierung tatsächlich funktioniert. Ich verwende Chrome 29 unter Ubuntu 12.04 und sehe "Accelerated Video Decode ist unter Mac und Linux nicht verfügbar: 137247, 133828". Ich bin also überrascht, dass Sie es auf "Hardware Accelerated" gebracht haben.
Gertvdijk
Wenn wir nur Chromium dazu bringen könnten, sein Geld dort unterzubringen, wo sein Mund ist ...
João Pereira
1
@Braiam Tut mir leid, wenn ich nicht wirklich klar war - es zeigt es auch für mich, aber es scheint nicht zu funktionieren, wie in der Ausgabe "Probleme erkannt" gezeigt (wenn die Optionen zum Erzwingen deaktiviert sind). Siehe auch den Fehlerbericht ( code.google.com/p/chromium/issues/detail?id=137247 )
gertvdijk
1
@gertvdijk Ja, ich habe diesen Bericht schon einmal gesehen. Eigentlich ist das eine verdammt dumme Politik: Wir mögen keine Fehlerberichte, also aktivieren wir (wirklich) langsam die Karten, von denen wir glauben, dass sie keine Probleme haben (die die Minderheit sind), und lassen die Benutzer, die Karten haben, die möglicherweise gut funktionieren laufen mit nur 0,1% ihrer tatsächlichen Leistung.
Braiam
0

Lösung für die Videodekodierung unter Linux / Chrom:

Die GpuVideoDecodeAccelerator-Funktion ist im Chrom-Linux-Code seit einigen Monaten deaktiviert (außer natürlich ChromiumOS), daher müssen Sie Chrom wie folgt patchen:

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

oder verwenden Sie diese großartige PPA:

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

Getestet mit libva auf Intel SandyBridge für H264, funktioniert super. Ich weiß nichts über VP8.

Wie hier angefordert ist der vollständige Patch:

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
quelle
1
Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
MadMike
Was ich damit meinte, war die Schritte zum Abrufen der Quelle, Anwenden des Patches und Kompilieren. Oder wie man die PPA passend hinzufügt und den Browser installiert.
MadMike