GPU accelerated Chromium

I'm running a fresh install of Xubuntu 12.04 and I'd like to know how can I activate my nVidia card's GPU acceleration inside the latest stable Chromium. I wanted to play an MP4 file without the CPU firing to 100%.

I've installed mplayer and vdpau (and they work fine), but so far I haven't been able to use them inside Chromium. A couple of years ago, I used gecko-mediaplayer but the plugin's been blacklisted...

Any ideas?

Here's the output of 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, 

and here's the output of lspci | grep -i vga:

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

Chromium is churning out a lot of warnings whenever I open the page, as you can see here and I've just found out a promising lead, lost in a sea of performance warnings:

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

After adding the user to the video group, Chromium is now unable to play MP4's at all (yup, not even using the CPU). I got the same error messages as before, but a new one popped up as well:

[4296:4296:0827/100001: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**.
2

2 Answers

TL;DR: Unless you have tried everything below and now you get a black screen hitting this particular fixed bug, your problem should be solved by now. If you now get:

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.

after trying everything below, then you should try starting Chrome/ium with --disable-gpu-sandbox or --blacklist-accelerated-compositing. If problems persists, revert all changes and report a bug detailing what is your problem, what have you tried, and all the data possible: about:gpu, about:version, the drivers you are using, kernel version, etc. For the ones that still want to test their luck, use the switch mentioned earlier, does that are having issues with AMD cards, the "Forcing Chrome/ium to use HWA" section works for you. Those using Nvidia privatives drivers or the xorg-ppa-edge, should test with Firefox and see if the issue happens there too.

Nvidia permissions problems

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

This means that you are not part of the video group. This is solved as easy as you could be:

sudo adduser Hal video

Then restart your session and you are there.

Source:

Forcing Chrome/ium to use HWA

You should check your about:gpu section in Chrome/ium. In older PC's HW Acceleration is disabled by default and you only can enable it by overriding the settings in the about:flags.

  • Open the about:flags in your address bar
  • Look for Override software redendering list
  • Click "Enable"
  • Restart Chrome/ium

You can also start chrome using chrome --ignore-gpu-blacklist but having to do so each time is not ideal.

This is my GPU page

THis is my flags

9

Solution for Video Decoding on linux/chromium :

GpuVideoDecodeAccelerator function has been disabled in the chromium linux code for few months (except for ChromiumOS obviously) so you'll have to patch chromium like this :

or use this great PPA :

Tested with libva on Intel SandyBridge for H264, works great. Don't know about VP8.

As requested here is the Full Patch :

Index:
===================================================================
--- 2014-12-04 09:32:45.344607112 -0500
+++ 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:
===================================================================
--- 2014-12-04 09:32:45.344607112 -0500
+++ 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:
===================================================================
--- 2014-12-04 09:32:45.344607112 -0500
+++ 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:
===================================================================
--- 2014-12-04 09:32:45.344607112 -0500
+++ 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:
===================================================================
--- 2014-12-04 09:32:45.344607112 -0500
+++ 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:
===================================================================
--- 2014-12-04 09:32:45.344607112 -0500
+++ 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:
===================================================================
--- 2014-12-04 09:32:45.344607112 -0500
+++ 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:
===================================================================
--- 2014-12-04 09:32:45.344607112 -0500
+++ 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:
===================================================================
--- 2014-12-04 09:32:45.344607112 -0500
+++ 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; }
2

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like