diff options
author | Derek Sollenberger <djsollen@google.com> | 2017-05-25 16:43:59 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-05-26 18:14:33 +0000 |
commit | 5480a18d8799511034d0da219c72932cd8f25274 (patch) | |
tree | 0be82d1f2275f2df75a5bf77eb330fadf677166b /tests/ResourceCacheTest.cpp | |
parent | dc8c34455849574e4e0260ea35485f093723c10d (diff) |
Add method to GrContext to purge unlocked resources.
Beyond setting the total cache limits this method enables clients to
request to purge a specific number of bytes, as well as specify their
preference to purge scratch resources over resources of other types.
Change-Id: I9259d5544d34251575d77eebe599388f213ff3ce
Reviewed-on: https://skia-review.googlesource.com/17987
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Derek Sollenberger <djsollen@google.com>
Diffstat (limited to 'tests/ResourceCacheTest.cpp')
-rw-r--r-- | tests/ResourceCacheTest.cpp | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp index 3a63521803..08f60ea1c5 100644 --- a/tests/ResourceCacheTest.cpp +++ b/tests/ResourceCacheTest.cpp @@ -1360,6 +1360,114 @@ static void test_time_purge(skiatest::Reporter* reporter) { } } +static void test_partial_purge(skiatest::Reporter* reporter) { + Mock mock(6, 100); + GrContext* context = mock.context(); + GrResourceCache* cache = mock.cache(); + + enum TestsCase { + kOnlyScratch_TestCase = 0, + kPartialScratch_TestCase = 1, + kAllScratch_TestCase = 2, + kPartial_TestCase = 3, + kAll_TestCase = 4, + kNone_TestCase = 5, + kEndTests_TestCase = kNone_TestCase + 1 + }; + + for (int testCase = 0; testCase < kEndTests_TestCase; testCase++) { + + GrUniqueKey key1, key2, key3; + make_unique_key<0>(&key1, 1); + make_unique_key<0>(&key2, 2); + make_unique_key<0>(&key3, 3); + + // Add three unique resources to the cache. + TestResource *unique1 = new TestResource(context->getGpu()); + TestResource *unique2 = new TestResource(context->getGpu()); + TestResource *unique3 = new TestResource(context->getGpu()); + + unique1->resourcePriv().setUniqueKey(key1); + unique2->resourcePriv().setUniqueKey(key2); + unique3->resourcePriv().setUniqueKey(key3); + + unique1->setSize(10); + unique2->setSize(11); + unique3->setSize(12); + + // Add two scratch resources to the cache. + TestResource *scratch1 = TestResource::CreateScratch(context->getGpu(), SkBudgeted::kYes, + TestResource::kA_SimulatedProperty); + TestResource *scratch2 = TestResource::CreateScratch(context->getGpu(), SkBudgeted::kYes, + TestResource::kB_SimulatedProperty); + scratch1->setSize(13); + scratch2->setSize(14); + + + REPORTER_ASSERT(reporter, 5 == cache->getBudgetedResourceCount()); + REPORTER_ASSERT(reporter, 60 == cache->getBudgetedResourceBytes()); + REPORTER_ASSERT(reporter, 0 == cache->getPurgeableBytes()); + + // Add resources to the purgeable queue + unique1->unref(); + scratch1->unref(); + unique2->unref(); + scratch2->unref(); + unique3->unref(); + + REPORTER_ASSERT(reporter, 5 == cache->getBudgetedResourceCount()); + REPORTER_ASSERT(reporter, 60 == cache->getBudgetedResourceBytes()); + REPORTER_ASSERT(reporter, 60 == cache->getPurgeableBytes()); + + switch(testCase) { + case kOnlyScratch_TestCase: { + context->purgeUnlockedResources(14, true); + REPORTER_ASSERT(reporter, 3 == cache->getBudgetedResourceCount()); + REPORTER_ASSERT(reporter, 33 == cache->getBudgetedResourceBytes()); + break; + } + case kPartialScratch_TestCase: { + context->purgeUnlockedResources(3, true); + REPORTER_ASSERT(reporter, 4 == cache->getBudgetedResourceCount()); + REPORTER_ASSERT(reporter, 47 == cache->getBudgetedResourceBytes()); + break; + } + case kAllScratch_TestCase: { + context->purgeUnlockedResources(50, true); + REPORTER_ASSERT(reporter, 0 == cache->getBudgetedResourceCount()); + REPORTER_ASSERT(reporter, 0 == cache->getBudgetedResourceBytes()); + break; + } + case kPartial_TestCase: { + context->purgeUnlockedResources(13, false); + REPORTER_ASSERT(reporter, 3 == cache->getBudgetedResourceCount()); + REPORTER_ASSERT(reporter, 37 == cache->getBudgetedResourceBytes()); + break; + } + case kAll_TestCase: { + context->purgeUnlockedResources(50, false); + REPORTER_ASSERT(reporter, 0 == cache->getBudgetedResourceCount()); + REPORTER_ASSERT(reporter, 0 == cache->getBudgetedResourceBytes()); + break; + } + case kNone_TestCase: { + context->purgeUnlockedResources(0, true); + context->purgeUnlockedResources(0, false); + REPORTER_ASSERT(reporter, 5 == cache->getBudgetedResourceCount()); + REPORTER_ASSERT(reporter, 60 == cache->getBudgetedResourceBytes()); + REPORTER_ASSERT(reporter, 60 == cache->getPurgeableBytes()); + break; + } + }; + + // ensure all are purged before the next + context->purgeAllUnlockedResources(); + REPORTER_ASSERT(reporter, 0 == cache->getBudgetedResourceCount()); + REPORTER_ASSERT(reporter, 0 == cache->getPurgeableBytes()); + + } +} + static void test_large_resource_count(skiatest::Reporter* reporter) { // 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 @@ -1515,6 +1623,7 @@ DEF_GPUTEST(ResourceCacheMisc, reporter, factory) { test_timestamp_wrap(reporter); test_flush(reporter); test_time_purge(reporter); + test_partial_purge(reporter); test_large_resource_count(reporter); test_custom_data(reporter); test_abandoned(reporter); |