diff --git a/MozillaThunderbird.changes b/MozillaThunderbird.changes index 2c4a10b..2f0e5d2 100644 --- a/MozillaThunderbird.changes +++ b/MozillaThunderbird.changes @@ -1,3 +1,37 @@ +------------------------------------------------------------------- +Mon Oct 4 19:55:48 UTC 2021 - Wolfgang Rosenauer + +- Mozilla Thunderbird 91.2.0 + * Saving a single message as .eml now uses a unique filename + * New mail notifications did not properly take subfolders into account + * Decrypting binary attachments when using an external GnuPG + configuration failed + * Account name fields in the account manager were not big enough + for long names + * LDAP searches using an extensibleMatch filter returned no results + * Read-only CalDAV calendars and CardDAV address books were not detected + * Multipart messages containing a calendar invite did not display + any of the human-readable alternatives + * Some calendar days were displayed incorrectly or duplicated + (eg. two "29th" days of a particular month) + * Phantom event was shown at the end of each day in Calendar week view + MFSA 2021-46 (bsc#1191332) + * CVE-2021-38496 (bmo#1725335) + Use-after-free in MessageTask + * CVE-2021-38497 (bmo#1726621) + Validation message could have been overlaid on another origin + * CVE-2021-38498 (bmo#1729642) + Use-after-free of nsLanguageAtomService object + * CVE-2021-32810 (bmo#1729813, + https://github.com/crossbeam- + rs/crossbeam/security/advisories/GHSA-pqqp-xmhj-wgcw) + Data race in crossbeam-deque + * CVE-2021-38500 (bmo#1725854, bmo#1728321) + Memory safety bugs fixed in Firefox 93, Firefox ESR 78.15, + and Firefox ESR 91.2 + * CVE-2021-38501 (bmo#1685354, bmo#1715755, bmo#1723176) + Memory safety bugs fixed in Firefox 93 and Firefox ESR 91.2 + ------------------------------------------------------------------- Sun Sep 26 16:01:35 UTC 2021 - Wolfgang Rosenauer diff --git a/MozillaThunderbird.spec b/MozillaThunderbird.spec index fa59a73..d98fc32 100644 --- a/MozillaThunderbird.spec +++ b/MozillaThunderbird.spec @@ -26,8 +26,8 @@ # major 69 # mainver %major.99 %define major 91 -%define mainver %major.1.2 -%define orig_version 91.1.2 +%define mainver %major.2.0 +%define orig_version 91.2.0 %define orig_suffix %{nil} %define update_channel release %define source_prefix thunderbird-%{orig_version} diff --git a/l10n-91.1.2.tar.xz b/l10n-91.1.2.tar.xz deleted file mode 100644 index 2709a4f..0000000 --- a/l10n-91.1.2.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e06f3578f89bfc37ee00e1304aee3979a87dd48702fe22d44907f2472c9714cb -size 28586984 diff --git a/l10n-91.2.0.tar.xz b/l10n-91.2.0.tar.xz new file mode 100644 index 0000000..86935ef --- /dev/null +++ b/l10n-91.2.0.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8cfd9fb8189a656d319c5004f42484e7a701257817049d9e6840621fd9b1203 +size 28636552 diff --git a/mozilla-silence-no-return-type.patch b/mozilla-silence-no-return-type.patch index 29f5295..21d327f 100644 --- a/mozilla-silence-no-return-type.patch +++ b/mozilla-silence-no-return-type.patch @@ -1,8 +1,15 @@ +# HG changeset patch +# Parent 003da8fa06219e3355208e8e5d0818870b88f5ae + diff --git a/Cargo.lock b/Cargo.lock -index 6f54a9380d..09911c0273 100644 --- a/Cargo.lock +++ b/Cargo.lock -@@ -2063,8 +2063,6 @@ dependencies = [ +@@ -2072,18 +2072,16 @@ name = "glsl-to-cxx" + version = "0.1.0" + dependencies = [ + "glsl", + ] + [[package]] name = "glslopt" version = "0.1.9" @@ -11,11 +18,20 @@ index 6f54a9380d..09911c0273 100644 dependencies = [ "cc", ] + + [[package]] + name = "goblin" + version = "0.1.3" + source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/Cargo.toml b/Cargo.toml -index 09f3e7292f..3581baf2aa 100644 --- a/Cargo.toml +++ b/Cargo.toml -@@ -83,6 +83,7 @@ rlbox_lucet_sandbox = { git = "https://github.com/PLSysSec/rlbox_lucet_sandbox/" +@@ -78,16 +78,17 @@ opt-level = 2 + chardetng = { git = "https://github.com/hsivonen/chardetng", rev="302c995f91f44cf26e77dc4758ad56c3ff0153ad" } + chardetng_c = { git = "https://github.com/hsivonen/chardetng_c", rev="ed8a4c6f900a90d4dbc1d64b856e61490a1c3570" } + libudev-sys = { path = "dom/webauthn/libudev-sys" } + packed_simd = { git = "https://github.com/hsivonen/packed_simd", rev="8b4bd7d8229660a749dbe419a57ea01df9de5453" } + rlbox_lucet_sandbox = { git = "https://github.com/PLSysSec/rlbox_lucet_sandbox/", rev="5c8e79048d3ff6f434109e19d4aee4ff8624d3d7" } nix = { git = "https://github.com/shravanrn/nix/", rev="4af6c367603869a30fddb5ffb0aba2b9477ba92e" } spirv_cross = { git = "https://github.com/kvark/spirv_cross", branch = "wgpu5" } minidump_writer_linux = { git = "https://github.com/msirringhaus/minidump_writer_linux.git", rev = "85551909b95a5cf553a85dbcddfa5f117cfbbe0e" } @@ -23,18 +39,20 @@ index 09f3e7292f..3581baf2aa 100644 [patch.crates-io.cranelift-codegen] -@@ -105,4 +106,4 @@ path = "third_party/rust/mio" + git = "https://github.com/bytecodealliance/wasmtime" + rev = "824fa69756523f2b6d49029fe25de94130b1f144" - # Patch failure 0.1.8 to disable the backtrace feature by default. See bug 1608157. - [patch.crates-io.failure] --path = "third_party/rust/failure" -\ No newline at end of file -+path = "third_party/rust/failure" + [patch.crates-io.cranelift-wasm] + git = "https://github.com/bytecodealliance/wasmtime" diff --git a/gfx/skia/skia/include/codec/SkEncodedOrigin.h b/gfx/skia/skia/include/codec/SkEncodedOrigin.h -index 2eed1c6ac6..49d0309034 100644 --- a/gfx/skia/skia/include/codec/SkEncodedOrigin.h +++ b/gfx/skia/skia/include/codec/SkEncodedOrigin.h -@@ -41,6 +41,7 @@ static inline SkMatrix SkEncodedOriginToMatrix(SkEncodedOrigin origin, int w, in +@@ -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); case kLeftBottom_SkEncodedOrigin: return SkMatrix::MakeAll( 0, 1, 0, -1, 0, w, 0, 0, 1); } SK_ABORT("Unexpected origin"); @@ -42,11 +60,16 @@ index 2eed1c6ac6..49d0309034 100644 } + #endif // SkEncodedOrigin_DEFINED diff --git a/gfx/skia/skia/include/private/GrTypesPriv.h b/gfx/skia/skia/include/private/GrTypesPriv.h -index 90718038e0..4ec7729ab8 100644 --- a/gfx/skia/skia/include/private/GrTypesPriv.h +++ b/gfx/skia/skia/include/private/GrTypesPriv.h -@@ -540,6 +540,7 @@ static inline GrSLType GrSLCombinedSamplerTypeForTextureType(GrTextureType type) +@@ -535,32 +535,34 @@ static inline GrSLType GrSLCombinedSampl + return kTexture2DSampler_GrSLType; + case GrTextureType::kRectangle: + return kTexture2DRectSampler_GrSLType; + case GrTextureType::kExternal: + return kTextureExternalSampler_GrSLType; default: SK_ABORT("Unexpected texture type"); } @@ -54,7 +77,16 @@ index 90718038e0..4ec7729ab8 100644 } /** Rectangle and external textures only support the clamp wrap mode and do not support -@@ -556,6 +557,7 @@ static inline bool GrTextureTypeHasRestrictedSampling(GrTextureType type) { + * 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; default: SK_ABORT("Unexpected texture type"); } @@ -62,7 +94,17 @@ index 90718038e0..4ec7729ab8 100644 } static constexpr bool GrSLTypeIsCombinedSamplerType(GrSLType type) { -@@ -858,6 +860,7 @@ static inline size_t GrCompressedFormatDataSize(SkImage::CompressionType compres + 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; } SK_ABORT("Invalid pixel config"); @@ -70,11 +112,20 @@ index 90718038e0..4ec7729ab8 100644 } /** + * 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 -index 23bdbc1c42..ea2d23f6e8 100644 --- a/gfx/skia/skia/src/core/SkGeometry.h +++ b/gfx/skia/skia/src/core/SkGeometry.h -@@ -182,6 +182,7 @@ static inline bool SkCubicIsDegenerate(SkCubicType type) { +@@ -177,28 +177,30 @@ static inline bool SkCubicIsDegenerate(S + case SkCubicType::kLocalCusp: + case SkCubicType::kCuspAtInfinity: + return false; + case SkCubicType::kQuadratic: + case SkCubicType::kLineOrPoint: return true; } SK_ABORT("Invalid SkCubicType"); @@ -82,7 +133,12 @@ index 23bdbc1c42..ea2d23f6e8 100644 } static inline const char* SkCubicTypeName(SkCubicType type) { -@@ -194,6 +195,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"; case SkCubicType::kLineOrPoint: return "kLineOrPoint"; } SK_ABORT("Invalid SkCubicType"); @@ -90,11 +146,20 @@ index 23bdbc1c42..ea2d23f6e8 100644 } /** 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 -index 3c84bda6f8..e2fba375cc 100644 --- a/gfx/skia/skia/src/core/SkTextBlob.cpp +++ b/gfx/skia/skia/src/core/SkTextBlob.cpp -@@ -201,6 +201,7 @@ void SkTextBlob::operator delete(void* p) { +@@ -196,16 +196,17 @@ unsigned SkTextBlob::ScalarsPerGlyph(Gly + } + + void SkTextBlob::operator delete(void* p) { + sk_free(p); + } void* SkTextBlob::operator new(size_t) { SK_ABORT("All blobs are created by placement new."); @@ -102,11 +167,20 @@ index 3c84bda6f8..e2fba375cc 100644 } 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 -index 838a783313..d878fadc08 100644 --- a/gfx/skia/skia/src/core/SkTypeface_remote.cpp +++ b/gfx/skia/skia/src/core/SkTypeface_remote.cpp -@@ -29,6 +29,7 @@ void SkScalerContextProxy::initCache(SkStrike* cache, SkStrikeCache* strikeCache +@@ -24,16 +24,17 @@ void SkScalerContextProxy::initCache(SkS + SkASSERT(cache != nullptr); + + fCache = cache; + fStrikeCache = strikeCache; + } unsigned SkScalerContextProxy::generateGlyphCount() { SK_ABORT("Should never be called."); @@ -114,11 +188,20 @@ index 838a783313..d878fadc08 100644 } 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 -index 3d454cf760..554f7c0617 100644 --- a/gfx/skia/skia/src/core/SkTypeface_remote.h +++ b/gfx/skia/skia/src/core/SkTypeface_remote.h -@@ -63,23 +63,28 @@ public: +@@ -58,46 +58,54 @@ public: + , fGlyphCount{glyphCount} + , fIsLogging{isLogging} + , fDiscardableManager{std::move(manager)} {} + SkFontID remoteTypefaceID() const {return fFontId;} + int glyphCount() const {return fGlyphCount;} bool isLogging() const {return fIsLogging;} protected: @@ -148,7 +231,7 @@ index 3d454cf760..554f7c0617 100644 } void onGetFamilyName(SkString* familyName) const override { // Used by SkStrikeCache::DumpMemoryStatistics. -@@ -87,12 +92,15 @@ protected: + *familyName = ""; } SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override { SK_ABORT("Should never be called."); @@ -164,7 +247,17 @@ index 3d454cf760..554f7c0617 100644 } SkScalerContext* onCreateScalerContext(const SkScalerContextEffects& effects, const SkDescriptor* desc) const override { -@@ -116,6 +124,7 @@ protected: + return new SkScalerContextProxy(sk_ref_sp(const_cast(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."); + } std::unique_ptr onGetAdvancedMetrics() const override { SK_ABORT("Should never be called."); @@ -172,7 +265,10 @@ index 3d454cf760..554f7c0617 100644 } void onCharsToGlyphs(const SkUnichar* chars, int count, SkGlyphID glyphs[]) const override { SK_ABORT("Should never be called."); -@@ -126,6 +135,7 @@ protected: + } + int onCountGlyphs() const override { + return this->glyphCount(); + } void* onGetCTFontRef() const override { SK_ABORT("Should never be called."); @@ -180,11 +276,20 @@ index 3d454cf760..554f7c0617 100644 } private: + const SkFontID fFontId; + const int fGlyphCount; + const bool fIsLogging; + sk_sp fDiscardableManager; + diff --git a/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp b/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp -index 2dde5e2be7..dd8550dfad 100644 --- a/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp +++ b/gfx/skia/skia/src/effects/imagefilters/SkBlurImageFilter.cpp -@@ -144,6 +144,7 @@ static GrTextureDomain::Mode to_texture_domain_mode(SkTileMode tileMode) { +@@ -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: return GrTextureDomain::kRepeat_Mode; default: SK_ABORT("Unsupported tile mode."); @@ -192,11 +297,20 @@ index 2dde5e2be7..dd8550dfad 100644 } } #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 -index 43d32dcc91..4a8143e2e2 100644 --- a/gfx/skia/skia/src/effects/imagefilters/SkLightingImageFilter.cpp +++ b/gfx/skia/skia/src/effects/imagefilters/SkLightingImageFilter.cpp -@@ -1701,6 +1701,7 @@ static SkImageFilterLight* create_random_light(SkRandom* random) { +@@ -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()); } default: SK_ABORT("Unexpected value."); @@ -204,11 +318,20 @@ index 43d32dcc91..4a8143e2e2 100644 } } + std::unique_ptr GrDiffuseLightingEffect::TestCreate(GrProcessorTestData* d) { + int texIdx = d->fRandom->nextBool() ? GrProcessorUnitTest::kSkiaPMTextureIdx + : GrProcessorUnitTest::kAlphaTextureIdx; + sk_sp 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 -index da7678a725..63330e58c2 100644 --- a/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp +++ b/gfx/skia/skia/src/fonts/SkFontMgr_indirect.cpp -@@ -69,6 +69,7 @@ void SkFontMgr_Indirect::onGetFamilyName(int index, SkString* familyName) const +@@ -64,16 +64,17 @@ int SkFontMgr_Indirect::onCountFamilies( + } + + void SkFontMgr_Indirect::onGetFamilyName(int index, SkString* familyName) const { + SK_ABORT("Not implemented"); + } SkFontStyleSet* SkFontMgr_Indirect::onCreateStyleSet(int index) const { SK_ABORT("Not implemented"); @@ -216,11 +339,20 @@ index da7678a725..63330e58c2 100644 } 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 -index 6265aaec28..0da5190e4a 100644 --- a/gfx/skia/skia/src/gpu/GrDataUtils.cpp +++ b/gfx/skia/skia/src/gpu/GrDataUtils.cpp -@@ -128,6 +128,7 @@ size_t GrCompressedDataSize(SkImage::CompressionType type, int width, int height +@@ -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); return numBlocks * sizeof(ETC1Block); } SK_ABORT("Unexpected compression type"); @@ -228,7 +360,9 @@ index 6265aaec28..0da5190e4a 100644 } size_t GrCompressedRowBytes(SkImage::CompressionType type, int width) { -@@ -137,6 +138,7 @@ size_t GrCompressedRowBytes(SkImage::CompressionType type, int width) { + switch (type) { + case SkImage::kETC1_CompressionType: + int numBlocksWidth = num_ETC1_blocks_w(width); return numBlocksWidth * sizeof(ETC1Block); } SK_ABORT("Unexpected compression type"); @@ -236,11 +370,20 @@ index 6265aaec28..0da5190e4a 100644 } // 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 -index 21e27b868b..5b96868075 100644 --- a/gfx/skia/skia/src/gpu/GrFragmentProcessor.h +++ b/gfx/skia/skia/src/gpu/GrFragmentProcessor.h -@@ -375,6 +375,7 @@ protected: +@@ -370,16 +370,17 @@ protected: + const Args&... samps) { + return (0 == i) ? samp0 : IthTextureSampler(i - 1, samps...); + } + inline static const TextureSampler& IthTextureSampler(int i); + private: virtual SkPMColor4f constantOutputForConstantInput(const SkPMColor4f& /* inputColor */) const { SK_ABORT("Subclass must override this if advertising this optimization."); @@ -248,11 +391,20 @@ index 21e27b868b..5b96868075 100644 } /** 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 -index 5e44531d2e..a6bd5e4cbc 100644 --- a/gfx/skia/skia/src/gpu/GrPathRendering.cpp +++ b/gfx/skia/skia/src/gpu/GrPathRendering.cpp -@@ -19,6 +19,7 @@ const GrUserStencilSettings& GrPathRendering::GetStencilPassSettings(FillType fi +@@ -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) { switch (fill) { default: SK_ABORT("Unexpected path fill."); @@ -260,11 +412,20 @@ index 5e44531d2e..a6bd5e4cbc 100644 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 -index 3e143e4d0f..3a672fabc6 100644 --- a/gfx/skia/skia/src/gpu/GrPathRendering.h +++ b/gfx/skia/skia/src/gpu/GrPathRendering.h -@@ -63,6 +63,7 @@ public: +@@ -58,16 +58,17 @@ public: + return 1; + case kTranslate_PathTransformType: + return 2; + case kAffine_PathTransformType: + return 6; default: SK_ABORT("Unknown path transform type"); @@ -272,11 +433,20 @@ index 3e143e4d0f..3a672fabc6 100644 } } + // 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 -index 8d8efa7685..2d56d2cb09 100644 --- a/gfx/skia/skia/src/gpu/GrProcessorUnitTest.cpp +++ b/gfx/skia/skia/src/gpu/GrProcessorUnitTest.cpp -@@ -20,6 +20,7 @@ std::unique_ptr GrProcessorUnitTest::MakeChildFP(GrProcesso +@@ -15,11 +15,12 @@ std::unique_ptr GrP + std::unique_ptr fp; + do { + fp = GrFragmentProcessorTestFactory::Make(data); + SkASSERT(fp); + } while (fp->numChildProcessors() != 0); return fp; #else SK_ABORT("Should not be called if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS"); @@ -285,10 +455,14 @@ index 8d8efa7685..2d56d2cb09 100644 } #endif diff --git a/gfx/skia/skia/src/gpu/GrReducedClip.cpp b/gfx/skia/skia/src/gpu/GrReducedClip.cpp -index 9224e005c6..5c1d44b613 100644 --- a/gfx/skia/skia/src/gpu/GrReducedClip.cpp +++ b/gfx/skia/skia/src/gpu/GrReducedClip.cpp -@@ -525,6 +525,7 @@ GrReducedClip::ClipResult GrReducedClip::clipInsideElement(const Element* elemen +@@ -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())); } SK_ABORT("Unexpected DeviceSpaceType"); @@ -296,7 +470,17 @@ index 9224e005c6..5c1d44b613 100644 } GrReducedClip::ClipResult GrReducedClip::clipOutsideElement(const Element* element) { -@@ -591,6 +592,7 @@ GrReducedClip::ClipResult GrReducedClip::clipOutsideElement(const Element* eleme + 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())); } SK_ABORT("Unexpected DeviceSpaceType"); @@ -304,11 +488,20 @@ index 9224e005c6..5c1d44b613 100644 } 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 -index 6d9a961886..5f2e68dd7b 100644 --- a/gfx/skia/skia/src/gpu/GrResourceCache.cpp +++ b/gfx/skia/skia/src/gpu/GrResourceCache.cpp -@@ -40,6 +40,7 @@ GrScratchKey::ResourceType GrScratchKey::GenerateResourceType() { +@@ -35,27 +35,29 @@ DECLARE_SKMESSAGEBUS_MESSAGE(GrTextureFr + ////////////////////////////////////////////////////////////////////////////// + + GrScratchKey::ResourceType GrScratchKey::GenerateResourceType() { + static std::atomic nextType{INHERITED::kInvalidDomain + 1}; + int32_t type = nextType++; if (type > SkTo(UINT16_MAX)) { SK_ABORT("Too many Resource Types"); @@ -316,7 +509,11 @@ index 6d9a961886..5f2e68dd7b 100644 } return static_cast(type); -@@ -51,6 +52,7 @@ GrUniqueKey::Domain GrUniqueKey::GenerateDomain() { + } + + GrUniqueKey::Domain GrUniqueKey::GenerateDomain() { + static std::atomic nextDomain{INHERITED::kInvalidDomain + 1}; + int32_t domain = nextDomain++; if (domain > SkTo(UINT16_MAX)) { SK_ABORT("Too many GrUniqueKey Domains"); @@ -324,11 +521,20 @@ index 6d9a961886..5f2e68dd7b 100644 } return static_cast(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 -index 6f7ccccd60..67156a74bc 100644 --- a/gfx/skia/skia/src/gpu/GrShaderVar.cpp +++ b/gfx/skia/skia/src/gpu/GrShaderVar.cpp -@@ -18,6 +18,7 @@ static const char* type_modifier_string(GrShaderVar::TypeModifier t) { +@@ -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"; case GrShaderVar::kUniform_TypeModifier: return "uniform"; } SK_ABORT("Unknown shader variable type modifier."); @@ -336,7 +542,14 @@ index 6f7ccccd60..67156a74bc 100644 } void GrShaderVar::setIOType(GrIOType ioType) { -@@ -32,6 +33,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"); return; } SK_ABORT("Unknown io type."); @@ -344,11 +557,20 @@ index 6f7ccccd60..67156a74bc 100644 } 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 -index 77b9963ba5..f6d7ca05dd 100644 --- a/gfx/skia/skia/src/gpu/SkGpuDevice.cpp +++ b/gfx/skia/skia/src/gpu/SkGpuDevice.cpp -@@ -283,6 +283,7 @@ static inline GrPrimitiveType point_mode_to_primitive_type(SkCanvas::PointMode m +@@ -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: return GrPrimitiveType::kLineStrip; } SK_ABORT("Unexpected mode"); @@ -356,11 +578,20 @@ index 77b9963ba5..f6d7ca05dd 100644 } 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 -index 79a68822b9..716f59d7e6 100644 --- a/gfx/skia/skia/src/gpu/SkGr.h +++ b/gfx/skia/skia/src/gpu/SkGr.h -@@ -159,6 +159,7 @@ static inline GrPrimitiveType SkVertexModeToGrPrimitiveType(SkVertices::VertexMo +@@ -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: break; } SK_ABORT("Invalid mode"); @@ -368,23 +599,41 @@ index 79a68822b9..716f59d7e6 100644 } ////////////////////////////////////////////////////////////////////////////// + + 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 -index 5fdb488ea5..eb81f47ba6 100644 --- a/gfx/skia/skia/src/gpu/ccpr/GrCCCoverageProcessor.h +++ b/gfx/skia/skia/src/gpu/ccpr/GrCCCoverageProcessor.h -@@ -240,6 +240,7 @@ inline const char* GrCCCoverageProcessor::PrimitiveTypeName(PrimitiveType type) +@@ -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"; case PrimitiveType::kConics: return "kConics"; } SK_ABORT("Invalid PrimitiveType"); + SkUNREACHABLE; } + 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 -index 40884d7d8f..c920365f50 100644 --- a/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.cpp +++ b/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.cpp -@@ -60,6 +60,7 @@ static GrCCStrokeGeometry::Verb join_verb_from_join(SkPaint::Join join) { +@@ -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: return Verb::kRoundJoin; } SK_ABORT("Invalid SkPaint::Join."); @@ -392,11 +641,20 @@ index 40884d7d8f..c920365f50 100644 } 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 -index 24569accc4..d105836141 100644 --- a/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.h +++ b/gfx/skia/skia/src/gpu/ccpr/GrCCStrokeGeometry.h -@@ -175,5 +175,6 @@ inline bool GrCCStrokeGeometry::IsInternalJoinVerb(Verb verb) { +@@ -170,10 +170,11 @@ inline bool GrCCStrokeGeometry::IsIntern + case Verb::kMiterJoin: + case Verb::kRoundJoin: + case Verb::kSquareCap: + case Verb::kRoundCap: + case Verb::kEndContour: return false; } SK_ABORT("Invalid GrCCStrokeGeometry::Verb."); @@ -404,10 +662,14 @@ index 24569accc4..d105836141 100644 } #endif diff --git a/gfx/skia/skia/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp b/gfx/skia/skia/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp -index 4e86d7e071..0376cf40c3 100644 --- a/gfx/skia/skia/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp +++ b/gfx/skia/skia/src/gpu/ccpr/GrCoverageCountingPathRenderer.cpp -@@ -164,6 +164,7 @@ GrPathRenderer::CanDrawPath GrCoverageCountingPathRenderer::onCanDrawPath( +@@ -159,16 +159,17 @@ GrPathRenderer::CanDrawPath GrCoverageCo + return CanDrawPath::kYes; + } + + case SkStrokeRec::kStrokeAndFill_Style: + return CanDrawPath::kNo; } SK_ABORT("Invalid stroke style."); @@ -415,21 +677,34 @@ index 4e86d7e071..0376cf40c3 100644 } 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 -index ae5cfca504..89beff076a 100644 --- a/gfx/skia/skia/src/gpu/ccpr/GrVSCoverageProcessor.cpp +++ b/gfx/skia/skia/src/gpu/ccpr/GrVSCoverageProcessor.cpp -@@ -550,4 +550,5 @@ GrGLSLPrimitiveProcessor* GrVSCoverageProcessor::onCreateGLSLInstance( +@@ -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: 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 -index 48fc8a7f48..9321f43b7e 100644 --- a/gfx/skia/skia/src/gpu/dawn/GrDawnOpsRenderPass.cpp +++ b/gfx/skia/skia/src/gpu/dawn/GrDawnOpsRenderPass.cpp -@@ -39,7 +39,9 @@ static dawn::LoadOp to_dawn_load_op(GrLoadOp loadOp) { +@@ -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: return dawn::LoadOp::Clear; default: SK_ABORT("Invalid LoadOp"); @@ -439,11 +714,20 @@ index 48fc8a7f48..9321f43b7e 100644 } 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 -index 74fd1e31a4..2546126406 100644 --- a/gfx/skia/skia/src/gpu/dawn/GrDawnUniformHandler.cpp +++ b/gfx/skia/skia/src/gpu/dawn/GrDawnUniformHandler.cpp -@@ -95,6 +95,7 @@ uint32_t grsltype_to_alignment_mask(GrSLType type) { +@@ -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: break; } SK_ABORT("Unexpected type"); @@ -451,7 +735,17 @@ index 74fd1e31a4..2546126406 100644 } static inline uint32_t grsltype_to_size(GrSLType type) { -@@ -173,6 +174,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: break; } SK_ABORT("Unexpected type"); @@ -459,11 +753,20 @@ index 74fd1e31a4..2546126406 100644 } 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 -index b3885d20c9..0d2bac39de 100644 --- a/gfx/skia/skia/src/gpu/dawn/GrDawnVaryingHandler.cpp +++ b/gfx/skia/skia/src/gpu/dawn/GrDawnVaryingHandler.cpp -@@ -76,6 +76,7 @@ static inline int grsltype_to_location_size(GrSLType type) { +@@ -71,16 +71,17 @@ static inline int grsltype_to_location_s + case kUByte_GrSLType: + return 1; + case kTexture2D_GrSLType: + return 0; + case kSampler_GrSLType: return 0; } SK_ABORT("Unexpected type"); @@ -471,11 +774,20 @@ index b3885d20c9..0d2bac39de 100644 } 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 -index 18cc91a4b1..fd6694bb76 100644 --- a/gfx/skia/skia/src/gpu/effects/GrConstColorProcessor.fp +++ b/gfx/skia/skia/src/gpu/effects/GrConstColorProcessor.fp -@@ -58,6 +58,7 @@ void main() { +@@ -53,16 +53,17 @@ void main() { + case InputMode::kIgnore: + return color; + case InputMode::kModulateA: + return color * input.fA; + case InputMode::kModulateRGBA: return color * input; } SK_ABORT("Unexpected mode"); @@ -483,11 +795,20 @@ index 18cc91a4b1..fd6694bb76 100644 } } + @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 -index b75842c94a..714fc350d5 100644 --- a/gfx/skia/skia/src/gpu/effects/GrCoverageSetOpXP.cpp +++ b/gfx/skia/skia/src/gpu/effects/GrCoverageSetOpXP.cpp -@@ -204,6 +204,7 @@ const GrXPFactory* GrCoverageSetOpXPFactory::Get(SkRegion::Op regionOp, bool inv +@@ -199,16 +199,17 @@ const GrXPFactory* GrCoverageSetOpXPFact + static _CONSTEXPR_ const GrCoverageSetOpXPFactory gRevDiffCDXPF( + SkRegion::kReverseDifference_Op, false); + return &gRevDiffCDXPF; + } + } } #undef _CONSTEXPR_ SK_ABORT("Unknown region op."); @@ -495,11 +816,20 @@ index b75842c94a..714fc350d5 100644 } sk_sp 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 -index 47d92dbde4..1d44d9ad82 100644 --- a/gfx/skia/skia/src/gpu/effects/GrPorterDuffXferProcessor.cpp +++ b/gfx/skia/skia/src/gpu/effects/GrPorterDuffXferProcessor.cpp -@@ -753,6 +753,7 @@ const GrXPFactory* GrPorterDuffXPFactory::Get(SkBlendMode blendMode) { +@@ -748,16 +748,17 @@ const GrXPFactory* GrPorterDuffXPFactory + case SkBlendMode::kPlus: + return &gPlusPDXPF; + case SkBlendMode::kModulate: + return &gModulatePDXPF; + case SkBlendMode::kScreen: return &gScreenPDXPF; default: SK_ABORT("Unexpected blend mode."); @@ -507,11 +837,20 @@ index 47d92dbde4..1d44d9ad82 100644 } } + sk_sp 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 -index 9269ebf668..3169ab6e3f 100644 --- a/gfx/skia/skia/src/gpu/effects/GrSkSLFP.cpp +++ b/gfx/skia/skia/src/gpu/effects/GrSkSLFP.cpp -@@ -154,6 +154,7 @@ public: +@@ -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; } printf("%s\n", SkSL::String(type.fName).c_str()); SK_ABORT("unsupported uniform type"); @@ -519,7 +858,17 @@ index 9269ebf668..3169ab6e3f 100644 } void emitCode(EmitArgs& args) override { -@@ -568,6 +569,7 @@ std::unique_ptr GrSkSLFP::TestCreate(GrProcessorTestData* d + 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 GrS + } + std::unique_ptr result = GrSkSLFP::Make(d->context(), overdrawIndex, + "Overdraw", SKSL_OVERDRAW_SRC, + &inputs, sizeof(inputs)); + return std::unique_ptr(result.release()); } } SK_ABORT("unreachable"); @@ -528,10 +877,14 @@ index 9269ebf668..3169ab6e3f 100644 #endif diff --git a/gfx/skia/skia/src/gpu/effects/generated/GrConstColorProcessor.h b/gfx/skia/skia/src/gpu/effects/generated/GrConstColorProcessor.h -index df64bce9b7..bc9024cb07 100644 --- a/gfx/skia/skia/src/gpu/effects/generated/GrConstColorProcessor.h +++ b/gfx/skia/skia/src/gpu/effects/generated/GrConstColorProcessor.h -@@ -41,6 +41,7 @@ public: +@@ -36,16 +36,17 @@ public: + case InputMode::kIgnore: + return color; + case InputMode::kModulateA: + return color * input.fA; + case InputMode::kModulateRGBA: return color * input; } SK_ABORT("Unexpected mode"); @@ -539,11 +892,20 @@ index df64bce9b7..bc9024cb07 100644 } static std::unique_ptr Make(SkPMColor4f color, InputMode mode) { return std::unique_ptr(new GrConstColorProcessor(color, mode)); + } + GrConstColorProcessor(const GrConstColorProcessor& src); + std::unique_ptr 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 -index 4fc3472ffb..f16a2c536e 100644 --- a/gfx/skia/skia/src/gpu/geometry/GrShape.cpp +++ b/gfx/skia/skia/src/gpu/geometry/GrShape.cpp -@@ -164,6 +164,7 @@ SkRect GrShape::bounds() const { +@@ -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: return this->path().getBounds(); } SK_ABORT("Unknown shape type"); @@ -551,7 +913,17 @@ index 4fc3472ffb..f16a2c536e 100644 } SkRect GrShape::styledBounds() const { -@@ -254,6 +255,7 @@ int GrShape::unstyledKeySize() 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; } } SK_ABORT("Should never get here."); @@ -559,11 +931,20 @@ index 4fc3472ffb..f16a2c536e 100644 } 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 -index 3142399c58..2dab83639a 100644 --- a/gfx/skia/skia/src/gpu/gl/GrGLCaps.cpp +++ b/gfx/skia/skia/src/gpu/gl/GrGLCaps.cpp -@@ -4159,6 +4159,7 @@ GrBackendFormat GrGLCaps::getBackendFormatFromCompressionType( +@@ -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); + } return GrBackendFormat::MakeGL(GR_GL_COMPRESSED_ETC1_RGB8, GR_GL_TEXTURE_2D); } SK_ABORT("Invalid compression type"); @@ -571,21 +952,34 @@ index 3142399c58..2dab83639a 100644 } 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 -index 2ad38bc35e..8dc730f1b7 100644 --- a/gfx/skia/skia/src/gpu/gl/GrGLGLSL.cpp +++ b/gfx/skia/skia/src/gpu/gl/GrGLGLSL.cpp -@@ -68,4 +68,5 @@ bool GrGLGetGLSLGeneration(const GrGLInterface* gl, GrGLSLGeneration* generation +@@ -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; + } 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 -index 937e168db5..da66902895 100644 --- a/gfx/skia/skia/src/gpu/gl/GrGLGpu.cpp +++ b/gfx/skia/skia/src/gpu/gl/GrGLGpu.cpp -@@ -196,6 +196,7 @@ static int gl_target_to_binding_index(GrGLenum target) { +@@ -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: return 2; } SK_ABORT("Unexpected GL texture target."); @@ -593,7 +987,17 @@ index 937e168db5..da66902895 100644 } GrGpuResource::UniqueID GrGLGpu::TextureUnitBindings::boundID(GrGLenum target) const { -@@ -234,6 +235,7 @@ static GrGLenum filter_to_gl_mag_filter(GrSamplerState::Filter filter) { + 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; case GrSamplerState::Filter::kMipMap: return GR_GL_LINEAR; } SK_ABORT("Unknown filter"); @@ -601,7 +1005,9 @@ index 937e168db5..da66902895 100644 } static GrGLenum filter_to_gl_min_filter(GrSamplerState::Filter filter) { -@@ -243,6 +245,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; case GrSamplerState::Filter::kMipMap: return GR_GL_LINEAR_MIPMAP_LINEAR; } SK_ABORT("Unknown filter"); @@ -609,7 +1015,14 @@ index 937e168db5..da66902895 100644 } static inline GrGLenum wrap_mode_to_gl_wrap(GrSamplerState::WrapMode wrapMode, -@@ -257,6 +260,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()); return GR_GL_CLAMP_TO_BORDER; } SK_ABORT("Unknown wrap mode"); @@ -617,7 +1030,17 @@ index 937e168db5..da66902895 100644 } /////////////////////////////////////////////////////////////////////////////// -@@ -1107,7 +1111,7 @@ static bool renderbuffer_storage_msaa(const GrGLContext& ctx, + + 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)); break; case GrGLCaps::kNone_MSFBOType: SK_ABORT("Shouldn't be here if we don't support multisampled renderbuffers."); @@ -626,7 +1049,17 @@ index 937e168db5..da66902895 100644 } return (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface())); } -@@ -2275,9 +2279,10 @@ static GrGLenum gr_primitive_type_to_gl_mode(GrPrimitiveType primitiveType) { + + 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: return GR_GL_LINE_STRIP; case GrPrimitiveType::kPath: SK_ABORT("non-mesh-based GrPrimitiveType"); @@ -638,7 +1071,17 @@ index 937e168db5..da66902895 100644 } void GrGLGpu::sendMeshToGpu(GrPrimitiveType primitiveType, const GrBuffer* vertexBuffer, -@@ -4006,7 +4011,8 @@ int GrGLGpu::TextureToCopyProgramIdx(GrTexture* texture) { + 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; case kTextureExternalSampler_GrSLType: return 2; default: @@ -648,11 +1091,20 @@ index 937e168db5..da66902895 100644 } } + #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 -index e001bf93a1..8d51f00e4b 100644 --- a/gfx/skia/skia/src/gpu/gl/GrGLPath.cpp +++ b/gfx/skia/skia/src/gpu/gl/GrGLPath.cpp -@@ -197,6 +197,7 @@ static GrPathRendering::FillType convert_skpath_filltype(SkPath::FillType fill) +@@ -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) { switch (fill) { default: SK_ABORT("Incomplete Switch\n"); @@ -660,11 +1112,20 @@ index e001bf93a1..8d51f00e4b 100644 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 -index a5a1a3708b..1a223cf1e2 100644 --- a/gfx/skia/skia/src/gpu/gl/GrGLTexture.cpp +++ b/gfx/skia/skia/src/gpu/gl/GrGLTexture.cpp -@@ -25,6 +25,7 @@ GrTextureType GrGLTexture::TextureTypeFromTarget(GrGLenum target) { +@@ -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: return GrTextureType::kExternal; } SK_ABORT("Unexpected texture target"); @@ -672,7 +1133,12 @@ index a5a1a3708b..1a223cf1e2 100644 } static inline GrGLenum target_from_texture_type(GrTextureType type) { -@@ -37,8 +38,10 @@ 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: return GR_GL_TEXTURE_EXTERNAL; default: SK_ABORT("Unexpected texture target"); @@ -683,11 +1149,20 @@ index a5a1a3708b..1a223cf1e2 100644 } // 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 -index cfac573241..4d878af131 100644 --- a/gfx/skia/skia/src/gpu/gl/GrGLVertexArray.cpp +++ b/gfx/skia/skia/src/gpu/gl/GrGLVertexArray.cpp -@@ -80,6 +80,7 @@ static AttribLayout attrib_layout(GrVertexAttribType type) { +@@ -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: return {true, 4, GR_GL_UNSIGNED_SHORT}; } SK_ABORT("Unknown vertex attrib type"); @@ -695,21 +1170,34 @@ index cfac573241..4d878af131 100644 }; 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 -index afa9159bb0..d073fa6f8b 100644 --- a/gfx/skia/skia/src/gpu/glsl/GrGLSL.cpp +++ b/gfx/skia/skia/src/gpu/glsl/GrGLSL.cpp -@@ -98,4 +98,5 @@ const char* GrGLSLTypeString(GrSLType t) { +@@ -93,9 +93,10 @@ const char* GrGLSLTypeString(GrSLType t) + case kUByte4_GrSLType: + return "ubyte4"; + case kTexture2D_GrSLType: + return "texture2D"; + case kSampler_GrSLType: 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 -index ce086a9082..16a0171e7d 100644 --- a/gfx/skia/skia/src/gpu/glsl/GrGLSLVarying.cpp +++ b/gfx/skia/skia/src/gpu/glsl/GrGLSLVarying.cpp -@@ -35,6 +35,7 @@ static bool use_flat_interpolation(GrGLSLVaryingHandler::Interpolation interpola +@@ -30,16 +30,17 @@ static bool use_flat_interpolation(GrGLS + SkASSERT(!shaderCaps.preferFlatInterpolation() || + shaderCaps.flatInterpolationSupport()); + return shaderCaps.preferFlatInterpolation(); + case Interpolation::kMustBeFlat: + SkASSERT(shaderCaps.flatInterpolationSupport()); return true; } SK_ABORT("Invalid interpolation"); @@ -717,11 +1205,20 @@ index ce086a9082..16a0171e7d 100644 } 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 -index ccec08db8b..751b40e9fe 100644 --- a/gfx/skia/skia/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp +++ b/gfx/skia/skia/src/gpu/glsl/GrGLSLVertexGeoBuilder.cpp -@@ -51,6 +51,7 @@ static const char* input_type_name(GrGLSLGeometryBuilder::InputType in) { +@@ -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"; case InputType::kTriangles: return "triangles"; } SK_ABORT("invalid input type"); @@ -729,7 +1226,10 @@ index ccec08db8b..751b40e9fe 100644 } static const char* output_type_name(GrGLSLGeometryBuilder::OutputType out) { -@@ -61,6 +62,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"; case OutputType::kTriangleStrip: return "triangle_strip"; } SK_ABORT("invalid output type"); @@ -737,11 +1237,20 @@ index ccec08db8b..751b40e9fe 100644 } 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 -index 7511f26366..82ff3db772 100644 --- a/gfx/skia/skia/src/gpu/mtl/GrMtlCaps.mm +++ b/gfx/skia/skia/src/gpu/mtl/GrMtlCaps.mm -@@ -506,6 +506,7 @@ size_t GrMtlCaps::GetFormatIndex(MTLPixelFormat pixelFormat) { +@@ -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; } } SK_ABORT("Invalid MTLPixelFormat"); @@ -749,7 +1258,17 @@ index 7511f26366..82ff3db772 100644 } void GrMtlCaps::initFormatTable() { -@@ -1011,6 +1012,7 @@ GrBackendFormat GrMtlCaps::getBackendFormatFromCompressionType( + 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); #endif } SK_ABORT("Invalid compression type"); @@ -757,11 +1276,20 @@ index 7511f26366..82ff3db772 100644 } 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 -index 090c41b9de..4be37d4c53 100644 --- a/gfx/skia/skia/src/gpu/mtl/GrMtlPipelineStateBuilder.mm +++ b/gfx/skia/skia/src/gpu/mtl/GrMtlPipelineStateBuilder.mm -@@ -155,6 +155,7 @@ static inline MTLVertexFormat attribute_type_to_mtlformat(GrVertexAttribType typ +@@ -150,16 +150,17 @@ static inline MTLVertexFormat attribute_ + return MTLVertexFormatUShortNormalized; + } else { + return MTLVertexFormatInvalid; + } + case kUShort4_norm_GrVertexAttribType: return MTLVertexFormatUShort4Normalized; } SK_ABORT("Unknown vertex attribute type"); @@ -769,7 +1297,17 @@ index 090c41b9de..4be37d4c53 100644 } static MTLVertexDescriptor* create_vertex_descriptor(const GrPrimitiveProcessor& primProc) { -@@ -276,6 +277,7 @@ static MTLBlendFactor blend_coeff_to_mtl_blend(GrBlendCoeff coeff) { + 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; } SK_ABORT("Unknown blend coefficient"); @@ -777,11 +1315,20 @@ index 090c41b9de..4be37d4c53 100644 } 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 -index 2d7344eff7..2d03c968bf 100644 --- a/gfx/skia/skia/src/gpu/mtl/GrMtlSampler.mm +++ b/gfx/skia/skia/src/gpu/mtl/GrMtlSampler.mm -@@ -38,6 +38,7 @@ static inline MTLSamplerAddressMode wrap_mode_to_mtl_sampler_address( +@@ -33,16 +33,17 @@ static inline MTLSamplerAddressMode wrap + } else + #endif + { + SkASSERT(false); + return MTLSamplerAddressModeClampToEdge; } } SK_ABORT("Unknown wrap mode."); @@ -789,11 +1336,20 @@ index 2d7344eff7..2d03c968bf 100644 } 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 -index 89e1263eaf..7a2d007918 100644 --- a/gfx/skia/skia/src/gpu/mtl/GrMtlUniformHandler.mm +++ b/gfx/skia/skia/src/gpu/mtl/GrMtlUniformHandler.mm -@@ -90,6 +90,7 @@ static uint32_t grsltype_to_alignment_mask(GrSLType type) { +@@ -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: break; } SK_ABORT("Unexpected type"); @@ -801,7 +1357,17 @@ index 89e1263eaf..7a2d007918 100644 } /** Returns the size in bytes taken up in Metal buffers for GrSLTypes. */ -@@ -172,6 +173,7 @@ static inline uint32_t grsltype_to_mtl_size(GrSLType type) { + 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: break; } SK_ABORT("Unexpected type"); @@ -809,11 +1375,20 @@ index 89e1263eaf..7a2d007918 100644 } // 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 -index eccf435074..b49a43b7ec 100644 --- a/gfx/skia/skia/src/gpu/mtl/GrMtlUtil.mm +++ b/gfx/skia/skia/src/gpu/mtl/GrMtlUtil.mm -@@ -112,6 +112,7 @@ bool GrPixelConfigToMTLFormat(GrPixelConfig config, MTLPixelFormat* format) { +@@ -107,16 +107,17 @@ bool GrPixelConfigToMTLFormat(GrPixelCon + case kRGBA_16161616_GrPixelConfig: + *format = MTLPixelFormatRGBA16Unorm; + return true; + case kRG_half_GrPixelConfig: + *format = MTLPixelFormatRG16Float; return true; } SK_ABORT("Unexpected config"); @@ -821,11 +1396,20 @@ index eccf435074..b49a43b7ec 100644 } MTLTextureDescriptor* GrGetMTLTextureDescriptor(id 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 -index 4b311b5207..8a010a1de1 100644 --- a/gfx/skia/skia/src/gpu/ops/GrDrawVerticesOp.cpp +++ b/gfx/skia/skia/src/gpu/ops/GrDrawVerticesOp.cpp -@@ -610,6 +610,7 @@ static uint32_t seed_vertices(GrPrimitiveType type) { +@@ -605,16 +605,17 @@ static uint32_t seed_vertices(GrPrimitiv + case GrPrimitiveType::kLines: + case GrPrimitiveType::kLineStrip: + return 2; + case GrPrimitiveType::kPath: + SkASSERT(0); return 0; } SK_ABORT("Incomplete switch\n"); @@ -833,7 +1417,17 @@ index 4b311b5207..8a010a1de1 100644 } static uint32_t primitive_vertices(GrPrimitiveType type) { -@@ -627,6 +628,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); return 0; } SK_ABORT("Incomplete switch\n"); @@ -841,21 +1435,34 @@ index 4b311b5207..8a010a1de1 100644 } 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 -index 6b3c023ff6..6b28723bd5 100644 --- a/gfx/skia/skia/src/gpu/ops/GrFillRRectOp.cpp +++ b/gfx/skia/skia/src/gpu/ops/GrFillRRectOp.cpp -@@ -823,4 +823,5 @@ static bool can_use_hw_derivatives_with_coverage( +@@ -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; } } 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 -index b32758150f..10f0d96889 100644 --- a/gfx/skia/skia/src/gpu/ops/GrOvalOpFactory.cpp +++ b/gfx/skia/skia/src/gpu/ops/GrOvalOpFactory.cpp -@@ -2283,6 +2283,7 @@ static int rrect_type_to_vert_count(RRectType type) { +@@ -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: return kVertsPerOverstrokeRRect; } SK_ABORT("Invalid type"); @@ -863,7 +1470,12 @@ index b32758150f..10f0d96889 100644 } static int rrect_type_to_index_count(RRectType type) { -@@ -2295,6 +2296,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"); @@ -871,7 +1483,11 @@ index b32758150f..10f0d96889 100644 } static const uint16_t* rrect_type_to_indices(RRectType type) { -@@ -2306,6 +2308,7 @@ 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"); @@ -879,11 +1495,20 @@ index b32758150f..10f0d96889 100644 } /////////////////////////////////////////////////////////////////////////////////////////////////// + + // 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 -index 546933bb8a..fadf6096c3 100644 --- a/gfx/skia/skia/src/gpu/ops/GrShadowRRectOp.cpp +++ b/gfx/skia/skia/src/gpu/ops/GrShadowRRectOp.cpp -@@ -155,6 +155,7 @@ static int rrect_type_to_vert_count(RRectType type) { +@@ -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"); @@ -891,7 +1516,12 @@ index 546933bb8a..fadf6096c3 100644 } static int rrect_type_to_index_count(RRectType type) { -@@ -167,6 +168,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"); @@ -899,7 +1529,11 @@ index 546933bb8a..fadf6096c3 100644 } static const uint16_t* rrect_type_to_indices(RRectType type) { -@@ -178,6 +180,7 @@ 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: return gRRectIndices; } SK_ABORT("Invalid type"); @@ -907,11 +1541,20 @@ index 546933bb8a..fadf6096c3 100644 } /////////////////////////////////////////////////////////////////////////////// + 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 -index ddea88d15f..d82e84704f 100644 --- a/gfx/skia/skia/src/gpu/text/GrTextBlob.h +++ b/gfx/skia/skia/src/gpu/text/GrTextBlob.h -@@ -125,6 +125,7 @@ public: +@@ -120,16 +120,17 @@ public: + } + + void operator delete(void* p) { + ::operator delete(p); + } void* operator new(size_t) { SK_ABORT("All blobs are created by placement new."); @@ -919,21 +1562,34 @@ index ddea88d15f..d82e84704f 100644 } 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 -index 976beaf3d4..f9c01dd217 100644 --- a/gfx/skia/skia/src/gpu/text/GrTextBlobVertexRegenerator.cpp +++ b/gfx/skia/skia/src/gpu/text/GrTextBlobVertexRegenerator.cpp -@@ -284,4 +284,5 @@ bool GrTextBlob::VertexRegenerator::regenerate(GrTextBlob::VertexRegenerator::Re +@@ -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()); 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 -index 36e2436a85..a914f5a4d5 100644 --- a/gfx/skia/skia/src/gpu/vk/GrVkCaps.cpp +++ b/gfx/skia/skia/src/gpu/vk/GrVkCaps.cpp -@@ -108,6 +108,7 @@ static FormatCompatibilityClass format_compatibility_class(VkFormat format) { +@@ -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; default: SK_ABORT("Unsupported VkFormat"); @@ -941,7 +1597,17 @@ index 36e2436a85..a914f5a4d5 100644 } } -@@ -1656,6 +1657,7 @@ GrBackendFormat GrVkCaps::getBackendFormatFromCompressionType( + 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: return GrBackendFormat::MakeVk(VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK); } SK_ABORT("Invalid compression type"); @@ -949,11 +1615,20 @@ index 36e2436a85..a914f5a4d5 100644 } 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 -index ed14a643ec..3675c953d4 100644 --- a/gfx/skia/skia/src/gpu/vk/GrVkMemory.cpp +++ b/gfx/skia/skia/src/gpu/vk/GrVkMemory.cpp -@@ -28,6 +28,7 @@ static BufferUsage get_buffer_usage(GrVkBuffer::Type type, bool dynamic) { +@@ -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: return BufferUsage::kCpuOnly; } SK_ABORT("Invalid GrVkBuffer::Type"); @@ -961,11 +1636,20 @@ index ed14a643ec..3675c953d4 100644 } 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 -index 6868ff5bab..2c7a20a7db 100644 --- a/gfx/skia/skia/src/gpu/vk/GrVkPipeline.cpp +++ b/gfx/skia/skia/src/gpu/vk/GrVkPipeline.cpp -@@ -80,6 +80,7 @@ static inline VkFormat attrib_type_to_vkformat(GrVertexAttribType type) { +@@ -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: return VK_FORMAT_R16G16B16A16_UNORM; } SK_ABORT("Unknown vertex attrib type"); @@ -973,7 +1657,17 @@ index 6868ff5bab..2c7a20a7db 100644 } static void setup_vertex_input_state(const GrPrimitiveProcessor& primProc, -@@ -162,8 +163,10 @@ static VkPrimitiveTopology gr_primitive_type_to_vk_topology(GrPrimitiveType prim + 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: return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP; case GrPrimitiveType::kPath: SK_ABORT("Unsupported primitive type"); @@ -984,11 +1678,20 @@ index 6868ff5bab..2c7a20a7db 100644 } 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 -index 5dc3544f00..306bd96816 100644 --- a/gfx/skia/skia/src/gpu/vk/GrVkSampler.cpp +++ b/gfx/skia/skia/src/gpu/vk/GrVkSampler.cpp -@@ -23,6 +23,7 @@ static inline VkSamplerAddressMode wrap_mode_to_vk_sampler_address( +@@ -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: return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER; } SK_ABORT("Unknown wrap mode."); @@ -996,11 +1699,20 @@ index 5dc3544f00..306bd96816 100644 } 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 -index 210cf228d9..6a6fd90d96 100644 --- a/gfx/skia/skia/src/gpu/vk/GrVkTransferBuffer.h +++ b/gfx/skia/skia/src/gpu/vk/GrVkTransferBuffer.h -@@ -34,6 +34,7 @@ private: +@@ -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()); } bool onUpdateData(const void* src, size_t srcSizeInBytes) override { SK_ABORT("Not implemented for transfer buffers."); @@ -1008,11 +1720,20 @@ index 210cf228d9..6a6fd90d96 100644 } GrVkGpu* getVkGpu() const { + SkASSERT(!this->wasDestroyed()); + return reinterpret_cast(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 -index 6df62ce6a9..4ac6873563 100644 --- a/gfx/skia/skia/src/gpu/vk/GrVkUniformHandler.cpp +++ b/gfx/skia/skia/src/gpu/vk/GrVkUniformHandler.cpp -@@ -89,6 +89,7 @@ static uint32_t grsltype_to_alignment_mask(GrSLType type) { +@@ -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: break; } SK_ABORT("Unexpected type"); @@ -1020,7 +1741,17 @@ index 6df62ce6a9..4ac6873563 100644 } /** Returns the size in bytes taken up in vulkanbuffers for GrSLTypes. */ -@@ -172,6 +173,7 @@ static inline uint32_t grsltype_to_vk_size(GrSLType type) { + 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: break; } SK_ABORT("Unexpected type"); @@ -1028,11 +1759,20 @@ index 6df62ce6a9..4ac6873563 100644 } + // 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 -index 5fe2f45373..4b6d61813d 100644 --- a/gfx/skia/skia/src/gpu/vk/GrVkVaryingHandler.cpp +++ b/gfx/skia/skia/src/gpu/vk/GrVkVaryingHandler.cpp -@@ -74,6 +74,7 @@ static inline int grsltype_to_location_size(GrSLType type) { +@@ -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: return 1; } SK_ABORT("Unexpected type"); @@ -1040,11 +1780,20 @@ index 5fe2f45373..4b6d61813d 100644 } 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 -index a2248070e8..15122d5047 100644 --- a/gfx/skia/skia/src/pdf/SkPDFTag.cpp +++ b/gfx/skia/skia/src/pdf/SkPDFTag.cpp -@@ -64,6 +64,7 @@ static const char* tag_name_from_type(SkPDF::DocumentStructureType type) { +@@ -59,16 +59,17 @@ static const char* tag_name_from_type(Sk + M(WT); + M(WP); + M(Figure); + M(Formula); + M(Form); #undef M } SK_ABORT("bad tag"); @@ -1052,11 +1801,20 @@ index a2248070e8..15122d5047 100644 } 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 -index 23986cbaaa..e78c47b11a 100644 --- a/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp +++ b/gfx/skia/skia/src/ports/SkFontMgr_FontConfigInterface.cpp -@@ -173,18 +173,22 @@ public: +@@ -168,28 +168,32 @@ public: + SkFontMgr_FCI(sk_sp fci) + : fFCI(std::move(fci)) + , fCache(kMaxSize) + {} + protected: int onCountFamilies() const override { SK_ABORT("Not implemented."); @@ -1079,7 +1837,17 @@ index 23986cbaaa..e78c47b11a 100644 } SkTypeface* onMatchFamilyStyle(const char requestedFamilyName[], -@@ -215,10 +219,12 @@ protected: + 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&, const char* bcp47[], int bcp47Count, SkUnichar character) const override { SK_ABORT("Not implemented."); @@ -1092,11 +1860,20 @@ index 23986cbaaa..e78c47b11a 100644 } sk_sp onMakeFromData(sk_sp data, int ttcIndex) const override { + return this->onMakeFromStreamIndex(SkMemoryStream::Make(std::move(data)), ttcIndex); + } + + sk_sp onMakeFromStreamIndex(std::unique_ptr stream, + int ttcIndex) const override { diff --git a/gfx/skia/skia/src/shaders/SkImageShader.cpp b/gfx/skia/skia/src/shaders/SkImageShader.cpp -index 5bc13e587c..968e3cffae 100644 --- a/gfx/skia/skia/src/shaders/SkImageShader.cpp +++ b/gfx/skia/skia/src/shaders/SkImageShader.cpp -@@ -183,6 +183,7 @@ static GrSamplerState::WrapMode tile_mode_to_wrap_mode(const SkTileMode tileMode +@@ -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: return GrSamplerState::WrapMode::kClampToBorder; } SK_ABORT("Unknown tile mode."); @@ -1104,11 +1881,20 @@ index 5bc13e587c..968e3cffae 100644 } std::unique_ptr 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 -index 1b47af5523..f0ae0411d0 100644 --- a/gfx/skia/skia/src/utils/SkShadowUtils.cpp +++ b/gfx/skia/skia/src/utils/SkShadowUtils.cpp -@@ -149,6 +149,7 @@ struct SpotVerticesFactory { +@@ -144,16 +144,17 @@ struct SpotVerticesFactory { + // if the offsets don't match. + if (fOffset == that.fOffset) { + translate->set(0, 0); + return true; + } return false; } SK_ABORT("Uninitialized occluder type?"); @@ -1116,11 +1902,20 @@ index 1b47af5523..f0ae0411d0 100644 } sk_sp 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 -index c00298a160..74b9d1aef3 100644 --- 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 -@@ -2651,6 +2651,7 @@ get_type_name_for_precision_qualifier(const glsl_type *type) +@@ -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; default: unreachable("Unsupported type"); } /* base type */ @@ -1128,11 +1923,20 @@ index c00298a160..74b9d1aef3 100644 } 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 -index 9ea8e00d31..2dee2ccdcd 100644 --- a/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ir.cpp +++ b/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl/ir.cpp -@@ -624,6 +624,7 @@ ir_expression::get_num_operands(ir_expression_operation op) +@@ -619,16 +619,17 @@ ir_expression::get_num_operands(ir_expre + + if (op <= ir_last_triop) + return 3; + + if (op <= ir_last_quadop) return 4; unreachable("Could not calculate number of operands"); @@ -1140,11 +1944,20 @@ index 9ea8e00d31..2dee2ccdcd 100644 } #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 -index 9429e69c2a..8d9da42434 100644 --- 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 -@@ -239,6 +239,7 @@ incremented_before_terminator(ir_loop *loop, ir_variable *var, +@@ -234,16 +234,17 @@ incremented_before_terminator(ir_loop *l + } + + default: + break; + } } unreachable("Unable to find induction variable"); @@ -1152,11 +1965,20 @@ index 9429e69c2a..8d9da42434 100644 } /** + * 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 -index 88318cd8a6..63a535c802 100644 --- 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 -@@ -229,6 +229,7 @@ write_mask_to_swizzle(unsigned write_mask) +@@ -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; case WRITEMASK_W: return SWIZZLE_W; } unreachable("not reached"); @@ -1164,11 +1986,20 @@ index 88318cd8a6..63a535c802 100644 } /** + * 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 -index 445659599c..615ab6215a 100644 --- a/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl_types.cpp +++ b/third_party/rust/glslopt/glsl-optimizer/src/compiler/glsl_types.cpp -@@ -460,6 +460,7 @@ const glsl_type *glsl_type::get_bare_type() const +@@ -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; } unreachable("Invalid base type"); @@ -1176,7 +2007,17 @@ index 445659599c..615ab6215a 100644 } const glsl_type *glsl_type::get_float16_type() const -@@ -2016,6 +2017,7 @@ glsl_type::get_explicit_std140_type(bool row_major) 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; return type; } else { unreachable("Invalid type for UBO or SSBO"); @@ -1184,7 +2025,17 @@ index 445659599c..615ab6215a 100644 } } -@@ -2374,6 +2376,7 @@ glsl_type::get_explicit_std430_type(bool row_major) const + 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; return type; } else { unreachable("Invalid type for SSBO"); @@ -1192,7 +2043,17 @@ index 445659599c..615ab6215a 100644 } } -@@ -2448,6 +2451,7 @@ glsl_type::get_explicit_type_for_size_align(glsl_type_size_align_func type_info, + 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, this->matrix_columns, stride, false); } else { unreachable("Unhandled type."); @@ -1200,7 +2061,17 @@ index 445659599c..615ab6215a 100644 } } -@@ -2948,6 +2952,7 @@ glsl_get_sampler_dim_coordinate_components(enum glsl_sampler_dim dim) + 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: return 3; default: unreachable("Unknown sampler dim"); @@ -1208,11 +2079,16 @@ index 445659599c..615ab6215a 100644 } } + } 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 -index 0d512550de..ef940cabdd 100644 --- a/third_party/rust/glslopt/glsl-optimizer/src/mesa/main/shaderobj.h +++ b/third_party/rust/glslopt/glsl-optimizer/src/mesa/main/shaderobj.h -@@ -185,6 +185,7 @@ _mesa_shader_stage_from_subroutine_uniform(GLenum subuniform) +@@ -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: return MESA_SHADER_TESS_EVAL; } unreachable("not reached"); @@ -1220,7 +2096,17 @@ index 0d512550de..ef940cabdd 100644 } static inline gl_shader_stage -@@ -205,6 +206,7 @@ _mesa_shader_stage_from_subroutine(GLenum subroutine) + _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: return MESA_SHADER_TESS_EVAL; } unreachable("not reached"); @@ -1228,7 +2114,17 @@ index 0d512550de..ef940cabdd 100644 } static inline GLenum -@@ -230,6 +232,7 @@ _mesa_shader_stage_to_subroutine(gl_shader_stage stage) + _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"); break; } unreachable("not reached"); @@ -1236,7 +2132,17 @@ index 0d512550de..ef940cabdd 100644 } static inline GLenum -@@ -253,6 +256,7 @@ _mesa_shader_stage_to_subroutine_uniform(gl_shader_stage stage) + _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: break; } unreachable("not reached"); @@ -1244,3 +2150,8 @@ index 0d512550de..ef940cabdd 100644 } extern bool + _mesa_validate_pipeline_io(struct gl_pipeline_object *); + + #ifdef __cplusplus + } + #endif diff --git a/tar_stamps b/tar_stamps index 0679591..6e6382f 100644 --- a/tar_stamps +++ b/tar_stamps @@ -1,10 +1,10 @@ PRODUCT="thunderbird" CHANNEL="esr91" -VERSION="91.1.2" +VERSION="91.2.0" VERSION_SUFFIX="" -PREV_VERSION="91.1.1" +PREV_VERSION="91.1.2" PREV_VERSION_SUFFIX="" #SKIP_LOCALES="" # Uncomment to skip l10n and compare-locales-generation RELEASE_REPO="https://hg.mozilla.org/releases/comm-esr91" -RELEASE_TAG="f6bebff25dd4b19be993e286d9594fde1b451516" -RELEASE_TIMESTAMP="20210924213438" +RELEASE_TAG="70572101c3d1709979b8c3e318b7f5449229a37d" +RELEASE_TIMESTAMP="20211004152603" diff --git a/thunderbird-91.1.2.source.tar.xz b/thunderbird-91.1.2.source.tar.xz deleted file mode 100644 index 94c1469..0000000 --- a/thunderbird-91.1.2.source.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c63a215761d8710e9cc78c938828ff532ace33a00d0d59332b30d3d45c3b0f3 -size 402607132 diff --git a/thunderbird-91.1.2.source.tar.xz.asc b/thunderbird-91.1.2.source.tar.xz.asc deleted file mode 100644 index 4687dd1..0000000 --- a/thunderbird-91.1.2.source.tar.xz.asc +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQIzBAABCgAdFiEEQ2D+IQnEl2MYb44h6+QekPbxL20FAmFOei0ACgkQ6+QekPbx -L23bLBAAmOrZo4m8R6cKPWaoOtkMftwCm9cl/TjJOb8Iiqvrz0xLR9obWp6+X2bK -3fsXDB+K9DGlMeythlQQE25fgE7MXuSciUbX+aHDGjlJVoOcDgpsGTRUl3J+gaTo -tZNIKh2bTZeefxzLRyqGrF/tEVZ2Ds+jFuZOq6nlJ5CSJdNQsYRxkmAqNp4AbEPh -RgKrX48yk24r+NFFy1X172xVyxD6DHZDC2Y0GL6iDPmJqDl6FjuVtsjCrEOiN5SX -y0fVQEarFdQhz51Hm3HpOpc/5McAtzAC9cGDQKqYZgjzb6y+y+ZAKOk0J/zikYSs -QFzxgrfplQ32q/mCHDuismhW8DzcAUUvLHnRju1IrvUPnTDuK0HUqIjVtxvUwtxm -6RZSVPiINnoKHGGGQSrXe5Gbjp2BFxjeAjzvQutFk6kvESNMv/11iqP/Va7ZeCvW -/AoyVESdFwSdPcqoJdPLJmn9Wc1Q9Z2UU8Lkgiigqm0aZQPVl9nd2pJAf6xKet74 -cvq/4rHUwiBJmxjPenKa7cHlScAMQSpG0NMhrWjlnYuMn8a0HAhzhp+4Tlm9coKF -yGUXviOuU3VWT0of9EfCBENG2AsC1FoGa4fNJc48xkWBHoWJQ4ur2uBhhpef7bMI -Mf/rNkGcsqbBJ5b04hrDnZ4hGr8Ynjah6PJ9rsVq5+V16umu7lk= -=tvi+ ------END PGP SIGNATURE----- diff --git a/thunderbird-91.2.0.source.tar.xz b/thunderbird-91.2.0.source.tar.xz new file mode 100644 index 0000000..3afbdc9 --- /dev/null +++ b/thunderbird-91.2.0.source.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30476803f0bd4a46d2516ac5cbb831fc580b81d5d704af17c7df81e2bb6ee075 +size 403836192 diff --git a/thunderbird-91.2.0.source.tar.xz.asc b/thunderbird-91.2.0.source.tar.xz.asc new file mode 100644 index 0000000..1e11ebf --- /dev/null +++ b/thunderbird-91.2.0.source.tar.xz.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEQ2D+IQnEl2MYb44h6+QekPbxL20FAmFbNVsACgkQ6+QekPbx +L22tnA//dFdV39Q3JTn1bOPpNPQ50W3iXYx3BRldWBRCX3bQHvP9zdxLZfiLPjoL +zFaVHd1Fx5CdD4nH/8jbZ5PeOTIa2mcdUJWqEshGKCymBTTuFPQG4l0BGrn5JvXX +bMh8dVdeFHSMcu0MwZYGFDfESEpsJLl2SO3LsK8HAKxMsXOywzb11QZmQ48OXACu +w5LyROCXgPBJaIQ2Fq6CW4geC2c3TBTMyqJ8rWWgqm4KIfflUCaVKCpDbn9wyMQp +kEW/t6D4bB7yE7rcCqmjACZhMELEFHqSuwW70OvGu1ifp9Xr6sojDzPzA+TJtF3W +iM3Vyvs0CU3BsvRDcaLZDBkfryfP9leCTUsNDaD2JeF3twl1tngAIhCnyG0O3E/c +smoAyNzUOy0mhzeFs9l0f2cH5xukKafczlWurdVwoueEDCwGeUxcU7ZLQcaXOKTD +fwLMKwq3/twmIMITw9TF+2obmrTUXp/sL65CmCH+hjvpcsmVsFIbTzOehu6OzZMS +4AA8Ur+gVyNdMFzk0n0uHl/QXqV3F7bXEgHsUC39H3IY2z6CcnV5F27TREM4gdTS +mDu2lx0uGqqGUDF/lk4knzcestAeEdj/ABUXrLOU0p/0PFC+JpMIqRoC2UDwK4gs +tIOB6CKDxnSZIPunfXTM8IxTpyVeuyLHNqfQrcJzaJbz8fUCK3k= +=o6xJ +-----END PGP SIGNATURE-----