| Index: tests/ResourceCacheTest.cpp
|
| diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp
|
| index 6b7d68c75f35c73d87f0b05e568609e06524350d..f98aaf1a4d0e78ae011d55eefe514eecc599dfcd 100644
|
| --- a/tests/ResourceCacheTest.cpp
|
| +++ b/tests/ResourceCacheTest.cpp
|
| @@ -97,8 +97,10 @@ public:
|
| this->registerWithCache();
|
| }
|
|
|
| - static TestResource* CreateScratchTestResource(GrGpu* gpu, SimulatedProperty property) {
|
| - return SkNEW_ARGS(TestResource, (gpu, property, kScratchConstructor));
|
| + static TestResource* CreateScratchTestResource(GrGpu* gpu,
|
| + SimulatedProperty property,
|
| + bool cached = true) {
|
| + return SkNEW_ARGS(TestResource, (gpu, property, cached, kScratchConstructor));
|
| }
|
|
|
| ~TestResource() {
|
| @@ -132,8 +134,8 @@ public:
|
| private:
|
| static const int kScratchKeyFieldCnt = 6;
|
|
|
| - TestResource(GrGpu* gpu, SimulatedProperty property, ScratchConstructor)
|
| - : INHERITED(gpu, kCached_LifeCycle)
|
| + TestResource(GrGpu* gpu, SimulatedProperty property, bool cached, ScratchConstructor)
|
| + : INHERITED(gpu, cached ? kCached_LifeCycle : kUncached_LifeCycle)
|
| , fToDelete(NULL)
|
| , fSize(kDefaultSize)
|
| , fProperty(property) {
|
| @@ -154,16 +156,29 @@ private:
|
| };
|
| int TestResource::fNumAlive = 0;
|
|
|
| -static void test_no_key(skiatest::Reporter* reporter) {
|
| - SkAutoTUnref<GrContext> context(GrContext::CreateMockContext());
|
| - REPORTER_ASSERT(reporter, SkToBool(context));
|
| - if (NULL == context) {
|
| - return;
|
| +class Mock {
|
| +public:
|
| + Mock(int maxCnt, size_t maxBytes) {
|
| + fContext.reset(GrContext::CreateMockContext());
|
| + SkASSERT(fContext);
|
| + fContext->setResourceCacheLimits(maxCnt, maxBytes);
|
| + GrResourceCache2* cache2 = fContext->getResourceCache2();
|
| + cache2->purgeAllUnlocked();
|
| + SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
| }
|
| - context->setResourceCacheLimits(10, 30000);
|
| - GrResourceCache2* cache2 = context->getResourceCache2();
|
| - cache2->purgeAllUnlocked();
|
| - SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
| +
|
| + GrResourceCache2* cache() { return fContext->getResourceCache2(); }
|
| +
|
| + GrContext* context() { return fContext; }
|
| +
|
| +private:
|
| + SkAutoTUnref<GrContext> fContext;
|
| +};
|
| +
|
| +static void test_no_key(skiatest::Reporter* reporter) {
|
| + Mock mock(10, 30000);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
|
|
| // Create a bunch of resources with no keys
|
| TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu()));
|
| @@ -217,16 +232,9 @@ template <int> static void make_content_key(GrContentKey* key, int data) {
|
| }
|
|
|
| static void test_budgeting(skiatest::Reporter* reporter) {
|
| - SkAutoTUnref<GrContext> context(GrContext::CreateMockContext());
|
| - REPORTER_ASSERT(reporter, SkToBool(context));
|
| - if (NULL == context) {
|
| - return;
|
| - }
|
| - context->setResourceCacheLimits(10, 300);
|
| - GrResourceCache2* cache2 = context->getResourceCache2();
|
| - cache2->purgeAllUnlocked();
|
| - SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
| - SkASSERT(0 == cache2->getBudgetedResourceCount() && 0 == cache2->getBudgetedResourceBytes());
|
| + Mock mock(10, 300);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
|
|
| GrContentKey contentKey;
|
| make_content_key<0>(&contentKey, 0);
|
| @@ -310,16 +318,9 @@ static void test_budgeting(skiatest::Reporter* reporter) {
|
| }
|
|
|
| static void test_unbudgeted(skiatest::Reporter* reporter) {
|
| - SkAutoTUnref<GrContext> context(GrContext::CreateMockContext());
|
| - REPORTER_ASSERT(reporter, SkToBool(context));
|
| - if (NULL == context) {
|
| - return;
|
| - }
|
| - context->setResourceCacheLimits(10, 300);
|
| - GrResourceCache2* cache2 = context->getResourceCache2();
|
| - cache2->purgeAllUnlocked();
|
| - SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
| - SkASSERT(0 == cache2->getBudgetedResourceCount() && 0 == cache2->getBudgetedResourceBytes());
|
| + Mock mock(10, 30000);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
|
|
| GrContentKey contentKey;
|
| make_content_key<0>(&contentKey, 0);
|
| @@ -382,16 +383,70 @@ static void test_unbudgeted(skiatest::Reporter* reporter) {
|
| REPORTER_ASSERT(reporter, 0 == cache2->getBudgetedResourceBytes());
|
| }
|
|
|
| -static void test_duplicate_scratch_key(skiatest::Reporter* reporter) {
|
| - SkAutoTUnref<GrContext> context(GrContext::CreateMockContext());
|
| - REPORTER_ASSERT(reporter, SkToBool(context));
|
| - if (NULL == context) {
|
| - return;
|
| +static void test_unbudgeted_to_scratch(skiatest::Reporter* reporter) {
|
| + Mock mock(10, 300);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
| +
|
| + TestResource* resource =
|
| + TestResource::CreateScratchTestResource(context->getGpu(),
|
| + TestResource::kProperty1_SimulatedProperty, false);
|
| + GrScratchKey key;
|
| + TestResource::ComputeScratchKey(TestResource::kProperty1_SimulatedProperty, &key);
|
| +
|
| + size_t size = resource->gpuMemorySize();
|
| + for (int i = 0; i < 2; ++i) {
|
| + // Since this resource is unbudgeted, it should not be reachable as scratch.
|
| + REPORTER_ASSERT(reporter, resource->cacheAccess().getScratchKey() == key);
|
| + REPORTER_ASSERT(reporter, !resource->cacheAccess().isScratch());
|
| + REPORTER_ASSERT(reporter, !resource->cacheAccess().isBudgeted());
|
| + REPORTER_ASSERT(reporter, NULL == cache2->findAndRefScratchResource(key));
|
| + REPORTER_ASSERT(reporter, 1 == cache2->getResourceCount());
|
| + REPORTER_ASSERT(reporter, size == cache2->getResourceBytes());
|
| + REPORTER_ASSERT(reporter, 0 == cache2->getBudgetedResourceCount());
|
| + REPORTER_ASSERT(reporter, 0 == cache2->getBudgetedResourceBytes());
|
| +
|
| + // Once it is unrefed, it should become available as scratch.
|
| + resource->unref();
|
| + REPORTER_ASSERT(reporter, 1 == cache2->getResourceCount());
|
| + REPORTER_ASSERT(reporter, size == cache2->getResourceBytes());
|
| + REPORTER_ASSERT(reporter, 1 == cache2->getBudgetedResourceCount());
|
| + REPORTER_ASSERT(reporter, size == cache2->getBudgetedResourceBytes());
|
| + resource = static_cast<TestResource*>(cache2->findAndRefScratchResource(key));
|
| + REPORTER_ASSERT(reporter, resource);
|
| + REPORTER_ASSERT(reporter, resource->cacheAccess().getScratchKey() == key);
|
| + REPORTER_ASSERT(reporter, resource->cacheAccess().isScratch());
|
| + REPORTER_ASSERT(reporter, resource->cacheAccess().isBudgeted());
|
| +
|
| + if (0 == i) {
|
| + // If made unbudgeted, it should return to original state: ref'ed and unbudgeted. Try
|
| + // the above tests again.
|
| + resource->cacheAccess().makeUnbudgeted();
|
| + } else {
|
| + // After the second time around, try removing the scratch key
|
| + resource->cacheAccess().removeScratchKey();
|
| + REPORTER_ASSERT(reporter, 1 == cache2->getResourceCount());
|
| + REPORTER_ASSERT(reporter, size == cache2->getResourceBytes());
|
| + REPORTER_ASSERT(reporter, 1 == cache2->getBudgetedResourceCount());
|
| + REPORTER_ASSERT(reporter, size == cache2->getBudgetedResourceBytes());
|
| + REPORTER_ASSERT(reporter, !resource->cacheAccess().getScratchKey().isValid());
|
| + REPORTER_ASSERT(reporter, !resource->cacheAccess().isScratch());
|
| + REPORTER_ASSERT(reporter, resource->cacheAccess().isBudgeted());
|
| +
|
| + // now when it is unrefed it should die since it has no key.
|
| + resource->unref();
|
| + REPORTER_ASSERT(reporter, 0 == cache2->getResourceCount());
|
| + REPORTER_ASSERT(reporter, 0 == cache2->getResourceBytes());
|
| + REPORTER_ASSERT(reporter, 0 == cache2->getBudgetedResourceCount());
|
| + REPORTER_ASSERT(reporter, 0 == cache2->getBudgetedResourceBytes());
|
| + }
|
| }
|
| - context->setResourceCacheLimits(5, 30000);
|
| - GrResourceCache2* cache2 = context->getResourceCache2();
|
| - cache2->purgeAllUnlocked();
|
| - SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
| +}
|
| +
|
| +static void test_duplicate_scratch_key(skiatest::Reporter* reporter) {
|
| + Mock mock(5, 30000);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
|
|
| // Create two resources that have the same scratch key.
|
| TestResource* a =
|
| @@ -436,15 +491,9 @@ static void test_duplicate_scratch_key(skiatest::Reporter* reporter) {
|
| }
|
|
|
| static void test_remove_scratch_key(skiatest::Reporter* reporter) {
|
| - SkAutoTUnref<GrContext> context(GrContext::CreateMockContext());
|
| - REPORTER_ASSERT(reporter, SkToBool(context));
|
| - if (NULL == context) {
|
| - return;
|
| - }
|
| - context->setResourceCacheLimits(5, 30000);
|
| - GrResourceCache2* cache2 = context->getResourceCache2();
|
| - cache2->purgeAllUnlocked();
|
| - SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
| + Mock mock(5, 30000);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
|
|
| // Create two resources that have the same scratch key.
|
| TestResource* a =
|
| @@ -504,15 +553,9 @@ static void test_remove_scratch_key(skiatest::Reporter* reporter) {
|
| }
|
|
|
| static void test_scratch_key_consistency(skiatest::Reporter* reporter) {
|
| - SkAutoTUnref<GrContext> context(GrContext::CreateMockContext());
|
| - REPORTER_ASSERT(reporter, SkToBool(context));
|
| - if (NULL == context) {
|
| - return;
|
| - }
|
| - context->setResourceCacheLimits(5, 30000);
|
| - GrResourceCache2* cache2 = context->getResourceCache2();
|
| - cache2->purgeAllUnlocked();
|
| - SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
| + Mock mock(5, 30000);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
|
|
| // Create two resources that have the same scratch key.
|
| TestResource* a =
|
| @@ -571,15 +614,9 @@ static void test_scratch_key_consistency(skiatest::Reporter* reporter) {
|
| }
|
|
|
| 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);
|
| - GrResourceCache2* cache2 = context->getResourceCache2();
|
| - cache2->purgeAllUnlocked();
|
| - SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
| + Mock mock(5, 30000);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
|
|
| GrContentKey key;
|
| make_content_key<0>(&key, 0);
|
| @@ -624,22 +661,15 @@ static void test_duplicate_content_key(skiatest::Reporter* reporter) {
|
| }
|
|
|
| static void test_purge_invalidated(skiatest::Reporter* reporter) {
|
| - SkAutoTUnref<GrContext> context(GrContext::CreateMockContext());
|
| - REPORTER_ASSERT(reporter, SkToBool(context));
|
| - if (NULL == context) {
|
| - return;
|
| - }
|
| + Mock mock(5, 30000);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
|
|
| GrContentKey key1, key2, key3;
|
| make_content_key<0>(&key1, 1);
|
| make_content_key<0>(&key2, 2);
|
| make_content_key<0>(&key3, 3);
|
|
|
| - context->setResourceCacheLimits(5, 30000);
|
| - GrResourceCache2* cache2 = context->getResourceCache2();
|
| - cache2->purgeAllUnlocked();
|
| - SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
| -
|
| // Add three resources to the cache.
|
| TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu()));
|
| TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu()));
|
| @@ -685,67 +715,52 @@ static void test_purge_invalidated(skiatest::Reporter* reporter) {
|
| }
|
|
|
| static void test_cache_chained_purge(skiatest::Reporter* reporter) {
|
| - SkAutoTUnref<GrContext> context(GrContext::CreateMockContext());
|
| - REPORTER_ASSERT(reporter, SkToBool(context));
|
| - if (NULL == context) {
|
| - return;
|
| - }
|
| + Mock mock(3, 30000);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
|
|
| GrContentKey key1, key2;
|
| make_content_key<0>(&key1, 1);
|
| make_content_key<0>(&key2, 2);
|
|
|
| - {
|
| - context->setResourceCacheLimits(3, 30000);
|
| - GrResourceCache2* cache2 = context->getResourceCache2();
|
| - cache2->purgeAllUnlocked();
|
| - SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
|
|
| - TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu()));
|
| - TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu()));
|
| - a->cacheAccess().setContentKey(key1);
|
| - b->cacheAccess().setContentKey(key2);
|
| + TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu()));
|
| + TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu()));
|
| + a->cacheAccess().setContentKey(key1);
|
| + b->cacheAccess().setContentKey(key2);
|
|
|
| - // Make a cycle
|
| - a->setUnrefWhenDestroyed(b);
|
| - b->setUnrefWhenDestroyed(a);
|
| + // Make a cycle
|
| + a->setUnrefWhenDestroyed(b);
|
| + b->setUnrefWhenDestroyed(a);
|
|
|
| - REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive());
|
| + REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive());
|
|
|
| - a->unref();
|
| - b->unref();
|
| + a->unref();
|
| + b->unref();
|
|
|
| - REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive());
|
| + REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive());
|
|
|
| - cache2->purgeAllUnlocked();
|
| - REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive());
|
| + cache2->purgeAllUnlocked();
|
| + REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive());
|
|
|
| - // Break the cycle
|
| - a->setUnrefWhenDestroyed(NULL);
|
| - REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive());
|
| + // Break the cycle
|
| + a->setUnrefWhenDestroyed(NULL);
|
| + REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive());
|
|
|
| - cache2->purgeAllUnlocked();
|
| - REPORTER_ASSERT(reporter, 0 == TestResource::NumAlive());
|
| - }
|
| + cache2->purgeAllUnlocked();
|
| + REPORTER_ASSERT(reporter, 0 == TestResource::NumAlive());
|
| }
|
|
|
| static void test_resource_size_changed(skiatest::Reporter* reporter) {
|
| - SkAutoTUnref<GrContext> context(GrContext::CreateMockContext());
|
| - REPORTER_ASSERT(reporter, SkToBool(context));
|
| - if (NULL == context) {
|
| - return;
|
| - }
|
| -
|
| GrContentKey key1, key2;
|
| make_content_key<0>(&key1, 1);
|
| make_content_key<0>(&key2, 2);
|
|
|
| // Test changing resources sizes (both increase & decrease).
|
| {
|
| - context->setResourceCacheLimits(3, 30000);
|
| - GrResourceCache2* cache2 = context->getResourceCache2();
|
| - cache2->purgeAllUnlocked();
|
| - SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
| + Mock mock(3, 30000);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
|
|
| TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu()));
|
| a->cacheAccess().setContentKey(key1);
|
| @@ -770,10 +785,9 @@ static void test_resource_size_changed(skiatest::Reporter* reporter) {
|
|
|
| // Test increasing a resources size beyond the cache budget.
|
| {
|
| - context->setResourceCacheLimits(2, 300);
|
| - GrResourceCache2* cache2 = context->getResourceCache2();
|
| - cache2->purgeAllUnlocked();
|
| - SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
| + Mock mock(2, 300);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
|
|
| TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu()));
|
| a->setSize(100);
|
| @@ -800,21 +814,14 @@ static void test_resource_size_changed(skiatest::Reporter* reporter) {
|
| }
|
|
|
| static void test_large_resource_count(skiatest::Reporter* reporter) {
|
| - SkAutoTUnref<GrContext> context(GrContext::CreateMockContext());
|
| - REPORTER_ASSERT(reporter, SkToBool(context));
|
| - if (NULL == context) {
|
| - return;
|
| - }
|
| -
|
| - static const int kResourceCnt = 2000;
|
| // Set the cache size to double the resource count because we're going to create 2x that number
|
| // resources, using two different key domains. Add a little slop to the bytes because we resize
|
| // down to 1 byte after creating the resource.
|
| - context->setResourceCacheLimits(2 * kResourceCnt, 2 * kResourceCnt + 1000);
|
| - GrResourceCache2* cache2 = context->getResourceCache2();
|
| - cache2->purgeAllUnlocked();
|
| - SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes());
|
| + static const int kResourceCnt = 2000;
|
|
|
| + Mock mock(2 * kResourceCnt, 2 * kResourceCnt + 1000);
|
| + GrContext* context = mock.context();
|
| + GrResourceCache2* cache2 = mock.cache();
|
|
|
| for (int i = 0; i < kResourceCnt; ++i) {
|
| GrContentKey key1, key2;
|
| @@ -892,6 +899,7 @@ DEF_GPUTEST(ResourceCache, reporter, factory) {
|
| test_no_key(reporter);
|
| test_budgeting(reporter);
|
| test_unbudgeted(reporter);
|
| + test_unbudgeted_to_scratch(reporter);
|
| test_duplicate_content_key(reporter);
|
| test_duplicate_scratch_key(reporter);
|
| test_remove_scratch_key(reporter);
|
|
|