ALT Linux Bugzilla
– Attachment 6491 Details for
Bug 31772
VA-API support patch
New bug
|
Search
|
[?]
|
Help
Register
|
Log In
[x]
|
Forgot Password
Login:
[x]
|
EN
|
RU
[patch]
chromium-enable_vaapi_on_linux.patch
chromium-enable_vaapi_on_linux.patch (text/plain), 17.17 KB, created by
Konstantin A Lepikhov (L.A. Kostis)
on 2016-02-09 13:31:32 MSK
(
hide
)
Description:
chromium-enable_vaapi_on_linux.patch
Filename:
MIME Type:
Creator:
Konstantin A Lepikhov (L.A. Kostis)
Created:
2016-02-09 13:31:32 MSK
Size:
17.17 KB
patch
obsolete
>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 >@@ -33,7 +33,7 @@ > #include "content/common/gpu/media/dxva_video_decode_accelerator.h" > #elif defined(OS_MACOSX) > #include "content/common/gpu/media/vt_video_decode_accelerator.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::GetSupportedP > // can be initialized by corresponding VDA successfully. > #if defined(OS_WIN) > 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 >@@ -1017,7 +1017,7 @@ const FeatureEntry kFeatureEntries[] = { > "disable-accelerated-video-decode", > IDS_FLAGS_DISABLE_ACCELERATED_VIDEO_DECODE_NAME, > IDS_FLAGS_DISABLE_ACCELERATED_VIDEO_DECODE_DESCRIPTION, >- kOsMac | kOsWin | kOsCrOS, >+ kOsAll, > SINGLE_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)); > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 31772
:
6490
| 6491