diff --git a/chromium-browser-stable.spec b/chromium-browser-stable.spec index 91c2c1f..07052fb 100644 --- a/chromium-browser-stable.spec +++ b/chromium-browser-stable.spec @@ -11,7 +11,7 @@ %define chromium_system_libs 1 %define ffmpeg 1 %define icu 0 -%define libva 0 +%define libva 1 # Set up Google API keys, see http://www.chromium.org/developers/how-tos/api-keys # Note: these are for Mageia use ONLY. @@ -23,7 +23,7 @@ Summary: A fast web browser based on the Blink engine Name: chromium-browser-stable Version: 63.0.3239.132 -Release: 1 +Release: 2 License: BSD, LGPL Group: Networking/WWW Url: https://www.chromium.org/Home @@ -71,15 +71,13 @@ Patch501: chromium-ps-print.patch # Google patched their bundled copy of icu 54 to include API functionality that wasn't added until 55. # :P Patch502: chromium-45.0.2454.101-system-icu-54-does-not-have-detectHostTimeZone.patch -# http://bazaar.launchpad.net/~saiarcot895/chromium-browser/chromium-browser.trusty.beta/revision/230#debian/patches/enable_vaapi_on_linux.diff -Patch503: enable_vaapi_on_linux.diff # Patch to fix build with use_system_libvpx # Chromium bug #541273 # fix build with icu other than 54 Patch504: chromium-system-icu-r0.patch -# fix https://bugs.chromium.org/p/chromium/issues/detail?id=585513 -# vaInitialize failed VA error: unknown libva error -Patch507: issue1688073002_40001.diff +# https://aur.archlinux.org/packages/chromium-vaapi/ +Patch508: chromium-vaapi-r15.patch + # ROSA Build Patch600: chromium-buildname-60.0.3112.90.patch # Patch to fix build @@ -202,6 +200,7 @@ your profile before changing channels. %{_crdir}/*_blob.bin %{_crdir}/themes %{_crdir}/default_apps +%{_crdir}/swiftshader %dir %{_crdir}/pepper %{_datadir}/applications/*.desktop %{_iconsdir}/hicolor/*/apps/chromium* @@ -282,8 +281,7 @@ members of the Chromium and WebDriver teams. %endif %if 0%{?libva} -%patch503 -p1 -b .vaapi -%patch507 -p1 +%patch508 -p1 -b .vaapi2 %endif %patch600 -p1 @@ -376,7 +374,7 @@ mkdir -p third_party/node/linux/node-linux-x64/bin ln -s /usr/bin/node third_party/node/linux/node-linux-x64/bin/node %build -%define system_gn_list ffmpeg flac libxslt snappy yasm libpng zlib jsoncpp freetype +%define system_gn_list ffmpeg flac libxslt snappy yasm libpng zlib jsoncpp # opus # icu # libevent @@ -422,6 +420,7 @@ ln -s /usr/bin/node third_party/node/linux/node-linux-x64/bin/node use_libpci = true \ is_debug=false \ is_clang=false \ + use_vaapi=true \ use_system_freetype=true \ use_system_harfbuzz=true \ google_api_key="%{google_api_key}" \ @@ -473,6 +472,8 @@ ln -s %{_crdir}/chromium-wrapper %{buildroot}%{_bindir}/%{crname} sed -i "s!@LIBDIR@!%{_libdir}!g" %{buildroot}%{_crdir}/chromium-wrapper ln -s %{_crdir}/chromedriver %{buildroot}%{_bindir}/chromedriver +cp -r out/Release/swiftshader %{buildroot}%{_crdir} + # create global config file mkdir -p %{buildroot}%{_sysconfdir}/default install -m644 %{SOURCE32} %{buildroot}%{_sysconfdir}/default/%{crname} diff --git a/chromium-gcc5-r3.patch b/chromium-gcc5-r3.patch deleted file mode 100644 index c2ad7ae..0000000 --- a/chromium-gcc5-r3.patch +++ /dev/null @@ -1,62 +0,0 @@ ---- a/gpu/ipc/common/mailbox_struct_traits.h -+++ b/gpu/ipc/common/mailbox_struct_traits.h -@@ -15,7 +15,7 @@ namespace mojo { - template <> - struct StructTraits { - static base::span name(const gpu::Mailbox& mailbox) { -- return mailbox.name; -+ return base::make_span(mailbox.name); - } - static bool Read(gpu::mojom::MailboxDataView data, gpu::Mailbox* out); - }; ---- a/services/viz/public/cpp/compositing/filter_operation_struct_traits.h -+++ b/services/viz/public/cpp/compositing/filter_operation_struct_traits.h -@@ -134,7 +134,7 @@ struct StructTraits { - static base::span matrix(const cc::FilterOperation& operation) { - if (operation.type() != cc::FilterOperation::COLOR_MATRIX) - return base::span(); -- return operation.matrix(); -+ return base::make_span(operation.matrix()); - } - - static base::span shape( ---- a/services/viz/public/cpp/compositing/quads_struct_traits.h -+++ b/services/viz/public/cpp/compositing/quads_struct_traits.h -@@ -284,7 +284,7 @@ - - static base::span vertex_opacity(const cc::DrawQuad& input) { - const cc::TextureDrawQuad* quad = cc::TextureDrawQuad::MaterialCast(&input); -- return quad->vertex_opacity; -+ return base::make_span(quad->vertex_opacity); - } - - static bool y_flipped(const cc::DrawQuad& input) { ---- a/third_party/WebKit/Source/platform/exported/WebCORS.cpp -+++ b/third_party/WebKit/Source/platform/exported/WebCORS.cpp -@@ -480,7 +480,7 @@ WebString AccessControlErrorString( - } - default: - NOTREACHED(); -- return ""; -+ return WebString(); - } - } - -@@ -512,7 +512,7 @@ WebString PreflightErrorString(const PreflightStatus status, - } - default: - NOTREACHED(); -- return ""; -+ return WebString(); - } - } - -@@ -533,7 +533,7 @@ WebString RedirectErrorString(const RedirectStatus status, - } - default: - NOTREACHED(); -- return ""; -+ return WebString(); - } - } - diff --git a/chromium-vaapi-r15.patch b/chromium-vaapi-r15.patch new file mode 100644 index 0000000..b8dff36 --- /dev/null +++ b/chromium-vaapi-r15.patch @@ -0,0 +1,722 @@ +From 7f29b44224439377592be2b75da0b86d82d8ad6d Mon Sep 17 00:00:00 2001 +From: Daniel Charles +Date: Wed, 18 Oct 2017 17:27:42 -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/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc +index 3555293..4c3115f 100644 +--- a/chrome/browser/about_flags.cc ++++ b/chrome/browser/about_flags.cc +@@ -1246,12 +1246,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, +@@ -1557,6 +1559,13 @@ + flag_descriptions::kSpuriousPowerButtonLidAngleChangeDescription, kOsCrOS, + MULTI_VALUE_TYPE(kSpuriousPowerButtonLidAngleChangeChoices)}, + #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, +@@ -1564,6 +1573,7 @@ + kOsMac | kOsWin | kOsCrOS | kOsAndroid, + SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedVideoDecode), + }, ++#endif + {"mojo-video-encode-accelerator", + flag_descriptions::kMojoVideoEncodeAcceleratorName, + flag_descriptions::kMojoVideoEncodeAcceleratorDescription, +@@ -2229,12 +2239,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 3815e79..d5d3712 100644 +--- a/chrome/browser/chromeos/login/chrome_restart_request.cc ++++ b/chrome/browser/chromeos/login/chrome_restart_request.cc +@@ -19,6 +19,7 @@ + #include "base/sys_info.h" + #include "base/timer/timer.h" + #include "base/values.h" ++#include "build/build_config.h" + #include "cc/base/switches.h" + #include "chrome/browser/browser_process.h" + #include "chrome/browser/chromeos/boot_times_recorder.h" +@@ -79,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, +@@ -166,7 +172,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 74e6bc7..ab184a5 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."; +@@ -1478,6 +1485,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."; +@@ -1485,6 +1493,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[] = +@@ -2283,14 +2292,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 54a4950..5ace5e0 100644 +--- a/chrome/browser/flag_descriptions.h ++++ b/chrome/browser/flag_descriptions.h +@@ -37,6 +37,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[]; + +@@ -1401,13 +1405,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 122282d..bc102a3 100644 +--- a/content/browser/gpu/compositor_util.cc ++++ b/content/browser/gpu/compositor_util.cc +@@ -105,7 +105,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}, +@@ -113,7 +117,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 51aa672..963da85 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()) +@@ -748,7 +752,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) +@@ -826,7 +834,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; + } + } +@@ -1016,7 +1029,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 95d4dff..9b26d3f 100644 +--- a/content/browser/gpu/gpu_process_host.cc ++++ b/content/browser/gpu/gpu_process_host.cc +@@ -111,7 +111,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, +@@ -120,7 +124,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 34afec23..ad77490 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 fbe4d21..1be295e 100644 +--- a/content/browser/renderer_host/render_process_host_impl.cc ++++ b/content/browser/renderer_host/render_process_host_impl.cc +@@ -2506,7 +2506,11 @@ + switches::kDefaultTileHeight, + switches::kDisable2dCanvasImageChromium, + switches::kDisableAcceleratedJpegDecoding, ++#if defined(OS_LINUX) && !defined(OS_CHROMEOS) ++ switches::kEnableAcceleratedVideo, ++#else + switches::kDisableAcceleratedVideoDecode, ++#endif + switches::kDisableBackgroundTimerThrottling, + switches::kDisableBreakpad, + switches::kDisableBrowserSideNavigation, +@@ -2660,8 +2664,10 @@ + switches::kDisableMojoRenderer, + #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/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 556cf00..730f4ae 100644 +--- a/content/gpu/gpu_main.cc ++++ b/content/gpu/gpu_main.cc +@@ -254,7 +254,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 +@@ -283,7 +283,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 6aafb06..d4ddd8d 100644 +--- a/content/public/browser/gpu_utils.cc ++++ b/content/public/browser/gpu_utils.cc +@@ -7,6 +7,7 @@ + #include "base/command_line.h" + #include "base/single_thread_task_runner.h" + #include "base/strings/string_number_conversions.h" ++#include "build/build_config.h" + #include "content/browser/gpu/gpu_process_host.h" + #include "content/public/common/content_features.h" + #include "content/public/common/content_switches.h" +@@ -57,12 +58,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 4e699d1..3a7a2b7 100644 +--- a/content/public/common/content_switches.cc ++++ b/content/public/common/content_switches.cc +@@ -89,12 +89,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"; +@@ -932,11 +941,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 2704924..67d00bb 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[]; +@@ -109,6 +113,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 kEnableAutomation[]; + CONTENT_EXPORT extern const char kEnablePreferCompositingToLCDText[]; +@@ -256,8 +263,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 017056c..825bdce 100644 +--- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc ++++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc +@@ -239,10 +239,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 dc01117..2f9ee03 100644 +--- a/content/renderer/render_thread_impl.cc ++++ b/content/renderer/render_thread_impl.cc +@@ -1456,7 +1456,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 b37c2cc..a721eb7 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 1289a55..22e11e5 100644 +--- a/gpu/config/software_rendering_list.json ++++ b/gpu/config/software_rendering_list.json +@@ -374,17 +374,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 490722c..1cda2fb 100644 +--- a/media/filters/BUILD.gn ++++ b/media/filters/BUILD.gn +@@ -189,7 +189,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 729c6fa..4878251 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 2cee490..de02414 100644 +--- a/media/gpu/gpu_video_decode_accelerator_factory.cc ++++ b/media/gpu/gpu_video_decode_accelerator_factory.cc +@@ -87,6 +87,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 1e72893..6495642 100644 +--- a/media/gpu/vaapi_wrapper.cc ++++ b/media/gpu/vaapi_wrapper.cc +@@ -1117,6 +1117,7 @@ + if (drm_file.IsValid()) + GetDisplayState()->SetDrmFd(drm_file.GetPlatformFile()); + #endif ++ GetProfileInfos(); // dlopen all necessary libraries + } + + // static diff --git a/enable_vaapi_on_linux.diff b/enable_vaapi_on_linux.diff deleted file mode 100644 index 3c21138..0000000 --- a/enable_vaapi_on_linux.diff +++ /dev/null @@ -1,415 +0,0 @@ -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 - GpuVideoDecodeAccelerator::CreateVaapiVDA() { - scoped_ptr 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 - 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 - CommandBufferProxyImpl::CreateVideoDecoder() { -+ TRACE_EVENT0("gpu", "CommandBufferProxyImpl::CreateVideoDecoder"); - if (!channel_) - return scoped_ptr(); -+ VLOG(1) << "About to create GpuVideoDecodeAcceleratorHost."; - return scoped_ptr( - new GpuVideoDecodeAcceleratorHost(channel_, this)); - } diff --git a/issue1688073002_40001.diff b/issue1688073002_40001.diff deleted file mode 100644 index edb0311..0000000 --- a/issue1688073002_40001.diff +++ /dev/null @@ -1,56 +0,0 @@ -Index: content/common/gpu/media/vaapi_wrapper.cc -diff --git a/content/common/gpu/media/vaapi_wrapper.cc b/content/common/gpu/media/vaapi_wrapper.cc -index db38f32f7f8ee6fca9a08cb3560f644f76cde222..2a18b3ff0ff67ba50f28e9acd2eb79771e584cd1 100644 ---- a/content/common/gpu/media/vaapi_wrapper.cc -+++ b/content/common/gpu/media/vaapi_wrapper.cc -@@ -369,11 +369,8 @@ bool VaapiWrapper::VaInitialize(const base::Closure& report_error_to_uma_cb) { - return false; - } - -- VAStatus va_res = VA_STATUS_SUCCESS; -- if (!va_display_state->Initialize(&va_res)) { -- VA_LOG_ON_ERROR(va_res, "vaInitialize failed"); -+ if (!va_display_state->Initialize()) - return false; -- } - - va_display_ = va_display_state->va_display(); - return true; -@@ -1218,7 +1215,7 @@ VaapiWrapper::VADisplayState::VADisplayState() - - VaapiWrapper::VADisplayState::~VADisplayState() {} - --bool VaapiWrapper::VADisplayState::Initialize(VAStatus* status) { -+bool VaapiWrapper::VADisplayState::Initialize() { - va_lock_.AssertAcquired(); - if (refcount_++ == 0) { - #if defined(USE_X11) -@@ -1232,9 +1229,12 @@ bool VaapiWrapper::VADisplayState::Initialize(VAStatus* status) { - return false; - } - -- *status = vaInitialize(va_display_, &major_version_, &minor_version_); -- if (*status != VA_STATUS_SUCCESS) -+ VAStatus va_res = -+ vaInitialize(va_display_, &major_version_, &minor_version_); -+ if (va_res != VA_STATUS_SUCCESS) { -+ LOG(WARNING) << "vaInitialize failed: " << vaErrorStr(va_res); - return false; -+ } - - va_initialized_ = true; - DVLOG(1) << "VAAPI version: " << major_version_ << "." << minor_version_; -Index: content/common/gpu/media/vaapi_wrapper.h -diff --git a/content/common/gpu/media/vaapi_wrapper.h b/content/common/gpu/media/vaapi_wrapper.h -index 7f14b49be11647d2ba7d4b5f7e1f089238627007..4394bc36b928ebf12d39b8bbb4a22af738bf8537 100644 ---- a/content/common/gpu/media/vaapi_wrapper.h -+++ b/content/common/gpu/media/vaapi_wrapper.h -@@ -247,7 +247,7 @@ class CONTENT_EXPORT VaapiWrapper - ~VADisplayState(); - - // |va_lock_| must be held on entry. -- bool Initialize(VAStatus* status); -+ bool Initialize(); - void Deinitialize(VAStatus* status); - - base::Lock* va_lock() { return &va_lock_; }