[Cocoa] Make decoded image data purgeable ASAP.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Feb 2015 21:25:24 +0000 (21:25 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 2 Feb 2015 21:25:24 +0000 (21:25 +0000)
<https://webkit.org/b/140298>
<rdar://problem/19623377>

Reviewed by Antti Koivisto.

Re-landing this patch since it turned out to not be the cause of
the memory regression we saw around that revision.

Mark decoded images as "transient" which makes CoreGraphics mark
the backing stores as purgeable shortly after they're used.

The decoded representation will remain in CoreGraphics's caches
indefinitely unless the kernel gets starved and needs the pages.

Most resources will now reach a state where the encoded data is
mmap'ed from disk cache (once the entire resource is downloaded)
and the decoded data is purgeable.

This also has the side effect of making the MemoryCache more
palatial since the decoded data cost can be deducted for images,
allowing us to cache more resources.

Note that the worst case for this new behavior would be something
like hovering below 100% memory utilization and constantly having
to drop and re-decode images. While churny, it still beats
crashing the process, plus there's tiling to remove many of the
reasons we'd need the decoded data.

* platform/graphics/cg/ImageSourceCG.cpp:
(WebCore::ImageSource::createFrameAtIndex):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@179494 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/cg/ImageSourceCG.cpp

index 3d9b821..baf3d15 100644 (file)
@@ -1,3 +1,37 @@
+2015-02-02  Andreas Kling  <akling@apple.com>
+
+        [Cocoa] Make decoded image data purgeable ASAP.
+        <https://webkit.org/b/140298>
+        <rdar://problem/19623377>
+
+        Reviewed by Antti Koivisto.
+
+        Re-landing this patch since it turned out to not be the cause of
+        the memory regression we saw around that revision.
+
+        Mark decoded images as "transient" which makes CoreGraphics mark
+        the backing stores as purgeable shortly after they're used.
+
+        The decoded representation will remain in CoreGraphics's caches
+        indefinitely unless the kernel gets starved and needs the pages.
+
+        Most resources will now reach a state where the encoded data is
+        mmap'ed from disk cache (once the entire resource is downloaded)
+        and the decoded data is purgeable.
+
+        This also has the side effect of making the MemoryCache more
+        palatial since the decoded data cost can be deducted for images,
+        allowing us to cache more resources.
+
+        Note that the worst case for this new behavior would be something
+        like hovering below 100% memory utilization and constantly having
+        to drop and re-decode images. While churny, it still beats
+        crashing the process, plus there's tiling to remove many of the
+        reasons we'd need the decoded data.
+
+        * platform/graphics/cg/ImageSourceCG.cpp:
+        (WebCore::ImageSource::createFrameAtIndex):
+
 2015-02-02  Joseph Pecoraro  <pecoraro@apple.com>
 
         Web Inspector: Support console.table
index 953faea..f016d16 100644 (file)
@@ -347,20 +347,7 @@ CGImageRef ImageSource::createFrameAtIndex(size_t index, SubsamplingLevel subsam
 
     RetainPtr<CGImageRef> image = adoptCF(CGImageSourceCreateImageAtIndex(m_decoder, index, imageSourceOptions(subsamplingLevel).get()));
 
-#if PLATFORM(IOS)
-    // <rdar://problem/7371198> - CoreGraphics changed the default caching behaviour in iOS 4.0 to kCGImageCachingTransient
-    // which caused a performance regression for us since the images had to be resampled/recreated every time we called
-    // CGContextDrawImage. We now tell CG to cache the drawn images. See also <rdar://problem/14366755> -
-    // CoreGraphics needs to un-deprecate kCGImageCachingTemporary since it's still not the default.
-#if COMPILER(CLANG)
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-#endif
-    CGImageSetCachingFlags(image.get(), kCGImageCachingTemporary);
-#if COMPILER(CLANG)
-#pragma clang diagnostic pop
-#endif
-#endif // PLATFORM(IOS)
+    CGImageSetCachingFlags(image.get(), kCGImageCachingTransient);
 
     CFStringRef imageUTI = CGImageSourceGetType(m_decoder);
     static const CFStringRef xbmUTI = CFSTR("public.xbitmap-image");
@@ -368,13 +355,6 @@ CGImageRef ImageSource::createFrameAtIndex(size_t index, SubsamplingLevel subsam
     if (!imageUTI)
         return image.leakRef();
 
-#if PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101000
-    if (CFEqual(imageUTI, kUTTypeGIF)) {
-        CGImageSetCachingFlags(image.get(), kCGImageCachingTransient);
-        return image.leakRef();
-    }
-#endif
-
     if (!CFEqual(imageUTI, xbmUTI))
         return image.leakRef();