Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Side by Side Diff: cc/resources/resource_pool_unittest.cc

Issue 2110083004: Partial raster for GPU (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@partialuma2
Patch Set: Add missing resource cleanup to unit tests. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/resources/resource_pool.cc ('k') | cc/test/fake_raster_buffer_provider.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « cc/resources/resource_pool.cc ('k') | cc/test/fake_raster_buffer_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698