Index: tests/ResourceCacheTest.cpp |
diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp |
index 7262b43a0ff767ef0db36ecca6f1f23bbf5bffa0..f6c8b1da1a1c9033d2419edf6d3609f0007595b7 100644 |
--- a/tests/ResourceCacheTest.cpp |
+++ b/tests/ResourceCacheTest.cpp |
@@ -57,11 +57,14 @@ static void test_cache(skiatest::Reporter* reporter, |
} |
class TestResource : public GrCacheable { |
+ static const size_t kDefaultSize = 100; |
+ |
public: |
SK_DECLARE_INST_COUNT(TestResource); |
- TestResource() |
+ TestResource(size_t size = kDefaultSize) |
: fCache(NULL) |
- , fToDelete(NULL) { |
+ , fToDelete(NULL) |
+ , fSize(size) { |
++fAlive; |
} |
@@ -74,7 +77,12 @@ public: |
} |
} |
- size_t gpuMemorySize() const SK_OVERRIDE { return 100; } |
+ void setSize(size_t size) { |
+ fSize = size; |
+ this->didChangeGpuMemorySize(); |
+ } |
+ |
+ size_t gpuMemorySize() const SK_OVERRIDE { return fSize; } |
bool isValidOnGpu() const SK_OVERRIDE { return true; } |
@@ -88,6 +96,7 @@ public: |
private: |
GrResourceCache* fCache; |
TestResource* fToDelete; |
+ size_t fSize; |
static int fAlive; |
typedef GrCacheable INHERITED; |
@@ -174,6 +183,99 @@ static void test_cache_delete_on_destruction(skiatest::Reporter* reporter, |
} |
} |
+static void test_resource_size_changed(skiatest::Reporter* reporter, |
+ GrContext* context) { |
+ GrCacheID::Domain domain = GrCacheID::GenerateDomain(); |
+ GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType(); |
+ |
+ GrCacheID::Key key1Data; |
+ key1Data.fData64[0] = 0; |
+ key1Data.fData64[1] = 0; |
+ GrResourceKey key1(GrCacheID(domain, key1Data), t, 0); |
+ |
+ GrCacheID::Key key2Data; |
+ key2Data.fData64[0] = 1; |
+ key2Data.fData64[1] = 0; |
+ GrResourceKey key2(GrCacheID(domain, key2Data), t, 0); |
+ |
+ // Test changing resources sizes (both increase & decrease). |
+ { |
+ GrResourceCache cache(2, 300); |
+ |
+ TestResource* a = new TestResource(0); |
+ a->setSize(100); // Test didChangeGpuMemorySize() when not in the cache. |
+ cache.addResource(key1, a); |
+ a->unref(); |
+ |
+ TestResource* b = new TestResource(0); |
+ b->setSize(100); |
+ cache.addResource(key2, b); |
+ b->unref(); |
+ |
+ REPORTER_ASSERT(reporter, 200 == cache.getCachedResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); |
+ |
+ static_cast<TestResource*>(cache.find(key2))->setSize(200); |
+ static_cast<TestResource*>(cache.find(key1))->setSize(50); |
+ |
+ REPORTER_ASSERT(reporter, 250 == cache.getCachedResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); |
+ } |
+ |
+ // Test increasing a resources size beyond the cache budget. |
+ { |
+ GrResourceCache cache(2, 300); |
+ |
+ TestResource* a = new TestResource(100); |
+ cache.addResource(key1, a); |
+ a->unref(); |
+ |
+ TestResource* b = new TestResource(100); |
+ cache.addResource(key2, b); |
+ b->unref(); |
+ |
+ REPORTER_ASSERT(reporter, 200 == cache.getCachedResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); |
+ |
+ static_cast<TestResource*>(cache.find(key2))->setSize(201); |
+ REPORTER_ASSERT(reporter, NULL == cache.find(key1)); |
+ |
+ REPORTER_ASSERT(reporter, 201 == cache.getCachedResourceBytes()); |
+ REPORTER_ASSERT(reporter, 1 == cache.getCachedResourceCount()); |
+ } |
+ |
+ // Test changing the size of an exclusively-held resource. |
+ { |
+ GrResourceCache cache(2, 300); |
+ |
+ TestResource* a = new TestResource(100); |
+ cache.addResource(key1, a); |
+ cache.makeExclusive(a->getCacheEntry()); |
+ |
+ TestResource* b = new TestResource(100); |
+ cache.addResource(key2, b); |
+ b->unref(); |
+ |
+ REPORTER_ASSERT(reporter, 200 == cache.getCachedResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); |
+ REPORTER_ASSERT(reporter, NULL == cache.find(key1)); |
+ |
+ a->setSize(200); |
+ |
+ REPORTER_ASSERT(reporter, 300 == cache.getCachedResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); |
+ // Internal resource cache validation will test the detached size (debug mode only). |
+ |
+ cache.makeNonExclusive(a->getCacheEntry()); |
+ a->unref(); |
+ |
+ REPORTER_ASSERT(reporter, 300 == cache.getCachedResourceBytes()); |
+ REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); |
+ REPORTER_ASSERT(reporter, NULL != cache.find(key1)); |
+ // Internal resource cache validation will test the detached size (debug mode only). |
+ } |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
DEF_GPUTEST(ResourceCache, reporter, factory) { |
for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) { |
@@ -199,6 +301,7 @@ DEF_GPUTEST(ResourceCache, reporter, factory) { |
test_cache(reporter, context, &canvas); |
test_purge_invalidated(reporter, context); |
test_cache_delete_on_destruction(reporter, context); |
+ test_resource_size_changed(reporter, context); |
} |
} |