GrCCPathCache::~GrCCPathCache() { while (!fLRU.isEmpty()) { this->evict(*fLRU.tail()->fCacheKey, fLRU.tail()); } SkASSERT(0 == fHashTable.count()); // Ensure the hash table and LRU list were coherent. // Now take all the atlas textures we just invalidated and purge them from the GrResourceCache. // We just purge via message bus since we don't have any access to the resource cache right now. for (sk_sp<GrTextureProxy>& proxy : fInvalidatedProxies) { SkMessageBus<GrUniqueKeyInvalidatedMessage>::Post( GrUniqueKeyInvalidatedMessage(proxy->getUniqueKey(), fContextUniqueID)); } for (const GrUniqueKey& key : fInvalidatedProxyUniqueKeys) { SkMessageBus<GrUniqueKeyInvalidatedMessage>::Post( GrUniqueKeyInvalidatedMessage(key, fContextUniqueID)); } }
// Test if invalidating unique ids prior to instantiating operates as expected static void invalidation_and_instantiation_test(GrContext* context, skiatest::Reporter* reporter) { GrProxyProvider* proxyProvider = context->priv().proxyProvider(); GrResourceProvider* resourceProvider = context->priv().resourceProvider(); GrResourceCache* cache = context->priv().getResourceCache(); REPORTER_ASSERT(reporter, 0 == cache->getResourceCount()); static GrUniqueKey::Domain d = GrUniqueKey::GenerateDomain(); GrUniqueKey key; GrUniqueKey::Builder builder(&key, d, 1, nullptr); builder[0] = 0; builder.finish(); // Create proxy, assign unique key sk_sp<GrTextureProxy> proxy = deferred_tex(reporter, context, proxyProvider, SkBackingFit::kExact); SkAssertResult(proxyProvider->assignUniqueKeyToProxy(key, proxy.get())); // Send an invalidation message, which will be sitting in the cache's inbox SkMessageBus<GrUniqueKeyInvalidatedMessage>::Post( GrUniqueKeyInvalidatedMessage(key, context->priv().contextID())); REPORTER_ASSERT(reporter, 1 == proxyProvider->numUniqueKeyProxies_TestOnly()); REPORTER_ASSERT(reporter, 0 == cache->getResourceCount()); // Instantiate the proxy. This will trigger the message to be processed, so the resulting // texture should *not* have the unique key on it! SkAssertResult(proxy->instantiate(resourceProvider)); REPORTER_ASSERT(reporter, !proxy->getUniqueKey().isValid()); REPORTER_ASSERT(reporter, !proxy->peekTexture()->getUniqueKey().isValid()); REPORTER_ASSERT(reporter, 0 == proxyProvider->numUniqueKeyProxies_TestOnly()); REPORTER_ASSERT(reporter, 1 == cache->getResourceCount()); proxy = nullptr; context->priv().testingOnly_purgeAllUnlockedResources(); REPORTER_ASSERT(reporter, 0 == proxyProvider->numUniqueKeyProxies_TestOnly()); REPORTER_ASSERT(reporter, 0 == cache->getResourceCount()); }