| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/resource_pool.h" | 5 #include "cc/resources/resource_pool.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
| 10 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 resource_provider_ = FakeResourceProvider::Create( | 26 resource_provider_ = FakeResourceProvider::Create( |
| 27 context_provider_.get(), shared_bitmap_manager_.get()); | 27 context_provider_.get(), shared_bitmap_manager_.get()); |
| 28 task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 28 task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| 29 resource_pool_ = | 29 resource_pool_ = |
| 30 ResourcePool::Create(resource_provider_.get(), task_runner_.get(), | 30 ResourcePool::Create(resource_provider_.get(), task_runner_.get(), |
| 31 ResourceProvider::TEXTURE_HINT_IMMUTABLE, | 31 ResourceProvider::TEXTURE_HINT_IMMUTABLE, |
| 32 ResourcePool::kDefaultExpirationDelay); | 32 ResourcePool::kDefaultExpirationDelay); |
| 33 } | 33 } |
| 34 | 34 |
| 35 protected: | 35 protected: |
| 36 void CheckAndReturnResource(Resource* resource) { | |
| 37 EXPECT_NE(nullptr, resource); | |
| 38 resource_pool_->ReleaseResource(resource); | |
| 39 resource_pool_->CheckBusyResources(); | |
| 40 } | |
| 41 | |
| 42 scoped_refptr<TestContextProvider> context_provider_; | 36 scoped_refptr<TestContextProvider> context_provider_; |
| 43 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; | 37 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; |
| 44 std::unique_ptr<ResourceProvider> resource_provider_; | 38 std::unique_ptr<ResourceProvider> resource_provider_; |
| 45 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 39 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
| 46 std::unique_ptr<ResourcePool> resource_pool_; | 40 std::unique_ptr<ResourcePool> resource_pool_; |
| 47 }; | 41 }; |
| 48 | 42 |
| 49 TEST_F(ResourcePoolTest, AcquireRelease) { | 43 TEST_F(ResourcePoolTest, AcquireRelease) { |
| 50 gfx::Size size(100, 100); | 44 gfx::Size size(100, 100); |
| 51 ResourceFormat format = RGBA_8888; | 45 ResourceFormat format = RGBA_8888; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 // Limits high enough to not be hit by this test. | 98 // Limits high enough to not be hit by this test. |
| 105 size_t bytes_limit = 10 * 1024 * 1024; | 99 size_t bytes_limit = 10 * 1024 * 1024; |
| 106 size_t count_limit = 100; | 100 size_t count_limit = 100; |
| 107 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); | 101 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); |
| 108 | 102 |
| 109 gfx::Size size(100, 100); | 103 gfx::Size size(100, 100); |
| 110 ResourceFormat format = RGBA_8888; | 104 ResourceFormat format = RGBA_8888; |
| 111 gfx::ColorSpace color_space1; | 105 gfx::ColorSpace color_space1; |
| 112 gfx::ColorSpace color_space2 = gfx::ColorSpace::CreateSRGB(); | 106 gfx::ColorSpace color_space2 = gfx::ColorSpace::CreateSRGB(); |
| 113 | 107 |
| 114 CheckAndReturnResource( | 108 Resource* resource = |
| 115 resource_pool_->AcquireResource(size, format, color_space1)); | 109 resource_pool_->AcquireResource(size, format, color_space1); |
| 110 resource_pool_->ReleaseResource(resource); |
| 111 resource_pool_->CheckBusyResources(); |
| 116 EXPECT_EQ(1u, resource_provider_->num_resources()); | 112 EXPECT_EQ(1u, resource_provider_->num_resources()); |
| 117 | 113 |
| 118 // Same size/format should re-use resource. | 114 // Same size/format should re-use resource. |
| 119 Resource* resource = | 115 resource = resource_pool_->AcquireResource(size, format, color_space1); |
| 120 resource_pool_->AcquireResource(size, format, color_space1); | |
| 121 EXPECT_EQ(1u, resource_provider_->num_resources()); | 116 EXPECT_EQ(1u, resource_provider_->num_resources()); |
| 122 CheckAndReturnResource(resource); | 117 resource_pool_->ReleaseResource(resource); |
| 118 resource_pool_->CheckBusyResources(); |
| 123 EXPECT_EQ(1u, resource_provider_->num_resources()); | 119 EXPECT_EQ(1u, resource_provider_->num_resources()); |
| 124 | 120 |
| 125 // Different size/format should allocate new resource. | 121 // Different size/format should allocate new resource. |
| 126 resource = resource_pool_->AcquireResource(gfx::Size(50, 50), LUMINANCE_8, | 122 resource = resource_pool_->AcquireResource(gfx::Size(50, 50), LUMINANCE_8, |
| 127 color_space1); | 123 color_space1); |
| 128 EXPECT_EQ(2u, resource_provider_->num_resources()); | 124 EXPECT_EQ(2u, resource_provider_->num_resources()); |
| 129 CheckAndReturnResource(resource); | 125 resource_pool_->ReleaseResource(resource); |
| 126 resource_pool_->CheckBusyResources(); |
| 130 EXPECT_EQ(2u, resource_provider_->num_resources()); | 127 EXPECT_EQ(2u, resource_provider_->num_resources()); |
| 131 | 128 |
| 132 // Different color space should allocate new resource. | 129 // Different color space should allocate new resource. |
| 133 resource = resource_pool_->AcquireResource(size, format, color_space2); | 130 resource = resource_pool_->AcquireResource(size, format, color_space2); |
| 134 EXPECT_EQ(3u, resource_provider_->num_resources()); | 131 EXPECT_EQ(3u, resource_provider_->num_resources()); |
| 135 CheckAndReturnResource(resource); | 132 resource_pool_->ReleaseResource(resource); |
| 133 resource_pool_->CheckBusyResources(); |
| 136 EXPECT_EQ(3u, resource_provider_->num_resources()); | 134 EXPECT_EQ(3u, resource_provider_->num_resources()); |
| 137 } | 135 } |
| 138 | 136 |
| 139 TEST_F(ResourcePoolTest, LostResource) { | 137 TEST_F(ResourcePoolTest, LostResource) { |
| 140 // Limits high enough to not be hit by this test. | 138 // Limits high enough to not be hit by this test. |
| 141 size_t bytes_limit = 10 * 1024 * 1024; | 139 size_t bytes_limit = 10 * 1024 * 1024; |
| 142 size_t count_limit = 100; | 140 size_t count_limit = 100; |
| 143 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); | 141 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); |
| 144 | 142 |
| 145 gfx::Size size(100, 100); | 143 gfx::Size size(100, 100); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 &total_invalidated_rect); | 310 &total_invalidated_rect); |
| 313 EXPECT_EQ(resource, reacquired_resource); | 311 EXPECT_EQ(resource, reacquired_resource); |
| 314 EXPECT_EQ(expected_total_invalidated_rect, total_invalidated_rect); | 312 EXPECT_EQ(expected_total_invalidated_rect, total_invalidated_rect); |
| 315 resource_pool_->ReleaseResource(reacquired_resource); | 313 resource_pool_->ReleaseResource(reacquired_resource); |
| 316 } | 314 } |
| 317 | 315 |
| 318 TEST_F(ResourcePoolTest, ReuseResource) { | 316 TEST_F(ResourcePoolTest, ReuseResource) { |
| 319 ResourceFormat format = RGBA_8888; | 317 ResourceFormat format = RGBA_8888; |
| 320 gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); | 318 gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); |
| 321 | 319 |
| 322 // Create unused resource with size 100x100. | 320 // Create unused resources with sizes close to 100, 100. |
| 323 CheckAndReturnResource( | 321 resource_pool_->ReleaseResource( |
| 324 resource_pool_->CreateResource(gfx::Size(100, 100), format, color_space)); | 322 resource_pool_->CreateResource(gfx::Size(99, 100), format, color_space)); |
| 323 resource_pool_->ReleaseResource( |
| 324 resource_pool_->CreateResource(gfx::Size(99, 99), format, color_space)); |
| 325 resource_pool_->ReleaseResource( |
| 326 resource_pool_->CreateResource(gfx::Size(100, 99), format, color_space)); |
| 327 resource_pool_->ReleaseResource( |
| 328 resource_pool_->CreateResource(gfx::Size(101, 101), format, color_space)); |
| 329 resource_pool_->CheckBusyResources(); |
| 325 | 330 |
| 326 // Try some cases that are too large, none should succeed. | 331 gfx::Size size(100, 100); |
| 327 EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(101, 100), format, | 332 Resource* resource = resource_pool_->ReuseResource(size, format, color_space); |
| 328 color_space)); | 333 EXPECT_EQ(nullptr, resource); |
| 329 EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 101), format, | 334 size = gfx::Size(100, 99); |
| 330 color_space)); | 335 resource = resource_pool_->ReuseResource(size, format, color_space); |
| 331 EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(90, 120), format, | 336 EXPECT_NE(nullptr, resource); |
| 332 color_space)); | 337 ASSERT_EQ(nullptr, resource_pool_->ReuseResource(size, format, color_space)); |
| 333 EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(120, 120), format, | 338 resource_pool_->ReleaseResource(resource); |
| 334 color_space)); | |
| 335 | |
| 336 // Try some cases that are more than 2x smaller than 100x100 in area and | |
| 337 // won't be re-used. | |
| 338 EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(49, 100), format, | |
| 339 color_space)); | |
| 340 EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 49), format, | |
| 341 color_space)); | |
| 342 EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(50, 50), format, | |
| 343 color_space)); | |
| 344 EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(70, 70), format, | |
| 345 color_space)); | |
| 346 | |
| 347 // Try some cases that are smaller than 100x100, but within 2x area. Reuse | |
| 348 // should succeed. | |
| 349 CheckAndReturnResource( | |
| 350 resource_pool_->ReuseResource(gfx::Size(50, 100), format, color_space)); | |
| 351 CheckAndReturnResource( | |
| 352 resource_pool_->ReuseResource(gfx::Size(100, 50), format, color_space)); | |
| 353 CheckAndReturnResource( | |
| 354 resource_pool_->ReuseResource(gfx::Size(71, 71), format, color_space)); | |
| 355 | |
| 356 // 100x100 is an exact match and should succeed. A subsequent request for | |
| 357 // the same size should fail (the resource is already in use). | |
| 358 Resource* resource = | |
| 359 resource_pool_->ReuseResource(gfx::Size(100, 100), format, color_space); | |
| 360 EXPECT_EQ(nullptr, resource_pool_->ReuseResource(gfx::Size(100, 100), format, | |
| 361 color_space)); | |
| 362 CheckAndReturnResource(resource); | |
| 363 } | 339 } |
| 364 | 340 |
| 365 TEST_F(ResourcePoolTest, MemoryStateSuspended) { | 341 TEST_F(ResourcePoolTest, MemoryStateSuspended) { |
| 366 // Limits high enough to not be hit by this test. | 342 // Limits high enough to not be hit by this test. |
| 367 size_t bytes_limit = 10 * 1024 * 1024; | 343 size_t bytes_limit = 10 * 1024 * 1024; |
| 368 size_t count_limit = 100; | 344 size_t count_limit = 100; |
| 369 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); | 345 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); |
| 370 | 346 |
| 371 gfx::Size size(100, 100); | 347 gfx::Size size(100, 100); |
| 372 ResourceFormat format = RGBA_8888; | 348 ResourceFormat format = RGBA_8888; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 413 resource_pool_ = | 389 resource_pool_ = |
| 414 ResourcePool::Create(resource_provider_.get(), task_runner_.get(), | 390 ResourcePool::Create(resource_provider_.get(), task_runner_.get(), |
| 415 ResourceProvider::TEXTURE_HINT_DEFAULT, | 391 ResourceProvider::TEXTURE_HINT_DEFAULT, |
| 416 base::TimeDelta::FromMilliseconds(100)); | 392 base::TimeDelta::FromMilliseconds(100)); |
| 417 resource = resource_pool_->AcquireResource(size, format, color_space); | 393 resource = resource_pool_->AcquireResource(size, format, color_space); |
| 418 EXPECT_FALSE(resource_provider_->IsImmutable(resource->id())); | 394 EXPECT_FALSE(resource_provider_->IsImmutable(resource->id())); |
| 419 resource_pool_->ReleaseResource(resource); | 395 resource_pool_->ReleaseResource(resource); |
| 420 } | 396 } |
| 421 | 397 |
| 422 } // namespace cc | 398 } // namespace cc |
| OLD | NEW |