| 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 }; | 42 }; |
| 43 | 43 |
| 44 TEST_F(ResourcePoolTest, AcquireRelease) { | 44 TEST_F(ResourcePoolTest, AcquireRelease) { |
| 45 gfx::Size size(100, 100); | 45 gfx::Size size(100, 100); |
| 46 ResourceFormat format = RGBA_8888; | 46 ResourceFormat format = RGBA_8888; |
| 47 Resource* resource = resource_pool_->AcquireResource(size, format); | 47 Resource* resource = resource_pool_->AcquireResource(size, format); |
| 48 EXPECT_EQ(size, resource->size()); | 48 EXPECT_EQ(size, resource->size()); |
| 49 EXPECT_EQ(format, resource->format()); | 49 EXPECT_EQ(format, resource->format()); |
| 50 EXPECT_TRUE(resource_provider_->CanLockForWrite(resource->id())); | 50 EXPECT_TRUE(resource_provider_->CanLockForWrite(resource->id())); |
| 51 | 51 |
| 52 resource_pool_->ReleaseResource(resource, 0u); | 52 resource_pool_->ReleaseResource(resource); |
| 53 } | 53 } |
| 54 | 54 |
| 55 TEST_F(ResourcePoolTest, AccountingSingleResource) { | 55 TEST_F(ResourcePoolTest, AccountingSingleResource) { |
| 56 // Limits high enough to not be hit by this test. | 56 // Limits high enough to not be hit by this test. |
| 57 size_t bytes_limit = 10 * 1024 * 1024; | 57 size_t bytes_limit = 10 * 1024 * 1024; |
| 58 size_t count_limit = 100; | 58 size_t count_limit = 100; |
| 59 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); | 59 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); |
| 60 | 60 |
| 61 gfx::Size size(100, 100); | 61 gfx::Size size(100, 100); |
| 62 ResourceFormat format = RGBA_8888; | 62 ResourceFormat format = RGBA_8888; |
| 63 size_t resource_bytes = | 63 size_t resource_bytes = |
| 64 ResourceUtil::UncheckedSizeInBytes<size_t>(size, format); | 64 ResourceUtil::UncheckedSizeInBytes<size_t>(size, format); |
| 65 Resource* resource = resource_pool_->AcquireResource(size, format); | 65 Resource* resource = resource_pool_->AcquireResource(size, format); |
| 66 | 66 |
| 67 EXPECT_EQ(resource_bytes, resource_pool_->GetTotalMemoryUsageForTesting()); | 67 EXPECT_EQ(resource_bytes, resource_pool_->GetTotalMemoryUsageForTesting()); |
| 68 EXPECT_EQ(resource_bytes, resource_pool_->memory_usage_bytes()); | 68 EXPECT_EQ(resource_bytes, resource_pool_->memory_usage_bytes()); |
| 69 EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting()); | 69 EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting()); |
| 70 EXPECT_EQ(1u, resource_pool_->resource_count()); | 70 EXPECT_EQ(1u, resource_pool_->resource_count()); |
| 71 EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting()); | 71 EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting()); |
| 72 | 72 |
| 73 resource_pool_->ReleaseResource(resource, 0u); | 73 resource_pool_->ReleaseResource(resource); |
| 74 EXPECT_EQ(resource_bytes, resource_pool_->GetTotalMemoryUsageForTesting()); | 74 EXPECT_EQ(resource_bytes, resource_pool_->GetTotalMemoryUsageForTesting()); |
| 75 EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting()); | 75 EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting()); |
| 76 EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting()); | 76 EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting()); |
| 77 | 77 |
| 78 resource_pool_->CheckBusyResources(); | 78 resource_pool_->CheckBusyResources(); |
| 79 EXPECT_EQ(resource_bytes, resource_pool_->GetTotalMemoryUsageForTesting()); | 79 EXPECT_EQ(resource_bytes, resource_pool_->GetTotalMemoryUsageForTesting()); |
| 80 EXPECT_EQ(0u, resource_pool_->memory_usage_bytes()); | 80 EXPECT_EQ(0u, resource_pool_->memory_usage_bytes()); |
| 81 EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting()); | 81 EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting()); |
| 82 EXPECT_EQ(0u, resource_pool_->resource_count()); | 82 EXPECT_EQ(0u, resource_pool_->resource_count()); |
| 83 EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting()); | 83 EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 94 TEST_F(ResourcePoolTest, SimpleResourceReuse) { | 94 TEST_F(ResourcePoolTest, SimpleResourceReuse) { |
| 95 // Limits high enough to not be hit by this test. | 95 // Limits high enough to not be hit by this test. |
| 96 size_t bytes_limit = 10 * 1024 * 1024; | 96 size_t bytes_limit = 10 * 1024 * 1024; |
| 97 size_t count_limit = 100; | 97 size_t count_limit = 100; |
| 98 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); | 98 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); |
| 99 | 99 |
| 100 gfx::Size size(100, 100); | 100 gfx::Size size(100, 100); |
| 101 ResourceFormat format = RGBA_8888; | 101 ResourceFormat format = RGBA_8888; |
| 102 | 102 |
| 103 Resource* resource = resource_pool_->AcquireResource(size, format); | 103 Resource* resource = resource_pool_->AcquireResource(size, format); |
| 104 resource_pool_->ReleaseResource(resource, 0u); | 104 resource_pool_->ReleaseResource(resource); |
| 105 resource_pool_->CheckBusyResources(); | 105 resource_pool_->CheckBusyResources(); |
| 106 EXPECT_EQ(1u, resource_provider_->num_resources()); | 106 EXPECT_EQ(1u, resource_provider_->num_resources()); |
| 107 | 107 |
| 108 // Same size/format should re-use resource. | 108 // Same size/format should re-use resource. |
| 109 resource = resource_pool_->AcquireResource(size, format); | 109 resource = resource_pool_->AcquireResource(size, format); |
| 110 EXPECT_EQ(1u, resource_provider_->num_resources()); | 110 EXPECT_EQ(1u, resource_provider_->num_resources()); |
| 111 resource_pool_->ReleaseResource(resource, 0u); | 111 resource_pool_->ReleaseResource(resource); |
| 112 resource_pool_->CheckBusyResources(); | 112 resource_pool_->CheckBusyResources(); |
| 113 EXPECT_EQ(1u, resource_provider_->num_resources()); | 113 EXPECT_EQ(1u, resource_provider_->num_resources()); |
| 114 | 114 |
| 115 // Different size/format should alloate new resource. | 115 // Different size/format should alloate new resource. |
| 116 resource = resource_pool_->AcquireResource(gfx::Size(50, 50), LUMINANCE_8); | 116 resource = resource_pool_->AcquireResource(gfx::Size(50, 50), LUMINANCE_8); |
| 117 EXPECT_EQ(2u, resource_provider_->num_resources()); | 117 EXPECT_EQ(2u, resource_provider_->num_resources()); |
| 118 resource_pool_->ReleaseResource(resource, 0u); | 118 resource_pool_->ReleaseResource(resource); |
| 119 resource_pool_->CheckBusyResources(); | 119 resource_pool_->CheckBusyResources(); |
| 120 EXPECT_EQ(2u, resource_provider_->num_resources()); | 120 EXPECT_EQ(2u, resource_provider_->num_resources()); |
| 121 } | 121 } |
| 122 | 122 |
| 123 TEST_F(ResourcePoolTest, LostResource) { | 123 TEST_F(ResourcePoolTest, LostResource) { |
| 124 // Limits high enough to not be hit by this test. | 124 // Limits high enough to not be hit by this test. |
| 125 size_t bytes_limit = 10 * 1024 * 1024; | 125 size_t bytes_limit = 10 * 1024 * 1024; |
| 126 size_t count_limit = 100; | 126 size_t count_limit = 100; |
| 127 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); | 127 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); |
| 128 | 128 |
| 129 gfx::Size size(100, 100); | 129 gfx::Size size(100, 100); |
| 130 ResourceFormat format = RGBA_8888; | 130 ResourceFormat format = RGBA_8888; |
| 131 | 131 |
| 132 Resource* resource = resource_pool_->AcquireResource(size, format); | 132 Resource* resource = resource_pool_->AcquireResource(size, format); |
| 133 EXPECT_EQ(1u, resource_provider_->num_resources()); | 133 EXPECT_EQ(1u, resource_provider_->num_resources()); |
| 134 | 134 |
| 135 resource_provider_->LoseResourceForTesting(resource->id()); | 135 resource_provider_->LoseResourceForTesting(resource->id()); |
| 136 resource_pool_->ReleaseResource(resource, 0u); | 136 resource_pool_->ReleaseResource(resource); |
| 137 resource_pool_->CheckBusyResources(); | 137 resource_pool_->CheckBusyResources(); |
| 138 EXPECT_EQ(0u, resource_provider_->num_resources()); | 138 EXPECT_EQ(0u, resource_provider_->num_resources()); |
| 139 } | 139 } |
| 140 | 140 |
| 141 TEST_F(ResourcePoolTest, BusyResourcesEventuallyFreed) { | 141 TEST_F(ResourcePoolTest, BusyResourcesEventuallyFreed) { |
| 142 // Limits high enough to not be hit by this test. | 142 // Limits high enough to not be hit by this test. |
| 143 size_t bytes_limit = 10 * 1024 * 1024; | 143 size_t bytes_limit = 10 * 1024 * 1024; |
| 144 size_t count_limit = 100; | 144 size_t count_limit = 100; |
| 145 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); | 145 resource_pool_->SetResourceUsageLimits(bytes_limit, count_limit); |
| 146 | 146 |
| 147 // Set a quick resource expiration delay so that this test doesn't take long | 147 // Set a quick resource expiration delay so that this test doesn't take long |
| 148 // to run. | 148 // to run. |
| 149 resource_pool_->SetResourceExpirationDelayForTesting( | 149 resource_pool_->SetResourceExpirationDelayForTesting( |
| 150 base::TimeDelta::FromMilliseconds(10)); | 150 base::TimeDelta::FromMilliseconds(10)); |
| 151 | 151 |
| 152 gfx::Size size(100, 100); | 152 gfx::Size size(100, 100); |
| 153 ResourceFormat format = RGBA_8888; | 153 ResourceFormat format = RGBA_8888; |
| 154 | 154 |
| 155 Resource* resource = resource_pool_->AcquireResource(size, format); | 155 Resource* resource = resource_pool_->AcquireResource(size, format); |
| 156 EXPECT_EQ(1u, resource_provider_->num_resources()); | 156 EXPECT_EQ(1u, resource_provider_->num_resources()); |
| 157 EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting()); | 157 EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting()); |
| 158 EXPECT_EQ(1u, resource_pool_->resource_count()); | 158 EXPECT_EQ(1u, resource_pool_->resource_count()); |
| 159 | 159 |
| 160 resource_pool_->ReleaseResource(resource, 0u); | 160 resource_pool_->ReleaseResource(resource); |
| 161 EXPECT_EQ(1u, resource_provider_->num_resources()); | 161 EXPECT_EQ(1u, resource_provider_->num_resources()); |
| 162 EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting()); | 162 EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting()); |
| 163 EXPECT_EQ(0u, resource_pool_->memory_usage_bytes()); | 163 EXPECT_EQ(0u, resource_pool_->memory_usage_bytes()); |
| 164 EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting()); | 164 EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting()); |
| 165 | 165 |
| 166 // Wait for our resource pool to evict resources. We expect resources to be | 166 // Wait for our resource pool to evict resources. We expect resources to be |
| 167 // released within 10 ms, give the thread up to 200. | 167 // released within 10 ms, give the thread up to 200. |
| 168 base::RunLoop run_loop; | 168 base::RunLoop run_loop; |
| 169 task_runner_->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(), | 169 task_runner_->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(), |
| 170 base::TimeDelta::FromMillisecondsD(200)); | 170 base::TimeDelta::FromMillisecondsD(200)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 188 | 188 |
| 189 gfx::Size size(100, 100); | 189 gfx::Size size(100, 100); |
| 190 ResourceFormat format = RGBA_8888; | 190 ResourceFormat format = RGBA_8888; |
| 191 | 191 |
| 192 Resource* resource = resource_pool_->AcquireResource(size, format); | 192 Resource* resource = resource_pool_->AcquireResource(size, format); |
| 193 EXPECT_EQ(1u, resource_provider_->num_resources()); | 193 EXPECT_EQ(1u, resource_provider_->num_resources()); |
| 194 EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting()); | 194 EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting()); |
| 195 EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting()); | 195 EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting()); |
| 196 EXPECT_EQ(1u, resource_pool_->resource_count()); | 196 EXPECT_EQ(1u, resource_pool_->resource_count()); |
| 197 | 197 |
| 198 resource_pool_->ReleaseResource(resource, 0u); | 198 resource_pool_->ReleaseResource(resource); |
| 199 EXPECT_EQ(1u, resource_provider_->num_resources()); | 199 EXPECT_EQ(1u, resource_provider_->num_resources()); |
| 200 EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting()); | 200 EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting()); |
| 201 EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting()); | 201 EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting()); |
| 202 EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting()); | 202 EXPECT_EQ(1u, resource_pool_->GetBusyResourceCountForTesting()); |
| 203 | 203 |
| 204 // Transfer the resource from the busy pool to the unused pool. | 204 // Transfer the resource from the busy pool to the unused pool. |
| 205 resource_pool_->CheckBusyResources(); | 205 resource_pool_->CheckBusyResources(); |
| 206 EXPECT_EQ(1u, resource_provider_->num_resources()); | 206 EXPECT_EQ(1u, resource_provider_->num_resources()); |
| 207 EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting()); | 207 EXPECT_EQ(40000u, resource_pool_->GetTotalMemoryUsageForTesting()); |
| 208 EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting()); | 208 EXPECT_EQ(1u, resource_pool_->GetTotalResourceCountForTesting()); |
| 209 EXPECT_EQ(0u, resource_pool_->resource_count()); | 209 EXPECT_EQ(0u, resource_pool_->resource_count()); |
| 210 EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting()); | 210 EXPECT_EQ(0u, resource_pool_->GetBusyResourceCountForTesting()); |
| 211 | 211 |
| 212 // Wait for our resource pool to evict resources. We expect resources to be | 212 // Wait for our resource pool to evict resources. We expect resources to be |
| 213 // released within 100 ms, give the thread up to 200. | 213 // released within 100 ms, give the thread up to 200. |
| 214 base::RunLoop run_loop; | 214 base::RunLoop run_loop; |
| 215 task_runner_->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(), | 215 task_runner_->PostDelayedTask(FROM_HERE, run_loop.QuitClosure(), |
| 216 base::TimeDelta::FromMillisecondsD(200)); | 216 base::TimeDelta::FromMillisecondsD(200)); |
| 217 run_loop.Run(); | 217 run_loop.Run(); |
| 218 | 218 |
| 219 EXPECT_EQ(0u, resource_provider_->num_resources()); | 219 EXPECT_EQ(0u, resource_provider_->num_resources()); |
| 220 EXPECT_EQ(0u, resource_pool_->GetTotalMemoryUsageForTesting()); | 220 EXPECT_EQ(0u, resource_pool_->GetTotalMemoryUsageForTesting()); |
| 221 } | 221 } |
| 222 | 222 |
| 223 TEST_F(ResourcePoolTest, UpdateContentId) { |
| 224 gfx::Size size(100, 100); |
| 225 ResourceFormat format = RGBA_8888; |
| 226 uint64_t content_id = 42; |
| 227 uint64_t new_content_id = 43; |
| 228 gfx::Rect new_invalidated_rect(20, 20, 10, 10); |
| 229 |
| 230 Resource* resource = resource_pool_->AcquireResource(size, format); |
| 231 resource_pool_->OnContentReplaced(resource->id(), content_id); |
| 232 resource_pool_->ReleaseResource(resource); |
| 233 resource_pool_->CheckBusyResources(); |
| 234 |
| 235 // Ensure that we can retrieve the resource based on |content_id|. |
| 236 gfx::Rect invalidated_rect; |
| 237 Resource* reacquired_resource = |
| 238 resource_pool_->TryAcquireResourceForPartialRaster( |
| 239 new_content_id, new_invalidated_rect, content_id, &invalidated_rect); |
| 240 EXPECT_EQ(resource, reacquired_resource); |
| 241 EXPECT_EQ(new_invalidated_rect, invalidated_rect); |
| 242 } |
| 243 |
| 244 TEST_F(ResourcePoolTest, UpdateContentIdAndInvalidatedRect) { |
| 245 gfx::Size size(100, 100); |
| 246 ResourceFormat format = RGBA_8888; |
| 247 uint64_t content_ids[] = {42, 43, 44}; |
| 248 gfx::Rect invalidated_rect(20, 20, 10, 10); |
| 249 gfx::Rect second_invalidated_rect(25, 25, 10, 10); |
| 250 gfx::Rect expected_total_invalidated_rect(20, 20, 15, 15); |
| 251 |
| 252 // Acquire a new resource with the first content id. |
| 253 Resource* resource = resource_pool_->AcquireResource(size, format); |
| 254 resource_pool_->OnContentReplaced(resource->id(), content_ids[0]); |
| 255 |
| 256 // Attempt to acquire this resource. It is in use, so its ID and invalidated |
| 257 // rect should be updated, but a new resource will be returned. |
| 258 gfx::Rect new_invalidated_rect; |
| 259 Resource* reacquired_resource = |
| 260 resource_pool_->TryAcquireResourceForPartialRaster( |
| 261 content_ids[1], invalidated_rect, content_ids[0], |
| 262 &new_invalidated_rect); |
| 263 EXPECT_EQ(nullptr, reacquired_resource); |
| 264 EXPECT_EQ(gfx::Rect(), new_invalidated_rect); |
| 265 |
| 266 // Release the original resource, returning it to the unused pool. |
| 267 resource_pool_->ReleaseResource(resource); |
| 268 resource_pool_->CheckBusyResources(); |
| 269 |
| 270 // Ensure that we cannot retrieve a resource based on the original content id. |
| 271 reacquired_resource = resource_pool_->TryAcquireResourceForPartialRaster( |
| 272 content_ids[1], invalidated_rect, content_ids[0], &new_invalidated_rect); |
| 273 EXPECT_EQ(nullptr, reacquired_resource); |
| 274 EXPECT_EQ(gfx::Rect(), new_invalidated_rect); |
| 275 |
| 276 // Ensure that we can retrieve the resource based on the second (updated) |
| 277 // content ID and that it has the expected invalidated rect. |
| 278 gfx::Rect total_invalidated_rect; |
| 279 reacquired_resource = resource_pool_->TryAcquireResourceForPartialRaster( |
| 280 content_ids[2], second_invalidated_rect, content_ids[1], |
| 281 &total_invalidated_rect); |
| 282 EXPECT_EQ(resource, reacquired_resource); |
| 283 EXPECT_EQ(expected_total_invalidated_rect, total_invalidated_rect); |
| 284 } |
| 285 |
| 223 } // namespace | 286 } // namespace |
| 224 } // namespace cc | 287 } // namespace cc |
| OLD | NEW |