Detect discarded SkPictureShader pixel refs.
authorfmalita <fmalita@chromium.org>
Wed, 10 Dec 2014 20:17:58 +0000 (12:17 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 10 Dec 2014 20:17:58 +0000 (12:17 -0800)
This doesn't address the more general problem, but reduces the race
window significantly.

BUG=440282
R=reed@google.com

Review URL: https://codereview.chromium.org/787043006

src/core/SkPictureShader.cpp

index 198a2a9..fb05597 100644 (file)
@@ -77,7 +77,14 @@ struct BitmapShaderRec : public SkResourceCache::Rec {
         SkAutoTUnref<SkShader>* result = reinterpret_cast<SkAutoTUnref<SkShader>*>(contextShader);
 
         result->reset(SkRef(rec.fShader.get()));
-        return true;
+
+        SkBitmap tile;
+        rec.fShader.get()->asABitmap(&tile, NULL, NULL);
+        // FIXME: this doesn't protect the pixels from being discarded as soon as we unlock.
+        // Should be handled via a pixel ref generator instead
+        // (https://code.google.com/p/skia/issues/detail?id=3220).
+        SkAutoLockPixels alp(tile, true);
+        return tile.getPixels() != NULL;
     }
 };