diff options
author | 2017-05-08 15:16:45 -0400 | |
---|---|---|
committer | 2017-05-08 19:56:27 +0000 | |
commit | 83b1b3db36e8622f4bbc8c391d5c714e258d1e03 (patch) | |
tree | 95c4bf6e53bc73f90373fa06dbf6afa8298420e5 /src/gpu/GrResourceCache.cpp | |
parent | aef837a542cd91fba46bc0b3d4571a598710b90e (diff) |
Added SkImage::MakeCrossContextFromEncoded
Designed for Flutter's threading architecture, with
an eye to being useful to other clients. Under the
hood, uses a new image generator class to lazily wrap
a texture for multiple GrContexts.
Bug: skia:
Change-Id: I6c37b12c8ab5bce94b91190e5f0beb91d31ae81b
Reviewed-on: https://skia-review.googlesource.com/14180
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/gpu/GrResourceCache.cpp')
-rw-r--r-- | src/gpu/GrResourceCache.cpp | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/gpu/GrResourceCache.cpp b/src/gpu/GrResourceCache.cpp index e3373b27f9..3d1b9521ee 100644 --- a/src/gpu/GrResourceCache.cpp +++ b/src/gpu/GrResourceCache.cpp @@ -18,6 +18,8 @@ DECLARE_SKMESSAGEBUS_MESSAGE(GrUniqueKeyInvalidatedMessage); +DECLARE_SKMESSAGEBUS_MESSAGE(GrGpuResourceFreedMessage); + ////////////////////////////////////////////////////////////////////////////// GrScratchKey::ResourceType GrScratchKey::GenerateResourceType() { @@ -59,7 +61,7 @@ private: ////////////////////////////////////////////////////////////////////////////// -GrResourceCache::GrResourceCache(const GrCaps* caps) +GrResourceCache::GrResourceCache(const GrCaps* caps, uint32_t contextUniqueID) : fTimestamp(0) , fMaxCount(kDefaultMaxCount) , fMaxBytes(kDefaultMaxSize) @@ -75,6 +77,7 @@ GrResourceCache::GrResourceCache(const GrCaps* caps) , fBudgetedBytes(0) , fRequestFlush(false) , fExternalFlushCnt(0) + , fContextUniqueID(contextUniqueID) , fPreferVRAMUseOverFlushes(caps->preferVRAMUseOverFlushes()) { SkDEBUGCODE(fCount = 0;) SkDEBUGCODE(fNewlyPurgeableResourceForValidation = nullptr;) @@ -450,6 +453,12 @@ void GrResourceCache::purgeAsNeeded() { this->processInvalidUniqueKeys(invalidKeyMsgs); } + SkTArray<GrGpuResourceFreedMessage> freedGpuResourceMsgs; + fFreedGpuResourceInbox.poll(&freedGpuResourceMsgs); + if (freedGpuResourceMsgs.count()) { + this->processFreedGpuResources(freedGpuResourceMsgs); + } + if (fMaxUnusedFlushes > 0) { // We want to know how many complete flushes have occurred without the resource being used. // If the resource was tagged when fExternalFlushCnt was N then this means it became @@ -534,6 +543,18 @@ void GrResourceCache::processInvalidUniqueKeys( } } +void GrResourceCache::insertCrossContextGpuResource(GrGpuResource* resource) { + resource->ref(); +} + +void GrResourceCache::processFreedGpuResources(const SkTArray<GrGpuResourceFreedMessage>& msgs) { + for (int i = 0; i < msgs.count(); ++i) { + if (msgs[i].fOwningUniqueID == fContextUniqueID) { + msgs[i].fResource->unref(); + } + } +} + void GrResourceCache::addToNonpurgeableArray(GrGpuResource* resource) { int index = fNonpurgeableResources.count(); *fNonpurgeableResources.append() = resource; |