| OLD | NEW |
| 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 <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "cc/resources/prioritized_resource_manager.h" | 9 #include "cc/resources/prioritized_resource_manager.h" |
| 10 #include "cc/resources/resource.h" | 10 #include "cc/resources/resource.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 shared_bitmap_manager_.get(), | 32 shared_bitmap_manager_.get(), |
| 33 NULL, | 33 NULL, |
| 34 0, | 34 0, |
| 35 false, | 35 false, |
| 36 1, | 36 1, |
| 37 false); | 37 false); |
| 38 } | 38 } |
| 39 | 39 |
| 40 virtual ~PrioritizedResourceTest() { | 40 virtual ~PrioritizedResourceTest() { |
| 41 DebugScopedSetImplThread impl_thread(&proxy_); | 41 DebugScopedSetImplThread impl_thread(&proxy_); |
| 42 resource_provider_.reset(); | 42 resource_provider_ = nullptr; |
| 43 } | 43 } |
| 44 | 44 |
| 45 size_t TexturesMemorySize(size_t texture_count) { | 45 size_t TexturesMemorySize(size_t texture_count) { |
| 46 return Resource::MemorySizeBytes(texture_size_, texture_format_) * | 46 return Resource::MemorySizeBytes(texture_size_, texture_format_) * |
| 47 texture_count; | 47 texture_count; |
| 48 } | 48 } |
| 49 | 49 |
| 50 scoped_ptr<PrioritizedResourceManager> CreateManager(size_t max_textures) { | 50 scoped_ptr<PrioritizedResourceManager> CreateManager(size_t max_textures) { |
| 51 scoped_ptr<PrioritizedResourceManager> manager = | 51 scoped_ptr<PrioritizedResourceManager> manager = |
| 52 PrioritizedResourceManager::Create(&proxy_); | 52 PrioritizedResourceManager::Create(&proxy_); |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 { | 270 { |
| 271 DebugScopedSetImplThreadAndMainThreadBlocked | 271 DebugScopedSetImplThreadAndMainThreadBlocked |
| 272 impl_thread_and_main_thread_blocked(&proxy_); | 272 impl_thread_and_main_thread_blocked(&proxy_); |
| 273 resource_manager->ReduceMemory(resource_provider()); | 273 resource_manager->ReduceMemory(resource_provider()); |
| 274 } | 274 } |
| 275 | 275 |
| 276 // 20 textures have backings allocated. | 276 // 20 textures have backings allocated. |
| 277 EXPECT_EQ(TexturesMemorySize(20), resource_manager->MemoryUseBytes()); | 277 EXPECT_EQ(TexturesMemorySize(20), resource_manager->MemoryUseBytes()); |
| 278 | 278 |
| 279 // Destroy one texture, not enough is wasted to cause cleanup. | 279 // Destroy one texture, not enough is wasted to cause cleanup. |
| 280 textures[0] = scoped_ptr<PrioritizedResource>(); | 280 textures[0] = nullptr; |
| 281 PrioritizeTexturesAndBackings(resource_manager.get()); | 281 PrioritizeTexturesAndBackings(resource_manager.get()); |
| 282 { | 282 { |
| 283 DebugScopedSetImplThreadAndMainThreadBlocked | 283 DebugScopedSetImplThreadAndMainThreadBlocked |
| 284 impl_thread_and_main_thread_blocked(&proxy_); | 284 impl_thread_and_main_thread_blocked(&proxy_); |
| 285 resource_manager->UpdateBackingsState(resource_provider()); | 285 resource_manager->UpdateBackingsState(resource_provider()); |
| 286 resource_manager->ReduceWastedMemory(resource_provider()); | 286 resource_manager->ReduceWastedMemory(resource_provider()); |
| 287 } | 287 } |
| 288 EXPECT_EQ(TexturesMemorySize(20), resource_manager->MemoryUseBytes()); | 288 EXPECT_EQ(TexturesMemorySize(20), resource_manager->MemoryUseBytes()); |
| 289 | 289 |
| 290 // Destroy half the textures, leaving behind the backings. Now a cleanup | 290 // Destroy half the textures, leaving behind the backings. Now a cleanup |
| 291 // should happen. | 291 // should happen. |
| 292 for (size_t i = 0; i < kMaxTextures / 2; ++i) | 292 for (size_t i = 0; i < kMaxTextures / 2; ++i) |
| 293 textures[i] = scoped_ptr<PrioritizedResource>(); | 293 textures[i] = nullptr; |
| 294 PrioritizeTexturesAndBackings(resource_manager.get()); | 294 PrioritizeTexturesAndBackings(resource_manager.get()); |
| 295 { | 295 { |
| 296 DebugScopedSetImplThreadAndMainThreadBlocked | 296 DebugScopedSetImplThreadAndMainThreadBlocked |
| 297 impl_thread_and_main_thread_blocked(&proxy_); | 297 impl_thread_and_main_thread_blocked(&proxy_); |
| 298 resource_manager->UpdateBackingsState(resource_provider()); | 298 resource_manager->UpdateBackingsState(resource_provider()); |
| 299 resource_manager->ReduceWastedMemory(resource_provider()); | 299 resource_manager->ReduceWastedMemory(resource_provider()); |
| 300 } | 300 } |
| 301 EXPECT_GT(TexturesMemorySize(20), resource_manager->MemoryUseBytes()); | 301 EXPECT_GT(TexturesMemorySize(20), resource_manager->MemoryUseBytes()); |
| 302 | 302 |
| 303 DebugScopedSetImplThreadAndMainThreadBlocked | 303 DebugScopedSetImplThreadAndMainThreadBlocked |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 ResourceProvider::ResourceIdArray to_send; | 350 ResourceProvider::ResourceIdArray to_send; |
| 351 TransferableResourceArray transferable; | 351 TransferableResourceArray transferable; |
| 352 for (size_t i = 0; i < kMaxTextures / 2; ++i) | 352 for (size_t i = 0; i < kMaxTextures / 2; ++i) |
| 353 to_send.push_back(textures[i]->resource_id()); | 353 to_send.push_back(textures[i]->resource_id()); |
| 354 resource_provider_->PrepareSendToParent(to_send, &transferable); | 354 resource_provider_->PrepareSendToParent(to_send, &transferable); |
| 355 | 355 |
| 356 // Destroy half the textures, leaving behind the backings. The backings are | 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 | 357 // sent to a parent compositor though, so they should not be considered wasted |
| 358 // and a cleanup should not happen. | 358 // and a cleanup should not happen. |
| 359 for (size_t i = 0; i < kMaxTextures / 2; ++i) | 359 for (size_t i = 0; i < kMaxTextures / 2; ++i) |
| 360 textures[i] = scoped_ptr<PrioritizedResource>(); | 360 textures[i] = nullptr; |
| 361 PrioritizeTexturesAndBackings(resource_manager.get()); | 361 PrioritizeTexturesAndBackings(resource_manager.get()); |
| 362 { | 362 { |
| 363 DebugScopedSetImplThreadAndMainThreadBlocked | 363 DebugScopedSetImplThreadAndMainThreadBlocked |
| 364 impl_thread_and_main_thread_blocked(&proxy_); | 364 impl_thread_and_main_thread_blocked(&proxy_); |
| 365 resource_manager->UpdateBackingsState(resource_provider()); | 365 resource_manager->UpdateBackingsState(resource_provider()); |
| 366 resource_manager->ReduceWastedMemory(resource_provider()); | 366 resource_manager->ReduceWastedMemory(resource_provider()); |
| 367 } | 367 } |
| 368 EXPECT_EQ(TexturesMemorySize(20), resource_manager->MemoryUseBytes()); | 368 EXPECT_EQ(TexturesMemorySize(20), resource_manager->MemoryUseBytes()); |
| 369 | 369 |
| 370 // Receive the textures back from the parent compositor. Now a cleanup should | 370 // Receive the textures back from the parent compositor. Now a cleanup should |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 textures[4]->set_request_priority(100 + 4); | 558 textures[4]->set_request_priority(100 + 4); |
| 559 textures[5]->set_request_priority(100 + 5); | 559 textures[5]->set_request_priority(100 + 5); |
| 560 textures[6]->set_request_priority(100 + 4); | 560 textures[6]->set_request_priority(100 + 4); |
| 561 textures[7]->set_request_priority(100 + 5); | 561 textures[7]->set_request_priority(100 + 5); |
| 562 | 562 |
| 563 for (size_t i = 0; i < 8; ++i) | 563 for (size_t i = 0; i < 8; ++i) |
| 564 texture_resource_ids[i] = textures[i]->resource_id(); | 564 texture_resource_ids[i] = textures[i]->resource_id(); |
| 565 | 565 |
| 566 // Drop all the textures. Now we have backings that can be recycled. | 566 // Drop all the textures. Now we have backings that can be recycled. |
| 567 for (size_t i = 0; i < 8; ++i) | 567 for (size_t i = 0; i < 8; ++i) |
| 568 textures[0].reset(); | 568 textures[0] = nullptr; |
| 569 PrioritizeTexturesAndBackings(resource_manager.get()); | 569 PrioritizeTexturesAndBackings(resource_manager.get()); |
| 570 | 570 |
| 571 // The next commit finishes. | 571 // The next commit finishes. |
| 572 { | 572 { |
| 573 DebugScopedSetImplThreadAndMainThreadBlocked | 573 DebugScopedSetImplThreadAndMainThreadBlocked |
| 574 impl_thread_and_main_thread_blocked(&proxy_); | 574 impl_thread_and_main_thread_blocked(&proxy_); |
| 575 resource_manager->UpdateBackingsState(resource_provider()); | 575 resource_manager->UpdateBackingsState(resource_provider()); |
| 576 } | 576 } |
| 577 | 577 |
| 578 // Evict four textures. It would be the last four again, except that 2 of them | 578 // Evict four textures. It would be the last four again, except that 2 of them |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 PrioritizeTexturesAndBackings(resource_manager.get()); | 721 PrioritizeTexturesAndBackings(resource_manager.get()); |
| 722 | 722 |
| 723 EXPECT_TRUE(ValidateTexture(texture.get(), false)); | 723 EXPECT_TRUE(ValidateTexture(texture.get(), false)); |
| 724 EXPECT_TRUE(texture->can_acquire_backing_texture()); | 724 EXPECT_TRUE(texture->can_acquire_backing_texture()); |
| 725 EXPECT_TRUE(texture->have_backing_texture()); | 725 EXPECT_TRUE(texture->have_backing_texture()); |
| 726 { | 726 { |
| 727 DebugScopedSetImplThreadAndMainThreadBlocked | 727 DebugScopedSetImplThreadAndMainThreadBlocked |
| 728 impl_thread_and_main_thread_blocked(&proxy_); | 728 impl_thread_and_main_thread_blocked(&proxy_); |
| 729 resource_manager->ClearAllMemory(resource_provider()); | 729 resource_manager->ClearAllMemory(resource_provider()); |
| 730 } | 730 } |
| 731 resource_manager.reset(); | 731 resource_manager = nullptr; |
| 732 | 732 |
| 733 EXPECT_FALSE(texture->can_acquire_backing_texture()); | 733 EXPECT_FALSE(texture->can_acquire_backing_texture()); |
| 734 EXPECT_FALSE(texture->have_backing_texture()); | 734 EXPECT_FALSE(texture->have_backing_texture()); |
| 735 } | 735 } |
| 736 | 736 |
| 737 TEST_F(PrioritizedResourceTest, TextureMovedToNewManager) { | 737 TEST_F(PrioritizedResourceTest, TextureMovedToNewManager) { |
| 738 scoped_ptr<PrioritizedResourceManager> resource_manager_one = | 738 scoped_ptr<PrioritizedResourceManager> resource_manager_one = |
| 739 CreateManager(1); | 739 CreateManager(1); |
| 740 scoped_ptr<PrioritizedResourceManager> resource_manager_two = | 740 scoped_ptr<PrioritizedResourceManager> resource_manager_two = |
| 741 CreateManager(1); | 741 CreateManager(1); |
| 742 scoped_ptr<PrioritizedResource> texture = | 742 scoped_ptr<PrioritizedResource> texture = |
| 743 resource_manager_one->CreateTexture(texture_size_, texture_format_); | 743 resource_manager_one->CreateTexture(texture_size_, texture_format_); |
| 744 | 744 |
| 745 // Texture is initially invalid, but it will become available. | 745 // Texture is initially invalid, but it will become available. |
| 746 EXPECT_FALSE(texture->have_backing_texture()); | 746 EXPECT_FALSE(texture->have_backing_texture()); |
| 747 | 747 |
| 748 texture->set_request_priority(100); | 748 texture->set_request_priority(100); |
| 749 PrioritizeTexturesAndBackings(resource_manager_one.get()); | 749 PrioritizeTexturesAndBackings(resource_manager_one.get()); |
| 750 | 750 |
| 751 EXPECT_TRUE(ValidateTexture(texture.get(), false)); | 751 EXPECT_TRUE(ValidateTexture(texture.get(), false)); |
| 752 EXPECT_TRUE(texture->can_acquire_backing_texture()); | 752 EXPECT_TRUE(texture->can_acquire_backing_texture()); |
| 753 EXPECT_TRUE(texture->have_backing_texture()); | 753 EXPECT_TRUE(texture->have_backing_texture()); |
| 754 | 754 |
| 755 texture->SetTextureManager(NULL); | 755 texture->SetTextureManager(NULL); |
| 756 { | 756 { |
| 757 DebugScopedSetImplThreadAndMainThreadBlocked | 757 DebugScopedSetImplThreadAndMainThreadBlocked |
| 758 impl_thread_and_main_thread_blocked(&proxy_); | 758 impl_thread_and_main_thread_blocked(&proxy_); |
| 759 resource_manager_one->ClearAllMemory(resource_provider()); | 759 resource_manager_one->ClearAllMemory(resource_provider()); |
| 760 } | 760 } |
| 761 resource_manager_one.reset(); | 761 resource_manager_one = nullptr; |
| 762 | 762 |
| 763 EXPECT_FALSE(texture->can_acquire_backing_texture()); | 763 EXPECT_FALSE(texture->can_acquire_backing_texture()); |
| 764 EXPECT_FALSE(texture->have_backing_texture()); | 764 EXPECT_FALSE(texture->have_backing_texture()); |
| 765 | 765 |
| 766 texture->SetTextureManager(resource_manager_two.get()); | 766 texture->SetTextureManager(resource_manager_two.get()); |
| 767 | 767 |
| 768 PrioritizeTexturesAndBackings(resource_manager_two.get()); | 768 PrioritizeTexturesAndBackings(resource_manager_two.get()); |
| 769 | 769 |
| 770 EXPECT_TRUE(ValidateTexture(texture.get(), false)); | 770 EXPECT_TRUE(ValidateTexture(texture.get(), false)); |
| 771 EXPECT_TRUE(texture->can_acquire_backing_texture()); | 771 EXPECT_TRUE(texture->can_acquire_backing_texture()); |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1108 resource_manager->MemoryVisibleAndNearbyBytes()); | 1108 resource_manager->MemoryVisibleAndNearbyBytes()); |
| 1109 } | 1109 } |
| 1110 | 1110 |
| 1111 DebugScopedSetImplThreadAndMainThreadBlocked | 1111 DebugScopedSetImplThreadAndMainThreadBlocked |
| 1112 impl_thread_and_main_thread_blocked(&proxy_); | 1112 impl_thread_and_main_thread_blocked(&proxy_); |
| 1113 resource_manager->ClearAllMemory(resource_provider()); | 1113 resource_manager->ClearAllMemory(resource_provider()); |
| 1114 } | 1114 } |
| 1115 | 1115 |
| 1116 } // namespace | 1116 } // namespace |
| 1117 } // namespace cc | 1117 } // namespace cc |
| OLD | NEW |