blob: 9f893bb24c48c6b06024497961475bd8d8e31059 [file] [log] [blame]
reed@google.com772443a2013-12-11 15:30:24 +00001 /*
reed@google.com602a1d72013-07-23 19:13:54 +00002 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
reed@google.come4eb1222013-12-09 22:29:30 +00008#include "SkDiscardableMemory.h"
reed011f39a2014-08-28 13:35:23 -07009#include "SkResourceCache.h"
tfarina@chromium.org8f6884a2014-01-24 20:56:26 +000010#include "Test.h"
reed@google.com602a1d72013-07-23 19:13:54 +000011
reed04617132014-08-21 09:46:49 -070012namespace {
13static void* gGlobalAddress;
reed011f39a2014-08-28 13:35:23 -070014struct TestingKey : public SkResourceCache::Key {
reed04617132014-08-21 09:46:49 -070015 void* fPtr;
16 intptr_t fValue;
17
18 TestingKey(intptr_t value) : fPtr(&gGlobalAddress), fValue(value) {
19 this->init(sizeof(fPtr) + sizeof(fValue));
20 }
21};
reed011f39a2014-08-28 13:35:23 -070022struct TestingRec : public SkResourceCache::Rec {
reed680fb9e2014-08-26 09:08:04 -070023 TestingRec(const TestingKey& key, uint32_t value) : fKey(key), fValue(value) {}
reed04617132014-08-21 09:46:49 -070024
reed680fb9e2014-08-26 09:08:04 -070025 TestingKey fKey;
26 intptr_t fValue;
27
28 virtual const Key& getKey() const SK_OVERRIDE { return fKey; }
29 virtual size_t bytesUsed() const SK_OVERRIDE { return sizeof(fKey) + sizeof(fValue); }
reeddee6a8e2014-09-15 06:44:47 -070030
31 static bool Visitor(const SkResourceCache::Rec& baseRec, void* context) {
32 const TestingRec& rec = static_cast<const TestingRec&>(baseRec);
33 intptr_t* result = (intptr_t*)context;
34
35 *result = rec.fValue;
36 return true;
37 }
reed680fb9e2014-08-26 09:08:04 -070038};
reed@google.com602a1d72013-07-23 19:13:54 +000039}
40
reed@google.come4eb1222013-12-09 22:29:30 +000041static const int COUNT = 10;
42static const int DIM = 256;
43
reeddee6a8e2014-09-15 06:44:47 -070044static void test_cache(skiatest::Reporter* reporter, SkResourceCache& cache, bool testPurge) {
reed@google.com772443a2013-12-11 15:30:24 +000045 for (int i = 0; i < COUNT; ++i) {
reed680fb9e2014-08-26 09:08:04 -070046 TestingKey key(i);
reeddee6a8e2014-09-15 06:44:47 -070047 intptr_t value = -1;
tfarina@chromium.org4f3c3052013-12-14 15:12:48 +000048
reeddee6a8e2014-09-15 06:44:47 -070049 REPORTER_ASSERT(reporter, !cache.find(key, TestingRec::Visitor, &value));
50 REPORTER_ASSERT(reporter, -1 == value);
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000051
reeddee6a8e2014-09-15 06:44:47 -070052 cache.add(SkNEW_ARGS(TestingRec, (key, i)));
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000053
reeddee6a8e2014-09-15 06:44:47 -070054 REPORTER_ASSERT(reporter, cache.find(key, TestingRec::Visitor, &value));
55 REPORTER_ASSERT(reporter, i == value);
reed@google.com602a1d72013-07-23 19:13:54 +000056 }
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000057
reed@google.come4eb1222013-12-09 22:29:30 +000058 if (testPurge) {
59 // stress test, should trigger purges
60 for (size_t i = 0; i < COUNT * 100; ++i) {
reed04617132014-08-21 09:46:49 -070061 TestingKey key(i);
reeddee6a8e2014-09-15 06:44:47 -070062 cache.add(SkNEW_ARGS(TestingRec, (key, i)));
reed@google.come4eb1222013-12-09 22:29:30 +000063 }
reed@google.com602a1d72013-07-23 19:13:54 +000064 }
reed@google.com772443a2013-12-11 15:30:24 +000065
66 // test the originals after all that purging
67 for (int i = 0; i < COUNT; ++i) {
reeddee6a8e2014-09-15 06:44:47 -070068 intptr_t value;
69 (void)cache.find(TestingKey(i), TestingRec::Visitor, &value);
reed@google.com772443a2013-12-11 15:30:24 +000070 }
71
halcanary805ef152014-07-17 06:58:01 -070072 cache.setTotalByteLimit(0);
reed@google.com602a1d72013-07-23 19:13:54 +000073}
74
reed@google.com772443a2013-12-11 15:30:24 +000075#include "SkDiscardableMemoryPool.h"
76
77static SkDiscardableMemoryPool* gPool;
78static SkDiscardableMemory* pool_factory(size_t bytes) {
commit-bot@chromium.orgcf2f0082014-04-04 16:43:38 +000079 SkASSERT(gPool);
reed@google.com772443a2013-12-11 15:30:24 +000080 return gPool->create(bytes);
81}
82
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +000083DEF_TEST(ImageCache, reporter) {
reed@google.com772443a2013-12-11 15:30:24 +000084 static const size_t defLimit = DIM * DIM * 4 * COUNT + 1024; // 1K slop
85
reed@google.come4eb1222013-12-09 22:29:30 +000086 {
reed011f39a2014-08-28 13:35:23 -070087 SkResourceCache cache(defLimit);
reed@google.come4eb1222013-12-09 22:29:30 +000088 test_cache(reporter, cache, true);
89 }
90 {
commit-bot@chromium.orgcf2f0082014-04-04 16:43:38 +000091 SkAutoTUnref<SkDiscardableMemoryPool> pool(
92 SkDiscardableMemoryPool::Create(defLimit, NULL));
93 gPool = pool.get();
reed011f39a2014-08-28 13:35:23 -070094 SkResourceCache cache(pool_factory);
reed@google.com772443a2013-12-11 15:30:24 +000095 test_cache(reporter, cache, true);
96 }
97 {
reed011f39a2014-08-28 13:35:23 -070098 SkResourceCache cache(SkDiscardableMemory::Create);
reed@google.come4eb1222013-12-09 22:29:30 +000099 test_cache(reporter, cache, false);
100 }
101}
102
rmistry@google.comd6bab022013-12-02 13:50:38 +0000103DEF_TEST(ImageCache_doubleAdd, r) {
104 // Adding the same key twice should be safe.
reed011f39a2014-08-28 13:35:23 -0700105 SkResourceCache cache(4096);
rmistry@google.comd6bab022013-12-02 13:50:38 +0000106
reed680fb9e2014-08-26 09:08:04 -0700107 TestingKey key(1);
rmistry@google.comd6bab022013-12-02 13:50:38 +0000108
reeddee6a8e2014-09-15 06:44:47 -0700109 cache.add(SkNEW_ARGS(TestingRec, (key, 2)));
110 cache.add(SkNEW_ARGS(TestingRec, (key, 3)));
commit-bot@chromium.org5e4112b2014-03-05 13:44:18 +0000111
reed680fb9e2014-08-26 09:08:04 -0700112 // Lookup can return either value.
reeddee6a8e2014-09-15 06:44:47 -0700113 intptr_t value = -1;
114 REPORTER_ASSERT(r, cache.find(key, TestingRec::Visitor, &value));
115 REPORTER_ASSERT(r, 2 == value || 3 == value);
rmistry@google.comd6bab022013-12-02 13:50:38 +0000116}