Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(759)

Unified Diff: src/pipe/SkGPipeWrite.cpp

Issue 1145893007: Fixing leaky handling of SkImage in SkDeferredCanvas. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: reed feedback Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/pipe/SkGPipePriv.h ('k') | src/utils/SkDeferredCanvas.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/pipe/SkGPipeWrite.cpp
diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp
index 2e73be83f11231d9602b0127c55be35ea48763be..a8a21141ac4942e966178d5f7ec4235b37324517 100644
--- a/src/pipe/SkGPipeWrite.cpp
+++ b/src/pipe/SkGPipeWrite.cpp
@@ -228,7 +228,14 @@ public:
size_t freeMemoryIfPossible(size_t bytesToFree);
size_t storageAllocatedForRecording() {
- return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->bytesAllocated();
+ size_t bytesAllocated = 0;
+ if (NULL != fBitmapHeap) {
+ bytesAllocated += fBitmapHeap->bytesAllocated();
+ }
+ if (NULL != fImageHeap) {
+ bytesAllocated += fImageHeap->bytesInCache();
+ }
+ return bytesAllocated;
}
void beginCommentGroup(const char* description) override;
@@ -241,6 +248,8 @@ public:
*/
bool shuttleBitmap(const SkBitmap&, int32_t slot);
+ void resetImageHeap();
+
protected:
void willSave() override;
SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) override;
@@ -1157,6 +1166,12 @@ void SkGPipeCanvas::flushRecording(bool detachCurrentBlock) {
}
}
+void SkGPipeCanvas::resetImageHeap() {
+ if (fImageHeap) {
+ fImageHeap->reset();
+ }
+}
+
size_t SkGPipeCanvas::freeMemoryIfPossible(size_t bytesToFree) {
return (NULL == fBitmapHeap) ? 0 : fBitmapHeap->freeMemoryIfPossible(bytesToFree);
}
@@ -1320,6 +1335,14 @@ void SkGPipeController::setCanvas(SkGPipeCanvas* canvas) {
SkRefCnt_SafeAssign(fCanvas, canvas);
}
+void SkGPipeController::purgeCaches()
+{
+ fCanvas->resetImageHeap();
+ // Other caches are self-purging with a small MRU pool
+ // We could purge them as well, but it is not clear whether
+ // that would be a win.
+}
+
///////////////////////////////////////////////////////////////////////////////
SkGPipeWriter::SkGPipeWriter()
@@ -1393,12 +1416,18 @@ void BitmapShuttle::removeCanvas() {
///////////////////////////////////////////////////////////////////////////////////////////////////
-SkImageHeap::SkImageHeap() {}
+SkImageHeap::SkImageHeap() : fBytesInCache (0) {}
SkImageHeap::~SkImageHeap() {
fArray.unrefAll();
}
+void SkImageHeap::reset() {
+ fArray.unrefAll();
+ fArray.rewind();
+ fBytesInCache = 0;
+}
+
const SkImage* SkImageHeap::get(int32_t slot) const {
SkASSERT(slot > 0);
return fArray[slot - 1];
@@ -1417,7 +1446,10 @@ int32_t SkImageHeap::insert(const SkImage* img) {
if (slot) {
return slot;
}
+ // TODO: SkImage does not expose bytes per pixel, 4 is just a best guess.
+ fBytesInCache += img->width() * img->height() * 4;
*fArray.append() = SkRef(img);
+ printf("Images reff'ed: %d \n", fArray.count());
reed1 2015/06/04 13:20:39 EEEEK!
return fArray.count(); // slot is always index+1
}
« no previous file with comments | « src/pipe/SkGPipePriv.h ('k') | src/utils/SkDeferredCanvas.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698