Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
GrResourceCacheBench.cpp
Go to the documentation of this file.
1/*
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
8#include "bench/Benchmark.h"
9
17
18enum {
20};
21
23public:
24 BenchResource(GrGpu* gpu, std::string_view label)
25 : INHERITED(gpu, label) {
27 }
28
29 static void ComputeKey(int i, int keyData32Count, skgpu::UniqueKey* key) {
31 skgpu::UniqueKey::Builder builder(key, kDomain, keyData32Count);
32 for (int j = 0; j < keyData32Count; ++j) {
33 builder[j] = i + j;
34 }
35 }
36
37private:
38 size_t onGpuMemorySize() const override { return 100; }
39 void onSetLabel() override{}
40 const char* getResourceType() const override { return "bench"; }
41 using INHERITED = GrGpuResource;
42};
43
44static void populate_cache(GrGpu* gpu, int resourceCount, int keyData32Count) {
45 for (int i = 0; i < resourceCount; ++i) {
47 BenchResource::ComputeKey(i, keyData32Count, &key);
48 GrGpuResource* resource = new BenchResource(gpu, /*label=*/"BenchResource");
49 resource->resourcePriv().setUniqueKey(key);
50 resource->unref();
51 }
52}
53
55public:
56 GrResourceCacheBenchAdd(int keyData32Count)
57 : fFullName("grresourcecache_add")
58 , fKeyData32Count(keyData32Count) {
59 if (keyData32Count > 1) {
60 fFullName.appendf("_%d", fKeyData32Count);
61 }
62 }
63
64 bool isSuitableFor(Backend backend) override {
66 }
67protected:
68 const char* onGetName() override {
69 return fFullName.c_str();
70 }
71
72 void onDraw(int loops, SkCanvas* canvas) override {
74 if (nullptr == context) {
75 return;
76 }
77 // Set the cache budget to be very large so no purging occurs.
78 context->setResourceCacheLimits(CACHE_SIZE_COUNT, 1 << 30);
79
80 GrResourceCache* cache = context->priv().getResourceCache();
81
82 // Make sure the cache is empty.
83 cache->purgeUnlockedResources(GrPurgeResourceOptions::kAllResources);
84 SkASSERT(0 == cache->getResourceCount() && 0 == cache->getResourceBytes());
85
86 GrGpu* gpu = context->priv().getGpu();
87
88 for (int i = 0; i < loops; ++i) {
89 populate_cache(gpu, CACHE_SIZE_COUNT, fKeyData32Count);
90 SkASSERT(CACHE_SIZE_COUNT == cache->getResourceCount());
91 }
92 }
93
94private:
95 SkString fFullName;
96 int fKeyData32Count;
97 using INHERITED = Benchmark;
98};
99
101public:
102 GrResourceCacheBenchFind(int keyData32Count)
103 : fFullName("grresourcecache_find")
104 , fKeyData32Count(keyData32Count) {
105 if (keyData32Count > 1) {
106 fFullName.appendf("_%d", fKeyData32Count);
107 }
108 }
109
110 bool isSuitableFor(Backend backend) override {
112 }
113protected:
114 const char* onGetName() override {
115 return fFullName.c_str();
116 }
117
118 void onDelayedSetup() override {
119 fContext = GrDirectContext::MakeMock(nullptr);
120 if (!fContext) {
121 return;
122 }
123 // Set the cache budget to be very large so no purging occurs.
124 fContext->setResourceCacheLimits(CACHE_SIZE_COUNT, 1 << 30);
125
126 GrResourceCache* cache = fContext->priv().getResourceCache();
127
128 // Make sure the cache is empty.
129 cache->purgeUnlockedResources(GrPurgeResourceOptions::kAllResources);
130 SkASSERT(0 == cache->getResourceCount() && 0 == cache->getResourceBytes());
131
132 GrGpu* gpu = fContext->priv().getGpu();
133
134 populate_cache(gpu, CACHE_SIZE_COUNT, fKeyData32Count);
135 }
136
137 void onDraw(int loops, SkCanvas* canvas) override {
138 if (!fContext) {
139 return;
140 }
141 GrResourceCache* cache = fContext->priv().getResourceCache();
142 SkASSERT(CACHE_SIZE_COUNT == cache->getResourceCount());
143 for (int i = 0; i < loops; ++i) {
144 for (int k = 0; k < CACHE_SIZE_COUNT; ++k) {
146 BenchResource::ComputeKey(k, fKeyData32Count, &key);
147 sk_sp<GrGpuResource> resource(cache->findAndRefUniqueResource(key));
148 SkASSERT(resource);
149 }
150 }
151 }
152
153private:
154 sk_sp<GrDirectContext> fContext;
155 SkString fFullName;
156 int fKeyData32Count;
157 using INHERITED = Benchmark;
158};
159
160DEF_BENCH( return new GrResourceCacheBenchAdd(1); )
161#ifdef SK_RELEASE
162// Only on release because on debug the SkTDynamicHash validation is too slow.
163DEF_BENCH( return new GrResourceCacheBenchAdd(2); )
164DEF_BENCH( return new GrResourceCacheBenchAdd(3); )
165DEF_BENCH( return new GrResourceCacheBenchAdd(4); )
166DEF_BENCH( return new GrResourceCacheBenchAdd(5); )
167DEF_BENCH( return new GrResourceCacheBenchAdd(10); )
168DEF_BENCH( return new GrResourceCacheBenchAdd(25); )
169DEF_BENCH( return new GrResourceCacheBenchAdd(54); )
170DEF_BENCH( return new GrResourceCacheBenchAdd(55); )
171DEF_BENCH( return new GrResourceCacheBenchAdd(56); )
172#endif
173
174DEF_BENCH( return new GrResourceCacheBenchFind(1); )
175#ifdef SK_RELEASE
176DEF_BENCH( return new GrResourceCacheBenchFind(2); )
177DEF_BENCH( return new GrResourceCacheBenchFind(3); )
178DEF_BENCH( return new GrResourceCacheBenchFind(4); )
179DEF_BENCH( return new GrResourceCacheBenchFind(5); )
180DEF_BENCH( return new GrResourceCacheBenchFind(10); )
181DEF_BENCH( return new GrResourceCacheBenchFind(25); )
182DEF_BENCH( return new GrResourceCacheBenchFind(54); )
183DEF_BENCH( return new GrResourceCacheBenchFind(55); )
184DEF_BENCH( return new GrResourceCacheBenchFind(56); )
185#endif
#define DEF_BENCH(code)
Definition Benchmark.h:20
const char * backend
static void populate_cache(GrGpu *gpu, int resourceCount, int keyData32Count)
@ CACHE_SIZE_COUNT
#define SkASSERT(cond)
Definition SkAssert.h:116
BenchResource(GrGpu *gpu, std::string_view label)
static void ComputeKey(int i, int keyData32Count, skgpu::UniqueKey *key)
void onSetLabel() override
size_t onGpuMemorySize() const override
const char * getResourceType() const override
GrResourceCache * getResourceCache()
void setResourceCacheLimits(int maxResources, size_t maxResourceBytes)
static sk_sp< GrDirectContext > MakeMock(const GrMockOptions *, const GrContextOptions &)
GrDirectContextPriv priv()
void setUniqueKey(const skgpu::UniqueKey &key)
void registerWithCache(skgpu::Budgeted)
ResourcePriv resourcePriv()
Definition GrGpu.h:62
void unref() const
bool isSuitableFor(Backend backend) override
const char * onGetName() override
void onDraw(int loops, SkCanvas *canvas) override
GrResourceCacheBenchAdd(int keyData32Count)
const char * onGetName() override
GrResourceCacheBenchFind(int keyData32Count)
bool isSuitableFor(Backend backend) override
void onDraw(int loops, SkCanvas *canvas) override
const char * c_str() const
Definition SkString.h:133
void void void appendf(const char format[],...) SK_PRINTF_LIKE(2
Definition SkString.cpp:550
static Domain GenerateDomain()