blob: 6767ca1d49ce66006dadcbbecb6719e56efa52dd [file] [log] [blame]
commit-bot@chromium.org644629c2013-11-21 06:21:58 +00001
2/*
3 * Copyright 2013 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#if SK_SUPPORT_GPU
10
11#include "GrContext.h"
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000012#include "GrCacheable.h"
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000013#include "GrResourceCache.h"
14#include "GrStencilBuffer.h"
15#include "GrTexture.h"
16#include "SkBenchmark.h"
17#include "SkCanvas.h"
18
19enum {
20 CACHE_SIZE_COUNT = 2048,
21 CACHE_SIZE_BYTES = 2 * 1024 * 1024,
22};
23
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000024class StencilResource : public GrCacheable {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000025public:
26 SK_DECLARE_INST_COUNT(StencilResource);
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000027 StencilResource(int id)
28 : fID(id) {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000029 }
30
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000031 virtual size_t gpuMemorySize() const SK_OVERRIDE {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000032 return 100 + ((fID % 1 == 0) ? -5 : 6);
33 }
34
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000035 virtual bool isValidOnGpu() const SK_OVERRIDE {
36 return true;
37 }
38
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000039 static GrResourceKey ComputeKey(int width, int height, int sampleCnt) {
40 return GrStencilBuffer::ComputeKey(width, height, sampleCnt);
41 }
42
43 int fID;
44
45private:
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000046 typedef GrCacheable INHERITED;
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000047};
48
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000049class TextureResource : public GrCacheable {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000050public:
51 SK_DECLARE_INST_COUNT(TextureResource);
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000052 TextureResource(int id)
53 : fID(id) {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000054 }
55
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000056 virtual size_t gpuMemorySize() const SK_OVERRIDE {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000057 return 100 + ((fID % 1 == 0) ? -40 : 33);
58 }
59
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000060 virtual bool isValidOnGpu() const SK_OVERRIDE {
61 return true;
62 }
63
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000064 static GrResourceKey ComputeKey(const GrTextureDesc& desc) {
65 return GrTexture::ComputeScratchKey(desc);
66 }
67
68 int fID;
69
70private:
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000071 typedef GrCacheable INHERITED;
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000072};
73
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000074static void get_stencil(int i, int* w, int* h, int* s) {
75 *w = i % 1024;
76 *h = i * 2 % 1024;
77 *s = i % 1 == 0 ? 0 : 4;
78}
79
80static void get_texture_desc(int i, GrTextureDesc* desc) {
81 desc->fFlags = kRenderTarget_GrTextureFlagBit |
82 kNoStencil_GrTextureFlagBit;
83 desc->fWidth = i % 1024;
84 desc->fHeight = i * 2 % 1024;
85 desc->fConfig = static_cast<GrPixelConfig>(i % (kLast_GrPixelConfig + 1));
86 desc->fSampleCnt = i % 1 == 0 ? 0 : 4;
87}
88
89static void populate_cache(GrResourceCache* cache, GrGpu* gpu, int resourceCount) {
90 for (int i = 0; i < resourceCount; ++i) {
91 int w, h, s;
92 get_stencil(i, &w, &h, &s);
93 GrResourceKey key = GrStencilBuffer::ComputeKey(w, h, s);
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000094 GrCacheable* resource = SkNEW_ARGS(StencilResource, (i));
95 cache->purgeAsNeeded(1, resource->gpuMemorySize());
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000096 cache->addResource(key, resource);
97 resource->unref();
98 }
99
100 for (int i = 0; i < resourceCount; ++i) {
101 GrTextureDesc desc;
102 get_texture_desc(i, &desc);
103 GrResourceKey key = TextureResource::ComputeKey(desc);
commit-bot@chromium.org089a7802014-05-02 21:38:22 +0000104 GrCacheable* resource = SkNEW_ARGS(TextureResource, (i));
105 cache->purgeAsNeeded(1, resource->gpuMemorySize());
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000106 cache->addResource(key, resource);
107 resource->unref();
108 }
109}
110
111static void check_cache_contents_or_die(GrResourceCache* cache, int k) {
112 // Benchmark find calls that succeed.
113 {
114 GrTextureDesc desc;
115 get_texture_desc(k, &desc);
116 GrResourceKey key = TextureResource::ComputeKey(desc);
commit-bot@chromium.org089a7802014-05-02 21:38:22 +0000117 GrCacheable* item = cache->find(key);
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000118 if (NULL == item) {
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000119 SkFAIL("cache add does not work as expected");
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000120 return;
121 }
122 if (static_cast<TextureResource*>(item)->fID != k) {
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000123 SkFAIL("cache add does not work as expected");
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000124 return;
125 }
126 }
127 {
128 int w, h, s;
129 get_stencil(k, &w, &h, &s);
130 GrResourceKey key = StencilResource::ComputeKey(w, h, s);
commit-bot@chromium.org089a7802014-05-02 21:38:22 +0000131 GrCacheable* item = cache->find(key);
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000132 if (NULL == item) {
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000133 SkFAIL("cache add does not work as expected");
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000134 return;
135 }
136 if (static_cast<TextureResource*>(item)->fID != k) {
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000137 SkFAIL("cache add does not work as expected");
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000138 return;
139 }
140 }
141
142 // Benchmark also find calls that always fail.
143 {
144 GrTextureDesc desc;
145 get_texture_desc(k, &desc);
146 desc.fHeight |= 1;
147 GrResourceKey key = TextureResource::ComputeKey(desc);
commit-bot@chromium.org089a7802014-05-02 21:38:22 +0000148 GrCacheable* item = cache->find(key);
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000149 if (NULL != item) {
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000150 SkFAIL("cache add does not work as expected");
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000151 return;
152 }
153 }
154 {
155 int w, h, s;
156 get_stencil(k, &w, &h, &s);
157 h |= 1;
158 GrResourceKey key = StencilResource::ComputeKey(w, h, s);
commit-bot@chromium.org089a7802014-05-02 21:38:22 +0000159 GrCacheable* item = cache->find(key);
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000160 if (NULL != item) {
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000161 SkFAIL("cache add does not work as expected");
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000162 return;
163 }
164 }
165}
166
167class GrResourceCacheBenchAdd : public SkBenchmark {
168 enum {
169 RESOURCE_COUNT = CACHE_SIZE_COUNT / 2,
170 DUPLICATE_COUNT = CACHE_SIZE_COUNT / 4,
171 };
172
173public:
174 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
175 return backend == kGPU_Backend;
176 }
177
178protected:
179 virtual const char* onGetName() SK_OVERRIDE {
180 return "grresourcecache_add";
181 }
182
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000183 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000184 GrGpu* gpu = canvas->getGrContext()->getGpu();
185
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000186 for (int i = 0; i < loops; ++i) {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000187 GrResourceCache cache(CACHE_SIZE_COUNT, CACHE_SIZE_BYTES);
188 populate_cache(&cache, gpu, DUPLICATE_COUNT);
189 populate_cache(&cache, gpu, RESOURCE_COUNT);
190
191 // Check that cache works.
192 for (int k = 0; k < RESOURCE_COUNT; k += 33) {
193 check_cache_contents_or_die(&cache, k);
194 }
195 cache.purgeAllUnlocked();
196 }
197 }
198
199private:
200 typedef SkBenchmark INHERITED;
201};
202
203class GrResourceCacheBenchFind : public SkBenchmark {
204 enum {
205 RESOURCE_COUNT = (CACHE_SIZE_COUNT / 2) - 100,
206 DUPLICATE_COUNT = 100
207 };
208
209public:
210 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
211 return backend == kGPU_Backend;
212 }
213
214protected:
215 virtual const char* onGetName() SK_OVERRIDE {
216 return "grresourcecache_find";
217 }
218
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000219 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000220 GrGpu* gpu = canvas->getGrContext()->getGpu();
221 GrResourceCache cache(CACHE_SIZE_COUNT, CACHE_SIZE_BYTES);
222 populate_cache(&cache, gpu, DUPLICATE_COUNT);
223 populate_cache(&cache, gpu, RESOURCE_COUNT);
224
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000225 for (int i = 0; i < loops; ++i) {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000226 for (int k = 0; k < RESOURCE_COUNT; ++k) {
227 check_cache_contents_or_die(&cache, k);
228 }
229 }
230 }
231
232private:
233 typedef SkBenchmark INHERITED;
234};
235
236DEF_BENCH( return new GrResourceCacheBenchAdd(); )
237DEF_BENCH( return new GrResourceCacheBenchFind(); )
238
239#endif