Firefox 102.0.1 firefox102
authorWolfgang Rosenauer <wr@rosenauer.org>
Sun, 10 Jul 2022 10:35:20 +0200
branchfirefox102
changeset 1175 4c6576f9cf04
parent 1174 90e3d0cf8567
child 1176 f871aac89885
Firefox 102.0.1
MozillaFirefox/MozillaFirefox.changes
MozillaFirefox/MozillaFirefox.spec
MozillaFirefox/mozilla-bmo1504834-part2.patch
MozillaFirefox/mozilla-bmo1504834-part4.patch
MozillaFirefox/mozilla-bmo1626236.patch
MozillaFirefox/one_swizzle_to_rule_them_all.patch
MozillaFirefox/svg-rendering.patch
MozillaFirefox/tar_stamps
firefox-kde.patch
mozilla-bmo1504834-part2.patch
mozilla-bmo1504834-part4.patch
mozilla-bmo1626236.patch
mozilla-kde.patch
mozilla-libavcodec58_91.patch
mozilla-silence-no-return-type.patch
one_swizzle_to_rule_them_all.patch
series
svg-rendering.patch
--- a/MozillaFirefox/MozillaFirefox.changes	Sun Jun 12 16:05:04 2022 +0200
+++ b/MozillaFirefox/MozillaFirefox.changes	Sun Jul 10 10:35:20 2022 +0200
@@ -1,4 +1,91 @@
 -------------------------------------------------------------------
