Chromium เร่ง GPU


11

ฉันกำลังติดตั้ง Xubuntu 12.04 ใหม่และฉันอยากรู้ว่าฉันจะเปิดใช้งานการเร่งความเร็ว GPU ของการ์ด nVidia ภายใน Chromium ที่เสถียรล่าสุดได้อย่างไร ฉันต้องการเล่นไฟล์ MP4 โดยไม่ใช้ CPU ถึง 100%

ฉันได้ติดตั้ง mplayer และ vdpau (และใช้ได้ดี) แต่จนถึงตอนนี้ฉันยังไม่สามารถใช้งานได้ใน Chromium สองสามปีที่ผ่านมาฉันใช้ gecko-mediaplayer แต่ปลั๊กอินถูกขึ้นบัญชีดำ ...

ความคิดใด ๆ

นี่คือผลลัพธ์ของ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, 

และนี่คือผลลัพธ์ของlspci | grep -i vga:

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

Chromium กำลังปั่นคำเตือนมากมายเมื่อใดก็ตามที่ฉันเปิดหน้าเว็บดังที่คุณเห็นที่นี่และฉันเพิ่งพบผู้นำที่มีแนวโน้มหายไปในทะเลของคำเตือนประสิทธิภาพ:

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

หลังจากเพิ่มผู้ใช้ในกลุ่มวิดีโอตอนนี้ Chromium ไม่สามารถเล่น MP4 ได้เลย (yup แม้ไม่ได้ใช้ CPU) ฉันได้รับข้อความแสดงข้อผิดพลาดเหมือนเดิม แต่มีข้อความใหม่โผล่ขึ้นมาเช่นกัน:

[4296: 4296: 0827/100001: ข้อผิดพลาด: gpu_video_decode_accelerator.cc (208)] ไม่สามารถใช้งานได้ในเนื้อหาที่เป็นโมฆะ :: GpuVideoDecodeAccelerator :: เริ่มต้น (สื่อ :: VideoCodecProfile, IPC :: ข้อความ *) ** **

ทำไมการใช้งาน CPU ของคุณถึง 100% แม้ไม่มี HWA (ไม่มี GPU) ฉันก็สามารถเล่นวิดีโอ mp4 ผ่าน Google Chrome และการใช้ CPU ได้ <20%

4
วิดีโอ 1080p บนคอมพิวเตอร์ 4 ปี, 300 ดอลลาร์
João Pereira

คำตอบ:


7

TL; DR:ถ้าคุณได้พยายามทุกอย่างด้านล่างและตอนนี้คุณจะได้รับหน้าจอสีดำกดปุ่มนี้โดยเฉพาะอย่างยิ่งการแก้ไขข้อผิดพลาดปัญหาของคุณควรได้รับการแก้ไขโดยขณะนี้ ถ้าคุณได้รับ:

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.

หลังจากที่พยายามทุกอย่างด้านล่างจากนั้นคุณควรลองเริ่มต้น Chrome / ium ด้วยหรือ--disable-gpu-sandbox --blacklist-accelerated-compositingหากปัญหายังคงอยู่ให้ย้อนกลับการเปลี่ยนแปลงทั้งหมดและรายงานข้อผิดพลาดในรายละเอียดว่าปัญหาของคุณคืออะไรคุณลองทำอะไรบ้างและข้อมูลทั้งหมดที่เป็นไปได้: about:gpu, about:versionไดรเวอร์ที่คุณใช้งาน, รุ่นเคอร์เนล ฯลฯ สำหรับคนที่ยังต้องการทดสอบ โชคใช้สวิตช์ที่กล่าวถึงก่อนหน้านี้ไม่ว่าจะมีปัญหากับการ์ด AMD ส่วน"การบังคับ Chrome / ium เพื่อใช้ HWA"เหมาะสำหรับคุณหรือไม่ ผู้ที่ใช้ไดรเวอร์ของ Nvidia หรือ xorg-ppa-edge ควรทดสอบกับ Firefox และดูว่ามีปัญหาเกิดขึ้นหรือไม่

ปัญหาสิทธิ์ของ Nvidia

NVIDIA: ไม่สามารถเปิดไฟล์อุปกรณ์ / dev / nvidia0 (ไม่อนุญาตให้ใช้)

ซึ่งหมายความว่าคุณไม่ได้เป็นส่วนหนึ่งของvideoกลุ่ม วิธีนี้แก้ไขได้ง่ายอย่างที่ควรเป็น:

sudo adduser Hal video

จากนั้นเริ่มเซสชันของคุณใหม่และคุณอยู่ที่นั่น

