Index: tests/ResourceCacheTest.cpp |
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp |
index c760f0e47dcfb8ef091febe67d21ce059d5ddc42..5fef3d0e75b6276db2210de644c37b83aefcf399 100644 |
--- a/tests/ResourceCacheTest.cpp |
+++ b/tests/ResourceCacheTest.cpp |
@@ -66,6 +66,14 @@ class TestResource : public GrGpuResource { |
public: |
SK_DECLARE_INST_COUNT(TestResource); |
+ TestResource(GrGpu* gpu, bool isWrapped) |
+ : INHERITED(gpu, isWrapped) |
+ , fToDelete(NULL) |
+ , fSize(kDefaultSize) { |
+ ++fNumAlive; |
+ this->registerWithCache(); |
+ } |
+ |
TestResource(GrGpu* gpu) |
: INHERITED(gpu, false) |
, fToDelete(NULL) |
@@ -165,6 +173,85 @@ static void test_no_key(skiatest::Reporter* reporter) { |
REPORTER_ASSERT(reporter, 0 == cache2->getResourceBytes()); |
} |
+static void test_wrapped(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()); |
+ |
+ GrCacheID::Key keyData; |
+ memset(&keyData, 0, sizeof(keyData)); |
+ GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType(); |
+ GrResourceKey scratchKey(GrCacheID(GrResourceKey::ScratchDomain(), keyData), t, 0); |
+ GrResourceKey contentKey(GrCacheID(GrCacheID::GenerateDomain(), keyData), t, 0); |
+ |
+ // Create a scratch, a content, and a wrapped resource |
+ TestResource* scratch = new TestResource(context->getGpu(), scratchKey); |
+ scratch->setSize(10); |
+ TestResource* content = new TestResource(context->getGpu()); |
+ scratch->setSize(11); |
+ REPORTER_ASSERT(reporter, content->cacheAccess().setContentKey(contentKey)); |
+ TestResource* wrapped = new TestResource(context->getGpu(), true); |
+ scratch->setSize(12); |
+ |
+ // Make sure we can't add a content key to the wrapped resource |
+ keyData.fData8[0] = 1; |
+ GrResourceKey contentKey2(GrCacheID(GrCacheID::GenerateDomain(), keyData), t, 0); |
+ REPORTER_ASSERT(reporter, !wrapped->cacheAccess().setContentKey(contentKey2)); |
+ REPORTER_ASSERT(reporter, NULL == cache2->findAndRefContentResource(contentKey2)); |
+ |
+ // Make sure sizes are as we expect |
+ REPORTER_ASSERT(reporter, 3 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, scratch->gpuMemorySize() + content->gpuMemorySize() + |
+ wrapped->gpuMemorySize() == cache2->getResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache2->getBudgetedResourceCount()); |
+ REPORTER_ASSERT(reporter, scratch->gpuMemorySize() + content->gpuMemorySize() == |
+ cache2->getBudgetedResourceBytes()); |
+ |
+ // Our refs mean that the resources are non purgable. |
+ cache2->purgeAllUnlocked(); |
+ REPORTER_ASSERT(reporter, 3 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, scratch->gpuMemorySize() + content->gpuMemorySize() + |
+ wrapped->gpuMemorySize() == cache2->getResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache2->getBudgetedResourceCount()); |
+ REPORTER_ASSERT(reporter, scratch->gpuMemorySize() + content->gpuMemorySize() == |
+ cache2->getBudgetedResourceBytes()); |
+ |
+ // Unreffing the wrapped resource should free it right away. |
+ wrapped->unref(); |
+ REPORTER_ASSERT(reporter, 2 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, scratch->gpuMemorySize() + content->gpuMemorySize() == |
+ cache2->getResourceBytes()); |
+ |
+ // Now try freeing the other two resources first |
+ wrapped = new TestResource(context->getGpu(), true); |
+ scratch->setSize(12); |
+ content->unref(); |
+ cache2->purgeAllUnlocked(); |
+ REPORTER_ASSERT(reporter, 2 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, scratch->gpuMemorySize() + wrapped->gpuMemorySize() == |
+ cache2->getResourceBytes()); |
+ REPORTER_ASSERT(reporter, 1 == cache2->getBudgetedResourceCount()); |
+ REPORTER_ASSERT(reporter, scratch->gpuMemorySize() == cache2->getBudgetedResourceBytes()); |
+ |
+ scratch->unref(); |
+ cache2->purgeAllUnlocked(); |
+ REPORTER_ASSERT(reporter, 1 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, wrapped->gpuMemorySize() == cache2->getResourceBytes()); |
+ REPORTER_ASSERT(reporter, 0 == cache2->getBudgetedResourceCount()); |
+ REPORTER_ASSERT(reporter, 0 == cache2->getBudgetedResourceBytes()); |
+ |
+ wrapped->unref(); |
+ REPORTER_ASSERT(reporter, 0 == cache2->getResourceCount()); |
+ REPORTER_ASSERT(reporter, 0 == cache2->getResourceBytes()); |
+} |
+ |
static void test_duplicate_scratch_key(skiatest::Reporter* reporter) { |
SkAutoTUnref<GrContext> context(GrContext::CreateMockContext()); |
REPORTER_ASSERT(reporter, SkToBool(context)); |
@@ -491,6 +578,7 @@ DEF_GPUTEST(ResourceCache, reporter, factory) { |
// The below tests create their own mock contexts. |
test_no_key(reporter); |
+ test_wrapped(reporter); |
test_duplicate_content_key(reporter); |
test_duplicate_scratch_key(reporter); |
test_purge_invalidated(reporter); |