aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkTextBlob.h10
-rw-r--r--include/private/SkMessageBus.h17
-rw-r--r--include/private/SkTArray.h2
-rw-r--r--src/core/SkTextBlob.cpp6
-rw-r--r--src/gpu/GrContext.cpp2
-rw-r--r--src/gpu/text/GrTextBlobCache.cpp6
-rw-r--r--src/gpu/text/GrTextBlobCache.h11
7 files changed, 31 insertions, 23 deletions
diff --git a/include/core/SkTextBlob.h b/include/core/SkTextBlob.h
index 228747a1c8..b27ec87773 100644
--- a/include/core/SkTextBlob.h
+++ b/include/core/SkTextBlob.h
@@ -98,17 +98,17 @@ private:
// Call when this blob is part of the key to a cache entry. This allows the cache
// to know automatically those entries can be purged when this SkTextBlob is deleted.
- void notifyAddedToCache() const {
- fAddedToCache.store(true);
+ void notifyAddedToCache(uint32_t cacheID) const {
+ fCacheID.store(cacheID);
}
friend class GrTextBlobCache;
friend class SkTextBlobBuilder;
friend class SkTextBlobRunIterator;
- const SkRect fBounds;
- const uint32_t fUniqueID;
- mutable SkAtomic<bool> fAddedToCache;
+ const SkRect fBounds;
+ const uint32_t fUniqueID;
+ mutable SkAtomic<uint32_t> fCacheID;
SkDEBUGCODE(size_t fStorageSize;)
diff --git a/include/private/SkMessageBus.h b/include/private/SkMessageBus.h
index 79f5c026dc..6ddf82c446 100644
--- a/include/private/SkMessageBus.h
+++ b/include/private/SkMessageBus.h
@@ -17,12 +17,14 @@
template <typename Message>
class SkMessageBus : SkNoncopyable {
public:
- // Post a message to be received by all Inboxes for this Message type. Threadsafe.
- static void Post(const Message& m);
+ // Post a message to be received by Inboxes for this Message type. Threadsafe.
+ // If id is SK_InvalidUniqueID then it will be sent to all inboxes.
+ // Otherwise it will be sent to the inbox with that id.
+ static void Post(const Message& m, uint32_t destID = SK_InvalidUniqueID);
class Inbox {
public:
- Inbox();
+ Inbox(uint32_t uniqueID = SK_InvalidUniqueID);
~Inbox();
// Overwrite out with all the messages we've received since the last call. Threadsafe.
@@ -31,6 +33,7 @@ public:
private:
SkTArray<Message> fMessages;
SkMutex fMessagesMutex;
+ uint32_t fUniqueID;
friend class SkMessageBus;
void receive(const Message& m); // SkMessageBus is a friend only to call this.
@@ -58,7 +61,7 @@ private:
// ----------------------- Implementation of SkMessageBus::Inbox -----------------------
template<typename Message>
-SkMessageBus<Message>::Inbox::Inbox() {
+SkMessageBus<Message>::Inbox::Inbox(uint32_t uniqueID) : fUniqueID(uniqueID) {
// Register ourselves with the corresponding message bus.
SkMessageBus<Message>* bus = SkMessageBus<Message>::Get();
SkAutoMutexAcquire lock(bus->fInboxesMutex);
@@ -99,11 +102,13 @@ template <typename Message>
SkMessageBus<Message>::SkMessageBus() {}
template <typename Message>
-/*static*/ void SkMessageBus<Message>::Post(const Message& m) {
+/*static*/ void SkMessageBus<Message>::Post(const Message& m, uint32_t destID) {
SkMessageBus<Message>* bus = SkMessageBus<Message>::Get();
SkAutoMutexAcquire lock(bus->fInboxesMutex);
for (int i = 0; i < bus->fInboxes.count(); i++) {
- bus->fInboxes[i]->receive(m);
+ if (SK_InvalidUniqueID == destID || bus->fInboxes[i]->fUniqueID == destID) {
+ bus->fInboxes[i]->receive(m);
+ }
}
}
diff --git a/include/private/SkTArray.h b/include/private/SkTArray.h
index 9e0b954fbf..3f4cc429b4 100644
--- a/include/private/SkTArray.h
+++ b/include/private/SkTArray.h
@@ -441,7 +441,7 @@ private:
if (!count && !reserveCount) {
fAllocCount = 0;
fMemArray = nullptr;
- fOwnMemory = false;
+ fOwnMemory = true;
fReserved = false;
} else {
fAllocCount = SkTMax(count, SkTMax(kMinHeapAllocCount, reserveCount));
diff --git a/src/core/SkTextBlob.cpp b/src/core/SkTextBlob.cpp
index f778c68f13..1f024766f1 100644
--- a/src/core/SkTextBlob.cpp
+++ b/src/core/SkTextBlob.cpp
@@ -308,12 +308,12 @@ static int32_t next_id() {
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 50ed2cfcf2..c410874fd9 100644
--- a/src/gpu/GrContext.cpp
+++ b/src/gpu/GrContext.cpp
@@ -258,7 +258,7 @@ bool GrContext::init(const GrContextOptions& options) {
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 f90ed9937c..64941efc96 100644
--- a/src/gpu/text/GrTextBlobCache.cpp
+++ b/src/gpu/text/GrTextBlobCache.cpp
@@ -27,9 +27,9 @@ void GrTextBlobCache::freeAll() {
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 dc7e4c5844..ac15124937 100644
--- a/src/gpu/text/GrTextBlobCache.h
+++ b/src/gpu/text/GrTextBlobCache.h
@@ -23,11 +23,13 @@ public:
*/
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 @@ public:
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 @@ public:
uint32_t fID;
};
- static void PostPurgeBlobMessage(uint32_t);
+ static void PostPurgeBlobMessage(uint32_t blobID, uint32_t cacheID);
void purgeStaleBlobs();
@@ -178,6 +180,7 @@ private:
PFOverBudgetCB fCallback;
void* fData;
size_t fBudget;
+ uint32_t fUniqueID; // unique id to use for messaging
SkMessageBus<PurgeBlobMessage>::Inbox fPurgeBlobInbox;
};