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 |