summaryrefslogtreecommitdiff
diff options
-rw-r--r--build/args.gn1
-rw-r--r--build/patches/fedora-vaapi/chromium-81.0.4044.92-fix-vaapi-on-intel.patch36
-rw-r--r--build/patches/fedora-vaapi/chromium-83.0.4103.97-vaapi-i686-fpermissive.patch23
-rw-r--r--build/patches/fedora-vaapi/enable-vaapi.patch96
-rw-r--r--build/patches/series5
-rw-r--r--build/patches/vaapi-build-with-libva.patch57
-rwxr-xr-xlauncher/chromium.launcher4
-rw-r--r--snapcraft.yaml127
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