diff options
-rw-r--r-- | build/args.gn | 1 | ||||
-rw-r--r-- | build/patches/fedora-vaapi/chromium-81.0.4044.92-fix-vaapi-on-intel.patch | 36 | ||||
-rw-r--r-- | build/patches/fedora-vaapi/chromium-83.0.4103.97-vaapi-i686-fpermissive.patch | 23 | ||||
-rw-r--r-- | build/patches/fedora-vaapi/enable-vaapi.patch | 96 | ||||
-rw-r--r-- | build/patches/series | 5 | ||||
-rw-r--r-- | build/patches/vaapi-build-with-libva.patch | 57 | ||||
-rwxr-xr-x | launcher/chromium.launcher | 4 | ||||
-rw-r--r-- | snapcraft.yaml | 127 |
8 files changed, 344 insertions, 5 deletions
diff --git a/build/args.gn b/build/args.gn index 529a77e..f081484 100644 --- a/build/args.gn +++ b/build/args.gn @@ -38,3 +38,4 @@ current_os = "linux" optimize_webui = false proprietary_codecs = true ffmpeg_branding = "Chrome" +use_vaapi = true diff --git a/build/patches/fedora-vaapi/chromium-81.0.4044.92-fix-vaapi-on-intel.patch b/build/patches/fedora-vaapi/chromium-81.0.4044.92-fix-vaapi-on-intel.patch new file mode 100644 index 0000000..a0a4dc2 --- /dev/null +++ b/build/patches/fedora-vaapi/chromium-81.0.4044.92-fix-vaapi-on-intel.patch @@ -0,0 +1,36 @@ +diff -up chromium-81.0.4044.113/media/gpu/vaapi/vaapi_video_decode_accelerator.cc.vaapi-intel-fix chromium-81.0.4044.113/media/gpu/vaapi/vaapi_video_decode_accelerator.cc +--- chromium-81.0.4044.113/media/gpu/vaapi/vaapi_video_decode_accelerator.cc.vaapi-intel-fix 2020-04-15 19:25:53.000000000 -0400 ++++ chromium-81.0.4044.113/media/gpu/vaapi/vaapi_video_decode_accelerator.cc 2020-04-16 14:41:41.303904954 -0400 +@@ -64,6 +64,7 @@ void ReportToUMA(VAVDADecoderFailure fai + VAVDA_DECODER_FAILURES_MAX + 1); + } + ++#if defined(OS_ANDROID) || defined(OS_CHROMEOS) + // Returns true if the CPU is an Intel Gemini Lake or later (including Kaby + // Lake) Cpu platform id's are referenced from the following file in kernel + // source arch/x86/include/asm/intel-family.h +@@ -76,6 +77,7 @@ bool IsGeminiLakeOrLater() { + cpuid.model() >= kGeminiLakeModelId; + return is_geminilake_or_later; + } ++#endif + + } // namespace + +@@ -1171,6 +1173,8 @@ VaapiVideoDecodeAccelerator::DecideBuffe + if (output_mode_ == VideoDecodeAccelerator::Config::OutputMode::IMPORT) + return BufferAllocationMode::kNormal; + ++#if defined(OS_ANDROID) || defined(OS_CHROMEOS) ++ // Move this to chromeOs only as it is causing problem in some intel linux drivers + // On Gemini Lake, Kaby Lake and later we can pass to libva the client's + // PictureBuffers to decode onto, which skips the use of the Vpp unit and its + // associated format reconciliation copy, avoiding all internal buffer +@@ -1187,6 +1191,7 @@ VaapiVideoDecodeAccelerator::DecideBuffe + num_extra_pics_ = 3; + return BufferAllocationMode::kNone; + } ++#endif + + // If we're here, we have to use the Vpp unit and allocate buffers for + // |decoder_|; usually we'd have to allocate the |decoder_|s diff --git a/build/patches/fedora-vaapi/chromium-83.0.4103.97-vaapi-i686-fpermissive.patch b/build/patches/fedora-vaapi/chromium-83.0.4103.97-vaapi-i686-fpermissive.patch new file mode 100644 index 0000000..74fbb7d --- /dev/null +++ b/build/patches/fedora-vaapi/chromium-83.0.4103.97-vaapi-i686-fpermissive.patch @@ -0,0 +1,23 @@ +diff -up chromium-83.0.4103.97/media/gpu/vaapi/BUILD.gn.i686permissive chromium-83.0.4103.97/media/gpu/vaapi/BUILD.gn +--- chromium-83.0.4103.97/media/gpu/vaapi/BUILD.gn.i686permissive 2020-06-07 10:58:00.309383632 -0400 ++++ chromium-83.0.4103.97/media/gpu/vaapi/BUILD.gn 2020-06-07 10:58:47.532340933 -0400 +@@ -13,6 +13,10 @@ import("//ui/ozone/ozone.gni") + assert(is_linux) # is_chromeos is a subset of is_linux + assert(use_vaapi) + ++config("vaapi_permissive") { ++ cflags = [ "-fpermissive" ] ++} ++ + generate_stubs("libva_stubs") { + extra_header = "va_stub_header.fragment" + sigs = [ "va.sigs" ] +@@ -108,6 +112,8 @@ source_set("vaapi") { + ] + } + ++ configs += [ ":vaapi_permissive" ] ++ + if (use_x11) { + configs += [ "//build/config/linux:x11" ] + deps += [ "//ui/gfx/x" ] diff --git a/build/patches/fedora-vaapi/enable-vaapi.patch b/build/patches/fedora-vaapi/enable-vaapi.patch new file mode 100644 index 0000000..5fe02e2 --- /dev/null +++ b/build/patches/fedora-vaapi/enable-vaapi.patch @@ -0,0 +1,96 @@ +diff -up chromium-83.0.4103.61/chrome/browser/about_flags.cc.vaapi chromium-83.0.4103.61/chrome/browser/about_flags.cc +--- chromium-83.0.4103.61/chrome/browser/about_flags.cc.vaapi 2020-05-18 14:40:20.000000000 -0400 ++++ chromium-83.0.4103.61/chrome/browser/about_flags.cc 2020-05-29 15:50:25.144232561 -0400 +@@ -2153,7 +2153,7 @@ const FeatureEntry kFeatureEntries[] = { + "disable-accelerated-video-decode", + flag_descriptions::kAcceleratedVideoDecodeName, + flag_descriptions::kAcceleratedVideoDecodeDescription, +- kOsMac | kOsWin | kOsCrOS | kOsAndroid, ++ kOsMac | kOsWin | kOsCrOS | kOsAndroid | kOsLinux, + SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedVideoDecode), + }, + { +@@ -2585,12 +2585,12 @@ const FeatureEntry kFeatureEntries[] = { + flag_descriptions::kWebXrForceRuntimeDescription, kOsDesktop, + MULTI_VALUE_TYPE(kWebXrForceRuntimeChoices)}, + #endif // ENABLE_VR +-#if defined(OS_CHROMEOS) ++#if defined(OS_CHROMEOS) || defined(OS_LINUX) + {"disable-accelerated-mjpeg-decode", + flag_descriptions::kAcceleratedMjpegDecodeName, +- flag_descriptions::kAcceleratedMjpegDecodeDescription, kOsCrOS, ++ flag_descriptions::kAcceleratedMjpegDecodeDescription, kOsCrOS | kOsLinux, + SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedMjpegDecode)}, +-#endif // OS_CHROMEOS ++#endif // OS_CHROMEOS || OS_LINUX + {"system-keyboard-lock", flag_descriptions::kSystemKeyboardLockName, + flag_descriptions::kSystemKeyboardLockDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kSystemKeyboardLock)}, +diff -up chromium-83.0.4103.61/chrome/browser/flag_descriptions.cc.vaapi chromium-83.0.4103.61/chrome/browser/flag_descriptions.cc +--- chromium-83.0.4103.61/chrome/browser/flag_descriptions.cc.vaapi 2020-05-18 14:40:21.000000000 -0400 ++++ chromium-83.0.4103.61/chrome/browser/flag_descriptions.cc 2020-05-29 15:47:52.347979793 -0400 +@@ -2980,16 +2980,19 @@ const char kMetalDescription[] = + + #endif + +-// Chrome OS ------------------------------------------------------------------- +- +-#if defined(OS_CHROMEOS) ++// Chrome OS and Linux ------------------------------------------------------------------- + ++#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 + ++// Chrome OS ----------------------------------------------------------------------------- ++ ++#if defined(OS_CHROMEOS) + const char kAggregatedMlAppRankingName[] = "Rank suggested apps with ML."; + const char kAggregatedMlAppRankingDescription[] = + "Use the aggregated ML model to rank the suggested apps."; +diff -up chromium-83.0.4103.61/chrome/browser/flag_descriptions.h.vaapi chromium-83.0.4103.61/chrome/browser/flag_descriptions.h +--- chromium-83.0.4103.61/chrome/browser/flag_descriptions.h.vaapi 2020-05-18 14:40:21.000000000 -0400 ++++ chromium-83.0.4103.61/chrome/browser/flag_descriptions.h 2020-05-29 15:47:52.348979768 -0400 +@@ -1711,13 +1711,19 @@ extern const char kMetalDescription[]; + + #endif // defined(OS_MACOSX) + +-// Chrome OS ------------------------------------------------------------------ ++// Chrome OS and Linux --------------------------------------------------------- + +-#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 kAggregatedMlAppRankingName[]; + extern const char kAggregatedMlAppRankingDescription[]; + +diff -up chromium-83.0.4103.61/gpu/config/software_rendering_list.json.vaapi chromium-83.0.4103.61/gpu/config/software_rendering_list.json +--- chromium-83.0.4103.61/gpu/config/software_rendering_list.json.vaapi 2020-05-18 14:40:24.000000000 -0400 ++++ chromium-83.0.4103.61/gpu/config/software_rendering_list.json 2020-05-29 15:47:52.349979744 -0400 +@@ -337,11 +337,12 @@ + }, + { + "id": 48, +- "description": "Accelerated video decode is unavailable on Linux", ++ "description": "Accelerated VA-API video decode is not supported on NVIDIA platforms", + "cr_bugs": [137247, 1032907], + "os": { + "type": "linux" + }, ++ "vendor_id": "0x10de", + "exceptions": [ + { + "machine_model_name": ["Chromecast"] diff --git a/build/patches/series b/build/patches/series index f12201f..d2460ac 100644 --- a/build/patches/series +++ b/build/patches/series @@ -15,3 +15,8 @@ build-script-predownload-pgo-training-source.patch build-script-fix-bootstrap-targets.patch chromedriver-snap-compatibility.patch node-update-binaries-arch-specific.patch +vaapi-build-with-libva.patch + +fedora-vaapi/enable-vaapi.patch +fedora-vaapi/chromium-83.0.4103.97-vaapi-i686-fpermissive.patch +fedora-vaapi/chromium-81.0.4044.92-fix-vaapi-on-intel.patch diff --git a/build/patches/vaapi-build-with-libva.patch b/build/patches/vaapi-build-with-libva.patch new file mode 100644 index 0000000..30a53a0 --- /dev/null +++ b/build/patches/vaapi-build-with-libva.patch @@ -0,0 +1,57 @@ +Description: ensure that various components that use it are built against (a potentially custom) libva +Author: Olivier Tilloy <olivier.tilloy@canonical.com> + +--- a/media/gpu/vaapi/BUILD.gn ++++ b/media/gpu/vaapi/BUILD.gn +@@ -23,6 +23,7 @@ generate_stubs("libva_stubs") { + + output_name = "va_stubs" + deps = [ "//base" ] ++ configs = [ "//build/config/linux/libva" ] + } + + source_set("vaapi") { +--- a/media/gpu/chromeos/BUILD.gn ++++ b/media/gpu/chromeos/BUILD.gn +@@ -32,6 +32,7 @@ source_set("chromeos") { + + if (use_vaapi) { + deps += [ "//media/gpu/vaapi" ] ++ configs += [ "//build/config/linux/libva" ] + } + + if (use_v4l2_codec) { +@@ -107,6 +108,10 @@ source_set("fourcc") { + "//media/gpu:buildflags", + "//media/gpu:common", + ] ++ ++ if (use_vaapi) { ++ configs += [ "//build/config/linux/libva" ] ++ } + } + + source_set("video_frame_mapper") { +--- a/media/gpu/BUILD.gn ++++ b/media/gpu/BUILD.gn +@@ -160,6 +160,7 @@ component("gpu") { + "//media/gpu/vaapi", + "//media/gpu/vaapi:common", + ] ++ configs += [ "//build/config/linux/libva" ] + } + + if (is_win) { +--- a/content/gpu/BUILD.gn ++++ b/content/gpu/BUILD.gn +@@ -49,6 +49,10 @@ target(link_target_type, "gpu_sources") + + configs += [ "//content:content_implementation" ] + ++ if (use_vaapi) { ++ configs += [ "//build/config/linux/libva" ] ++ } ++ + deps = [ + "//base", + "//base/third_party/dynamic_annotations", diff --git a/launcher/chromium.launcher b/launcher/chromium.launcher index e76849a..0e0de2d 100755 --- a/launcher/chromium.launcher +++ b/launcher/chromium.launcher @@ -97,10 +97,10 @@ for arg in "$@"; do done if [ $WANT_TEMP_PROFILE -eq 0 ] ; then - exec "$SNAP/usr/lib/chromium-browser/chrome" --no-default-browser-check --no-first-run --password-store=$PASSWORD_STORE $FLASH_OPTIONS $CHROMIUM_FLAGS "$@" + exec "$SNAP/usr/lib/chromium-browser/chrome" --no-default-browser-check --no-first-run --enable-gpu-rasterization --password-store=$PASSWORD_STORE $FLASH_OPTIONS $CHROMIUM_FLAGS "$@" else TEMP_PROFILE=$(mktemp -d) trap "rm -rf $TEMP_PROFILE" EXIT # we can't exec here as we need to clean-up the temporary profile - "$SNAP/usr/lib/chromium-browser/chrome" --user-data-dir=$TEMP_PROFILE --no-default-browser-check --no-first-run --password-store=$PASSWORD_STORE $FLASH_OPTIONS $CHROMIUM_FLAGS "$@" + "$SNAP/usr/lib/chromium-browser/chrome" --user-data-dir=$TEMP_PROFILE --no-default-browser-check --no-first-run --enable-gpu-rasterization --password-store=$PASSWORD_STORE $FLASH_OPTIONS $CHROMIUM_FLAGS "$@" fi diff --git a/snapcraft.yaml b/snapcraft.yaml index b7acfcf..3c82cfc 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -117,7 +117,17 @@ parts: plugin: nil source: https://commondatastorage.googleapis.com/chromium-browser-official/chromium-84.0.4147.89.tar.xz source-checksum: sha512/cc207a5f09a89e42bc12fd491d5d0ef11c04daaa324aa696d2f8a37679b8f2171d3b265296968c3312e158b0fd2c059e12727a7463d3bd2f640d5bbd43c4f676 - after: [chromium-build, gtk3-locales, launcher, manpage, gtk-key-themes] + after: + - chromium-build + - gtk3-locales + - launcher + - manpage + - gtk-key-themes + - libva + - mesa-va-drivers + - intel-vaapi-driver + - intel-gmmlib + - intel-media-driver build-packages: - quilt - wget @@ -233,6 +243,7 @@ parts: # Do not build with NEON on armhf (https://launchpad.net/bugs/1884856) echo "arm_use_neon = false" >> $OUT/args.gn fi + export PKG_CONFIG_PATH=$SNAPCRAFT_STAGE/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/pkgconfig $OUT/gn gen $OUT ninja -C $OUT chrome chrome_sandbox chromedriver @@ -309,7 +320,7 @@ parts: - -var launcher: - after: [desktop-gtk3] + after: [ desktop-gtk3 ] plugin: dump source: launcher organize: @@ -388,7 +399,7 @@ parts: - -var shared-mime-info: - after: [launcher, chromium] + after: [ launcher, chromium ] plugin: nil override-pull: "" override-prime: | @@ -434,3 +445,113 @@ parts: mkdir -p usr/bin cd usr/bin ln -s /usr/bin/xdg-open xdg-email + + # Build and install a more recent version of the VA-API library than what is + # available in 18.04, because newer drivers depend on a newer version of the + # ABI. + libva: + source: https://github.com/intel/libva/releases/download/2.7.1/libva-2.7.1.tar.bz2 + source-checksum: sha1/75010bde98182c707e20910253b735cea43e068d + plugin: meson + meson-parameters: ["--prefix=/usr", "-Dbuildtype=release"] + build-packages: + - gcc + - libc6-dev + - libdrm-dev + - libgl1-mesa-dev + - libwayland-dev + - libx11-dev + - libxext-dev + - libxfixes-dev + - pkg-config + stage-packages: + - libdrm2 + - libgl1 + - libglvnd0 + - libglx0 + - libwayland-client0 + - libx11-6 + - libxau6 + - libxcb1 + - libxdmcp6 + - libxext6 + - libxfixes3 + prime: + - -etc + - -usr/include + - -usr/lib/*/pkgconfig + - -usr/share + + # gallium drivers + mesa-va-drivers: + plugin: nil + stage-packages: + - mesa-va-drivers + prime: + - -usr/share + + # i965_drv_video.so + intel-vaapi-driver: + after: [ libva ] + source: https://github.com/intel/intel-vaapi-driver/releases/download/2.4.0/intel-vaapi-driver-2.4.0.tar.bz2 + source-checksum: sha1/5f805f6a040f5beab6693d11765618cc92d2076b + plugin: meson + meson-parameters: ["--prefix=/usr", "-Dbuildtype=release"] + build-packages: + - gcc + - libdrm-dev + - libwayland-bin + - libwayland-dev + - pkg-config + override-build: | + if [ $(arch) = "x86_64" ]; then + snapcraftctl build + fi + stage-packages: + - libdrm2 + - libdrm-intel1 + - libpciaccess0 + prime: + - -usr/share + + intel-gmmlib: + source: https://github.com/intel/gmmlib/archive/intel-gmmlib-20.1.1.tar.gz + plugin: cmake + configflags: [ "-DCMAKE_INSTALL_PREFIX=/usr" ] + build-packages: + - g++ + - sed + override-build: | + if [ $(arch) = "x86_64" ]; then + snapcraftctl build + fi + override-stage: | + snapcraftctl stage + if [ $(arch) = "x86_64" ]; then + sed -i -e 's|includedir=/usr|includedir=${prefix}|' \ + -e 's|libdir=/usr|libdir=${prefix}|' \ + usr/lib/$SNAPCRAFT_ARCH_TRIPLET/pkgconfig/igdgmm.pc + fi + prime: + - -usr/include + - -usr/lib/*/pkgconfig + + # iHD_drv_video.so + intel-media-driver: + after: [ libva, intel-gmmlib ] + source: https://github.com/intel/media-driver/archive/intel-media-20.1.1.tar.gz + plugin: cmake + configflags: [ "-DCMAKE_INSTALL_PREFIX=/usr" ] + build-packages: + - g++ + - libpciaccess-dev + override-build: | + if [ $(arch) = "x86_64" ]; then + snapcraftctl build + fi + stage-packages: + - libpciaccess0 + prime: + - -usr/include + - -usr/lib/*/pkgconfig + - -usr/share |