+Wed Jul  6 18:35:47 UTC 2022 - Andreas Stieger <andreas.stieger@gmx.de>
+
+- Firefox 102.0.1:
+  * Fixed: Fixed bookmarks sidebar flashing white when opened in
+    dark mode (bmo#1776157)
+  * Fixed: Fixed multilingual spell checking not working with
+    content in both English and a non-Latin alphabet
+    (bmo#1773802)
+  * Fixed: Developer tools:  Fixed an issue where the console
+    output keep getting scrolled to the bottom when the last
+    visible message is an evaluation result (bmo#1776262)
+  * Fixed: Fixed *Delete cookies and site data when Firefox is
+    closed* checkbox getting disabled on startup (bmo#1777419)
+  * Fixed: Various stability fixes
+
+-------------------------------------------------------------------
+Sat Jun 25 12:51:46 UTC 2022 - Wolfgang Rosenauer <wr@rosenauer.org>
+
+- Firefox 102.0
+  * You can now disable automatic opening of the download panel
+    every time a new download starts
+  * Firefox now mitigates query parameter tracking when navigating
+    sites in ETP strict mode
+  * Improved security by moving audio decoding into a separate
+    process with stricter sandboxing, thus improving process isolation
+  * https://www.mozilla.org/en-US/firefox/102.0/releasenotes
+  MFSA 2022-24 (bsc#1200793)
+  * CVE-2022-34479 (bmo#1745595)
+    A popup window could be resized in a way to overlay the
+    address bar with web content
+  * CVE-2022-34470 (bmo#1765951)
+    Use-after-free in nsSHistory
+  * CVE-2022-34468 (bmo#1768537)
+    CSP sandbox header without `allow-scripts` can be bypassed
+    via retargeted javascript: URI
+  * CVE-2022-34482 (bmo#845880)
+    Drag and drop of malicious image could have led to malicious
+    executable and potential code execution
+  * CVE-2022-34483 (bmo#1335845)
+    Drag and drop of malicious image could have led to malicious
+    executable and potential code execution
+  * CVE-2022-34476 (bmo#1387919)
+    ASN.1 parser could have been tricked into accepting malformed ASN.1
+  * CVE-2022-34481 (bmo#1483699, bmo#1497246)
+    Potential integer overflow in ReplaceElementsAt
+  * CVE-2022-34474 (bmo#1677138)
+    Sandboxed iframes could redirect to external schemes
+  * CVE-2022-34469 (bmo#1721220)
+    TLS certificate errors on HSTS-protected domains could be
+    bypassed by the user on Firefox for Android
+  * CVE-2022-34471 (bmo#1766047)
+    Compromised server could trick a browser into an addon downgrade
+  * CVE-2022-34472 (bmo#1770123)
+    Unavailable PAC file resulted in OCSP requests being blocked
+  * CVE-2022-34478 (bmo#1773717)
+    Microsoft protocols can be attacked if a user accepts a prompt
+  * CVE-2022-2200 (bmo#1771381)
+    Undesired attributes could be set as part of prototype pollution
+  * CVE-2022-34480 (bmo#1454072)
+    Free of uninitialized pointer in lg_init
+  * CVE-2022-34477 (bmo#1731614)
+    MediaError message property leaked information on cross-
+    origin same-site pages
+  * CVE-2022-34475 (bmo#1757210)
+    HTML Sanitizer could have been bypassed via same-origin
+    script via use tags
+  * CVE-2022-34473 (bmo#1770888)
+    HTML Sanitizer could have been bypassed via use tags
+  * CVE-2022-34484 (bmo#1763634, bmo#1772651)
+    Memory safety bugs fixed in Firefox 102 and Firefox ESR 91.11
+  * CVE-2022-34485 (bmo#1768409, bmo#1768578)
+    Memory safety bugs fixed in Firefox 102
+- requires
+  NSPR >= 4.34
+  NSS >= 3.79
+  rust = 1.60
+- switch out skia-patches with webrender-patches for big endian
+  removed:
+  * mozilla-bmo1504834-part2.patch
+  * mozilla-bmo1504834-part4.patch
+  * mozilla-bmo1626236.patch
+  added:
+  * one_swizzle_to_rule_them_all.patch
+  * svg-rendering.patch
+- add some more returns to the no-return-patch
+
+-------------------------------------------------------------------
 Fri Jun 10 20:45:37 UTC 2022 - Andreas Stieger <andreas.stieger@gmx.de>
 
 - Mozilla Firefox 101.0.1:
--- a/MozillaFirefox/MozillaFirefox.spec	Sun Jun 12 16:05:04 2022 +0200
+++ b/MozillaFirefox/MozillaFirefox.spec	Sun Jul 10 10:35:20 2022 +0200
@@ -28,9 +28,9 @@
 # orig_suffix b3
 # major 69
 # mainver %major.99
-%define major          101
+%define major          102
 %define mainver        %major.0.1
-%define orig_version   101.0.1
+%define orig_version   102.0.1
 %define orig_suffix    %{nil}
 %define update_channel release
 %define branding       1
@@ -91,19 +91,23 @@
 BuildRequires:  dejavu-fonts
 BuildRequires:  fdupes
 BuildRequires:  memory-constraints
-%if 0%{?suse_version} <= 1320
-BuildRequires:  gcc9-c++
+%if 0%{?suse_version} < 1550 && 0%{?sle_version} <= 150400
+BuildRequires:  gcc11-c++
 %else
 BuildRequires:  gcc-c++
 %endif
 %if 0%{?suse_version} < 1550 && 0%{?sle_version} < 150300
-BuildRequires:  cargo >= 1.57
-BuildRequires:  rust >= 1.57
+BuildRequires:  cargo >= 1.59
+BuildRequires:  rust >= 1.59
 %else
 # Newer sle/leap/tw use parallel versioned rust releases which have
 # a different method for provides that we can use to request a
 # specific version
+# minimal requirement:
 BuildRequires:  rust+cargo >= 1.59
+# actually used upstream:
+BuildRequires:  cargo1.60
+BuildRequires:  rust1.60
 %endif
 %if 0%{useccache} != 0
 BuildRequires:  ccache
@@ -113,8 +117,8 @@
 BuildRequires:  libiw-devel
 BuildRequires:  libproxy-devel
 BuildRequires:  makeinfo
-BuildRequires:  mozilla-nspr-devel >= 4.33
-BuildRequires:  mozilla-nss-devel >= 3.78.1
+BuildRequires:  mozilla-nspr-devel >= 4.34
+BuildRequires:  mozilla-nss-devel >= 3.79
 BuildRequires:  nasm >= 2.14
 BuildRequires:  nodejs >= 10.22.1
 %if 0%{?sle_version} >= 120000 && 0%{?sle_version} < 150000
@@ -178,7 +182,9 @@
 Source2:        MozillaFirefox-rpmlintrc
 Source3:        mozilla.sh.in
 Source4:        tar_stamps
+%if %{localize}
 Source7:        l10n-%{orig_version}%{orig_suffix}.tar.xz
+%endif
 Source8:        firefox-mimeinfo.xml
 Source9:        firefox.js
 Source11:       firefox.1
@@ -207,18 +213,17 @@
 Patch9:         mozilla-bmo1005535.patch
 Patch10:        mozilla-bmo1568145.patch
 Patch11:        mozilla-bmo1504834-part1.patch
-Patch12:        mozilla-bmo1504834-part2.patch
 Patch13:        mozilla-bmo1504834-part3.patch
 Patch14:        mozilla-bmo1512162.patch
 Patch15:        mozilla-fix-top-level-asm.patch
-Patch16:        mozilla-bmo1504834-part4.patch
 Patch17:        mozilla-bmo849632.patch
 Patch18:        mozilla-bmo998749.patch
-Patch19:        mozilla-bmo1626236.patch
 Patch20:        mozilla-s390x-skia-gradient.patch
 Patch21:        mozilla-libavcodec58_91.patch
 Patch22:        mozilla-silence-no-return-type.patch
 Patch23:        mozilla-bmo531915.patch
+Patch25:        one_swizzle_to_rule_them_all.patch
+Patch26:        svg-rendering.patch
 # Firefox/browser
 Patch101:       firefox-kde.patch
 Patch102:       firefox-branded-icons.patch
@@ -341,22 +346,20 @@
 export PYTHON3=/usr/bin/python36
 %endif
 
-# Webrender does not support big endian yet, so we are forcing it off
-# see: https://bugzilla.mozilla.org/show_bug.cgi?id=1716707
-%ifarch s390x ppc64
-echo 'pref("gfx.webrender.force-disabled", true);' >> %{SOURCE9}
-%endif
-
 #
 kdehelperversion=$(cat toolkit/xre/nsKDEUtils.cpp | grep '#define KMOZILLAHELPER_VERSION' | cut -d ' ' -f 3)
 if test "$kdehelperversion" != %{kde_helper_version}; then
   echo fix kde helper version in the .spec file
   exit 1
 fi
-
-source %{SOURCE4}
+# When doing only_print_mozconfig, this file isn't necessarily available, so skip it
+cp %{SOURCE4} .obsenv.sh
+%else
+# We need to make sure its empty
+echo "" > .obsenv.sh
 %endif
 
+cat >> .obsenv.sh <<EOF
 export CARGO_HOME=${RPM_BUILD_DIR}/%{srcname}-%{orig_version}/.cargo
 export MOZ_SOURCE_CHANGESET=$RELEASE_TAG
 export SOURCE_REPO=$RELEASE_REPO
@@ -367,8 +370,8 @@
 export BUILD_OFFICIAL=1
 export MOZ_TELEMETRY_REPORTING=1
 export MACH_USE_SYSTEM_PYTHON=1
-%if 0%{?suse_version} <= 1320
-export CC=gcc-9
+%if 0%{?suse_version} < 1550 && 0%{?sle_version} <= 150400
+export CC=gcc-11
 %else
 %if 0%{?clang_build} == 0
 export CC=gcc
@@ -392,27 +395,12 @@
 %endif
 export CXXFLAGS="$CFLAGS"
 export MOZCONFIG=$RPM_BUILD_DIR/mozconfig
-%if %{with only_print_mozconfig}
-echo "export CC=$CC"
-echo "export CXX=$CXX"
-echo "export CFLAGS=\"$CFLAGS\""
-echo "export CXXFLAGS=\"$CXXFLAGS\""
-echo "export LDFLAGS=\"$LDFLAGS\""
-echo "export RUSTFLAGS=\"$RUSTFLAGS\""
-echo "export CARGO_HOME=\"$CARGO_HOME\""
-echo "export PATH=\"$PATH\""
-echo "export LD_LIBRARY_PATH=\"$LD_LIBRARY_PATH\""
-echo "export PKG_CONFIG_PATH=\"$PKG_CONFIG_PATH\""
-echo "export MOZCONFIG=\"$MOZCONFIG\""
-echo "export MOZILLA_OFFICIAL=1"
-echo "export BUILD_OFFICIAL=1"
-echo "export MOZ_TELEMETRY_REPORTING=1"
-echo ""
-cat << EOF
-%else
-%limit_build -m 2560
+EOF
+# Done with env-variables.
+source ./.obsenv.sh
+
+# Generating mozconfig
 cat << EOF > $MOZCONFIG
-%endif
 mk_add_options MOZILLA_OFFICIAL=1
 mk_add_options BUILD_OFFICIAL=1
 mk_add_options MOZ_MAKE_FLAGS=%{?jobs:-j%jobs}
@@ -498,7 +486,15 @@
 %endif
 %endif
 EOF
-%if !%{with only_print_mozconfig}
+
+%if %{with only_print_mozconfig}
+cat ./.obsenv.sh
+cat $MOZCONFIG
+%else
+%ifarch aarch64 %arm ppc64 ppc64le
+%limit_build -m 2000
+%endif
+
 %if 0%{useccache} != 0
 ccache -s
 %endif
--- a/MozillaFirefox/mozilla-bmo1504834-part2.patch	Sun Jun 12 16:05:04 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-bmo1504834-part2.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-bmo1504834-part4.patch	Sun Jun 12 16:05:04 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-bmo1504834-part4.patch
\ No newline at end of file
--- a/MozillaFirefox/mozilla-bmo1626236.patch	Sun Jun 12 16:05:04 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-../mozilla-bmo1626236.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/one_swizzle_to_rule_them_all.patch	Sun Jul 10 10:35:20 2022 +0200
@@ -0,0 +1,1 @@
+../one_swizzle_to_rule_them_all.patch
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MozillaFirefox/svg-rendering.patch	Sun Jul 10 10:35:20 2022 +0200
@@ -0,0 +1,1 @@
+../svg-rendering.patch
\ No newline at end of file
--- a/MozillaFirefox/tar_stamps	Sun Jun 12 16:05:04 2022 +0200
+++ b/MozillaFirefox/tar_stamps	Sun Jul 10 10:35:20 2022 +0200
@@ -1,10 +1,10 @@
 PRODUCT="firefox"
 CHANNEL="release"
-VERSION="101.0.1"
+VERSION="102.0.1"
 VERSION_SUFFIX=""
-PREV_VERSION="101.0"
+PREV_VERSION="102.0"
 PREV_VERSION_SUFFIX=""
 #SKIP_LOCALES="" # Uncomment to skip l10n and compare-locales-generation
 RELEASE_REPO="https://hg.mozilla.org/releases/mozilla-release"
-RELEASE_TAG="c66093146ac832a0748f0f8a31139664abf73a42"
-RELEASE_TIMESTAMP="20220608170832"
+RELEASE_TAG="a7294bfb43712ab3225c76087cd359a22ea8fa7d"
+RELEASE_TIMESTAMP="20220705093820"
--- a/firefox-kde.patch	Sun Jun 12 16:05:04 2022 +0200
+++ b/firefox-kde.patch	Sun Jul 10 10:35:20 2022 +0200
@@ -3,7 +3,7 @@
 # Date 1559300151 -7200
 #      Fri May 31 12:55:51 2019 +0200
 # Node ID 54d41b0033b8d649d842a1f862c6fed8b9874dec
-# Parent  23d64c5753fda6f201477fe1f2f6cf1fb1657ccc
+# Parent  c9baf1c9eb9359b7968a52157e8892cdd20f2c6d
 How to apply this patch:
 1. Import and apply it
 2. cp browser/base/content/browser.xul browser/base/content/browser-kde.xul
@@ -14,7 +14,7 @@
 diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js
 --- a/browser/components/preferences/main.js
 +++ b/browser/components/preferences/main.js
-@@ -353,16 +353,23 @@ var gMainPane = {
+@@ -303,16 +303,23 @@ var gMainPane = {
          }, backoffTimes[this._backoffIndex + 1 < backoffTimes.length ? this._backoffIndex++ : backoffTimes.length - 1]);
        };
  
@@ -38,7 +38,7 @@
      );
      let performanceSettingsUrl =
        Services.urlFormatter.formatURLPref("app.support.baseURL") +
-@@ -1365,16 +1372,27 @@ var gMainPane = {
+@@ -1334,16 +1341,27 @@ var gMainPane = {
        this._backoffIndex = 0;
  
        let shellSvc = getShellService();
@@ -260,11 +260,11 @@
 +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsKDEShellService, Init)
 +
 +NS_IMETHODIMP
-+nsUnixShellServiceConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult)
++nsUnixShellServiceConstructor(REFNSIID aIID, void **aResult)
 +{
 +    if( nsKDEUtils::kdeSupport())
-+        return nsKDEShellServiceConstructor( aOuter, aIID, aResult );
-+    return nsGNOMEShellServiceConstructor( aOuter, aIID, aResult );
++        return nsKDEShellServiceConstructor( aIID, aResult );
++    return nsGNOMEShellServiceConstructor( aIID, aResult );
 +}
 diff --git a/browser/components/shell/nsUnixShellService.h b/browser/components/shell/nsUnixShellService.h
 new file mode 100644
--- a/mozilla-bmo1504834-part2.patch	Sun Jun 12 16:05:04 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,112 +0,0 @@
-# HG changeset patch
-# Parent  9319844dca3133fa8bd7107079f1d1ddc5c0bf70
-Skia does not support big endian. The places to fix are too numerous and upstream (skia, not Mozilla)
-has no interest in maintaining big endian.
-So here we try to swizzle the input for skia, so that skia always works on LE, and when it comes
-out again, we transform back to BE.
-
-diff --git a/gfx/2d/ConvolutionFilter.cpp b/gfx/2d/ConvolutionFilter.cpp
---- a/gfx/2d/ConvolutionFilter.cpp
-+++ b/gfx/2d/ConvolutionFilter.cpp
-@@ -29,32 +29,79 @@ bool ConvolutionFilter::GetFilterOffsetA
-                                                  int32_t* aResultLength) {
-   if (aRowIndex >= mFilter->numValues()) {
-     return false;
-   }
-   mFilter->FilterForValue(aRowIndex, aResultOffset, aResultLength);
-   return true;
- }
- 
-+static void ByteSwapArray(uint8_t *u8Array, int32_t size) {
-+    uint32_t *array = reinterpret_cast<uint32_t*>(u8Array);
-+    for (int pxl = 0; pxl < size; ++pxl) {
-+        // Use an endian swap to move the bytes, i.e. BGRA -> ARGB.
-+        uint32_t rgba = array[pxl];
-+        array[pxl] = NativeEndian::swapToLittleEndian(rgba);
-+    }
-+}
-+
- void ConvolutionFilter::ConvolveHorizontally(const uint8_t* aSrc, uint8_t* aDst,
-                                              bool aHasAlpha) {
-+#if MOZ_BIG_ENDIAN()
-+    int outputSize = mFilter->numValues();
-+
-+    // Input size isn't handed in, so we have to calculate it quickly
-+    int inputSize = 0;
-+    for (int xx = 0; xx < outputSize; ++xx) {
-+        // Get the filter that determines the current output pixel.
-+        int filterOffset, filterLength;
-+        mFilter->FilterForValue(xx, &filterOffset, &filterLength);
-+        inputSize = std::max(inputSize, filterOffset + filterLength);
-+    }
-+
-+    ByteSwapArray((uint8_t*)aSrc, inputSize);
-+#endif
-+
-   SkOpts::convolve_horizontally(aSrc, *mFilter, aDst, aHasAlpha);
-+
-+#if MOZ_BIG_ENDIAN()
-+    ByteSwapArray((uint8_t*)aSrc, inputSize);
-+    ByteSwapArray(aDst, outputSize);
-+#endif
- }
- 
- void ConvolutionFilter::ConvolveVertically(uint8_t* const* aSrc, uint8_t* aDst,
-                                            int32_t aRowIndex, int32_t aRowSize,
-                                            bool aHasAlpha) {
-   MOZ_ASSERT(aRowIndex < mFilter->numValues());
- 
-   int32_t filterOffset;
-   int32_t filterLength;
-   auto filterValues =
-       mFilter->FilterForValue(aRowIndex, &filterOffset, &filterLength);
-+
-+#if MOZ_BIG_ENDIAN()
-+  for (int filterY = 0; filterY < filterLength; filterY++) {
-+      // Skia only knows LE, so we have to swizzle the input
-+    ByteSwapArray(aSrc[filterY], aRowSize);
-+  }
-+#endif
-+
-   SkOpts::convolve_vertically(filterValues, filterLength, aSrc, aRowSize, aDst,
-                               aHasAlpha);
-+
-+#if MOZ_BIG_ENDIAN()
-+  // After skia is finished, we swizzle back to BE, in case
-+  // the input is used again somewhere else
-+  for (int filterY = 0; filterY < filterLength; filterY++) {
-+    ByteSwapArray(aSrc[filterY], aRowSize);
-+  }
-+  // The destination array as well
-+  ByteSwapArray(aDst, aRowSize);
-+#endif
- }
- 
- /* ConvolutionFilter::ComputeResizeFactor is derived from Skia's
-  * SkBitmapScaler/SkResizeFilter::computeFactors. It is governed by Skia's
-  * BSD-style license (see gfx/skia/LICENSE) and the following copyright:
-  * Copyright (c) 2015 Google Inc.
-  */
- bool ConvolutionFilter::ComputeResizeFilter(ResizeMethod aResizeMethod,
-diff --git a/gfx/skia/skia/include/core/SkPreConfig.h b/gfx/skia/skia/include/core/SkPreConfig.h
---- a/gfx/skia/skia/include/core/SkPreConfig.h
-+++ b/gfx/skia/skia/include/core/SkPreConfig.h
-@@ -68,17 +68,17 @@
-         #define SK_CPU_BENDIAN
-     #elif defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
-         #define SK_CPU_LENDIAN
-     #elif defined(__sparc) || defined(__sparc__) || \
-       defined(_POWER) || defined(__powerpc__) || \
-       defined(__ppc__) || defined(__hppa) || \
-       defined(__PPC__) || defined(__PPC64__) || \
-       defined(_MIPSEB) || defined(__ARMEB__) || \
--      defined(__s390__) || \
-+      defined(__s390__) || defined(__s390x__) || \
-       (defined(__sh__) && defined(__BIG_ENDIAN__)) || \
-       (defined(__ia64) && defined(__BIG_ENDIAN__))
-          #define SK_CPU_BENDIAN
-     #else
-         #define SK_CPU_LENDIAN
-     #endif
- #endif
- 
--- a/mozilla-bmo1504834-part4.patch	Sun Jun 12 16:05:04 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-# HG changeset patch
-# Parent  883d2c7fec80b9714ccfefa461a02f5b09e3ee09
-Problem description: Tab-titles that are too long to fit into a tab get faded out.
-                     On big endian this is broken and instead of fading out, the
-                     tab gets white and the font transparent, leading to an unreadable
-                     tab-title
-Solution: This is not a real solution, but a hack. The real solution would have been
-          to byte-swap the correct buffer, but I could not find it.
-          So the next best thing is to deactivate the fading-effect. Now all tab-titles
-          are readable, albeit not as pretty to look at as they could be.
-Side-effects: I have not yet found an unwanted side-effect.
-
-diff --git a/gfx/2d/DrawTargetSkia.cpp b/gfx/2d/DrawTargetSkia.cpp
---- a/gfx/2d/DrawTargetSkia.cpp
-+++ b/gfx/2d/DrawTargetSkia.cpp
-@@ -1856,16 +1856,24 @@ void DrawTargetSkia::PushLayerWithBlend(
-   }
- 
-   SkCanvas::SaveLayerRec saveRec(
-       aBounds.IsEmpty() ? nullptr : &bounds, &paint, nullptr, clipImage.get(),
-       &clipMatrix,
-       SkCanvas::kPreserveLCDText_SaveLayerFlag |
-           (aCopyBackground ? SkCanvas::kInitWithPrevious_SaveLayerFlag : 0));
- 
-+#if MOZ_BIG_ENDIAN()
-+  // Pushing a layer where an aMask is defined produces wrong output.
-+  // We _should_ endian swap the data, but I couldn't find a workable way to do so
-+  // Therefore I deactivate those layers in the meantime.
-+  // The result is: Tab-titles that are longer than the available space should be faded out.
-+  //                The fading doesn't work, so we deactivate the fading-effect here.
-+  if (!aMask)
-+#endif
-   mCanvas->saveLayer(saveRec);
- 
-   SetPermitSubpixelAA(aOpaque);
- 
- #ifdef MOZ_WIDGET_COCOA
-   CGContextRelease(mCG);
-   mCG = nullptr;
- #endif
--- a/mozilla-bmo1626236.patch	Sun Jun 12 16:05:04 2022 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-# HG changeset patch
-# User msirringhaus@suse.de
-# Date 1582805876 -3600
-#      Thu Feb 27 13:17:56 2020 +0100
-# Node ID cc3d09abea31068e57f1ab918782f9f86fc6a158
-# Parent  9cd90914846f667f18babc491a74c164ae5d6e9f
-imported patch decoder_workaround.patch
-
-diff -r 9cd90914846f image/decoders/nsGIFDecoder2.cpp
---- a/image/decoders/nsGIFDecoder2.cpp	Thu Feb 27 12:57:14 2020 +0100
-+++ b/image/decoders/nsGIFDecoder2.cpp	Fri Mar 27 13:06:18 2020 +0100
-@@ -422,6 +422,9 @@
-   MOZ_ASSERT(mSwizzleFn);
-   uint8_t* data = reinterpret_cast<uint8_t*>(aColormap);
-   mSwizzleFn(data, data, aColors);
-+#if MOZ_BIG_ENDIAN()
-+  SwizzleRow(SurfaceFormat::A8R8G8B8, SurfaceFormat::B8G8R8A8)(data, data, aColors);
-+#endif
- }
- 
- LexerResult nsGIFDecoder2::DoDecode(SourceBufferIterator& aIterator,
-diff -r 9cd90914846f image/decoders/nsJPEGDecoder.cpp
---- a/image/decoders/nsJPEGDecoder.cpp	Thu Feb 27 12:57:14 2020 +0100
-+++ b/image/decoders/nsJPEGDecoder.cpp	Fri Mar 27 13:06:18 2020 +0100
-@@ -263,6 +263,9 @@
-         case JCS_YCbCr:
-           // By default, we will output directly to BGRA. If we need to apply
-           // special color transforms, this may change.
-+#if MOZ_BIG_ENDIAN()
-+          mInfo.out_color_space = MOZ_JCS_EXT_NATIVE_ENDIAN_XRGB;
-+#else
-           switch (SurfaceFormat::OS_RGBX) {
-             case SurfaceFormat::B8G8R8X8:
-               mInfo.out_color_space = JCS_EXT_BGRX;
-@@ -277,6 +280,7 @@
-               mState = JPEG_ERROR;
-               return Transition::TerminateFailure();
-           }
-+#endif
-           break;
-         case JCS_CMYK:
-         case JCS_YCCK:
-diff -r 9cd90914846f image/decoders/nsPNGDecoder.cpp
---- a/image/decoders/nsPNGDecoder.cpp	Thu Feb 27 12:57:14 2020 +0100
-+++ b/image/decoders/nsPNGDecoder.cpp	Fri Mar 27 13:06:18 2020 +0100
-@@ -361,7 +361,7 @@
-                                    IResumable* aOnResume) {
-   MOZ_ASSERT(!HasError(), "Shouldn't call DoDecode after error!");
- 
--  return mLexer.Lex(aIterator, aOnResume,
-+  LexerResult res = mLexer.Lex(aIterator, aOnResume,
-                     [=](State aState, const char* aData, size_t aLength) {
-                       switch (aState) {
-                         case State::PNG_DATA:
-@@ -371,6 +371,14 @@
-                       }
-                       MOZ_CRASH("Unknown State");
-                     });
-+
-+#if MOZ_BIG_ENDIAN()
-+  if(res.is<TerminalState>() && res.as<TerminalState>() == TerminalState::SUCCESS) {
-+      NativeEndian::swapToLittleEndianInPlace<uint32_t>((uint32_t*)(mImageData), mImageDataLength / 4);
-+  }
-+#endif
-+
-+  return res;
- }
- 
- LexerTransition<nsPNGDecoder::State> nsPNGDecoder::ReadPNGData(
-diff -r 9cd90914846f image/decoders/nsWebPDecoder.cpp
---- a/image/decoders/nsWebPDecoder.cpp	Thu Feb 27 12:57:14 2020 +0100
-+++ b/image/decoders/nsWebPDecoder.cpp	Fri Mar 27 13:06:18 2020 +0100
-@@ -237,7 +237,12 @@
-   // WebP doesn't guarantee that the alpha generated matches the hint in the
-   // header, so we always need to claim the input is BGRA. If the output is
-   // BGRX, swizzling will mask off the alpha channel.
-+#if MOZ_BIG_ENDIAN()
-+  mBuffer.colorspace = MODE_ARGB;
-+  SurfaceFormat inFormat = mFormat;
-+#else
-   SurfaceFormat inFormat = SurfaceFormat::OS_RGBA;
-+#endif
- 
-   SurfacePipeFlags pipeFlags = SurfacePipeFlags();
-   if (mFormat == SurfaceFormat::OS_RGBA &&
--- a/mozilla-kde.patch	Sun Jun 12 16:05:04 2022 +0200
+++ b/mozilla-kde.patch	Sun Jul 10 10:35:20 2022 +0200
@@ -3,7 +3,7 @@
 # Date 1559294891 -7200
 #      Fri May 31 11:28:11 2019 +0200
 # Node ID c2aa7198fb925e7fde96abf65b6f68b9b755f112
-# Parent  eeedc49c16aba3b50d1547315a88091a1c765904
+# Parent  edd7284c391b503b76bb5bb6321f24ab2f5f8bdf
 Description: Add KDE integration to Firefox (toolkit parts)
 Author: Wolfgang Rosenauer <wolfgang@rosenauer.org>
 Author: Lubos Lunak <lunak@suse.com>
@@ -165,7 +165,7 @@
 diff --git a/toolkit/mozapps/downloads/HelperAppDlg.jsm b/toolkit/mozapps/downloads/HelperAppDlg.jsm
 --- a/toolkit/mozapps/downloads/HelperAppDlg.jsm
 +++ b/toolkit/mozapps/downloads/HelperAppDlg.jsm
-@@ -1252,36 +1252,66 @@ nsUnknownContentTypeDialog.prototype = {
+@@ -1254,36 +1254,66 @@ nsUnknownContentTypeDialog.prototype = {
          params.handlerApp &&
          params.handlerApp.executable &&
          params.handlerApp.executable.isFile()
@@ -255,15 +255,15 @@
 diff --git a/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp b/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
 --- a/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
 +++ b/toolkit/system/unixproxy/nsUnixSystemProxySettings.cpp
-@@ -13,16 +13,17 @@
- #include "nsPrintfCString.h"
- #include "nsNetCID.h"
+@@ -10,16 +10,17 @@
+ #include "prnetdb.h"
+ #include "prenv.h"
+ #include "nsInterfaceHashtable.h"
+ #include "nsHashtablesFwd.h"
+ #include "nsHashKeys.h"
  #include "nsNetUtil.h"
  #include "nsISupportsPrimitives.h"
  #include "nsIGSettingsService.h"
- #include "nsInterfaceHashtable.h"
- #include "mozilla/Attributes.h"
- #include "nsIURI.h"
 +#include "nsKDEUtils.h"
  
  using namespace mozilla;
@@ -273,7 +273,7 @@
    NS_DECL_ISUPPORTS
    NS_DECL_NSISYSTEMPROXYSETTINGS
  
-@@ -36,16 +37,18 @@ class nsUnixSystemProxySettings final : 
+@@ -33,16 +34,18 @@ class nsUnixSystemProxySettings final : 
    nsCOMPtr<nsIGSettingsCollection> mProxySettings;
    nsInterfaceHashtable<nsCStringHashKey, nsIGSettingsCollection>
        mSchemeProxySettings;
@@ -292,7 +292,7 @@
  nsUnixSystemProxySettings::GetMainThreadOnly(bool* aMainThreadOnly) {
    // dbus prevents us from being threadsafe, but this routine should not block
    // anyhow
-@@ -381,21 +384,50 @@ nsresult nsUnixSystemProxySettings::GetP
+@@ -378,21 +381,50 @@ nsresult nsUnixSystemProxySettings::GetP
    return NS_OK;
  }
  
@@ -786,25 +786,6 @@
  
  /*
   * Check if a handler exists for the provided protocol. Check the datastore
-@@ -328,17 +328,17 @@ mozilla::ipc::IPCResult HandlerServicePa
-   nsCOMPtr<nsIExternalProtocolService> protoSvc =
-       do_GetService(NS_EXTERNALPROTOCOLSERVICE_CONTRACTID, &rv);
-   if (NS_WARN_IF(NS_FAILED(rv))) {
-     *aHandlerExists = false;
-     return IPC_OK();
-   }
-   rv = protoSvc->ExternalProtocolHandlerExists(aProtocolScheme.get(),
-                                                aHandlerExists);
--
-+##
-   if (NS_WARN_IF(NS_FAILED(rv))) {
-     *aHandlerExists = false;
-   }
- #else
-   MOZ_RELEASE_ASSERT(false, "No implementation on this platform.");
-   *aHandlerExists = false;
- #endif
-   return IPC_OK();
 diff --git a/uriloader/exthandler/moz.build b/uriloader/exthandler/moz.build
 --- a/uriloader/exthandler/moz.build
 +++ b/uriloader/exthandler/moz.build
@@ -1825,7 +1806,7 @@
  #  include "prmem.h"
  #  include "plbase64.h"
  
-@@ -2071,20 +2072,29 @@ nsLocalFile::SetPersistentDescriptor(con
+@@ -2097,20 +2098,29 @@ nsLocalFile::SetPersistentDescriptor(con
  
  NS_IMETHODIMP
  nsLocalFile::Reveal() {
@@ -1857,7 +1838,7 @@
      ::CFRelease(url);
      return rv;
    }
-@@ -2096,16 +2106,23 @@ nsLocalFile::Reveal() {
+@@ -2122,16 +2132,23 @@ nsLocalFile::Reveal() {
  
  NS_IMETHODIMP
  nsLocalFile::Launch() {
--- a/mozilla-libavcodec58_91.patch	Sun Jun 12 16:05:04 2022 +0200
+++ b/mozilla-libavcodec58_91.patch	Sun Jul 10 10:35:20 2022 +0200
@@ -1,16 +1,16 @@
 # HG changeset patch
-# Parent  3802b7b2b99885f3ad4d2ec3e2c157e38d04a168
+# Parent  63747fd31719c6e4f7810512a3c57e75a02b8bfd
 
 diff --git a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
 --- a/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
 +++ b/dom/media/platforms/ffmpeg/FFmpegRuntimeLinker.cpp
-@@ -31,16 +31,18 @@ static const char* sLibs[] = {
-   "libavcodec.58.dylib",
-   "libavcodec.57.dylib",
-   "libavcodec.56.dylib",
+@@ -34,16 +34,18 @@ static const char* sLibs[] = {
    "libavcodec.55.dylib",
    "libavcodec.54.dylib",
    "libavcodec.53.dylib",
+ #elif defined(XP_OPENBSD)
+   "libavcodec.so", // OpenBSD hardly controls the major/minor library version
+                    // of ffmpeg and update it regulary on ABI/API changes
  #else
    "libavcodec.so.59",
 +  "libavcodec.so.58.134",
--- a/mozilla-silence-no-return-type.patch	Sun Jun 12 16:05:04 2022 +0200
+++ b/mozilla-silence-no-return-type.patch	Sun Jul 10 10:35:20 2022 +0200
@@ -1,15 +1,11 @@
 # HG changeset patch
-# Parent  6d59717f59a1c0dc50140e750d665c7e98de3e66
+# Parent  72e5683524907256ec499f82bac513c29760b332
 
-diff --git a/Cargo.lock b/Cargo.lock
---- a/Cargo.lock
-+++ b/Cargo.lock
-@@ -2207,18 +2207,16 @@ name = "glsl-to-cxx"
- version = "0.1.0"
- dependencies = [
-  "glsl",
- ]
- 
+Index: firefox-102.0/Cargo.lock
+===================================================================
+--- firefox-102.0.orig/Cargo.lock
++++ firefox-102.0/Cargo.lock
+@@ -2218,8 +2218,6 @@ dependencies = [
  [[package]]
  name = "glslopt"
  version = "0.1.9"
@@ -18,37 +14,23 @@
  dependencies = [
   "cc",
  ]
- 
- [[package]]
- name = "gluesmith"
- version = "0.1.0"
- dependencies = [
-diff --git a/Cargo.toml b/Cargo.toml
---- a/Cargo.toml
-+++ b/Cargo.toml
-@@ -109,12 +109,13 @@ chardetng = { git = "https://github.com/
- chardetng_c = { git = "https://github.com/hsivonen/chardetng_c", rev="ed8a4c6f900a90d4dbc1d64b856e61490a1c3570" }
- coremidi = { git = "https://github.com/chris-zen/coremidi.git", rev="fc68464b5445caf111e41f643a2e69ccce0b4f83" }
- fog = { path = "toolkit/components/glean/api" }
- libudev-sys = { path = "dom/webauthn/libudev-sys" }
+Index: firefox-102.0/Cargo.toml
+===================================================================
+--- firefox-102.0.orig/Cargo.toml
++++ firefox-102.0/Cargo.toml
+@@ -116,6 +116,7 @@ libudev-sys = { path = "dom/webauthn/lib
  packed_simd = { package = "packed_simd_2", git = "https://github.com/hsivonen/packed_simd", rev="c149d0a519bf878567c7630096737669ec2ff15f" }
  midir = { git = "https://github.com/mozilla/midir.git", rev = "4c11f0ffb5d6a10de4aff40a7b81218b33b94e6f" }
- minidump_writer_linux = { git = "https://github.com/msirringhaus/minidump_writer_linux.git", rev = "029ac0d54b237f27dc7d8d4e51bc0fb076e5e852" }
+ minidump_writer_linux = { git = "https://github.com/rust-minidump/minidump-writer.git", rev = "75ada456c92a429704691a85e1cb42fef8cafc0d" }
++glslopt = { path = "third_party/rust/glslopt/" }
  
-+glslopt = { path = "third_party/rust/glslopt/" }
  # Patch mio 0.6 to use winapi 0.3 and miow 0.3, getting rid of winapi 0.2.
  # There is not going to be new version of mio 0.6, mio now being >= 0.7.11.
- [patch.crates-io.mio]
- path = "third_party/rust/mio-0.6.23"
-diff --git a/gfx/skia/skia/include/codec/SkEncodedOrigin.h b/gfx/skia/skia/include/codec/SkEncodedOrigin.h
---- a/gfx/skia/skia/include/codec/SkEncodedOrigin.h
-+++ b/gfx/skia/skia/include/codec/SkEncodedOrigin.h
-@@ -36,12 +36,13 @@ static inline SkMatrix SkEncodedOriginTo
-         case kBottomRight_SkEncodedOrigin: return SkMatrix::MakeAll(-1,  0, w,  0, -1, h, 0, 0, 1);
-         case  kBottomLeft_SkEncodedOrigin: return SkMatrix::MakeAll( 1,  0, 0,  0, -1, h, 0, 0, 1);
-         case     kLeftTop_SkEncodedOrigin: return SkMatrix::MakeAll( 0,  1, 0,  1,  0, 0, 0, 0, 1);
-         case    kRightTop_SkEncodedOrigin: return SkMatrix::MakeAll( 0, -1, h,  1,  0, 0, 0, 0, 1);
-         case kRightBottom_SkEncodedOrigin: return SkMatrix::MakeAll( 0, -1, h, -1,  0, w, 0, 0, 1);
+Index: firefox-102.0/gfx/skia/skia/include/codec/SkEncodedOrigin.h
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/include/codec/SkEncodedOrigin.h
++++ firefox-102.0/gfx/skia/skia/include/codec/SkEncodedOrigin.h
+@@ -41,6 +41,7 @@ static inline SkMatrix SkEncodedOriginTo
          case  kLeftBottom_SkEncodedOrigin: return SkMatrix::MakeAll( 0,  1, 0, -1,  0, w, 0, 0, 1);
      }
      SK_ABORT("Unexpected origin");
@@ -56,16 +38,11 @@
  }
  
  
- #endif // SkEncodedOrigin_DEFINED
-diff --git a/gfx/skia/skia/include/private/GrTypesPriv.h b/gfx/skia/skia/include/private/GrTypesPriv.h
---- a/gfx/skia/skia/include/private/GrTypesPriv.h
-+++ b/gfx/skia/skia/include/private/GrTypesPriv.h
-@@ -535,32 +535,34 @@ static inline GrSLType GrSLCombinedSampl
-             return kTexture2DSampler_GrSLType;
-         case GrTextureType::kRectangle:
-             return kTexture2DRectSampler_GrSLType;
-         case GrTextureType::kExternal:
-             return kTextureExternalSampler_GrSLType;
+Index: firefox-102.0/gfx/skia/skia/include/private/GrTypesPriv.h
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/include/private/GrTypesPriv.h
++++ firefox-102.0/gfx/skia/skia/include/private/GrTypesPriv.h
+@@ -540,6 +540,7 @@ static inline GrSLType GrSLCombinedSampl
          default:
              SK_ABORT("Unexpected texture type");
      }
@@ -73,16 +50,7 @@
  }
  
  /** Rectangle and external textures only support the clamp wrap mode and do not support
-  *  MIP maps.
-  */
- static inline bool GrTextureTypeHasRestrictedSampling(GrTextureType type) {
-     switch (type) {
-         case GrTextureType::k2D:
-             return false;
-         case GrTextureType::kRectangle:
-             return true;
-         case GrTextureType::kExternal:
-             return true;
+@@ -556,6 +557,7 @@ static inline bool GrTextureTypeHasRestr
          default:
              SK_ABORT("Unexpected texture type");
      }
@@ -90,17 +58,7 @@
  }
  
  static constexpr bool GrSLTypeIsCombinedSamplerType(GrSLType type) {
-     switch (type) {
-         case kTexture2DSampler_GrSLType:
-         case kTextureExternalSampler_GrSLType:
-         case kTexture2DRectSampler_GrSLType:
-             return true;
-@@ -853,16 +855,17 @@ static inline size_t GrCompressedFormatD
-     switch (compressionType) {
-         case SkImage::kETC1_CompressionType:
-             SkASSERT((width & 3) == 0);
-             SkASSERT((height & 3) == 0);
-             return (width >> 2) * (height >> 2) * 8;
+@@ -858,6 +860,7 @@ static inline size_t GrCompressedFormatD
      }
  
      SK_ABORT("Invalid pixel config");
@@ -108,20 +66,11 @@
  }
  
  /**
-  * Like SkColorType this describes a layout of pixel data in CPU memory. It specifies the channels,
-  * their type, and width. This exists so that the GPU backend can have private types that have no
-  * analog in the public facing SkColorType enum and omit types not implemented in the GPU backend.
-  * It does not refer to a texture format and the mapping to texture formats may be many-to-many.
-  * It does not specify the sRGB encoding of the stored values. The components are listed in order of
-diff --git a/gfx/skia/skia/src/core/SkGeometry.h b/gfx/skia/skia/src/core/SkGeometry.h
---- a/gfx/skia/skia/src/core/SkGeometry.h
-+++ b/gfx/skia/skia/src/core/SkGeometry.h
-@@ -177,28 +177,30 @@ static inline bool SkCubicIsDegenerate(S
-         case SkCubicType::kLocalCusp:
-         case SkCubicType::kCuspAtInfinity:
-             return false;
-         case SkCubicType::kQuadratic:
-         case SkCubicType::kLineOrPoint:
+Index: firefox-102.0/gfx/skia/skia/src/core/SkGeometry.h
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/core/SkGeometry.h
++++ firefox-102.0/gfx/skia/skia/src/core/SkGeometry.h
+@@ -182,6 +182,7 @@ static inline bool SkCubicIsDegenerate(S
              return true;
      }
      SK_ABORT("Invalid SkCubicType");
@@ -129,12 +78,7 @@
  }
  
  static inline const char* SkCubicTypeName(SkCubicType type) {
-     switch (type) {
-         case SkCubicType::kSerpentine: return "kSerpentine";
-         case SkCubicType::kLoop: return "kLoop";
-         case SkCubicType::kLocalCusp: return "kLocalCusp";
-         case SkCubicType::kCuspAtInfinity: return "kCuspAtInfinity";
-         case SkCubicType::kQuadratic: return "kQuadratic";
+@@ -194,6 +195,7 @@ static inline const char* SkCubicTypeNam
          case SkCubicType::kLineOrPoint: return "kLineOrPoint";
      }
      SK_ABORT("Invalid SkCubicType");
@@ -142,20 +86,11 @@
  }
  
  /** Returns the cubic classification.
- 
-     t[],s[] are set to the two homogeneous parameter values at which points the lines L & M
-     intersect with K, sorted from smallest to largest and oriented so positive values of the
-     implicit are on the "left" side. For a serpentine curve they are the inflection points. For a
-     loop they are the double point. For a local cusp, they are both equal and denote the cusp point.
-diff --git a/gfx/skia/skia/src/core/SkTextBlob.cpp b/gfx/skia/skia/src/core/SkTextBlob.cpp
---- a/gfx/skia/skia/src/core/SkTextBlob.cpp
-+++ b/gfx/skia/skia/src/core/SkTextBlob.cpp
-@@ -196,16 +196,17 @@ unsigned SkTextBlob::ScalarsPerGlyph(Gly
- }
- 
- void SkTextBlob::operator delete(void* p) {
-     sk_free(p);
- }
+Index: firefox-102.0/gfx/skia/skia/src/core/SkTextBlob.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/core/SkTextBlob.cpp
++++ firefox-102.0/gfx/skia/skia/src/core/SkTextBlob.cpp
+@@ -201,6 +201,7 @@ void SkTextBlob::operator delete(void* p
  
  void* SkTextBlob::operator new(size_t) {
      SK_ABORT("All blobs are created by placement new.");
@@ -163,20 +98,11 @@
  }
  
  void* SkTextBlob::operator new(size_t, void* p) {
-     return p;
- }
- 
- SkTextBlobRunIterator::SkTextBlobRunIterator(const SkTextBlob* blob)
-     : fCurrentRun(SkTextBlob::RunRecord::First(blob)) {
-diff --git a/gfx/skia/skia/src/core/SkTypeface_remote.cpp b/gfx/skia/skia/src/core/SkTypeface_remote.cpp
---- a/gfx/skia/skia/src/core/SkTypeface_remote.cpp
-+++ b/gfx/skia/skia/src/core/SkTypeface_remote.cpp
-@@ -24,16 +24,17 @@ void SkScalerContextProxy::initCache(SkS
-     SkASSERT(cache != nullptr);
- 
-     fCache = cache;
-     fStrikeCache = strikeCache;
- }
+Index: firefox-102.0/gfx/skia/skia/src/core/SkTypeface_remote.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/core/SkTypeface_remote.cpp
++++ firefox-102.0/gfx/skia/skia/src/core/SkTypeface_remote.cpp
+@@ -29,6 +29,7 @@ void SkScalerContextProxy::initCache(SkS
  
  unsigned SkScalerContextProxy::generateGlyphCount()  {
      SK_ABORT("Should never be called.");
@@ -184,20 +110,11 @@
  }
  
  bool SkScalerContextProxy::generateAdvance(SkGlyph* glyph) {
-     return false;
- }
- 
- void SkScalerContextProxy::generateMetrics(SkGlyph* glyph) {
-     TRACE_EVENT1("skia", "generateMetrics", "rec", TRACE_STR_COPY(this->getRec().dump().c_str()));
-diff --git a/gfx/skia/skia/src/core/SkTypeface_remote.h b/gfx/skia/skia/src/core/SkTypeface_remote.h
---- a/gfx/skia/skia/src/core/SkTypeface_remote.h
-+++ b/gfx/skia/skia/src/core/SkTypeface_remote.h
-@@ -58,46 +58,54 @@ public:
-             , fGlyphCount{glyphCount}
-             , fIsLogging{isLogging}
-             , fDiscardableManager{std::move(manager)} {}
-     SkFontID remoteTypefaceID() const {return fFontId;}
-     int glyphCount() const {return fGlyphCount;}
+Index: firefox-102.0/gfx/skia/skia/src/core/SkTypeface_remote.h
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/core/SkTypeface_remote.h
++++ firefox-102.0/gfx/skia/skia/src/core/SkTypeface_remote.h
+@@ -63,23 +63,28 @@ public:
      bool isLogging() const {return fIsLogging;}
  
  protected:
@@ -227,7 +144,7 @@
      }
      void onGetFamilyName(SkString* familyName) const override {
          // Used by SkStrikeCache::DumpMemoryStatistics.
-         *familyName = "";
+@@ -87,12 +92,15 @@ protected:
      }
      SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override {
          SK_ABORT("Should never be called.");
@@ -243,17 +160,7 @@
      }
      SkScalerContext* onCreateScalerContext(const SkScalerContextEffects& effects,
                                             const SkDescriptor* desc) const override {
-         return new SkScalerContextProxy(sk_ref_sp(const_cast<SkTypefaceProxy*>(this)), effects,
-                                         desc, fDiscardableManager);
-     }
-     void onFilterRec(SkScalerContextRec* rec) const override {
-         // The rec filtering is already applied by the server when generating
-@@ -111,26 +119,28 @@ protected:
-     }
- 
-     void getPostScriptGlyphNames(SkString*) const override {
-         SK_ABORT("Should never be called.");
-     }
+@@ -116,6 +124,7 @@ protected:
  
      std::unique_ptr<SkAdvancedTypefaceMetrics> onGetAdvancedMetrics() const override {
          SK_ABORT("Should never be called.");
@@ -261,10 +168,7 @@
      }
      void onCharsToGlyphs(const SkUnichar* chars, int count, SkGlyphID glyphs[]) const override {
          SK_ABORT("Should never be called.");
-     }
-     int onCountGlyphs() const override {
-         return this->glyphCount();
-     }
+@@ -126,6 +135,7 @@ protected:
  
      void* onGetCTFontRef() const override {
          SK_ABORT("Should never be called.");
@@ -272,20 +176,11 @@
      }
  
  private:
-     const SkFontID                                  fFontId;
-     const int                                       fGlyphCount;
-     const bool                                      fIsLogging;
-     sk_sp<SkStrikeClient::DiscardableHandleManager> fDiscardableManager;
- 
-diff --git a/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp b/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp
---- a/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp
-+++ b/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp
-@@ -139,16 +139,17 @@ static GrTextureDomain::Mode to_texture_
-         case SkTileMode::kDecal:
-             return GrTextureDomain::kDecal_Mode;
-         case SkTileMode::kMirror:
-             // TODO (michaelludwig) - Support mirror mode, treat as repeat for now
-         case SkTileMode::kRepeat:
+Index: firefox-102.0/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp
++++ firefox-102.0/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp
+@@ -144,6 +144,7 @@ static GrTextureDomain::Mode to_texture_
              return GrTextureDomain::kRepeat_Mode;
          default:
              SK_ABORT("Unsupported tile mode.");
@@ -293,20 +188,11 @@
      }
  }
  #endif
- 
- // This is defined by the SVG spec:
- // https://drafts.fxtf.org/filter-effects/#feGaussianBlurElement
- static int calculate_window(double sigma) {
-     // NB 136 is the largest sigma that will not cause a buffer full of 255 mask values to overflow
-diff --git a/gfx/skia/skia/src/effects/imagefilters/SkLightingImageFilter.cpp b/gfx/skia/skia/src/effects/imagefilters/SkLightingImageFilter.cpp
---- a/gfx/skia/skia/src/effects/imagefilters/SkLightingImageFilter.cpp
-+++ b/gfx/skia/skia/src/effects/imagefilters/SkLightingImageFilter.cpp
-@@ -1696,16 +1696,17 @@ static SkImageFilterLight* create_random
-             return new SkPointLight(random_point3(random), random->nextU());
-         }
-         case 2: {
-             return new SkSpotLight(random_point3(random), random_point3(random),
-                                    random->nextUScalar1(), random->nextUScalar1(), random->nextU());
+Index: firefox-102.0/gfx/skia/skia/src/effects/imagefilters/SkLightingImageFilter.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/effects/imagefilters/SkLightingImageFilter.cpp
++++ firefox-102.0/gfx/skia/skia/src/effects/imagefilters/SkLightingImageFilter.cpp
+@@ -1701,6 +1701,7 @@ static SkImageFilterLight* create_random
          }
          default:
              SK_ABORT("Unexpected value.");
@@ -314,20 +200,11 @@
      }
  }
  
- std::unique_ptr<GrFragmentProcessor> GrDiffuseLightingEffect::TestCreate(GrProcessorTestData* d) {
-     int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx
-                                         : GrProcessorUnitTest::kAlphaTextureIdx;
-     sk_sp<GrTextureProxy> proxy = d->textureProxy(texIdx);
-     SkScalar surfaceScale = d->fRandom->nextSScalar1();
-diff --git a/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp b/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp
---- a/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp
-+++ b/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp
-@@ -64,16 +64,17 @@ int SkFontMgr_Indirect::onCountFamilies(
- }
- 
- void SkFontMgr_Indirect::onGetFamilyName(int index, SkString* familyName) const {
-     SK_ABORT("Not implemented");
- }
+Index: firefox-102.0/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp
++++ firefox-102.0/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp
+@@ -69,6 +69,7 @@ void SkFontMgr_Indirect::onGetFamilyName
  
  SkFontStyleSet* SkFontMgr_Indirect::onCreateStyleSet(int index) const {
      SK_ABORT("Not implemented");
@@ -335,20 +212,11 @@
  }
  
  SkFontStyleSet* SkFontMgr_Indirect::onMatchFamily(const char familyName[]) const {
-     return new SkStyleSet_Indirect(this, -1, fProxy->matchName(familyName));
- }
- 
- SkTypeface* SkFontMgr_Indirect::createTypefaceFromFontId(const SkFontIdentity& id) const {
-     if (id.fDataId == SkFontIdentity::kInvalidDataId) {
-diff --git a/gfx/skia/skia/src/gpu/GrDataUtils.cpp b/gfx/skia/skia/src/gpu/GrDataUtils.cpp
---- a/gfx/skia/skia/src/gpu/GrDataUtils.cpp
-+++ b/gfx/skia/skia/src/gpu/GrDataUtils.cpp
-@@ -123,25 +123,27 @@ static int num_ETC1_blocks(int w, int h)
- 
- size_t GrCompressedDataSize(SkImage::CompressionType type, int width, int height) {
-     switch (type) {
-         case SkImage::kETC1_CompressionType:
-             int numBlocks = num_ETC1_blocks(width, height);
+Index: firefox-102.0/gfx/skia/skia/src/gpu/GrDataUtils.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/GrDataUtils.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/GrDataUtils.cpp
+@@ -128,6 +128,7 @@ size_t GrCompressedDataSize(SkImage::Com
              return numBlocks * sizeof(ETC1Block);
      }
      SK_ABORT("Unexpected compression type");
@@ -356,9 +224,7 @@
  }
  
  size_t GrCompressedRowBytes(SkImage::CompressionType type, int width) {
-     switch (type) {
-         case SkImage::kETC1_CompressionType:
-             int numBlocksWidth = num_ETC1_blocks_w(width);
+@@ -137,6 +138,7 @@ size_t GrCompressedRowBytes(SkImage::Com
              return numBlocksWidth * sizeof(ETC1Block);
      }
      SK_ABORT("Unexpected compression type");
@@ -366,20 +232,11 @@
  }
  
  // Fill in 'dest' with ETC1 blocks derived from 'colorf'
- static void fillin_ETC1_with_color(int width, int height, const SkColor4f& colorf, void* dest) {
-     SkColor color = colorf.toSkColor();
- 
-     ETC1Block block;
-     create_etc1_block(color, &block);
-diff --git a/gfx/skia/skia/src/gpu/GrFragmentProcessor.h b/gfx/skia/skia/src/gpu/GrFragmentProcessor.h
---- a/gfx/skia/skia/src/gpu/GrFragmentProcessor.h
-+++ b/gfx/skia/skia/src/gpu/GrFragmentProcessor.h
-@@ -370,16 +370,17 @@ protected:
-                                                    const Args&... samps) {
-         return (0 == i) ? samp0 : IthTextureSampler(i - 1, samps...);
-     }
-     inline static const TextureSampler& IthTextureSampler(int i);
- 
+Index: firefox-102.0/gfx/skia/skia/src/gpu/GrFragmentProcessor.h
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/GrFragmentProcessor.h
++++ firefox-102.0/gfx/skia/skia/src/gpu/GrFragmentProcessor.h
+@@ -375,6 +375,7 @@ protected:
  private:
      virtual SkPMColor4f constantOutputForConstantInput(const SkPMColor4f& /* inputColor */) const {
          SK_ABORT("Subclass must override this if advertising this optimization.");
@@ -387,20 +244,11 @@
      }
  
      /** Returns a new instance of the appropriate *GL* implementation class
-         for the given GrFragmentProcessor; caller is responsible for deleting
-         the object. */
-     virtual GrGLSLFragmentProcessor* onCreateGLSLInstance() const = 0;
- 
-     /** Implemented using GLFragmentProcessor::GenKey as described in this class's comment. */
-diff --git a/gfx/skia/skia/src/gpu/GrPathRendering.cpp b/gfx/skia/skia/src/gpu/GrPathRendering.cpp
---- a/gfx/skia/skia/src/gpu/GrPathRendering.cpp
-+++ b/gfx/skia/skia/src/gpu/GrPathRendering.cpp
-@@ -14,16 +14,17 @@
- #include "src/gpu/GrPathRendering.h"
- #include "src/gpu/GrProgramInfo.h"
- #include "src/gpu/GrRenderTarget.h"
- 
- const GrUserStencilSettings& GrPathRendering::GetStencilPassSettings(FillType fill) {
+Index: firefox-102.0/gfx/skia/skia/src/gpu/GrPathRendering.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/GrPathRendering.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/GrPathRendering.cpp
+@@ -19,6 +19,7 @@ const GrUserStencilSettings& GrPathRende
      switch (fill) {
          default:
              SK_ABORT("Unexpected path fill.");
@@ -408,20 +256,11 @@
          case GrPathRendering::kWinding_FillType: {
              constexpr static GrUserStencilSettings kWindingStencilPass(
                  GrUserStencilSettings::StaticInit<
-                     0xffff,
-                     GrUserStencilTest::kAlwaysIfInClip,
-                     0xffff,
-                     GrUserStencilOp::kIncWrap,
-                     GrUserStencilOp::kIncWrap,
-diff --git a/gfx/skia/skia/src/gpu/GrPathRendering.h b/gfx/skia/skia/src/gpu/GrPathRendering.h
---- a/gfx/skia/skia/src/gpu/GrPathRendering.h
-+++ b/gfx/skia/skia/src/gpu/GrPathRendering.h
-@@ -58,16 +58,17 @@ public:
-                 return 1;
-             case kTranslate_PathTransformType:
-                 return 2;
-             case kAffine_PathTransformType:
-                 return 6;
+Index: firefox-102.0/gfx/skia/skia/src/gpu/GrPathRendering.h
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/GrPathRendering.h
++++ firefox-102.0/gfx/skia/skia/src/gpu/GrPathRendering.h
+@@ -63,6 +63,7 @@ public:
  
              default:
                  SK_ABORT("Unknown path transform type");
@@ -429,20 +268,11 @@
          }
      }
  
-     // No native support for inverse at this time
-     enum FillType {
-         /** Specifies that "inside" is computed by a non-zero sum of signed
-             edge crossings
-         */
-diff --git a/gfx/skia/skia/src/gpu/GrProcessorUnitTest.cpp b/gfx/skia/skia/src/gpu/GrProcessorUnitTest.cpp
---- a/gfx/skia/skia/src/gpu/GrProcessorUnitTest.cpp
-+++ b/gfx/skia/skia/src/gpu/GrProcessorUnitTest.cpp
-@@ -15,11 +15,12 @@ std::unique_ptr<GrFragmentProcessor> GrP
-     std::unique_ptr<GrFragmentProcessor> fp;
-     do {
-         fp = GrFragmentProcessorTestFactory::Make(data);
-         SkASSERT(fp);
-     } while (fp->numChildProcessors() != 0);
+Index: firefox-102.0/gfx/skia/skia/src/gpu/GrProcessorUnitTest.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/GrProcessorUnitTest.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/GrProcessorUnitTest.cpp
+@@ -20,6 +20,7 @@ std::unique_ptr<GrFragmentProcessor> GrP
      return fp;
  #else
      SK_ABORT("Should not be called if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS");
@@ -450,15 +280,11 @@
  #endif
  }
  #endif
-diff --git a/gfx/skia/skia/src/gpu/GrReducedClip.cpp b/gfx/skia/skia/src/gpu/GrReducedClip.cpp
---- a/gfx/skia/skia/src/gpu/GrReducedClip.cpp
-+++ b/gfx/skia/skia/src/gpu/GrReducedClip.cpp
-@@ -520,16 +520,17 @@ GrReducedClip::ClipResult GrReducedClip:
-                                        GrAA(element->isAA()));
- 
-         case Element::DeviceSpaceType::kPath:
-             return this->addAnalyticFP(element->getDeviceSpacePath(),
-                                        Invert(element->isInverseFilled()), GrAA(element->isAA()));
+Index: firefox-102.0/gfx/skia/skia/src/gpu/GrReducedClip.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/GrReducedClip.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/GrReducedClip.cpp
+@@ -525,6 +525,7 @@ GrReducedClip::ClipResult GrReducedClip:
      }
  
      SK_ABORT("Unexpected DeviceSpaceType");
@@ -466,17 +292,7 @@
  }
  
  GrReducedClip::ClipResult GrReducedClip::clipOutsideElement(const Element* element) {
-     switch (element->getDeviceSpaceType()) {
-         case Element::DeviceSpaceType::kEmpty:
-             return ClipResult::kMadeEmpty;
- 
-         case Element::DeviceSpaceType::kRect:
-@@ -586,16 +587,17 @@ GrReducedClip::ClipResult GrReducedClip:
-         }
- 
-         case Element::DeviceSpaceType::kPath:
-             return this->addAnalyticFP(element->getDeviceSpacePath(),
-                                        Invert(!element->isInverseFilled()), GrAA(element->isAA()));
+@@ -591,6 +592,7 @@ GrReducedClip::ClipResult GrReducedClip:
      }
  
      SK_ABORT("Unexpected DeviceSpaceType");
@@ -484,20 +300,11 @@
  }
  
  inline void GrReducedClip::addWindowRectangle(const SkRect& elementInteriorRect, bool elementIsAA) {
-     SkIRect window;
-     if (!elementIsAA) {
-         elementInteriorRect.round(&window);
-     } else {
-         elementInteriorRect.roundIn(&window);
-diff --git a/gfx/skia/skia/src/gpu/GrResourceCache.cpp b/gfx/skia/skia/src/gpu/GrResourceCache.cpp
---- a/gfx/skia/skia/src/gpu/GrResourceCache.cpp
-+++ b/gfx/skia/skia/src/gpu/GrResourceCache.cpp
-@@ -35,27 +35,29 @@ DECLARE_SKMESSAGEBUS_MESSAGE(GrTextureFr
- //////////////////////////////////////////////////////////////////////////////
- 
- GrScratchKey::ResourceType GrScratchKey::GenerateResourceType() {
-     static std::atomic<int32_t> nextType{INHERITED::kInvalidDomain + 1};
- 
+Index: firefox-102.0/gfx/skia/skia/src/gpu/GrResourceCache.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/GrResourceCache.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/GrResourceCache.cpp
+@@ -40,6 +40,7 @@ GrScratchKey::ResourceType GrScratchKey:
      int32_t type = nextType++;
      if (type > SkTo<int32_t>(UINT16_MAX)) {
          SK_ABORT("Too many Resource Types");
@@ -505,11 +312,7 @@
      }
  
      return static_cast<ResourceType>(type);
- }
- 
- GrUniqueKey::Domain GrUniqueKey::GenerateDomain() {
-     static std::atomic<int32_t> nextDomain{INHERITED::kInvalidDomain + 1};
- 
+@@ -51,6 +52,7 @@ GrUniqueKey::Domain GrUniqueKey::Generat
      int32_t domain = nextDomain++;
      if (domain > SkTo<int32_t>(UINT16_MAX)) {
          SK_ABORT("Too many GrUniqueKey Domains");
@@ -517,20 +320,11 @@
      }
  
      return static_cast<Domain>(domain);
- }
- 
- uint32_t GrResourceKeyHash(const uint32_t* data, size_t size) {
-     return SkOpts::hash(data, size);
- }
-diff --git a/gfx/skia/skia/src/gpu/GrShaderVar.cpp b/gfx/skia/skia/src/gpu/GrShaderVar.cpp
---- a/gfx/skia/skia/src/gpu/GrShaderVar.cpp
-+++ b/gfx/skia/skia/src/gpu/GrShaderVar.cpp
-@@ -13,30 +13,32 @@ static const char* type_modifier_string(
-     switch (t) {
-         case GrShaderVar::kNone_TypeModifier: return "";
-         case GrShaderVar::kIn_TypeModifier: return "in";
-         case GrShaderVar::kInOut_TypeModifier: return "inout";
-         case GrShaderVar::kOut_TypeModifier: return "out";
+Index: firefox-102.0/gfx/skia/skia/src/gpu/GrShaderVar.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/GrShaderVar.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/GrShaderVar.cpp
+@@ -18,6 +18,7 @@ static const char* type_modifier_string(
          case GrShaderVar::kUniform_TypeModifier: return "uniform";
      }
      SK_ABORT("Unknown shader variable type modifier.");
@@ -538,14 +332,7 @@
  }
  
  void GrShaderVar::setIOType(GrIOType ioType) {
-     switch (ioType) {
-         case kRW_GrIOType:
-             return;
-         case kRead_GrIOType:
-             this->addModifier("readonly");
-             return;
-         case kWrite_GrIOType:
-             this->addModifier("writeonly");
+@@ -32,6 +33,7 @@ void GrShaderVar::setIOType(GrIOType ioT
              return;
      }
      SK_ABORT("Unknown io type.");
@@ -553,20 +340,11 @@
  }
  
  void GrShaderVar::appendDecl(const GrShaderCaps* shaderCaps, SkString* out) const {
-     SkString layout = fLayoutQualifier;
-     if (!fLayoutQualifier.isEmpty()) {
-         out->appendf("layout(%s) ", fLayoutQualifier.c_str());
-     }
-     out->append(fExtraModifiers);
-diff --git a/gfx/skia/skia/src/gpu/SkGpuDevice.cpp b/gfx/skia/skia/src/gpu/SkGpuDevice.cpp
---- a/gfx/skia/skia/src/gpu/SkGpuDevice.cpp
-+++ b/gfx/skia/skia/src/gpu/SkGpuDevice.cpp
-@@ -278,16 +278,17 @@ static inline GrPrimitiveType point_mode
-         case SkCanvas::kPoints_PointMode:
-             return GrPrimitiveType::kPoints;
-         case SkCanvas::kLines_PointMode:
-             return GrPrimitiveType::kLines;
-         case SkCanvas::kPolygon_PointMode:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/SkGpuDevice.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/SkGpuDevice.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/SkGpuDevice.cpp
+@@ -283,6 +283,7 @@ static inline GrPrimitiveType point_mode
              return GrPrimitiveType::kLineStrip;
      }
      SK_ABORT("Unexpected mode");
@@ -574,20 +352,11 @@
  }
  
  void SkGpuDevice::drawPoints(SkCanvas::PointMode mode,
-                              size_t count, const SkPoint pts[], const SkPaint& paint) {
-     ASSERT_SINGLE_OWNER
-     GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice", "drawPoints", fContext.get());
-     SkScalar width = paint.getStrokeWidth();
-     if (width < 0) {
-diff --git a/gfx/skia/skia/src/gpu/SkGr.h b/gfx/skia/skia/src/gpu/SkGr.h
---- a/gfx/skia/skia/src/gpu/SkGr.h
-+++ b/gfx/skia/skia/src/gpu/SkGr.h
-@@ -154,16 +154,17 @@ static inline GrPrimitiveType SkVertexMo
-         case SkVertices::kTriangles_VertexMode:
-             return GrPrimitiveType::kTriangles;
-         case SkVertices::kTriangleStrip_VertexMode:
-             return GrPrimitiveType::kTriangleStrip;
-         case SkVertices::kTriangleFan_VertexMode:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/SkGr.h
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/SkGr.h
++++ firefox-102.0/gfx/skia/skia/src/gpu/SkGr.h
+@@ -159,6 +159,7 @@ static inline GrPrimitiveType SkVertexMo
              break;
      }
      SK_ABORT("Invalid mode");
@@ -595,20 +364,11 @@
  }
  
  //////////////////////////////////////////////////////////////////////////////
- 
- GR_STATIC_ASSERT((int)kZero_GrBlendCoeff == (int)SkBlendModeCoeff::kZero);
- GR_STATIC_ASSERT((int)kOne_GrBlendCoeff == (int)SkBlendModeCoeff::kOne);
- GR_STATIC_ASSERT((int)kSC_GrBlendCoeff == (int)SkBlendModeCoeff::kSC);
- GR_STATIC_ASSERT((int)kISC_GrBlendCoeff == (int)SkBlendModeCoeff::kISC);
-diff --git a/gfx/skia/skia/src/gpu/ccpr/GrCCCoverageProcessor.h b/gfx/skia/skia/src/gpu/ccpr/GrCCCoverageProcessor.h
---- a/gfx/skia/skia/src/gpu/ccpr/GrCCCoverageProcessor.h
-+++ b/gfx/skia/skia/src/gpu/ccpr/GrCCCoverageProcessor.h
-@@ -235,16 +235,17 @@ inline const char* GrCCCoverageProcessor
-     switch (type) {
-         case PrimitiveType::kTriangles: return "kTriangles";
-         case PrimitiveType::kWeightedTriangles: return "kWeightedTriangles";
-         case PrimitiveType::kQuadratics: return "kQuadratics";
-         case PrimitiveType::kCubics: return "kCubics";
+Index: firefox-102.0/gfx/skia/skia/src/gpu/ccpr/GrCCCoverageProcessor.h
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/ccpr/GrCCCoverageProcessor.h
++++ firefox-102.0/gfx/skia/skia/src/gpu/ccpr/GrCCCoverageProcessor.h
+@@ -240,6 +240,7 @@ inline const char* GrCCCoverageProcessor
          case PrimitiveType::kConics: return "kConics";
      }
      SK_ABORT("Invalid PrimitiveType");
@@ -616,20 +376,11 @@
  }
  
  inline void GrCCCoverageProcessor::TriPointInstance::set(
-         const SkPoint p[3], const Sk2f& translate, Ordering ordering) {
-     this->set(p[0], p[1], p[2], translate, ordering);
- }
- 
- inline void GrCCCoverageProcessor::TriPointInstance::set(
-diff --git a/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.cpp b/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.cpp
---- a/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.cpp
-+++ b/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.cpp
-@@ -55,16 +55,17 @@ static GrCCStrokeGeometry::Verb join_ver
-         case SkPaint::kBevel_Join:
-             return Verb::kBevelJoin;
-         case SkPaint::kMiter_Join:
-             return Verb::kMiterJoin;
-         case SkPaint::kRound_Join:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.cpp
+@@ -60,6 +60,7 @@ static GrCCStrokeGeometry::Verb join_ver
              return Verb::kRoundJoin;
      }
      SK_ABORT("Invalid SkPaint::Join.");
@@ -637,35 +388,22 @@
  }
  
  void GrCCStrokeGeometry::beginPath(const SkStrokeRec& stroke, float strokeDevWidth,
-                                    InstanceTallies* tallies) {
-     SkASSERT(!fInsideContour);
-     // Client should have already converted the stroke to device space (i.e. width=1 for hairline).
-     SkASSERT(strokeDevWidth > 0);
- 
-diff --git a/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.h b/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.h
---- a/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.h
-+++ b/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.h
-@@ -170,10 +170,11 @@ inline bool GrCCStrokeGeometry::IsIntern
-         case Verb::kMiterJoin:
-         case Verb::kRoundJoin:
-         case Verb::kSquareCap:
-         case Verb::kRoundCap:
-         case Verb::kEndContour:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.h
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.h
++++ firefox-102.0/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.h
+@@ -175,5 +175,6 @@ inline bool GrCCStrokeGeometry::IsIntern
              return false;
      }
      SK_ABORT("Invalid GrCCStrokeGeometry::Verb.");
 +    SkUNREACHABLE;
  }
  #endif
-diff --git a/gfx/skia/skia/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp b/gfx/skia/skia/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
---- a/gfx/skia/skia/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
-+++ b/gfx/skia/skia/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
-@@ -159,16 +159,17 @@ GrPathRenderer::CanDrawPath GrCoverageCo
-             return CanDrawPath::kYes;
-         }
- 
-         case SkStrokeRec::kStrokeAndFill_Style:
-             return CanDrawPath::kNo;
+Index: firefox-102.0/gfx/skia/skia/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp
+@@ -164,6 +164,7 @@ GrPathRenderer::CanDrawPath GrCoverageCo
      }
  
      SK_ABORT("Invalid stroke style.");
@@ -673,34 +411,21 @@
  }
  
  bool GrCoverageCountingPathRenderer::onDrawPath(const DrawPathArgs& args) {
-     SkASSERT(!fFlushing);
- 
-     SkIRect clipIBounds;
-     GrRenderTargetContext* rtc = args.fRenderTargetContext;
-     args.fClip->getConservativeBounds(rtc->width(), rtc->height(), &clipIBounds, nullptr);
-diff --git a/gfx/skia/skia/src/gpu/ccpr/GrVSCoverageProcessor.cpp b/gfx/skia/skia/src/gpu/ccpr/GrVSCoverageProcessor.cpp
---- a/gfx/skia/skia/src/gpu/ccpr/GrVSCoverageProcessor.cpp
-+++ b/gfx/skia/skia/src/gpu/ccpr/GrVSCoverageProcessor.cpp
-@@ -545,9 +545,10 @@ GrGLSLPrimitiveProcessor* GrVSCoveragePr
-         case PrimitiveType::kWeightedTriangles:
-             return new Impl(std::move(shader), 3);
-         case PrimitiveType::kQuadratics:
-         case PrimitiveType::kCubics:
-         case PrimitiveType::kConics:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/ccpr/GrVSCoverageProcessor.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/ccpr/GrVSCoverageProcessor.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/ccpr/GrVSCoverageProcessor.cpp
+@@ -550,4 +550,5 @@ GrGLSLPrimitiveProcessor* GrVSCoveragePr
              return new Impl(std::move(shader), 4);
      }
      SK_ABORT("Invalid PrimitiveType");
 +    SkUNREACHABLE;
  }
-diff --git a/gfx/skia/skia/src/gpu/dawn/GrDawnOpsRenderPass.cpp b/gfx/skia/skia/src/gpu/dawn/GrDawnOpsRenderPass.cpp
---- a/gfx/skia/skia/src/gpu/dawn/GrDawnOpsRenderPass.cpp
-+++ b/gfx/skia/skia/src/gpu/dawn/GrDawnOpsRenderPass.cpp
-@@ -34,17 +34,19 @@ static dawn::LoadOp to_dawn_load_op(GrLo
-             // Load should be equivalent to DontCare for desktop; Clear would
-             // probably be better for tilers. If Dawn does add DontCare
-             // as an extension, use it here.
-             return dawn::LoadOp::Load;
-         case GrLoadOp::kClear:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/dawn/GrDawnOpsRenderPass.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/dawn/GrDawnOpsRenderPass.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/dawn/GrDawnOpsRenderPass.cpp
+@@ -39,7 +39,9 @@ static dawn::LoadOp to_dawn_load_op(GrLo
              return dawn::LoadOp::Clear;
          default:
              SK_ABORT("Invalid LoadOp");
@@ -710,20 +435,11 @@
  }
  
  GrDawnOpsRenderPass::GrDawnOpsRenderPass(GrDawnGpu* gpu, GrRenderTarget* rt, GrSurfaceOrigin origin,
-                                          const LoadAndStoreInfo& colorInfo,
-                                          const StencilLoadAndStoreInfo& stencilInfo)
-         : INHERITED(rt, origin)
-         , fGpu(gpu)
-         , fColorInfo(colorInfo) {
-diff --git a/gfx/skia/skia/src/gpu/dawn/GrDawnUniformHandler.cpp b/gfx/skia/skia/src/gpu/dawn/GrDawnUniformHandler.cpp
---- a/gfx/skia/skia/src/gpu/dawn/GrDawnUniformHandler.cpp
-+++ b/gfx/skia/skia/src/gpu/dawn/GrDawnUniformHandler.cpp
-@@ -90,16 +90,17 @@ uint32_t grsltype_to_alignment_mask(GrSL
-         case kTexture2DSampler_GrSLType:
-         case kTextureExternalSampler_GrSLType:
-         case kTexture2DRectSampler_GrSLType:
-         case kTexture2D_GrSLType:
-         case kSampler_GrSLType:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/dawn/GrDawnUniformHandler.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/dawn/GrDawnUniformHandler.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/dawn/GrDawnUniformHandler.cpp
+@@ -95,6 +95,7 @@ uint32_t grsltype_to_alignment_mask(GrSL
              break;
      }
      SK_ABORT("Unexpected type");
@@ -731,17 +447,7 @@
  }
  
  static inline uint32_t grsltype_to_size(GrSLType type) {
-     switch(type) {
-         case kByte_GrSLType:
-         case kUByte_GrSLType:
-             return 1;
-         case kByte2_GrSLType:
-@@ -168,16 +169,17 @@ static inline uint32_t grsltype_to_size(
-         case kTexture2DSampler_GrSLType:
-         case kTextureExternalSampler_GrSLType:
-         case kTexture2DRectSampler_GrSLType:
-         case kTexture2D_GrSLType:
-         case kSampler_GrSLType:
+@@ -173,6 +174,7 @@ static inline uint32_t grsltype_to_size(
              break;
      }
      SK_ABORT("Unexpected type");
@@ -749,20 +455,11 @@
  }
  
  uint32_t get_ubo_offset(uint32_t* currentOffset,
-                         GrSLType type,
-                         int arrayCount) {
-     uint32_t alignmentMask = grsltype_to_alignment_mask(type);
-     // We want to use the std140 layout here, so we must make arrays align to 16 bytes.
-     if (arrayCount || type == kFloat2x2_GrSLType) {
-diff --git a/gfx/skia/skia/src/gpu/dawn/GrDawnVaryingHandler.cpp b/gfx/skia/skia/src/gpu/dawn/GrDawnVaryingHandler.cpp
---- a/gfx/skia/skia/src/gpu/dawn/GrDawnVaryingHandler.cpp
-+++ b/gfx/skia/skia/src/gpu/dawn/GrDawnVaryingHandler.cpp
-@@ -71,16 +71,17 @@ static inline int grsltype_to_location_s
-         case kUByte_GrSLType:
-              return 1;
-         case kTexture2D_GrSLType:
-              return 0;
-         case kSampler_GrSLType:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/dawn/GrDawnVaryingHandler.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/dawn/GrDawnVaryingHandler.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/dawn/GrDawnVaryingHandler.cpp
+@@ -76,6 +76,7 @@ static inline int grsltype_to_location_s
               return 0;
      }
      SK_ABORT("Unexpected type");
@@ -770,20 +467,11 @@
  }
  
  static void finalize_helper(GrDawnVaryingHandler::VarArray& vars) {
-     int locationIndex = 0;
-     for (int i = 0; i < vars.count(); ++i) {
-         GrShaderVar& var = vars[i];
-         SkString location;
-         location.appendf("location = %d", locationIndex);
-diff --git a/gfx/skia/skia/src/gpu/effects/GrConstColorProcessor.fp b/gfx/skia/skia/src/gpu/effects/GrConstColorProcessor.fp
---- a/gfx/skia/skia/src/gpu/effects/GrConstColorProcessor.fp
-+++ b/gfx/skia/skia/src/gpu/effects/GrConstColorProcessor.fp
-@@ -53,16 +53,17 @@ void main() {
-             case InputMode::kIgnore:
-                 return color;
-             case InputMode::kModulateA:
-                 return color * input.fA;
-             case InputMode::kModulateRGBA:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/effects/GrConstColorProcessor.fp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/effects/GrConstColorProcessor.fp
++++ firefox-102.0/gfx/skia/skia/src/gpu/effects/GrConstColorProcessor.fp
+@@ -58,6 +58,7 @@ void main() {
                  return color * input;
          }
          SK_ABORT("Unexpected mode");
@@ -791,20 +479,11 @@
      }
  }
  
- @test(d) {
-     SkPMColor4f color;
-     int colorPicker = d->fRandom->nextULessThan(3);
-     switch (colorPicker) {
-         case 0: {
-diff --git a/gfx/skia/skia/src/gpu/effects/GrCoverageSetOpXP.cpp b/gfx/skia/skia/src/gpu/effects/GrCoverageSetOpXP.cpp
---- a/gfx/skia/skia/src/gpu/effects/GrCoverageSetOpXP.cpp
-+++ b/gfx/skia/skia/src/gpu/effects/GrCoverageSetOpXP.cpp
-@@ -199,16 +199,17 @@ const GrXPFactory* GrCoverageSetOpXPFact
-                 static _CONSTEXPR_ const GrCoverageSetOpXPFactory gRevDiffCDXPF(
-                         SkRegion::kReverseDifference_Op, false);
-                 return &gRevDiffCDXPF;
-             }
-         }
+Index: firefox-102.0/gfx/skia/skia/src/gpu/effects/GrCoverageSetOpXP.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/effects/GrCoverageSetOpXP.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/effects/GrCoverageSetOpXP.cpp
+@@ -204,6 +204,7 @@ const GrXPFactory* GrCoverageSetOpXPFact
      }
  #undef _CONSTEXPR_
      SK_ABORT("Unknown region op.");
@@ -812,20 +491,11 @@
  }
  
  sk_sp<const GrXferProcessor> GrCoverageSetOpXPFactory::makeXferProcessor(
-         const GrProcessorAnalysisColor&,
-         GrProcessorAnalysisCoverage,
-         bool hasMixedSamples,
-         const GrCaps& caps,
-         GrClampType) const {
-diff --git a/gfx/skia/skia/src/gpu/effects/GrPorterDuffXferProcessor.cpp b/gfx/skia/skia/src/gpu/effects/GrPorterDuffXferProcessor.cpp
---- a/gfx/skia/skia/src/gpu/effects/GrPorterDuffXferProcessor.cpp
-+++ b/gfx/skia/skia/src/gpu/effects/GrPorterDuffXferProcessor.cpp
-@@ -748,16 +748,17 @@ const GrXPFactory* GrPorterDuffXPFactory
-         case SkBlendMode::kPlus:
-             return &gPlusPDXPF;
-         case SkBlendMode::kModulate:
-             return &gModulatePDXPF;
-         case SkBlendMode::kScreen:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/effects/GrPorterDuffXferProcessor.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/effects/GrPorterDuffXferProcessor.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/effects/GrPorterDuffXferProcessor.cpp
+@@ -753,6 +753,7 @@ const GrXPFactory* GrPorterDuffXPFactory
              return &gScreenPDXPF;
          default:
              SK_ABORT("Unexpected blend mode.");
@@ -833,20 +503,11 @@
      }
  }
  
- sk_sp<const GrXferProcessor> GrPorterDuffXPFactory::makeXferProcessor(
-         const GrProcessorAnalysisColor& color, GrProcessorAnalysisCoverage coverage,
-         bool hasMixedSamples, const GrCaps& caps, GrClampType clampType) const {
-     BlendFormula blendFormula;
-     bool isLCD = coverage == GrProcessorAnalysisCoverage::kLCD;
-diff --git a/gfx/skia/skia/src/gpu/effects/GrSkSLFP.cpp b/gfx/skia/skia/src/gpu/effects/GrSkSLFP.cpp
---- a/gfx/skia/skia/src/gpu/effects/GrSkSLFP.cpp
-+++ b/gfx/skia/skia/src/gpu/effects/GrSkSLFP.cpp
-@@ -149,16 +149,17 @@ public:
-             return kHalf4x4_GrSLType;
-         } else if (type == *fContext.fBool_Type) {
-             return kBool_GrSLType;
-         } else if (type == *fContext.fInt_Type) {
-             return kInt_GrSLType;
+Index: firefox-102.0/gfx/skia/skia/src/gpu/effects/GrSkSLFP.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/effects/GrSkSLFP.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/effects/GrSkSLFP.cpp
+@@ -154,6 +154,7 @@ public:
          }
          printf("%s\n", SkSL::String(type.fName).c_str());
          SK_ABORT("unsupported uniform type");
@@ -854,17 +515,7 @@
      }
  
      void emitCode(EmitArgs& args) override {
-         for (const auto& v : fInAndUniformVars) {
-             if (v->fModifiers.fFlags & SkSL::Modifiers::kUniform_Flag && v->fType !=
-                                                                 *fContext.fFragmentProcessor_Type) {
-                 fUniformHandles.push_back(args.fUniformHandler->addUniform(
-                                                                    kFragment_GrShaderFlag,
-@@ -563,11 +564,12 @@ std::unique_ptr<GrFragmentProcessor> GrS
-             }
-             std::unique_ptr<GrSkSLFP> result = GrSkSLFP::Make(d->context(), overdrawIndex,
-                                                               "Overdraw", SKSL_OVERDRAW_SRC,
-                                                               &inputs, sizeof(inputs));
-             return std::unique_ptr<GrFragmentProcessor>(result.release());
+@@ -568,6 +569,7 @@ std::unique_ptr<GrFragmentProcessor> GrS
          }
      }
      SK_ABORT("unreachable");
@@ -872,15 +523,11 @@
  }
  
  #endif
-diff --git a/gfx/skia/skia/src/gpu/effects/generated/GrConstColorProcessor.h b/gfx/skia/skia/src/gpu/effects/generated/GrConstColorProcessor.h
---- a/gfx/skia/skia/src/gpu/effects/generated/GrConstColorProcessor.h
-+++ b/gfx/skia/skia/src/gpu/effects/generated/GrConstColorProcessor.h
-@@ -36,16 +36,17 @@ public:
-             case InputMode::kIgnore:
-                 return color;
-             case InputMode::kModulateA:
-                 return color * input.fA;
-             case InputMode::kModulateRGBA:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/effects/generated/GrConstColorProcessor.h
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/effects/generated/GrConstColorProcessor.h
++++ firefox-102.0/gfx/skia/skia/src/gpu/effects/generated/GrConstColorProcessor.h
+@@ -41,6 +41,7 @@ public:
                  return color * input;
          }
          SK_ABORT("Unexpected mode");
@@ -888,20 +535,11 @@
      }
      static std::unique_ptr<GrFragmentProcessor> Make(SkPMColor4f color, InputMode mode) {
          return std::unique_ptr<GrFragmentProcessor>(new GrConstColorProcessor(color, mode));
-     }
-     GrConstColorProcessor(const GrConstColorProcessor& src);
-     std::unique_ptr<GrFragmentProcessor> clone() const override;
-     const char* name() const override { return "ConstColorProcessor"; }
-     SkPMColor4f color;
-diff --git a/gfx/skia/skia/src/gpu/geometry/GrShape.cpp b/gfx/skia/skia/src/gpu/geometry/GrShape.cpp
---- a/gfx/skia/skia/src/gpu/geometry/GrShape.cpp
-+++ b/gfx/skia/skia/src/gpu/geometry/GrShape.cpp
-@@ -159,16 +159,17 @@ SkRect GrShape::bounds() const {
-             return fRRectData.fRRect.getBounds();
-         case Type::kArc:
-             // Could make this less conservative by looking at angles.
-             return fArcData.fOval;
-         case Type::kPath:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/geometry/GrShape.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/geometry/GrShape.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/geometry/GrShape.cpp
+@@ -164,6 +164,7 @@ SkRect GrShape::bounds() const {
              return this->path().getBounds();
      }
      SK_ABORT("Unknown shape type");
@@ -909,17 +547,7 @@
  }
  
  SkRect GrShape::styledBounds() const {
-     if (this->isEmpty() && !fStyle.hasNonDashPathEffect()) {
-         return SkRect::MakeEmpty();
-     }
- 
-     SkRect bounds;
-@@ -249,16 +250,17 @@ int GrShape::unstyledKeySize() const {
-             if (dataKeySize >= 0) {
-                 return dataKeySize;
-             }
-             // The key is the path ID and fill type.
-             return 2;
+@@ -254,6 +255,7 @@ int GrShape::unstyledKeySize() const {
          }
      }
      SK_ABORT("Should never get here.");
@@ -927,20 +555,11 @@
  }
  
  void GrShape::writeUnstyledKey(uint32_t* key) const {
-     SkASSERT(this->unstyledKeySize());
-     SkDEBUGCODE(uint32_t* origKey = key;)
-     if (fInheritedKey.count()) {
-         memcpy(key, fInheritedKey.get(), sizeof(uint32_t) * fInheritedKey.count());
-         SkDEBUGCODE(key += fInheritedKey.count();)
-diff --git a/gfx/skia/skia/src/gpu/gl/GrGLCaps.cpp b/gfx/skia/skia/src/gpu/gl/GrGLCaps.cpp
---- a/gfx/skia/skia/src/gpu/gl/GrGLCaps.cpp
-+++ b/gfx/skia/skia/src/gpu/gl/GrGLCaps.cpp
-@@ -4154,16 +4154,17 @@ GrBackendFormat GrGLCaps::getBackendForm
-         case SkImage::kETC1_CompressionType:
-             // if ETC2 is available default to that format
-             if (this->isFormatTexturable(GrGLFormat::kCOMPRESSED_RGB8_ETC2)) {
-                 return GrBackendFormat::MakeGL(GR_GL_COMPRESSED_RGB8_ETC2, GR_GL_TEXTURE_2D);
-             }
+Index: firefox-102.0/gfx/skia/skia/src/gpu/gl/GrGLCaps.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/gl/GrGLCaps.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/gl/GrGLCaps.cpp
+@@ -4159,6 +4159,7 @@ GrBackendFormat GrGLCaps::getBackendForm
              return GrBackendFormat::MakeGL(GR_GL_COMPRESSED_ETC1_RGB8, GR_GL_TEXTURE_2D);
      }
      SK_ABORT("Invalid compression type");
@@ -948,34 +567,21 @@
  }
  
  GrSwizzle GrGLCaps::getTextureSwizzle(const GrBackendFormat& format, GrColorType colorType) const {
-     const auto& info = this->getFormatInfo(format.asGLFormat());
-     for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
-         const auto& ctInfo = info.fColorTypeInfos[i];
-         if (ctInfo.fColorType == colorType) {
-             return ctInfo.fTextureSwizzle;
-diff --git a/gfx/skia/skia/src/gpu/gl/GrGLGLSL.cpp b/gfx/skia/skia/src/gpu/gl/GrGLGLSL.cpp
---- a/gfx/skia/skia/src/gpu/gl/GrGLGLSL.cpp
-+++ b/gfx/skia/skia/src/gpu/gl/GrGLGLSL.cpp
-@@ -63,9 +63,10 @@ bool GrGLGetGLSLGeneration(const GrGLInt
-         if (ver >= GR_GLSL_VER(2,0)) {
-             *generation = k330_GrGLSLGeneration;  // ES 3.0
-         } else {
-             *generation = k110_GrGLSLGeneration;
-         }
+Index: firefox-102.0/gfx/skia/skia/src/gpu/gl/GrGLGLSL.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/gl/GrGLGLSL.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/gl/GrGLGLSL.cpp
+@@ -68,4 +68,5 @@ bool GrGLGetGLSLGeneration(const GrGLInt
          return true;
      }
      SK_ABORT("Unknown GL Standard");
 +    SkUNREACHABLE;
  }
-diff --git a/gfx/skia/skia/src/gpu/gl/GrGLGpu.cpp b/gfx/skia/skia/src/gpu/gl/GrGLGpu.cpp
---- a/gfx/skia/skia/src/gpu/gl/GrGLGpu.cpp
-+++ b/gfx/skia/skia/src/gpu/gl/GrGLGpu.cpp
-@@ -191,16 +191,17 @@ static int gl_target_to_binding_index(Gr
-         case GR_GL_TEXTURE_2D:
-             return 0;
-         case GR_GL_TEXTURE_RECTANGLE:
-             return 1;
-         case GR_GL_TEXTURE_EXTERNAL:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/gl/GrGLGpu.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/gl/GrGLGpu.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/gl/GrGLGpu.cpp
+@@ -196,6 +196,7 @@ static int gl_target_to_binding_index(Gr
              return 2;
      }
      SK_ABORT("Unexpected GL texture target.");
@@ -983,17 +589,7 @@
  }
  
  GrGpuResource::UniqueID GrGLGpu::TextureUnitBindings::boundID(GrGLenum target) const {
-     return fTargetBindings[gl_target_to_binding_index(target)].fBoundResourceID;
- }
- 
- bool GrGLGpu::TextureUnitBindings::hasBeenModified(GrGLenum target) const {
-     return fTargetBindings[gl_target_to_binding_index(target)].fHasBeenModified;
-@@ -229,39 +230,42 @@ void GrGLGpu::TextureUnitBindings::inval
- 
- static GrGLenum filter_to_gl_mag_filter(GrSamplerState::Filter filter) {
-     switch (filter) {
-         case GrSamplerState::Filter::kNearest: return GR_GL_NEAREST;
-         case GrSamplerState::Filter::kBilerp:  return GR_GL_LINEAR;
+@@ -234,6 +235,7 @@ static GrGLenum filter_to_gl_mag_filter(
          case GrSamplerState::Filter::kMipMap:  return GR_GL_LINEAR;
      }
      SK_ABORT("Unknown filter");
@@ -1001,9 +597,7 @@
  }
  
  static GrGLenum filter_to_gl_min_filter(GrSamplerState::Filter filter) {
-     switch (filter) {
-         case GrSamplerState::Filter::kNearest: return GR_GL_NEAREST;
-         case GrSamplerState::Filter::kBilerp:  return GR_GL_LINEAR;
+@@ -243,6 +245,7 @@ static GrGLenum filter_to_gl_min_filter(
          case GrSamplerState::Filter::kMipMap:  return GR_GL_LINEAR_MIPMAP_LINEAR;
      }
      SK_ABORT("Unknown filter");
@@ -1011,14 +605,7 @@
  }
  
  static inline GrGLenum wrap_mode_to_gl_wrap(GrSamplerState::WrapMode wrapMode,
-                                             const GrCaps& caps) {
-     switch (wrapMode) {
-         case GrSamplerState::WrapMode::kClamp:        return GR_GL_CLAMP_TO_EDGE;
-         case GrSamplerState::WrapMode::kRepeat:       return GR_GL_REPEAT;
-         case GrSamplerState::WrapMode::kMirrorRepeat: return GR_GL_MIRRORED_REPEAT;
-         case GrSamplerState::WrapMode::kClampToBorder:
-             // May not be supported but should have been caught earlier
-             SkASSERT(caps.clampToBorderSupport());
+@@ -257,6 +260,7 @@ static inline GrGLenum wrap_mode_to_gl_w
              return GR_GL_CLAMP_TO_BORDER;
      }
      SK_ABORT("Unknown wrap mode");
@@ -1026,17 +613,7 @@
  }
  
  ///////////////////////////////////////////////////////////////////////////////
- 
- class GrGLGpu::SamplerObjectCache {
- public:
-     SamplerObjectCache(GrGLGpu* gpu) : fGpu(gpu) {
-         fNumTextureUnits = fGpu->glCaps().shaderCaps()->maxFragmentSamplers();
-@@ -1102,17 +1106,17 @@ static bool renderbuffer_storage_msaa(co
-             GL_ALLOC_CALL(ctx.interface(),
-                             RenderbufferStorageMultisampleES2EXT(GR_GL_RENDERBUFFER,
-                                                                 sampleCount,
-                                                                 format,
-                                                                 width, height));
+@@ -1107,7 +1111,7 @@ static bool renderbuffer_storage_msaa(co
              break;
          case GrGLCaps::kNone_MSFBOType:
              SK_ABORT("Shouldn't be here if we don't support multisampled renderbuffers.");
@@ -1045,17 +622,7 @@
      }
      return (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface()));
  }
- 
- bool GrGLGpu::createRenderTargetObjects(const GrGLTexture::Desc& desc,
-                                         int sampleCount,
-                                         GrGLRenderTarget::IDs* rtIDs) {
-     rtIDs->fMSColorRenderbufferID = 0;
-@@ -2270,19 +2274,20 @@ static GrGLenum gr_primitive_type_to_gl_
-         case GrPrimitiveType::kPoints:
-             return GR_GL_POINTS;
-         case GrPrimitiveType::kLines:
-             return GR_GL_LINES;
-         case GrPrimitiveType::kLineStrip:
+@@ -2275,9 +2279,10 @@ static GrGLenum gr_primitive_type_to_gl_
              return GR_GL_LINE_STRIP;
          case GrPrimitiveType::kPath:
              SK_ABORT("non-mesh-based GrPrimitiveType");
@@ -1067,17 +634,7 @@
  }
  
  void GrGLGpu::sendMeshToGpu(GrPrimitiveType primitiveType, const GrBuffer* vertexBuffer,
-                             int vertexCount, int baseVertex) {
-     const GrGLenum glPrimType = gr_primitive_type_to_gl_mode(primitiveType);
-     if (this->glCaps().drawArraysBaseVertexIsBroken()) {
-         this->setupGeometry(nullptr, vertexBuffer, baseVertex, nullptr, 0, GrPrimitiveRestart::kNo);
-         GL_CALL(DrawArrays(glPrimType, 0, vertexCount));
-@@ -4001,17 +4006,18 @@ int GrGLGpu::TextureToCopyProgramIdx(GrT
-     switch (GrSLCombinedSamplerTypeForTextureType(texture->texturePriv().textureType())) {
-         case kTexture2DSampler_GrSLType:
-             return 0;
-         case kTexture2DRectSampler_GrSLType:
-             return 1;
+@@ -4006,7 +4011,8 @@ int GrGLGpu::TextureToCopyProgramIdx(GrT
          case kTextureExternalSampler_GrSLType:
              return 2;
          default:
@@ -1087,20 +644,11 @@
      }
  }
  
- #ifdef SK_ENABLE_DUMP_GPU
- #include "src/utils/SkJSONWriter.h"
- void GrGLGpu::onDumpJSON(SkJSONWriter* writer) const {
-     // We are called by the base class, which has already called beginObject(). We choose to nest
-     // all of our caps information in a named sub-object.
-diff --git a/gfx/skia/skia/src/gpu/gl/GrGLPath.cpp b/gfx/skia/skia/src/gpu/gl/GrGLPath.cpp
---- a/gfx/skia/skia/src/gpu/gl/GrGLPath.cpp
-+++ b/gfx/skia/skia/src/gpu/gl/GrGLPath.cpp
-@@ -192,16 +192,17 @@ inline bool init_path_object_for_general
- 
- /*
-  * For now paths only natively support winding and even odd fill types
-  */
- static GrPathRendering::FillType convert_skpath_filltype(SkPath::FillType fill) {
+Index: firefox-102.0/gfx/skia/skia/src/gpu/gl/GrGLPath.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/gl/GrGLPath.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/gl/GrGLPath.cpp
+@@ -197,6 +197,7 @@ static GrPathRendering::FillType convert
      switch (fill) {
          default:
              SK_ABORT("Incomplete Switch\n");
@@ -1108,20 +656,11 @@
          case SkPath::kWinding_FillType:
          case SkPath::kInverseWinding_FillType:
              return GrPathRendering::kWinding_FillType;
-         case SkPath::kEvenOdd_FillType:
-         case SkPath::kInverseEvenOdd_FillType:
-             return GrPathRendering::kEvenOdd_FillType;
-     }
- }
-diff --git a/gfx/skia/skia/src/gpu/gl/GrGLTexture.cpp b/gfx/skia/skia/src/gpu/gl/GrGLTexture.cpp
---- a/gfx/skia/skia/src/gpu/gl/GrGLTexture.cpp
-+++ b/gfx/skia/skia/src/gpu/gl/GrGLTexture.cpp
-@@ -20,30 +20,33 @@ GrTextureType GrGLTexture::TextureTypeFr
-         case GR_GL_TEXTURE_2D:
-             return GrTextureType::k2D;
-         case GR_GL_TEXTURE_RECTANGLE:
-             return GrTextureType::kRectangle;
-         case GR_GL_TEXTURE_EXTERNAL:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/gl/GrGLTexture.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/gl/GrGLTexture.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/gl/GrGLTexture.cpp
+@@ -25,6 +25,7 @@ GrTextureType GrGLTexture::TextureTypeFr
              return GrTextureType::kExternal;
      }
      SK_ABORT("Unexpected texture target");
@@ -1129,12 +668,7 @@
  }
  
  static inline GrGLenum target_from_texture_type(GrTextureType type) {
-     switch (type) {
-         case GrTextureType::k2D:
-             return GR_GL_TEXTURE_2D;
-         case GrTextureType::kRectangle:
-             return GR_GL_TEXTURE_RECTANGLE;
-         case GrTextureType::kExternal:
+@@ -37,8 +38,10 @@ static inline GrGLenum target_from_textu
              return GR_GL_TEXTURE_EXTERNAL;
          default:
              SK_ABORT("Unexpected texture target");
@@ -1145,20 +679,11 @@
  }
  
  // Because this class is virtually derived from GrSurface we must explicitly call its constructor.
- GrGLTexture::GrGLTexture(GrGLGpu* gpu, SkBudgeted budgeted, const Desc& desc,
-                          GrMipMapsStatus mipMapsStatus)
-         : GrSurface(gpu, desc.fSize, desc.fConfig, GrProtected::kNo)
-         , INHERITED(gpu, desc.fSize, desc.fConfig, GrProtected::kNo,
-                     TextureTypeFromTarget(desc.fTarget), mipMapsStatus)
-diff --git a/gfx/skia/skia/src/gpu/gl/GrGLVertexArray.cpp b/gfx/skia/skia/src/gpu/gl/GrGLVertexArray.cpp
---- a/gfx/skia/skia/src/gpu/gl/GrGLVertexArray.cpp
-+++ b/gfx/skia/skia/src/gpu/gl/GrGLVertexArray.cpp
-@@ -75,16 +75,17 @@ static AttribLayout attrib_layout(GrVert
-         case kUint_GrVertexAttribType:
-             return {false, 1, GR_GL_UNSIGNED_INT};
-         case kUShort_norm_GrVertexAttribType:
-             return {true, 1, GR_GL_UNSIGNED_SHORT};
-         case kUShort4_norm_GrVertexAttribType:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/gl/GrGLVertexArray.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/gl/GrGLVertexArray.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/gl/GrGLVertexArray.cpp
+@@ -80,6 +80,7 @@ static AttribLayout attrib_layout(GrVert
              return {true, 4, GR_GL_UNSIGNED_SHORT};
      }
      SK_ABORT("Unknown vertex attrib type");
@@ -1166,34 +691,21 @@
  };
  
  void GrGLAttribArrayState::set(GrGLGpu* gpu,
-                                int index,
-                                const GrBuffer* vertexBuffer,
-                                GrVertexAttribType cpuType,
-                                GrSLType gpuType,
-                                GrGLsizei stride,
-diff --git a/gfx/skia/skia/src/gpu/glsl/GrGLSL.cpp b/gfx/skia/skia/src/gpu/glsl/GrGLSL.cpp
---- a/gfx/skia/skia/src/gpu/glsl/GrGLSL.cpp
-+++ b/gfx/skia/skia/src/gpu/glsl/GrGLSL.cpp
-@@ -93,9 +93,10 @@ const char* GrGLSLTypeString(GrSLType t)
-         case kUByte4_GrSLType:
-             return "ubyte4";
-         case kTexture2D_GrSLType:
-             return "texture2D";
-         case kSampler_GrSLType:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/glsl/GrGLSL.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/glsl/GrGLSL.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/glsl/GrGLSL.cpp
+@@ -98,4 +98,5 @@ const char* GrGLSLTypeString(GrSLType t)
              return "sampler";
      }
      SK_ABORT("Unknown shader var type.");
 +    SkUNREACHABLE;
  }
-diff --git a/gfx/skia/skia/src/gpu/glsl/GrGLSLVarying.cpp b/gfx/skia/skia/src/gpu/glsl/GrGLSLVarying.cpp
---- a/gfx/skia/skia/src/gpu/glsl/GrGLSLVarying.cpp
-+++ b/gfx/skia/skia/src/gpu/glsl/GrGLSLVarying.cpp
-@@ -30,16 +30,17 @@ static bool use_flat_interpolation(GrGLS
-             SkASSERT(!shaderCaps.preferFlatInterpolation() ||
-                      shaderCaps.flatInterpolationSupport());
-             return shaderCaps.preferFlatInterpolation();
-         case Interpolation::kMustBeFlat:
-             SkASSERT(shaderCaps.flatInterpolationSupport());
+Index: firefox-102.0/gfx/skia/skia/src/gpu/glsl/GrGLSLVarying.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/glsl/GrGLSLVarying.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/glsl/GrGLSLVarying.cpp
+@@ -35,6 +35,7 @@ static bool use_flat_interpolation(GrGLS
              return true;
      }
      SK_ABORT("Invalid interpolation");
@@ -1201,20 +713,11 @@
  }
  
  void GrGLSLVaryingHandler::addVarying(const char* name, GrGLSLVarying* varying,
-                                       Interpolation interpolation) {
-     SkASSERT(GrSLTypeIsFloatType(varying->type()) || Interpolation::kMustBeFlat == interpolation);
-     bool willUseGeoShader = fProgramBuilder->primitiveProcessor().willUseGeoShader();
-     VaryingInfo& v = fVaryings.push_back();
- 
-diff --git a/gfx/skia/skia/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp b/gfx/skia/skia/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp
---- a/gfx/skia/skia/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp
-+++ b/gfx/skia/skia/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp
-@@ -46,26 +46,28 @@ void GrGLSLVertexBuilder::onFinalize() {
- static const char* input_type_name(GrGLSLGeometryBuilder::InputType in) {
-     using InputType = GrGLSLGeometryBuilder::InputType;
-     switch (in) {
-         case InputType::kPoints: return "points";
-         case InputType::kLines: return "lines";
+Index: firefox-102.0/gfx/skia/skia/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp
+@@ -51,6 +51,7 @@ static const char* input_type_name(GrGLS
          case InputType::kTriangles: return "triangles";
      }
      SK_ABORT("invalid input type");
@@ -1222,10 +725,7 @@
  }
  
  static const char* output_type_name(GrGLSLGeometryBuilder::OutputType out) {
-     using OutputType = GrGLSLGeometryBuilder::OutputType;
-     switch (out) {
-         case OutputType::kPoints: return "points";
-         case OutputType::kLineStrip: return "line_strip";
+@@ -61,6 +62,7 @@ static const char* output_type_name(GrGL
          case OutputType::kTriangleStrip: return "triangle_strip";
      }
      SK_ABORT("invalid output type");
@@ -1233,20 +733,11 @@
  }
  
  void GrGLSLGeometryBuilder::configure(InputType inputType, OutputType outputType, int maxVertices,
-                                       int numInvocations) {
-     SkASSERT(!this->isConfigured());
-     fNumInvocations = numInvocations;
-     this->addLayoutQualifier(input_type_name(inputType), kIn_InterfaceQualifier);
-     this->addLayoutQualifier(SkStringPrintf("invocations = %i", numInvocations).c_str(),
-diff --git a/gfx/skia/skia/src/gpu/mtl/GrMtlCaps.mm b/gfx/skia/skia/src/gpu/mtl/GrMtlCaps.mm
---- a/gfx/skia/skia/src/gpu/mtl/GrMtlCaps.mm
-+++ b/gfx/skia/skia/src/gpu/mtl/GrMtlCaps.mm
-@@ -501,16 +501,17 @@ size_t GrMtlCaps::GetFormatIndex(MTLPixe
-     static_assert(SK_ARRAY_COUNT(kMtlFormats) == GrMtlCaps::kNumMtlFormats,
-                   "Size of kMtlFormats array must match static value in header");
-     for (size_t i = 0; i < GrMtlCaps::kNumMtlFormats; ++i) {
-         if (kMtlFormats[i] == pixelFormat) {
-             return i;
+Index: firefox-102.0/gfx/skia/skia/src/gpu/mtl/GrMtlCaps.mm
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/mtl/GrMtlCaps.mm
++++ firefox-102.0/gfx/skia/skia/src/gpu/mtl/GrMtlCaps.mm
+@@ -506,6 +506,7 @@ size_t GrMtlCaps::GetFormatIndex(MTLPixe
          }
      }
      SK_ABORT("Invalid MTLPixelFormat");
@@ -1254,17 +745,7 @@
  }
  
  void GrMtlCaps::initFormatTable() {
-     FormatInfo* info;
- 
-     // Format: R8Unorm
-     {
-         info = &fFormatTable[GetFormatIndex(MTLPixelFormatR8Unorm)];
-@@ -1006,16 +1007,17 @@ GrBackendFormat GrMtlCaps::getBackendFor
-         case SkImage::kETC1_CompressionType:
- #ifdef SK_BUILD_FOR_MAC
-             return {};
- #else
-             return GrBackendFormat::MakeMtl(MTLPixelFormatETC2_RGB8);
+@@ -1011,6 +1012,7 @@ GrBackendFormat GrMtlCaps::getBackendFor
  #endif
      }
      SK_ABORT("Invalid compression type");
@@ -1272,20 +753,11 @@
  }
  
  GrSwizzle GrMtlCaps::getTextureSwizzle(const GrBackendFormat& format, GrColorType colorType) const {
-     MTLPixelFormat mtlFormat = GrBackendFormatAsMTLPixelFormat(format);
-     SkASSERT(mtlFormat != MTLPixelFormatInvalid);
-     const auto& info = this->getFormatInfo(mtlFormat);
-     for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
-         const auto& ctInfo = info.fColorTypeInfos[i];
-diff --git a/gfx/skia/skia/src/gpu/mtl/GrMtlPipelineStateBuilder.mm b/gfx/skia/skia/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
---- a/gfx/skia/skia/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
-+++ b/gfx/skia/skia/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
-@@ -150,16 +150,17 @@ static inline MTLVertexFormat attribute_
-                 return MTLVertexFormatUShortNormalized;
-             } else {
-                 return MTLVertexFormatInvalid;
-             }
-         case kUShort4_norm_GrVertexAttribType:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
++++ firefox-102.0/gfx/skia/skia/src/gpu/mtl/GrMtlPipelineStateBuilder.mm
+@@ -155,6 +155,7 @@ static inline MTLVertexFormat attribute_
              return MTLVertexFormatUShort4Normalized;
      }
      SK_ABORT("Unknown vertex attribute type");
@@ -1293,17 +765,7 @@
  }
  
  static MTLVertexDescriptor* create_vertex_descriptor(const GrPrimitiveProcessor& primProc) {
-     uint32_t vertexBinding = 0, instanceBinding = 0;
- 
-     int nextBinding = GrMtlUniformHandler::kLastUniformBinding + 1;
-     if (primProc.hasVertexAttributes()) {
-         vertexBinding = nextBinding++;
-@@ -271,16 +272,17 @@ static MTLBlendFactor blend_coeff_to_mtl
-             } else {
-                 return MTLBlendFactorZero;
-             }
-         case kIllegal_GrBlendCoeff:
-             return MTLBlendFactorZero;
+@@ -276,6 +277,7 @@ static MTLBlendFactor blend_coeff_to_mtl
      }
  
      SK_ABORT("Unknown blend coefficient");
@@ -1311,20 +773,11 @@
  }
  
  static MTLBlendOperation blend_equation_to_mtl_blend_op(GrBlendEquation equation) {
-     static const MTLBlendOperation gTable[] = {
-         MTLBlendOperationAdd,              // kAdd_GrBlendEquation
-         MTLBlendOperationSubtract,         // kSubtract_GrBlendEquation
-         MTLBlendOperationReverseSubtract,  // kReverseSubtract_GrBlendEquation
-     };
-diff --git a/gfx/skia/skia/src/gpu/mtl/GrMtlSampler.mm b/gfx/skia/skia/src/gpu/mtl/GrMtlSampler.mm
---- a/gfx/skia/skia/src/gpu/mtl/GrMtlSampler.mm
-+++ b/gfx/skia/skia/src/gpu/mtl/GrMtlSampler.mm
-@@ -33,16 +33,17 @@ static inline MTLSamplerAddressMode wrap
-             } else
- #endif
-             {
-                 SkASSERT(false);
-                 return MTLSamplerAddressModeClampToEdge;
+Index: firefox-102.0/gfx/skia/skia/src/gpu/mtl/GrMtlSampler.mm
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/mtl/GrMtlSampler.mm
++++ firefox-102.0/gfx/skia/skia/src/gpu/mtl/GrMtlSampler.mm
+@@ -38,6 +38,7 @@ static inline MTLSamplerAddressMode wrap
              }
      }
      SK_ABORT("Unknown wrap mode.");
@@ -1332,20 +785,11 @@
  }
  
  GrMtlSampler* GrMtlSampler::Create(const GrMtlGpu* gpu, const GrSamplerState& samplerState) {
-     static MTLSamplerMinMagFilter mtlMinMagFilterModes[] = {
-         MTLSamplerMinMagFilterNearest,
-         MTLSamplerMinMagFilterLinear,
-         MTLSamplerMinMagFilterLinear
-     };
-diff --git a/gfx/skia/skia/src/gpu/mtl/GrMtlUniformHandler.mm b/gfx/skia/skia/src/gpu/mtl/GrMtlUniformHandler.mm
---- a/gfx/skia/skia/src/gpu/mtl/GrMtlUniformHandler.mm
-+++ b/gfx/skia/skia/src/gpu/mtl/GrMtlUniformHandler.mm
-@@ -85,16 +85,17 @@ static uint32_t grsltype_to_alignment_ma
-         case kTexture2DSampler_GrSLType:
-         case kTextureExternalSampler_GrSLType:
-         case kTexture2DRectSampler_GrSLType:
-         case kSampler_GrSLType:
-         case kTexture2D_GrSLType:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/mtl/GrMtlUniformHandler.mm
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/mtl/GrMtlUniformHandler.mm
++++ firefox-102.0/gfx/skia/skia/src/gpu/mtl/GrMtlUniformHandler.mm
+@@ -90,6 +90,7 @@ static uint32_t grsltype_to_alignment_ma
              break;
      }
      SK_ABORT("Unexpected type");
@@ -1353,17 +797,7 @@
  }
  
  /** Returns the size in bytes taken up in Metal buffers for GrSLTypes. */
- static inline uint32_t grsltype_to_mtl_size(GrSLType type) {
-     switch(type) {
-         case kByte_GrSLType:
-             return sizeof(int8_t);
-         case kByte2_GrSLType:
-@@ -167,16 +168,17 @@ static inline uint32_t grsltype_to_mtl_s
-         case kTexture2DSampler_GrSLType:
-         case kTextureExternalSampler_GrSLType:
-         case kTexture2DRectSampler_GrSLType:
-         case kSampler_GrSLType:
-         case kTexture2D_GrSLType:
+@@ -172,6 +173,7 @@ static inline uint32_t grsltype_to_mtl_s
              break;
      }
      SK_ABORT("Unexpected type");
@@ -1371,20 +805,11 @@
  }
  
  // Given the current offset into the ubo, calculate the offset for the uniform we're trying to add
- // taking into consideration all alignment requirements. The uniformOffset is set to the offset for
- // the new uniform, and currentOffset is updated to be the offset to the end of the new uniform.
- static void get_ubo_aligned_offset(uint32_t* uniformOffset,
-                                    uint32_t* currentOffset,
-                                    uint32_t* maxAlignment,
-diff --git a/gfx/skia/skia/src/gpu/mtl/GrMtlUtil.mm b/gfx/skia/skia/src/gpu/mtl/GrMtlUtil.mm
---- a/gfx/skia/skia/src/gpu/mtl/GrMtlUtil.mm
-+++ b/gfx/skia/skia/src/gpu/mtl/GrMtlUtil.mm
-@@ -107,16 +107,17 @@ bool GrPixelConfigToMTLFormat(GrPixelCon
-         case kRGBA_16161616_GrPixelConfig:
-             *format = MTLPixelFormatRGBA16Unorm;
-             return true;
-         case kRG_half_GrPixelConfig:
-             *format = MTLPixelFormatRG16Float;
+Index: firefox-102.0/gfx/skia/skia/src/gpu/mtl/GrMtlUtil.mm
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/mtl/GrMtlUtil.mm
++++ firefox-102.0/gfx/skia/skia/src/gpu/mtl/GrMtlUtil.mm
+@@ -112,6 +112,7 @@ bool GrPixelConfigToMTLFormat(GrPixelCon
              return true;
      }
      SK_ABORT("Unexpected config");
@@ -1392,20 +817,11 @@
  }
  
  MTLTextureDescriptor* GrGetMTLTextureDescriptor(id<MTLTexture> mtlTexture) {
-     MTLTextureDescriptor* texDesc = [[MTLTextureDescriptor alloc] init];
-     texDesc.textureType = mtlTexture.textureType;
-     texDesc.pixelFormat = mtlTexture.pixelFormat;
-     texDesc.width = mtlTexture.width;
-     texDesc.height = mtlTexture.height;
-diff --git a/gfx/skia/skia/src/gpu/ops/GrDrawVerticesOp.cpp b/gfx/skia/skia/src/gpu/ops/GrDrawVerticesOp.cpp
---- a/gfx/skia/skia/src/gpu/ops/GrDrawVerticesOp.cpp
-+++ b/gfx/skia/skia/src/gpu/ops/GrDrawVerticesOp.cpp
-@@ -605,16 +605,17 @@ static uint32_t seed_vertices(GrPrimitiv
-         case GrPrimitiveType::kLines:
-         case GrPrimitiveType::kLineStrip:
-             return 2;
-         case GrPrimitiveType::kPath:
-             SkASSERT(0);
+Index: firefox-102.0/gfx/skia/skia/src/gpu/ops/GrDrawVerticesOp.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/ops/GrDrawVerticesOp.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/ops/GrDrawVerticesOp.cpp
+@@ -610,6 +610,7 @@ static uint32_t seed_vertices(GrPrimitiv
              return 0;
      }
      SK_ABORT("Incomplete switch\n");
@@ -1413,17 +829,7 @@
  }
  
  static uint32_t primitive_vertices(GrPrimitiveType type) {
-     switch (type) {
-         case GrPrimitiveType::kTriangles:
-             return 3;
-         case GrPrimitiveType::kLines:
-             return 2;
-@@ -622,16 +623,17 @@ static uint32_t primitive_vertices(GrPri
-         case GrPrimitiveType::kPoints:
-         case GrPrimitiveType::kLineStrip:
-             return 1;
-         case GrPrimitiveType::kPath:
-             SkASSERT(0);
+@@ -627,6 +628,7 @@ static uint32_t primitive_vertices(GrPri
              return 0;
      }
      SK_ABORT("Incomplete switch\n");
@@ -1431,34 +837,21 @@
  }
  
  static SkPoint random_point(SkRandom* random, SkScalar min, SkScalar max) {
-     SkPoint p;
-     p.fX = random->nextRangeScalar(min, max);
-     p.fY = random->nextRangeScalar(min, max);
-     return p;
- }
-diff --git a/gfx/skia/skia/src/gpu/ops/GrFillRRectOp.cpp b/gfx/skia/skia/src/gpu/ops/GrFillRRectOp.cpp
---- a/gfx/skia/skia/src/gpu/ops/GrFillRRectOp.cpp
-+++ b/gfx/skia/skia/src/gpu/ops/GrFillRRectOp.cpp
-@@ -818,9 +818,10 @@ static bool can_use_hw_derivatives_with_
-                 if (!can_use_hw_derivatives_with_coverage(devScale, rrect.radii(corner))) {
-                     return false;
-                 }
-             }
-             return true;
+Index: firefox-102.0/gfx/skia/skia/src/gpu/ops/GrFillRRectOp.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/ops/GrFillRRectOp.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/ops/GrFillRRectOp.cpp
+@@ -823,4 +823,5 @@ static bool can_use_hw_derivatives_with_
          }
      }
      SK_ABORT("Invalid round rect type.");
 +    SkUNREACHABLE;
  }
-diff --git a/gfx/skia/skia/src/gpu/ops/GrOvalOpFactory.cpp b/gfx/skia/skia/src/gpu/ops/GrOvalOpFactory.cpp
---- a/gfx/skia/skia/src/gpu/ops/GrOvalOpFactory.cpp
-+++ b/gfx/skia/skia/src/gpu/ops/GrOvalOpFactory.cpp
-@@ -2278,39 +2278,42 @@ static int rrect_type_to_vert_count(RRec
-     switch (type) {
-         case kFill_RRectType:
-         case kStroke_RRectType:
-             return kVertsPerStandardRRect;
-         case kOverstroke_RRectType:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/ops/GrOvalOpFactory.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/ops/GrOvalOpFactory.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/ops/GrOvalOpFactory.cpp
+@@ -2283,6 +2283,7 @@ static int rrect_type_to_vert_count(RRec
              return kVertsPerOverstrokeRRect;
      }
      SK_ABORT("Invalid type");
@@ -1466,58 +859,7 @@
  }
  
  static int rrect_type_to_index_count(RRectType type) {
-     switch (type) {
-         case kFill_RRectType:
-             return kIndicesPerFillRRect;
-         case kStroke_RRectType:
-             return kIndicesPerStrokeRRect;
-         case kOverstroke_RRectType:
-             return kIndicesPerOverstrokeRRect;
-     }
-     SK_ABORT("Invalid type");
-+    SkUNREACHABLE;
- }
- 
- static const uint16_t* rrect_type_to_indices(RRectType type) {
-     switch (type) {
-         case kFill_RRectType:
-         case kStroke_RRectType:
-             return gStandardRRectIndices;
-         case kOverstroke_RRectType:
-             return gOverstrokeRRectIndices;
-     }
-     SK_ABORT("Invalid type");
-+    SkUNREACHABLE;
- }
- 
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- 
- // For distance computations in the interior of filled rrects we:
- //
- //   add a interior degenerate (point or line) rect
- //   each vertex of that rect gets -outerRad as its radius
-diff --git a/gfx/skia/skia/src/gpu/ops/GrShadowRRectOp.cpp b/gfx/skia/skia/src/gpu/ops/GrShadowRRectOp.cpp
---- a/gfx/skia/skia/src/gpu/ops/GrShadowRRectOp.cpp
-+++ b/gfx/skia/skia/src/gpu/ops/GrShadowRRectOp.cpp
-@@ -150,39 +150,42 @@ static int rrect_type_to_vert_count(RRec
-         case kFill_RRectType:
-             return kVertsPerFillRRect;
-         case kStroke_RRectType:
-             return kVertsPerStrokeRRect;
-         case kOverstroke_RRectType:
-             return kVertsPerOverstrokeRRect;
-     }
-     SK_ABORT("Invalid type");
-+    SkUNREACHABLE;
- }
- 
- static int rrect_type_to_index_count(RRectType type) {
-     switch (type) {
-         case kFill_RRectType:
-             return kIndicesPerFillRRect;
-         case kStroke_RRectType:
-             return kIndicesPerStrokeRRect;
-         case kOverstroke_RRectType:
+@@ -2295,6 +2296,7 @@ static int rrect_type_to_index_count(RRe
              return kIndicesPerOverstrokeRRect;
      }
      SK_ABORT("Invalid type");
@@ -1525,11 +867,35 @@
  }
  
  static const uint16_t* rrect_type_to_indices(RRectType type) {
-     switch (type) {
-         case kFill_RRectType:
-         case kStroke_RRectType:
-             return gRRectIndices + 6*4;
-         case kOverstroke_RRectType:
+@@ -2306,6 +2308,7 @@ static const uint16_t* rrect_type_to_ind
+             return gOverstrokeRRectIndices;
+     }
+     SK_ABORT("Invalid type");
++    SkUNREACHABLE;
+ }
+ 
+ ///////////////////////////////////////////////////////////////////////////////////////////////////
+Index: firefox-102.0/gfx/skia/skia/src/gpu/ops/GrShadowRRectOp.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/ops/GrShadowRRectOp.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/ops/GrShadowRRectOp.cpp
+@@ -155,6 +155,7 @@ static int rrect_type_to_vert_count(RRec
+             return kVertsPerOverstrokeRRect;
+     }
+     SK_ABORT("Invalid type");
++    SkUNREACHABLE;
+ }
+ 
+ static int rrect_type_to_index_count(RRectType type) {
+@@ -167,6 +168,7 @@ static int rrect_type_to_index_count(RRe
+             return kIndicesPerOverstrokeRRect;
+     }
+     SK_ABORT("Invalid type");
++    SkUNREACHABLE;
+ }
+ 
+ static const uint16_t* rrect_type_to_indices(RRectType type) {
+@@ -178,6 +180,7 @@ static const uint16_t* rrect_type_to_ind
              return gRRectIndices;
      }
      SK_ABORT("Invalid type");
@@ -1537,20 +903,11 @@
  }
  
  ///////////////////////////////////////////////////////////////////////////////
- namespace {
- 
- class ShadowCircularRRectOp final : public GrMeshDrawOp {
- public:
-     DEFINE_OP_CLASS_ID
-diff --git a/gfx/skia/skia/src/gpu/text/GrTextBlob.h b/gfx/skia/skia/src/gpu/text/GrTextBlob.h
---- a/gfx/skia/skia/src/gpu/text/GrTextBlob.h
-+++ b/gfx/skia/skia/src/gpu/text/GrTextBlob.h
-@@ -120,16 +120,17 @@ public:
-     }
- 
-     void operator delete(void* p) {
-         ::operator delete(p);
-     }
+Index: firefox-102.0/gfx/skia/skia/src/gpu/text/GrTextBlob.h
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/text/GrTextBlob.h
++++ firefox-102.0/gfx/skia/skia/src/gpu/text/GrTextBlob.h
+@@ -125,6 +125,7 @@ public:
  
      void* operator new(size_t) {
          SK_ABORT("All blobs are created by placement new.");
@@ -1558,34 +915,21 @@
      }
  
      void* operator new(size_t, void* p) { return p; }
- 
-     bool hasDistanceField() const { return SkToBool(fTextType & kHasDistanceField_TextType); }
-     bool hasBitmap() const { return SkToBool(fTextType & kHasBitmap_TextType); }
-     void setHasDistanceField() { fTextType |= kHasDistanceField_TextType; }
-     void setHasBitmap() { fTextType |= kHasBitmap_TextType; }
-diff --git a/gfx/skia/skia/src/gpu/text/GrTextBlobVertexRegenerator.cpp b/gfx/skia/skia/src/gpu/text/GrTextBlobVertexRegenerator.cpp
---- a/gfx/skia/skia/src/gpu/text/GrTextBlobVertexRegenerator.cpp
-+++ b/gfx/skia/skia/src/gpu/text/GrTextBlobVertexRegenerator.cpp
-@@ -279,9 +279,10 @@ bool GrTextBlob::VertexRegenerator::rege
-         // set use tokens for all of the glyphs in our subrun.  This is only valid if we
-         // have a valid atlas generation
-         fFullAtlasManager->setUseTokenBulk(*fSubRun->bulkUseToken(),
-                                            fUploadTarget->tokenTracker()->nextDrawToken(),
-                                            fSubRun->maskFormat());
+Index: firefox-102.0/gfx/skia/skia/src/gpu/text/GrTextBlobVertexRegenerator.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/text/GrTextBlobVertexRegenerator.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/text/GrTextBlobVertexRegenerator.cpp
+@@ -284,4 +284,5 @@ bool GrTextBlob::VertexRegenerator::rege
          return true;
      }
      SK_ABORT("Should not get here");
 +    SkUNREACHABLE;
  }
-diff --git a/gfx/skia/skia/src/gpu/vk/GrVkCaps.cpp b/gfx/skia/skia/src/gpu/vk/GrVkCaps.cpp
---- a/gfx/skia/skia/src/gpu/vk/GrVkCaps.cpp
-+++ b/gfx/skia/skia/src/gpu/vk/GrVkCaps.cpp
-@@ -103,16 +103,17 @@ static FormatCompatibilityClass format_c
-         case VK_FORMAT_R8G8B8_UNORM:
-             return FormatCompatibilityClass::k24_3_1;
- 
-         case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
-             return FormatCompatibilityClass::kETC2_RGB_8_16;
+Index: firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkCaps.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/vk/GrVkCaps.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkCaps.cpp
+@@ -108,6 +108,7 @@ static FormatCompatibilityClass format_c
  
          default:
              SK_ABORT("Unsupported VkFormat");
@@ -1593,17 +937,7 @@
      }
  }
  
- bool GrVkCaps::canCopyImage(VkFormat dstFormat, int dstSampleCnt, bool dstHasYcbcr,
-                             VkFormat srcFormat, int srcSampleCnt, bool srcHasYcbcr) const {
-     if ((dstSampleCnt > 1 || srcSampleCnt > 1) && dstSampleCnt != srcSampleCnt) {
-         return false;
-     }
-@@ -1651,16 +1652,17 @@ GrBackendFormat GrVkCaps::onGetDefaultBa
- 
- GrBackendFormat GrVkCaps::getBackendFormatFromCompressionType(
-         SkImage::CompressionType compressionType) const {
-     switch (compressionType) {
-         case SkImage::kETC1_CompressionType:
+@@ -1656,6 +1657,7 @@ GrBackendFormat GrVkCaps::getBackendForm
              return GrBackendFormat::MakeVk(VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK);
      }
      SK_ABORT("Invalid compression type");
@@ -1611,20 +945,11 @@
  }
  
  GrSwizzle GrVkCaps::getTextureSwizzle(const GrBackendFormat& format, GrColorType colorType) const {
-     VkFormat vkFormat;
-     SkAssertResult(format.asVkFormat(&vkFormat));
-     const auto& info = this->getFormatInfo(vkFormat);
-     for (int i = 0; i < info.fColorTypeInfoCount; ++i) {
-         const auto& ctInfo = info.fColorTypeInfos[i];
-diff --git a/gfx/skia/skia/src/gpu/vk/GrVkMemory.cpp b/gfx/skia/skia/src/gpu/vk/GrVkMemory.cpp
---- a/gfx/skia/skia/src/gpu/vk/GrVkMemory.cpp
-+++ b/gfx/skia/skia/src/gpu/vk/GrVkMemory.cpp
-@@ -23,16 +23,17 @@ static BufferUsage get_buffer_usage(GrVk
-         case GrVkBuffer::kUniform_Type:
-             SkASSERT(dynamic);
-             return BufferUsage::kCpuWritesGpuReads;
-         case GrVkBuffer::kCopyRead_Type: // fall through
-         case GrVkBuffer::kCopyWrite_Type:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkMemory.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/vk/GrVkMemory.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkMemory.cpp
+@@ -28,6 +28,7 @@ static BufferUsage get_buffer_usage(GrVk
              return BufferUsage::kCpuOnly;
      }
      SK_ABORT("Invalid GrVkBuffer::Type");
@@ -1632,20 +957,11 @@
  }
  
  bool GrVkMemory::AllocAndBindBufferMemory(const GrVkGpu* gpu,
-                                           VkBuffer buffer,
-                                           GrVkBuffer::Type type,
-                                           bool dynamic,
-                                           GrVkAlloc* alloc) {
-     GrVkMemoryAllocator* allocator = gpu->memoryAllocator();
-diff --git a/gfx/skia/skia/src/gpu/vk/GrVkPipeline.cpp b/gfx/skia/skia/src/gpu/vk/GrVkPipeline.cpp
---- a/gfx/skia/skia/src/gpu/vk/GrVkPipeline.cpp
-+++ b/gfx/skia/skia/src/gpu/vk/GrVkPipeline.cpp
-@@ -75,16 +75,17 @@ static inline VkFormat attrib_type_to_vk
-         case kUint_GrVertexAttribType:
-             return VK_FORMAT_R32_UINT;
-         case kUShort_norm_GrVertexAttribType:
-             return VK_FORMAT_R16_UNORM;
-         case kUShort4_norm_GrVertexAttribType:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkPipeline.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/vk/GrVkPipeline.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkPipeline.cpp
+@@ -80,6 +80,7 @@ static inline VkFormat attrib_type_to_vk
              return VK_FORMAT_R16G16B16A16_UNORM;
      }
      SK_ABORT("Unknown vertex attrib type");
@@ -1653,17 +969,7 @@
  }
  
  static void setup_vertex_input_state(const GrPrimitiveProcessor& primProc,
-                                   VkPipelineVertexInputStateCreateInfo* vertexInputInfo,
-                                   SkSTArray<2, VkVertexInputBindingDescription, true>* bindingDescs,
-                                   VkVertexInputAttributeDescription* attributeDesc) {
-     uint32_t vertexBinding = 0, instanceBinding = 0;
- 
-@@ -157,18 +158,20 @@ static VkPrimitiveTopology gr_primitive_
-         case GrPrimitiveType::kPoints:
-             return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
-         case GrPrimitiveType::kLines:
-             return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
-         case GrPrimitiveType::kLineStrip:
+@@ -162,8 +163,10 @@ static VkPrimitiveTopology gr_primitive_
              return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
          case GrPrimitiveType::kPath:
              SK_ABORT("Unsupported primitive type");
@@ -1674,20 +980,11 @@
  }
  
  static void setup_input_assembly_state(GrPrimitiveType primitiveType,
-                                        VkPipelineInputAssemblyStateCreateInfo* inputAssemblyInfo) {
-     memset(inputAssemblyInfo, 0, sizeof(VkPipelineInputAssemblyStateCreateInfo));
-     inputAssemblyInfo->sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
-     inputAssemblyInfo->pNext = nullptr;
-     inputAssemblyInfo->flags = 0;
-diff --git a/gfx/skia/skia/src/gpu/vk/GrVkSampler.cpp b/gfx/skia/skia/src/gpu/vk/GrVkSampler.cpp
---- a/gfx/skia/skia/src/gpu/vk/GrVkSampler.cpp
-+++ b/gfx/skia/skia/src/gpu/vk/GrVkSampler.cpp
-@@ -18,16 +18,17 @@ static inline VkSamplerAddressMode wrap_
-         case GrSamplerState::WrapMode::kRepeat:
-             return VK_SAMPLER_ADDRESS_MODE_REPEAT;
-         case GrSamplerState::WrapMode::kMirrorRepeat:
-             return VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;
-         case GrSamplerState::WrapMode::kClampToBorder:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkSampler.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/vk/GrVkSampler.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkSampler.cpp
+@@ -23,6 +23,7 @@ static inline VkSamplerAddressMode wrap_
              return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
      }
      SK_ABORT("Unknown wrap mode.");
@@ -1695,20 +992,11 @@
  }
  
  GrVkSampler* GrVkSampler::Create(GrVkGpu* gpu, const GrSamplerState& samplerState,
-                                  const GrVkYcbcrConversionInfo& ycbcrInfo) {
-     static VkFilter vkMinFilterModes[] = {
-         VK_FILTER_NEAREST,
-         VK_FILTER_LINEAR,
-         VK_FILTER_LINEAR
-diff --git a/gfx/skia/skia/src/gpu/vk/GrVkTransferBuffer.h b/gfx/skia/skia/src/gpu/vk/GrVkTransferBuffer.h
---- a/gfx/skia/skia/src/gpu/vk/GrVkTransferBuffer.h
-+++ b/gfx/skia/skia/src/gpu/vk/GrVkTransferBuffer.h
-@@ -29,16 +29,17 @@ private:
-                           const SkString& dumpName) const override;
- 
-     void onMap() override { this->GrGpuBuffer::fMapPtr = this->vkMap(this->getVkGpu()); }
- 
-     void onUnmap() override { this->vkUnmap(this->getVkGpu()); }
+Index: firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkTransferBuffer.h
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/vk/GrVkTransferBuffer.h
++++ firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkTransferBuffer.h
+@@ -34,6 +34,7 @@ private:
  
      bool onUpdateData(const void* src, size_t srcSizeInBytes) override {
          SK_ABORT("Not implemented for transfer buffers.");
@@ -1716,20 +1004,11 @@
      }
  
      GrVkGpu* getVkGpu() const {
-         SkASSERT(!this->wasDestroyed());
-         return reinterpret_cast<GrVkGpu*>(this->getGpu());
-     }
- 
-     typedef GrGpuBuffer INHERITED;
-diff --git a/gfx/skia/skia/src/gpu/vk/GrVkUniformHandler.cpp b/gfx/skia/skia/src/gpu/vk/GrVkUniformHandler.cpp
---- a/gfx/skia/skia/src/gpu/vk/GrVkUniformHandler.cpp
-+++ b/gfx/skia/skia/src/gpu/vk/GrVkUniformHandler.cpp
-@@ -84,16 +84,17 @@ static uint32_t grsltype_to_alignment_ma
-         case kTexture2DSampler_GrSLType:
-         case kTextureExternalSampler_GrSLType:
-         case kTexture2DRectSampler_GrSLType:
-         case kSampler_GrSLType:
-         case kTexture2D_GrSLType:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkUniformHandler.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/vk/GrVkUniformHandler.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkUniformHandler.cpp
+@@ -89,6 +89,7 @@ static uint32_t grsltype_to_alignment_ma
              break;
      }
      SK_ABORT("Unexpected type");
@@ -1737,17 +1016,7 @@
  }
  
  /** Returns the size in bytes taken up in vulkanbuffers for GrSLTypes. */
- static inline uint32_t grsltype_to_vk_size(GrSLType type) {
-     switch(type) {
-         case kByte_GrSLType:
-             return sizeof(int8_t);
-         case kByte2_GrSLType:
-@@ -167,16 +168,17 @@ static inline uint32_t grsltype_to_vk_si
-         case kTexture2DSampler_GrSLType:
-         case kTextureExternalSampler_GrSLType:
-         case kTexture2DRectSampler_GrSLType:
-         case kSampler_GrSLType:
-         case kTexture2D_GrSLType:
+@@ -172,6 +173,7 @@ static inline uint32_t grsltype_to_vk_si
              break;
      }
      SK_ABORT("Unexpected type");
@@ -1755,20 +1024,11 @@
  }
  
  
- // Given the current offset into the ubo, calculate the offset for the uniform we're trying to add
- // taking into consideration all alignment requirements. The uniformOffset is set to the offset for
- // the new uniform, and currentOffset is updated to be the offset to the end of the new uniform.
- static void get_ubo_aligned_offset(uint32_t* uniformOffset,
-                                    uint32_t* currentOffset,
-diff --git a/gfx/skia/skia/src/gpu/vk/GrVkVaryingHandler.cpp b/gfx/skia/skia/src/gpu/vk/GrVkVaryingHandler.cpp
---- a/gfx/skia/skia/src/gpu/vk/GrVkVaryingHandler.cpp
-+++ b/gfx/skia/skia/src/gpu/vk/GrVkVaryingHandler.cpp
-@@ -69,16 +69,17 @@ static inline int grsltype_to_location_s
-         case kByte_GrSLType:
-              return 1;
-         case kUint_GrSLType: // fall through
-         case kUShort_GrSLType:
-         case kUByte_GrSLType:
+Index: firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkVaryingHandler.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/gpu/vk/GrVkVaryingHandler.cpp
++++ firefox-102.0/gfx/skia/skia/src/gpu/vk/GrVkVaryingHandler.cpp
+@@ -74,6 +74,7 @@ static inline int grsltype_to_location_s
               return 1;
      }
      SK_ABORT("Unexpected type");
@@ -1776,20 +1036,11 @@
  }
  
  static void finalize_helper(GrVkVaryingHandler::VarArray& vars) {
-     int locationIndex = 0;
-     for (int i = 0; i < vars.count(); ++i) {
-         GrShaderVar& var = vars[i];
-         SkString location;
-         location.appendf("location = %d", locationIndex);
-diff --git a/gfx/skia/skia/src/pdf/SkPDFTag.cpp b/gfx/skia/skia/src/pdf/SkPDFTag.cpp
---- a/gfx/skia/skia/src/pdf/SkPDFTag.cpp
-+++ b/gfx/skia/skia/src/pdf/SkPDFTag.cpp
-@@ -59,16 +59,17 @@ static const char* tag_name_from_type(Sk
-         M(WT);
-         M(WP);
-         M(Figure);
-         M(Formula);
-         M(Form);
+Index: firefox-102.0/gfx/skia/skia/src/pdf/SkPDFTag.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/pdf/SkPDFTag.cpp
++++ firefox-102.0/gfx/skia/skia/src/pdf/SkPDFTag.cpp
+@@ -64,6 +64,7 @@ static const char* tag_name_from_type(Sk
          #undef M
      }
      SK_ABORT("bad tag");
@@ -1797,20 +1048,11 @@
  }
  
  struct SkPDFTagNode {
-     SkPDFTagNode* fChildren = nullptr;
-     size_t fChildCount = 0;
-     struct MarkedContentInfo {
-         unsigned fPageIndex;
-         int fMarkId;
-diff --git a/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp b/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp
---- a/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp
-+++ b/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp
-@@ -168,28 +168,32 @@ public:
-     SkFontMgr_FCI(sk_sp<SkFontConfigInterface> fci)
-         : fFCI(std::move(fci))
-         , fCache(kMaxSize)
-     {}
- 
+Index: firefox-102.0/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp
++++ firefox-102.0/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp
+@@ -173,18 +173,22 @@ public:
  protected:
      int onCountFamilies() const override {
          SK_ABORT("Not implemented.");
@@ -1833,17 +1075,7 @@
      }
  
      SkTypeface* onMatchFamilyStyle(const char requestedFamilyName[],
-                                    const SkFontStyle& requestedStyle) const override
-     {
-         SkAutoMutexExclusive ama(fMutex);
- 
-         SkFontConfigInterface::FontIdentity identity;
-@@ -210,20 +214,22 @@ protected:
-         }
-         return face.release();
-     }
- 
-     SkTypeface* onMatchFamilyStyleCharacter(const char familyName[], const SkFontStyle&,
+@@ -215,10 +219,12 @@ protected:
                                              const char* bcp47[], int bcp47Count,
                                              SkUnichar character) const override {
          SK_ABORT("Not implemented.");
@@ -1856,20 +1088,11 @@
      }
  
      sk_sp<SkTypeface> onMakeFromData(sk_sp<SkData> data, int ttcIndex) const override {
-         return this->onMakeFromStreamIndex(SkMemoryStream::Make(std::move(data)), ttcIndex);
-     }
- 
-     sk_sp<SkTypeface> onMakeFromStreamIndex(std::unique_ptr<SkStreamAsset> stream,
-                                             int ttcIndex) const override {
-diff --git a/gfx/skia/skia/src/shaders/SkImageShader.cpp b/gfx/skia/skia/src/shaders/SkImageShader.cpp
---- a/gfx/skia/skia/src/shaders/SkImageShader.cpp
-+++ b/gfx/skia/skia/src/shaders/SkImageShader.cpp
-@@ -178,16 +178,17 @@ static GrSamplerState::WrapMode tile_mod
-         case SkTileMode::kRepeat:
-             return GrSamplerState::WrapMode::kRepeat;
-         case SkTileMode::kMirror:
-             return GrSamplerState::WrapMode::kMirrorRepeat;
-         case SkTileMode::kDecal:
+Index: firefox-102.0/gfx/skia/skia/src/shaders/SkImageShader.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/shaders/SkImageShader.cpp
++++ firefox-102.0/gfx/skia/skia/src/shaders/SkImageShader.cpp
+@@ -183,6 +183,7 @@ static GrSamplerState::WrapMode tile_mod
              return GrSamplerState::WrapMode::kClampToBorder;
      }
      SK_ABORT("Unknown tile mode.");
@@ -1877,20 +1100,11 @@
  }
  
  std::unique_ptr<GrFragmentProcessor> SkImageShader::asFragmentProcessor(
-         const GrFPArgs& args) const {
-     const auto lm = this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix);
-     SkMatrix lmInverse;
-     if (!lm->invert(&lmInverse)) {
-         return nullptr;
-diff --git a/gfx/skia/skia/src/utils/SkShadowUtils.cpp b/gfx/skia/skia/src/utils/SkShadowUtils.cpp
---- a/gfx/skia/skia/src/utils/SkShadowUtils.cpp
-+++ b/gfx/skia/skia/src/utils/SkShadowUtils.cpp
-@@ -144,16 +144,17 @@ struct SpotVerticesFactory {
-                 // if the offsets don't match.
-                 if (fOffset == that.fOffset) {
-                     translate->set(0, 0);
-                     return true;
-                 }
+Index: firefox-102.0/gfx/skia/skia/src/utils/SkShadowUtils.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/skia/skia/src/utils/SkShadowUtils.cpp
++++ firefox-102.0/gfx/skia/skia/src/utils/SkShadowUtils.cpp
+@@ -149,6 +149,7 @@ struct SpotVerticesFactory {
                  return false;
          }
          SK_ABORT("Uninitialized occluder type?");
@@ -1898,20 +1112,328 @@
      }
  
      sk_sp<SkVertices> makeVertices(const SkPath& path, const SkMatrix& ctm,
-                                    SkVector* translate) const {
-         bool transparent = OccluderType::kTransparent == fOccluderType;
-         SkPoint3 zParams = SkPoint3::Make(0, 0, fOccluderHeight);
-         if (ctm.hasPerspective() || OccluderType::kOpaquePartialUmbra == fOccluderType) {
-             translate->set(0, 0);
-diff --git a/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp b/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp
---- a/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp
-+++ b/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp
-@@ -2646,16 +2646,17 @@ get_type_name_for_precision_qualifier(co
-          unreachable("Unsupported sampler/image type");
-       } /* sampler/image type */
-       break;
-    } /* GLSL_TYPE_SAMPLER/GLSL_TYPE_IMAGE */
-    break;
+Index: firefox-102.0/intl/icu/source/i18n/number_rounding.cpp
+===================================================================
+--- firefox-102.0.orig/intl/icu/source/i18n/number_rounding.cpp
++++ firefox-102.0/intl/icu/source/i18n/number_rounding.cpp
+@@ -283,6 +283,7 @@ FractionPrecision Precision::constructFr
+     settings.fMaxFrac = static_cast<digits_t>(maxFrac);
+     settings.fMinSig = -1;
+     settings.fMaxSig = -1;
++    settings.fPriority = UNUM_ROUNDING_PRIORITY_RELAXED;
+     PrecisionUnion union_;
+     union_.fracSig = settings;
+     return {RND_FRACTION, union_};
+@@ -294,6 +295,7 @@ Precision Precision::constructSignifican
+     settings.fMaxFrac = -1;
+     settings.fMinSig = static_cast<digits_t>(minSig);
+     settings.fMaxSig = static_cast<digits_t>(maxSig);
++    settings.fPriority = UNUM_ROUNDING_PRIORITY_RELAXED;
+     PrecisionUnion union_;
+     union_.fracSig = settings;
+     return {RND_SIGNIFICANT, union_};
+Index: firefox-102.0/third_party/libwebrtc/api/adaptation/resource.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/api/adaptation/resource.cc
++++ firefox-102.0/third_party/libwebrtc/api/adaptation/resource.cc
+@@ -9,6 +9,7 @@
+  */
+ 
+ #include "api/adaptation/resource.h"
++#include "rtc_base/checks.h"
+ 
+ namespace webrtc {
+ 
+@@ -18,6 +19,9 @@ const char* ResourceUsageStateToString(R
+       return "kOveruse";
+     case ResourceUsageState::kUnderuse:
+       return "kUnderuse";
++    default:
++      RTC_NOTREACHED();
++      return "";
+   }
+ }
+ 
+Index: firefox-102.0/third_party/libwebrtc/api/rtp_parameters.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/api/rtp_parameters.cc
++++ firefox-102.0/third_party/libwebrtc/api/rtp_parameters.cc
+@@ -29,6 +29,9 @@ const char* DegradationPreferenceToStrin
+       return "maintain-resolution";
+     case DegradationPreference::BALANCED:
+       return "balanced";
++    default:
++      RTC_NOTREACHED();
++      return "";
+   }
+ }
+ 
+Index: firefox-102.0/third_party/libwebrtc/api/video_codecs/video_codec.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/api/video_codecs/video_codec.cc
++++ firefox-102.0/third_party/libwebrtc/api/video_codecs/video_codec.cc
+@@ -119,6 +119,9 @@ const char* CodecTypeToPayloadString(Vid
+       return kPayloadNameMultiplex;
+     case kVideoCodecGeneric:
+       return kPayloadNameGeneric;
++    default:
++      RTC_NOTREACHED();
++      return "";
+   }
+ }
+ 
+Index: firefox-102.0/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc
++++ firefox-102.0/third_party/libwebrtc/api/video_codecs/video_encoder_software_fallback_wrapper.cc
+@@ -161,6 +161,9 @@ class VideoEncoderSoftwareFallbackWrappe
+       case EncoderState::kFallbackDueToFailure:
+       case EncoderState::kForcedFallback:
+         return fallback_encoder_.get();
++    default:
++      RTC_NOTREACHED();
++      return nullptr;
+     }
+   }
+ 
+@@ -339,6 +342,9 @@ int32_t VideoEncoderSoftwareFallbackWrap
+     case EncoderState::kFallbackDueToFailure:
+     case EncoderState::kForcedFallback:
+       return fallback_encoder_->Encode(frame, frame_types);
++    default:
++      RTC_NOTREACHED();
++      return WEBRTC_VIDEO_CODEC_ERROR;
+   }
+ }
+ int32_t VideoEncoderSoftwareFallbackWrapper::EncodeWithMainEncoder(
+Index: firefox-102.0/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc
++++ firefox-102.0/third_party/libwebrtc/call/adaptation/video_stream_adapter.cc
+@@ -161,6 +161,9 @@ const char* Adaptation::StatusToString(A
+       return "kAdaptationDisabled";
+     case Status::kRejectedByConstraint:
+       return "kRejectedByConstraint";
++    default:
++      RTC_NOTREACHED();
++      return "";
+   }
+ }
+ 
+@@ -380,6 +383,9 @@ VideoStreamAdapter::RestrictionsOrState
+     }
+     case DegradationPreference::DISABLED:
+       return Adaptation::Status::kAdaptationDisabled;
++    default:
++      RTC_NOTREACHED();
++      return Adaptation::Status::kAdaptationDisabled;
+   }
+ }
+ 
+@@ -459,6 +465,9 @@ VideoStreamAdapter::GetAdaptationDownSte
+     }
+     case DegradationPreference::DISABLED:
+       return Adaptation::Status::kAdaptationDisabled;
++    default:
++      RTC_NOTREACHED();
++      return Adaptation::Status::kAdaptationDisabled;
+   }
+ }
+ 
+@@ -599,6 +608,8 @@ Adaptation VideoStreamAdapter::GetAdaptD
+     }
+     default:
+       RTC_NOTREACHED();
++      return RestrictionsOrStateToAdaptation(
++          Adaptation::Status::kAdaptationDisabled, input_state);
+   }
+ }
+ 
+Index: firefox-102.0/third_party/libwebrtc/call/simulated_network.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/call/simulated_network.cc
++++ firefox-102.0/third_party/libwebrtc/call/simulated_network.cc
+@@ -77,6 +77,8 @@ bool CoDelSimulation::DropDequeuedPacket
+       }
+       return false;
+   }
++  RTC_NOTREACHED();
++  return false;
+ }
+ 
+ SimulatedNetwork::SimulatedNetwork(Config config, uint64_t random_seed)
+Index: firefox-102.0/third_party/libwebrtc/call/video_send_stream.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/call/video_send_stream.cc
++++ firefox-102.0/third_party/libwebrtc/call/video_send_stream.cc
+@@ -27,6 +27,9 @@ const char* StreamTypeToString(VideoSend
+       return "rtx";
+     case VideoSendStream::StreamStats::StreamType::kFlexfec:
+       return "flexfec";
++    default:
++        RTC_NOTREACHED();
++        return "";
+   }
+ }
+ 
+Index: firefox-102.0/third_party/libwebrtc/modules/audio_coding/neteq/decision_logic.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/modules/audio_coding/neteq/decision_logic.cc
++++ firefox-102.0/third_party/libwebrtc/modules/audio_coding/neteq/decision_logic.cc
+@@ -352,7 +352,7 @@ NetEq::Operation DecisionLogic::FuturePa
+       prev_mode == NetEq::Mode::kCodecInternalCng) {
+     size_t cur_size_samples =
+         estimate_dtx_delay_
+-            ? cur_size_samples = span_samples_in_packet_buffer
++            ? span_samples_in_packet_buffer
+             : num_packets_in_packet_buffer * decoder_frame_length;
+     // Target level is in number of packets in Q8.
+     const size_t target_level_samples =
+Index: firefox-102.0/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc
++++ firefox-102.0/third_party/libwebrtc/modules/audio_processing/audio_processing_impl.cc
+@@ -113,6 +113,9 @@ GainControl::Mode Agc1ConfigModeToInterf
+       return GainControl::kAdaptiveDigital;
+     case Agc1Config::kFixedDigital:
+       return GainControl::kFixedDigital;
++    default:
++      RTC_NOTREACHED();
++      return GainControl::kAdaptiveAnalog;
+   }
+ }
+ 
+@@ -1852,6 +1855,7 @@ void AudioProcessingImpl::InitializeNois
+               return NsConfig::SuppressionLevel::k21dB;
+             default:
+               RTC_NOTREACHED();
++              return NsConfig::SuppressionLevel::k6dB;
+           }
+         };
+ 
+Index: firefox-102.0/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc
++++ firefox-102.0/third_party/libwebrtc/modules/audio_processing/include/audio_processing.cc
+@@ -27,6 +27,9 @@ std::string NoiseSuppressionLevelToStrin
+       return "High";
+     case AudioProcessing::Config::NoiseSuppression::Level::kVeryHigh:
+       return "VeryHigh";
++    default:
++      RTC_NOTREACHED();
++      return "";
+   }
+ }
+ 
+@@ -39,6 +42,9 @@ std::string GainController1ModeToString(
+       return "AdaptiveDigital";
+     case AudioProcessing::Config::GainController1::Mode::kFixedDigital:
+       return "FixedDigital";
++    default:
++      RTC_NOTREACHED();
++      return "";
+   }
+ }
+ 
+@@ -49,6 +55,9 @@ std::string GainController2LevelEstimato
+       return "Rms";
+     case AudioProcessing::Config::GainController2::LevelEstimator::kPeak:
+       return "Peak";
++    default:
++      RTC_NOTREACHED();
++      return "";
+   }
+ }
+ 
+Index: firefox-102.0/third_party/libwebrtc/modules/pacing/pacing_controller.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/modules/pacing/pacing_controller.cc
++++ firefox-102.0/third_party/libwebrtc/modules/pacing/pacing_controller.cc
+@@ -83,6 +83,9 @@ int GetPriorityForType(RtpPacketMediaTyp
+       // Packets that are in themselves likely useless, only sent to keep the
+       // BWE high.
+       return kFirstPriority + 4;
++    default:
++      RTC_NOTREACHED();
++      return -1;
+   }
+ }
+ 
+Index: firefox-102.0/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc
++++ firefox-102.0/third_party/libwebrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc
+@@ -36,6 +36,9 @@ std::unique_ptr<VideoRtpDepacketizer> Cr
+     case kVideoCodecGeneric:
+     case kVideoCodecMultiplex:
+       return std::make_unique<VideoRtpDepacketizerGeneric>();
++    default:
++      RTC_NOTREACHED();
++      return nullptr;
+   }
+ }
+ 
+Index: firefox-102.0/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc
++++ firefox-102.0/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.cc
+@@ -130,6 +130,9 @@ bool IsNonVolatile(RTPExtensionType type
+       // TODO: Mozilla implement for CsrcAudioLevel
+       RTC_CHECK(false);
+       return false;
++    default:
++      RTC_NOTREACHED();
++      return false;
+   }
+ }
+ 
+Index: firefox-102.0/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
++++ firefox-102.0/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_audio.cc
+@@ -45,6 +45,9 @@ const char* FrameTypeToString(AudioFrame
+       return "audio_speech";
+     case AudioFrameType::kAudioFrameCN:
+       return "audio_cn";
++    default:
++      RTC_NOTREACHED();
++      return "";
+   }
+ }
+ #endif
+Index: firefox-102.0/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc
++++ firefox-102.0/third_party/libwebrtc/modules/video_coding/codecs/vp8/temporal_layers_checker.cc
+@@ -28,6 +28,9 @@ TemporalLayersChecker::CreateTemporalLay
+     case Vp8TemporalLayersType::kBitrateDynamic:
+       // Conference mode temporal layering for screen content in base stream.
+       return std::make_unique<TemporalLayersChecker>(num_temporal_layers);
++    default:
++      RTC_NOTREACHED();
++      return nullptr;
+   }
+ }
+ 
+Index: firefox-102.0/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc
+===================================================================
+--- firefox-102.0.orig/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc
++++ firefox-102.0/third_party/libwebrtc/video/adaptation/video_stream_encoder_resource_manager.cc
+@@ -54,6 +54,9 @@ std::string ToString(VideoAdaptationReas
+       return "quality";
+     case VideoAdaptationReason::kCpu:
+       return "cpu";
++    default:
++      RTC_NOTREACHED();
++      return "";
+   }
+ }
+ 
+Index: firefox-102.0/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp
+===================================================================
+--- firefox-102.0.orig/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp
++++ firefox-102.0/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ast_to_hir.cpp
+@@ -2651,6 +2651,7 @@ get_type_name_for_precision_qualifier(co
     default:
        unreachable("Unsupported type");
     } /* base type */
