blob: cc185cf04f0bfdae680c79b236b82ecfc2c9d6b4 [file] [log] [blame]
commit-bot@chromium.org644629c2013-11-21 06:21:58 +00001/*
2 * 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
bsalomon8b79d232014-11-10 10:19:06 -08008#include "Benchmark.h"
9
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000010#if SK_SUPPORT_GPU
11
Robert Phillips6be756b2018-01-16 15:07:54 -050012#include "GrContext.h"
13#include "GrContextPriv.h"
14#include "GrGpu.h"
bsalomon6d3fe022014-07-25 08:35:45 -070015#include "GrGpuResource.h"
bsalomon3582d3e2015-02-13 14:20:05 -080016#include "GrGpuResourcePriv.h"
bsalomon0ea80f42015-02-11 10:49:59 -080017#include "GrResourceCache.h"
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000018#include "SkCanvas.h"
19
20enum {
bsalomon10e23ca2014-11-25 05:52:06 -080021 CACHE_SIZE_COUNT = 4096,
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000022};
23
bsalomon10e23ca2014-11-25 05:52:06 -080024class BenchResource : public GrGpuResource {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000025public:
bsalomon10e23ca2014-11-25 05:52:06 -080026 BenchResource (GrGpu* gpu)
kkinnunen2e6055b2016-04-22 01:48:29 -070027 : INHERITED(gpu) {
28 this->registerWithCache(SkBudgeted::kYes);
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000029 }
30
kkinnunen54b85112015-05-18 22:47:33 -070031 static void ComputeKey(int i, int keyData32Count, GrUniqueKey* key) {
bsalomon8718aaf2015-02-19 07:24:21 -080032 static GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain();
kkinnunen54b85112015-05-18 22:47:33 -070033 GrUniqueKey::Builder builder(key, kDomain, keyData32Count);
34 for (int j = 0; j < keyData32Count; ++j) {
35 builder[j] = i + j;
36 }
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000037 }
38
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000039private:
mtklein36352bf2015-03-25 18:17:31 -070040 size_t onGpuMemorySize() const override { return 100; }
Derek Sollenbergercf6da8c2018-03-29 13:40:02 -040041 const char* getResourceType() const override { return "bench"; }
bsalomon6d3fe022014-07-25 08:35:45 -070042 typedef GrGpuResource INHERITED;
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000043};
44
kkinnunen54b85112015-05-18 22:47:33 -070045static void populate_cache(GrGpu* gpu, int resourceCount, int keyData32Count) {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000046 for (int i = 0; i < resourceCount; ++i) {
bsalomon8718aaf2015-02-19 07:24:21 -080047 GrUniqueKey key;
kkinnunen54b85112015-05-18 22:47:33 -070048 BenchResource::ComputeKey(i, keyData32Count, &key);
halcanary385fe4d2015-08-26 13:07:48 -070049 GrGpuResource* resource = new BenchResource(gpu);
bsalomon8718aaf2015-02-19 07:24:21 -080050 resource->resourcePriv().setUniqueKey(key);
bsalomon19cd0f12014-11-24 12:19:05 -080051 resource->unref();
52 }
bsalomon19cd0f12014-11-24 12:19:05 -080053}
54
tfarinaf168b862014-06-19 12:32:29 -070055class GrResourceCacheBenchAdd : public Benchmark {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000056public:
kkinnunen54b85112015-05-18 22:47:33 -070057 GrResourceCacheBenchAdd(int keyData32Count)
58 : fFullName("grresourcecache_add")
59 , fKeyData32Count(keyData32Count) {
60 if (keyData32Count > 1) {
61 fFullName.appendf("_%d", fKeyData32Count);
62 }
63 }
64
mtklein36352bf2015-03-25 18:17:31 -070065 bool isSuitableFor(Backend backend) override {
bsalomon8b79d232014-11-10 10:19:06 -080066 return backend == kNonRendering_Backend;
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000067 }
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000068protected:
mtklein36352bf2015-03-25 18:17:31 -070069 const char* onGetName() override {
kkinnunen54b85112015-05-18 22:47:33 -070070 return fFullName.c_str();
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000071 }
72
mtkleina1ebeb22015-10-01 09:43:39 -070073 void onDraw(int loops, SkCanvas* canvas) override {
Greg Daniel02611d92017-07-25 10:05:01 -040074 sk_sp<GrContext> context(GrContext::MakeMock(nullptr));
halcanary96fcdcc2015-08-27 07:41:13 -070075 if (nullptr == context) {
bsalomon8b79d232014-11-10 10:19:06 -080076 return;
77 }
78 // Set the cache budget to be very large so no purging occurs.
bsalomon10e23ca2014-11-25 05:52:06 -080079 context->setResourceCacheLimits(CACHE_SIZE_COUNT, 1 << 30);
bsalomon8b79d232014-11-10 10:19:06 -080080
Robert Phillips6be756b2018-01-16 15:07:54 -050081 GrResourceCache* cache = context->contextPriv().getResourceCache();
bsalomon8b79d232014-11-10 10:19:06 -080082
83 // Make sure the cache is empty.
bsalomon0ea80f42015-02-11 10:49:59 -080084 cache->purgeAllUnlocked();
85 SkASSERT(0 == cache->getResourceCount() && 0 == cache->getResourceBytes());
bsalomon8b79d232014-11-10 10:19:06 -080086
Robert Phillipsf35fd8d2018-01-22 10:48:15 -050087 GrGpu* gpu = context->contextPriv().getGpu();
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000088
commit-bot@chromium.org33614712013-12-03 18:17:16 +000089 for (int i = 0; i < loops; ++i) {
kkinnunen54b85112015-05-18 22:47:33 -070090 populate_cache(gpu, CACHE_SIZE_COUNT, fKeyData32Count);
bsalomon0ea80f42015-02-11 10:49:59 -080091 SkASSERT(CACHE_SIZE_COUNT == cache->getResourceCount());
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000092 }
93 }
94
95private:
kkinnunen54b85112015-05-18 22:47:33 -070096 SkString fFullName;
97 int fKeyData32Count;
tfarinaf168b862014-06-19 12:32:29 -070098 typedef Benchmark INHERITED;
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000099};
100
tfarinaf168b862014-06-19 12:32:29 -0700101class GrResourceCacheBenchFind : public Benchmark {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000102public:
kkinnunen54b85112015-05-18 22:47:33 -0700103 GrResourceCacheBenchFind(int keyData32Count)
104 : fFullName("grresourcecache_find")
105 , fKeyData32Count(keyData32Count) {
106 if (keyData32Count > 1) {
107 fFullName.appendf("_%d", fKeyData32Count);
108 }
109 }
110
mtklein36352bf2015-03-25 18:17:31 -0700111 bool isSuitableFor(Backend backend) override {
bsalomon8b79d232014-11-10 10:19:06 -0800112 return backend == kNonRendering_Backend;
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000113 }
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000114protected:
mtklein36352bf2015-03-25 18:17:31 -0700115 const char* onGetName() override {
kkinnunen54b85112015-05-18 22:47:33 -0700116 return fFullName.c_str();
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000117 }
118
joshualitt8a6697a2015-09-30 12:11:07 -0700119 void onDelayedSetup() override {
Greg Daniel02611d92017-07-25 10:05:01 -0400120 fContext = GrContext::MakeMock(nullptr);
bsalomon10e23ca2014-11-25 05:52:06 -0800121 if (!fContext) {
bsalomon8b79d232014-11-10 10:19:06 -0800122 return;
123 }
124 // Set the cache budget to be very large so no purging occurs.
bsalomon10e23ca2014-11-25 05:52:06 -0800125 fContext->setResourceCacheLimits(CACHE_SIZE_COUNT, 1 << 30);
bsalomon8b79d232014-11-10 10:19:06 -0800126
Robert Phillips6be756b2018-01-16 15:07:54 -0500127 GrResourceCache* cache = fContext->contextPriv().getResourceCache();
bsalomon8b79d232014-11-10 10:19:06 -0800128
129 // Make sure the cache is empty.
bsalomon0ea80f42015-02-11 10:49:59 -0800130 cache->purgeAllUnlocked();
131 SkASSERT(0 == cache->getResourceCount() && 0 == cache->getResourceBytes());
bsalomon8b79d232014-11-10 10:19:06 -0800132
Robert Phillipsf35fd8d2018-01-22 10:48:15 -0500133 GrGpu* gpu = fContext->contextPriv().getGpu();
bsalomon8b79d232014-11-10 10:19:06 -0800134
kkinnunen54b85112015-05-18 22:47:33 -0700135 populate_cache(gpu, CACHE_SIZE_COUNT, fKeyData32Count);
bsalomon10e23ca2014-11-25 05:52:06 -0800136 }
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000137
mtkleina1ebeb22015-10-01 09:43:39 -0700138 void onDraw(int loops, SkCanvas* canvas) override {
bsalomon10e23ca2014-11-25 05:52:06 -0800139 if (!fContext) {
140 return;
141 }
Robert Phillips6be756b2018-01-16 15:07:54 -0500142 GrResourceCache* cache = fContext->contextPriv().getResourceCache();
bsalomon0ea80f42015-02-11 10:49:59 -0800143 SkASSERT(CACHE_SIZE_COUNT == cache->getResourceCount());
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000144 for (int i = 0; i < loops; ++i) {
bsalomon10e23ca2014-11-25 05:52:06 -0800145 for (int k = 0; k < CACHE_SIZE_COUNT; ++k) {
bsalomon8718aaf2015-02-19 07:24:21 -0800146 GrUniqueKey key;
kkinnunen54b85112015-05-18 22:47:33 -0700147 BenchResource::ComputeKey(k, fKeyData32Count, &key);
Hal Canary2db83612016-11-04 13:02:54 -0400148 sk_sp<GrGpuResource> resource(cache->findAndRefUniqueResource(key));
bsalomon10e23ca2014-11-25 05:52:06 -0800149 SkASSERT(resource);
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000150 }
151 }
152 }
153
154private:
Hal Canary2db83612016-11-04 13:02:54 -0400155 sk_sp<GrContext> fContext;
kkinnunen54b85112015-05-18 22:47:33 -0700156 SkString fFullName;
157 int fKeyData32Count;
tfarinaf168b862014-06-19 12:32:29 -0700158 typedef Benchmark INHERITED;
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000159};
160
kkinnunen54b85112015-05-18 22:47:33 -0700161DEF_BENCH( return new GrResourceCacheBenchAdd(1); )
162#ifdef SK_RELEASE
163// Only on release because on debug the SkTDynamicHash validation is too slow.
164DEF_BENCH( return new GrResourceCacheBenchAdd(2); )
165DEF_BENCH( return new GrResourceCacheBenchAdd(3); )
166DEF_BENCH( return new GrResourceCacheBenchAdd(4); )
167DEF_BENCH( return new GrResourceCacheBenchAdd(5); )
168DEF_BENCH( return new GrResourceCacheBenchAdd(10); )
169DEF_BENCH( return new GrResourceCacheBenchAdd(25); )
170DEF_BENCH( return new GrResourceCacheBenchAdd(54); )
171DEF_BENCH( return new GrResourceCacheBenchAdd(55); )
172DEF_BENCH( return new GrResourceCacheBenchAdd(56); )
173#endif
174
175DEF_BENCH( return new GrResourceCacheBenchFind(1); )
176#ifdef SK_RELEASE
177DEF_BENCH( return new GrResourceCacheBenchFind(2); )
178DEF_BENCH( return new GrResourceCacheBenchFind(3); )
179DEF_BENCH( return new GrResourceCacheBenchFind(4); )
180DEF_BENCH( return new GrResourceCacheBenchFind(5); )
181DEF_BENCH( return new GrResourceCacheBenchFind(10); )
182DEF_BENCH( return new GrResourceCacheBenchFind(25); )
183DEF_BENCH( return new GrResourceCacheBenchFind(54); )
184DEF_BENCH( return new GrResourceCacheBenchFind(55); )
185DEF_BENCH( return new GrResourceCacheBenchFind(56); )
186#endif
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000187
188#endif