1644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org/* 2644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org * Copyright 2013 Google Inc. 3644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org * 4644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 5644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org * found in the LICENSE file. 6644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org */ 7644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 88b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon#include "Benchmark.h" 98b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon 10644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org#if SK_SUPPORT_GPU 11644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 126d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomon#include "GrGpuResource.h" 133582d3ee9fffdec715f5e4949a241ab08e6271ecbsalomon#include "GrGpuResourcePriv.h" 14f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "GrContext.h" 15bcf0a52d4f4221b158e68a06ba0c4cc4db011060bsalomon#include "GrGpu.h" 160ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon#include "GrResourceCache.h" 17644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org#include "SkCanvas.h" 18644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 19644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.orgenum { 2010e23caea3106be125acea10a637789e5a15c728bsalomon CACHE_SIZE_COUNT = 4096, 21644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org}; 22644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 2310e23caea3106be125acea10a637789e5a15c728bsalomonclass BenchResource : public GrGpuResource { 24644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.orgpublic: 2510e23caea3106be125acea10a637789e5a15c728bsalomon BenchResource (GrGpu* gpu) 262e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen : INHERITED(gpu) { 272e6055b3ea14a04fcde1ac1974a70bf00b1e295bkkinnunen this->registerWithCache(SkBudgeted::kYes); 28644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 29644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 3054b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen static void ComputeKey(int i, int keyData32Count, GrUniqueKey* key) { 318718aafec239c93485e45bbe8fed19d9a8def079bsalomon static GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); 3254b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen GrUniqueKey::Builder builder(key, kDomain, keyData32Count); 3354b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen for (int j = 0; j < keyData32Count; ++j) { 3454b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen builder[j] = i + j; 3554b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen } 36644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 37644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 38644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.orgprivate: 3936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein size_t onGpuMemorySize() const override { return 100; } 406d3fe022d68fd6dd32c0fab30e24fa5a4f048946bsalomon typedef GrGpuResource INHERITED; 41644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org}; 42644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 4354b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenstatic void populate_cache(GrGpu* gpu, int resourceCount, int keyData32Count) { 44644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org for (int i = 0; i < resourceCount; ++i) { 458718aafec239c93485e45bbe8fed19d9a8def079bsalomon GrUniqueKey key; 4654b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen BenchResource::ComputeKey(i, keyData32Count, &key); 47385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary GrGpuResource* resource = new BenchResource(gpu); 488718aafec239c93485e45bbe8fed19d9a8def079bsalomon resource->resourcePriv().setUniqueKey(key); 49644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org resource->unref(); 50644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 51644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org} 52644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 53f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass GrResourceCacheBenchAdd : public Benchmark { 54644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.orgpublic: 5554b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen GrResourceCacheBenchAdd(int keyData32Count) 5654b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen : fFullName("grresourcecache_add") 5754b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen , fKeyData32Count(keyData32Count) { 5854b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen if (keyData32Count > 1) { 5954b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen fFullName.appendf("_%d", fKeyData32Count); 6054b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen } 6154b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen } 6254b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen 6336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool isSuitableFor(Backend backend) override { 648b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon return backend == kNonRendering_Backend; 65644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 66644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.orgprotected: 6736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 6854b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen return fFullName.c_str(); 69644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 70644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 71a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas* canvas) override { 7291a3e52552c15751aea09b7a8a896e4edd09d42eBrian Salomon sk_sp<GrContext> context(GrContext::Create(kMock_GrBackend, (GrBackendContext) nullptr)); 7396fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == context) { 748b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon return; 758b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon } 768b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon // Set the cache budget to be very large so no purging occurs. 7710e23caea3106be125acea10a637789e5a15c728bsalomon context->setResourceCacheLimits(CACHE_SIZE_COUNT, 1 << 30); 788b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon 790ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon GrResourceCache* cache = context->getResourceCache(); 808b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon 818b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon // Make sure the cache is empty. 820ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon cache->purgeAllUnlocked(); 830ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon SkASSERT(0 == cache->getResourceCount() && 0 == cache->getResourceBytes()); 848b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon 858b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon GrGpu* gpu = context->getGpu(); 86644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 873361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 8854b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen populate_cache(gpu, CACHE_SIZE_COUNT, fKeyData32Count); 890ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon SkASSERT(CACHE_SIZE_COUNT == cache->getResourceCount()); 90644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 91644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 92644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 93644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.orgprivate: 9454b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen SkString fFullName; 9554b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen int fKeyData32Count; 96f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 97644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org}; 98644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 99f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass GrResourceCacheBenchFind : public Benchmark { 100644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.orgpublic: 10154b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen GrResourceCacheBenchFind(int keyData32Count) 10254b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen : fFullName("grresourcecache_find") 10354b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen , fKeyData32Count(keyData32Count) { 10454b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen if (keyData32Count > 1) { 10554b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen fFullName.appendf("_%d", fKeyData32Count); 10654b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen } 10754b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen } 10854b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen 10936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool isSuitableFor(Backend backend) override { 1108b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon return backend == kNonRendering_Backend; 111644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 112644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.orgprotected: 11336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 11454b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen return fFullName.c_str(); 115644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 116644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 1178a6697af95b340aad6dee7e6228048fa305c1e59joshualitt void onDelayedSetup() override { 11891a3e52552c15751aea09b7a8a896e4edd09d42eBrian Salomon fContext.reset(GrContext::Create(kMock_GrBackend, (GrBackendContext) nullptr)); 11910e23caea3106be125acea10a637789e5a15c728bsalomon if (!fContext) { 1208b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon return; 1218b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon } 1228b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon // Set the cache budget to be very large so no purging occurs. 12310e23caea3106be125acea10a637789e5a15c728bsalomon fContext->setResourceCacheLimits(CACHE_SIZE_COUNT, 1 << 30); 1248b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon 1250ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon GrResourceCache* cache = fContext->getResourceCache(); 1268b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon 1278b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon // Make sure the cache is empty. 1280ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon cache->purgeAllUnlocked(); 1290ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon SkASSERT(0 == cache->getResourceCount() && 0 == cache->getResourceBytes()); 1308b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon 13110e23caea3106be125acea10a637789e5a15c728bsalomon GrGpu* gpu = fContext->getGpu(); 1328b79d23f825cd9e0f9e3bf8aaa9e209940b17ef6bsalomon 13354b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen populate_cache(gpu, CACHE_SIZE_COUNT, fKeyData32Count); 13410e23caea3106be125acea10a637789e5a15c728bsalomon } 135644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 136a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas* canvas) override { 13710e23caea3106be125acea10a637789e5a15c728bsalomon if (!fContext) { 13810e23caea3106be125acea10a637789e5a15c728bsalomon return; 13910e23caea3106be125acea10a637789e5a15c728bsalomon } 1400ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon GrResourceCache* cache = fContext->getResourceCache(); 1410ea80f43a1af05b8157a4ef387223bb5b0da35edbsalomon SkASSERT(CACHE_SIZE_COUNT == cache->getResourceCount()); 1423361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 14310e23caea3106be125acea10a637789e5a15c728bsalomon for (int k = 0; k < CACHE_SIZE_COUNT; ++k) { 1448718aafec239c93485e45bbe8fed19d9a8def079bsalomon GrUniqueKey key; 14554b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen BenchResource::ComputeKey(k, fKeyData32Count, &key); 1462db83612576d64935bd88747cf9855e79cad70d4Hal Canary sk_sp<GrGpuResource> resource(cache->findAndRefUniqueResource(key)); 14710e23caea3106be125acea10a637789e5a15c728bsalomon SkASSERT(resource); 148644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 149644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 150644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 151644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 152644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.orgprivate: 1532db83612576d64935bd88747cf9855e79cad70d4Hal Canary sk_sp<GrContext> fContext; 15454b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen SkString fFullName; 15554b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen int fKeyData32Count; 156f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 157644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org}; 158644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 15954b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchAdd(1); ) 16054b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen#ifdef SK_RELEASE 16154b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen// Only on release because on debug the SkTDynamicHash validation is too slow. 16254b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchAdd(2); ) 16354b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchAdd(3); ) 16454b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchAdd(4); ) 16554b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchAdd(5); ) 16654b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchAdd(10); ) 16754b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchAdd(25); ) 16854b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchAdd(54); ) 16954b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchAdd(55); ) 17054b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchAdd(56); ) 17154b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen#endif 17254b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen 17354b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchFind(1); ) 17454b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen#ifdef SK_RELEASE 17554b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchFind(2); ) 17654b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchFind(3); ) 17754b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchFind(4); ) 17854b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchFind(5); ) 17954b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchFind(10); ) 18054b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchFind(25); ) 18154b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchFind(54); ) 18254b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchFind(55); ) 18354b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunenDEF_BENCH( return new GrResourceCacheBenchFind(56); ) 18454b8511189bb5da6bfd248fa63f5c4156e9e2bd6kkinnunen#endif 185644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 186644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org#endif 187