@@ -1919,20 +1441,11 @@
  }
  
  static unsigned
- select_gles_precision(unsigned qual_precision,
-                       const glsl_type *type,
-                       struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
- {
-    /* Precision qualifiers do not have any meaning in Desktop GLSL.
-diff --git a/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ir.cpp b/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ir.cpp
---- a/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ir.cpp
-+++ b/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ir.cpp
-@@ -619,16 +619,17 @@ ir_expression::get_num_operands(ir_expre
- 
-    if (op <= ir_last_triop)
-       return 3;
- 
-    if (op <= ir_last_quadop)
+Index: firefox-102.0/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ir.cpp
+===================================================================
+--- firefox-102.0.orig/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ir.cpp
++++ firefox-102.0/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ir.cpp
+@@ -624,6 +624,7 @@ ir_expression::get_num_operands(ir_expre
        return 4;
  
     unreachable("Could not calculate number of operands");
@@ -1940,20 +1453,11 @@
  }
  
  #include "ir_expression_operation_strings.h"
- 
- const char*
- depth_layout_string(ir_depth_layout layout)
- {
-    switch(layout) {
-diff --git a/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/loop_analysis.cpp b/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/loop_analysis.cpp
---- a/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/loop_analysis.cpp
-+++ b/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/loop_analysis.cpp
-@@ -234,16 +234,17 @@ incremented_before_terminator(ir_loop *l
-       }
- 
-       default:
-          break;
-       }
+Index: firefox-102.0/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/loop_analysis.cpp
+===================================================================
+--- firefox-102.0.orig/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/loop_analysis.cpp
++++ firefox-102.0/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/loop_analysis.cpp
+@@ -239,6 +239,7 @@ incremented_before_terminator(ir_loop *l
     }
  
     unreachable("Unable to find induction variable");
@@ -1961,20 +1465,11 @@
  }
  
  /**
-  * Record the fact that the given loop variable was referenced inside the loop.
-  *
-  * \arg in_assignee is true if the reference was on the LHS of an assignment.
-  *
-  * \arg in_conditional_code_or_nested_loop is true if the reference occurred
-diff --git a/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp b/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp
---- a/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp
-+++ b/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp
-@@ -224,16 +224,17 @@ write_mask_to_swizzle(unsigned write_mas
- {
-    switch (write_mask) {
-    case WRITEMASK_X: return SWIZZLE_X;
-    case WRITEMASK_Y: return SWIZZLE_Y;
-    case WRITEMASK_Z: return SWIZZLE_Z;
+Index: firefox-102.0/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp
+===================================================================
+--- firefox-102.0.orig/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp
++++ firefox-102.0/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/opt_vectorize.cpp
+@@ -229,6 +229,7 @@ write_mask_to_swizzle(unsigned write_mas
     case WRITEMASK_W: return SWIZZLE_W;
     }
     unreachable("not reached");
@@ -1982,20 +1477,11 @@
  }
  
  /**
-  * Returns whether a single-channeled write mask matches a swizzle.
-  */
- static bool
- write_mask_matches_swizzle(unsigned write_mask,
-                            const ir_swizzle *swz)
-diff --git a/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl_types.cpp b/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl_types.cpp
---- a/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl_types.cpp
-+++ b/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl_types.cpp
-@@ -455,16 +455,17 @@ const glsl_type *glsl_type::get_bare_typ
-    case GLSL_TYPE_VOID:
-    case GLSL_TYPE_SUBROUTINE:
-    case GLSL_TYPE_FUNCTION:
-    case GLSL_TYPE_ERROR:
-       return this;
+Index: firefox-102.0/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl_types.cpp
+===================================================================
+--- firefox-102.0.orig/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl_types.cpp
++++ firefox-102.0/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl_types.cpp
+@@ -460,6 +460,7 @@ const glsl_type *glsl_type::get_bare_typ
     }
  
     unreachable("Invalid base type");
@@ -2003,17 +1489,7 @@
  }
  
  const glsl_type *glsl_type::get_float16_type() const
