From d4b678751117983dc92a85a3879445bd8aa33ffb Mon Sep 17 00:00:00 2001 From: Christopher Cameron Date: Thu, 13 Jul 2017 15:18:08 -0700 Subject: Make SkImage_Lazy cache its result from onMakeColorSpace May sites will all onMakeColorSpace every frame, resulting repeatedly re-created new SkImage_Lazy class instances, new cache keys, and repeated cache misses. Save the most recent result from onMakeColorSpace, to avoid this thrash. Bug:741607 Change-Id: I34091327a17275722f82ed372eb0b341806a9ddc Reviewed-on: https://skia-review.googlesource.com/23287 Reviewed-by: Florin Malita Commit-Queue: Mike Reed --- src/image/SkImage_Lazy.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/image/SkImage_Lazy.cpp b/src/image/SkImage_Lazy.cpp index 809ada01f6..e760d036a2 100644 --- a/src/image/SkImage_Lazy.cpp +++ b/src/image/SkImage_Lazy.cpp @@ -159,6 +159,12 @@ private: uint32_t getUniqueID(CachedFormat) const; + // Repeated calls to onMakeColorSpace will result in a proliferation of unique IDs and + // SkImage_Lazy instances. Cache the result of the last successful onMakeColorSpace call. + mutable SkMutex fOnMakeColorSpaceMutex; + mutable sk_sp fOnMakeColorSpaceTarget; + mutable sk_sp fOnMakeColorSpaceResult; + typedef SkImage_Base INHERITED; }; @@ -649,10 +655,20 @@ sk_sp SkImage_Lazy::onMakeSubset(const SkIRect& subset) const { sk_sp SkImage_Lazy::onMakeColorSpace(sk_sp target, SkColorType targetColorType, SkTransferFunctionBehavior premulBehavior) const { + SkAutoExclusive autoAquire(fOnMakeColorSpaceMutex); + if (target && fOnMakeColorSpaceTarget && + SkColorSpace::Equals(target.get(), fOnMakeColorSpaceTarget.get())) { + return fOnMakeColorSpaceResult; + } const SkIRect generatorSubset = SkIRect::MakeXYWH(fOrigin.x(), fOrigin.y(), fInfo.width(), fInfo.height()); Validator validator(fSharedGenerator, &generatorSubset, target); - return validator ? sk_sp(new SkImage_Lazy(&validator)) : nullptr; + sk_sp result = validator ? sk_sp(new SkImage_Lazy(&validator)) : nullptr; + if (result) { + fOnMakeColorSpaceTarget = target; + fOnMakeColorSpaceResult = result; + } + return result; } sk_sp SkImage::MakeFromGenerator(std::unique_ptr generator, -- cgit v1.2.3