Index: tests/ResourceCacheTest.cpp |
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp |
index a1a594e1dd4bbd8dc57c4771c038c4b28c5b40ef..8639626cf2de1265722ee1ea96a3531dc30e7767 100644 |
--- a/tests/ResourceCacheTest.cpp |
+++ b/tests/ResourceCacheTest.cpp |
@@ -66,8 +66,16 @@ class TestResource : public GrGpuResource { |
public: |
SK_DECLARE_INST_COUNT(TestResource); |
- TestResource(GrGpu* gpu, bool isWrapped) |
- : INHERITED(gpu, isWrapped) |
+ TestResource(GrGpu* gpu, size_t size, GrGpuResource::LifeCycle lifeCycle) |
+ : INHERITED(gpu, lifeCycle) |
+ , fToDelete(NULL) |
+ , fSize(size) { |
+ ++fNumAlive; |
+ this->registerWithCache(); |
+ } |
+ |
+ TestResource(GrGpu* gpu, GrGpuResource::LifeCycle lifeCycle) |
+ : INHERITED(gpu, lifeCycle) |
, fToDelete(NULL) |
, fSize(kDefaultSize) { |
++fNumAlive; |
@@ -75,7 +83,7 @@ public: |
} |
TestResource(GrGpu* gpu) |
- : INHERITED(gpu, false) |
+ : INHERITED(gpu, kCached_LifeCycle) |
, fToDelete(NULL) |
, fSize(kDefaultSize) { |
++fNumAlive; |
@@ -83,7 +91,7 @@ public: |
} |
TestResource(GrGpu* gpu, const GrScratchKey& scratchKey) |
- : INHERITED(gpu, false) |
+ : INHERITED(gpu, kCached_LifeCycle) |
, fToDelete(NULL) |
, fSize(kDefaultSize) { |
this->setScratchKey(scratchKey); |
@@ -130,10 +138,10 @@ static void test_no_key(skiatest::Reporter* reporter) { |
SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes()); |
// Create a bunch of resources with no keys |
- TestResource* a = new TestResource(context->getGpu()); |
- TestResource* b = new TestResource(context->getGpu()); |
- TestResource* c = new TestResource(context->getGpu()); |
- TestResource* d = new TestResource(context->getGpu()); |
+ TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu())); |
+ TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu())); |
+ TestResource* c = SkNEW_ARGS(TestResource, (context->getGpu())); |
+ TestResource* d = SkNEW_ARGS(TestResource, (context->getGpu())); |
a->setSize(11); |
b->setSize(12); |
c->setSize(13); |
@@ -198,16 +206,17 @@ static void test_budgeting(skiatest::Reporter* reporter) { |
GrResourceKey contentKey(GrCacheID(GrCacheID::GenerateDomain(), keyData), 0); |
// Create a scratch, a content, and a wrapped resource |
- TestResource* scratch = new TestResource(context->getGpu(), scratchKey); |
+ TestResource* scratch = SkNEW_ARGS(TestResource, (context->getGpu(), scratchKey)); |
scratch->setSize(10); |
- TestResource* content = new TestResource(context->getGpu()); |
- scratch->setSize(11); |
+ TestResource* content = SkNEW_ARGS(TestResource, (context->getGpu())); |
+ content->setSize(11); |
REPORTER_ASSERT(reporter, content->cacheAccess().setContentKey(contentKey)); |
- TestResource* wrapped = new TestResource(context->getGpu(), true); |
- scratch->setSize(12); |
- TestResource* unbudgeted = new TestResource(context->getGpu()); |
+ TestResource* wrapped = SkNEW_ARGS(TestResource, |
+ (context->getGpu(), GrGpuResource::kWrapped_LifeCycle)); |
+ wrapped->setSize(12); |
+ TestResource* unbudgeted = SkNEW_ARGS(TestResource, |
+ (context->getGpu(), GrGpuResource::kUncached_LifeCycle)); |
unbudgeted->setSize(13); |
- unbudgeted->cacheAccess().setBudgeted(false); |
// Make sure we can't add a content key to the wrapped resource |
keyData.fData8[0] = 1; |
@@ -241,7 +250,7 @@ static void test_budgeting(skiatest::Reporter* reporter) { |
unbudgeted->gpuMemorySize() == cache2->getResourceBytes()); |
// Now try freeing the budgeted resources first |
- wrapped = new TestResource(context->getGpu(), true); |
+ wrapped = SkNEW_ARGS(TestResource, (context->getGpu(), GrGpuResource::kWrapped_LifeCycle)); |
scratch->setSize(12); |
content->unref(); |
cache2->purgeAllUnlocked(); |
@@ -272,6 +281,82 @@ static void test_budgeting(skiatest::Reporter* reporter) { |
REPORTER_ASSERT(reporter, 0 == cache2->getBudgetedResourceBytes()); |
} |
+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()); |
+ |
+ GrScratchKey scratchKey; |
+ make_scratch_key(&scratchKey); |
+ |
+ GrCacheID::Key keyData; |
+ memset(&keyData, 0, sizeof(keyData)); |
+ GrResourceKey contentKey(GrCacheID(GrCacheID::GenerateDomain(), keyData), 0); |
+ |
+ TestResource* scratch; |
+ TestResource* content; |
+ TestResource* wrapped; |
+ TestResource* unbudgeted; |
+ |
+ // A large uncached or wrapped resource shouldn't evict anything. |
+ scratch = SkNEW_ARGS(TestResource, (context->getGpu(), scratchKey)); |
+ scratch->setSize(10); |
+ scratch->unref(); |
+ REPORTER_ASSERT(reporter, 1 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, 10 == cache2->getResourceBytes()); |
+ REPORTER_ASSERT(reporter, 1 == cache2->getBudgetedResourceCount()); |
+ REPORTER_ASSERT(reporter, 10 == cache2->getBudgetedResourceBytes()); |
+ |
+ content = SkNEW_ARGS(TestResource, (context->getGpu())); |
+ content->setSize(11); |
+ REPORTER_ASSERT(reporter, content->cacheAccess().setContentKey(contentKey)); |
+ content->unref(); |
+ REPORTER_ASSERT(reporter, 2 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, 21 == cache2->getResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache2->getBudgetedResourceCount()); |
+ REPORTER_ASSERT(reporter, 21 == cache2->getBudgetedResourceBytes()); |
+ |
+ size_t large = 2 * cache2->getResourceBytes(); |
+ unbudgeted = SkNEW_ARGS(TestResource, |
+ (context->getGpu(), large, GrGpuResource::kUncached_LifeCycle)); |
+ REPORTER_ASSERT(reporter, 3 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, 21 + large == cache2->getResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache2->getBudgetedResourceCount()); |
+ REPORTER_ASSERT(reporter, 21 == cache2->getBudgetedResourceBytes()); |
+ |
+ unbudgeted->unref(); |
+ REPORTER_ASSERT(reporter, 2 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, 21 == cache2->getResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache2->getBudgetedResourceCount()); |
+ REPORTER_ASSERT(reporter, 21 == cache2->getBudgetedResourceBytes()); |
+ |
+ wrapped = SkNEW_ARGS(TestResource, |
+ (context->getGpu(), large, GrGpuResource::kWrapped_LifeCycle)); |
+ REPORTER_ASSERT(reporter, 3 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, 21 + large == cache2->getResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache2->getBudgetedResourceCount()); |
+ REPORTER_ASSERT(reporter, 21 == cache2->getBudgetedResourceBytes()); |
+ |
+ wrapped->unref(); |
+ REPORTER_ASSERT(reporter, 2 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, 21 == cache2->getResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache2->getBudgetedResourceCount()); |
+ REPORTER_ASSERT(reporter, 21 == cache2->getBudgetedResourceBytes()); |
+ |
+ cache2->purgeAllUnlocked(); |
+ REPORTER_ASSERT(reporter, 0 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, 0 == cache2->getResourceBytes()); |
+ REPORTER_ASSERT(reporter, 0 == cache2->getBudgetedResourceCount()); |
+ 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)); |
@@ -287,8 +372,8 @@ static void test_duplicate_scratch_key(skiatest::Reporter* reporter) { |
make_scratch_key(&scratchKey); |
// Create two resources that have the same scratch key. |
- TestResource* a = new TestResource(context->getGpu(), scratchKey); |
- TestResource* b = new TestResource(context->getGpu(), scratchKey); |
+ TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu(), scratchKey)); |
+ TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu(), scratchKey)); |
a->setSize(11); |
b->setSize(12); |
// Scratch resources are registered with GrResourceCache2 just by existing. There are 2. |
@@ -331,8 +416,8 @@ static void test_remove_scratch_key(skiatest::Reporter* reporter) { |
make_scratch_key(&scratchKey); |
// Create two resources that have the same scratch key. |
- TestResource* a = new TestResource(context->getGpu(), scratchKey); |
- TestResource* b = new TestResource(context->getGpu(), scratchKey); |
+ TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu(), scratchKey)); |
+ TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu(), scratchKey)); |
a->unref(); |
b->unref(); |
@@ -392,8 +477,8 @@ static void test_duplicate_content_key(skiatest::Reporter* reporter) { |
GrResourceKey key(GrCacheID(domain, keyData), 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()); |
+ TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu())); |
+ TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu())); |
a->setSize(11); |
b->setSize(12); |
@@ -454,9 +539,9 @@ static void test_purge_invalidated(skiatest::Reporter* reporter) { |
SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes()); |
// Add three resources to the cache. |
- TestResource* a = new TestResource(context->getGpu()); |
- TestResource* b = new TestResource(context->getGpu()); |
- TestResource* c = new TestResource(context->getGpu()); |
+ TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu())); |
+ TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu())); |
+ TestResource* c = SkNEW_ARGS(TestResource, (context->getGpu())); |
a->cacheAccess().setContentKey(key1); |
b->cacheAccess().setContentKey(key2); |
c->cacheAccess().setContentKey(key3); |
@@ -520,8 +605,8 @@ static void test_cache_chained_purge(skiatest::Reporter* reporter) { |
cache2->purgeAllUnlocked(); |
SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes()); |
- TestResource* a = new TestResource(context->getGpu()); |
- TestResource* b = new TestResource(context->getGpu()); |
+ TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu())); |
+ TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu())); |
a->cacheAccess().setContentKey(key1); |
b->cacheAccess().setContentKey(key2); |
@@ -574,11 +659,11 @@ static void test_resource_size_changed(skiatest::Reporter* reporter) { |
cache2->purgeAllUnlocked(); |
SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes()); |
- TestResource* a = new TestResource(context->getGpu()); |
+ TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu())); |
a->cacheAccess().setContentKey(key1); |
a->unref(); |
- TestResource* b = new TestResource(context->getGpu()); |
+ TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu())); |
b->cacheAccess().setContentKey(key2); |
b->unref(); |
@@ -602,12 +687,12 @@ static void test_resource_size_changed(skiatest::Reporter* reporter) { |
cache2->purgeAllUnlocked(); |
SkASSERT(0 == cache2->getResourceCount() && 0 == cache2->getResourceBytes()); |
- TestResource* a = new TestResource(context->getGpu()); |
+ TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu())); |
a->setSize(100); |
a->cacheAccess().setContentKey(key1); |
a->unref(); |
- TestResource* b = new TestResource(context->getGpu()); |
+ TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu())); |
b->setSize(100); |
b->cacheAccess().setContentKey(key2); |
b->unref(); |
@@ -719,6 +804,7 @@ DEF_GPUTEST(ResourceCache, reporter, factory) { |
// The below tests create their own mock contexts. |
test_no_key(reporter); |
test_budgeting(reporter); |
+ test_unbudgeted(reporter); |
test_duplicate_content_key(reporter); |
test_duplicate_scratch_key(reporter); |
test_remove_scratch_key(reporter); |