Send TextBlobCache purge messages only to owning cache.
Bug: 703297
Change-Id: I95cdaa5bdebadd5ce88ae3ee468c59baa08353c6
Reviewed-on: https://skia-review.googlesource.com/85046
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
diff --git a/src/core/SkTextBlob.cpp b/src/core/SkTextBlob.cpp
index f778c68..1f02476 100644
--- a/src/core/SkTextBlob.cpp
+++ b/src/core/SkTextBlob.cpp
@@ -308,12 +308,12 @@
SkTextBlob::SkTextBlob(const SkRect& bounds)
: fBounds(bounds)
, fUniqueID(next_id())
- , fAddedToCache(false) {}
+ , fCacheID(SK_InvalidUniqueID) {}
SkTextBlob::~SkTextBlob() {
#if SK_SUPPORT_GPU
- if (fAddedToCache.load()) {
- GrTextBlobCache::PostPurgeBlobMessage(fUniqueID);
+ if (SK_InvalidUniqueID != fCacheID.load()) {
+ GrTextBlobCache::PostPurgeBlobMessage(fUniqueID, fCacheID);
}
#endif
diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp
index 50ed2cf..c410874 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -258,7 +258,7 @@
allowMultitexturing);
this->contextPriv().addOnFlushCallbackObject(fAtlasGlyphCache);
- fTextBlobCache.reset(new GrTextBlobCache(TextBlobCacheOverBudgetCB, this));
+ fTextBlobCache.reset(new GrTextBlobCache(TextBlobCacheOverBudgetCB, this, this->uniqueID()));
if (options.fExecutor) {
fTaskGroup = skstd::make_unique<SkTaskGroup>(*options.fExecutor);
diff --git a/src/gpu/text/GrTextBlobCache.cpp b/src/gpu/text/GrTextBlobCache.cpp
index f90ed99..64941ef 100644
--- a/src/gpu/text/GrTextBlobCache.cpp
+++ b/src/gpu/text/GrTextBlobCache.cpp
@@ -27,9 +27,9 @@
SkASSERT(fBlobList.isEmpty());
}
-void GrTextBlobCache::PostPurgeBlobMessage(uint32_t id) {
- SkASSERT(id != SK_InvalidGenID);
- SkMessageBus<PurgeBlobMessage>::Post(PurgeBlobMessage({id}));
+void GrTextBlobCache::PostPurgeBlobMessage(uint32_t blobID, uint32_t cacheID) {
+ SkASSERT(blobID != SK_InvalidGenID);
+ SkMessageBus<PurgeBlobMessage>::Post(PurgeBlobMessage({blobID}), cacheID);
}
void GrTextBlobCache::purgeStaleBlobs() {
diff --git a/src/gpu/text/GrTextBlobCache.h b/src/gpu/text/GrTextBlobCache.h
index dc7e4c5..ac15124 100644
--- a/src/gpu/text/GrTextBlobCache.h
+++ b/src/gpu/text/GrTextBlobCache.h
@@ -23,11 +23,13 @@
*/
typedef void (*PFOverBudgetCB)(void* data);
- GrTextBlobCache(PFOverBudgetCB cb, void* data)
+ GrTextBlobCache(PFOverBudgetCB cb, void* data, uint32_t uniqueID)
: fPool(0u, kMinGrowthSize)
, fCallback(cb)
, fData(data)
- , fBudget(kDefaultBudget) {
+ , fBudget(kDefaultBudget)
+ , fUniqueID(uniqueID)
+ , fPurgeBlobInbox(uniqueID) {
SkASSERT(cb && data);
}
~GrTextBlobCache();
@@ -51,7 +53,7 @@
sk_sp<GrAtlasTextBlob> cacheBlob(this->makeBlob(blob));
cacheBlob->setupKey(key, blurRec, paint);
this->add(cacheBlob);
- blob->notifyAddedToCache();
+ blob->notifyAddedToCache(fUniqueID);
return cacheBlob;
}
@@ -100,7 +102,7 @@
uint32_t fID;
};
- static void PostPurgeBlobMessage(uint32_t);
+ static void PostPurgeBlobMessage(uint32_t blobID, uint32_t cacheID);
void purgeStaleBlobs();
@@ -178,6 +180,7 @@
PFOverBudgetCB fCallback;
void* fData;
size_t fBudget;
+ uint32_t fUniqueID; // unique id to use for messaging
SkMessageBus<PurgeBlobMessage>::Inbox fPurgeBlobInbox;
};