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 resource_pool_->ReleaseResource(reacquired_resource); |
| 243 } |
| 244 |
| 245 TEST_F(ResourcePoolTest, UpdateContentIdAndInvalidatedRect) { |
| 246 gfx::Size size(100, 100); |
| 247 ResourceFormat format = RGBA_8888; |
| 248 uint64_t content_ids[] = {42, 43, 44}; |
| 249 gfx::Rect invalidated_rect(20, 20, 10, 10); |
| 250 gfx::Rect second_invalidated_rect(25, 25, 10, 10); |
| 251 gfx::Rect expected_total_invalidated_rect(20, 20, 15, 15); |
| 252 |
| 253 // Acquire a new resource with the first content id. |
| 254 Resource* resource = resource_pool_->AcquireResource(size, format); |
| 255 resource_pool_->OnContentReplaced(resource->id(), content_ids[0]); |
| 256 |
| 257 // Attempt to acquire this resource. It is in use, so its ID and invalidated |
| 258 // rect should be updated, but a new resource will be returned. |
| 259 gfx::Rect new_invalidated_rect; |
| 260 Resource* reacquired_resource = |
| 261 resource_pool_->TryAcquireResourceForPartialRaster( |
| 262 content_ids[1], invalidated_rect, content_ids[0], |
| 263 &new_invalidated_rect); |
| 264 EXPECT_EQ(nullptr, reacquired_resource); |
| 265 EXPECT_EQ(gfx::Rect(), new_invalidated_rect); |
| 266 |
| 267 // Release the original resource, returning it to the unused pool. |
| 268 resource_pool_->ReleaseResource(resource); |
| 269 resource_pool_->CheckBusyResources(); |
| 270 |
| 271 // Ensure that we cannot retrieve a resource based on the original content id. |
| 272 reacquired_resource = resource_pool_->TryAcquireResourceForPartialRaster( |
| 273 content_ids[1], invalidated_rect, content_ids[0], &new_invalidated_rect); |
| 274 EXPECT_EQ(nullptr, reacquired_resource); |
| 275 EXPECT_EQ(gfx::Rect(), new_invalidated_rect); |
| 276 |
| 277 // Ensure that we can retrieve the resource based on the second (updated) |
| 278 // content ID and that it has the expected invalidated rect. |
| 279 gfx::Rect total_invalidated_rect; |
| 280 reacquired_resource = resource_pool_->TryAcquireResourceForPartialRaster( |
| 281 content_ids[2], second_invalidated_rect, content_ids[1], |
| 282 &total_invalidated_rect); |
| 283 EXPECT_EQ(resource, reacquired_resource); |
| 284 EXPECT_EQ(expected_total_invalidated_rect, total_invalidated_rect); |
| 285 resource_pool_->ReleaseResource(reacquired_resource); |
| 286 } |
| 287 |
223 } // namespace | 288 } // namespace |
224 } // namespace cc | 289 } // namespace cc |
OLD | NEW |