- {
-    assert(this->base_type == GLSL_TYPE_FLOAT);
- 
-    return get_instance(GLSL_TYPE_FLOAT16,
-                        this->vector_elements,
-@@ -2011,16 +2012,17 @@ glsl_type::get_explicit_std140_type(bool
-                                        (enum glsl_interface_packing)this->interface_packing,
-                                        this->interface_row_major,
-                                        this->name);
- 
-       delete[] fields;
+@@ -2016,6 +2017,7 @@ glsl_type::get_explicit_std140_type(bool
        return type;
     } else {
        unreachable("Invalid type for UBO or SSBO");
@@ -2021,17 +1497,7 @@
     }
  }
  
- unsigned
- glsl_type::std430_base_alignment(bool row_major) const
- {
- 
-    unsigned N = is_64bit() ? 8 : 4;
-@@ -2369,16 +2371,17 @@ glsl_type::get_explicit_std430_type(bool
-                                        (enum glsl_interface_packing)this->interface_packing,
-                                        this->interface_row_major,
-                                        this->name);
- 
-       delete[] fields;
+@@ -2374,6 +2376,7 @@ glsl_type::get_explicit_std430_type(bool
        return type;
     } else {
        unreachable("Invalid type for SSBO");
@@ -2039,17 +1505,7 @@
     }
  }
  
- const glsl_type *
- glsl_type::get_explicit_interface_type(bool supports_std430) const
- {
-    enum glsl_interface_packing packing =
-       this->get_internal_ifc_packing(supports_std430);
-@@ -2443,16 +2446,17 @@ glsl_type::get_explicit_type_for_size_al
-       unsigned stride = align(col_size, col_align);
- 
-       *size = this->matrix_columns * stride;
-       *alignment = col_align;
-       return glsl_type::get_instance(this->base_type, this->vector_elements,
+@@ -2448,6 +2451,7 @@ glsl_type::get_explicit_type_for_size_al
                                       this->matrix_columns, stride, false);
     } else {
        unreachable("Unhandled type.");
@@ -2057,17 +1513,7 @@
     }
  }
  
