blob: 84e0e5d4c8164d936dbd9c4890abd4bf3fcdf86c [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
tfarinaf168b862014-06-19 12:32:29 -070011#include "Benchmark.h"
bsalomon6d3fe022014-07-25 08:35:45 -070012#include "GrGpuResource.h"
tfarinaf168b862014-06-19 12:32:29 -070013#include "GrContext.h"
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000014#include "GrResourceCache.h"
15#include "GrStencilBuffer.h"
16#include "GrTexture.h"
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000017#include "SkCanvas.h"
18
19enum {
20 CACHE_SIZE_COUNT = 2048,
21 CACHE_SIZE_BYTES = 2 * 1024 * 1024,
22};
23
bsalomon6d3fe022014-07-25 08:35:45 -070024class StencilResource : public GrGpuResource {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000025public:
26 SK_DECLARE_INST_COUNT(StencilResource);
bsalomonc44be0e2014-07-25 07:32:33 -070027 StencilResource(GrGpu* gpu, int id)
28 : INHERITED(gpu, false)
29 , fID(id) {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000030 }
31
bsalomonc44be0e2014-07-25 07:32:33 -070032 virtual ~StencilResource() { this->release(); }
33
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000034 virtual size_t gpuMemorySize() const SK_OVERRIDE {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000035 return 100 + ((fID % 1 == 0) ? -5 : 6);
36 }
37
38 static GrResourceKey ComputeKey(int width, int height, int sampleCnt) {
39 return GrStencilBuffer::ComputeKey(width, height, sampleCnt);
40 }
41
42 int fID;
43
44private:
bsalomon6d3fe022014-07-25 08:35:45 -070045 typedef GrGpuResource INHERITED;
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000046};
47
bsalomon6d3fe022014-07-25 08:35:45 -070048class TextureResource : public GrGpuResource {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000049public:
50 SK_DECLARE_INST_COUNT(TextureResource);
bsalomonc44be0e2014-07-25 07:32:33 -070051 TextureResource(GrGpu* gpu, int id)
52 : INHERITED(gpu, false)
53 , fID(id) {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000054 }
55
bsalomonc44be0e2014-07-25 07:32:33 -070056 virtual ~TextureResource() { this->release(); }
57
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000058 virtual size_t gpuMemorySize() const SK_OVERRIDE {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000059 return 100 + ((fID % 1 == 0) ? -40 : 33);
60 }
61
62 static GrResourceKey ComputeKey(const GrTextureDesc& desc) {
commit-bot@chromium.orge49157f2014-05-09 20:46:48 +000063 return GrTextureImpl::ComputeScratchKey(desc);
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000064 }
65
66 int fID;
67
68private:
bsalomon6d3fe022014-07-25 08:35:45 -070069 typedef GrGpuResource INHERITED;
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000070};
71
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000072static void get_stencil(int i, int* w, int* h, int* s) {
73 *w = i % 1024;
74 *h = i * 2 % 1024;
75 *s = i % 1 == 0 ? 0 : 4;
76}
77
78static void get_texture_desc(int i, GrTextureDesc* desc) {
79 desc->fFlags = kRenderTarget_GrTextureFlagBit |
80 kNoStencil_GrTextureFlagBit;
81 desc->fWidth = i % 1024;
82 desc->fHeight = i * 2 % 1024;
83 desc->fConfig = static_cast<GrPixelConfig>(i % (kLast_GrPixelConfig + 1));
84 desc->fSampleCnt = i % 1 == 0 ? 0 : 4;
85}
86
87static void populate_cache(GrResourceCache* cache, GrGpu* gpu, int resourceCount) {
88 for (int i = 0; i < resourceCount; ++i) {
89 int w, h, s;
90 get_stencil(i, &w, &h, &s);
91 GrResourceKey key = GrStencilBuffer::ComputeKey(w, h, s);
bsalomon6d3fe022014-07-25 08:35:45 -070092 GrGpuResource* resource = SkNEW_ARGS(StencilResource, (gpu, i));
commit-bot@chromium.org089a7802014-05-02 21:38:22 +000093 cache->purgeAsNeeded(1, resource->gpuMemorySize());
commit-bot@chromium.org644629c2013-11-21 06:21:58 +000094 cache->addResource(key, resource);
95 resource->unref();
96 }
97
98 for (int i = 0; i < resourceCount; ++i) {
99 GrTextureDesc desc;
100 get_texture_desc(i, &desc);
101 GrResourceKey key = TextureResource::ComputeKey(desc);
bsalomon6d3fe022014-07-25 08:35:45 -0700102 GrGpuResource* resource = SkNEW_ARGS(TextureResource, (gpu, i));
commit-bot@chromium.org089a7802014-05-02 21:38:22 +0000103 cache->purgeAsNeeded(1, resource->gpuMemorySize());
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000104 cache->addResource(key, resource);
105 resource->unref();
106 }
107}
108
109static void check_cache_contents_or_die(GrResourceCache* cache, int k) {
110 // Benchmark find calls that succeed.
111 {
112 GrTextureDesc desc;
113 get_texture_desc(k, &desc);
114 GrResourceKey key = TextureResource::ComputeKey(desc);
bsalomon6d3fe022014-07-25 08:35:45 -0700115 GrGpuResource* item = cache->find(key);
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000116 if (NULL == item) {
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000117 SkFAIL("cache add does not work as expected");
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000118 return;
119 }
120 if (static_cast<TextureResource*>(item)->fID != k) {
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000121 SkFAIL("cache add does not work as expected");
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000122 return;
123 }
124 }
125 {
126 int w, h, s;
127 get_stencil(k, &w, &h, &s);
128 GrResourceKey key = StencilResource::ComputeKey(w, h, s);
bsalomon6d3fe022014-07-25 08:35:45 -0700129 GrGpuResource* item = cache->find(key);
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000130 if (NULL == item) {
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000131 SkFAIL("cache add does not work as expected");
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000132 return;
133 }
134 if (static_cast<TextureResource*>(item)->fID != k) {
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000135 SkFAIL("cache add does not work as expected");
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000136 return;
137 }
138 }
139
140 // Benchmark also find calls that always fail.
141 {
142 GrTextureDesc desc;
143 get_texture_desc(k, &desc);
144 desc.fHeight |= 1;
145 GrResourceKey key = TextureResource::ComputeKey(desc);
bsalomon6d3fe022014-07-25 08:35:45 -0700146 GrGpuResource* item = cache->find(key);
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000147 if (NULL != item) {
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000148 SkFAIL("cache add does not work as expected");
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000149 return;
150 }
151 }
152 {
153 int w, h, s;
154 get_stencil(k, &w, &h, &s);
155 h |= 1;
156 GrResourceKey key = StencilResource::ComputeKey(w, h, s);
bsalomon6d3fe022014-07-25 08:35:45 -0700157 GrGpuResource* item = cache->find(key);
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000158 if (NULL != item) {
commit-bot@chromium.org88cb22b2014-04-30 14:17:00 +0000159 SkFAIL("cache add does not work as expected");
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000160 return;
161 }
162 }
163}
164
tfarinaf168b862014-06-19 12:32:29 -0700165class GrResourceCacheBenchAdd : public Benchmark {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000166 enum {
167 RESOURCE_COUNT = CACHE_SIZE_COUNT / 2,
168 DUPLICATE_COUNT = CACHE_SIZE_COUNT / 4,
169 };
170
171public:
172 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
173 return backend == kGPU_Backend;
174 }
175
176protected:
177 virtual const char* onGetName() SK_OVERRIDE {
178 return "grresourcecache_add";
179 }
180
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000181 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000182 GrGpu* gpu = canvas->getGrContext()->getGpu();
183
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000184 for (int i = 0; i < loops; ++i) {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000185 GrResourceCache cache(CACHE_SIZE_COUNT, CACHE_SIZE_BYTES);
186 populate_cache(&cache, gpu, DUPLICATE_COUNT);
187 populate_cache(&cache, gpu, RESOURCE_COUNT);
188
189 // Check that cache works.
190 for (int k = 0; k < RESOURCE_COUNT; k += 33) {
191 check_cache_contents_or_die(&cache, k);
192 }
193 cache.purgeAllUnlocked();
194 }
195 }
196
197private:
tfarinaf168b862014-06-19 12:32:29 -0700198 typedef Benchmark INHERITED;
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000199};
200
tfarinaf168b862014-06-19 12:32:29 -0700201class GrResourceCacheBenchFind : public Benchmark {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000202 enum {
203 RESOURCE_COUNT = (CACHE_SIZE_COUNT / 2) - 100,
204 DUPLICATE_COUNT = 100
205 };
206
207public:
208 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
209 return backend == kGPU_Backend;
210 }
211
212protected:
213 virtual const char* onGetName() SK_OVERRIDE {
214 return "grresourcecache_find";
215 }
216
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000217 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000218 GrGpu* gpu = canvas->getGrContext()->getGpu();
219 GrResourceCache cache(CACHE_SIZE_COUNT, CACHE_SIZE_BYTES);
220 populate_cache(&cache, gpu, DUPLICATE_COUNT);
221 populate_cache(&cache, gpu, RESOURCE_COUNT);
222
commit-bot@chromium.org33614712013-12-03 18:17:16 +0000223 for (int i = 0; i < loops; ++i) {
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000224 for (int k = 0; k < RESOURCE_COUNT; ++k) {
225 check_cache_contents_or_die(&cache, k);
226 }
227 }
228 }
229
230private:
tfarinaf168b862014-06-19 12:32:29 -0700231 typedef Benchmark INHERITED;
commit-bot@chromium.org644629c2013-11-21 06:21:58 +0000232};
233
234DEF_BENCH( return new GrResourceCacheBenchAdd(); )
235DEF_BENCH( return new GrResourceCacheBenchFind(); )
236
237#endif