OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #if SK_SUPPORT_GPU | 8 #if SK_SUPPORT_GPU |
9 | 9 |
| 10 #include "GrContext.h" |
| 11 #include "GrContextFactory.h" |
| 12 #include "GrGpu.h" |
| 13 #include "GrResourceCache.h" |
10 #include "SkCanvas.h" | 14 #include "SkCanvas.h" |
11 #include "GrContextFactory.h" | |
12 #include "GrResourceCache.h" | |
13 #include "SkSurface.h" | 15 #include "SkSurface.h" |
14 #include "Test.h" | 16 #include "Test.h" |
15 | 17 |
16 static const int gWidth = 640; | 18 static const int gWidth = 640; |
17 static const int gHeight = 480; | 19 static const int gHeight = 480; |
18 | 20 |
19 //////////////////////////////////////////////////////////////////////////////// | 21 //////////////////////////////////////////////////////////////////////////////// |
20 static void test_cache(skiatest::Reporter* reporter, | 22 static void test_cache(skiatest::Reporter* reporter, |
21 GrContext* context, | 23 GrContext* context, |
22 SkCanvas* canvas) { | 24 SkCanvas* canvas) { |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 int TestResource::fAlive = 0; | 110 int TestResource::fAlive = 0; |
109 | 111 |
110 static void test_purge_invalidated(skiatest::Reporter* reporter, GrContext* cont
ext) { | 112 static void test_purge_invalidated(skiatest::Reporter* reporter, GrContext* cont
ext) { |
111 GrCacheID::Domain domain = GrCacheID::GenerateDomain(); | 113 GrCacheID::Domain domain = GrCacheID::GenerateDomain(); |
112 GrCacheID::Key keyData; | 114 GrCacheID::Key keyData; |
113 keyData.fData64[0] = 5; | 115 keyData.fData64[0] = 5; |
114 keyData.fData64[1] = 18; | 116 keyData.fData64[1] = 18; |
115 GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType(); | 117 GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType(); |
116 GrResourceKey key(GrCacheID(domain, keyData), t, 0); | 118 GrResourceKey key(GrCacheID(domain, keyData), t, 0); |
117 | 119 |
118 GrResourceCache cache(5, 30000); | 120 GrResourceCache cache(context->getGpu()->caps(), 5, 30000); |
119 | 121 |
120 // Add two resources with the same key that delete each other from the cache
when destroyed. | 122 // Add two resources with the same key that delete each other from the cache
when destroyed. |
121 TestResource* a = new TestResource(context->getGpu()); | 123 TestResource* a = new TestResource(context->getGpu()); |
122 TestResource* b = new TestResource(context->getGpu()); | 124 TestResource* b = new TestResource(context->getGpu()); |
123 cache.addResource(key, a); | 125 cache.addResource(key, a); |
124 cache.addResource(key, b); | 126 cache.addResource(key, b); |
125 // Circle back. | 127 // Circle back. |
126 a->setDeleteWhenDestroyed(&cache, b); | 128 a->setDeleteWhenDestroyed(&cache, b); |
127 b->setDeleteWhenDestroyed(&cache, a); | 129 b->setDeleteWhenDestroyed(&cache, a); |
128 a->unref(); | 130 a->unref(); |
(...skipping 17 matching lines...) Expand all Loading... |
146 GrCacheID::Domain domain = GrCacheID::GenerateDomain(); | 148 GrCacheID::Domain domain = GrCacheID::GenerateDomain(); |
147 GrCacheID::Key keyData; | 149 GrCacheID::Key keyData; |
148 keyData.fData64[0] = 5; | 150 keyData.fData64[0] = 5; |
149 keyData.fData64[1] = 0; | 151 keyData.fData64[1] = 0; |
150 GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType(); | 152 GrResourceKey::ResourceType t = GrResourceKey::GenerateResourceType(); |
151 | 153 |
152 GrResourceKey key(GrCacheID(domain, keyData), t, 0); | 154 GrResourceKey key(GrCacheID(domain, keyData), t, 0); |
153 | 155 |
154 { | 156 { |
155 { | 157 { |
156 GrResourceCache cache(3, 30000); | 158 GrResourceCache cache(context->getGpu()->caps(), 3, 30000); |
157 TestResource* a = new TestResource(context->getGpu()); | 159 TestResource* a = new TestResource(context->getGpu()); |
158 TestResource* b = new TestResource(context->getGpu()); | 160 TestResource* b = new TestResource(context->getGpu()); |
159 cache.addResource(key, a); | 161 cache.addResource(key, a); |
160 cache.addResource(key, b); | 162 cache.addResource(key, b); |
161 | 163 |
162 a->setDeleteWhenDestroyed(&cache, b); | 164 a->setDeleteWhenDestroyed(&cache, b); |
163 b->setDeleteWhenDestroyed(&cache, a); | 165 b->setDeleteWhenDestroyed(&cache, a); |
164 | 166 |
165 a->unref(); | 167 a->unref(); |
166 b->unref(); | 168 b->unref(); |
167 REPORTER_ASSERT(reporter, 2 == TestResource::alive()); | 169 REPORTER_ASSERT(reporter, 2 == TestResource::alive()); |
168 } | 170 } |
169 REPORTER_ASSERT(reporter, 0 == TestResource::alive()); | 171 REPORTER_ASSERT(reporter, 0 == TestResource::alive()); |
170 } | 172 } |
171 { | 173 { |
172 GrResourceCache cache(3, 30000); | 174 GrResourceCache cache(context->getGpu()->caps(), 3, 30000); |
173 TestResource* a = new TestResource(context->getGpu()); | 175 TestResource* a = new TestResource(context->getGpu()); |
174 TestResource* b = new TestResource(context->getGpu()); | 176 TestResource* b = new TestResource(context->getGpu()); |
175 cache.addResource(key, a); | 177 cache.addResource(key, a); |
176 cache.addResource(key, b); | 178 cache.addResource(key, b); |
177 | 179 |
178 a->setDeleteWhenDestroyed(&cache, b); | 180 a->setDeleteWhenDestroyed(&cache, b); |
179 b->setDeleteWhenDestroyed(&cache, a); | 181 b->setDeleteWhenDestroyed(&cache, a); |
180 | 182 |
181 a->unref(); | 183 a->unref(); |
182 b->unref(); | 184 b->unref(); |
(...skipping 14 matching lines...) Expand all Loading... |
197 key1Data.fData64[1] = 0; | 199 key1Data.fData64[1] = 0; |
198 GrResourceKey key1(GrCacheID(domain, key1Data), t, 0); | 200 GrResourceKey key1(GrCacheID(domain, key1Data), t, 0); |
199 | 201 |
200 GrCacheID::Key key2Data; | 202 GrCacheID::Key key2Data; |
201 key2Data.fData64[0] = 1; | 203 key2Data.fData64[0] = 1; |
202 key2Data.fData64[1] = 0; | 204 key2Data.fData64[1] = 0; |
203 GrResourceKey key2(GrCacheID(domain, key2Data), t, 0); | 205 GrResourceKey key2(GrCacheID(domain, key2Data), t, 0); |
204 | 206 |
205 // Test changing resources sizes (both increase & decrease). | 207 // Test changing resources sizes (both increase & decrease). |
206 { | 208 { |
207 GrResourceCache cache(2, 300); | 209 GrResourceCache cache(context->getGpu()->caps(), 2, 300); |
208 | 210 |
209 TestResource* a = new TestResource(context->getGpu()); | 211 TestResource* a = new TestResource(context->getGpu()); |
210 a->setSize(100); // Test didChangeGpuMemorySize() when not in the cache. | 212 a->setSize(100); // Test didChangeGpuMemorySize() when not in the cache. |
211 cache.addResource(key1, a); | 213 cache.addResource(key1, a); |
212 a->unref(); | 214 a->unref(); |
213 | 215 |
214 TestResource* b = new TestResource(context->getGpu()); | 216 TestResource* b = new TestResource(context->getGpu()); |
215 b->setSize(100); | 217 b->setSize(100); |
216 cache.addResource(key2, b); | 218 cache.addResource(key2, b); |
217 b->unref(); | 219 b->unref(); |
218 | 220 |
219 REPORTER_ASSERT(reporter, 200 == cache.getCachedResourceBytes()); | 221 REPORTER_ASSERT(reporter, 200 == cache.getCachedResourceBytes()); |
220 REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); | 222 REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); |
221 | 223 |
222 static_cast<TestResource*>(cache.find(key2))->setSize(200); | 224 static_cast<TestResource*>(cache.find(key2))->setSize(200); |
223 static_cast<TestResource*>(cache.find(key1))->setSize(50); | 225 static_cast<TestResource*>(cache.find(key1))->setSize(50); |
224 | 226 |
225 REPORTER_ASSERT(reporter, 250 == cache.getCachedResourceBytes()); | 227 REPORTER_ASSERT(reporter, 250 == cache.getCachedResourceBytes()); |
226 REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); | 228 REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); |
227 } | 229 } |
228 | 230 |
229 // Test increasing a resources size beyond the cache budget. | 231 // Test increasing a resources size beyond the cache budget. |
230 { | 232 { |
231 GrResourceCache cache(2, 300); | 233 GrResourceCache cache(context->getGpu()->caps(), 2, 300); |
232 | 234 |
233 TestResource* a = new TestResource(context->getGpu(), 100); | 235 TestResource* a = new TestResource(context->getGpu(), 100); |
234 cache.addResource(key1, a); | 236 cache.addResource(key1, a); |
235 a->unref(); | 237 a->unref(); |
236 | 238 |
237 TestResource* b = new TestResource(context->getGpu(), 100); | 239 TestResource* b = new TestResource(context->getGpu(), 100); |
238 cache.addResource(key2, b); | 240 cache.addResource(key2, b); |
239 b->unref(); | 241 b->unref(); |
240 | 242 |
241 REPORTER_ASSERT(reporter, 200 == cache.getCachedResourceBytes()); | 243 REPORTER_ASSERT(reporter, 200 == cache.getCachedResourceBytes()); |
242 REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); | 244 REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); |
243 | 245 |
244 static_cast<TestResource*>(cache.find(key2))->setSize(201); | 246 static_cast<TestResource*>(cache.find(key2))->setSize(201); |
245 REPORTER_ASSERT(reporter, NULL == cache.find(key1)); | 247 REPORTER_ASSERT(reporter, NULL == cache.find(key1)); |
246 | 248 |
247 REPORTER_ASSERT(reporter, 201 == cache.getCachedResourceBytes()); | 249 REPORTER_ASSERT(reporter, 201 == cache.getCachedResourceBytes()); |
248 REPORTER_ASSERT(reporter, 1 == cache.getCachedResourceCount()); | 250 REPORTER_ASSERT(reporter, 1 == cache.getCachedResourceCount()); |
249 } | 251 } |
250 | |
251 // Test changing the size of an exclusively-held resource. | |
252 { | |
253 GrResourceCache cache(2, 300); | |
254 | |
255 TestResource* a = new TestResource(context->getGpu(), 100); | |
256 cache.addResource(key1, a); | |
257 cache.makeExclusive(a->getCacheEntry()); | |
258 | |
259 TestResource* b = new TestResource(context->getGpu(), 100); | |
260 cache.addResource(key2, b); | |
261 b->unref(); | |
262 | |
263 REPORTER_ASSERT(reporter, 200 == cache.getCachedResourceBytes()); | |
264 REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); | |
265 REPORTER_ASSERT(reporter, NULL == cache.find(key1)); | |
266 | |
267 a->setSize(200); | |
268 | |
269 REPORTER_ASSERT(reporter, 300 == cache.getCachedResourceBytes()); | |
270 REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); | |
271 // Internal resource cache validation will test the detached size (debug
mode only). | |
272 | |
273 cache.makeNonExclusive(a->getCacheEntry()); | |
274 a->unref(); | |
275 | |
276 REPORTER_ASSERT(reporter, 300 == cache.getCachedResourceBytes()); | |
277 REPORTER_ASSERT(reporter, 2 == cache.getCachedResourceCount()); | |
278 REPORTER_ASSERT(reporter, cache.find(key1)); | |
279 // Internal resource cache validation will test the detached size (debug
mode only). | |
280 } | |
281 } | 252 } |
282 | 253 |
283 //////////////////////////////////////////////////////////////////////////////// | 254 //////////////////////////////////////////////////////////////////////////////// |
284 DEF_GPUTEST(ResourceCache, reporter, factory) { | 255 DEF_GPUTEST(ResourceCache, reporter, factory) { |
285 for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) { | 256 for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) { |
286 GrContextFactory::GLContextType glType = static_cast<GrContextFactory::G
LContextType>(type); | 257 GrContextFactory::GLContextType glType = static_cast<GrContextFactory::G
LContextType>(type); |
287 if (!GrContextFactory::IsRenderingGLContext(glType)) { | 258 if (!GrContextFactory::IsRenderingGLContext(glType)) { |
288 continue; | 259 continue; |
289 } | 260 } |
290 GrContext* context = factory->get(glType); | 261 GrContext* context = factory->get(glType); |
(...skipping 10 matching lines...) Expand all Loading... |
301 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(context, info
)); | 272 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(context, info
)); |
302 | 273 |
303 test_cache(reporter, context, surface->getCanvas()); | 274 test_cache(reporter, context, surface->getCanvas()); |
304 test_purge_invalidated(reporter, context); | 275 test_purge_invalidated(reporter, context); |
305 test_cache_delete_on_destruction(reporter, context); | 276 test_cache_delete_on_destruction(reporter, context); |
306 test_resource_size_changed(reporter, context); | 277 test_resource_size_changed(reporter, context); |
307 } | 278 } |
308 } | 279 } |
309 | 280 |
310 #endif | 281 #endif |
OLD | NEW |