- unsigned
- glsl_type::count_vec4_slots(bool is_gl_vertex_input, bool is_bindless) const
- {
-    /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec:
-     *
-@@ -2943,12 +2947,13 @@ glsl_get_sampler_dim_coordinate_componen
-    case GLSL_SAMPLER_DIM_SUBPASS:
-    case GLSL_SAMPLER_DIM_SUBPASS_MS:
-       return 2;
-    case GLSL_SAMPLER_DIM_3D:
-    case GLSL_SAMPLER_DIM_CUBE:
+@@ -2948,6 +2952,7 @@ glsl_get_sampler_dim_coordinate_componen
        return 3;
     default:
        unreachable("Unknown sampler dim");
@@ -2075,16 +1521,11 @@
     }
  }
  
- }
-diff --git a/third_party/rust/glslopt/glsl-optimizer/src/mesa/main/shaderobj.h b/third_party/rust/glslopt/glsl-optimizer/src/mesa/main/shaderobj.h
---- a/third_party/rust/glslopt/glsl-optimizer/src/mesa/main/shaderobj.h
-+++ b/third_party/rust/glslopt/glsl-optimizer/src/mesa/main/shaderobj.h
-@@ -180,16 +180,17 @@ static inline gl_shader_stage
-    case GL_COMPUTE_SUBROUTINE_UNIFORM:
-       return MESA_SHADER_COMPUTE;
-    case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
-       return MESA_SHADER_TESS_CTRL;
-    case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
+Index: firefox-102.0/third_party/rust/glslopt/glsl-optimizer/src/mesa/main/shaderobj.h
+===================================================================
+--- firefox-102.0.orig/third_party/rust/glslopt/glsl-optimizer/src/mesa/main/shaderobj.h
++++ firefox-102.0/third_party/rust/glslopt/glsl-optimizer/src/mesa/main/shaderobj.h
+@@ -185,6 +185,7 @@ _mesa_shader_stage_from_subroutine_unifo
        return MESA_SHADER_TESS_EVAL;
     }
     unreachable("not reached");
