Cromo accelerato GPU


11

Sto eseguendo una nuova installazione di Xubuntu 12.04 e vorrei sapere come posso attivare l'accelerazione GPU della mia scheda nVidia all'interno dell'ultimo Chromium stabile. Volevo riprodurre un file MP4 senza che la CPU si accendesse al 100%.

Ho installato mplayer e vdpau (e funzionano bene), ma finora non sono stato in grado di usarli in Chromium. Un paio di anni fa ho usato gecko-mediaplayer ma il plugin è stato inserito nella lista nera ...

Qualche idea?

Ecco l'output di 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, 

ed ecco l'output di lspci | grep -i vga:

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

Chromium emette molti avvisi ogni volta che apro la pagina, come puoi vedere qui e ho appena scoperto un vantaggio promettente, perso in un mare di avvisi sulle prestazioni:

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

Dopo aver aggiunto l'utente al gruppo video, Chromium non è più in grado di riprodurre MP4 (sì, nemmeno usando la CPU). Ho ricevuto gli stessi messaggi di errore di prima, ma ne è comparso anche uno nuovo:

[4296: 4296: 0827/100001: ERRORE: gpu_video_decode_accelerator.cc (208)] Non implementato raggiunto nel contenuto vuoto :: GpuVideoDecodeAccelerator :: Initialize (media :: VideoCodecProfile, IPC :: Message *) ** Accelerazione decodifica video HW non disponibile **.

Perché l'utilizzo della CPU sale al 100%? Anche senza HWA (nessuna GPU), posso riprodurre video mp4 tramite Google Chrome e l'utilizzo della CPU è <20%.

4
Video 1080p su un computer di 4 anni, 300 $.
João Pereira,

Risposte:


7

TL; DR: A meno che tu non abbia provato tutto sotto e ora ottieni una schermata nera che colpisce questo particolare bug risolto , il tuo problema dovrebbe essere risolto ormai. Se ora ottieni:

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.

dopo aver provato tutto sotto, quindi dovresti provare ad avviare Chrome / ium con --disable-gpu-sandboxo --blacklist-accelerated-compositing. Se i problemi persiste, annullare tutte le modifiche e segnalare un bug in dettaglio qual è il tuo problema, cosa hai provato, e tutti i dati possibili: about:gpu, about:version, i driver in uso, versione del kernel, ecc Per quelli che ancora vogliono testare la loro fortuna, usa l'interruttore menzionato in precedenza, se hai problemi con le schede AMD, la sezione "Forzare Chrome / ium per usare HWA" funziona per te. Coloro che usano driver privativi Nvidia o xorg-ppa-edge, dovrebbero testare con Firefox e vedere se il problema si verifica anche lì.

Problemi con le autorizzazioni Nvidia

NVIDIA: impossibile aprire il file del dispositivo / dev / nvidia0 (operazione non consentita).

Ciò significa che non fai parte del videogruppo. Questo è risolto nel modo più semplice possibile:

sudo adduser Hal video

Quindi riavvia la sessione e sei lì.

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

Costringere Chrome / ium a utilizzare HWA

Dovresti controllare la tua about:gpusezione in Chrome / ium. Nei vecchi PC l'accelerazione HW è disabilitata per impostazione predefinita e puoi abilitarla solo ignorando le impostazioni in about:flags.

  • Apri about:flagsnella barra degli indirizzi
  • Cerca la lista di redendering del software Override
  • Fai clic su "Abilita"
  • Riavvia Chrome / ium

Puoi anche iniziare a utilizzare Chrome chrome --ignore-gpu-blacklistma doverlo fare ogni volta che non è l'ideale.

Questa è la mia pagina GPU

Queste sono le mie bandiere


1
Bene, ho abilitato la "sostituzione dell'elenco di rendering del software" in chrome: // gpu, ho riaperto il cromo e ho aperto una pagina locale contenente un tag video con incorporamento HTML5 (la fonte è un MP4) ma la CPU continua a fare ben oltre il 100%. Quindi, ho installato gecko-mediaplayer, riavviato e riaperto il cromo con il parametro ignora blacklist ma non ho avuto fortuna. Altre idee? Lo stato delle mie caratteristiche grafiche è identico al tuo.
João Pereira,

Non sono sicuro che la decodifica video funzioni davvero. Sto eseguendo Chrome 29 su Ubuntu 12.04 e vedo che "La decodifica video accelerata non è disponibile su Mac e Linux .: 137247, 133828", quindi sono sorpreso di vederlo su "Hardware accelerato".
gertvdijk,

Ora, se solo potessimo fare in modo che Chromium metta i suoi soldi dove è la sua bocca ...
João Pereira,

1
@Braiam Scusami se non ero davvero chiaro - lo mostra anche per me, ma sembra che non funzioni come mostrato nell'output "problemi rilevati" (quando disabilitato le opzioni di forzatura). Vedi anche la segnalazione di bug ( code.google.com/p/chromium/issues/detail?id=137247 )
gertvdijk,

1
@gertvdijk Sì, ho già visto quel rapporto. In realtà è una politica piuttosto stupida: non ci piacciono le segnalazioni di bug, quindi attiviamo (davvero) lentamente le carte che crediamo non abbiano problemi (che sono la minoranza) e lasciamo agli utenti che hanno carte che potrebbero funzionare bene correre con solo lo 0,1% delle loro prestazioni reali
Braiam,

0

Soluzione per la decodifica video su linux / chromium:

La funzione GpuVideoDecodeAccelerator è stata disabilitata nel codice di cromo linux per alcuni mesi (tranne ovviamente per ChromiumOS) quindi dovrai patchare il cromo in questo modo:

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

o usa questo fantastico PPA:

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

Testato con libva su Intel SandyBridge per H264, funziona alla grande. Non so di VP8.

Come richiesto qui è la patch completa:

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;
 }

1
Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
MadMike

Quello che intendevo era includere i passaggi su come ottenere il sorgente, applicare la patch e compilarla. O su come aggiungere apt-PPA e installare il browser.
MadMike
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.