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