GPU mempercepat Chromium

11

Saya sedang menjalankan instalasi baru Xubuntu 12.04 dan saya ingin tahu bagaimana saya bisa mengaktifkan akselerasi GPU kartu nVidia saya di dalam Chromium stabil terbaru. Saya ingin memutar file MP4 tanpa CPU menyala hingga 100%.

Saya telah menginstal mplayer dan vdpau (dan mereka berfungsi dengan baik), tetapi sejauh ini saya belum dapat menggunakannya di dalam Chromium. Beberapa tahun yang lalu, saya menggunakan tokek-mediaplayer tetapi plugin telah dimasukkan daftar hitam ...

Ada ide?

Inilah output dari 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, 

dan inilah output dari lspci | grep -i vga:

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

Chromium mengeluarkan banyak peringatan setiap kali saya membuka halaman, seperti yang dapat Anda lihat di sini dan saya baru saja menemukan petunjuk yang menjanjikan, hilang dalam lautan peringatan kinerja:

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

Setelah menambahkan pengguna ke grup video, Chromium sekarang tidak dapat memutar MP4 sama sekali (ya, bahkan tidak menggunakan CPU). Saya mendapat pesan kesalahan yang sama seperti sebelumnya, tetapi yang baru juga muncul:

[4296: 4296: 0827/100001: ERROR: gpu_video_decode_accelerator.cc (208)] Tidak diimplementasikan mencapai konten yang kosong :: GpuVideoDecodeAccelerator :: Menginisialisasi (media :: VideoCodecProfile, IPC :: Pesan *) ** akselerasi decode video HW tidak tersedia **.
João Pereira
sumber
Mengapa penggunaan CPU Anda meningkat hingga 100%? Bahkan tanpa HWA (tanpa GPU), saya dapat memutar video mp4 melalui Google Chrome dan penggunaan CPU <20%.
4
Video 1080p pada komputer berusia 4 tahun, 300 $.
João Pereira

Jawaban:

7

TL; DR: Kecuali Anda telah mencoba segalanya di bawah ini dan sekarang Anda mendapatkan layar hitam memukul ini khususnya tetap bug , masalah Anda harus diselesaikan sekarang. Jika sekarang Anda mendapatkan:

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.

setelah mencoba semuanya di bawah, maka Anda harus mencoba memulai Chrome / ium dengan --disable-gpu-sandboxatau --blacklist-accelerated-compositing. Jika masalah tetap ada, kembalikan semua perubahan dan laporkan bug yang merinci apa masalah Anda, apa yang sudah Anda coba, dan semua data yang mungkin: about:gpu,, about:versiondriver yang Anda gunakan, versi kernel, dll. Untuk yang masih ingin mengujinya Untungnya, gunakan sakelar yang disebutkan sebelumnya, apakah ada masalah dengan kartu AMD, bagian "Memaksa Chrome / ium untuk menggunakan HWA" bekerja untuk Anda. Mereka yang menggunakan driver pribadi Nvidia atau xorg-ppa-edge, harus menguji dengan Firefox dan melihat apakah masalah terjadi di sana juga.

Masalah izin Nvidia

NVIDIA: tidak dapat membuka file perangkat / dev / nvidia0 (Operasi tidak diizinkan).

Ini berarti Anda bukan bagian dari videogrup. Ini dipecahkan semudah yang Anda bisa:

sudo adduser Hal video

Kemudian mulai kembali sesi Anda dan Anda ada di sana.

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

Memaksa Chrome / ium untuk menggunakan HWA

Anda harus memeriksa about:gpubagian Anda di Chrome / ium. Di PC lama HW Acceleration dinonaktifkan secara default dan Anda hanya dapat mengaktifkannya dengan mengesampingkan pengaturan di about:flags.

  • Buka about:flagsdi bilah alamat Anda
  • Cari daftar redendering perangkat lunak Override
  • Klik "Aktifkan"
  • Mulai ulang Chrome / ium

Anda juga dapat mulai menggunakan chrome chrome --ignore-gpu-blacklisttetapi harus melakukannya setiap waktu tidak ideal.

Ini adalah halaman GPU saya

Ini bendera saya

Braiam
sumber
1
Yah, saya mengaktifkan "timpa daftar render perangkat lunak" di chrome: // gpu, buka kembali kromium dan membuka halaman lokal yang berisi tag video embed HTML5 (sumbernya adalah MP4) tetapi CPU masih bekerja dengan baik di atas 100%. Kemudian, saya menginstal gecko-mediaplayer, reboot dan membuka kembali kromium dengan mengabaikan parameter daftar hitam tetapi tidak berhasil juga. Ada ide lain? Status fitur grafik saya identik dengan milik Anda.
João Pereira
Saya tidak yakin apakah decoding video benar-benar berfungsi. Saya menjalankan Chrome 29 di Ubuntu 12.04 dan saya melihat "Video decode yang dipercepat tidak tersedia di Mac dan Linux .: 137247, 133828", jadi saya terkejut melihat Anda mendapatkannya ke "Hardware Accelerated".
gertvdijk
Sekarang, andai saja kita bisa membuat Chromium menaruh uangnya di mulutnya ...
João Pereira
1
@Braiam Maaf jika saya tidak benar-benar jelas - itu menunjukkannya untuk saya juga, tetapi tampaknya itu tidak berfungsi seperti yang ditunjukkan dalam output "masalah terdeteksi" (ketika opsi opsi dinonaktifkan dinonaktifkan). Lihat juga laporan bug ( code.google.com/p/chromium/issues/detail?id=137247 )
gertvdijk
1
@ gertvdijk Ya, saya pernah melihat laporan itu sebelumnya. Sebenarnya adalah kebijakan yang sangat bodoh: Kami tidak suka laporan bug, jadi kami (benar-benar) perlahan-lahan mengaktifkan kartu yang kami yakini tidak memiliki masalah (yang merupakan minoritas) dan meninggalkan pengguna yang memiliki kartu yang mungkin bekerja dengan baik jalankan dengan hanya 0,1% dari kinerja nyata mereka.
Braiam
0

Solusi untuk Video Decoding di linux / chromium:

Fungsi GpuVideoDecodeAccelerator telah dinonaktifkan dalam kode kromium linux selama beberapa bulan (kecuali untuk ChromiumOS jelas) sehingga Anda harus menambal kromium seperti ini:

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

atau gunakan PPA hebat ini:

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

Diuji dengan libva pada Intel SandyBridge untuk H264, bekerja dengan sangat baik. Tidak tahu tentang VP8.

Seperti yang diminta di sini adalah Patch Lengkap:

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
sumber
1
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
MadMike
Yang saya maksudkan adalah memasukkan langkah-langkah tentang cara mendapatkan sumber, menerapkan tambalan dan kompilasi. Atau tentang cara apt-tambahkan PPA dan menginstal browser.
MadMike