Index: tests/ResourceCacheTest.cpp |
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp |
index 2827cbfd6dc0627e6a953a4eb9bec47ea4d71770..24ecb949ca91a7034a0823968891ae3b355f0679 100644 |
--- a/tests/ResourceCacheTest.cpp |
+++ b/tests/ResourceCacheTest.cpp |
@@ -65,11 +65,21 @@ class TestResource : public GrGpuResource { |
public: |
SK_DECLARE_INST_COUNT(TestResource); |
- TestResource(GrGpu* gpu, size_t size = kDefaultSize) |
+ TestResource(GrGpu* gpu) |
: INHERITED(gpu, false) |
, fCache(NULL) |
, fToDelete(NULL) |
- , fSize(size) { |
+ , fSize(kDefaultSize) { |
+ ++fNumAlive; |
+ this->registerWithCache(); |
+ } |
+ |
+ TestResource(GrGpu* gpu, const GrResourceKey& scratchKey) |
+ : INHERITED(gpu, false) |
+ , fCache(NULL) |
+ , fToDelete(NULL) |
+ , fSize(kDefaultSize) { |
+ this->setScratchKey(scratchKey); |
++fNumAlive; |
this->registerWithCache(); |
} |
@@ -108,52 +118,189 @@ private: |
}; |
int TestResource::fNumAlive = 0; |
-static void test_purge_invalidated(skiatest::Reporter* reporter, GrContext* context) { |
+static void test_duplicate_scratch_key(skiatest::Reporter* reporter) { |
+ SkAutoTUnref<GrContext> context(GrContext::CreateMockContext()); |
+ REPORTER_ASSERT(reporter, SkToBool(context)); |
+ if (NULL == context) { |
+ return; |
+ } |
+ context->setResourceCacheLimits(5, 30000); |
+ GrResourceCache* cache = context->getResourceCache(); |
+ SkDEBUGCODE(GrResourceCache2* cache2 = context->getResourceCache2();) |
+ cache->purgeAllUnlocked(); |
+ SkASSERT(0 == cache->getCachedResourceCount() && 0 == cache->getCachedResourceBytes()); |
+ |
+ GrCacheID::Key keyData; |
+ GrCacheID::Domain domain = GrResourceKey::ScratchDomain(); |
+ GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType(); |
+ GrResourceKey scratchKey(GrCacheID(domain, keyData), t, 0); |
+ |
+ // Create two resources that have the same scratch key. |
+ TestResource* a = new TestResource(context->getGpu(), scratchKey); |
+ TestResource* b = new TestResource(context->getGpu(), scratchKey); |
+ a->setSize(11); |
+ b->setSize(12); |
+ // Scratch resources are registered with GrResourceCache2 just by existing. There are 2. |
+ SkDEBUGCODE(REPORTER_ASSERT(reporter, 2 == cache2->countScratchEntriesForKey(scratchKey));) |
+ |
+ REPORTER_ASSERT(reporter, cache->addResource(scratchKey, a)); |
+ |
+ SkDEBUGCODE(REPORTER_ASSERT(reporter, 2 == cache2->countScratchEntriesForKey(scratchKey));) |
+ |
+ // Can't add the same resource twice. |
+ REPORTER_ASSERT(reporter, !cache->addResource(scratchKey, a)); |
+ REPORTER_ASSERT(reporter, 1 == cache->getCachedResourceCount()); |
+ REPORTER_ASSERT(reporter, a->gpuMemorySize() == cache->getCachedResourceBytes()); |
+ SkDEBUGCODE(REPORTER_ASSERT(reporter, 2 == cache2->countScratchEntriesForKey(scratchKey));) |
+ |
+ // Add a second with the same key. |
+ REPORTER_ASSERT(reporter, cache->addResource(scratchKey, b)); |
+ REPORTER_ASSERT(reporter, 2 == cache->getCachedResourceCount()); |
+ REPORTER_ASSERT(reporter, a->gpuMemorySize() + b->gpuMemorySize() == |
+ cache->getCachedResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
+ SkDEBUGCODE(REPORTER_ASSERT(reporter, 2 == cache2->countScratchEntriesForKey(scratchKey));) |
+ |
+ // Our refs mean that the resources are non purgable. |
+ cache->purgeAllUnlocked(); |
+ REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
+ REPORTER_ASSERT(reporter, 2 == cache->getCachedResourceCount()); |
+ |
+ // Unref but don't purge |
+ a->unref(); |
+ b->unref(); |
+ REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
+ SkDEBUGCODE(REPORTER_ASSERT(reporter, 2 == cache2->countScratchEntriesForKey(scratchKey));) |
+ |
+ // Purge again. This time resources should be purgable. |
+ cache->purgeAllUnlocked(); |
+ REPORTER_ASSERT(reporter, 0 == TestResource::NumAlive()); |
+ REPORTER_ASSERT(reporter, 0 == cache->getCachedResourceCount()); |
+ SkDEBUGCODE(REPORTER_ASSERT(reporter, 0 == cache2->countScratchEntriesForKey(scratchKey));) |
+} |
+ |
+static void test_duplicate_content_key(skiatest::Reporter* reporter) { |
+ SkAutoTUnref<GrContext> context(GrContext::CreateMockContext()); |
+ REPORTER_ASSERT(reporter, SkToBool(context)); |
+ if (NULL == context) { |
+ return; |
+ } |
+ context->setResourceCacheLimits(5, 30000); |
+ GrResourceCache* cache = context->getResourceCache(); |
+ cache->purgeAllUnlocked(); |
+ SkASSERT(0 == cache->getCachedResourceCount() && 0 == cache->getCachedResourceBytes()); |
+ |
GrCacheID::Domain domain = GrCacheID::GenerateDomain(); |
GrCacheID::Key keyData; |
- keyData.fData64[0] = 5; |
- keyData.fData64[1] = 18; |
+ memset(&keyData, 0, sizeof(keyData)); |
GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType(); |
GrResourceKey key(GrCacheID(domain, keyData), t, 0); |
+ |
+ // Create two resources that we will attempt to register with the same content key. |
+ TestResource* a = new TestResource(context->getGpu()); |
+ TestResource* b = new TestResource(context->getGpu()); |
+ a->setSize(11); |
+ b->setSize(12); |
+ REPORTER_ASSERT(reporter, cache->addResource(key, a)); |
+ // Can't add the same or another resource with the same key. |
+ REPORTER_ASSERT(reporter, !cache->addResource(key, a)); |
+ REPORTER_ASSERT(reporter, !cache->addResource(key, b)); |
+ REPORTER_ASSERT(reporter, 1 == cache->getCachedResourceCount()); |
+ REPORTER_ASSERT(reporter, a->gpuMemorySize() == cache->getCachedResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
+ |
+ b->unref(); |
+ cache->purgeAllUnlocked(); |
+ a->setSize(10); |
+ REPORTER_ASSERT(reporter, 1 == cache->getCachedResourceCount()); |
+ REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive()); |
+ |
+ a->unref(); |
+ cache->purgeAllUnlocked(); |
+ REPORTER_ASSERT(reporter, 0 == cache->getCachedResourceCount()); |
+ REPORTER_ASSERT(reporter, 0 == cache->getCachedResourceBytes()); |
+ REPORTER_ASSERT(reporter, 0 == TestResource::NumAlive()); |
+} |
+ |
+static void test_purge_invalidated(skiatest::Reporter* reporter) { |
+ SkAutoTUnref<GrContext> context(GrContext::CreateMockContext()); |
+ REPORTER_ASSERT(reporter, SkToBool(context)); |
+ if (NULL == context) { |
+ return; |
+ } |
+ |
+ GrCacheID::Domain domain = GrCacheID::GenerateDomain(); |
+ GrCacheID::Key keyData; |
+ memset(&keyData, 0, sizeof(keyData)); |
+ |
+ GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType(); |
+ |
+ keyData.fData64[0] = 1; |
+ GrResourceKey key1(GrCacheID(domain, keyData), t, 0); |
+ keyData.fData64[0] = 2; |
+ GrResourceKey key2(GrCacheID(domain, keyData), t, 0); |
+ keyData.fData64[0] = 3; |
+ GrResourceKey key3(GrCacheID(domain, keyData), t, 0); |
+ |
context->setResourceCacheLimits(5, 30000); |
GrResourceCache* cache = context->getResourceCache(); |
+ GrResourceCache2* cache2 = context->getResourceCache2(); |
cache->purgeAllUnlocked(); |
SkASSERT(0 == cache->getCachedResourceCount() && 0 == cache->getCachedResourceBytes()); |
- // Add two resources with the same key that delete each other from the cache when destroyed. |
+ // Add three resources to the cache. |
TestResource* a = new TestResource(context->getGpu()); |
TestResource* b = new TestResource(context->getGpu()); |
- cache->addResource(key, a); |
- cache->addResource(key, b); |
- // Circle back. |
- a->setDeleteWhenDestroyed(cache, b); |
- b->setDeleteWhenDestroyed(cache, a); |
+ TestResource* c = new TestResource(context->getGpu()); |
+ cache->addResource(key1, a); |
+ cache->addResource(key2, b); |
+ cache->addResource(key3, c); |
a->unref(); |
b->unref(); |
+ c->unref(); |
- // Add a third independent resource also with the same key. |
- GrGpuResource* r = new TestResource(context->getGpu()); |
- cache->addResource(key, r); |
- r->unref(); |
+ REPORTER_ASSERT(reporter, cache2->hasContentKey(key1)); |
+ REPORTER_ASSERT(reporter, cache2->hasContentKey(key2)); |
+ REPORTER_ASSERT(reporter, cache2->hasContentKey(key3)); |
- // Invalidate all three, all three should be purged and destroyed. |
+ // Invalidate two of the three, they should be purged and destroyed. |
REPORTER_ASSERT(reporter, 3 == TestResource::NumAlive()); |
- const GrResourceInvalidatedMessage msg = { key }; |
- SkMessageBus<GrResourceInvalidatedMessage>::Post(msg); |
+ const GrResourceInvalidatedMessage msg1 = { key1 }; |
+ SkMessageBus<GrResourceInvalidatedMessage>::Post(msg1); |
+ const GrResourceInvalidatedMessage msg2 = { key2 }; |
+ SkMessageBus<GrResourceInvalidatedMessage>::Post(msg2); |
+ cache->purgeAsNeeded(); |
+ REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive()); |
+ REPORTER_ASSERT(reporter, !cache2->hasContentKey(key1)); |
+ REPORTER_ASSERT(reporter, !cache2->hasContentKey(key2)); |
+ REPORTER_ASSERT(reporter, cache2->hasContentKey(key3)); |
+ |
+ // Invalidate the third. |
+ const GrResourceInvalidatedMessage msg3 = { key3 }; |
+ SkMessageBus<GrResourceInvalidatedMessage>::Post(msg3); |
cache->purgeAsNeeded(); |
REPORTER_ASSERT(reporter, 0 == TestResource::NumAlive()); |
+ REPORTER_ASSERT(reporter, !cache2->hasContentKey(key3)); |
} |
-static void test_cache_delete_on_destruction(skiatest::Reporter* reporter, |
- GrContext* context) { |
+static void test_cache_delete_on_destruction(skiatest::Reporter* reporter) { |
+ SkAutoTUnref<GrContext> context(GrContext::CreateMockContext()); |
+ REPORTER_ASSERT(reporter, SkToBool(context)); |
+ if (NULL == context) { |
+ return; |
+ } |
+ |
GrCacheID::Domain domain = GrCacheID::GenerateDomain(); |
GrCacheID::Key keyData; |
- keyData.fData64[0] = 5; |
- keyData.fData64[1] = 0; |
+ memset(&keyData, 0, sizeof(keyData)); |
GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType(); |
- GrResourceKey key(GrCacheID(domain, keyData), t, 0); |
+ keyData.fData64[0] = 1; |
+ GrResourceKey key1(GrCacheID(domain, keyData), t, 0); |
+ |
+ keyData.fData64[0] = 2; |
+ GrResourceKey key2(GrCacheID(domain, keyData), t, 0); |
{ |
context->setResourceCacheLimits(3, 30000); |
@@ -163,15 +310,17 @@ static void test_cache_delete_on_destruction(skiatest::Reporter* reporter, |
TestResource* a = new TestResource(context->getGpu()); |
TestResource* b = new TestResource(context->getGpu()); |
- cache->addResource(key, a); |
- cache->addResource(key, b); |
+ cache->addResource(key1, a); |
+ cache->addResource(key2, b); |
a->setDeleteWhenDestroyed(cache, b); |
b->setDeleteWhenDestroyed(cache, a); |
a->unref(); |
b->unref(); |
+ |
REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
+ |
cache->purgeAllUnlocked(); |
REPORTER_ASSERT(reporter, 0 == TestResource::NumAlive()); |
} |
@@ -180,10 +329,11 @@ static void test_cache_delete_on_destruction(skiatest::Reporter* reporter, |
GrResourceCache* cache = context->getResourceCache(); |
cache->purgeAllUnlocked(); |
SkASSERT(0 == cache->getCachedResourceCount() && 0 == cache->getCachedResourceBytes()); |
+ |
TestResource* a = new TestResource(context->getGpu()); |
TestResource* b = new TestResource(context->getGpu()); |
- cache->addResource(key, a); |
- cache->addResource(key, b); |
+ cache->addResource(key1, a); |
+ cache->addResource(key2, b); |
a->setDeleteWhenDestroyed(cache, b); |
b->setDeleteWhenDestroyed(cache, a); |
@@ -192,13 +342,17 @@ static void test_cache_delete_on_destruction(skiatest::Reporter* reporter, |
b->unref(); |
cache->deleteResource(a->getCacheEntry()); |
- |
REPORTER_ASSERT(reporter, 0 == TestResource::NumAlive()); |
} |
} |
-static void test_resource_size_changed(skiatest::Reporter* reporter, |
- GrContext* context) { |
+static void test_resource_size_changed(skiatest::Reporter* reporter) { |
+ SkAutoTUnref<GrContext> context(GrContext::CreateMockContext()); |
+ REPORTER_ASSERT(reporter, SkToBool(context)); |
+ if (NULL == context) { |
+ return; |
+ } |
+ |
GrCacheID::Domain domain = GrCacheID::GenerateDomain(); |
GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType(); |
@@ -216,6 +370,7 @@ static void test_resource_size_changed(skiatest::Reporter* reporter, |
{ |
context->setResourceCacheLimits(3, 30000); |
GrResourceCache* cache = context->getResourceCache(); |
+ GrResourceCache2* cache2 = context->getResourceCache2(); |
cache->purgeAllUnlocked(); |
SkASSERT(0 == cache->getCachedResourceCount() && 0 == cache->getCachedResourceBytes()); |
@@ -231,9 +386,12 @@ static void test_resource_size_changed(skiatest::Reporter* reporter, |
REPORTER_ASSERT(reporter, 200 == cache->getCachedResourceBytes()); |
REPORTER_ASSERT(reporter, 2 == cache->getCachedResourceCount()); |
- |
- static_cast<TestResource*>(cache->find(key2))->setSize(200); |
- static_cast<TestResource*>(cache->find(key1))->setSize(50); |
+ { |
+ SkAutoTUnref<TestResource> find2(static_cast<TestResource*>(cache2->findAndRefContentResource(key2))); |
+ find2->setSize(200); |
+ SkAutoTUnref<TestResource> find1(static_cast<TestResource*>(cache2->findAndRefContentResource(key1))); |
+ find1->setSize(50); |
+ } |
REPORTER_ASSERT(reporter, 250 == cache->getCachedResourceBytes()); |
REPORTER_ASSERT(reporter, 2 == cache->getCachedResourceCount()); |
@@ -243,22 +401,28 @@ static void test_resource_size_changed(skiatest::Reporter* reporter, |
{ |
context->setResourceCacheLimits(2, 300); |
GrResourceCache* cache = context->getResourceCache(); |
+ GrResourceCache2* cache2 = context->getResourceCache2(); |
cache->purgeAllUnlocked(); |
SkASSERT(0 == cache->getCachedResourceCount() && 0 == cache->getCachedResourceBytes()); |
- TestResource* a = new TestResource(context->getGpu(), 100); |
+ TestResource* a = new TestResource(context->getGpu()); |
+ a->setSize(100); |
cache->addResource(key1, a); |
a->unref(); |
- TestResource* b = new TestResource(context->getGpu(), 100); |
+ TestResource* b = new TestResource(context->getGpu()); |
+ b->setSize(100); |
cache->addResource(key2, b); |
b->unref(); |
REPORTER_ASSERT(reporter, 200 == cache->getCachedResourceBytes()); |
REPORTER_ASSERT(reporter, 2 == cache->getCachedResourceCount()); |
- static_cast<TestResource*>(cache->find(key2))->setSize(201); |
- REPORTER_ASSERT(reporter, !cache->hasKey(key1)); |
+ { |
+ SkAutoTUnref<TestResource> find2(static_cast<TestResource*>(cache2->findAndRefContentResource(key2))); |
+ find2->setSize(201); |
+ } |
+ REPORTER_ASSERT(reporter, !cache2->hasContentKey(key1)); |
REPORTER_ASSERT(reporter, 201 == cache->getCachedResourceBytes()); |
REPORTER_ASSERT(reporter, 1 == cache->getCachedResourceCount()); |
@@ -286,16 +450,12 @@ DEF_GPUTEST(ResourceCache, reporter, factory) { |
test_cache(reporter, context, surface->getCanvas()); |
} |
- // The below tests use a mock context. |
- SkAutoTUnref<GrContext> context(GrContext::CreateMockContext()); |
- REPORTER_ASSERT(reporter, SkToBool(context)); |
- if (NULL == context) { |
- return; |
- } |
- |
- test_purge_invalidated(reporter, context); |
- test_cache_delete_on_destruction(reporter, context); |
- test_resource_size_changed(reporter, context); |
+ // The below tests create their own mock contexts. |
+ test_duplicate_content_key(reporter); |
+ test_duplicate_scratch_key(reporter); |
+ test_purge_invalidated(reporter); |
+ test_cache_delete_on_destruction(reporter); |
+ test_resource_size_changed(reporter); |
} |
#endif |