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
3 // found in the LICENSE file.
5 #include "cc/resources/prioritized_resource.h"
9 #include "cc/resources/prioritized_resource_manager.h"
10 #include "cc/resources/resource.h"
11 #include "cc/resources/resource_provider.h"
12 #include "cc/test/fake_output_surface.h"
13 #include "cc/test/fake_output_surface_client.h"
14 #include "cc/test/fake_proxy.h"
15 #include "cc/test/test_shared_bitmap_manager.h"
16 #include "cc/test/tiled_layer_test_common.h"
17 #include "cc/trees/single_thread_proxy.h" // For DebugScopedSetImplThread
18 #include "testing/gtest/include/gtest/gtest.h"
22 class PrioritizedResourceTest
: public testing::Test
{
24 PrioritizedResourceTest()
25 : texture_size_(256, 256),
26 texture_format_(RGBA_8888
),
27 output_surface_(FakeOutputSurface::Create3d()) {
28 DebugScopedSetImplThread
impl_thread(&proxy_
);
29 CHECK(output_surface_
->BindToClient(&output_surface_client_
));
30 shared_bitmap_manager_
.reset(new TestSharedBitmapManager());
31 resource_provider_
= ResourceProvider::Create(output_surface_
.get(),
32 shared_bitmap_manager_
.get(),
40 virtual ~PrioritizedResourceTest() {
41 DebugScopedSetImplThread
impl_thread(&proxy_
);
42 resource_provider_
= nullptr;
45 size_t TexturesMemorySize(size_t texture_count
) {
46 return Resource::MemorySizeBytes(texture_size_
, texture_format_
) *
50 scoped_ptr
<PrioritizedResourceManager
> CreateManager(size_t max_textures
) {
51 scoped_ptr
<PrioritizedResourceManager
> manager
=
52 PrioritizedResourceManager::Create(&proxy_
);
53 manager
->SetMaxMemoryLimitBytes(TexturesMemorySize(max_textures
));
54 return manager
.Pass();
57 bool ValidateTexture(PrioritizedResource
* texture
,
59 ResourceManagerAssertInvariants(texture
->resource_manager());
61 texture
->RequestLate();
62 ResourceManagerAssertInvariants(texture
->resource_manager());
63 DebugScopedSetImplThreadAndMainThreadBlocked
64 impl_thread_and_main_thread_blocked(&proxy_
);
65 bool success
= texture
->can_acquire_backing_texture();
67 texture
->AcquireBackingTexture(resource_provider());
71 void PrioritizeTexturesAndBackings(
72 PrioritizedResourceManager
* resource_manager
) {
73 resource_manager
->PrioritizeTextures();
74 ResourceManagerUpdateBackingsPriorities(resource_manager
);
77 void ResourceManagerUpdateBackingsPriorities(
78 PrioritizedResourceManager
* resource_manager
) {
79 DebugScopedSetImplThreadAndMainThreadBlocked
80 impl_thread_and_main_thread_blocked(&proxy_
);
81 resource_manager
->PushTexturePrioritiesToBackings();
84 ResourceProvider
* resource_provider() { return resource_provider_
.get(); }
86 void ResourceManagerAssertInvariants(
87 PrioritizedResourceManager
* resource_manager
) {
88 DebugScopedSetImplThreadAndMainThreadBlocked
89 impl_thread_and_main_thread_blocked(&proxy_
);
90 resource_manager
->AssertInvariants();
93 bool TextureBackingIsAbovePriorityCutoff(PrioritizedResource
* texture
) {
94 return texture
->backing()->
95 was_above_priority_cutoff_at_last_priority_update();
98 size_t EvictedBackingCount(PrioritizedResourceManager
* resource_manager
) {
99 return resource_manager
->evicted_backings_
.size();
102 std::vector
<unsigned> BackingResources(
103 PrioritizedResourceManager
* resource_manager
) {
104 std::vector
<unsigned> resources
;
105 for (PrioritizedResourceManager::BackingList::iterator it
=
106 resource_manager
->backings_
.begin();
107 it
!= resource_manager
->backings_
.end();
109 resources
.push_back((*it
)->id());
115 const gfx::Size texture_size_
;
116 const ResourceFormat texture_format_
;
117 FakeOutputSurfaceClient output_surface_client_
;
118 scoped_ptr
<OutputSurface
> output_surface_
;
119 scoped_ptr
<SharedBitmapManager
> shared_bitmap_manager_
;
120 scoped_ptr
<ResourceProvider
> resource_provider_
;
125 TEST_F(PrioritizedResourceTest
, RequestTextureExceedingMaxLimit
) {
126 const size_t kMaxTextures
= 8;
127 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
128 CreateManager(kMaxTextures
);
130 // Create textures for double our memory limit.
131 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
* 2];
133 for (size_t i
= 0; i
< kMaxTextures
* 2; ++i
)
135 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
137 // Set decreasing priorities
138 for (size_t i
= 0; i
< kMaxTextures
* 2; ++i
)
139 textures
[i
]->set_request_priority(100 + i
);
141 // Only lower half should be available.
142 PrioritizeTexturesAndBackings(resource_manager
.get());
143 EXPECT_TRUE(ValidateTexture(textures
[0].get(), false));
144 EXPECT_TRUE(ValidateTexture(textures
[7].get(), false));
145 EXPECT_FALSE(ValidateTexture(textures
[8].get(), false));
146 EXPECT_FALSE(ValidateTexture(textures
[15].get(), false));
148 // Set increasing priorities
149 for (size_t i
= 0; i
< kMaxTextures
* 2; ++i
)
150 textures
[i
]->set_request_priority(100 - i
);
152 // Only upper half should be available.
153 PrioritizeTexturesAndBackings(resource_manager
.get());
154 EXPECT_FALSE(ValidateTexture(textures
[0].get(), false));
155 EXPECT_FALSE(ValidateTexture(textures
[7].get(), false));
156 EXPECT_TRUE(ValidateTexture(textures
[8].get(), false));
157 EXPECT_TRUE(ValidateTexture(textures
[15].get(), false));
159 EXPECT_EQ(TexturesMemorySize(kMaxTextures
),
160 resource_manager
->MemoryAboveCutoffBytes());
161 EXPECT_LE(resource_manager
->MemoryUseBytes(),
162 resource_manager
->MemoryAboveCutoffBytes());
163 EXPECT_EQ(TexturesMemorySize(2*kMaxTextures
),
164 resource_manager
->MaxMemoryNeededBytes());
166 DebugScopedSetImplThreadAndMainThreadBlocked
167 impl_thread_and_main_thread_blocked(&proxy_
);
168 resource_manager
->ClearAllMemory(resource_provider());
171 TEST_F(PrioritizedResourceTest
, ChangeMemoryLimits
) {
172 const size_t kMaxTextures
= 8;
173 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
174 CreateManager(kMaxTextures
);
175 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
];
177 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
179 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
181 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
182 textures
[i
]->set_request_priority(100 + i
);
184 // Set max limit to 8 textures
185 resource_manager
->SetMaxMemoryLimitBytes(TexturesMemorySize(8));
186 PrioritizeTexturesAndBackings(resource_manager
.get());
187 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
188 ValidateTexture(textures
[i
].get(), false);
190 DebugScopedSetImplThreadAndMainThreadBlocked
191 impl_thread_and_main_thread_blocked(&proxy_
);
192 resource_manager
->ReduceMemory(resource_provider());
195 EXPECT_EQ(TexturesMemorySize(8), resource_manager
->MemoryAboveCutoffBytes());
196 EXPECT_LE(resource_manager
->MemoryUseBytes(),
197 resource_manager
->MemoryAboveCutoffBytes());
199 // Set max limit to 5 textures
200 resource_manager
->SetMaxMemoryLimitBytes(TexturesMemorySize(5));
201 PrioritizeTexturesAndBackings(resource_manager
.get());
202 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
203 EXPECT_EQ(ValidateTexture(textures
[i
].get(), false), i
< 5);
205 DebugScopedSetImplThreadAndMainThreadBlocked
206 impl_thread_and_main_thread_blocked(&proxy_
);
207 resource_manager
->ReduceMemory(resource_provider());
210 EXPECT_EQ(TexturesMemorySize(5), resource_manager
->MemoryAboveCutoffBytes());
211 EXPECT_LE(resource_manager
->MemoryUseBytes(),
212 resource_manager
->MemoryAboveCutoffBytes());
213 EXPECT_EQ(TexturesMemorySize(kMaxTextures
),
214 resource_manager
->MaxMemoryNeededBytes());
216 // Set max limit to 4 textures
217 resource_manager
->SetMaxMemoryLimitBytes(TexturesMemorySize(4));
218 PrioritizeTexturesAndBackings(resource_manager
.get());
219 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
220 EXPECT_EQ(ValidateTexture(textures
[i
].get(), false), i
< 4);
222 DebugScopedSetImplThreadAndMainThreadBlocked
223 impl_thread_and_main_thread_blocked(&proxy_
);
224 resource_manager
->ReduceMemory(resource_provider());
227 EXPECT_EQ(TexturesMemorySize(4), resource_manager
->MemoryAboveCutoffBytes());
228 EXPECT_LE(resource_manager
->MemoryUseBytes(),
229 resource_manager
->MemoryAboveCutoffBytes());
230 EXPECT_EQ(TexturesMemorySize(kMaxTextures
),
231 resource_manager
->MaxMemoryNeededBytes());
233 DebugScopedSetImplThreadAndMainThreadBlocked
234 impl_thread_and_main_thread_blocked(&proxy_
);
235 resource_manager
->ClearAllMemory(resource_provider());
238 TEST_F(PrioritizedResourceTest
, ReduceWastedMemory
) {
239 const size_t kMaxTextures
= 20;
240 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
241 CreateManager(kMaxTextures
);
242 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
];
244 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
246 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
248 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
249 textures
[i
]->set_request_priority(100 + i
);
251 // Set the memory limit to the max number of textures.
252 resource_manager
->SetMaxMemoryLimitBytes(TexturesMemorySize(kMaxTextures
));
253 PrioritizeTexturesAndBackings(resource_manager
.get());
255 // Create backings and textures for all of the textures.
256 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
257 ValidateTexture(textures
[i
].get(), false);
260 DebugScopedSetImplThreadAndMainThreadBlocked
261 impl_thread_and_main_thread_blocked(&proxy_
);
262 uint8_t image
[4] = {0};
263 textures
[i
]->SetPixels(resource_provider_
.get(),
271 DebugScopedSetImplThreadAndMainThreadBlocked
272 impl_thread_and_main_thread_blocked(&proxy_
);
273 resource_manager
->ReduceMemory(resource_provider());
276 // 20 textures have backings allocated.
277 EXPECT_EQ(TexturesMemorySize(20), resource_manager
->MemoryUseBytes());
279 // Destroy one texture, not enough is wasted to cause cleanup.
280 textures
[0] = nullptr;
281 PrioritizeTexturesAndBackings(resource_manager
.get());
283 DebugScopedSetImplThreadAndMainThreadBlocked
284 impl_thread_and_main_thread_blocked(&proxy_
);
285 resource_manager
->UpdateBackingsState(resource_provider());
286 resource_manager
->ReduceWastedMemory(resource_provider());
288 EXPECT_EQ(TexturesMemorySize(20), resource_manager
->MemoryUseBytes());
290 // Destroy half the textures, leaving behind the backings. Now a cleanup
292 for (size_t i
= 0; i
< kMaxTextures
/ 2; ++i
)
293 textures
[i
] = nullptr;
294 PrioritizeTexturesAndBackings(resource_manager
.get());
296 DebugScopedSetImplThreadAndMainThreadBlocked
297 impl_thread_and_main_thread_blocked(&proxy_
);
298 resource_manager
->UpdateBackingsState(resource_provider());
299 resource_manager
->ReduceWastedMemory(resource_provider());
301 EXPECT_GT(TexturesMemorySize(20), resource_manager
->MemoryUseBytes());
303 DebugScopedSetImplThreadAndMainThreadBlocked
304 impl_thread_and_main_thread_blocked(&proxy_
);
305 resource_manager
->ClearAllMemory(resource_provider());
308 TEST_F(PrioritizedResourceTest
, InUseNotWastedMemory
) {
309 const size_t kMaxTextures
= 20;
310 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
311 CreateManager(kMaxTextures
);
312 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
];
314 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
316 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
318 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
319 textures
[i
]->set_request_priority(100 + i
);
321 // Set the memory limit to the max number of textures.
322 resource_manager
->SetMaxMemoryLimitBytes(TexturesMemorySize(kMaxTextures
));
323 PrioritizeTexturesAndBackings(resource_manager
.get());
325 // Create backings and textures for all of the textures.
326 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
327 ValidateTexture(textures
[i
].get(), false);
330 DebugScopedSetImplThreadAndMainThreadBlocked
331 impl_thread_and_main_thread_blocked(&proxy_
);
332 uint8_t image
[4] = {0};
333 textures
[i
]->SetPixels(resource_provider_
.get(),
341 DebugScopedSetImplThreadAndMainThreadBlocked
342 impl_thread_and_main_thread_blocked(&proxy_
);
343 resource_manager
->ReduceMemory(resource_provider());
346 // 20 textures have backings allocated.
347 EXPECT_EQ(TexturesMemorySize(20), resource_manager
->MemoryUseBytes());
349 // Send half the textures to a parent compositor.
350 ResourceProvider::ResourceIdArray to_send
;
351 TransferableResourceArray transferable
;
352 for (size_t i
= 0; i
< kMaxTextures
/ 2; ++i
)
353 to_send
.push_back(textures
[i
]->resource_id());
354 resource_provider_
->PrepareSendToParent(to_send
, &transferable
);
356 // Destroy half the textures, leaving behind the backings. The backings are
357 // sent to a parent compositor though, so they should not be considered wasted
358 // and a cleanup should not happen.
359 for (size_t i
= 0; i
< kMaxTextures
/ 2; ++i
)
360 textures
[i
] = nullptr;
361 PrioritizeTexturesAndBackings(resource_manager
.get());
363 DebugScopedSetImplThreadAndMainThreadBlocked
364 impl_thread_and_main_thread_blocked(&proxy_
);
365 resource_manager
->UpdateBackingsState(resource_provider());
366 resource_manager
->ReduceWastedMemory(resource_provider());
368 EXPECT_EQ(TexturesMemorySize(20), resource_manager
->MemoryUseBytes());
370 // Receive the textures back from the parent compositor. Now a cleanup should
372 ReturnedResourceArray returns
;
373 TransferableResource::ReturnResources(transferable
, &returns
);
374 resource_provider_
->ReceiveReturnsFromParent(returns
);
376 DebugScopedSetImplThreadAndMainThreadBlocked
377 impl_thread_and_main_thread_blocked(&proxy_
);
378 resource_manager
->UpdateBackingsState(resource_provider());
379 resource_manager
->ReduceWastedMemory(resource_provider());
381 EXPECT_GT(TexturesMemorySize(20), resource_manager
->MemoryUseBytes());
383 DebugScopedSetImplThreadAndMainThreadBlocked
384 impl_thread_and_main_thread_blocked(&proxy_
);
385 resource_manager
->ClearAllMemory(resource_provider());
388 TEST_F(PrioritizedResourceTest
, ChangePriorityCutoff
) {
389 const size_t kMaxTextures
= 8;
390 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
391 CreateManager(kMaxTextures
);
392 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
];
394 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
396 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
398 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
399 textures
[i
]->set_request_priority(100 + i
);
401 // Set the cutoff to drop two textures. Try to request_late on all textures,
402 // and make sure that request_late doesn't work on a texture with equal
403 // priority to the cutoff.
404 resource_manager
->SetMaxMemoryLimitBytes(TexturesMemorySize(8));
405 resource_manager
->SetExternalPriorityCutoff(106);
406 PrioritizeTexturesAndBackings(resource_manager
.get());
407 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
408 EXPECT_EQ(ValidateTexture(textures
[i
].get(), true), i
< 6);
410 DebugScopedSetImplThreadAndMainThreadBlocked
411 impl_thread_and_main_thread_blocked(&proxy_
);
412 resource_manager
->ReduceMemory(resource_provider());
414 EXPECT_EQ(TexturesMemorySize(6), resource_manager
->MemoryAboveCutoffBytes());
415 EXPECT_LE(resource_manager
->MemoryUseBytes(),
416 resource_manager
->MemoryAboveCutoffBytes());
418 // Set the cutoff to drop two more textures.
419 resource_manager
->SetExternalPriorityCutoff(104);
420 PrioritizeTexturesAndBackings(resource_manager
.get());
421 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
422 EXPECT_EQ(ValidateTexture(textures
[i
].get(), false), i
< 4);
424 DebugScopedSetImplThreadAndMainThreadBlocked
425 impl_thread_and_main_thread_blocked(&proxy_
);
426 resource_manager
->ReduceMemory(resource_provider());
428 EXPECT_EQ(TexturesMemorySize(4), resource_manager
->MemoryAboveCutoffBytes());
430 // Do a one-time eviction for one more texture based on priority cutoff
431 resource_manager
->UnlinkAndClearEvictedBackings();
433 DebugScopedSetImplThreadAndMainThreadBlocked
434 impl_thread_and_main_thread_blocked(&proxy_
);
435 resource_manager
->ReduceMemoryOnImplThread(
436 TexturesMemorySize(8), 104, resource_provider());
437 EXPECT_EQ(0u, EvictedBackingCount(resource_manager
.get()));
438 resource_manager
->ReduceMemoryOnImplThread(
439 TexturesMemorySize(8), 103, resource_provider());
440 EXPECT_EQ(1u, EvictedBackingCount(resource_manager
.get()));
442 resource_manager
->UnlinkAndClearEvictedBackings();
443 EXPECT_EQ(TexturesMemorySize(3), resource_manager
->MemoryUseBytes());
445 // Re-allocate the the texture after the one-time drop.
446 PrioritizeTexturesAndBackings(resource_manager
.get());
447 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
448 EXPECT_EQ(ValidateTexture(textures
[i
].get(), false), i
< 4);
450 DebugScopedSetImplThreadAndMainThreadBlocked
451 impl_thread_and_main_thread_blocked(&proxy_
);
452 resource_manager
->ReduceMemory(resource_provider());
454 EXPECT_EQ(TexturesMemorySize(4), resource_manager
->MemoryAboveCutoffBytes());
456 DebugScopedSetImplThreadAndMainThreadBlocked
457 impl_thread_and_main_thread_blocked(&proxy_
);
458 resource_manager
->ClearAllMemory(resource_provider());
461 TEST_F(PrioritizedResourceTest
, EvictingTexturesInParent
) {
462 const size_t kMaxTextures
= 8;
463 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
464 CreateManager(kMaxTextures
);
465 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
];
466 unsigned texture_resource_ids
[kMaxTextures
];
468 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
470 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
471 textures
[i
]->set_request_priority(100 + i
);
474 PrioritizeTexturesAndBackings(resource_manager
.get());
475 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
476 EXPECT_TRUE(ValidateTexture(textures
[i
].get(), true));
479 DebugScopedSetImplThreadAndMainThreadBlocked
480 impl_thread_and_main_thread_blocked(&proxy_
);
481 uint8_t image
[4] = {0};
482 textures
[i
]->SetPixels(resource_provider_
.get(),
490 DebugScopedSetImplThreadAndMainThreadBlocked
491 impl_thread_and_main_thread_blocked(&proxy_
);
492 resource_manager
->ReduceMemory(resource_provider());
494 EXPECT_EQ(TexturesMemorySize(8), resource_manager
->MemoryAboveCutoffBytes());
496 for (size_t i
= 0; i
< 8; ++i
)
497 texture_resource_ids
[i
] = textures
[i
]->resource_id();
499 // Evict four textures. It will be the last four.
501 DebugScopedSetImplThreadAndMainThreadBlocked
502 impl_thread_and_main_thread_blocked(&proxy_
);
503 resource_manager
->ReduceMemoryOnImplThread(
504 TexturesMemorySize(4), 200, resource_provider());
506 EXPECT_EQ(4u, EvictedBackingCount(resource_manager
.get()));
508 // The last four backings are evicted.
509 std::vector
<unsigned> remaining
= BackingResources(resource_manager
.get());
510 EXPECT_TRUE(std::find(remaining
.begin(),
512 texture_resource_ids
[0]) != remaining
.end());
513 EXPECT_TRUE(std::find(remaining
.begin(),
515 texture_resource_ids
[1]) != remaining
.end());
516 EXPECT_TRUE(std::find(remaining
.begin(),
518 texture_resource_ids
[2]) != remaining
.end());
519 EXPECT_TRUE(std::find(remaining
.begin(),
521 texture_resource_ids
[3]) != remaining
.end());
523 resource_manager
->UnlinkAndClearEvictedBackings();
524 EXPECT_EQ(TexturesMemorySize(4), resource_manager
->MemoryUseBytes());
526 // Re-allocate the the texture after the eviction.
527 PrioritizeTexturesAndBackings(resource_manager
.get());
528 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
529 EXPECT_TRUE(ValidateTexture(textures
[i
].get(), true));
532 DebugScopedSetImplThreadAndMainThreadBlocked
533 impl_thread_and_main_thread_blocked(&proxy_
);
534 uint8_t image
[4] = {0};
535 textures
[i
]->SetPixels(resource_provider_
.get(),
543 DebugScopedSetImplThreadAndMainThreadBlocked
544 impl_thread_and_main_thread_blocked(&proxy_
);
545 resource_manager
->ReduceMemory(resource_provider());
547 EXPECT_EQ(TexturesMemorySize(8), resource_manager
->MemoryAboveCutoffBytes());
549 // Send the last two of the textures to a parent compositor.
550 ResourceProvider::ResourceIdArray to_send
;
551 TransferableResourceArray transferable
;
552 for (size_t i
= 6; i
< 8; ++i
)
553 to_send
.push_back(textures
[i
]->resource_id());
554 resource_provider_
->PrepareSendToParent(to_send
, &transferable
);
556 // Set the last two textures to be tied for prioity with the two
557 // before them. Being sent to the parent will break the tie.
558 textures
[4]->set_request_priority(100 + 4);
559 textures
[5]->set_request_priority(100 + 5);
560 textures
[6]->set_request_priority(100 + 4);
561 textures
[7]->set_request_priority(100 + 5);
563 for (size_t i
= 0; i
< 8; ++i
)
564 texture_resource_ids
[i
] = textures
[i
]->resource_id();
566 // Drop all the textures. Now we have backings that can be recycled.
567 for (size_t i
= 0; i
< 8; ++i
)
568 textures
[0] = nullptr;
569 PrioritizeTexturesAndBackings(resource_manager
.get());
571 // The next commit finishes.
573 DebugScopedSetImplThreadAndMainThreadBlocked
574 impl_thread_and_main_thread_blocked(&proxy_
);
575 resource_manager
->UpdateBackingsState(resource_provider());
578 // Evict four textures. It would be the last four again, except that 2 of them
579 // are sent to the parent, so they are evicted last.
581 DebugScopedSetImplThreadAndMainThreadBlocked
582 impl_thread_and_main_thread_blocked(&proxy_
);
583 resource_manager
->ReduceMemoryOnImplThread(
584 TexturesMemorySize(4), 200, resource_provider());
586 EXPECT_EQ(4u, EvictedBackingCount(resource_manager
.get()));
587 // The last 2 backings remain this time.
588 std::vector
<unsigned> remaining
= BackingResources(resource_manager
.get());
589 EXPECT_TRUE(std::find(remaining
.begin(),
591 texture_resource_ids
[6]) == remaining
.end());
592 EXPECT_TRUE(std::find(remaining
.begin(),
594 texture_resource_ids
[7]) == remaining
.end());
596 resource_manager
->UnlinkAndClearEvictedBackings();
597 EXPECT_EQ(TexturesMemorySize(4), resource_manager
->MemoryUseBytes());
599 DebugScopedSetImplThreadAndMainThreadBlocked
600 impl_thread_and_main_thread_blocked(&proxy_
);
601 resource_manager
->ClearAllMemory(resource_provider());
604 TEST_F(PrioritizedResourceTest
, ResourceManagerPartialUpdateTextures
) {
605 const size_t kMaxTextures
= 4;
606 const size_t kNumTextures
= 4;
607 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
608 CreateManager(kMaxTextures
);
609 scoped_ptr
<PrioritizedResource
> textures
[kNumTextures
];
610 scoped_ptr
<PrioritizedResource
> more_textures
[kNumTextures
];
612 for (size_t i
= 0; i
< kNumTextures
; ++i
) {
614 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
616 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
619 for (size_t i
= 0; i
< kNumTextures
; ++i
)
620 textures
[i
]->set_request_priority(200 + i
);
621 PrioritizeTexturesAndBackings(resource_manager
.get());
623 // Allocate textures which are currently high priority.
624 EXPECT_TRUE(ValidateTexture(textures
[0].get(), false));
625 EXPECT_TRUE(ValidateTexture(textures
[1].get(), false));
626 EXPECT_TRUE(ValidateTexture(textures
[2].get(), false));
627 EXPECT_TRUE(ValidateTexture(textures
[3].get(), false));
629 EXPECT_TRUE(textures
[0]->have_backing_texture());
630 EXPECT_TRUE(textures
[1]->have_backing_texture());
631 EXPECT_TRUE(textures
[2]->have_backing_texture());
632 EXPECT_TRUE(textures
[3]->have_backing_texture());
634 for (size_t i
= 0; i
< kNumTextures
; ++i
)
635 more_textures
[i
]->set_request_priority(100 + i
);
636 PrioritizeTexturesAndBackings(resource_manager
.get());
638 // Textures are now below cutoff.
639 EXPECT_FALSE(ValidateTexture(textures
[0].get(), false));
640 EXPECT_FALSE(ValidateTexture(textures
[1].get(), false));
641 EXPECT_FALSE(ValidateTexture(textures
[2].get(), false));
642 EXPECT_FALSE(ValidateTexture(textures
[3].get(), false));
644 // But they are still valid to use.
645 EXPECT_TRUE(textures
[0]->have_backing_texture());
646 EXPECT_TRUE(textures
[1]->have_backing_texture());
647 EXPECT_TRUE(textures
[2]->have_backing_texture());
648 EXPECT_TRUE(textures
[3]->have_backing_texture());
650 // Higher priority textures are finally needed.
651 EXPECT_TRUE(ValidateTexture(more_textures
[0].get(), false));
652 EXPECT_TRUE(ValidateTexture(more_textures
[1].get(), false));
653 EXPECT_TRUE(ValidateTexture(more_textures
[2].get(), false));
654 EXPECT_TRUE(ValidateTexture(more_textures
[3].get(), false));
656 // Lower priority have been fully evicted.
657 EXPECT_FALSE(textures
[0]->have_backing_texture());
658 EXPECT_FALSE(textures
[1]->have_backing_texture());
659 EXPECT_FALSE(textures
[2]->have_backing_texture());
660 EXPECT_FALSE(textures
[3]->have_backing_texture());
662 DebugScopedSetImplThreadAndMainThreadBlocked
663 impl_thread_and_main_thread_blocked(&proxy_
);
664 resource_manager
->ClearAllMemory(resource_provider());
667 TEST_F(PrioritizedResourceTest
, ResourceManagerPrioritiesAreEqual
) {
668 const size_t kMaxTextures
= 16;
669 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
670 CreateManager(kMaxTextures
);
671 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
];
673 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
675 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
678 // All 16 textures have the same priority except 2 higher priority.
679 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
680 textures
[i
]->set_request_priority(100);
681 textures
[0]->set_request_priority(99);
682 textures
[1]->set_request_priority(99);
684 // Set max limit to 8 textures
685 resource_manager
->SetMaxMemoryLimitBytes(TexturesMemorySize(8));
686 PrioritizeTexturesAndBackings(resource_manager
.get());
688 // The two high priority textures should be available, others should not.
689 for (size_t i
= 0; i
< 2; ++i
)
690 EXPECT_TRUE(ValidateTexture(textures
[i
].get(), false));
691 for (size_t i
= 2; i
< kMaxTextures
; ++i
)
692 EXPECT_FALSE(ValidateTexture(textures
[i
].get(), false));
693 EXPECT_EQ(TexturesMemorySize(2), resource_manager
->MemoryAboveCutoffBytes());
694 EXPECT_LE(resource_manager
->MemoryUseBytes(),
695 resource_manager
->MemoryAboveCutoffBytes());
697 // Manually reserving textures should only succeed on the higher priority
698 // textures, and on remaining textures up to the memory limit.
699 for (size_t i
= 0; i
< 8; i
++)
700 EXPECT_TRUE(ValidateTexture(textures
[i
].get(), true));
701 for (size_t i
= 9; i
< kMaxTextures
; i
++)
702 EXPECT_FALSE(ValidateTexture(textures
[i
].get(), true));
703 EXPECT_EQ(TexturesMemorySize(8), resource_manager
->MemoryAboveCutoffBytes());
704 EXPECT_LE(resource_manager
->MemoryUseBytes(),
705 resource_manager
->MemoryAboveCutoffBytes());
707 DebugScopedSetImplThreadAndMainThreadBlocked
708 impl_thread_and_main_thread_blocked(&proxy_
);
709 resource_manager
->ClearAllMemory(resource_provider());
712 TEST_F(PrioritizedResourceTest
, ResourceManagerDestroyedFirst
) {
713 scoped_ptr
<PrioritizedResourceManager
> resource_manager
= CreateManager(1);
714 scoped_ptr
<PrioritizedResource
> texture
=
715 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
717 // Texture is initially invalid, but it will become available.
718 EXPECT_FALSE(texture
->have_backing_texture());
720 texture
->set_request_priority(100);
721 PrioritizeTexturesAndBackings(resource_manager
.get());
723 EXPECT_TRUE(ValidateTexture(texture
.get(), false));
724 EXPECT_TRUE(texture
->can_acquire_backing_texture());
725 EXPECT_TRUE(texture
->have_backing_texture());
727 DebugScopedSetImplThreadAndMainThreadBlocked
728 impl_thread_and_main_thread_blocked(&proxy_
);
729 resource_manager
->ClearAllMemory(resource_provider());
731 resource_manager
= nullptr;
733 EXPECT_FALSE(texture
->can_acquire_backing_texture());
734 EXPECT_FALSE(texture
->have_backing_texture());
737 TEST_F(PrioritizedResourceTest
, TextureMovedToNewManager
) {
738 scoped_ptr
<PrioritizedResourceManager
> resource_manager_one
=
740 scoped_ptr
<PrioritizedResourceManager
> resource_manager_two
=
742 scoped_ptr
<PrioritizedResource
> texture
=
743 resource_manager_one
->CreateTexture(texture_size_
, texture_format_
);
745 // Texture is initially invalid, but it will become available.
746 EXPECT_FALSE(texture
->have_backing_texture());
748 texture
->set_request_priority(100);
749 PrioritizeTexturesAndBackings(resource_manager_one
.get());
751 EXPECT_TRUE(ValidateTexture(texture
.get(), false));
752 EXPECT_TRUE(texture
->can_acquire_backing_texture());
753 EXPECT_TRUE(texture
->have_backing_texture());
755 texture
->SetTextureManager(NULL
);
757 DebugScopedSetImplThreadAndMainThreadBlocked
758 impl_thread_and_main_thread_blocked(&proxy_
);
759 resource_manager_one
->ClearAllMemory(resource_provider());
761 resource_manager_one
= nullptr;
763 EXPECT_FALSE(texture
->can_acquire_backing_texture());
764 EXPECT_FALSE(texture
->have_backing_texture());
766 texture
->SetTextureManager(resource_manager_two
.get());
768 PrioritizeTexturesAndBackings(resource_manager_two
.get());
770 EXPECT_TRUE(ValidateTexture(texture
.get(), false));
771 EXPECT_TRUE(texture
->can_acquire_backing_texture());
772 EXPECT_TRUE(texture
->have_backing_texture());
774 DebugScopedSetImplThreadAndMainThreadBlocked
775 impl_thread_and_main_thread_blocked(&proxy_
);
776 resource_manager_two
->ClearAllMemory(resource_provider());
779 TEST_F(PrioritizedResourceTest
,
780 RenderSurfacesReduceMemoryAvailableOutsideRootSurface
) {
781 const size_t kMaxTextures
= 8;
782 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
783 CreateManager(kMaxTextures
);
785 // Half of the memory is taken by surfaces (with high priority place-holder)
786 scoped_ptr
<PrioritizedResource
> render_surface_place_holder
=
787 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
788 render_surface_place_holder
->SetToSelfManagedMemoryPlaceholder(
789 TexturesMemorySize(4));
790 render_surface_place_holder
->set_request_priority(
791 PriorityCalculator::RenderSurfacePriority());
793 // Create textures to fill our memory limit.
794 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
];
796 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
798 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
801 // Set decreasing non-visible priorities outside root surface.
802 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
803 textures
[i
]->set_request_priority(100 + i
);
805 // Only lower half should be available.
806 PrioritizeTexturesAndBackings(resource_manager
.get());
807 EXPECT_TRUE(ValidateTexture(textures
[0].get(), false));
808 EXPECT_TRUE(ValidateTexture(textures
[3].get(), false));
809 EXPECT_FALSE(ValidateTexture(textures
[4].get(), false));
810 EXPECT_FALSE(ValidateTexture(textures
[7].get(), false));
812 // Set increasing non-visible priorities outside root surface.
813 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
814 textures
[i
]->set_request_priority(100 - i
);
816 // Only upper half should be available.
817 PrioritizeTexturesAndBackings(resource_manager
.get());
818 EXPECT_FALSE(ValidateTexture(textures
[0].get(), false));
819 EXPECT_FALSE(ValidateTexture(textures
[3].get(), false));
820 EXPECT_TRUE(ValidateTexture(textures
[4].get(), false));
821 EXPECT_TRUE(ValidateTexture(textures
[7].get(), false));
823 EXPECT_EQ(TexturesMemorySize(4), resource_manager
->MemoryAboveCutoffBytes());
824 EXPECT_EQ(TexturesMemorySize(4),
825 resource_manager
->MemoryForSelfManagedTextures());
826 EXPECT_LE(resource_manager
->MemoryUseBytes(),
827 resource_manager
->MemoryAboveCutoffBytes());
828 EXPECT_EQ(TexturesMemorySize(8),
829 resource_manager
->MaxMemoryNeededBytes());
831 DebugScopedSetImplThreadAndMainThreadBlocked
832 impl_thread_and_main_thread_blocked(&proxy_
);
833 resource_manager
->ClearAllMemory(resource_provider());
836 TEST_F(PrioritizedResourceTest
,
837 RenderSurfacesReduceMemoryAvailableForRequestLate
) {
838 const size_t kMaxTextures
= 8;
839 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
840 CreateManager(kMaxTextures
);
842 // Half of the memory is taken by surfaces (with high priority place-holder)
843 scoped_ptr
<PrioritizedResource
> render_surface_place_holder
=
844 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
845 render_surface_place_holder
->SetToSelfManagedMemoryPlaceholder(
846 TexturesMemorySize(4));
847 render_surface_place_holder
->set_request_priority(
848 PriorityCalculator::RenderSurfacePriority());
850 // Create textures to fill our memory limit.
851 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
];
853 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
855 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
858 // Set equal priorities.
859 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
860 textures
[i
]->set_request_priority(100);
862 // The first four to be requested late will be available.
863 PrioritizeTexturesAndBackings(resource_manager
.get());
864 for (unsigned i
= 0; i
< kMaxTextures
; ++i
)
865 EXPECT_FALSE(ValidateTexture(textures
[i
].get(), false));
866 for (unsigned i
= 0; i
< kMaxTextures
; i
+= 2)
867 EXPECT_TRUE(ValidateTexture(textures
[i
].get(), true));
868 for (unsigned i
= 1; i
< kMaxTextures
; i
+= 2)
869 EXPECT_FALSE(ValidateTexture(textures
[i
].get(), true));
871 EXPECT_EQ(TexturesMemorySize(4), resource_manager
->MemoryAboveCutoffBytes());
872 EXPECT_EQ(TexturesMemorySize(4),
873 resource_manager
->MemoryForSelfManagedTextures());
874 EXPECT_LE(resource_manager
->MemoryUseBytes(),
875 resource_manager
->MemoryAboveCutoffBytes());
876 EXPECT_EQ(TexturesMemorySize(8),
877 resource_manager
->MaxMemoryNeededBytes());
879 DebugScopedSetImplThreadAndMainThreadBlocked
880 impl_thread_and_main_thread_blocked(&proxy_
);
881 resource_manager
->ClearAllMemory(resource_provider());
884 TEST_F(PrioritizedResourceTest
,
885 WhenRenderSurfaceNotAvailableTexturesAlsoNotAvailable
) {
886 const size_t kMaxTextures
= 8;
887 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
888 CreateManager(kMaxTextures
);
890 // Half of the memory is taken by surfaces (with high priority place-holder)
891 scoped_ptr
<PrioritizedResource
> render_surface_place_holder
=
892 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
893 render_surface_place_holder
->SetToSelfManagedMemoryPlaceholder(
894 TexturesMemorySize(4));
895 render_surface_place_holder
->set_request_priority(
896 PriorityCalculator::RenderSurfacePriority());
898 // Create textures to fill our memory limit.
899 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
];
901 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
903 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
905 // Set 6 visible textures in the root surface, and 2 in a child surface.
906 for (size_t i
= 0; i
< 6; ++i
) {
908 set_request_priority(PriorityCalculator::VisiblePriority(true));
910 for (size_t i
= 6; i
< 8; ++i
) {
912 set_request_priority(PriorityCalculator::VisiblePriority(false));
915 PrioritizeTexturesAndBackings(resource_manager
.get());
917 // Unable to request_late textures in the child surface.
918 EXPECT_FALSE(ValidateTexture(textures
[6].get(), true));
919 EXPECT_FALSE(ValidateTexture(textures
[7].get(), true));
921 // Root surface textures are valid.
922 for (size_t i
= 0; i
< 6; ++i
)
923 EXPECT_TRUE(ValidateTexture(textures
[i
].get(), false));
925 EXPECT_EQ(TexturesMemorySize(6), resource_manager
->MemoryAboveCutoffBytes());
926 EXPECT_EQ(TexturesMemorySize(2),
927 resource_manager
->MemoryForSelfManagedTextures());
928 EXPECT_LE(resource_manager
->MemoryUseBytes(),
929 resource_manager
->MemoryAboveCutoffBytes());
931 DebugScopedSetImplThreadAndMainThreadBlocked
932 impl_thread_and_main_thread_blocked(&proxy_
);
933 resource_manager
->ClearAllMemory(resource_provider());
936 TEST_F(PrioritizedResourceTest
, RequestLateBackingsSorting
) {
937 const size_t kMaxTextures
= 8;
938 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
939 CreateManager(kMaxTextures
);
940 resource_manager
->SetMaxMemoryLimitBytes(TexturesMemorySize(kMaxTextures
));
942 // Create textures to fill our memory limit.
943 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
];
944 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
946 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
948 // Set equal priorities, and allocate backings for all textures.
949 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
950 textures
[i
]->set_request_priority(100);
951 PrioritizeTexturesAndBackings(resource_manager
.get());
952 for (unsigned i
= 0; i
< kMaxTextures
; ++i
)
953 EXPECT_TRUE(ValidateTexture(textures
[i
].get(), false));
955 // Drop the memory limit and prioritize (none will be above the threshold,
956 // but they still have backings because ReduceMemory hasn't been called).
957 resource_manager
->SetMaxMemoryLimitBytes(
958 TexturesMemorySize(kMaxTextures
/ 2));
959 PrioritizeTexturesAndBackings(resource_manager
.get());
961 // Push half of them back over the limit.
962 for (size_t i
= 0; i
< kMaxTextures
; i
+= 2)
963 EXPECT_TRUE(textures
[i
]->RequestLate());
965 // Push the priorities to the backings array and sort the backings array
966 ResourceManagerUpdateBackingsPriorities(resource_manager
.get());
968 // Assert that the backings list be sorted with the below-limit backings
969 // before the above-limit backings.
970 ResourceManagerAssertInvariants(resource_manager
.get());
972 // Make sure that we have backings for all of the textures.
973 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
974 EXPECT_TRUE(textures
[i
]->have_backing_texture());
976 // Make sure that only the request_late textures are above the priority
978 for (size_t i
= 0; i
< kMaxTextures
; i
+= 2)
979 EXPECT_TRUE(TextureBackingIsAbovePriorityCutoff(textures
[i
].get()));
980 for (size_t i
= 1; i
< kMaxTextures
; i
+= 2)
981 EXPECT_FALSE(TextureBackingIsAbovePriorityCutoff(textures
[i
].get()));
983 DebugScopedSetImplThreadAndMainThreadBlocked
984 impl_thread_and_main_thread_blocked(&proxy_
);
985 resource_manager
->ClearAllMemory(resource_provider());
988 TEST_F(PrioritizedResourceTest
, ClearUploadsToEvictedResources
) {
989 const size_t kMaxTextures
= 4;
990 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
991 CreateManager(kMaxTextures
);
992 resource_manager
->SetMaxMemoryLimitBytes(TexturesMemorySize(kMaxTextures
));
994 // Create textures to fill our memory limit.
995 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
];
997 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
999 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
1001 // Set equal priorities, and allocate backings for all textures.
1002 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
1003 textures
[i
]->set_request_priority(100);
1004 PrioritizeTexturesAndBackings(resource_manager
.get());
1005 for (unsigned i
= 0; i
< kMaxTextures
; ++i
)
1006 EXPECT_TRUE(ValidateTexture(textures
[i
].get(), false));
1008 ResourceUpdateQueue queue
;
1009 DebugScopedSetImplThreadAndMainThreadBlocked
1010 impl_thread_and_main_thread_blocked(&proxy_
);
1011 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
1012 const ResourceUpdate upload
= ResourceUpdate::Create(
1013 textures
[i
].get(), NULL
, gfx::Rect(), gfx::Rect(), gfx::Vector2d());
1014 queue
.AppendFullUpload(upload
);
1017 // Make sure that we have backings for all of the textures.
1018 for (size_t i
= 0; i
< kMaxTextures
; ++i
)
1019 EXPECT_TRUE(textures
[i
]->have_backing_texture());
1021 queue
.ClearUploadsToEvictedResources();
1022 EXPECT_EQ(4u, queue
.FullUploadSize());
1024 resource_manager
->ReduceMemoryOnImplThread(
1025 TexturesMemorySize(1),
1026 PriorityCalculator::AllowEverythingCutoff(),
1027 resource_provider());
1028 queue
.ClearUploadsToEvictedResources();
1029 EXPECT_EQ(1u, queue
.FullUploadSize());
1031 resource_manager
->ReduceMemoryOnImplThread(
1032 0, PriorityCalculator::AllowEverythingCutoff(), resource_provider());
1033 queue
.ClearUploadsToEvictedResources();
1034 EXPECT_EQ(0u, queue
.FullUploadSize());
1037 TEST_F(PrioritizedResourceTest
, UsageStatistics
) {
1038 const size_t kMaxTextures
= 5;
1039 scoped_ptr
<PrioritizedResourceManager
> resource_manager
=
1040 CreateManager(kMaxTextures
);
1041 scoped_ptr
<PrioritizedResource
> textures
[kMaxTextures
];
1043 for (size_t i
= 0; i
< kMaxTextures
; ++i
) {
1045 resource_manager
->CreateTexture(texture_size_
, texture_format_
);
1049 set_request_priority(PriorityCalculator::AllowVisibleOnlyCutoff() - 1);
1051 set_request_priority(PriorityCalculator::AllowVisibleOnlyCutoff());
1052 textures
[2]->set_request_priority(
1053 PriorityCalculator::AllowVisibleAndNearbyCutoff() - 1);
1055 set_request_priority(PriorityCalculator::AllowVisibleAndNearbyCutoff());
1056 textures
[4]->set_request_priority(
1057 PriorityCalculator::AllowVisibleAndNearbyCutoff() + 1);
1059 // Set max limit to 2 textures.
1060 resource_manager
->SetMaxMemoryLimitBytes(TexturesMemorySize(2));
1061 PrioritizeTexturesAndBackings(resource_manager
.get());
1063 // The first two textures should be available, others should not.
1064 for (size_t i
= 0; i
< 2; ++i
)
1065 EXPECT_TRUE(ValidateTexture(textures
[i
].get(), false));
1066 for (size_t i
= 2; i
< kMaxTextures
; ++i
)
1067 EXPECT_FALSE(ValidateTexture(textures
[i
].get(), false));
1069 // Validate the statistics.
1071 DebugScopedSetImplThread
impl_thread(&proxy_
);
1072 EXPECT_EQ(TexturesMemorySize(2), resource_manager
->MemoryUseBytes());
1073 EXPECT_EQ(TexturesMemorySize(1), resource_manager
->MemoryVisibleBytes());
1074 EXPECT_EQ(TexturesMemorySize(3),
1075 resource_manager
->MemoryVisibleAndNearbyBytes());
1078 // Re-prioritize the textures, but do not push the values to backings.
1080 set_request_priority(PriorityCalculator::AllowVisibleOnlyCutoff() - 1);
1082 set_request_priority(PriorityCalculator::AllowVisibleOnlyCutoff() - 1);
1084 set_request_priority(PriorityCalculator::AllowVisibleOnlyCutoff() - 1);
1085 textures
[3]->set_request_priority(
1086 PriorityCalculator::AllowVisibleAndNearbyCutoff() - 1);
1088 set_request_priority(PriorityCalculator::AllowVisibleAndNearbyCutoff());
1089 resource_manager
->PrioritizeTextures();
1091 // Verify that we still see the old values.
1093 DebugScopedSetImplThread
impl_thread(&proxy_
);
1094 EXPECT_EQ(TexturesMemorySize(2), resource_manager
->MemoryUseBytes());
1095 EXPECT_EQ(TexturesMemorySize(1), resource_manager
->MemoryVisibleBytes());
1096 EXPECT_EQ(TexturesMemorySize(3),
1097 resource_manager
->MemoryVisibleAndNearbyBytes());
1100 // Push priorities to backings, and verify we see the new values.
1102 DebugScopedSetImplThreadAndMainThreadBlocked
1103 impl_thread_and_main_thread_blocked(&proxy_
);
1104 resource_manager
->PushTexturePrioritiesToBackings();
1105 EXPECT_EQ(TexturesMemorySize(2), resource_manager
->MemoryUseBytes());
1106 EXPECT_EQ(TexturesMemorySize(3), resource_manager
->MemoryVisibleBytes());
1107 EXPECT_EQ(TexturesMemorySize(4),
1108 resource_manager
->MemoryVisibleAndNearbyBytes());
1111 DebugScopedSetImplThreadAndMainThreadBlocked
1112 impl_thread_and_main_thread_blocked(&proxy_
);
1113 resource_manager
->ClearAllMemory(resource_provider());