1c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org/*
2c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org * Copyright 2013 Google Inc.
3c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org *
4c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
5c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org * found in the LICENSE file.
6c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org */
7c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
8c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org#if SK_SUPPORT_GPU
94ee16bfaedb14aff8cf102f1f0722ff2529a9699tfarina@chromium.org
1069f6f00fd975823e825c5aa0b1b8f4416e7c812breed#include "SkCanvas.h"
11c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org#include "GrContextFactory.h"
12c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org#include "GrResourceCache.h"
1369f6f00fd975823e825c5aa0b1b8f4416e7c812breed#include "SkSurface.h"
144ee16bfaedb14aff8cf102f1f0722ff2529a9699tfarina@chromium.org#include "Test.h"
15c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
16c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.orgstatic const int gWidth = 640;
17c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.orgstatic const int gHeight = 480;
18c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
19c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////////
2017f1ae63d57a3f3d3a0ae50e1b25b3f8b18fd328skia.committer@gmail.comstatic void test_cache(skiatest::Reporter* reporter,
21c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org                       GrContext* context,
22c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org                       SkCanvas* canvas) {
23c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    const SkIRect size = SkIRect::MakeWH(gWidth, gHeight);
24c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
25c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    SkBitmap src;
26deee496cd30070e52556dcb538c2e5eb39b66b81mike@reedtribe.org    src.allocN32Pixels(size.width(), size.height());
27c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    src.eraseColor(SK_ColorBLACK);
28c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    size_t srcSize = src.getSize();
29c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
3095c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org    size_t initialCacheSize;
3195c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org    context->getResourceCacheUsage(NULL, &initialCacheSize);
32c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
33c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    int oldMaxNum;
34c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    size_t oldMaxBytes;
3595c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org    context->getResourceCacheLimits(&oldMaxNum, &oldMaxBytes);
3617f1ae63d57a3f3d3a0ae50e1b25b3f8b18fd328skia.committer@gmail.com
37c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    // Set the cache limits so we can fit 10 "src" images and the
38c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    // max number of textures doesn't matter
39c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    size_t maxCacheSize = initialCacheSize + 10*srcSize;
4095c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org    context->setResourceCacheLimits(1000, maxCacheSize);
41c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
42c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    SkBitmap readback;
43deee496cd30070e52556dcb538c2e5eb39b66b81mike@reedtribe.org    readback.allocN32Pixels(size.width(), size.height());
44c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
45c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    for (int i = 0; i < 100; ++i) {
46c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        canvas->drawBitmap(src, 0, 0);
47c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        canvas->readPixels(size, &readback);
48c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
49c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        // "modify" the src texture
50c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        src.notifyPixelsChanged();
51c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
5295c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org        size_t curCacheSize;
5395c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org        context->getResourceCacheUsage(NULL, &curCacheSize);
54c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
55c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        // we should never go over the size limit
56c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        REPORTER_ASSERT(reporter, curCacheSize <= maxCacheSize);
57c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    }
58c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
5995c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org    context->setResourceCacheLimits(oldMaxNum, oldMaxBytes);
60c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org}
61c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
626d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomonclass TestResource : public GrGpuResource {
6311c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    static const size_t kDefaultSize = 100;
6411c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
65c665804300096c2e7617379835bb83d715538788commit-bot@chromium.orgpublic:
66c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    SK_DECLARE_INST_COUNT(TestResource);
67c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    TestResource(GrGpu* gpu, size_t size = kDefaultSize)
68c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon        : INHERITED(gpu, false)
69c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon        , fCache(NULL)
7011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        , fToDelete(NULL)
7111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        , fSize(size) {
72c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org        ++fAlive;
73169612621f00b3fe9f71014079991287d311751absalomon        this->registerWithCache();
74c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    }
75c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org
76c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    ~TestResource() {
77c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org        --fAlive;
7849f085dddff10473b6ebf832a974288300224e60bsalomon        if (fToDelete) {
79c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org            // Breaks our little 2-element cycle below.
80c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org            fToDelete->setDeleteWhenDestroyed(NULL, NULL);
81c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org            fCache->deleteResource(fToDelete->getCacheEntry());
82c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org        }
83c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon        this->release();
84c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    }
85c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org
8611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    void setSize(size_t size) {
8711c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        fSize = size;
8811c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        this->didChangeGpuMemorySize();
8911c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    }
9011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
9111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    size_t gpuMemorySize() const SK_OVERRIDE { return fSize; }
92089a780c3355129eefc942246534bc1f126b8ccbcommit-bot@chromium.org
93c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    static int alive() { return fAlive; }
94c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org
95c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    void setDeleteWhenDestroyed(GrResourceCache* cache, TestResource* resource) {
96c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org        fCache = cache;
97c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org        fToDelete = resource;
98c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    }
99c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org
100c665804300096c2e7617379835bb83d715538788commit-bot@chromium.orgprivate:
101c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    GrResourceCache* fCache;
102c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    TestResource* fToDelete;
10311c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    size_t fSize;
104c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    static int fAlive;
105c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org
1066d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomon    typedef GrGpuResource INHERITED;
107c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org};
108c665804300096c2e7617379835bb83d715538788commit-bot@chromium.orgint TestResource::fAlive = 0;
109c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org
110c665804300096c2e7617379835bb83d715538788commit-bot@chromium.orgstatic void test_purge_invalidated(skiatest::Reporter* reporter, GrContext* context) {
111c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    GrCacheID::Domain domain = GrCacheID::GenerateDomain();
112c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    GrCacheID::Key keyData;
113c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    keyData.fData64[0] = 5;
114c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    keyData.fData64[1] = 18;
115c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType();
116c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    GrResourceKey key(GrCacheID(domain, keyData), t, 0);
117c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org
118c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    GrResourceCache cache(5, 30000);
119c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org
120c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    // Add two resources with the same key that delete each other from the cache when destroyed.
121c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    TestResource* a = new TestResource(context->getGpu());
122c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon    TestResource* b = new TestResource(context->getGpu());
123c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    cache.addResource(key, a);
124c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    cache.addResource(key, b);
125c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    // Circle back.
126c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    a->setDeleteWhenDestroyed(&cache, b);
127c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    b->setDeleteWhenDestroyed(&cache, a);
128c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    a->unref();
129c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    b->unref();
130c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org
131c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    // Add a third independent resource also with the same key.
1326d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomon    GrGpuResource* r = new TestResource(context->getGpu());
133c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    cache.addResource(key, r);
134c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    r->unref();
135c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org
136c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    // Invalidate all three, all three should be purged and destroyed.
137c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    REPORTER_ASSERT(reporter, 3 == TestResource::alive());
138c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    const GrResourceInvalidatedMessage msg = { key };
139c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    SkMessageBus<GrResourceInvalidatedMessage>::Post(msg);
140c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    cache.purgeAsNeeded();
141c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org    REPORTER_ASSERT(reporter, 0 == TestResource::alive());
142c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org}
143c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org
144bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.orgstatic void test_cache_delete_on_destruction(skiatest::Reporter* reporter,
145bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org                                             GrContext* context) {
146bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org    GrCacheID::Domain domain = GrCacheID::GenerateDomain();
147bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org    GrCacheID::Key keyData;
148bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org    keyData.fData64[0] = 5;
149bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org    keyData.fData64[1] = 0;
150bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org    GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType();
151bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org
152bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org    GrResourceKey key(GrCacheID(domain, keyData), t, 0);
153bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org
154bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org    {
155bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        {
156bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org            GrResourceCache cache(3, 30000);
157c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon            TestResource* a = new TestResource(context->getGpu());
158c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon            TestResource* b = new TestResource(context->getGpu());
159bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org            cache.addResource(key, a);
160bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org            cache.addResource(key, b);
161bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org
162bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org            a->setDeleteWhenDestroyed(&cache, b);
163bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org            b->setDeleteWhenDestroyed(&cache, a);
164bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org
165bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org            a->unref();
166bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org            b->unref();
167bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org            REPORTER_ASSERT(reporter, 2 == TestResource::alive());
168bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        }
169bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 0 == TestResource::alive());
170bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org    }
171bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org    {
172bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        GrResourceCache cache(3, 30000);
173c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon        TestResource* a = new TestResource(context->getGpu());
174c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon        TestResource* b = new TestResource(context->getGpu());
175bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        cache.addResource(key, a);
176bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        cache.addResource(key, b);
177bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org
178bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        a->setDeleteWhenDestroyed(&cache, b);
179bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        b->setDeleteWhenDestroyed(&cache, a);
180bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org
181bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        a->unref();
182bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        b->unref();
183bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org
184bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        cache.deleteResource(a->getCacheEntry());
185bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org
186bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 0 == TestResource::alive());
187bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org    }
188bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org}
189bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org
19011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.orgstatic void test_resource_size_changed(skiatest::Reporter* reporter,
19111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org                                       GrContext* context) {
19211c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    GrCacheID::Domain domain = GrCacheID::GenerateDomain();
19311c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType();
19411c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
19511c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    GrCacheID::Key key1Data;
19611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    key1Data.fData64[0] = 0;
19711c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    key1Data.fData64[1] = 0;
19811c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    GrResourceKey key1(GrCacheID(domain, key1Data), t, 0);
19911c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
20011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    GrCacheID::Key key2Data;
20111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    key2Data.fData64[0] = 1;
20211c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    key2Data.fData64[1] = 0;
20311c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    GrResourceKey key2(GrCacheID(domain, key2Data), t, 0);
20411c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
20511c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    // Test changing resources sizes (both increase & decrease).
20611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    {
20711c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        GrResourceCache cache(2, 300);
20811c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
209c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon        TestResource* a = new TestResource(context->getGpu());
21011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        a->setSize(100); // Test didChangeGpuMemorySize() when not in the cache.
21111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        cache.addResource(key1, a);
21211c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        a->unref();
21311c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
214c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon        TestResource* b = new TestResource(context->getGpu());
21511c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        b->setSize(100);
21611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        cache.addResource(key2, b);
21711c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        b->unref();
21811c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
21911c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 200 == cache.getCachedResourceBytes());
22011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount());
22111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
22211c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        static_cast<TestResource*>(cache.find(key2))->setSize(200);
22311c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        static_cast<TestResource*>(cache.find(key1))->setSize(50);
22411c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
22511c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 250 == cache.getCachedResourceBytes());
22611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount());
22711c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    }
22811c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
22911c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    // Test increasing a resources size beyond the cache budget.
23011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    {
23111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        GrResourceCache cache(2, 300);
23211c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
233c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon        TestResource* a = new TestResource(context->getGpu(), 100);
23411c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        cache.addResource(key1, a);
23511c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        a->unref();
23611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
237c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon        TestResource* b = new TestResource(context->getGpu(), 100);
23811c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        cache.addResource(key2, b);
23911c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        b->unref();
24011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
24111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 200 == cache.getCachedResourceBytes());
24211c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount());
24311c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
24411c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        static_cast<TestResource*>(cache.find(key2))->setSize(201);
24511c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, NULL == cache.find(key1));
24611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
24711c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 201 == cache.getCachedResourceBytes());
24811c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 1 == cache.getCachedResourceCount());
24911c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    }
25011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
25111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    // Test changing the size of an exclusively-held resource.
25211c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    {
25311c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        GrResourceCache cache(2, 300);
25411c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
255c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon        TestResource* a = new TestResource(context->getGpu(), 100);
25611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        cache.addResource(key1, a);
25711c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        cache.makeExclusive(a->getCacheEntry());
25811c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
259c44be0e9e4cee5402909c06370a630eee188a8f3bsalomon        TestResource* b = new TestResource(context->getGpu(), 100);
26011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        cache.addResource(key2, b);
26111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        b->unref();
26211c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
26311c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 200 == cache.getCachedResourceBytes());
26411c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount());
26511c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, NULL == cache.find(key1));
26611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
26711c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        a->setSize(200);
26811c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
26911c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 300 == cache.getCachedResourceBytes());
27011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount());
27111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        // Internal resource cache validation will test the detached size (debug mode only).
27211c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
27311c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        cache.makeNonExclusive(a->getCacheEntry());
27411c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        a->unref();
27511c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
27611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 300 == cache.getCachedResourceBytes());
27711c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount());
27849f085dddff10473b6ebf832a974288300224e60bsalomon        REPORTER_ASSERT(reporter, cache.find(key1));
27911c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        // Internal resource cache validation will test the detached size (debug mode only).
28011c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org    }
28111c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org}
28211c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org
283c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////////
2844ee16bfaedb14aff8cf102f1f0722ff2529a9699tfarina@chromium.orgDEF_GPUTEST(ResourceCache, reporter, factory) {
285c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) {
286c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        GrContextFactory::GLContextType glType = static_cast<GrContextFactory::GLContextType>(type);
287c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        if (!GrContextFactory::IsRenderingGLContext(glType)) {
288c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org            continue;
289c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        }
290c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        GrContext* context = factory->get(glType);
291c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        if (NULL == context) {
292c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org            continue;
293c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        }
294c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
295c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        GrTextureDesc desc;
296c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        desc.fConfig = kSkia8888_GrPixelConfig;
297c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        desc.fFlags = kRenderTarget_GrTextureFlagBit;
298c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        desc.fWidth = gWidth;
299c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org        desc.fHeight = gHeight;
30069f6f00fd975823e825c5aa0b1b8f4416e7c812breed        SkImageInfo info = SkImageInfo::MakeN32Premul(gWidth, gHeight);
3014a8126e7f81384526629b1e21bf89b632ea13cd9reed        SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(context, info));
302c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
30369f6f00fd975823e825c5aa0b1b8f4416e7c812breed        test_cache(reporter, context, surface->getCanvas());
304c665804300096c2e7617379835bb83d715538788commit-bot@chromium.org        test_purge_invalidated(reporter, context);
305bd58febffb103ea830bf027c5a95313548f7ea8ecommit-bot@chromium.org        test_cache_delete_on_destruction(reporter, context);
30611c6b39cfa24f812ceb115589f51a60a56ef14fecommit-bot@chromium.org        test_resource_size_changed(reporter, context);
307c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org    }
308c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org}
309c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org
310c28f555f7f4259216a4a524cae6676ab2c56871acommit-bot@chromium.org#endif
311