Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(234)

Unified Diff: tests/ResourceCacheTest.cpp

Issue 938943002: Allow GrGpuResources' unique keys to be changed. (Closed) Base URL: https://skia.googlesource.com/skia.git@rename
Patch Set: Address comments Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tests/GLProgramsTest.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/ResourceCacheTest.cpp
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp
index 574d7130559c8b0200c7b99516ae4daaf8ba9269..64cd327b81181f08a519426551f1d09697960e37 100644
--- a/tests/ResourceCacheTest.cpp
+++ b/tests/ResourceCacheTest.cpp
@@ -245,7 +245,7 @@ static void test_budgeting(skiatest::Reporter* reporter) {
scratch->setSize(10);
TestResource* unique = SkNEW_ARGS(TestResource, (context->getGpu()));
unique->setSize(11);
- REPORTER_ASSERT(reporter, unique->resourcePriv().setUniqueKey(uniqueKey));
+ unique->resourcePriv().setUniqueKey(uniqueKey);
TestResource* wrapped = SkNEW_ARGS(TestResource,
(context->getGpu(), GrGpuResource::kWrapped_LifeCycle));
wrapped->setSize(12);
@@ -256,7 +256,7 @@ static void test_budgeting(skiatest::Reporter* reporter) {
// Make sure we can't add a unique key to the wrapped resource
GrUniqueKey uniqueKey2;
make_unique_key<0>(&uniqueKey2, 1);
- REPORTER_ASSERT(reporter, !wrapped->resourcePriv().setUniqueKey(uniqueKey2));
+ wrapped->resourcePriv().setUniqueKey(uniqueKey2);
REPORTER_ASSERT(reporter, NULL == cache->findAndRefUniqueResource(uniqueKey2));
// Make sure sizes are as we expect
@@ -340,7 +340,7 @@ static void test_unbudgeted(skiatest::Reporter* reporter) {
unique = SkNEW_ARGS(TestResource, (context->getGpu()));
unique->setSize(11);
- REPORTER_ASSERT(reporter, unique->resourcePriv().setUniqueKey(uniqueKey));
+ unique->resourcePriv().setUniqueKey(uniqueKey);
unique->unref();
REPORTER_ASSERT(reporter, 2 == cache->getResourceCount());
REPORTER_ASSERT(reporter, 21 == cache->getResourceBytes());
@@ -500,7 +500,6 @@ static void test_remove_scratch_key(skiatest::Reporter* reporter) {
a->unref();
b->unref();
-
GrScratchKey scratchKey;
// Ensure that scratch key lookup is correct for negative case.
TestResource::ComputeScratchKey(TestResource::kA_SimulatedProperty, &scratchKey);
@@ -616,38 +615,72 @@ static void test_duplicate_unique_key(skiatest::Reporter* reporter) {
// Create two resources that we will attempt to register with the same unique key.
TestResource* a = SkNEW_ARGS(TestResource, (context->getGpu()));
- TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu()));
a->setSize(11);
- b->setSize(12);
- // Can't set the same unique key on two resources.
- REPORTER_ASSERT(reporter, a->resourcePriv().setUniqueKey(key));
- REPORTER_ASSERT(reporter, !b->resourcePriv().setUniqueKey(key));
+ // Set key on resource a.
+ a->resourcePriv().setUniqueKey(key);
+ REPORTER_ASSERT(reporter, a == cache->findAndRefUniqueResource(key));
+ a->unref();
+
+ // Make sure that redundantly setting a's key works.
+ a->resourcePriv().setUniqueKey(key);
+ REPORTER_ASSERT(reporter, a == cache->findAndRefUniqueResource(key));
+ a->unref();
+ REPORTER_ASSERT(reporter, 1 == cache->getResourceCount());
+ REPORTER_ASSERT(reporter, a->gpuMemorySize() == cache->getResourceBytes());
+ REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive());
+
+ // Create resource b and set the same key. It should replace a's unique key cache entry.
+ TestResource* b = SkNEW_ARGS(TestResource, (context->getGpu()));
+ b->setSize(12);
+ b->resourcePriv().setUniqueKey(key);
+ REPORTER_ASSERT(reporter, b == cache->findAndRefUniqueResource(key));
+ b->unref();
- // Still have two resources because b is still reffed.
+ // Still have two resources because a is still reffed.
REPORTER_ASSERT(reporter, 2 == cache->getResourceCount());
- REPORTER_ASSERT(reporter, a->gpuMemorySize() + b->gpuMemorySize() ==
- cache->getResourceBytes());
+ REPORTER_ASSERT(reporter, a->gpuMemorySize() + b->gpuMemorySize() == cache->getResourceBytes());
REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive());
+ a->unref();
+ // Now a should be gone.
+ REPORTER_ASSERT(reporter, 1 == cache->getResourceCount());
+ REPORTER_ASSERT(reporter, b->gpuMemorySize() == cache->getResourceBytes());
+ REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive());
+
+ // Now replace b with c, but make sure c can start with one unique key and change it to b's key.
+ // Also make b be unreffed when replacement occurs.
b->unref();
- // Now b should be gone.
+ TestResource* c = SkNEW_ARGS(TestResource, (context->getGpu()));
+ GrUniqueKey differentKey;
+ make_unique_key<0>(&differentKey, 1);
+ c->setSize(13);
+ c->resourcePriv().setUniqueKey(differentKey);
+ REPORTER_ASSERT(reporter, 2 == cache->getResourceCount());
+ REPORTER_ASSERT(reporter, b->gpuMemorySize() + c->gpuMemorySize() == cache->getResourceBytes());
+ REPORTER_ASSERT(reporter, 2 == TestResource::NumAlive());
+ // c replaces b and b should be immediately purged.
+ c->resourcePriv().setUniqueKey(key);
REPORTER_ASSERT(reporter, 1 == cache->getResourceCount());
- REPORTER_ASSERT(reporter, a->gpuMemorySize() == cache->getResourceBytes());
+ REPORTER_ASSERT(reporter, c->gpuMemorySize() == cache->getResourceBytes());
REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive());
+ // c shouldn't be purged because it is ref'ed.
cache->purgeAllUnlocked();
REPORTER_ASSERT(reporter, 1 == cache->getResourceCount());
- REPORTER_ASSERT(reporter, a->gpuMemorySize() == cache->getResourceBytes());
+ REPORTER_ASSERT(reporter, c->gpuMemorySize() == cache->getResourceBytes());
REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive());
- // Drop the ref on a but it isn't immediately purged as it still has a valid scratch key.
- a->unref();
+ // Drop the ref on c, it should be kept alive because it has a unique key.
+ c->unref();
REPORTER_ASSERT(reporter, 1 == cache->getResourceCount());
- REPORTER_ASSERT(reporter, a->gpuMemorySize() == cache->getResourceBytes());
+ REPORTER_ASSERT(reporter, c->gpuMemorySize() == cache->getResourceBytes());
REPORTER_ASSERT(reporter, 1 == TestResource::NumAlive());
- cache->purgeAllUnlocked();
+ // Verify that we can find c, then remove its unique key. It should get purged immediately.
+ REPORTER_ASSERT(reporter, c == cache->findAndRefUniqueResource(key));
+ c->resourcePriv().removeUniqueKey();
+ c->unref();
REPORTER_ASSERT(reporter, 0 == cache->getResourceCount());
REPORTER_ASSERT(reporter, 0 == cache->getResourceBytes());
REPORTER_ASSERT(reporter, 0 == TestResource::NumAlive());
« no previous file with comments | « tests/GLProgramsTest.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698