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