Index: tests/ResourceCacheTest.cpp |
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp |
index 7b10716e68f9d640977d7babc1f8b9356b31652b..7a3355f1629d94240ab1204f31fa32b61898b454 100644 |
--- a/tests/ResourceCacheTest.cpp |
+++ b/tests/ResourceCacheTest.cpp |
@@ -68,13 +68,13 @@ public: |
SK_DECLARE_INST_COUNT(TestResource); |
/** Property that distinctly categorizes the resource. |
* For example, textures have width, height, ... */ |
- enum SimulatedProperty { kProperty1_SimulatedProperty, kProperty2_SimulatedProperty }; |
+ enum SimulatedProperty { kA_SimulatedProperty, kB_SimulatedProperty }; |
TestResource(GrGpu* gpu, size_t size, GrGpuResource::LifeCycle lifeCycle) |
: INHERITED(gpu, lifeCycle) |
, fToDelete(NULL) |
, fSize(size) |
- , fProperty(kProperty1_SimulatedProperty) { |
+ , fProperty(kA_SimulatedProperty) { |
++fNumAlive; |
this->registerWithCache(); |
} |
@@ -83,7 +83,7 @@ public: |
: INHERITED(gpu, lifeCycle) |
, fToDelete(NULL) |
, fSize(kDefaultSize) |
- , fProperty(kProperty1_SimulatedProperty) { |
+ , fProperty(kA_SimulatedProperty) { |
++fNumAlive; |
this->registerWithCache(); |
} |
@@ -92,14 +92,12 @@ public: |
: INHERITED(gpu, kCached_LifeCycle) |
, fToDelete(NULL) |
, fSize(kDefaultSize) |
- , fProperty(kProperty1_SimulatedProperty) { |
+ , fProperty(kA_SimulatedProperty) { |
++fNumAlive; |
this->registerWithCache(); |
} |
- static TestResource* CreateScratchTestResource(GrGpu* gpu, |
- SimulatedProperty property, |
- bool cached = true) { |
+ static TestResource* CreateScratch(GrGpu* gpu, SimulatedProperty property, bool cached = true) { |
return SkNEW_ARGS(TestResource, (gpu, property, cached, kScratchConstructor)); |
} |
@@ -241,8 +239,7 @@ static void test_budgeting(skiatest::Reporter* reporter) { |
// Create a scratch, a content, and a wrapped resource |
TestResource* scratch = |
- TestResource::CreateScratchTestResource(context->getGpu(), |
- TestResource::kProperty2_SimulatedProperty); |
+ TestResource::CreateScratch(context->getGpu(), TestResource::kB_SimulatedProperty); |
scratch->setSize(10); |
TestResource* content = SkNEW_ARGS(TestResource, (context->getGpu())); |
content->setSize(11); |
@@ -331,8 +328,7 @@ static void test_unbudgeted(skiatest::Reporter* reporter) { |
TestResource* unbudgeted; |
// A large uncached or wrapped resource shouldn't evict anything. |
- scratch = TestResource::CreateScratchTestResource(context->getGpu(), |
- TestResource::kProperty2_SimulatedProperty); |
+ scratch = TestResource::CreateScratch(context->getGpu(), TestResource::kB_SimulatedProperty); |
scratch->setSize(10); |
scratch->unref(); |
REPORTER_ASSERT(reporter, 1 == cache2->getResourceCount()); |
@@ -389,10 +385,9 @@ static void test_unbudgeted_to_scratch(skiatest::Reporter* reporter) { |
GrResourceCache2* cache2 = mock.cache(); |
TestResource* resource = |
- TestResource::CreateScratchTestResource(context->getGpu(), |
- TestResource::kProperty1_SimulatedProperty, false); |
+ TestResource::CreateScratch(context->getGpu(), TestResource::kA_SimulatedProperty, false); |
GrScratchKey key; |
- TestResource::ComputeScratchKey(TestResource::kProperty1_SimulatedProperty, &key); |
+ TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &key); |
size_t size = resource->gpuMemorySize(); |
for (int i = 0; i < 2; ++i) { |
@@ -449,21 +444,19 @@ static void test_duplicate_scratch_key(skiatest::Reporter* reporter) { |
GrResourceCache2* cache2 = mock.cache(); |
// Create two resources that have the same scratch key. |
- TestResource* a = |
- TestResource::CreateScratchTestResource(context->getGpu(), |
- TestResource::kProperty2_SimulatedProperty); |
- TestResource* b = |
- TestResource::CreateScratchTestResource(context->getGpu(), |
- TestResource::kProperty2_SimulatedProperty); |
+ TestResource* a = TestResource::CreateScratch(context->getGpu(), |
+ TestResource::kB_SimulatedProperty); |
+ TestResource* b = TestResource::CreateScratch(context->getGpu(), |
+ TestResource::kB_SimulatedProperty); |
a->setSize(11); |
b->setSize(12); |
GrScratchKey scratchKey1; |
- TestResource::ComputeScratchKey(TestResource::kProperty1_SimulatedProperty, &scratchKey1); |
+ TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratchKey1); |
// Check for negative case consistency. (leaks upon test failure.) |
REPORTER_ASSERT(reporter, NULL == cache2->findAndRefScratchResource(scratchKey1)); |
GrScratchKey scratchKey; |
- TestResource::ComputeScratchKey(TestResource::kProperty2_SimulatedProperty, &scratchKey); |
+ TestResource::ComputeScratchKey(TestResource::kB_SimulatedProperty, &scratchKey); |
// Scratch resources are registered with GrResourceCache2 just by existing. There are 2. |
REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
@@ -496,24 +489,22 @@ static void test_remove_scratch_key(skiatest::Reporter* reporter) { |
GrResourceCache2* cache2 = mock.cache(); |
// Create two resources that have the same scratch key. |
- TestResource* a = |
- TestResource::CreateScratchTestResource(context->getGpu(), |
- TestResource::kProperty2_SimulatedProperty); |
- TestResource* b = |
- TestResource::CreateScratchTestResource(context->getGpu(), |
- TestResource::kProperty2_SimulatedProperty); |
+ TestResource* a = TestResource::CreateScratch(context->getGpu(), |
+ TestResource::kB_SimulatedProperty); |
+ TestResource* b = TestResource::CreateScratch(context->getGpu(), |
+ TestResource::kB_SimulatedProperty); |
a->unref(); |
b->unref(); |
GrScratchKey scratchKey; |
// Ensure that scratch key lookup is correct for negative case. |
- TestResource::ComputeScratchKey(TestResource::kProperty1_SimulatedProperty, &scratchKey); |
+ TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratchKey); |
// (following leaks upon test failure). |
REPORTER_ASSERT(reporter, cache2->findAndRefScratchResource(scratchKey) == NULL); |
// Scratch resources are registered with GrResourceCache2 just by existing. There are 2. |
- TestResource::ComputeScratchKey(TestResource::kProperty2_SimulatedProperty, &scratchKey); |
+ TestResource::ComputeScratchKey(TestResource::kB_SimulatedProperty, &scratchKey); |
REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
SkDEBUGCODE(REPORTER_ASSERT(reporter, 2 == cache2->countScratchEntriesForKey(scratchKey));) |
REPORTER_ASSERT(reporter, 2 == cache2->getResourceCount()); |
@@ -558,21 +549,19 @@ static void test_scratch_key_consistency(skiatest::Reporter* reporter) { |
GrResourceCache2* cache2 = mock.cache(); |
// Create two resources that have the same scratch key. |
- TestResource* a = |
- TestResource::CreateScratchTestResource(context->getGpu(), |
- TestResource::kProperty2_SimulatedProperty); |
- TestResource* b = |
- TestResource::CreateScratchTestResource(context->getGpu(), |
- TestResource::kProperty2_SimulatedProperty); |
+ TestResource* a = TestResource::CreateScratch(context->getGpu(), |
+ TestResource::kB_SimulatedProperty); |
+ TestResource* b = TestResource::CreateScratch(context->getGpu(), |
+ TestResource::kB_SimulatedProperty); |
a->unref(); |
b->unref(); |
GrScratchKey scratchKey; |
// Ensure that scratch key comparison and assignment is consistent. |
GrScratchKey scratchKey1; |
- TestResource::ComputeScratchKey(TestResource::kProperty1_SimulatedProperty, &scratchKey1); |
+ TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratchKey1); |
GrScratchKey scratchKey2; |
- TestResource::ComputeScratchKey(TestResource::kProperty2_SimulatedProperty, &scratchKey2); |
+ TestResource::ComputeScratchKey(TestResource::kB_SimulatedProperty, &scratchKey2); |
REPORTER_ASSERT(reporter, scratchKey1.size() == TestResource::ExpectedScratchKeySize()); |
REPORTER_ASSERT(reporter, scratchKey1 != scratchKey2); |
REPORTER_ASSERT(reporter, scratchKey2 != scratchKey1); |
@@ -590,12 +579,12 @@ static void test_scratch_key_consistency(skiatest::Reporter* reporter) { |
REPORTER_ASSERT(reporter, scratchKey == scratchKey2); |
// Ensure that scratch key lookup is correct for negative case. |
- TestResource::ComputeScratchKey(TestResource::kProperty1_SimulatedProperty, &scratchKey); |
+ TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratchKey); |
// (following leaks upon test failure). |
REPORTER_ASSERT(reporter, cache2->findAndRefScratchResource(scratchKey) == NULL); |
// Find the first resource with a scratch key and a copy of a scratch key. |
- TestResource::ComputeScratchKey(TestResource::kProperty2_SimulatedProperty, &scratchKey); |
+ TestResource::ComputeScratchKey(TestResource::kB_SimulatedProperty, &scratchKey); |
GrGpuResource* find = cache2->findAndRefScratchResource(scratchKey); |
REPORTER_ASSERT(reporter, find != NULL); |
find->unref(); |
@@ -670,48 +659,62 @@ static void test_purge_invalidated(skiatest::Reporter* reporter) { |
make_content_key<0>(&key2, 2); |
make_content_key<0>(&key3, 3); |
- // Add three resources to the cache. |
+ // Add three resources to the cache. Only c is usable as scratch. |
TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu())); |
TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu())); |
- TestResource* c = SkNEW_ARGS(TestResource, (context->getGpu())); |
+ TestResource* c = TestResource::CreateScratch(context->getGpu(), |
+ TestResource::kA_SimulatedProperty); |
a->cacheAccess().setContentKey(key1); |
b->cacheAccess().setContentKey(key2); |
c->cacheAccess().setContentKey(key3); |
a->unref(); |
- b->unref(); |
+ // hold b until *after* the message is sent. |
c->unref(); |
REPORTER_ASSERT(reporter, cache2->hasContentKey(key1)); |
REPORTER_ASSERT(reporter, cache2->hasContentKey(key2)); |
REPORTER_ASSERT(reporter, cache2->hasContentKey(key3)); |
- |
- // Invalidate two of the three, they should be purged and destroyed. |
REPORTER_ASSERT(reporter, 3 == TestResource::NumAlive()); |
- const GrResourceInvalidatedMessage msg1 = { key1 }; |
- SkMessageBus<GrResourceInvalidatedMessage>::Post(msg1); |
- const GrResourceInvalidatedMessage msg2 = { key2 }; |
- SkMessageBus<GrResourceInvalidatedMessage>::Post(msg2); |
-#if 0 // Disabled until reimplemented in GrResourceCache2. |
+ |
+ typedef GrContentKeyInvalidatedMessage Msg; |
+ typedef SkMessageBus<GrContentKeyInvalidatedMessage> Bus; |
+ |
+ // Invalidate two of the three, they should be purged and no longer accessible via their keys. |
+ Bus::Post(Msg(key1)); |
+ Bus::Post(Msg(key2)); |
cache2->purgeAsNeeded(); |
- REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive()); |
+ // a should be deleted now, but we still have a ref on b. |
REPORTER_ASSERT(reporter, !cache2->hasContentKey(key1)); |
REPORTER_ASSERT(reporter, !cache2->hasContentKey(key2)); |
+ REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
REPORTER_ASSERT(reporter, cache2->hasContentKey(key3)); |
-#endif |
// Invalidate the third. |
- const GrResourceInvalidatedMessage msg3 = { key3 }; |
- SkMessageBus<GrResourceInvalidatedMessage>::Post(msg3); |
-#if 0 // Disabled until reimplemented in GrResourceCache2. |
+ Bus::Post(Msg(key3)); |
cache2->purgeAsNeeded(); |
- REPORTER_ASSERT(reporter, 0 == TestResource::NumAlive()); |
+ // we still have a ref on b, c should be recycled as scratch. |
+ REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive()); |
REPORTER_ASSERT(reporter, !cache2->hasContentKey(key3)); |
-#endif |
+ // make b purgeable. It should be immediately deleted since it has no key. |
+ b->unref(); |
+ REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive()); |
+ |
+ // Make sure we actually get to c via it's scratch key, before we say goodbye. |
+ GrScratchKey scratchKey; |
+ TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratchKey); |
+ GrGpuResource* scratch = cache2->findAndRefScratchResource(scratchKey); |
+ REPORTER_ASSERT(reporter, scratch == c); |
+ SkSafeUnref(scratch); |
+ |
+ // Get rid of c. |
cache2->purgeAllUnlocked(); |
+ scratch = cache2->findAndRefScratchResource(scratchKey); |
REPORTER_ASSERT(reporter, 0 == TestResource::NumAlive()); |
REPORTER_ASSERT(reporter, 0 == cache2->getResourceCount()); |
REPORTER_ASSERT(reporter, 0 == cache2->getResourceBytes()); |
+ REPORTER_ASSERT(reporter, !scratch); |
+ SkSafeUnref(scratch); |
} |
static void test_cache_chained_purge(skiatest::Reporter* reporter) { |