mirror of
https://abf.rosa.ru/djam/chromium-browser-stable-test.git
synced 2025-02-23 17:42:45 +00:00
415 lines
17 KiB
Diff
415 lines
17 KiB
Diff
Description: Enables using VA-API hardware acceleration in Linux. The patch for bpf_gpu_policy_linux.cc initially came from https://codereview.chromium.org/15955009/diff/92001/content/common/sandbox_linux/bpf_gpu_policy_linux.cc.
|
|
|
|
Index: beta.wily/content/common/gpu/media/gpu_video_decode_accelerator.cc
|
|
===================================================================
|
|
--- beta.wily.orig/content/common/gpu/media/gpu_video_decode_accelerator.cc
|
|
+++ beta.wily/content/common/gpu/media/gpu_video_decode_accelerator.cc
|
|
@@ -34,7 +34,7 @@
|
|
#include "content/common/gpu/media/dxva_video_decode_accelerator_win.h"
|
|
#elif defined(OS_MACOSX)
|
|
#include "content/common/gpu/media/vt_video_decode_accelerator_mac.h"
|
|
-#elif defined(OS_CHROMEOS)
|
|
+#elif defined(OS_CHROMEOS) || defined(OS_LINUX)
|
|
#if defined(USE_V4L2_CODEC)
|
|
#include "content/common/gpu/media/v4l2_device.h"
|
|
#include "content/common/gpu/media/v4l2_slice_video_decode_accelerator.h"
|
|
@@ -164,7 +164,7 @@ GpuVideoDecodeAccelerator::GetCapabiliti
|
|
#if defined(OS_WIN)
|
|
capabilities.supported_profiles =
|
|
DXVAVideoDecodeAccelerator::GetSupportedProfiles();
|
|
-#elif defined(OS_CHROMEOS)
|
|
+#elif defined(OS_CHROMEOS) || defined(OS_LINUX)
|
|
media::VideoDecodeAccelerator::SupportedProfiles vda_profiles;
|
|
#if defined(USE_V4L2_CODEC)
|
|
vda_profiles = V4L2VideoDecodeAccelerator::GetSupportedProfiles();
|
|
@@ -346,6 +346,8 @@ void GpuVideoDecodeAccelerator::Initiali
|
|
}
|
|
#endif
|
|
|
|
+ VLOG(1) << "Initializing GPU video decode accelerator.";
|
|
+
|
|
// Array of Create..VDA() function pointers, maybe applicable to the current
|
|
// platform. This list is ordered by priority of use and it should be the
|
|
// same as the order of querying supported profiles of VDAs.
|
|
@@ -444,7 +446,9 @@ void GpuVideoDecodeAccelerator::BindImag
|
|
scoped_ptr<media::VideoDecodeAccelerator>
|
|
GpuVideoDecodeAccelerator::CreateVaapiVDA() {
|
|
scoped_ptr<media::VideoDecodeAccelerator> decoder;
|
|
-#if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)
|
|
+ VLOG(1) << "About to create new VAAPI video decode accelerator.";
|
|
+#if (defined(OS_CHROMEOS) || defined(OS_LINUX)) && defined(ARCH_CPU_X86_FAMILY)
|
|
+ VLOG(1) << "Creating new VAAPI video decode accelerator.";
|
|
decoder.reset(new VaapiVideoDecodeAccelerator(
|
|
make_context_current_, base::Bind(&GpuVideoDecodeAccelerator::BindImage,
|
|
base::Unretained(this))));
|
|
Index: beta.wily/content/content_common.gypi
|
|
===================================================================
|
|
--- beta.wily.orig/content/content_common.gypi
|
|
+++ beta.wily/content/content_common.gypi
|
|
@@ -878,7 +878,7 @@
|
|
},
|
|
],
|
|
}],
|
|
- ['chromeos==1', {
|
|
+ ['chromeos==1 or desktop_linux==1', {
|
|
'sources': [
|
|
'common/gpu/media/accelerated_video_decoder.h',
|
|
'common/gpu/media/gpu_arc_video_service.cc',
|
|
@@ -936,7 +936,7 @@
|
|
'common/gpu/media/tegra_v4l2_device.h',
|
|
],
|
|
}],
|
|
- ['target_arch != "arm" and chromeos == 1', {
|
|
+ ['target_arch != "arm" and (chromeos == 1 or desktop_linux == 1)', {
|
|
'dependencies': [
|
|
'../media/media.gyp:media',
|
|
'../third_party/libyuv/libyuv.gyp:libyuv',
|
|
Index: beta.wily/content/content_gpu.gypi
|
|
===================================================================
|
|
--- beta.wily.orig/content/content_gpu.gypi
|
|
+++ beta.wily/content/content_gpu.gypi
|
|
@@ -38,7 +38,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.wily/content/content_tests.gypi
|
|
===================================================================
|
|
--- beta.wily.orig/content/content_tests.gypi
|
|
+++ beta.wily/content/content_tests.gypi
|
|
@@ -1757,7 +1757,7 @@
|
|
},
|
|
]
|
|
}],
|
|
- ['chromeos==1 and target_arch != "arm"', {
|
|
+ ['(chromeos==1 or desktop_linux==1) and target_arch != "arm"', {
|
|
'targets': [
|
|
{
|
|
'target_name': 'vaapi_jpeg_decoder_unittest',
|
|
Index: beta.wily/content/public/common/content_switches.cc
|
|
===================================================================
|
|
--- beta.wily.orig/content/public/common/content_switches.cc
|
|
+++ beta.wily/content/public/common/content_switches.cc
|
|
@@ -944,7 +944,9 @@ const char kDisableWebAudio[]
|
|
#if defined(OS_CHROMEOS)
|
|
// Disables panel fitting (used for mirror mode).
|
|
const char kDisablePanelFitting[] = "disable-panel-fitting";
|
|
+#endif
|
|
|
|
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
|
|
// Disables VA-API accelerated video encode.
|
|
const char kDisableVaapiAcceleratedVideoEncode[] =
|
|
"disable-vaapi-accelerated-video-encode";
|
|
Index: beta.wily/content/public/common/content_switches.h
|
|
===================================================================
|
|
--- beta.wily.orig/content/public/common/content_switches.h
|
|
+++ beta.wily/content/public/common/content_switches.h
|
|
@@ -277,6 +277,8 @@ CONTENT_EXPORT extern const char kDisabl
|
|
|
|
#if defined(OS_CHROMEOS)
|
|
CONTENT_EXPORT extern const char kDisablePanelFitting[];
|
|
+#endif
|
|
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
|
|
CONTENT_EXPORT extern const char kDisableVaapiAcceleratedVideoEncode[];
|
|
#endif
|
|
|
|
Index: beta.wily/media/media.gyp
|
|
===================================================================
|
|
--- beta.wily.orig/media/media.gyp
|
|
+++ beta.wily/media/media.gyp
|
|
@@ -783,7 +783,7 @@
|
|
],
|
|
}],
|
|
# For VaapiVideoEncodeAccelerator.
|
|
- ['target_arch != "arm" and chromeos == 1', {
|
|
+ ['target_arch != "arm" and (chromeos == 1 or desktop_linux == 1)', {
|
|
'sources': [
|
|
'filters/h264_bitstream_buffer.cc',
|
|
'filters/h264_bitstream_buffer.h',
|
|
@@ -1417,7 +1417,7 @@
|
|
'cdm/cdm_adapter_unittest.cc',
|
|
],
|
|
}],
|
|
- ['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_unittest.cc',
|
|
],
|
|
Index: beta.wily/gpu/config/software_rendering_list_json.cc
|
|
===================================================================
|
|
--- beta.wily.orig/gpu/config/software_rendering_list_json.cc
|
|
+++ beta.wily/gpu/config/software_rendering_list_json.cc
|
|
@@ -481,17 +481,6 @@ const char kSoftwareRenderingListJson[]
|
|
]
|
|
},
|
|
{
|
|
- "id": 48,
|
|
- "description": "Accelerated video decode is unavailable on Linux",
|
|
- "cr_bugs": [137247],
|
|
- "os": {
|
|
- "type": "linux"
|
|
- },
|
|
- "features": [
|
|
- "accelerated_video_decode"
|
|
- ]
|
|
- },
|
|
- {
|
|
"id": 49,
|
|
"description": "NVidia GeForce GT 650M can cause the system to hang with flash 3D",
|
|
"cr_bugs": [140175],
|
|
Index: beta.wily/content/common/sandbox_linux/bpf_gpu_policy_linux.cc
|
|
===================================================================
|
|
--- beta.wily.orig/content/common/sandbox_linux/bpf_gpu_policy_linux.cc
|
|
+++ beta.wily/content/common/sandbox_linux/bpf_gpu_policy_linux.cc
|
|
@@ -22,6 +22,8 @@
|
|
#include "base/macros.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"
|
|
@@ -32,6 +34,8 @@
|
|
#include "sandbox/linux/syscall_broker/broker_file_permission.h"
|
|
#include "sandbox/linux/syscall_broker/broker_process.h"
|
|
#include "sandbox/linux/system_headers/linux_syscalls.h"
|
|
+#include "third_party/libva/va/va.h"
|
|
+#include "third_party/libva/va/va_x11.h"
|
|
|
|
using sandbox::arch_seccomp_data;
|
|
using sandbox::bpf_dsl::Allow;
|
|
@@ -41,6 +45,11 @@ using sandbox::syscall_broker::BrokerFil
|
|
using sandbox::syscall_broker::BrokerProcess;
|
|
using sandbox::SyscallSets;
|
|
|
|
+using content_common_gpu_media::kModuleVa;
|
|
+using content_common_gpu_media::kModuleVa_x11;
|
|
+using content_common_gpu_media::InitializeStubs;
|
|
+using content_common_gpu_media::StubPathMap;
|
|
+
|
|
namespace content {
|
|
|
|
namespace {
|
|
@@ -95,7 +104,7 @@ inline bool UseLibV4L2() {
|
|
|
|
bool IsAcceleratedVaapiVideoEncodeEnabled() {
|
|
bool accelerated_encode_enabled = false;
|
|
-#if defined(OS_CHROMEOS)
|
|
+#if defined(OS_CHROMEOS) || defined(OS_LINUX)
|
|
const base::CommandLine& command_line =
|
|
*base::CommandLine::ForCurrentProcess();
|
|
accelerated_encode_enabled =
|
|
@@ -300,27 +309,41 @@ bool GpuProcessPolicy::PreSandboxHook()
|
|
// inside the sandbox, so preload them now.
|
|
if (IsAcceleratedVaapiVideoEncodeEnabled() ||
|
|
IsAcceleratedVideoDecodeEnabled()) {
|
|
- const char* I965DrvVideoPath = NULL;
|
|
- const char* I965HybridDrvVideoPath = NULL;
|
|
+ VLOG(1) << "Attempting to enable hardware video acceleration.";
|
|
+ StubPathMap paths;
|
|
+ paths[kModuleVa].push_back("libva.so.1");
|
|
+ paths[kModuleVa_x11].push_back("libva-x11.so.1");
|
|
+ if (!InitializeStubs(paths)) {
|
|
+ VLOG(1) << "Failed to initialize stubs";
|
|
+ return false;
|
|
+ }
|
|
|
|
- if (IsArchitectureX86_64()) {
|
|
- I965DrvVideoPath = "/usr/lib64/va/drivers/i965_drv_video.so";
|
|
- I965HybridDrvVideoPath = "/usr/lib64/va/drivers/hybrid_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 loaded 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)) {
|
|
+ VLOG(1) << "Failed to call vaGetDisplay()";
|
|
+ return false;
|
|
}
|
|
|
|
- dlopen(I965DrvVideoPath, RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE);
|
|
- if (I965HybridDrvVideoPath)
|
|
- dlopen(I965HybridDrvVideoPath, RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE);
|
|
- dlopen("libva.so.1", RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE);
|
|
-#if defined(USE_OZONE)
|
|
- dlopen("libva-drm.so.1", RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE);
|
|
-#elif defined(USE_X11)
|
|
- dlopen("libva-x11.so.1", RTLD_NOW|RTLD_GLOBAL|RTLD_NODELETE);
|
|
-#endif
|
|
- }
|
|
- }
|
|
+ int major_version, minor_version;
|
|
+ if (vaInitialize(va_display, &major_version, &minor_version)
|
|
+ != VA_STATUS_SUCCESS) {
|
|
+ VLOG(1) << "Failed to call vaInitialize()";
|
|
+ return false;
|
|
+ }
|
|
+ } // end of IsAcceleratedVaapiVideoEncodeEnabled() || IsAcceleratedVideoDecodeEnabled()
|
|
+ } // end of IsArchitectureX86_64() || IsArchitectureI386()
|
|
|
|
return true;
|
|
}
|
|
Index: beta.wily/chrome/browser/about_flags.cc
|
|
===================================================================
|
|
--- beta.wily.orig/chrome/browser/about_flags.cc
|
|
+++ beta.wily/chrome/browser/about_flags.cc
|
|
@@ -936,7 +936,7 @@ const FeatureEntry kFeatureEntries[] = {
|
|
"disable-accelerated-video-decode",
|
|
IDS_FLAGS_ACCELERATED_VIDEO_DECODE_NAME,
|
|
IDS_FLAGS_ACCELERATED_VIDEO_DECODE_DESCRIPTION,
|
|
- kOsMac | kOsWin | kOsCrOS,
|
|
+ kOsAll,
|
|
SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedVideoDecode),
|
|
},
|
|
#if defined(USE_ASH)
|
|
Index: beta.wily/content/common/gpu/media/vaapi_wrapper.cc
|
|
===================================================================
|
|
--- beta.wily.orig/content/common/gpu/media/vaapi_wrapper.cc
|
|
+++ beta.wily/content/common/gpu/media/vaapi_wrapper.cc
|
|
@@ -186,7 +186,7 @@ scoped_refptr<VaapiWrapper> VaapiWrapper
|
|
VAProfile va_profile,
|
|
const base::Closure& report_error_to_uma_cb) {
|
|
if (!profile_infos_.Get().IsProfileSupported(mode, va_profile)) {
|
|
- DVLOG(1) << "Unsupported va_profile: " << va_profile;
|
|
+ VLOG(1) << "Unsupported va_profile: " << va_profile;
|
|
return nullptr;
|
|
}
|
|
|
|
@@ -345,15 +345,17 @@ VaapiWrapper::GetSupportedProfileInfosFo
|
|
bool VaapiWrapper::VaInitialize(const base::Closure& report_error_to_uma_cb) {
|
|
static bool vaapi_functions_initialized = PostSandboxInitialization();
|
|
if (!vaapi_functions_initialized) {
|
|
- bool running_on_chromeos = false;
|
|
-#if defined(OS_CHROMEOS)
|
|
+ bool error_level_logging = false;
|
|
+#if defined(OS_LINUX)
|
|
+ error_level_logging = true;
|
|
+#elif defined(OS_CHROMEOS)
|
|
// When chrome runs on linux with chromeos=1, do not log error message
|
|
// without VAAPI libraries.
|
|
- running_on_chromeos = base::SysInfo::IsRunningOnChromeOS();
|
|
+ error_level_logging = base::SysInfo::IsRunningOnChromeOS();
|
|
#endif
|
|
static const char kErrorMsg[] = "Failed to initialize VAAPI libs";
|
|
- if (running_on_chromeos)
|
|
- LOG(ERROR) << kErrorMsg;
|
|
+ if (error_level_logging)
|
|
+ VLOG(1) << kErrorMsg;
|
|
else
|
|
DVLOG(1) << kErrorMsg;
|
|
return false;
|
|
@@ -424,7 +426,7 @@ bool VaapiWrapper::IsEntrypointSupported
|
|
if (std::find(supported_entrypoints.begin(),
|
|
supported_entrypoints.end(),
|
|
entrypoint) == supported_entrypoints.end()) {
|
|
- DVLOG(1) << "Unsupported entrypoint";
|
|
+ VLOG(1) << "Unsupported entrypoint";
|
|
return false;
|
|
}
|
|
return true;
|
|
@@ -448,8 +450,8 @@ bool VaapiWrapper::AreAttribsSupported_L
|
|
if (attribs[i].type != required_attribs[i].type ||
|
|
(attribs[i].value & required_attribs[i].value) !=
|
|
required_attribs[i].value) {
|
|
- DVLOG(1) << "Unsupported value " << required_attribs[i].value
|
|
- << " for attribute type " << required_attribs[i].type;
|
|
+ VLOG(1) << "Unsupported value " << required_attribs[i].value
|
|
+ << " for attribute type " << required_attribs[i].type;
|
|
return false;
|
|
}
|
|
}
|
|
Index: beta.wily/content/common/gpu/media/vaapi_video_decode_accelerator.cc
|
|
===================================================================
|
|
--- beta.wily.orig/content/common/gpu/media/vaapi_video_decode_accelerator.cc
|
|
+++ beta.wily/content/common/gpu/media/vaapi_video_decode_accelerator.cc
|
|
@@ -334,17 +334,17 @@ bool VaapiVideoDecodeAccelerator::Initia
|
|
|
|
base::AutoLock auto_lock(lock_);
|
|
DCHECK_EQ(state_, kUninitialized);
|
|
- DVLOG(2) << "Initializing VAVDA, profile: " << profile;
|
|
+ VLOG(1) << "Initializing VAVDA, profile: " << profile;
|
|
|
|
#if defined(USE_X11)
|
|
if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL) {
|
|
- DVLOG(1) << "HW video decode acceleration not available without "
|
|
+ VLOG(1) << "HW video decode acceleration not available without "
|
|
"DesktopGL (GLX).";
|
|
return false;
|
|
}
|
|
#elif defined(USE_OZONE)
|
|
if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) {
|
|
- DVLOG(1) << "HW video decode acceleration not available without "
|
|
+ VLOG(1) << "HW video decode acceleration not available without "
|
|
<< "EGLGLES2.";
|
|
return false;
|
|
}
|
|
@@ -354,7 +354,7 @@ bool VaapiVideoDecodeAccelerator::Initia
|
|
VaapiWrapper::kDecode, profile, base::Bind(&ReportToUMA, VAAPI_ERROR));
|
|
|
|
if (!vaapi_wrapper_.get()) {
|
|
- DVLOG(1) << "Failed initializing VAAPI for profile " << profile;
|
|
+ VLOG(1) << "Failed initializing VAAPI for profile " << profile;
|
|
return false;
|
|
}
|
|
|
|
@@ -371,7 +371,7 @@ bool VaapiVideoDecodeAccelerator::Initia
|
|
vp9_accelerator_.reset(new VaapiVP9Accelerator(this, vaapi_wrapper_.get()));
|
|
decoder_.reset(new VP9Decoder(vp9_accelerator_.get()));
|
|
} else {
|
|
- DLOG(ERROR) << "Unsupported profile " << profile;
|
|
+ VLOG(1) << "Unsupported profile " << profile;
|
|
return false;
|
|
}
|
|
|
|
Index: beta.wily/content/gpu/gpu_main.cc
|
|
===================================================================
|
|
--- beta.wily.orig/content/gpu/gpu_main.cc
|
|
+++ beta.wily/content/gpu/gpu_main.cc
|
|
@@ -76,7 +76,7 @@
|
|
#include "content/common/sandbox_mac.h"
|
|
#endif
|
|
|
|
-#if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)
|
|
+#if (defined(OS_CHROMEOS) || defined(OS_LINUX)) && defined(ARCH_CPU_X86_FAMILY)
|
|
#include "content/common/gpu/media/vaapi_wrapper.h"
|
|
#endif
|
|
|
|
@@ -247,7 +247,7 @@ int GpuMain(const MainFunctionParams& pa
|
|
GetGpuInfoFromCommandLine(gpu_info, command_line);
|
|
gpu_info.in_process_gpu = false;
|
|
|
|
-#if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)
|
|
+#if (defined(OS_CHROMEOS) || defined(OS_LINUX)) && defined(ARCH_CPU_X86_FAMILY)
|
|
VaapiWrapper::PreSandboxInitialization();
|
|
#endif
|
|
|
|
Index: beta.wily/content/common/gpu/client/command_buffer_proxy_impl.cc
|
|
===================================================================
|
|
--- beta.wily.orig/content/common/gpu/client/command_buffer_proxy_impl.cc
|
|
+++ beta.wily/content/common/gpu/client/command_buffer_proxy_impl.cc
|
|
@@ -698,8 +698,10 @@ bool CommandBufferProxyImpl::ProduceFron
|
|
|
|
scoped_ptr<media::VideoDecodeAccelerator>
|
|
CommandBufferProxyImpl::CreateVideoDecoder() {
|
|
+ TRACE_EVENT0("gpu", "CommandBufferProxyImpl::CreateVideoDecoder");
|
|
if (!channel_)
|
|
return scoped_ptr<media::VideoDecodeAccelerator>();
|
|
+ VLOG(1) << "About to create GpuVideoDecodeAcceleratorHost.";
|
|
return scoped_ptr<media::VideoDecodeAccelerator>(
|
|
new GpuVideoDecodeAcceleratorHost(channel_, this));
|
|
}
|