@@ -2092,17 +1533,7 @@
  }
  
  static inline gl_shader_stage
- _mesa_shader_stage_from_subroutine(GLenum subroutine)
- {
-    switch (subroutine) {
-    case GL_VERTEX_SUBROUTINE:
-       return MESA_SHADER_VERTEX;
-@@ -200,16 +201,17 @@ static inline gl_shader_stage
-    case GL_COMPUTE_SUBROUTINE:
-       return MESA_SHADER_COMPUTE;
-    case GL_TESS_CONTROL_SUBROUTINE:
-       return MESA_SHADER_TESS_CTRL;
-    case GL_TESS_EVALUATION_SUBROUTINE:
+@@ -205,6 +206,7 @@ _mesa_shader_stage_from_subroutine(GLenu
        return MESA_SHADER_TESS_EVAL;
     }
     unreachable("not reached");
@@ -2110,17 +1541,7 @@
  }
  
  static inline GLenum
- _mesa_shader_stage_to_subroutine(gl_shader_stage stage)
- {
-    switch (stage) {
-    case MESA_SHADER_VERTEX:
-       return GL_VERTEX_SUBROUTINE;
-@@ -225,16 +227,17 @@ static inline GLenum
-       return GL_TESS_EVALUATION_SUBROUTINE;
-    case MESA_SHADER_NONE:
-       break;
-    case MESA_SHADER_KERNEL:
-       unreachable("not reached");
+@@ -230,6 +232,7 @@ _mesa_shader_stage_to_subroutine(gl_shad
        break;
     }
     unreachable("not reached");
@@ -2128,17 +1549,7 @@
  }
  
  static inline GLenum
- _mesa_shader_stage_to_subroutine_uniform(gl_shader_stage stage)
- {
-    switch (stage) {
-    case MESA_SHADER_VERTEX:
-       return GL_VERTEX_SUBROUTINE_UNIFORM;
-@@ -248,16 +251,17 @@ static inline GLenum
-       return GL_TESS_CONTROL_SUBROUTINE_UNIFORM;
-    case MESA_SHADER_TESS_EVAL:
-       return GL_TESS_EVALUATION_SUBROUTINE_UNIFORM;
-    case MESA_SHADER_NONE:
-    case MESA_SHADER_KERNEL:
+@@ -253,6 +256,7 @@ _mesa_shader_stage_to_subroutine_uniform
        break;
     }
     unreachable("not reached");
@@ -2146,8 +1557,3 @@
  }
  
  extern bool
- _mesa_validate_pipeline_io(struct gl_pipeline_object *);
- 
- #ifdef __cplusplus
- }
- #endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/one_swizzle_to_rule_them_all.patch	Sun Jul 10 10:35:20 2022 +0200
@@ -0,0 +1,34 @@
+# HG changeset patch
+# User M. Sirringhaus <msirringhaus@suse.de>
+# Date 1645518286 -3600
+#      Tue Feb 22 09:24:46 2022 +0100
+# Node ID 494640792b4677f6462e95b90a54a4e22aeb738b
+# Parent  81832d035e101471dcf52dd91de287268add7a91
+imported patch one_swizzle_to_rule_them_all.patch
+
+Index: firefox-102.0/gfx/webrender_bindings/RenderCompositorSWGL.cpp
+===================================================================
+--- firefox-102.0.orig/gfx/webrender_bindings/RenderCompositorSWGL.cpp
++++ firefox-102.0/gfx/webrender_bindings/RenderCompositorSWGL.cpp
+@@ -7,6 +7,7 @@
+ #include "RenderCompositorSWGL.h"
+ 
+ #include "mozilla/gfx/Logging.h"
++#include "mozilla/gfx/Swizzle.h"
+ #include "mozilla/widget/CompositorWidget.h"
+ 
+ #ifdef MOZ_WIDGET_GTK
+@@ -235,6 +237,13 @@ void RenderCompositorSWGL::CommitMappedB
+   }
+   mDT->Flush();
+ 
++#if MOZ_BIG_ENDIAN()
++  // One swizzle to rule them all.
++  gfx::SwizzleData(mMappedData, mMappedStride, gfx::SurfaceFormat::B8G8R8A8,
++                   mMappedData, mMappedStride, gfx::SurfaceFormat::A8R8G8B8,
++                   mDT->GetSize());
++#endif
++
+   // Done with the DT. Hand it back to the widget and clear out any trace of it.
+   mWidget->EndRemoteDrawingInRegion(mDT, mDirtyRegion);
+   mDirtyRegion.SetEmpty();
--- a/series	Sun Jun 12 16:05:04 2022 +0200
+++ b/series	Sun Jul 10 10:35:20 2022 +0200
@@ -10,18 +10,17 @@
 mozilla-bmo1005535.patch
 mozilla-bmo1568145.patch
 mozilla-bmo1504834-part1.patch
