| Index: tests/ResourceCacheTest.cpp
|
| diff --git a/tests/ResourceCacheTest.cpp b/tests/ResourceCacheTest.cpp
|
| index 1bb6766b2c1f160a245cd9b3baa3a5e3166e816e..0de67e7deaaf830cd09656fab628af3ad5a534b5 100644
|
| --- a/tests/ResourceCacheTest.cpp
|
| +++ b/tests/ResourceCacheTest.cpp
|
| @@ -11,6 +11,7 @@
|
| #if SK_SUPPORT_GPU
|
| #include "GrContextFactory.h"
|
| #include "SkGpuDevice.h"
|
| +#include "GrResourceCache.h"
|
|
|
| static const int gWidth = 640;
|
| static const int gHeight = 480;
|
| @@ -58,6 +59,131 @@ static void test_cache(skiatest::Reporter* reporter,
|
| context->setTextureCacheLimits(oldMaxNum, oldMaxBytes);
|
| }
|
|
|
| +class TestResource : public GrResource {
|
| +public:
|
| + SK_DECLARE_INST_COUNT(TestResource);
|
| + TestResource(GrGpu* gpu, int* cacheCount)
|
| + : INHERITED(gpu, false)
|
| + , fCache(NULL)
|
| + , fToDelete(NULL)
|
| + , fCacheCount(cacheCount) {
|
| + ++*fCacheCount;
|
| + }
|
| +
|
| + ~TestResource() {
|
| + --*fCacheCount;
|
| +
|
| + if (NULL != fToDelete) {
|
| + fToDelete->setDeletedResource(NULL, NULL);
|
| + fCache->deleteResource(fToDelete);
|
| + }
|
| + this->release();
|
| + }
|
| +
|
| + void setDeletedResource(GrResourceCache* cache, TestResource* resource) {
|
| + fCache = cache;
|
| + fToDelete = resource;
|
| + }
|
| +
|
| + virtual size_t sizeInBytes() const SK_OVERRIDE {
|
| + return 100;
|
| + }
|
| +
|
| +private:
|
| + GrResourceCache* fCache;
|
| + TestResource* fToDelete;
|
| + int* fCacheCount;
|
| +
|
| + typedef GrResource INHERITED;
|
| +};
|
| +
|
| +SK_DEFINE_INST_COUNT(TestResource);
|
| +
|
| +static void test_cache_delete_on_destruction(skiatest::Reporter* reporter,
|
| + GrContext* context) {
|
| + GrCacheID::Domain domain = GrCacheID::GenerateDomain();
|
| + GrCacheID::Key keyData;
|
| + keyData.fData64[0] = 5;
|
| + keyData.fData64[1] = 0;
|
| + GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType();
|
| +
|
| + GrResourceKey key(GrCacheID(domain, keyData), t, 0);
|
| +
|
| + {
|
| + int cacheCount = 0;
|
| + {
|
| + GrResourceCache cache(3, 30000);
|
| + TestResource* a = new TestResource(context->getGpu(), &cacheCount);
|
| + TestResource* b = new TestResource(context->getGpu(), &cacheCount);
|
| + cache.addResource(key, a);
|
| + cache.addResource(key, b);
|
| +
|
| + a->setDeletedResource(&cache, b);
|
| + b->setDeletedResource(&cache, a);
|
| +
|
| + a->unref();
|
| + b->unref();
|
| + REPORTER_ASSERT(reporter, cacheCount == 2);
|
| + }
|
| + REPORTER_ASSERT(reporter, cacheCount == 0);
|
| + }
|
| + {
|
| + int cacheCount = 0;
|
| + GrResourceCache cache(3, 30000);
|
| + TestResource* a = new TestResource(context->getGpu(), &cacheCount);
|
| + TestResource* b = new TestResource(context->getGpu(), &cacheCount);
|
| + cache.addResource(key, a);
|
| + cache.addResource(key, b);
|
| +
|
| + a->setDeletedResource(&cache, b);
|
| + b->setDeletedResource(&cache, a);
|
| +
|
| + a->unref();
|
| + b->unref();
|
| +
|
| + cache.deleteResource(a);
|
| +
|
| + REPORTER_ASSERT(reporter, cacheCount == 0);
|
| + }
|
| +}
|
| +
|
| +static void test_purge_invalidated(skiatest::Reporter* reporter,
|
| + GrContext* context) {
|
| + GrCacheID::Domain domain = GrCacheID::GenerateDomain();
|
| + GrCacheID::Key keyData;
|
| + keyData.fData64[0] = 5;
|
| + keyData.fData64[1] = 18;
|
| + GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType();
|
| + GrResourceKey key(GrCacheID(domain, keyData), t, 0);
|
| +
|
| + {
|
| + int cacheCount = 0;
|
| + GrResourceCache cache(5, 30000);
|
| + TestResource* a = new TestResource(context->getGpu(), &cacheCount);
|
| + cache.addResource(key, a);
|
| + TestResource* b = new TestResource(context->getGpu(), &cacheCount);
|
| + cache.addResource(key, b);
|
| + a->setDeletedResource(&cache, b);
|
| + b->setDeletedResource(&cache, a);
|
| + a->unref();
|
| + b->unref();
|
| +
|
| + GrResource* r = new TestResource(context->getGpu(), &cacheCount);
|
| + cache.addResource(key, r);
|
| + r->unref();
|
| +
|
| +
|
| + REPORTER_ASSERT(reporter, cacheCount == 3);
|
| + GrResourceInvalidatedMessage msg = { key };
|
| + SkMessageBus<GrResourceInvalidatedMessage>::Post(msg);
|
| + cache.purgeAsNeeded();
|
| +
|
| + REPORTER_ASSERT(reporter, cacheCount == 0);
|
| + }
|
| +}
|
| +
|
| +
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| static void TestResourceCache(skiatest::Reporter* reporter, GrContextFactory* factory) {
|
| for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) {
|
| @@ -81,6 +207,8 @@ static void TestResourceCache(skiatest::Reporter* reporter, GrContextFactory* fa
|
| SkCanvas canvas(device.get());
|
|
|
| test_cache(reporter, context, &canvas);
|
| + test_cache_delete_on_destruction(reporter, context);
|
| + test_purge_invalidated(reporter, context);
|
| }
|
| }
|
|
|
|
|