ที่มา: http://forums.gentoo.org/viewtopic-p-7232328.html?sid=900a2d59cdb52e1a5f530598dfa1be24#7232328

บังคับให้ Chrome / ium ใช้ HWA

คุณควรตรวจสอบabout:gpuหัวข้อของคุณใน Chrome / ium ในเครื่องคอมพิวเตอร์เก่าของ HW about:flagsเร่งการยกเลิกโดยปริยายและคุณจะสามารถเปิดใช้งานได้โดยการเอาชนะการตั้งค่าในส่วน

  • เปิดabout:flagsแถบที่อยู่ของคุณ
  • ค้นหารายการแทนที่ซอฟต์แวร์การแทนที่
  • คลิก "เปิดใช้งาน"
  • รีสตาร์ท Chrome / ium

คุณสามารถเริ่มใช้โครเมียมได้chrome --ignore-gpu-blacklistแต่ต้องทำทุกครั้งที่ไม่เหมาะ

นี่คือหน้า GPU ของฉัน

นี่คือธงของฉัน


1
ฉันเปิดใช้งาน "แทนที่รายการการเรนเดอร์ซอฟต์แวร์" ใน chrome: // gpu เปิดโครเมียมอีกครั้งและเปิดหน้าเว็บภายในที่มีแท็กวิดีโอฝัง HTML5 (แหล่งที่มาคือ MP4) แต่ CPU ยังทำงานได้ดีกว่า 100% จากนั้นฉันติดตั้ง gecko-mediaplayer รีบูตและเปิดโครเมียมอีกครั้งโดยไม่ใช้พารามิเตอร์ blacklist แต่ไม่มีโชคเช่นกัน ความคิดอื่น ๆ ? สถานะคุณสมบัติกราฟิกของฉันเหมือนกันกับคุณ
João Pereira

ฉันไม่แน่ใจว่าการถอดรหัสวิดีโอใช้งานได้จริงหรือไม่ ฉันใช้งาน Chrome 29 บน Ubuntu 12.04 และฉันเห็น "การถอดรหัสวิดีโอแบบเร่งไม่พร้อมใช้งานบน Mac และ Linux: 137247, 133828" ดังนั้นฉันจึงประหลาดใจที่เห็นว่าคุณได้รับ "Hardware Accelerated"
gertvdijk

ตอนนี้ถ้าเพียง แต่เราสามารถทำให้ Chromium นำเงินของเขาไปที่ปากของเขา ...
João Pereira

1
@Braiam ขออภัยถ้าฉันไม่ชัดเจนจริงๆ - มันแสดงให้ฉันด้วย แต่ดูเหมือนว่ามันจะไม่ทำงานตามที่แสดงในผลลัพธ์ "ปัญหาที่ตรวจพบ" (เมื่อปิดใช้งานตัวเลือกการบังคับ) ดูเพิ่มเติมที่รายงานข้อผิดพลาด ( code.google.com/p/chromium/issues/detail?id=137247 )
gertvdijk

1
@ gertvdijk ใช่ฉันเคยเห็นรายงานนั้นมาก่อน จริงๆแล้วมันเป็นนโยบายโง่ ๆ ที่น่ากลัว: เราไม่ชอบรายงานข้อผิดพลาดดังนั้นเรา (จริงๆ) เปิดใช้งานการ์ดช้าเราเชื่อว่าไม่มีปัญหา ทำงานด้วยประสิทธิภาพที่แท้จริงเพียง 0.1%
Braiam

0

โซลูชันสำหรับการถอดรหัสวิดีโอบน linux / chromium:

ฟังก์ชั่น GpuVideoDecodeAccelerator ถูกปิดใช้งานในโครเมี่ยมลินุกซ์โค้ดไม่กี่เดือน (ยกเว้น ChromiumOS อย่างเห็นได้ชัด) ดังนั้นคุณจะต้องแก้ไขโครเมียมดังนี้:

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

หรือใช้ PPA ที่ยอดเยี่ยมนี้:

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

ทดสอบกับ libva ใน Intel SandyBridge สำหรับ H264 ใช้งานได้ดี ไม่ทราบเกี่ยวกับ VP8

ตามที่ขอมาแล้วนี่เป็น Full 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;
 }

1
ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
MadMike

สิ่งที่ฉันหมายถึงคือการรวมขั้นตอนในการรับแหล่งข้อมูลใช้แพทช์และรวบรวม หรือวิธีการเพิ่ม PPA และติดตั้งเบราว์เซอร์
MadMike
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.