-mozilla-bmo1504834-part2.patch
 mozilla-bmo1504834-part3.patch
 mozilla-bmo1512162.patch
 mozilla-fix-top-level-asm.patch
-mozilla-bmo1504834-part4.patch
 mozilla-bmo849632.patch
 mozilla-bmo998749.patch
-mozilla-bmo1626236.patch
 mozilla-s390x-skia-gradient.patch
 mozilla-libavcodec58_91.patch
 mozilla-silence-no-return-type.patch
 mozilla-bmo531915.patch
+one_swizzle_to_rule_them_all.patch
+svg-rendering.patch
 
 # Firefox patches
 firefox-kde.patch
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svg-rendering.patch	Sun Jul 10 10:35:20 2022 +0200
@@ -0,0 +1,29 @@
+# HG changeset patch
+# User M. Sirringhaus <msirringhaus@suse.de>
+# Date 1645518286 -3600
+#      Tue Feb 22 09:24:46 2022 +0100
+# Node ID 81832d035e101471dcf52dd91de287268add7a91
+# Parent  66f7ce16eb4965108687280e5443edd610631efb
+imported patch svg-rendering.patch
+
+diff --git a/image/imgFrame.cpp b/image/imgFrame.cpp
+--- a/image/imgFrame.cpp
++++ b/image/imgFrame.cpp
+@@ -372,6 +372,17 @@ nsresult imgFrame::InitWithDrawable(gfxD
+     return NS_ERROR_OUT_OF_MEMORY;
+   }
+ 
++#if MOZ_BIG_ENDIAN()
++  if (aBackend == gfx::BackendType::SKIA && canUseDataSurface) {
++      // SKIA is lying about what format it returns on big endian
++      for (int ii=0; ii < mRawSurface->GetSize().Height()*mRawSurface->Stride() / 4; ++ii) {
++        uint32_t *vals = (uint32_t*)(mRawSurface->GetData());
++        uint32_t val = ((vals[ii] << 8) & 0xFF00FF00 ) | ((vals[ii] >> 8) & 0xFF00FF );
++        vals[ii] = (val << 16) | (val >> 16);
++      }
++  }
++#endif
++
+   if (!canUseDataSurface) {
+     // We used an offscreen surface, which is an "optimized" surface from
+     // imgFrame's perspective.