From d60511c973e432b97d9929dcfbd77c9af25dbd51 Mon Sep 17 00:00:00 2001 From: Daniel Charles Date: Fri, 01 Sep 2017 15:57:43 -0700 Subject: [PATCH] Enable VAVDA, VAVEA and VAJDA on linux with VAAPI only This patch contains all the changes necessary to use VA-API along with vaapi-driver to run all media use cases supported with hardware acceleration. It is intended to remain as experimental accessible from chrome://flags on linux. It requires libva/intel-vaapi-driver to be installed on the system path where chrome is executed. Other drivers could be tested if available. Flags are kept independent for linux, where this feature has to be enabled before actually using it. This should not change how other OSes use the flags already, the new flags will show at the buttom on the section of unavailable experiments The changes cover a range of compiler pre-processor flags to enable the stack. It moves the presandbox operations to the vaapi_wrapper class as the hook function is available there. vaInit will open driver on the correct installed folder. chrome flags consolidtation into only two flags for linux. Mjpeg and accelerated video are used. The other flags are kept for ChromeOS and other OSes. Developer testing was made on skylake hardware, ChromeOS and Ubuntu. BUG=NONE TEST="subjective testing with VAVDA,VAVEA and VAJDA, autotest for encoder" TEST="and decoder hardware accelerated" TEST="have libva/intel-vaapi-driver installed and not installed in the system" TEST="repeat on different hardware families" R=posciak@chromium.org R=kcwu@chromium.org Cq-Include-Trybots: master.tryserver.chromium.android:android_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel Change-Id: Ifbbf5c9e5221a8b5733fc6d4d0cf984a1f103171 Signed-off-by: Daniel Charles --- diff --git a/AUTHORS b/AUTHORS index 9936ab9..db5e449 100644 --- a/AUTHORS +++ b/AUTHORS @@ -161,6 +161,7 @@ Daniel Bevenius Daniel Bomar Daniel Carvalho Liedke +Daniel Charles Daniel Imms Daniel Johnson Daniel Lockyer diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index e4baad6..9e4a9f5 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc @@ -1227,12 +1227,14 @@ flag_descriptions::kUiPartialSwapDescription, kOsAll, SINGLE_DISABLE_VALUE_TYPE(switches::kUIDisablePartialSwap)}, #if BUILDFLAG(ENABLE_WEBRTC) +#if !defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID) {"disable-webrtc-hw-decoding", flag_descriptions::kWebrtcHwDecodingName, flag_descriptions::kWebrtcHwDecodingDescription, kOsAndroid | kOsCrOS, SINGLE_DISABLE_VALUE_TYPE(switches::kDisableWebRtcHWDecoding)}, {"disable-webrtc-hw-encoding", flag_descriptions::kWebrtcHwEncodingName, flag_descriptions::kWebrtcHwEncodingDescription, kOsAndroid | kOsCrOS, SINGLE_DISABLE_VALUE_TYPE(switches::kDisableWebRtcHWEncoding)}, +#endif {"enable-webrtc-hw-h264-encoding", flag_descriptions::kWebrtcHwH264EncodingName, flag_descriptions::kWebrtcHwH264EncodingDescription, kOsAndroid | kOsCrOS, @@ -1547,6 +1549,13 @@ flag_descriptions::kMultideviceDescription, kOsCrOS, FEATURE_VALUE_TYPE(features::kMultidevice)}, #endif // OS_CHROMEOS +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) + { + "enable-accelerated-video", flag_descriptions::kAcceleratedVideoName, + flag_descriptions::kAcceleratedVideoDescription, kOsLinux, + SINGLE_VALUE_TYPE(switches::kEnableAcceleratedVideo), + }, +#else { "disable-accelerated-video-decode", flag_descriptions::kAcceleratedVideoDecodeName, @@ -1554,6 +1563,7 @@ kOsMac | kOsWin | kOsCrOS | kOsAndroid, SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedVideoDecode), }, +#endif {"mojo-video-encode-accelerator", flag_descriptions::kMojoVideoEncodeAcceleratorName, flag_descriptions::kMojoVideoEncodeAcceleratorDescription, @@ -2212,12 +2222,17 @@ FEATURE_VALUE_TYPE(features::kWebVrVsyncAlign)}, #endif // OS_ANDROID #endif // ENABLE_VR -#if defined(OS_CHROMEOS) +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) + {"enable-accelerated-mjpeg-decode", + flag_descriptions::kAcceleratedMjpegDecodeName, + flag_descriptions::kAcceleratedMjpegDecodeDescription, kOsLinux, + SINGLE_VALUE_TYPE(switches::kEnableAcceleratedMjpegDecode)}, +#elif defined(OS_CHROMEOS) {"disable-accelerated-mjpeg-decode", flag_descriptions::kAcceleratedMjpegDecodeName, flag_descriptions::kAcceleratedMjpegDecodeDescription, kOsCrOS, SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedMjpegDecode)}, -#endif // OS_CHROMEOS +#endif {"v8-cache-options", flag_descriptions::kV8CacheOptionsName, flag_descriptions::kV8CacheOptionsDescription, kOsAll, MULTI_VALUE_TYPE(kV8CacheOptionsChoices)}, diff --git a/chrome/browser/chromeos/login/chrome_restart_request.cc b/chrome/browser/chromeos/login/chrome_restart_request.cc index 761a240..c29be3d 100644 --- a/chrome/browser/chromeos/login/chrome_restart_request.cc +++ b/chrome/browser/chromeos/login/chrome_restart_request.cc @@ -80,8 +80,13 @@ ::switches::kDisable2dCanvasImageChromium, ::switches::kDisableAccelerated2dCanvas, ::switches::kDisableAcceleratedJpegDecoding, +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) + ::switches::kEnableAcceleratedMjpegDecode, + ::switches::kEnableAcceleratedVideo, +#else ::switches::kDisableAcceleratedMjpegDecode, ::switches::kDisableAcceleratedVideoDecode, +#endif ::switches::kDisableBlinkFeatures, ::switches::kDisableCastStreamingHWEncoding, ::switches::kDisableDistanceFieldText, @@ -168,7 +173,7 @@ ::switches::kDisableWebGLImageChromium, ::switches::kEnableWebGLImageChromium, ::switches::kEnableWebVR, -#if BUILDFLAG(ENABLE_WEBRTC) +#if BUILDFLAG(ENABLE_WEBRTC) && (defined(OS_CHROMEOS) || defined(OS_ANDROID)) ::switches::kDisableWebRtcHWDecoding, ::switches::kDisableWebRtcHWEncoding, #endif diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 42fc3a2..a0700fe 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc @@ -14,6 +14,13 @@ "Enables the use of the GPU to perform 2d canvas rendering instead of " "using software rendering."; +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) +const char kAcceleratedVideoName[] = "Hardware-accelerated video"; +const char kAcceleratedVideoDescription[] = + "Hardware-accelerated video where VA-API driver is installed on the" + "system."; +#endif + const char kAcceleratedVideoDecodeName[] = "Hardware-accelerated video decode"; const char kAcceleratedVideoDecodeDescription[] = "Hardware-accelerated video decode where available."; @@ -1412,6 +1419,7 @@ const char kWebrtcEchoCanceller3Description[] = "Experimental WebRTC echo canceller (AEC3)."; +#if !defined(OS_LINUX) || !defined(OS_CHROMEOS) const char kWebrtcHwDecodingName[] = "WebRTC hardware video decoding"; const char kWebrtcHwDecodingDescription[] = "Support in WebRTC for decoding video streams using platform hardware."; @@ -1419,6 +1427,7 @@ const char kWebrtcHwEncodingName[] = "WebRTC hardware video encoding"; const char kWebrtcHwEncodingDescription[] = "Support in WebRTC for encoding video streams using platform hardware."; +#endif const char kWebrtcHwH264EncodingName[] = "WebRTC hardware h264 video encoding"; const char kWebrtcHwH264EncodingDescription[] = @@ -2205,14 +2214,16 @@ // Chrome OS ------------------------------------------------------------------- -#if defined(OS_CHROMEOS) +#if defined(OS_CHROMEOS) || (defined(OS_LINUX) && !defined(OS_ANDROID)) const char kAcceleratedMjpegDecodeName[] = "Hardware-accelerated mjpeg decode for captured frame"; const char kAcceleratedMjpegDecodeDescription[] = "Enable hardware-accelerated mjpeg decode for captured frame where " "available."; +#endif +#if defined(OS_CHROMEOS) const char kAllowTouchpadThreeFingerClickName[] = "Touchpad three-finger-click"; const char kAllowTouchpadThreeFingerClickDescription[] = "Enables touchpad three-finger-click as middle button."; diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index d6fcf7d..3cbc7ad 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h @@ -36,6 +36,10 @@ extern const char kAccelerated2dCanvasName[]; extern const char kAccelerated2dCanvasDescription[]; +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) +extern const char kAcceleratedVideoName[]; +extern const char kAcceleratedVideoDescription[]; +#endif extern const char kAcceleratedVideoDecodeName[]; extern const char kAcceleratedVideoDecodeDescription[]; @@ -1351,13 +1355,17 @@ #endif // defined(OS_MACOSX) -// Chrome OS ------------------------------------------------------------------ - -#if defined(OS_CHROMEOS) +#if defined(OS_CHROMEOS) || (defined(OS_LINUX) && !defined(OS_ANDROID)) extern const char kAcceleratedMjpegDecodeName[]; extern const char kAcceleratedMjpegDecodeDescription[]; +#endif + +// Chrome OS ------------------------------------------------------------------ + +#if defined(OS_CHROMEOS) + extern const char kAllowTouchpadThreeFingerClickName[]; extern const char kAllowTouchpadThreeFingerClickDescription[]; diff --git a/content/browser/gpu/compositor_util.cc b/content/browser/gpu/compositor_util.cc index 0461556..3dc14164 100644 --- a/content/browser/gpu/compositor_util.cc +++ b/content/browser/gpu/compositor_util.cc @@ -104,7 +104,11 @@ {"video_decode", manager->IsFeatureBlacklisted( gpu::GPU_FEATURE_TYPE_ACCELERATED_VIDEO_DECODE), +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) + !command_line.HasSwitch(switches::kEnableAcceleratedVideo), +#else command_line.HasSwitch(switches::kDisableAcceleratedVideoDecode), +#endif "Accelerated video decode has been disabled, either via blacklist," " about:flags or the command line.", true}, @@ -112,7 +116,11 @@ {"video_encode", manager->IsFeatureBlacklisted( gpu::GPU_FEATURE_TYPE_ACCELERATED_VIDEO_ENCODE), +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) + !command_line.HasSwitch(switches::kEnableAcceleratedVideo), +#else command_line.HasSwitch(switches::kDisableWebRtcHWEncoding), +#endif "Accelerated video encode has been disabled, either via blacklist," " about:flags or the command line.", true}, diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc index 4388cef..f3aa640 100644 --- a/content/browser/gpu/gpu_data_manager_impl_private.cc +++ b/content/browser/gpu/gpu_data_manager_impl_private.cc @@ -717,7 +717,11 @@ DCHECK(command_line); if (ShouldDisableAcceleratedVideoDecode(command_line)) +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) + command_line->AppendSwitch(switches::kEnableAcceleratedVideo); +#else command_line->AppendSwitch(switches::kDisableAcceleratedVideoDecode); +#endif #if defined(USE_AURA) if (!CanUseGpuBrowserCompositor()) @@ -751,7 +755,11 @@ } if (ShouldDisableAcceleratedVideoDecode(command_line)) { +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) + command_line->AppendSwitch(switches::kEnableAcceleratedVideo); +#else command_line->AppendSwitch(switches::kDisableAcceleratedVideoDecode); +#endif } #if defined(USE_OZONE) @@ -844,7 +852,12 @@ const base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (!ShouldDisableAcceleratedVideoDecode(command_line) && - !command_line->HasSwitch(switches::kDisableAcceleratedVideoDecode)) { +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) + command_line->HasSwitch(switches::kEnableAcceleratedVideo) +#else + !command_line->HasSwitch(switches::kDisableAcceleratedVideoDecode) +#endif + ) { prefs->pepper_accelerated_video_decode_enabled = true; } } @@ -1043,7 +1056,13 @@ // to resolve crbug/442039 has been collected. const std::string group_name = base::FieldTrialList::FindFullName( "DisableAcceleratedVideoDecode"); - if (command_line->HasSwitch(switches::kDisableAcceleratedVideoDecode)) { + if ( +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) + !command_line->HasSwitch(switches::kEnableAcceleratedVideo) +#else + command_line->HasSwitch(switches::kDisableAcceleratedVideoDecode) +#endif + ) { // It was already disabled on the command line. return false; } diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc index e1879c6..f29313f 100644 --- a/content/browser/gpu/gpu_process_host.cc +++ b/content/browser/gpu/gpu_process_host.cc @@ -112,7 +112,11 @@ // Command-line switches to propagate to the GPU process. static const char* const kSwitchNames[] = { +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) + switches::kEnableAcceleratedVideo, +#else switches::kDisableAcceleratedVideoDecode, +#endif switches::kDisableBreakpad, switches::kDisableGpuRasterization, switches::kDisableGpuSandbox, @@ -121,7 +125,7 @@ switches::kDisableLogging, switches::kDisableSeccompFilterSandbox, switches::kDisableShaderNameHashing, -#if BUILDFLAG(ENABLE_WEBRTC) +#if BUILDFLAG(ENABLE_WEBRTC) && !defined(OS_LINUX) switches::kDisableWebRtcHWEncoding, #endif #if defined(OS_WIN) diff --git a/content/browser/renderer_host/media/video_capture_browsertest.cc b/content/browser/renderer_host/media/video_capture_browsertest.cc index 8ca0ad0..8c489d0 100644 --- a/content/browser/renderer_host/media/video_capture_browsertest.cc +++ b/content/browser/renderer_host/media/video_capture_browsertest.cc @@ -155,8 +155,13 @@ base::CommandLine::ForCurrentProcess()->AppendSwitch( switches::kUseFakeJpegDecodeAccelerator); } else { +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kEnableAcceleratedMjpegDecode); +#else base::CommandLine::ForCurrentProcess()->AppendSwitch( switches::kDisableAcceleratedMjpegDecode); +#endif } if (params_.use_mojo_service) { base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( diff --git a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc index 22fbcb8..52b3337 100644 --- a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc +++ b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc @@ -56,15 +56,21 @@ bool is_platform_supported = base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kUseFakeJpegDecodeAccelerator); -#if defined(OS_CHROMEOS) - // Non-ChromeOS platforms do not support HW JPEG decode now. Do not establish - // gpu channel to avoid introducing overhead. +#if !defined(OS_ANDROID) && defined(OS_LINUX) + // Non-ChromeOS or Non-Linux platforms do not support HW JPEG decode now. Do + // not establish gpu channel to avoid introducing overhead. is_platform_supported = true; #endif if (!is_platform_supported || +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) + !base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableAcceleratedMjpegDecode) +#else base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kDisableAcceleratedMjpegDecode)) { + switches::kDisableAcceleratedMjpegDecode) +#endif + ) { decoder_status_ = FAILED; RecordInitDecodeUMA_Locked(); return; diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 35cb294..c39c975 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc @@ -2488,7 +2488,11 @@ switches::kDisable2dCanvasImageChromium, switches::kDisable3DAPIs, switches::kDisableAcceleratedJpegDecoding, +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + switches::kEnableAcceleratedVideo, +#else switches::kDisableAcceleratedVideoDecode, +#endif switches::kDisableBackgroundTimerThrottling, switches::kDisableBreakpad, switches::kDisablePreferCompositingToLCDText, @@ -2641,8 +2645,10 @@ switches::kEnablePepperTesting, #endif #if BUILDFLAG(ENABLE_WEBRTC) +#if !defined(OS_LINUX) || defined(OS_CHROMEOS) switches::kDisableWebRtcHWDecoding, switches::kDisableWebRtcHWEncoding, +#endif switches::kEnableWebRtcSrtpAesGcm, switches::kEnableWebRtcSrtpEncryptedHeaders, switches::kEnableWebRtcStunOrigin, diff --git a/content/browser/webrtc/webrtc_media_recorder_browsertest.cc b/content/browser/webrtc/webrtc_media_recorder_browsertest.cc index 3d815a2..2c96048 100644 --- a/content/browser/webrtc/webrtc_media_recorder_browsertest.cc +++ b/content/browser/webrtc/webrtc_media_recorder_browsertest.cc @@ -58,7 +58,12 @@ return; // This flag is also used for encoding, https://crbug.com/616640. base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kDisableAcceleratedVideoDecode); +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + switches::kEnableAcceleratedVideo +#else + switches::kDisableAcceleratedVideoDecode +#endif + ); } private: diff --git a/content/common/sandbox_linux/bpf_gpu_policy_linux.cc b/content/common/sandbox_linux/bpf_gpu_policy_linux.cc index ac5dc5a..ed6196c 100644 --- a/content/common/sandbox_linux/bpf_gpu_policy_linux.cc +++ b/content/common/sandbox_linux/bpf_gpu_policy_linux.cc @@ -57,22 +57,6 @@ #endif } -inline bool IsArchitectureX86_64() { -#if defined(__x86_64__) - return true; -#else - return false; -#endif -} - -inline bool IsArchitectureI386() { -#if defined(__i386__) - return true; -#else - return false; -#endif -} - inline bool IsArchitectureArm() { #if defined(__arm__) || defined(__aarch64__) return true; @@ -97,21 +81,14 @@ #endif } -bool IsAcceleratedVaapiVideoEncodeEnabled() { - bool accelerated_encode_enabled = false; -#if defined(OS_CHROMEOS) - const base::CommandLine& command_line = - *base::CommandLine::ForCurrentProcess(); - accelerated_encode_enabled = - !command_line.HasSwitch(switches::kDisableVaapiAcceleratedVideoEncode); -#endif - return accelerated_encode_enabled; -} - bool IsAcceleratedVideoDecodeEnabled() { const base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + return command_line.HasSwitch(switches::kEnableAcceleratedVideo); +#else return !command_line.HasSwitch(switches::kDisableAcceleratedVideoDecode); +#endif } intptr_t GpuSIGSYS_Handler(const struct arch_seccomp_data& args, @@ -295,33 +272,6 @@ GpuBrokerProcessPolicy::Create, std::vector()); // No extra files in whitelist. - if (IsArchitectureX86_64() || IsArchitectureI386()) { - // Accelerated video dlopen()'s some shared objects - // inside the sandbox, so preload them now. - if (IsAcceleratedVaapiVideoEncodeEnabled() || - IsAcceleratedVideoDecodeEnabled()) { - const char* I965DrvVideoPath = NULL; - const char* I965HybridDrvVideoPath = NULL; - - 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"; - } - - 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 - } - } - return true; } diff --git a/content/gpu/BUILD.gn b/content/gpu/BUILD.gn index a5424bb..b68b802 100644 --- a/content/gpu/BUILD.gn +++ b/content/gpu/BUILD.gn @@ -45,7 +45,6 @@ ] configs += [ "//content:content_implementation" ] - deps = [ "//base", "//base/third_party/dynamic_annotations", @@ -114,4 +113,8 @@ if (enable_vulkan) { deps += [ "//gpu/vulkan" ] } + + if (is_desktop_linux) { + public_configs = [ "//media/gpu:libva_config" ] + } } diff --git a/content/gpu/gpu_main.cc b/content/gpu/gpu_main.cc index 6a1de90..9a84e9e 100644 --- a/content/gpu/gpu_main.cc +++ b/content/gpu/gpu_main.cc @@ -245,7 +245,7 @@ // Initializes StatisticsRecorder which tracks UMA histograms. base::StatisticsRecorder::Initialize(); -#if defined(OS_ANDROID) || defined(OS_CHROMEOS) +#if defined(OS_LINUX) // Set thread priority before sandbox initialization. base::PlatformThread::SetCurrentThreadPriority(base::ThreadPriority::DISPLAY); #endif @@ -275,7 +275,7 @@ GetContentClient()->SetGpuInfo(gpu_init.gpu_info()); base::ThreadPriority io_thread_priority = base::ThreadPriority::NORMAL; -#if defined(OS_ANDROID) || defined(OS_CHROMEOS) +#if defined(OS_LINUX) io_thread_priority = base::ThreadPriority::DISPLAY; #endif diff --git a/content/public/browser/gpu_utils.cc b/content/public/browser/gpu_utils.cc index 7d926da..70afc33 100644 --- a/content/public/browser/gpu_utils.cc +++ b/content/public/browser/gpu_utils.cc @@ -57,12 +57,19 @@ gpu_preferences.ui_prioritize_in_gpu_process = command_line->HasSwitch(switches::kUIPrioritizeInGpuProcess); gpu_preferences.disable_accelerated_video_decode = +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + !command_line->HasSwitch(switches::kEnableAcceleratedVideo); +#else command_line->HasSwitch(switches::kDisableAcceleratedVideoDecode); -#if defined(OS_CHROMEOS) +#endif +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + gpu_preferences.disable_vaapi_accelerated_video_encode = + !command_line->HasSwitch(switches::kEnableAcceleratedVideo); +#elif defined(OS_CHROMEOS) gpu_preferences.disable_vaapi_accelerated_video_encode = command_line->HasSwitch(switches::kDisableVaapiAcceleratedVideoEncode); #endif -#if BUILDFLAG(ENABLE_WEBRTC) +#if BUILDFLAG(ENABLE_WEBRTC) && (!defined(OS_LINUX) || defined(OS_CHROMEOS)) gpu_preferences.disable_web_rtc_hw_encoding = command_line->HasSwitch(switches::kDisableWebRtcHWEncoding); #endif diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index 78041e2..60f6597 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc @@ -88,12 +88,21 @@ // Disable gpu-accelerated 2d canvas. const char kDisableAccelerated2dCanvas[] = "disable-accelerated-2d-canvas"; - +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) +// Enable hardware accelerated mjpeg decode on linux +const char kEnableAcceleratedMjpegDecode[] = "enable-accelerated-mjpeg-decode"; +#else // Disable hardware acceleration of mjpeg decode for captured frame, where // available. const char kDisableAcceleratedMjpegDecode[] = "disable-accelerated-mjpeg-decode"; +#endif +#if defined(OS_LINUX) +// Enables hardware acceleration of video for Linux only. VA-API driver +// is required to be present on the system installation. +const char kEnableAcceleratedVideo[] = "enable-accelerated-video"; +#endif // Disables hardware acceleration of video decode, where available. const char kDisableAcceleratedVideoDecode[] = "disable-accelerated-video-decode"; @@ -933,11 +942,13 @@ // ignores this switch on its stable and beta channels. const char kDisableWebRtcEncryption[] = "disable-webrtc-encryption"; +#if defined(OS_CHROMEOS) // Disables HW decode acceleration for WebRTC. const char kDisableWebRtcHWDecoding[] = "disable-webrtc-hw-decoding"; // Disables HW encode acceleration for WebRTC. const char kDisableWebRtcHWEncoding[] = "disable-webrtc-hw-encoding"; +#endif // Enables negotiation of GCM cipher suites from RFC 7714 for SRTP in WebRTC. // See https://tools.ietf.org/html/rfc7714 for further information. diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index 9451a76..275b5ed 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h @@ -35,7 +35,11 @@ CONTENT_EXPORT extern const char kDisable3DAPIs[]; CONTENT_EXPORT extern const char kDisableAccelerated2dCanvas[]; CONTENT_EXPORT extern const char kDisableAcceleratedJpegDecoding[]; +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) +CONTENT_EXPORT extern const char kEnableAcceleratedMjpegDecode[]; +#else CONTENT_EXPORT extern const char kDisableAcceleratedMjpegDecode[]; +#endif CONTENT_EXPORT extern const char kDisableAcceleratedVideoDecode[]; CONTENT_EXPORT extern const char kDisableAudioSupportForDesktopShare[]; extern const char kDisableBackingStoreLimit[]; @@ -107,6 +111,9 @@ CONTENT_EXPORT extern const char kDomAutomationController[]; extern const char kDisable2dCanvasClipAntialiasing[]; CONTENT_EXPORT extern const char kDumpBlinkRuntimeCallStats[]; +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && !defined(OS_ANDROID) +CONTENT_EXPORT extern const char kEnableAcceleratedVideo[]; +#endif CONTENT_EXPORT extern const char kEnableAggressiveDOMStorageFlushing[]; CONTENT_EXPORT extern const char kEnablePreferCompositingToLCDText[]; CONTENT_EXPORT extern const char kEnableBlinkFeatures[]; @@ -261,8 +268,10 @@ #if BUILDFLAG(ENABLE_WEBRTC) CONTENT_EXPORT extern const char kDisableWebRtcEncryption[]; +#if defined(OS_CHROMEOS) CONTENT_EXPORT extern const char kDisableWebRtcHWDecoding[]; CONTENT_EXPORT extern const char kDisableWebRtcHWEncoding[]; +#endif CONTENT_EXPORT extern const char kEnableWebRtcSrtpAesGcm[]; CONTENT_EXPORT extern const char kEnableWebRtcSrtpEncryptedHeaders[]; CONTENT_EXPORT extern const char kEnableWebRtcStunOrigin[]; diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc index 9d05ac0..69555fa 100644 --- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc +++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc @@ -240,10 +240,19 @@ const base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); if (gpu_factories && gpu_factories->IsGpuVideoAcceleratorEnabled()) { +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + if (cmd_line->HasSwitch(switches::kEnableAcceleratedVideo)) +#else if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWDecoding)) +#endif decoder_factory.reset(new RTCVideoDecoderFactory(gpu_factories)); - if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding)) { +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + if (cmd_line->HasSwitch(switches::kEnableAcceleratedVideo)) +#else + if (!cmd_line->HasSwitch(switches::kDisableWebRtcHWEncoding)) +#endif + { encoder_factory.reset(new RTCVideoEncoderFactory(gpu_factories)); } } diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 4bbfbf6..e85b5c6 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc @@ -1457,7 +1457,11 @@ scoped_refptr media_task_runner = GetMediaThreadTaskRunner(); const bool enable_video_accelerator = +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + cmd_line->HasSwitch(switches::kEnableAcceleratedVideo); +#else !cmd_line->HasSwitch(switches::kDisableAcceleratedVideoDecode); +#endif const bool enable_gpu_memory_buffer_video_frames = #if defined(OS_MACOSX) || defined(OS_LINUX) !cmd_line->HasSwitch(switches::kDisableGpuMemoryBufferVideoFrames) && diff --git a/gpu/command_buffer/service/gpu_preferences.h b/gpu/command_buffer/service/gpu_preferences.h index 8dd0ff1..d6e5c59 100644 --- a/gpu/command_buffer/service/gpu_preferences.h +++ b/gpu/command_buffer/service/gpu_preferences.h @@ -50,7 +50,7 @@ // Disables hardware acceleration of video decode, where available. bool disable_accelerated_video_decode = false; -#if defined(OS_CHROMEOS) +#if defined(OS_CHROMEOS) || defined(OS_LINUX) // Disables VA-API accelerated video encode. bool disable_vaapi_accelerated_video_encode = false; #endif diff --git a/gpu/config/software_rendering_list.json b/gpu/config/software_rendering_list.json index 5edb5636..069ae95 100644 --- a/gpu/config/software_rendering_list.json +++ b/gpu/config/software_rendering_list.json @@ -371,17 +371,6 @@ ] }, { - "id": 48, - "description": "Accelerated video decode is unavailable on Linux", - "cr_bugs": [137247], - "os": { - "type": "linux" - }, - "features": [ - "accelerated_video_decode" - ] - }, - { "id": 50, "description": "Disable VMware software renderer on older Mesa", "cr_bugs": [145531, 332596, 571899, 629434], diff --git a/media/filters/BUILD.gn b/media/filters/BUILD.gn index 0362601..ebed982 100644 --- a/media/filters/BUILD.gn +++ b/media/filters/BUILD.gn @@ -182,7 +182,7 @@ deps += [ "//media/base/android" ] } - if (current_cpu != "arm" && is_chromeos) { + if (current_cpu != "arm" && (is_chromeos || is_desktop_linux)) { sources += [ "h264_bitstream_buffer.cc", "h264_bitstream_buffer.h", diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn index 613e830..a886955 100644 --- a/media/gpu/BUILD.gn +++ b/media/gpu/BUILD.gn @@ -24,6 +24,14 @@ import("//build/config/mac/mac_sdk.gni") } +if (is_desktop_linux && use_vaapi) { + import("//build/config/linux/pkg_config.gni") + + pkg_config("libva_config") { + packages = [ "libva" ] + } +} + if (use_vaapi) { action("libva_generate_stubs") { extra_header = "va_stub_header.fragment" @@ -334,6 +342,9 @@ "vaapi_drm_picture.h", ] } + if (is_desktop_linux) { + public_configs = [ ":libva_config" ] + } } if (is_win) { diff --git a/media/gpu/gpu_video_decode_accelerator_factory.cc b/media/gpu/gpu_video_decode_accelerator_factory.cc index 22f8f4a..ec6615d 100644 --- a/media/gpu/gpu_video_decode_accelerator_factory.cc +++ b/media/gpu/gpu_video_decode_accelerator_factory.cc @@ -86,6 +86,7 @@ // profile (instead of calculating a superset). // TODO(posciak,henryhsu): improve this so that we choose a superset of // resolutions and other supported profile parameters. + DVLOG(1) << "Get Supported profiles"; #if defined(OS_WIN) capabilities.supported_profiles = DXVAVideoDecodeAccelerator::GetSupportedProfiles(gpu_preferences, diff --git a/media/gpu/vaapi_wrapper.cc b/media/gpu/vaapi_wrapper.cc index 97ed997..14511cb 100644 --- a/media/gpu/vaapi_wrapper.cc +++ b/media/gpu/vaapi_wrapper.cc @@ -1116,6 +1116,7 @@ if (drm_file.IsValid()) GetDisplayState()->SetDrmFd(drm_file.GetPlatformFile()); #endif + GetProfileInfos(); // dlopen all necessary libraries } // static diff --git a/services/ui/gpu/gpu_main.cc b/services/ui/gpu/gpu_main.cc index 0916374..cabf058 100644 --- a/services/ui/gpu/gpu_main.cc +++ b/services/ui/gpu/gpu_main.cc @@ -79,7 +79,7 @@ thread_options.message_loop_type = base::MessageLoop::TYPE_IO; #endif -#if defined(OS_ANDROID) || defined(OS_CHROMEOS) +#if defined(OS_LINUX) thread_options.priority = base::ThreadPriority::DISPLAY; #endif CHECK(gpu_thread_.StartWithOptions(thread_options)); @@ -89,7 +89,7 @@ // should be possible to use |main_task_runner_| for doing IO tasks. thread_options = base::Thread::Options(base::MessageLoop::TYPE_IO, 0); thread_options.priority = base::ThreadPriority::NORMAL; -#if defined(OS_ANDROID) || defined(OS_CHROMEOS) +#if defined(OS_LINUX) // TODO(reveman): Remove this in favor of setting it explicitly for each type // of process. thread_options.priority = base::ThreadPriority::DISPLAY;