Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(645)

Side by Side Diff: cc/resources/prioritized_resource_unittest.cc

Issue 13051003: cpplint.py pass on cc/(base|debug|quads|resources)/ (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/resources/prioritized_resource.h" 5 #include "cc/resources/prioritized_resource.h"
6 6
7 #include "cc/resources/prioritized_resource_manager.h" 7 #include "cc/resources/prioritized_resource_manager.h"
8 #include "cc/resources/resource.h" 8 #include "cc/resources/resource.h"
9 #include "cc/test/fake_output_surface.h" 9 #include "cc/test/fake_output_surface.h"
10 #include "cc/test/fake_proxy.h" 10 #include "cc/test/fake_proxy.h"
11 #include "cc/test/tiled_layer_test_common.h" 11 #include "cc/test/tiled_layer_test_common.h"
12 #include "cc/trees/single_thread_proxy.h" // For DebugScopedSetImplThread 12 #include "cc/trees/single_thread_proxy.h" // For DebugScopedSetImplThread
13 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
14 14
15 namespace cc { 15 namespace cc {
16 16
17 class PrioritizedResourceTest : public testing::Test { 17 class PrioritizedResourceTest : public testing::Test {
18 public: 18 public:
19 PrioritizedResourceTest() 19 PrioritizedResourceTest()
20 : proxy_(scoped_ptr<Thread>(NULL)), 20 : proxy_(scoped_ptr<Thread>(NULL)),
21 texture_size_(256, 256), 21 texture_size_(256, 256),
22 texture_format_(GL_RGBA), 22 texture_format_(GL_RGBA),
23 output_surface_(CreateFakeOutputSurface()) { 23 output_surface_(CreateFakeOutputSurface()) {
24 DebugScopedSetImplThread impl_thread(&proxy_); 24 DebugScopedSetImplThread impl_thread(&proxy_);
25 resource_provider_ = cc::ResourceProvider::Create(output_surface_.get()) ; 25 resource_provider_ = cc::ResourceProvider::Create(output_surface_.get());
26 } 26 }
27 27
28 virtual ~PrioritizedResourceTest() { 28 virtual ~PrioritizedResourceTest() {
29 DebugScopedSetImplThread impl_thread(&proxy_); 29 DebugScopedSetImplThread impl_thread(&proxy_);
30 resource_provider_.reset(); 30 resource_provider_.reset();
31 } 31 }
32 32
33 size_t TexturesMemorySize(size_t texture_count) { 33 size_t TexturesMemorySize(size_t texture_count) {
34 return Resource::MemorySizeBytes(texture_size_, texture_format_) * 34 return Resource::MemorySizeBytes(texture_size_, texture_format_) *
35 texture_count; 35 texture_count;
36 } 36 }
37 37
38 scoped_ptr<PrioritizedResourceManager> CreateManager(size_t max_textures) { 38 scoped_ptr<PrioritizedResourceManager> CreateManager(size_t max_textures) {
39 scoped_ptr<PrioritizedResourceManager> manager = 39 scoped_ptr<PrioritizedResourceManager> manager =
40 PrioritizedResourceManager::Create(&proxy_); 40 PrioritizedResourceManager::Create(&proxy_);
41 manager->SetMaxMemoryLimitBytes(TexturesMemorySize(max_textures)); 41 manager->SetMaxMemoryLimitBytes(TexturesMemorySize(max_textures));
42 return manager.Pass(); 42 return manager.Pass();
43 } 43 }
44 44
45 bool ValidateTexture(scoped_ptr<PrioritizedResource>& texture, 45 bool ValidateTexture(scoped_ptr<PrioritizedResource>& texture,
46 bool request_late) { 46 bool request_late) {
47 ResourceManagerAssertInvariants(texture->resource_manager()); 47 ResourceManagerAssertInvariants(texture->resource_manager());
48 if (request_late) 48 if (request_late)
49 texture->RequestLate(); 49 texture->RequestLate();
50 ResourceManagerAssertInvariants(texture->resource_manager()); 50 ResourceManagerAssertInvariants(texture->resource_manager());
51 DebugScopedSetImplThreadAndMainThreadBlocked 51 DebugScopedSetImplThreadAndMainThreadBlocked
52 impl_thread_and_main_thread_blocked(&proxy_); 52 impl_thread_and_main_thread_blocked(&proxy_);
53 bool success = texture->can_acquire_backing_texture(); 53 bool success = texture->can_acquire_backing_texture();
54 if (success) 54 if (success)
55 texture->AcquireBackingTexture(ResourceProvider()); 55 texture->AcquireBackingTexture(ResourceProvider());
56 return success; 56 return success;
57 } 57 }
58 58
59 void PrioritizeTexturesAndBackings( 59 void PrioritizeTexturesAndBackings(
60 PrioritizedResourceManager* resource_manager) { 60 PrioritizedResourceManager* resource_manager) {
61 resource_manager->PrioritizeTextures(); 61 resource_manager->PrioritizeTextures();
62 ResourceManagerUpdateBackingsPriorities(resource_manager); 62 ResourceManagerUpdateBackingsPriorities(resource_manager);
63 } 63 }
64 64
65 void ResourceManagerUpdateBackingsPriorities( 65 void ResourceManagerUpdateBackingsPriorities(
66 PrioritizedResourceManager* resource_manager) { 66 PrioritizedResourceManager* resource_manager) {
67 DebugScopedSetImplThreadAndMainThreadBlocked 67 DebugScopedSetImplThreadAndMainThreadBlocked
68 impl_thread_and_main_thread_blocked(&proxy_); 68 impl_thread_and_main_thread_blocked(&proxy_);
69 resource_manager->PushTexturePrioritiesToBackings(); 69 resource_manager->PushTexturePrioritiesToBackings();
70 } 70 }
71 71
72 cc::ResourceProvider* ResourceProvider() { return resource_provider_.get(); } 72 cc::ResourceProvider* ResourceProvider() { return resource_provider_.get(); }
73 73
74 void ResourceManagerAssertInvariants( 74 void ResourceManagerAssertInvariants(
75 PrioritizedResourceManager* resource_manager) { 75 PrioritizedResourceManager* resource_manager) {
76 #ifndef NDEBUG 76 #ifndef NDEBUG
77 DebugScopedSetImplThreadAndMainThreadBlocked 77 DebugScopedSetImplThreadAndMainThreadBlocked
78 impl_thread_and_main_thread_blocked(&proxy_); 78 impl_thread_and_main_thread_blocked(&proxy_);
79 resource_manager->AssertInvariants(); 79 resource_manager->AssertInvariants();
80 #endif 80 #endif
81 } 81 }
82 82
83 bool TextureBackingIsAbovePriorityCutoff(PrioritizedResource* texture) { 83 bool TextureBackingIsAbovePriorityCutoff(PrioritizedResource* texture) {
84 return texture->backing()-> 84 return texture->backing()
85 was_above_priority_cutoff_at_last_priority_update(); 85 ->was_above_priority_cutoff_at_last_priority_update();
danakj 2013/03/25 17:23:31 ಠ_ಠ
86 } 86 }
87 87
88 size_t EvictedBackingCount(PrioritizedResourceManager* resource_manager) { 88 size_t EvictedBackingCount(PrioritizedResourceManager* resource_manager) {
89 return resource_manager->evicted_backings_.size(); 89 return resource_manager->evicted_backings_.size();
90 } 90 }
91 91
92 protected: 92 protected:
93 FakeProxy proxy_; 93 FakeProxy proxy_;
94 const gfx::Size texture_size_; 94 const gfx::Size texture_size_;
95 const GLenum texture_format_; 95 const GLenum texture_format_;
96 scoped_ptr<OutputSurface> output_surface_; 96 scoped_ptr<OutputSurface> output_surface_;
97 scoped_ptr<cc::ResourceProvider> resource_provider_; 97 scoped_ptr<cc::ResourceProvider> resource_provider_;
98 }; 98 };
99 99
100 namespace { 100 namespace {
101 101
102 TEST_F(PrioritizedResourceTest, RequestTextureExceedingMaxLimit) { 102 TEST_F(PrioritizedResourceTest, RequestTextureExceedingMaxLimit) {
103 const size_t max_textures = 8; 103 const size_t max_textures = 8;
danakj 2013/03/25 17:23:31 no const, or kMaxTextures
104 scoped_ptr<PrioritizedResourceManager> resource_manager = 104 scoped_ptr<PrioritizedResourceManager> resource_manager =
105 CreateManager(max_textures); 105 CreateManager(max_textures);
106 106
107 // Create textures for double our memory limit. 107 // Create textures for double our memory limit.
108 scoped_ptr<PrioritizedResource> textures[max_textures * 2]; 108 scoped_ptr<PrioritizedResource> textures[max_textures * 2];
109 109
110 for (size_t i = 0; i < max_textures * 2; ++i) 110 for (size_t i = 0; i < max_textures * 2; ++i)
111 textures[i] = 111 textures[i] =
112 resource_manager->CreateTexture(texture_size_, texture_format_); 112 resource_manager->CreateTexture(texture_size_, texture_format_);
113 113
114 // Set decreasing priorities 114 // Set decreasing priorities
115 for (size_t i = 0; i < max_textures * 2; ++i) 115 for (size_t i = 0; i < max_textures * 2; ++i)
116 textures[i]->set_request_priority(100 + i); 116 textures[i]->set_request_priority(100 + i);
117 117
118 // Only lower half should be available. 118 // Only lower half should be available.
119 PrioritizeTexturesAndBackings(resource_manager.get()); 119 PrioritizeTexturesAndBackings(resource_manager.get());
120 EXPECT_TRUE(ValidateTexture(textures[0], false)); 120 EXPECT_TRUE(ValidateTexture(textures[0], false));
121 EXPECT_TRUE(ValidateTexture(textures[7], false)); 121 EXPECT_TRUE(ValidateTexture(textures[7], false));
122 EXPECT_FALSE(ValidateTexture(textures[8], false)); 122 EXPECT_FALSE(ValidateTexture(textures[8], false));
123 EXPECT_FALSE(ValidateTexture(textures[15], false)); 123 EXPECT_FALSE(ValidateTexture(textures[15], false));
124 124
125 // Set increasing priorities 125 // Set increasing priorities
126 for (size_t i = 0; i < max_textures * 2; ++i) 126 for (size_t i = 0; i < max_textures * 2; ++i)
127 textures[i]->set_request_priority(100 - i); 127 textures[i]->set_request_priority(100 - i);
128 128
129 // Only upper half should be available. 129 // Only upper half should be available.
130 PrioritizeTexturesAndBackings(resource_manager.get()); 130 PrioritizeTexturesAndBackings(resource_manager.get());
131 EXPECT_FALSE(ValidateTexture(textures[0], false)); 131 EXPECT_FALSE(ValidateTexture(textures[0], false));
132 EXPECT_FALSE(ValidateTexture(textures[7], false)); 132 EXPECT_FALSE(ValidateTexture(textures[7], false));
133 EXPECT_TRUE(ValidateTexture(textures[8], false)); 133 EXPECT_TRUE(ValidateTexture(textures[8], false));
134 EXPECT_TRUE(ValidateTexture(textures[15], false)); 134 EXPECT_TRUE(ValidateTexture(textures[15], false));
135 135
136 EXPECT_EQ(TexturesMemorySize(max_textures), 136 EXPECT_EQ(TexturesMemorySize(max_textures),
137 resource_manager->MemoryAboveCutoffBytes()); 137 resource_manager->MemoryAboveCutoffBytes());
138 EXPECT_LE(resource_manager->MemoryUseBytes(), 138 EXPECT_LE(resource_manager->MemoryUseBytes(),
139 resource_manager->MemoryAboveCutoffBytes()); 139 resource_manager->MemoryAboveCutoffBytes());
140 140
141 DebugScopedSetImplThreadAndMainThreadBlocked
142 impl_thread_and_main_thread_blocked(&proxy_);
143 resource_manager->ClearAllMemory(ResourceProvider());
144 }
145
146 TEST_F(PrioritizedResourceTest, ChangeMemoryLimits) {
147 const size_t max_textures = 8;
danakj 2013/03/25 17:23:31 const
148 scoped_ptr<PrioritizedResourceManager> resource_manager =
149 CreateManager(max_textures);
150 scoped_ptr<PrioritizedResource> textures[max_textures];
151
152 for (size_t i = 0; i < max_textures; ++i)
danakj 2013/03/25 17:23:31 {}
153 textures[i] =
154 resource_manager->CreateTexture(texture_size_, texture_format_);
155 for (size_t i = 0; i < max_textures; ++i)
156 textures[i]->set_request_priority(100 + i);
157
158 // Set max limit to 8 textures
159 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(8));
160 PrioritizeTexturesAndBackings(resource_manager.get());
161 for (size_t i = 0; i < max_textures; ++i)
162 ValidateTexture(textures[i], false);
163 {
164 DebugScopedSetImplThreadAndMainThreadBlocked
165 impl_thread_and_main_thread_blocked(&proxy_);
166 resource_manager->ReduceMemory(ResourceProvider());
167 }
168
169 EXPECT_EQ(TexturesMemorySize(8), resource_manager->MemoryAboveCutoffBytes());
170 EXPECT_LE(resource_manager->MemoryUseBytes(),
171 resource_manager->MemoryAboveCutoffBytes());
172
173 // Set max limit to 5 textures
174 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(5));
175 PrioritizeTexturesAndBackings(resource_manager.get());
176 for (size_t i = 0; i < max_textures; ++i)
177 EXPECT_EQ(ValidateTexture(textures[i], false), i < 5);
178 {
179 DebugScopedSetImplThreadAndMainThreadBlocked
180 impl_thread_and_main_thread_blocked(&proxy_);
181 resource_manager->ReduceMemory(ResourceProvider());
182 }
183
184 EXPECT_EQ(TexturesMemorySize(5), resource_manager->MemoryAboveCutoffBytes());
185 EXPECT_LE(resource_manager->MemoryUseBytes(),
186 resource_manager->MemoryAboveCutoffBytes());
187
188 // Set max limit to 4 textures
189 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(4));
190 PrioritizeTexturesAndBackings(resource_manager.get());
191 for (size_t i = 0; i < max_textures; ++i)
192 EXPECT_EQ(ValidateTexture(textures[i], false), i < 4);
193 {
194 DebugScopedSetImplThreadAndMainThreadBlocked
195 impl_thread_and_main_thread_blocked(&proxy_);
196 resource_manager->ReduceMemory(ResourceProvider());
197 }
198
199 EXPECT_EQ(TexturesMemorySize(4), resource_manager->MemoryAboveCutoffBytes());
200 EXPECT_LE(resource_manager->MemoryUseBytes(),
201 resource_manager->MemoryAboveCutoffBytes());
202
203 DebugScopedSetImplThreadAndMainThreadBlocked
204 impl_thread_and_main_thread_blocked(&proxy_);
205 resource_manager->ClearAllMemory(ResourceProvider());
206 }
207
208 TEST_F(PrioritizedResourceTest, ChangePriorityCutoff) {
209 const size_t max_textures = 8;
danakj 2013/03/25 17:23:31 const
210 scoped_ptr<PrioritizedResourceManager> resource_manager =
211 CreateManager(max_textures);
212 scoped_ptr<PrioritizedResource> textures[max_textures];
213
214 for (size_t i = 0; i < max_textures; ++i)
danakj 2013/03/25 17:23:31 {}
215 textures[i] =
216 resource_manager->CreateTexture(texture_size_, texture_format_);
217 for (size_t i = 0; i < max_textures; ++i)
218 textures[i]->set_request_priority(100 + i);
219
220 // Set the cutoff to drop two textures. Try to request_late on all textures,
221 // and make sure that request_late doesn't work on a texture with equal
222 // priority to the cutoff.
223 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(8));
224 resource_manager->SetExternalPriorityCutoff(106);
225 PrioritizeTexturesAndBackings(resource_manager.get());
226 for (size_t i = 0; i < max_textures; ++i)
227 EXPECT_EQ(ValidateTexture(textures[i], true), i < 6);
228 {
229 DebugScopedSetImplThreadAndMainThreadBlocked
230 impl_thread_and_main_thread_blocked(&proxy_);
231 resource_manager->ReduceMemory(ResourceProvider());
232 }
233 EXPECT_EQ(TexturesMemorySize(6), resource_manager->MemoryAboveCutoffBytes());
234 EXPECT_LE(resource_manager->MemoryUseBytes(),
235 resource_manager->MemoryAboveCutoffBytes());
236
237 // Set the cutoff to drop two more textures.
238 resource_manager->SetExternalPriorityCutoff(104);
239 PrioritizeTexturesAndBackings(resource_manager.get());
240 for (size_t i = 0; i < max_textures; ++i)
241 EXPECT_EQ(ValidateTexture(textures[i], false), i < 4);
242 {
243 DebugScopedSetImplThreadAndMainThreadBlocked
244 impl_thread_and_main_thread_blocked(&proxy_);
245 resource_manager->ReduceMemory(ResourceProvider());
246 }
247 EXPECT_EQ(TexturesMemorySize(4), resource_manager->MemoryAboveCutoffBytes());
248
249 // Do a one-time eviction for one more texture based on priority cutoff
250 PrioritizedResourceManager::BackingList evicted_backings;
251 resource_manager->UnlinkAndClearEvictedBackings();
252 {
253 DebugScopedSetImplThreadAndMainThreadBlocked
254 impl_thread_and_main_thread_blocked(&proxy_);
255 resource_manager->ReduceMemoryOnImplThread(
256 TexturesMemorySize(8), 104, ResourceProvider());
257 EXPECT_EQ(0, EvictedBackingCount(resource_manager.get()));
258 resource_manager->ReduceMemoryOnImplThread(
259 TexturesMemorySize(8), 103, ResourceProvider());
260 EXPECT_EQ(1, EvictedBackingCount(resource_manager.get()));
261 }
262 resource_manager->UnlinkAndClearEvictedBackings();
263 EXPECT_EQ(TexturesMemorySize(3), resource_manager->MemoryUseBytes());
264
265 // Re-allocate the the texture after the one-time drop.
266 PrioritizeTexturesAndBackings(resource_manager.get());
267 for (size_t i = 0; i < max_textures; ++i)
268 EXPECT_EQ(ValidateTexture(textures[i], false), i < 4);
269 {
270 DebugScopedSetImplThreadAndMainThreadBlocked
271 impl_thread_and_main_thread_blocked(&proxy_);
272 resource_manager->ReduceMemory(ResourceProvider());
273 }
274 EXPECT_EQ(TexturesMemorySize(4), resource_manager->MemoryAboveCutoffBytes());
275
276 DebugScopedSetImplThreadAndMainThreadBlocked
277 impl_thread_and_main_thread_blocked(&proxy_);
278 resource_manager->ClearAllMemory(ResourceProvider());
279 }
280
281 TEST_F(PrioritizedResourceTest, ResourceManagerPartialUpdateTextures) {
282 const size_t max_textures = 4;
danakj 2013/03/25 17:23:31 const
283 const size_t num_textures = 4;
284 scoped_ptr<PrioritizedResourceManager> resource_manager =
285 CreateManager(max_textures);
286 scoped_ptr<PrioritizedResource> textures[num_textures];
287 scoped_ptr<PrioritizedResource> more_textures[num_textures];
288
289 for (size_t i = 0; i < num_textures; ++i) {
290 textures[i] =
291 resource_manager->CreateTexture(texture_size_, texture_format_);
292 more_textures[i] =
293 resource_manager->CreateTexture(texture_size_, texture_format_);
294 }
295
296 for (size_t i = 0; i < num_textures; ++i)
297 textures[i]->set_request_priority(200 + i);
298 PrioritizeTexturesAndBackings(resource_manager.get());
299
300 // Allocate textures which are currently high priority.
301 EXPECT_TRUE(ValidateTexture(textures[0], false));
302 EXPECT_TRUE(ValidateTexture(textures[1], false));
303 EXPECT_TRUE(ValidateTexture(textures[2], false));
304 EXPECT_TRUE(ValidateTexture(textures[3], false));
305
306 EXPECT_TRUE(textures[0]->have_backing_texture());
307 EXPECT_TRUE(textures[1]->have_backing_texture());
308 EXPECT_TRUE(textures[2]->have_backing_texture());
309 EXPECT_TRUE(textures[3]->have_backing_texture());
310
311 for (size_t i = 0; i < num_textures; ++i)
312 more_textures[i]->set_request_priority(100 + i);
313 PrioritizeTexturesAndBackings(resource_manager.get());
314
315 // Textures are now below cutoff.
316 EXPECT_FALSE(ValidateTexture(textures[0], false));
317 EXPECT_FALSE(ValidateTexture(textures[1], false));
318 EXPECT_FALSE(ValidateTexture(textures[2], false));
319 EXPECT_FALSE(ValidateTexture(textures[3], false));
320
321 // But they are still valid to use.
322 EXPECT_TRUE(textures[0]->have_backing_texture());
323 EXPECT_TRUE(textures[1]->have_backing_texture());
324 EXPECT_TRUE(textures[2]->have_backing_texture());
325 EXPECT_TRUE(textures[3]->have_backing_texture());
326
327 // Higher priority textures are finally needed.
328 EXPECT_TRUE(ValidateTexture(more_textures[0], false));
329 EXPECT_TRUE(ValidateTexture(more_textures[1], false));
330 EXPECT_TRUE(ValidateTexture(more_textures[2], false));
331 EXPECT_TRUE(ValidateTexture(more_textures[3], false));
332
333 // Lower priority have been fully evicted.
334 EXPECT_FALSE(textures[0]->have_backing_texture());
335 EXPECT_FALSE(textures[1]->have_backing_texture());
336 EXPECT_FALSE(textures[2]->have_backing_texture());
337 EXPECT_FALSE(textures[3]->have_backing_texture());
338
339 DebugScopedSetImplThreadAndMainThreadBlocked
340 impl_thread_and_main_thread_blocked(&proxy_);
341 resource_manager->ClearAllMemory(ResourceProvider());
342 }
343
344 TEST_F(PrioritizedResourceTest, ResourceManagerPrioritiesAreEqual) {
345 const size_t max_textures = 16;
danakj 2013/03/25 17:23:31 const
346 scoped_ptr<PrioritizedResourceManager> resource_manager =
347 CreateManager(max_textures);
348 scoped_ptr<PrioritizedResource> textures[max_textures];
349
350 for (size_t i = 0; i < max_textures; ++i)
danakj 2013/03/25 17:23:31 {}
351 textures[i] =
352 resource_manager->CreateTexture(texture_size_, texture_format_);
353
354 // All 16 textures have the same priority except 2 higher priority.
355 for (size_t i = 0; i < max_textures; ++i)
356 textures[i]->set_request_priority(100);
357 textures[0]->set_request_priority(99);
358 textures[1]->set_request_priority(99);
359
360 // Set max limit to 8 textures
361 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(8));
362 PrioritizeTexturesAndBackings(resource_manager.get());
363
364 // The two high priority textures should be available, others should not.
365 for (size_t i = 0; i < 2; ++i)
366 EXPECT_TRUE(ValidateTexture(textures[i], false));
367 for (size_t i = 2; i < max_textures; ++i)
368 EXPECT_FALSE(ValidateTexture(textures[i], false));
369 EXPECT_EQ(TexturesMemorySize(2), resource_manager->MemoryAboveCutoffBytes());
370 EXPECT_LE(resource_manager->MemoryUseBytes(),
371 resource_manager->MemoryAboveCutoffBytes());
372
373 // Manually reserving textures should only succeed on the higher priority
374 // textures, and on remaining textures up to the memory limit.
375 for (size_t i = 0; i < 8; i++)
376 EXPECT_TRUE(ValidateTexture(textures[i], true));
377 for (size_t i = 9; i < max_textures; i++)
378 EXPECT_FALSE(ValidateTexture(textures[i], true));
379 EXPECT_EQ(TexturesMemorySize(8), resource_manager->MemoryAboveCutoffBytes());
380 EXPECT_LE(resource_manager->MemoryUseBytes(),
381 resource_manager->MemoryAboveCutoffBytes());
382
383 DebugScopedSetImplThreadAndMainThreadBlocked
384 impl_thread_and_main_thread_blocked(&proxy_);
385 resource_manager->ClearAllMemory(ResourceProvider());
386 }
387
388 TEST_F(PrioritizedResourceTest, ResourceManagerDestroyedFirst) {
389 scoped_ptr<PrioritizedResourceManager> resource_manager = CreateManager(1);
390 scoped_ptr<PrioritizedResource> texture =
391 resource_manager->CreateTexture(texture_size_, texture_format_);
392
393 // Texture is initially invalid, but it will become available.
394 EXPECT_FALSE(texture->have_backing_texture());
395
396 texture->set_request_priority(100);
397 PrioritizeTexturesAndBackings(resource_manager.get());
398
399 EXPECT_TRUE(ValidateTexture(texture, false));
400 EXPECT_TRUE(texture->can_acquire_backing_texture());
401 EXPECT_TRUE(texture->have_backing_texture());
402 {
141 DebugScopedSetImplThreadAndMainThreadBlocked 403 DebugScopedSetImplThreadAndMainThreadBlocked
142 impl_thread_and_main_thread_blocked(&proxy_); 404 impl_thread_and_main_thread_blocked(&proxy_);
143 resource_manager->ClearAllMemory(ResourceProvider()); 405 resource_manager->ClearAllMemory(ResourceProvider());
144 } 406 }
145 407 resource_manager.reset();
146 TEST_F(PrioritizedResourceTest, ChangeMemoryLimits) { 408
147 const size_t max_textures = 8; 409 EXPECT_FALSE(texture->can_acquire_backing_texture());
148 scoped_ptr<PrioritizedResourceManager> resource_manager = 410 EXPECT_FALSE(texture->have_backing_texture());
149 CreateManager(max_textures);
150 scoped_ptr<PrioritizedResource> textures[max_textures];
151
152 for (size_t i = 0; i < max_textures; ++i)
153 textures[i] =
154 resource_manager->CreateTexture(texture_size_, texture_format_);
155 for (size_t i = 0; i < max_textures; ++i)
156 textures[i]->set_request_priority(100 + i);
157
158 // Set max limit to 8 textures
159 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(8));
160 PrioritizeTexturesAndBackings(resource_manager.get());
161 for (size_t i = 0; i < max_textures; ++i)
162 ValidateTexture(textures[i], false); {
163 DebugScopedSetImplThreadAndMainThreadBlocked
164 impl_thread_and_main_thread_blocked(&proxy_);
165 resource_manager->ReduceMemory(ResourceProvider());
166 }
167
168 EXPECT_EQ(TexturesMemorySize(8),
169 resource_manager->MemoryAboveCutoffBytes());
170 EXPECT_LE(resource_manager->MemoryUseBytes(),
171 resource_manager->MemoryAboveCutoffBytes());
172
173 // Set max limit to 5 textures
174 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(5));
175 PrioritizeTexturesAndBackings(resource_manager.get());
176 for (size_t i = 0; i < max_textures; ++i)
177 EXPECT_EQ(ValidateTexture(textures[i], false), i < 5); {
178 DebugScopedSetImplThreadAndMainThreadBlocked
179 impl_thread_and_main_thread_blocked(&proxy_);
180 resource_manager->ReduceMemory(ResourceProvider());
181 }
182
183 EXPECT_EQ(TexturesMemorySize(5),
184 resource_manager->MemoryAboveCutoffBytes());
185 EXPECT_LE(resource_manager->MemoryUseBytes(),
186 resource_manager->MemoryAboveCutoffBytes());
187
188 // Set max limit to 4 textures
189 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(4));
190 PrioritizeTexturesAndBackings(resource_manager.get());
191 for (size_t i = 0; i < max_textures; ++i)
192 EXPECT_EQ(ValidateTexture(textures[i], false), i < 4); {
193 DebugScopedSetImplThreadAndMainThreadBlocked
194 impl_thread_and_main_thread_blocked(&proxy_);
195 resource_manager->ReduceMemory(ResourceProvider());
196 }
197
198 EXPECT_EQ(TexturesMemorySize(4),
199 resource_manager->MemoryAboveCutoffBytes());
200 EXPECT_LE(resource_manager->MemoryUseBytes(),
201 resource_manager->MemoryAboveCutoffBytes());
202
203 DebugScopedSetImplThreadAndMainThreadBlocked
204 impl_thread_and_main_thread_blocked(&proxy_);
205 resource_manager->ClearAllMemory(ResourceProvider());
206 }
207
208 TEST_F(PrioritizedResourceTest, ChangePriorityCutoff) {
209 const size_t max_textures = 8;
210 scoped_ptr<PrioritizedResourceManager> resource_manager =
211 CreateManager(max_textures);
212 scoped_ptr<PrioritizedResource> textures[max_textures];
213
214 for (size_t i = 0; i < max_textures; ++i)
215 textures[i] =
216 resource_manager->CreateTexture(texture_size_, texture_format_);
217 for (size_t i = 0; i < max_textures; ++i)
218 textures[i]->set_request_priority(100 + i);
219
220 // Set the cutoff to drop two textures. Try to request_late on all textures,
221 // and make sure that request_late doesn't work on a texture with equal
222 // priority to the cutoff.
223 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(8));
224 resource_manager->SetExternalPriorityCutoff(106);
225 PrioritizeTexturesAndBackings(resource_manager.get());
226 for (size_t i = 0; i < max_textures; ++i)
227 EXPECT_EQ(ValidateTexture(textures[i], true), i < 6); {
228 DebugScopedSetImplThreadAndMainThreadBlocked
229 impl_thread_and_main_thread_blocked(&proxy_);
230 resource_manager->ReduceMemory(ResourceProvider());
231 }
232 EXPECT_EQ(TexturesMemorySize(6),
233 resource_manager->MemoryAboveCutoffBytes());
234 EXPECT_LE(resource_manager->MemoryUseBytes(),
235 resource_manager->MemoryAboveCutoffBytes());
236
237 // Set the cutoff to drop two more textures.
238 resource_manager->SetExternalPriorityCutoff(104);
239 PrioritizeTexturesAndBackings(resource_manager.get());
240 for (size_t i = 0; i < max_textures; ++i)
241 EXPECT_EQ(ValidateTexture(textures[i], false), i < 4); {
242 DebugScopedSetImplThreadAndMainThreadBlocked
243 impl_thread_and_main_thread_blocked(&proxy_);
244 resource_manager->ReduceMemory(ResourceProvider());
245 }
246 EXPECT_EQ(TexturesMemorySize(4),
247 resource_manager->MemoryAboveCutoffBytes());
248
249 // Do a one-time eviction for one more texture based on priority cutoff
250 PrioritizedResourceManager::BackingList evicted_backings;
251 resource_manager->UnlinkAndClearEvictedBackings(); {
252 DebugScopedSetImplThreadAndMainThreadBlocked
253 impl_thread_and_main_thread_blocked(&proxy_);
254 resource_manager->ReduceMemoryOnImplThread(
255 TexturesMemorySize(8), 104, ResourceProvider());
256 EXPECT_EQ(0, EvictedBackingCount(resource_manager.get()));
257 resource_manager->ReduceMemoryOnImplThread(
258 TexturesMemorySize(8), 103, ResourceProvider());
259 EXPECT_EQ(1, EvictedBackingCount(resource_manager.get()));
260 }
261 resource_manager->UnlinkAndClearEvictedBackings();
262 EXPECT_EQ(TexturesMemorySize(3), resource_manager->MemoryUseBytes());
263
264 // Re-allocate the the texture after the one-time drop.
265 PrioritizeTexturesAndBackings(resource_manager.get());
266 for (size_t i = 0; i < max_textures; ++i)
267 EXPECT_EQ(ValidateTexture(textures[i], false), i < 4); {
268 DebugScopedSetImplThreadAndMainThreadBlocked
269 impl_thread_and_main_thread_blocked(&proxy_);
270 resource_manager->ReduceMemory(ResourceProvider());
271 }
272 EXPECT_EQ(TexturesMemorySize(4),
273 resource_manager->MemoryAboveCutoffBytes());
274
275 DebugScopedSetImplThreadAndMainThreadBlocked
276 impl_thread_and_main_thread_blocked(&proxy_);
277 resource_manager->ClearAllMemory(ResourceProvider());
278 }
279
280 TEST_F(PrioritizedResourceTest, ResourceManagerPartialUpdateTextures) {
281 const size_t max_textures = 4;
282 const size_t num_textures = 4;
283 scoped_ptr<PrioritizedResourceManager> resource_manager =
284 CreateManager(max_textures);
285 scoped_ptr<PrioritizedResource> textures[num_textures];
286 scoped_ptr<PrioritizedResource> more_textures[num_textures];
287
288 for (size_t i = 0; i < num_textures; ++i) {
289 textures[i] =
290 resource_manager->CreateTexture(texture_size_, texture_format_);
291 more_textures[i] =
292 resource_manager->CreateTexture(texture_size_, texture_format_);
293 }
294
295 for (size_t i = 0; i < num_textures; ++i)
296 textures[i]->set_request_priority(200 + i);
297 PrioritizeTexturesAndBackings(resource_manager.get());
298
299 // Allocate textures which are currently high priority.
300 EXPECT_TRUE(ValidateTexture(textures[0], false));
301 EXPECT_TRUE(ValidateTexture(textures[1], false));
302 EXPECT_TRUE(ValidateTexture(textures[2], false));
303 EXPECT_TRUE(ValidateTexture(textures[3], false));
304
305 EXPECT_TRUE(textures[0]->have_backing_texture());
306 EXPECT_TRUE(textures[1]->have_backing_texture());
307 EXPECT_TRUE(textures[2]->have_backing_texture());
308 EXPECT_TRUE(textures[3]->have_backing_texture());
309
310 for (size_t i = 0; i < num_textures; ++i)
311 more_textures[i]->set_request_priority(100 + i);
312 PrioritizeTexturesAndBackings(resource_manager.get());
313
314 // Textures are now below cutoff.
315 EXPECT_FALSE(ValidateTexture(textures[0], false));
316 EXPECT_FALSE(ValidateTexture(textures[1], false));
317 EXPECT_FALSE(ValidateTexture(textures[2], false));
318 EXPECT_FALSE(ValidateTexture(textures[3], false));
319
320 // But they are still valid to use.
321 EXPECT_TRUE(textures[0]->have_backing_texture());
322 EXPECT_TRUE(textures[1]->have_backing_texture());
323 EXPECT_TRUE(textures[2]->have_backing_texture());
324 EXPECT_TRUE(textures[3]->have_backing_texture());
325
326 // Higher priority textures are finally needed.
327 EXPECT_TRUE(ValidateTexture(more_textures[0], false));
328 EXPECT_TRUE(ValidateTexture(more_textures[1], false));
329 EXPECT_TRUE(ValidateTexture(more_textures[2], false));
330 EXPECT_TRUE(ValidateTexture(more_textures[3], false));
331
332 // Lower priority have been fully evicted.
333 EXPECT_FALSE(textures[0]->have_backing_texture());
334 EXPECT_FALSE(textures[1]->have_backing_texture());
335 EXPECT_FALSE(textures[2]->have_backing_texture());
336 EXPECT_FALSE(textures[3]->have_backing_texture());
337
338 DebugScopedSetImplThreadAndMainThreadBlocked
339 impl_thread_and_main_thread_blocked(&proxy_);
340 resource_manager->ClearAllMemory(ResourceProvider());
341 }
342
343 TEST_F(PrioritizedResourceTest, ResourceManagerPrioritiesAreEqual) {
344 const size_t max_textures = 16;
345 scoped_ptr<PrioritizedResourceManager> resource_manager =
346 CreateManager(max_textures);
347 scoped_ptr<PrioritizedResource> textures[max_textures];
348
349 for (size_t i = 0; i < max_textures; ++i)
350 textures[i] =
351 resource_manager->CreateTexture(texture_size_, texture_format_);
352
353 // All 16 textures have the same priority except 2 higher priority.
354 for (size_t i = 0; i < max_textures; ++i)
355 textures[i]->set_request_priority(100);
356 textures[0]->set_request_priority(99);
357 textures[1]->set_request_priority(99);
358
359 // Set max limit to 8 textures
360 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(8));
361 PrioritizeTexturesAndBackings(resource_manager.get());
362
363 // The two high priority textures should be available, others should not.
364 for (size_t i = 0; i < 2; ++i)
365 EXPECT_TRUE(ValidateTexture(textures[i], false));
366 for (size_t i = 2; i < max_textures; ++i)
367 EXPECT_FALSE(ValidateTexture(textures[i], false));
368 EXPECT_EQ(TexturesMemorySize(2),
369 resource_manager->MemoryAboveCutoffBytes());
370 EXPECT_LE(resource_manager->MemoryUseBytes(),
371 resource_manager->MemoryAboveCutoffBytes());
372
373 // Manually reserving textures should only succeed on the higher priority
374 // textures, and on remaining textures up to the memory limit.
375 for (size_t i = 0; i < 8; i++)
376 EXPECT_TRUE(ValidateTexture(textures[i], true));
377 for (size_t i = 9; i < max_textures; i++)
378 EXPECT_FALSE(ValidateTexture(textures[i], true));
379 EXPECT_EQ(TexturesMemorySize(8),
380 resource_manager->MemoryAboveCutoffBytes());
381 EXPECT_LE(resource_manager->MemoryUseBytes(),
382 resource_manager->MemoryAboveCutoffBytes());
383
384 DebugScopedSetImplThreadAndMainThreadBlocked
385 impl_thread_and_main_thread_blocked(&proxy_);
386 resource_manager->ClearAllMemory(ResourceProvider());
387 }
388
389 TEST_F(PrioritizedResourceTest, ResourceManagerDestroyedFirst) {
390 scoped_ptr<PrioritizedResourceManager> resource_manager = CreateManager(1);
391 scoped_ptr<PrioritizedResource> texture =
392 resource_manager->CreateTexture(texture_size_, texture_format_);
393
394 // Texture is initially invalid, but it will become available.
395 EXPECT_FALSE(texture->have_backing_texture());
396
397 texture->set_request_priority(100);
398 PrioritizeTexturesAndBackings(resource_manager.get());
399
400 EXPECT_TRUE(ValidateTexture(texture, false));
401 EXPECT_TRUE(texture->can_acquire_backing_texture());
402 EXPECT_TRUE(texture->have_backing_texture()); {
403 DebugScopedSetImplThreadAndMainThreadBlocked
404 impl_thread_and_main_thread_blocked(&proxy_);
405 resource_manager->ClearAllMemory(ResourceProvider());
406 }
407 resource_manager.reset();
408
409 EXPECT_FALSE(texture->can_acquire_backing_texture());
410 EXPECT_FALSE(texture->have_backing_texture());
411 } 411 }
412 412
413 TEST_F(PrioritizedResourceTest, TextureMovedToNewManager) { 413 TEST_F(PrioritizedResourceTest, TextureMovedToNewManager) {
414 scoped_ptr<PrioritizedResourceManager> resource_manager_one = 414 scoped_ptr<PrioritizedResourceManager> resource_manager_one =
415 CreateManager(1); 415 CreateManager(1);
416 scoped_ptr<PrioritizedResourceManager> resource_manager_two = 416 scoped_ptr<PrioritizedResourceManager> resource_manager_two =
417 CreateManager(1); 417 CreateManager(1);
418 scoped_ptr<PrioritizedResource> texture = 418 scoped_ptr<PrioritizedResource> texture =
419 resource_manager_one->CreateTexture(texture_size_, texture_format_); 419 resource_manager_one->CreateTexture(texture_size_, texture_format_);
420 420
421 // Texture is initially invalid, but it will become available. 421 // Texture is initially invalid, but it will become available.
422 EXPECT_FALSE(texture->have_backing_texture()); 422 EXPECT_FALSE(texture->have_backing_texture());
423 423
424 texture->set_request_priority(100); 424 texture->set_request_priority(100);
425 PrioritizeTexturesAndBackings(resource_manager_one.get()); 425 PrioritizeTexturesAndBackings(resource_manager_one.get());
426 426
427 EXPECT_TRUE(ValidateTexture(texture, false)); 427 EXPECT_TRUE(ValidateTexture(texture, false));
428 EXPECT_TRUE(texture->can_acquire_backing_texture()); 428 EXPECT_TRUE(texture->can_acquire_backing_texture());
429 EXPECT_TRUE(texture->have_backing_texture()); 429 EXPECT_TRUE(texture->have_backing_texture());
430 430
431 texture->SetTextureManager(0); { 431 texture->SetTextureManager(0);
danakj 2013/03/25 17:23:31 NULL
432 DebugScopedSetImplThreadAndMainThreadBlocked 432 {
433 impl_thread_and_main_thread_blocked(&proxy_); 433 DebugScopedSetImplThreadAndMainThreadBlocked
434 resource_manager_one->ClearAllMemory(ResourceProvider()); 434 impl_thread_and_main_thread_blocked(&proxy_);
435 } 435 resource_manager_one->ClearAllMemory(ResourceProvider());
436 resource_manager_one.reset(); 436 }
437 437 resource_manager_one.reset();
438 EXPECT_FALSE(texture->can_acquire_backing_texture()); 438
439 EXPECT_FALSE(texture->have_backing_texture()); 439 EXPECT_FALSE(texture->can_acquire_backing_texture());
440 440 EXPECT_FALSE(texture->have_backing_texture());
441 texture->SetTextureManager(resource_manager_two.get()); 441
442 442 texture->SetTextureManager(resource_manager_two.get());
443 PrioritizeTexturesAndBackings(resource_manager_two.get()); 443
444 444 PrioritizeTexturesAndBackings(resource_manager_two.get());
445 EXPECT_TRUE(ValidateTexture(texture, false)); 445
446 EXPECT_TRUE(texture->can_acquire_backing_texture()); 446 EXPECT_TRUE(ValidateTexture(texture, false));
447 EXPECT_TRUE(texture->have_backing_texture()); 447 EXPECT_TRUE(texture->can_acquire_backing_texture());
448 448 EXPECT_TRUE(texture->have_backing_texture());
449 DebugScopedSetImplThreadAndMainThreadBlocked 449
450 impl_thread_and_main_thread_blocked(&proxy_); 450 DebugScopedSetImplThreadAndMainThreadBlocked
451 resource_manager_two->ClearAllMemory(ResourceProvider()); 451 impl_thread_and_main_thread_blocked(&proxy_);
452 resource_manager_two->ClearAllMemory(ResourceProvider());
452 } 453 }
453 454
454 TEST_F(PrioritizedResourceTest, 455 TEST_F(PrioritizedResourceTest,
455 RenderSurfacesReduceMemoryAvailableOutsideRootSurface) { 456 RenderSurfacesReduceMemoryAvailableOutsideRootSurface) {
456 const size_t max_textures = 8; 457 const size_t max_textures = 8;
danakj 2013/03/25 17:23:31 const
457 scoped_ptr<PrioritizedResourceManager> resource_manager = 458 scoped_ptr<PrioritizedResourceManager> resource_manager =
458 CreateManager(max_textures); 459 CreateManager(max_textures);
459 460
460 // Half of the memory is taken by surfaces (with high priority place-holder) 461 // Half of the memory is taken by surfaces (with high priority place-holder)
461 scoped_ptr<PrioritizedResource> render_surface_place_holder = 462 scoped_ptr<PrioritizedResource> render_surface_place_holder =
462 resource_manager->CreateTexture(texture_size_, texture_format_); 463 resource_manager->CreateTexture(texture_size_, texture_format_);
463 render_surface_place_holder->SetToSelfManagedMemoryPlaceholder( 464 render_surface_place_holder->SetToSelfManagedMemoryPlaceholder(
464 TexturesMemorySize(4)); 465 TexturesMemorySize(4));
465 render_surface_place_holder->set_request_priority( 466 render_surface_place_holder->set_request_priority(
466 PriorityCalculator::RenderSurfacePriority()); 467 PriorityCalculator::RenderSurfacePriority());
467 468
468 // Create textures to fill our memory limit. 469 // Create textures to fill our memory limit.
469 scoped_ptr<PrioritizedResource> textures[max_textures]; 470 scoped_ptr<PrioritizedResource> textures[max_textures];
470 471
471 for (size_t i = 0; i < max_textures; ++i) 472 for (size_t i = 0; i < max_textures; ++i)
danakj 2013/03/25 17:23:31 {}
472 textures[i] = 473 textures[i] =
473 resource_manager->CreateTexture(texture_size_, texture_format_); 474 resource_manager->CreateTexture(texture_size_, texture_format_);
474 475
475 // Set decreasing non-visible priorities outside root surface. 476 // Set decreasing non-visible priorities outside root surface.
476 for (size_t i = 0; i < max_textures; ++i) 477 for (size_t i = 0; i < max_textures; ++i)
477 textures[i]->set_request_priority(100 + i); 478 textures[i]->set_request_priority(100 + i);
478 479
479 // Only lower half should be available. 480 // Only lower half should be available.
480 PrioritizeTexturesAndBackings(resource_manager.get()); 481 PrioritizeTexturesAndBackings(resource_manager.get());
481 EXPECT_TRUE(ValidateTexture(textures[0], false)); 482 EXPECT_TRUE(ValidateTexture(textures[0], false));
482 EXPECT_TRUE(ValidateTexture(textures[3], false)); 483 EXPECT_TRUE(ValidateTexture(textures[3], false));
483 EXPECT_FALSE(ValidateTexture(textures[4], false)); 484 EXPECT_FALSE(ValidateTexture(textures[4], false));
484 EXPECT_FALSE(ValidateTexture(textures[7], false)); 485 EXPECT_FALSE(ValidateTexture(textures[7], false));
485 486
486 // Set increasing non-visible priorities outside root surface. 487 // Set increasing non-visible priorities outside root surface.
487 for (size_t i = 0; i < max_textures; ++i) 488 for (size_t i = 0; i < max_textures; ++i)
488 textures[i]->set_request_priority(100 - i); 489 textures[i]->set_request_priority(100 - i);
489 490
490 // Only upper half should be available. 491 // Only upper half should be available.
491 PrioritizeTexturesAndBackings(resource_manager.get()); 492 PrioritizeTexturesAndBackings(resource_manager.get());
492 EXPECT_FALSE(ValidateTexture(textures[0], false)); 493 EXPECT_FALSE(ValidateTexture(textures[0], false));
493 EXPECT_FALSE(ValidateTexture(textures[3], false)); 494 EXPECT_FALSE(ValidateTexture(textures[3], false));
494 EXPECT_TRUE(ValidateTexture(textures[4], false)); 495 EXPECT_TRUE(ValidateTexture(textures[4], false));
495 EXPECT_TRUE(ValidateTexture(textures[7], false)); 496 EXPECT_TRUE(ValidateTexture(textures[7], false));
496 497
497 EXPECT_EQ(TexturesMemorySize(4), 498 EXPECT_EQ(TexturesMemorySize(4), resource_manager->MemoryAboveCutoffBytes());
498 resource_manager->MemoryAboveCutoffBytes()); 499 EXPECT_EQ(TexturesMemorySize(4),
499 EXPECT_EQ(TexturesMemorySize(4), 500 resource_manager->MemoryForSelfManagedTextures());
500 resource_manager->MemoryForSelfManagedTextures()); 501 EXPECT_LE(resource_manager->MemoryUseBytes(),
501 EXPECT_LE(resource_manager->MemoryUseBytes(), 502 resource_manager->MemoryAboveCutoffBytes());
502 resource_manager->MemoryAboveCutoffBytes()); 503
503 504 DebugScopedSetImplThreadAndMainThreadBlocked
504 DebugScopedSetImplThreadAndMainThreadBlocked 505 impl_thread_and_main_thread_blocked(&proxy_);
505 impl_thread_and_main_thread_blocked(&proxy_); 506 resource_manager->ClearAllMemory(ResourceProvider());
506 resource_manager->ClearAllMemory(ResourceProvider());
507 } 507 }
508 508
509 TEST_F(PrioritizedResourceTest, 509 TEST_F(PrioritizedResourceTest,
510 RenderSurfacesReduceMemoryAvailableForRequestLate) { 510 RenderSurfacesReduceMemoryAvailableForRequestLate) {
511 const size_t max_textures = 8; 511 const size_t max_textures = 8;
danakj 2013/03/25 17:23:31 const
512 scoped_ptr<PrioritizedResourceManager> resource_manager = 512 scoped_ptr<PrioritizedResourceManager> resource_manager =
513 CreateManager(max_textures); 513 CreateManager(max_textures);
514 514
515 // Half of the memory is taken by surfaces (with high priority place-holder) 515 // Half of the memory is taken by surfaces (with high priority place-holder)
516 scoped_ptr<PrioritizedResource> render_surface_place_holder = 516 scoped_ptr<PrioritizedResource> render_surface_place_holder =
517 resource_manager->CreateTexture(texture_size_, texture_format_); 517 resource_manager->CreateTexture(texture_size_, texture_format_);
518 render_surface_place_holder->SetToSelfManagedMemoryPlaceholder( 518 render_surface_place_holder->SetToSelfManagedMemoryPlaceholder(
519 TexturesMemorySize(4)); 519 TexturesMemorySize(4));
520 render_surface_place_holder->set_request_priority( 520 render_surface_place_holder->set_request_priority(
521 PriorityCalculator::RenderSurfacePriority()); 521 PriorityCalculator::RenderSurfacePriority());
522 522
523 // Create textures to fill our memory limit. 523 // Create textures to fill our memory limit.
524 scoped_ptr<PrioritizedResource> textures[max_textures]; 524 scoped_ptr<PrioritizedResource> textures[max_textures];
525 525
526 for (size_t i = 0; i < max_textures; ++i) 526 for (size_t i = 0; i < max_textures; ++i)
danakj 2013/03/25 17:23:31 {}
527 textures[i] = 527 textures[i] =
528 resource_manager->CreateTexture(texture_size_, texture_format_); 528 resource_manager->CreateTexture(texture_size_, texture_format_);
529 529
530 // Set equal priorities. 530 // Set equal priorities.
531 for (size_t i = 0; i < max_textures; ++i) 531 for (size_t i = 0; i < max_textures; ++i)
532 textures[i]->set_request_priority(100); 532 textures[i]->set_request_priority(100);
533 533
534 // The first four to be requested late will be available. 534 // The first four to be requested late will be available.
535 PrioritizeTexturesAndBackings(resource_manager.get()); 535 PrioritizeTexturesAndBackings(resource_manager.get());
536 for (unsigned i = 0; i < max_textures; ++i) 536 for (unsigned i = 0; i < max_textures; ++i)
537 EXPECT_FALSE(ValidateTexture(textures[i], false)); 537 EXPECT_FALSE(ValidateTexture(textures[i], false));
538 for (unsigned i = 0; i < max_textures; i += 2) 538 for (unsigned i = 0; i < max_textures; i += 2)
539 EXPECT_TRUE(ValidateTexture(textures[i], true)); 539 EXPECT_TRUE(ValidateTexture(textures[i], true));
540 for (unsigned i = 1; i < max_textures; i += 2) 540 for (unsigned i = 1; i < max_textures; i += 2)
541 EXPECT_FALSE(ValidateTexture(textures[i], true)); 541 EXPECT_FALSE(ValidateTexture(textures[i], true));
542 542
543 EXPECT_EQ(TexturesMemorySize(4), 543 EXPECT_EQ(TexturesMemorySize(4), resource_manager->MemoryAboveCutoffBytes());
544 resource_manager->MemoryAboveCutoffBytes()); 544 EXPECT_EQ(TexturesMemorySize(4),
545 EXPECT_EQ(TexturesMemorySize(4), 545 resource_manager->MemoryForSelfManagedTextures());
546 resource_manager->MemoryForSelfManagedTextures()); 546 EXPECT_LE(resource_manager->MemoryUseBytes(),
547 EXPECT_LE(resource_manager->MemoryUseBytes(), 547 resource_manager->MemoryAboveCutoffBytes());
548 resource_manager->MemoryAboveCutoffBytes()); 548
549 549 DebugScopedSetImplThreadAndMainThreadBlocked
550 DebugScopedSetImplThreadAndMainThreadBlocked 550 impl_thread_and_main_thread_blocked(&proxy_);
551 impl_thread_and_main_thread_blocked(&proxy_); 551 resource_manager->ClearAllMemory(ResourceProvider());
552 resource_manager->ClearAllMemory(ResourceProvider());
553 } 552 }
554 553
555 TEST_F(PrioritizedResourceTest, 554 TEST_F(PrioritizedResourceTest,
556 WhenRenderSurfaceNotAvailableTexturesAlsoNotAvailable) { 555 WhenRenderSurfaceNotAvailableTexturesAlsoNotAvailable) {
557 const size_t max_textures = 8; 556 const size_t max_textures = 8;
danakj 2013/03/25 17:23:31 const
558 scoped_ptr<PrioritizedResourceManager> resource_manager = 557 scoped_ptr<PrioritizedResourceManager> resource_manager =
559 CreateManager(max_textures); 558 CreateManager(max_textures);
560 559
561 // Half of the memory is taken by surfaces (with high priority place-holder) 560 // Half of the memory is taken by surfaces (with high priority place-holder)
562 scoped_ptr<PrioritizedResource> render_surface_place_holder = 561 scoped_ptr<PrioritizedResource> render_surface_place_holder =
563 resource_manager->CreateTexture(texture_size_, texture_format_); 562 resource_manager->CreateTexture(texture_size_, texture_format_);
564 render_surface_place_holder->SetToSelfManagedMemoryPlaceholder( 563 render_surface_place_holder->SetToSelfManagedMemoryPlaceholder(
565 TexturesMemorySize(4)); 564 TexturesMemorySize(4));
566 render_surface_place_holder->set_request_priority( 565 render_surface_place_holder->set_request_priority(
567 PriorityCalculator::RenderSurfacePriority()); 566 PriorityCalculator::RenderSurfacePriority());
568 567
569 // Create textures to fill our memory limit. 568 // Create textures to fill our memory limit.
570 scoped_ptr<PrioritizedResource> textures[max_textures]; 569 scoped_ptr<PrioritizedResource> textures[max_textures];
571 570
572 for (size_t i = 0; i < max_textures; ++i) 571 for (size_t i = 0; i < max_textures; ++i)
danakj 2013/03/25 17:23:31 {}
573 textures[i] = 572 textures[i] =
574 resource_manager->CreateTexture(texture_size_, texture_format_); 573 resource_manager->CreateTexture(texture_size_, texture_format_);
575 574
576 // Set 6 visible textures in the root surface, and 2 in a child surface. 575 // Set 6 visible textures in the root surface, and 2 in a child surface.
577 for (size_t i = 0; i < 6; ++i) 576 for (size_t i = 0; i < 6; ++i)
danakj 2013/03/25 17:23:31 {}
578 textures[i]-> 577 textures[i]
579 set_request_priority(PriorityCalculator::VisiblePriority(true)); 578 ->set_request_priority(PriorityCalculator::VisiblePriority(true));
danakj 2013/03/25 17:23:31 -> on prev line
580 for (size_t i = 6; i < 8; ++i) 579 for (size_t i = 6; i < 8; ++i)
danakj 2013/03/25 17:23:31 {}
581 textures[i]-> 580 textures[i]
582 set_request_priority(PriorityCalculator::VisiblePriority(false)); 581 ->set_request_priority(PriorityCalculator::VisiblePriority(false));
danakj 2013/03/25 17:23:31 -> moves up
583 582
584 PrioritizeTexturesAndBackings(resource_manager.get()); 583 PrioritizeTexturesAndBackings(resource_manager.get());
585 584
586 // Unable to request_late textures in the child surface. 585 // Unable to request_late textures in the child surface.
587 EXPECT_FALSE(ValidateTexture(textures[6], true)); 586 EXPECT_FALSE(ValidateTexture(textures[6], true));
588 EXPECT_FALSE(ValidateTexture(textures[7], true)); 587 EXPECT_FALSE(ValidateTexture(textures[7], true));
589 588
590 // Root surface textures are valid. 589 // Root surface textures are valid.
591 for (size_t i = 0; i < 6; ++i) 590 for (size_t i = 0; i < 6; ++i)
592 EXPECT_TRUE(ValidateTexture(textures[i], false)); 591 EXPECT_TRUE(ValidateTexture(textures[i], false));
593 592
594 EXPECT_EQ(TexturesMemorySize(6), 593 EXPECT_EQ(TexturesMemorySize(6), resource_manager->MemoryAboveCutoffBytes());
595 resource_manager->MemoryAboveCutoffBytes()); 594 EXPECT_EQ(TexturesMemorySize(2),
596 EXPECT_EQ(TexturesMemorySize(2), 595 resource_manager->MemoryForSelfManagedTextures());
597 resource_manager->MemoryForSelfManagedTextures()); 596 EXPECT_LE(resource_manager->MemoryUseBytes(),
598 EXPECT_LE(resource_manager->MemoryUseBytes(), 597 resource_manager->MemoryAboveCutoffBytes());
599 resource_manager->MemoryAboveCutoffBytes()); 598
600 599 DebugScopedSetImplThreadAndMainThreadBlocked
601 DebugScopedSetImplThreadAndMainThreadBlocked 600 impl_thread_and_main_thread_blocked(&proxy_);
602 impl_thread_and_main_thread_blocked(&proxy_); 601 resource_manager->ClearAllMemory(ResourceProvider());
603 resource_manager->ClearAllMemory(ResourceProvider());
604 } 602 }
605 603
606 TEST_F(PrioritizedResourceTest, RequestLateBackingsSorting) { 604 TEST_F(PrioritizedResourceTest, RequestLateBackingsSorting) {
607 const size_t max_textures = 8; 605 const size_t max_textures = 8;
danakj 2013/03/25 17:23:31 const
608 scoped_ptr<PrioritizedResourceManager> resource_manager = 606 scoped_ptr<PrioritizedResourceManager> resource_manager =
609 CreateManager(max_textures); 607 CreateManager(max_textures);
610 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(max_textures)); 608 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(max_textures));
611 609
612 // Create textures to fill our memory limit. 610 // Create textures to fill our memory limit.
613 scoped_ptr<PrioritizedResource> textures[max_textures]; 611 scoped_ptr<PrioritizedResource> textures[max_textures];
614 for (size_t i = 0; i < max_textures; ++i) 612 for (size_t i = 0; i < max_textures; ++i)
danakj 2013/03/25 17:23:31 {}
615 textures[i] = 613 textures[i] =
616 resource_manager->CreateTexture(texture_size_, texture_format_); 614 resource_manager->CreateTexture(texture_size_, texture_format_);
617 615
618 // Set equal priorities, and allocate backings for all textures. 616 // Set equal priorities, and allocate backings for all textures.
619 for (size_t i = 0; i < max_textures; ++i) 617 for (size_t i = 0; i < max_textures; ++i)
620 textures[i]->set_request_priority(100); 618 textures[i]->set_request_priority(100);
621 PrioritizeTexturesAndBackings(resource_manager.get()); 619 PrioritizeTexturesAndBackings(resource_manager.get());
622 for (unsigned i = 0; i < max_textures; ++i) 620 for (unsigned i = 0; i < max_textures; ++i)
623 EXPECT_TRUE(ValidateTexture(textures[i], false)); 621 EXPECT_TRUE(ValidateTexture(textures[i], false));
624 622
625 // Drop the memory limit and prioritize (none will be above the threshold, 623 // Drop the memory limit and prioritize (none will be above the threshold,
626 // but they still have backings because ReduceMemory hasn't been called). 624 // but they still have backings because ReduceMemory hasn't been called).
627 resource_manager->SetMaxMemoryLimitBytes( 625 resource_manager->SetMaxMemoryLimitBytes(
628 TexturesMemorySize(max_textures / 2)); 626 TexturesMemorySize(max_textures / 2));
629 PrioritizeTexturesAndBackings(resource_manager.get()); 627 PrioritizeTexturesAndBackings(resource_manager.get());
630 628
631 // Push half of them back over the limit. 629 // Push half of them back over the limit.
632 for (size_t i = 0; i < max_textures; i += 2) 630 for (size_t i = 0; i < max_textures; i += 2)
633 EXPECT_TRUE(textures[i]->RequestLate()); 631 EXPECT_TRUE(textures[i]->RequestLate());
634 632
635 // Push the priorities to the backings array and sort the backings array 633 // Push the priorities to the backings array and sort the backings array
636 ResourceManagerUpdateBackingsPriorities(resource_manager.get()); 634 ResourceManagerUpdateBackingsPriorities(resource_manager.get());
637 635
638 // Assert that the backings list be sorted with the below-limit backings 636 // Assert that the backings list be sorted with the below-limit backings
639 // before the above-limit backings. 637 // before the above-limit backings.
640 ResourceManagerAssertInvariants(resource_manager.get()); 638 ResourceManagerAssertInvariants(resource_manager.get());
641 639
642 // Make sure that we have backings for all of the textures. 640 // Make sure that we have backings for all of the textures.
643 for (size_t i = 0; i < max_textures; ++i) 641 for (size_t i = 0; i < max_textures; ++i)
644 EXPECT_TRUE(textures[i]->have_backing_texture()); 642 EXPECT_TRUE(textures[i]->have_backing_texture());
645 643
646 // Make sure that only the request_late textures are above the priority 644 // Make sure that only the request_late textures are above the priority
647 // cutoff 645 // cutoff
648 for (size_t i = 0; i < max_textures; i += 2) 646 for (size_t i = 0; i < max_textures; i += 2)
649 EXPECT_TRUE(TextureBackingIsAbovePriorityCutoff(textures[i].get())); 647 EXPECT_TRUE(TextureBackingIsAbovePriorityCutoff(textures[i].get()));
650 for (size_t i = 1; i < max_textures; i += 2) 648 for (size_t i = 1; i < max_textures; i += 2)
651 EXPECT_FALSE(TextureBackingIsAbovePriorityCutoff(textures[i].get())); 649 EXPECT_FALSE(TextureBackingIsAbovePriorityCutoff(textures[i].get()));
652 650
653 DebugScopedSetImplThreadAndMainThreadBlocked 651 DebugScopedSetImplThreadAndMainThreadBlocked
654 impl_thread_and_main_thread_blocked(&proxy_); 652 impl_thread_and_main_thread_blocked(&proxy_);
655 resource_manager->ClearAllMemory(ResourceProvider()); 653 resource_manager->ClearAllMemory(ResourceProvider());
656 } 654 }
657 655
658 TEST_F(PrioritizedResourceTest, ClearUploadsToEvictedResources) { 656 TEST_F(PrioritizedResourceTest, ClearUploadsToEvictedResources) {
659 const size_t max_textures = 4; 657 const size_t max_textures = 4;
danakj 2013/03/25 17:23:31 const
660 scoped_ptr<PrioritizedResourceManager> resource_manager = 658 scoped_ptr<PrioritizedResourceManager> resource_manager =
661 CreateManager(max_textures); 659 CreateManager(max_textures);
662 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(max_textures)); 660 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(max_textures));
663 661
664 // Create textures to fill our memory limit. 662 // Create textures to fill our memory limit.
665 scoped_ptr<PrioritizedResource> textures[max_textures]; 663 scoped_ptr<PrioritizedResource> textures[max_textures];
666 664
667 for (size_t i = 0; i < max_textures; ++i) 665 for (size_t i = 0; i < max_textures; ++i)
danakj 2013/03/25 17:23:31 {}
668 textures[i] = 666 textures[i] =
669 resource_manager->CreateTexture(texture_size_, texture_format_); 667 resource_manager->CreateTexture(texture_size_, texture_format_);
670 668
671 // Set equal priorities, and allocate backings for all textures. 669 // Set equal priorities, and allocate backings for all textures.
672 for (size_t i = 0; i < max_textures; ++i) 670 for (size_t i = 0; i < max_textures; ++i)
673 textures[i]->set_request_priority(100); 671 textures[i]->set_request_priority(100);
674 PrioritizeTexturesAndBackings(resource_manager.get()); 672 PrioritizeTexturesAndBackings(resource_manager.get());
675 for (unsigned i = 0; i < max_textures; ++i) 673 for (unsigned i = 0; i < max_textures; ++i)
676 EXPECT_TRUE(ValidateTexture(textures[i], false)); 674 EXPECT_TRUE(ValidateTexture(textures[i], false));
677 675
678 ResourceUpdateQueue queue; 676 ResourceUpdateQueue queue;
679 DebugScopedSetImplThreadAndMainThreadBlocked 677 DebugScopedSetImplThreadAndMainThreadBlocked
680 impl_thread_and_main_thread_blocked(&proxy_); 678 impl_thread_and_main_thread_blocked(&proxy_);
681 for (size_t i = 0; i < max_textures; ++i) { 679 for (size_t i = 0; i < max_textures; ++i) {
682 const ResourceUpdate upload = ResourceUpdate::Create( 680 const ResourceUpdate upload = ResourceUpdate::Create(
683 textures[i].get(), NULL, gfx::Rect(), gfx::Rect(), gfx::Vector2d()); 681 textures[i].get(), NULL, gfx::Rect(), gfx::Rect(), gfx::Vector2d());
684 queue.AppendFullUpload(upload); 682 queue.AppendFullUpload(upload);
685 } 683 }
686 684
687 // Make sure that we have backings for all of the textures. 685 // Make sure that we have backings for all of the textures.
688 for (size_t i = 0; i < max_textures; ++i) 686 for (size_t i = 0; i < max_textures; ++i)
689 EXPECT_TRUE(textures[i]->have_backing_texture()); 687 EXPECT_TRUE(textures[i]->have_backing_texture());
690 688
691 queue.ClearUploadsToEvictedResources(); 689 queue.ClearUploadsToEvictedResources();
692 EXPECT_EQ(4, queue.FullUploadSize()); 690 EXPECT_EQ(4, queue.FullUploadSize());
693 691
694 resource_manager->ReduceMemoryOnImplThread( 692 resource_manager->ReduceMemoryOnImplThread(
695 TexturesMemorySize(1), 693 TexturesMemorySize(1),
696 PriorityCalculator::AllowEverythingCutoff(), 694 PriorityCalculator::AllowEverythingCutoff(),
697 ResourceProvider()); 695 ResourceProvider());
698 queue.ClearUploadsToEvictedResources(); 696 queue.ClearUploadsToEvictedResources();
699 EXPECT_EQ(1, queue.FullUploadSize()); 697 EXPECT_EQ(1, queue.FullUploadSize());
700 698
701 resource_manager->ReduceMemoryOnImplThread( 699 resource_manager->ReduceMemoryOnImplThread(
702 0, PriorityCalculator::AllowEverythingCutoff(), ResourceProvider()); 700 0, PriorityCalculator::AllowEverythingCutoff(), ResourceProvider());
703 queue.ClearUploadsToEvictedResources(); 701 queue.ClearUploadsToEvictedResources();
704 EXPECT_EQ(0, queue.FullUploadSize()); 702 EXPECT_EQ(0, queue.FullUploadSize());
705 } 703 }
706 704
707 TEST_F(PrioritizedResourceTest, UsageStatistics) { 705 TEST_F(PrioritizedResourceTest, UsageStatistics) {
708 const size_t max_textures = 5; 706 const size_t max_textures = 5;
danakj 2013/03/25 17:23:31 const
709 scoped_ptr<PrioritizedResourceManager> resource_manager = 707 scoped_ptr<PrioritizedResourceManager> resource_manager =
710 CreateManager(max_textures); 708 CreateManager(max_textures);
711 scoped_ptr<PrioritizedResource> textures[max_textures]; 709 scoped_ptr<PrioritizedResource> textures[max_textures];
712 710
713 for (size_t i = 0; i < max_textures; ++i) 711 for (size_t i = 0; i < max_textures; ++i)
danakj 2013/03/25 17:23:31 {}
714 textures[i] = 712 textures[i] =
715 resource_manager->CreateTexture(texture_size_, texture_format_); 713 resource_manager->CreateTexture(texture_size_, texture_format_);
716 714
717 textures[0]->set_request_priority( 715 textures[0]
718 PriorityCalculator::AllowVisibleOnlyCutoff() - 1); 716 ->set_request_priority(PriorityCalculator::AllowVisibleOnlyCutoff() - 1);
danakj 2013/03/25 17:23:31 move ->'s
719 textures[1]-> 717 textures[1]
720 set_request_priority(PriorityCalculator::AllowVisibleOnlyCutoff()); 718 ->set_request_priority(PriorityCalculator::AllowVisibleOnlyCutoff());
721 textures[2]->set_request_priority( 719 textures[2]->set_request_priority(
722 PriorityCalculator::AllowVisibleAndNearbyCutoff() - 1); 720 PriorityCalculator::AllowVisibleAndNearbyCutoff() - 1);
723 textures[3]->set_request_priority( 721 textures[3]
724 PriorityCalculator::AllowVisibleAndNearbyCutoff()); 722 ->set_request_priority(PriorityCalculator::AllowVisibleAndNearbyCutoff());
725 textures[4]->set_request_priority( 723 textures[4]->set_request_priority(
726 PriorityCalculator::AllowVisibleAndNearbyCutoff() + 1); 724 PriorityCalculator::AllowVisibleAndNearbyCutoff() + 1);
727 725
728 // Set max limit to 2 textures. 726 // Set max limit to 2 textures.
729 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(2)); 727 resource_manager->SetMaxMemoryLimitBytes(TexturesMemorySize(2));
730 PrioritizeTexturesAndBackings(resource_manager.get()); 728 PrioritizeTexturesAndBackings(resource_manager.get());
731 729
732 // The first two textures should be available, others should not. 730 // The first two textures should be available, others should not.
733 for (size_t i = 0; i < 2; ++i) 731 for (size_t i = 0; i < 2; ++i)
734 EXPECT_TRUE(ValidateTexture(textures[i], false)); 732 EXPECT_TRUE(ValidateTexture(textures[i], false));
735 for (size_t i = 2; i < max_textures; ++i) 733 for (size_t i = 2; i < max_textures; ++i)
736 EXPECT_FALSE(ValidateTexture(textures[i], false)); 734 EXPECT_FALSE(ValidateTexture(textures[i], false));
737 735
738 // Validate the statistics. 736 // Validate the statistics.
739 { 737 {
740 DebugScopedSetImplThread impl_thread(&proxy_); 738 DebugScopedSetImplThread impl_thread(&proxy_);
741 EXPECT_EQ(TexturesMemorySize(2), resource_manager->MemoryUseBytes()); 739 EXPECT_EQ(TexturesMemorySize(2), resource_manager->MemoryUseBytes());
742 EXPECT_EQ(TexturesMemorySize(1), 740 EXPECT_EQ(TexturesMemorySize(1), resource_manager->MemoryVisibleBytes());
743 resource_manager->MemoryVisibleBytes()); 741 EXPECT_EQ(TexturesMemorySize(3),
744 EXPECT_EQ(TexturesMemorySize(3), 742 resource_manager->MemoryVisibleAndNearbyBytes());
745 resource_manager->MemoryVisibleAndNearbyBytes()); 743 }
746 } 744
747 745 // Re-prioritize the textures, but do not push the values to backings.
748 // Re-prioritize the textures, but do not push the values to backings. 746 textures[0]
749 textures[0]->set_request_priority( 747 ->set_request_priority(PriorityCalculator::AllowVisibleOnlyCutoff() - 1);
danakj 2013/03/25 17:23:31 ->
750 PriorityCalculator::AllowVisibleOnlyCutoff() - 1); 748 textures[1]
751 textures[1]->set_request_priority( 749 ->set_request_priority(PriorityCalculator::AllowVisibleOnlyCutoff() - 1);
752 PriorityCalculator::AllowVisibleOnlyCutoff() - 1); 750 textures[2]
753 textures[2]->set_request_priority( 751 ->set_request_priority(PriorityCalculator::AllowVisibleOnlyCutoff() - 1);
754 PriorityCalculator::AllowVisibleOnlyCutoff() - 1); 752 textures[3]->set_request_priority(
755 textures[3]->set_request_priority( 753 PriorityCalculator::AllowVisibleAndNearbyCutoff() - 1);
756 PriorityCalculator::AllowVisibleAndNearbyCutoff() - 1); 754 textures[4]
757 textures[4]->set_request_priority( 755 ->set_request_priority(PriorityCalculator::AllowVisibleAndNearbyCutoff());
758 PriorityCalculator::AllowVisibleAndNearbyCutoff()); 756 resource_manager->PrioritizeTextures();
759 resource_manager->PrioritizeTextures(); 757
760 758 // Verify that we still see the old values.
761 // Verify that we still see the old values. 759 {
762 { 760 DebugScopedSetImplThread impl_thread(&proxy_);
763 DebugScopedSetImplThread impl_thread (& proxy_); 761 EXPECT_EQ(TexturesMemorySize(2), resource_manager->MemoryUseBytes());
764 EXPECT_EQ(TexturesMemorySize(2), resource_manager->MemoryUseBytes()); 762 EXPECT_EQ(TexturesMemorySize(1), resource_manager->MemoryVisibleBytes());
765 EXPECT_EQ(TexturesMemorySize(1), 763 EXPECT_EQ(TexturesMemorySize(3),
766 resource_manager->MemoryVisibleBytes()); 764 resource_manager->MemoryVisibleAndNearbyBytes());
767 EXPECT_EQ(TexturesMemorySize(3), 765 }
768 resource_manager->MemoryVisibleAndNearbyBytes()); 766
769 } 767 // Push priorities to backings, and verify we see the new values.
770 768 {
771 // Push priorities to backings, and verify we see the new values. 769 DebugScopedSetImplThreadAndMainThreadBlocked
772 { 770 impl_thread_and_main_thread_blocked(&proxy_);
773 DebugScopedSetImplThreadAndMainThreadBlocked 771 resource_manager->PushTexturePrioritiesToBackings();
774 impl_thread_and_main_thread_blocked (& proxy_); 772 EXPECT_EQ(TexturesMemorySize(2), resource_manager->MemoryUseBytes());
775 resource_manager->PushTexturePrioritiesToBackings(); 773 EXPECT_EQ(TexturesMemorySize(3), resource_manager->MemoryVisibleBytes());
776 EXPECT_EQ(TexturesMemorySize(2), resource_manager->MemoryUseBytes()); 774 EXPECT_EQ(TexturesMemorySize(4),
777 EXPECT_EQ(TexturesMemorySize(3), 775 resource_manager->MemoryVisibleAndNearbyBytes());
778 resource_manager->MemoryVisibleBytes()); 776 }
779 EXPECT_EQ(TexturesMemorySize(4), 777
780 resource_manager->MemoryVisibleAndNearbyBytes()); 778 DebugScopedSetImplThreadAndMainThreadBlocked
781 } 779 impl_thread_and_main_thread_blocked(&proxy_);
782 780 resource_manager->ClearAllMemory(ResourceProvider());
783 DebugScopedSetImplThreadAndMainThreadBlocked
784 impl_thread_and_main_thread_blocked (& proxy_);
785 resource_manager->ClearAllMemory(ResourceProvider());
786 } 781 }
787 782
788 } // namespace 783 } // namespace
789 } // namespace cc 784 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698