我正在运行全新安装的 Xubuntu 12.04,我想知道如何在最新稳定的 Chromium 中激活 nVidia 卡的 GPU 加速。我想播放 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(是的,甚至无法使用 CPU)。我收到了与以前相同的错误消息,但还弹出了一条新消息:
[4296:4296:0827/100001:ERROR:gpu_video_decode_accelerator.cc(208)] 未实现,到达 void content::GpuVideoDecodeAccelerator::Initialize(media::VideoCodecProfile,IPC::Message*)**HW 视频解码加速不可用**。
答案1
总结:除非你已经尝试了下面的所有方法,否则现在你会看到黑屏特别的固定的漏洞,你的问题现在应该已经解决了。如果你现在得到:
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.
--disable-gpu-sandbox
尝试完以下所有操作后,您应尝试使用或启动 Chrome/ium --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 中的部分。旧 PC 的硬件加速默认处于禁用状态,您只能通过覆盖 中的设置来启用它about:flags
。
about:flags
在地址栏中打开- 寻找覆盖软件渲染列表
- 点击“启用”
- 重启 Chrome/ium
您也可以使用 chrome 启动,chrome --ignore-gpu-blacklist
但每次都必须这样做并不理想。
答案2
Linux/chromium 上视频解码的解决方案:
GpuVideoDecodeAccelerator 函数在 Chromium Linux 代码中已被禁用几个月(显然 ChromiumOS 除外),因此您必须像这样修补 Chromium:
或者使用这个优秀的 PPA:
https://launchpad.net/~saiarcot895/+archive/ubuntu/chromium-beta
在 Intel SandyBridge 上使用 libva 测试了 H264,效果很好。不知道 VP8 怎么样。
根据要求,这里是完整补丁:
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;
}