OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/tiles/gpu_image_decode_controller.h" | 5 #include "cc/tiles/gpu_image_decode_controller.h" |
6 | 6 |
7 #include "cc/playback/draw_image.h" | 7 #include "cc/playback/draw_image.h" |
8 #include "cc/test/test_context_provider.h" | 8 #include "cc/test/test_context_provider.h" |
9 #include "cc/test/test_tile_task_runner.h" | 9 #include "cc/test/test_tile_task_runner.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 TEST(GpuImageDecodeControllerTest, GetTaskForImageSameImage) { | 43 TEST(GpuImageDecodeControllerTest, GetTaskForImageSameImage) { |
44 auto context_provider = TestContextProvider::Create(); | 44 auto context_provider = TestContextProvider::Create(); |
45 context_provider->BindToCurrentThread(); | 45 context_provider->BindToCurrentThread(); |
46 TestGpuImageDecodeController controller(context_provider.get()); | 46 TestGpuImageDecodeController controller(context_provider.get()); |
47 sk_sp<SkImage> image = CreateImage(100, 100); | 47 sk_sp<SkImage> image = CreateImage(100, 100); |
48 bool is_decomposable = true; | 48 bool is_decomposable = true; |
49 SkFilterQuality quality = kHigh_SkFilterQuality; | 49 SkFilterQuality quality = kHigh_SkFilterQuality; |
50 | 50 |
51 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 51 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
52 quality, | 52 quality, |
53 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); | 53 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
54 scoped_refptr<TileTask> task; | 54 scoped_refptr<TileTask> task; |
55 bool need_unref = controller.GetTaskForImageAndRef( | 55 bool need_unref = controller.GetTaskForImageAndRef( |
56 draw_image, ImageDecodeController::TracingInfo(), &task); | 56 draw_image, ImageDecodeController::TracingInfo(), &task); |
57 EXPECT_TRUE(need_unref); | 57 EXPECT_TRUE(need_unref); |
58 EXPECT_TRUE(task); | 58 EXPECT_TRUE(task); |
59 | 59 |
60 DrawImage another_draw_image( | 60 DrawImage another_draw_image( |
61 image, SkIRect::MakeWH(image->width(), image->height()), quality, | 61 image, SkIRect::MakeWH(image->width(), image->height()), quality, |
62 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); | 62 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); |
63 scoped_refptr<TileTask> another_task; | 63 scoped_refptr<TileTask> another_task; |
64 need_unref = controller.GetTaskForImageAndRef( | 64 need_unref = controller.GetTaskForImageAndRef( |
65 another_draw_image, ImageDecodeController::TracingInfo(), &another_task); | 65 another_draw_image, ImageDecodeController::TracingInfo(), &another_task); |
66 EXPECT_TRUE(need_unref); | 66 EXPECT_TRUE(need_unref); |
67 EXPECT_TRUE(task.get() == another_task.get()); | 67 EXPECT_TRUE(task.get() == another_task.get()); |
68 | 68 |
69 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 69 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
70 TestTileTaskRunner::ProcessTask(task.get()); | 70 TestTileTaskRunner::ProcessTask(task.get()); |
71 | 71 |
72 controller.UnrefImage(draw_image); | 72 controller.UnrefImage(draw_image); |
73 controller.UnrefImage(draw_image); | 73 controller.UnrefImage(draw_image); |
74 } | 74 } |
75 | 75 |
76 TEST(GpuImageDecodeControllerTest, GetTaskForImageSmallerScale) { | |
77 auto context_provider = TestContextProvider::Create(); | |
78 context_provider->BindToCurrentThread(); | |
79 TestGpuImageDecodeController controller(context_provider.get()); | |
80 sk_sp<SkImage> image = CreateImage(100, 100); | |
81 bool is_decomposable = true; | |
82 SkFilterQuality quality = kHigh_SkFilterQuality; | |
83 | |
84 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | |
85 quality, | |
86 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); | |
87 scoped_refptr<TileTask> task; | |
88 bool need_unref = controller.GetTaskForImageAndRef( | |
89 draw_image, ImageDecodeController::TracingInfo(), &task); | |
90 EXPECT_TRUE(need_unref); | |
91 EXPECT_TRUE(task); | |
92 | |
93 DrawImage another_draw_image( | |
94 image, SkIRect::MakeWH(image->width(), image->height()), quality, | |
95 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
96 scoped_refptr<TileTask> another_task; | |
97 need_unref = controller.GetTaskForImageAndRef( | |
98 another_draw_image, ImageDecodeController::TracingInfo(), &another_task); | |
99 EXPECT_TRUE(need_unref); | |
100 EXPECT_TRUE(task.get() == another_task.get()); | |
101 | |
102 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | |
103 TestTileTaskRunner::ProcessTask(task.get()); | |
104 | |
105 controller.UnrefImage(draw_image); | |
106 controller.UnrefImage(another_draw_image); | |
107 } | |
108 | |
109 TEST(GpuImageDecodeControllerTest, GetTaskForImageLowerQuality) { | |
110 auto context_provider = TestContextProvider::Create(); | |
111 context_provider->BindToCurrentThread(); | |
112 TestGpuImageDecodeController controller(context_provider.get()); | |
113 sk_sp<SkImage> image = CreateImage(100, 100); | |
114 bool is_decomposable = true; | |
115 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); | |
116 | |
117 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | |
118 kHigh_SkFilterQuality, matrix); | |
119 scoped_refptr<TileTask> task; | |
120 bool need_unref = controller.GetTaskForImageAndRef( | |
121 draw_image, ImageDecodeController::TracingInfo(), &task); | |
122 EXPECT_TRUE(need_unref); | |
123 EXPECT_TRUE(task); | |
124 | |
125 DrawImage another_draw_image(image, | |
126 SkIRect::MakeWH(image->width(), image->height()), | |
127 kLow_SkFilterQuality, matrix); | |
128 scoped_refptr<TileTask> another_task; | |
129 need_unref = controller.GetTaskForImageAndRef( | |
130 another_draw_image, ImageDecodeController::TracingInfo(), &another_task); | |
131 EXPECT_TRUE(need_unref); | |
132 EXPECT_TRUE(task.get() == another_task.get()); | |
133 | |
134 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | |
135 TestTileTaskRunner::ProcessTask(task.get()); | |
136 | |
137 controller.UnrefImage(draw_image); | |
138 controller.UnrefImage(another_draw_image); | |
139 } | |
140 | |
141 TEST(GpuImageDecodeControllerTest, GetTaskForImageDifferentImage) { | 76 TEST(GpuImageDecodeControllerTest, GetTaskForImageDifferentImage) { |
142 auto context_provider = TestContextProvider::Create(); | 77 auto context_provider = TestContextProvider::Create(); |
143 context_provider->BindToCurrentThread(); | 78 context_provider->BindToCurrentThread(); |
144 TestGpuImageDecodeController controller(context_provider.get()); | 79 TestGpuImageDecodeController controller(context_provider.get()); |
145 bool is_decomposable = true; | 80 bool is_decomposable = true; |
146 SkFilterQuality quality = kHigh_SkFilterQuality; | 81 SkFilterQuality quality = kHigh_SkFilterQuality; |
147 | 82 |
148 sk_sp<SkImage> first_image = CreateImage(100, 100); | 83 sk_sp<SkImage> first_image = CreateImage(100, 100); |
149 DrawImage first_draw_image( | 84 DrawImage first_draw_image( |
150 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | 85 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), |
(...skipping 18 matching lines...) Expand all Loading... |
169 | 104 |
170 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | 105 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); |
171 TestTileTaskRunner::ProcessTask(first_task.get()); | 106 TestTileTaskRunner::ProcessTask(first_task.get()); |
172 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | 107 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); |
173 TestTileTaskRunner::ProcessTask(second_task.get()); | 108 TestTileTaskRunner::ProcessTask(second_task.get()); |
174 | 109 |
175 controller.UnrefImage(first_draw_image); | 110 controller.UnrefImage(first_draw_image); |
176 controller.UnrefImage(second_draw_image); | 111 controller.UnrefImage(second_draw_image); |
177 } | 112 } |
178 | 113 |
179 TEST(GpuImageDecodeControllerTest, GetTaskForImageLargerScale) { | |
180 auto context_provider = TestContextProvider::Create(); | |
181 context_provider->BindToCurrentThread(); | |
182 TestGpuImageDecodeController controller(context_provider.get()); | |
183 bool is_decomposable = true; | |
184 SkFilterQuality quality = kHigh_SkFilterQuality; | |
185 | |
186 sk_sp<SkImage> first_image = CreateImage(100, 100); | |
187 DrawImage first_draw_image( | |
188 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
189 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
190 scoped_refptr<TileTask> first_task; | |
191 bool need_unref = controller.GetTaskForImageAndRef( | |
192 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); | |
193 EXPECT_TRUE(need_unref); | |
194 EXPECT_TRUE(first_task); | |
195 | |
196 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | |
197 TestTileTaskRunner::ProcessTask(first_task.get()); | |
198 | |
199 controller.UnrefImage(first_draw_image); | |
200 | |
201 DrawImage second_draw_image( | |
202 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
203 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); | |
204 scoped_refptr<TileTask> second_task; | |
205 need_unref = controller.GetTaskForImageAndRef( | |
206 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); | |
207 EXPECT_TRUE(need_unref); | |
208 EXPECT_TRUE(second_task); | |
209 EXPECT_TRUE(first_task.get() != second_task.get()); | |
210 | |
211 DrawImage third_draw_image( | |
212 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
213 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
214 scoped_refptr<TileTask> third_task; | |
215 need_unref = controller.GetTaskForImageAndRef( | |
216 third_draw_image, ImageDecodeController::TracingInfo(), &third_task); | |
217 EXPECT_TRUE(need_unref); | |
218 EXPECT_TRUE(third_task.get() == second_task.get()); | |
219 | |
220 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | |
221 TestTileTaskRunner::ProcessTask(second_task.get()); | |
222 | |
223 controller.UnrefImage(second_draw_image); | |
224 controller.UnrefImage(third_draw_image); | |
225 } | |
226 | |
227 TEST(GpuImageDecodeControllerTest, GetTaskForImageLargerScaleNoReuse) { | |
228 auto context_provider = TestContextProvider::Create(); | |
229 context_provider->BindToCurrentThread(); | |
230 TestGpuImageDecodeController controller(context_provider.get()); | |
231 bool is_decomposable = true; | |
232 SkFilterQuality quality = kHigh_SkFilterQuality; | |
233 | |
234 sk_sp<SkImage> first_image = CreateImage(100, 100); | |
235 DrawImage first_draw_image( | |
236 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
237 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
238 scoped_refptr<TileTask> first_task; | |
239 bool need_unref = controller.GetTaskForImageAndRef( | |
240 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); | |
241 EXPECT_TRUE(need_unref); | |
242 EXPECT_TRUE(first_task); | |
243 | |
244 DrawImage second_draw_image( | |
245 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
246 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); | |
247 scoped_refptr<TileTask> second_task; | |
248 need_unref = controller.GetTaskForImageAndRef( | |
249 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); | |
250 EXPECT_TRUE(need_unref); | |
251 EXPECT_TRUE(second_task); | |
252 EXPECT_TRUE(first_task.get() != second_task.get()); | |
253 | |
254 DrawImage third_draw_image( | |
255 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
256 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
257 scoped_refptr<TileTask> third_task; | |
258 need_unref = controller.GetTaskForImageAndRef( | |
259 third_draw_image, ImageDecodeController::TracingInfo(), &third_task); | |
260 EXPECT_TRUE(need_unref); | |
261 EXPECT_TRUE(third_task.get() == first_task.get()); | |
262 | |
263 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | |
264 TestTileTaskRunner::ProcessTask(first_task.get()); | |
265 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | |
266 TestTileTaskRunner::ProcessTask(second_task.get()); | |
267 | |
268 controller.UnrefImage(first_draw_image); | |
269 controller.UnrefImage(second_draw_image); | |
270 controller.UnrefImage(third_draw_image); | |
271 } | |
272 | |
273 TEST(GpuImageDecodeControllerTest, GetTaskForImageHigherQuality) { | |
274 auto context_provider = TestContextProvider::Create(); | |
275 context_provider->BindToCurrentThread(); | |
276 TestGpuImageDecodeController controller(context_provider.get()); | |
277 bool is_decomposable = true; | |
278 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); | |
279 | |
280 sk_sp<SkImage> first_image = CreateImage(100, 100); | |
281 DrawImage first_draw_image( | |
282 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
283 kLow_SkFilterQuality, matrix); | |
284 scoped_refptr<TileTask> first_task; | |
285 bool need_unref = controller.GetTaskForImageAndRef( | |
286 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); | |
287 EXPECT_TRUE(need_unref); | |
288 EXPECT_TRUE(first_task); | |
289 | |
290 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | |
291 TestTileTaskRunner::ProcessTask(first_task.get()); | |
292 | |
293 controller.UnrefImage(first_draw_image); | |
294 | |
295 DrawImage second_draw_image( | |
296 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
297 kHigh_SkFilterQuality, matrix); | |
298 scoped_refptr<TileTask> second_task; | |
299 need_unref = controller.GetTaskForImageAndRef( | |
300 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); | |
301 EXPECT_TRUE(need_unref); | |
302 EXPECT_TRUE(second_task); | |
303 EXPECT_TRUE(first_task.get() != second_task.get()); | |
304 | |
305 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | |
306 TestTileTaskRunner::ProcessTask(second_task.get()); | |
307 | |
308 controller.UnrefImage(second_draw_image); | |
309 } | |
310 | |
311 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) { | 114 TEST(GpuImageDecodeControllerTest, GetTaskForImageAlreadyDecodedAndLocked) { |
312 auto context_provider = TestContextProvider::Create(); | 115 auto context_provider = TestContextProvider::Create(); |
313 context_provider->BindToCurrentThread(); | 116 context_provider->BindToCurrentThread(); |
314 TestGpuImageDecodeController controller(context_provider.get()); | 117 TestGpuImageDecodeController controller(context_provider.get()); |
315 bool is_decomposable = true; | 118 bool is_decomposable = true; |
316 SkFilterQuality quality = kHigh_SkFilterQuality; | 119 SkFilterQuality quality = kHigh_SkFilterQuality; |
317 | 120 |
318 sk_sp<SkImage> image = CreateImage(100, 100); | 121 sk_sp<SkImage> image = CreateImage(100, 100); |
319 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 122 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
320 quality, | 123 quality, |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 TEST(GpuImageDecodeControllerTest, GetLargeDecodedImageForDraw) { | 401 TEST(GpuImageDecodeControllerTest, GetLargeDecodedImageForDraw) { |
599 auto context_provider = TestContextProvider::Create(); | 402 auto context_provider = TestContextProvider::Create(); |
600 context_provider->BindToCurrentThread(); | 403 context_provider->BindToCurrentThread(); |
601 TestGpuImageDecodeController controller(context_provider.get()); | 404 TestGpuImageDecodeController controller(context_provider.get()); |
602 bool is_decomposable = true; | 405 bool is_decomposable = true; |
603 SkFilterQuality quality = kHigh_SkFilterQuality; | 406 SkFilterQuality quality = kHigh_SkFilterQuality; |
604 | 407 |
605 sk_sp<SkImage> image = CreateImage(1, 24000); | 408 sk_sp<SkImage> image = CreateImage(1, 24000); |
606 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 409 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
607 quality, | 410 quality, |
608 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); | 411 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
609 scoped_refptr<TileTask> task; | 412 scoped_refptr<TileTask> task; |
610 bool need_unref = controller.GetTaskForImageAndRef( | 413 bool need_unref = controller.GetTaskForImageAndRef( |
611 draw_image, ImageDecodeController::TracingInfo(), &task); | 414 draw_image, ImageDecodeController::TracingInfo(), &task); |
612 EXPECT_TRUE(need_unref); | 415 EXPECT_TRUE(need_unref); |
613 EXPECT_TRUE(task); | 416 EXPECT_TRUE(task); |
614 | 417 |
615 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 418 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
616 TestTileTaskRunner::ProcessTask(task.get()); | 419 TestTileTaskRunner::ProcessTask(task.get()); |
617 | 420 |
618 // Must hold context lock before calling GetDecodedImageForDraw / | 421 // Must hold context lock before calling GetDecodedImageForDraw / |
(...skipping 17 matching lines...) Expand all Loading... |
636 TestGpuImageDecodeController controller(context_provider.get()); | 439 TestGpuImageDecodeController controller(context_provider.get()); |
637 bool is_decomposable = true; | 440 bool is_decomposable = true; |
638 SkFilterQuality quality = kHigh_SkFilterQuality; | 441 SkFilterQuality quality = kHigh_SkFilterQuality; |
639 | 442 |
640 controller.SetCachedItemLimitForTesting(0); | 443 controller.SetCachedItemLimitForTesting(0); |
641 controller.SetCachedBytesLimitForTesting(0); | 444 controller.SetCachedBytesLimitForTesting(0); |
642 | 445 |
643 sk_sp<SkImage> image = CreateImage(100, 100); | 446 sk_sp<SkImage> image = CreateImage(100, 100); |
644 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 447 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
645 quality, | 448 quality, |
646 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); | 449 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
647 | 450 |
648 scoped_refptr<TileTask> task; | 451 scoped_refptr<TileTask> task; |
649 bool need_unref = controller.GetTaskForImageAndRef( | 452 bool need_unref = controller.GetTaskForImageAndRef( |
650 draw_image, ImageDecodeController::TracingInfo(), &task); | 453 draw_image, ImageDecodeController::TracingInfo(), &task); |
651 EXPECT_FALSE(need_unref); | 454 EXPECT_FALSE(need_unref); |
652 EXPECT_FALSE(task); | 455 EXPECT_FALSE(task); |
653 | 456 |
654 // Must hold context lock before calling GetDecodedImageForDraw / | 457 // Must hold context lock before calling GetDecodedImageForDraw / |
655 // DrawWithImageFinished. | 458 // DrawWithImageFinished. |
656 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 459 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
657 DecodedDrawImage decoded_draw_image = | 460 DecodedDrawImage decoded_draw_image = |
658 controller.GetDecodedImageForDraw(draw_image); | 461 controller.GetDecodedImageForDraw(draw_image); |
659 EXPECT_TRUE(decoded_draw_image.image()); | 462 EXPECT_TRUE(decoded_draw_image.image()); |
660 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | 463 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); |
661 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); | 464 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); |
662 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | 465 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
663 | 466 |
664 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 467 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
665 } | 468 } |
666 | 469 |
667 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDrawLargerScale) { | 470 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) { |
668 auto context_provider = TestContextProvider::Create(); | 471 auto context_provider = TestContextProvider::Create(); |
669 context_provider->BindToCurrentThread(); | 472 context_provider->BindToCurrentThread(); |
670 TestGpuImageDecodeController controller(context_provider.get()); | 473 TestGpuImageDecodeController controller(context_provider.get()); |
671 bool is_decomposable = true; | 474 bool is_decomposable = true; |
672 SkFilterQuality quality = kHigh_SkFilterQuality; | 475 SkFilterQuality quality = kHigh_SkFilterQuality; |
673 | 476 |
| 477 controller.SetCachedItemLimitForTesting(0); |
| 478 controller.SetCachedBytesLimitForTesting(0); |
| 479 |
674 sk_sp<SkImage> image = CreateImage(100, 100); | 480 sk_sp<SkImage> image = CreateImage(100, 100); |
675 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 481 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
676 quality, | 482 quality, |
677 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | 483 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
| 484 |
678 scoped_refptr<TileTask> task; | 485 scoped_refptr<TileTask> task; |
679 bool need_unref = controller.GetTaskForImageAndRef( | 486 bool need_unref = controller.GetTaskForImageAndRef( |
680 draw_image, ImageDecodeController::TracingInfo(), &task); | 487 draw_image, ImageDecodeController::TracingInfo(), &task); |
681 EXPECT_TRUE(need_unref); | 488 EXPECT_FALSE(need_unref); |
682 EXPECT_TRUE(task); | 489 EXPECT_FALSE(task); |
683 | |
684 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | |
685 TestTileTaskRunner::ProcessTask(task.get()); | |
686 | |
687 DrawImage larger_draw_image( | |
688 image, SkIRect::MakeWH(image->width(), image->height()), quality, | |
689 CreateMatrix(SkSize::Make(1.5f, 1.5f), is_decomposable)); | |
690 scoped_refptr<TileTask> larger_task; | |
691 bool larger_need_unref = controller.GetTaskForImageAndRef( | |
692 larger_draw_image, ImageDecodeController::TracingInfo(), &larger_task); | |
693 EXPECT_TRUE(larger_need_unref); | |
694 EXPECT_TRUE(larger_task); | |
695 | |
696 TestTileTaskRunner::ProcessTask(larger_task->dependencies()[0].get()); | |
697 TestTileTaskRunner::ProcessTask(larger_task.get()); | |
698 | 490 |
699 // Must hold context lock before calling GetDecodedImageForDraw / | 491 // Must hold context lock before calling GetDecodedImageForDraw / |
700 // DrawWithImageFinished. | 492 // DrawWithImageFinished. |
701 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 493 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
702 DecodedDrawImage decoded_draw_image = | 494 DecodedDrawImage decoded_draw_image = |
703 controller.GetDecodedImageForDraw(draw_image); | 495 controller.GetDecodedImageForDraw(draw_image); |
704 EXPECT_TRUE(decoded_draw_image.image()); | 496 EXPECT_TRUE(decoded_draw_image.image()); |
705 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | 497 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); |
706 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); | 498 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); |
707 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | 499 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
708 | 500 |
709 DecodedDrawImage larger_decoded_draw_image = | 501 controller.SetCachedItemLimitForTesting(1000); |
710 controller.GetDecodedImageForDraw(larger_draw_image); | 502 controller.SetCachedBytesLimitForTesting(96 * 1024 * 1024); |
711 EXPECT_TRUE(larger_decoded_draw_image.image()); | |
712 EXPECT_TRUE(larger_decoded_draw_image.image()->isTextureBacked()); | |
713 EXPECT_FALSE(larger_decoded_draw_image.is_at_raster_decode()); | |
714 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | |
715 | 503 |
716 EXPECT_FALSE(decoded_draw_image.image() == larger_decoded_draw_image.image()); | 504 // Finish our draw after increasing the memory limit, image should be added to |
| 505 // cache. |
| 506 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
717 | 507 |
718 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 508 scoped_refptr<TileTask> another_task; |
| 509 bool another_task_needs_unref = controller.GetTaskForImageAndRef( |
| 510 draw_image, ImageDecodeController::TracingInfo(), &task); |
| 511 EXPECT_TRUE(another_task_needs_unref); |
| 512 EXPECT_FALSE(another_task); |
719 controller.UnrefImage(draw_image); | 513 controller.UnrefImage(draw_image); |
720 controller.DrawWithImageFinished(larger_draw_image, | |
721 larger_decoded_draw_image); | |
722 controller.UnrefImage(larger_draw_image); | |
723 } | 514 } |
724 | 515 |
725 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDrawHigherQuality) { | 516 TEST(GpuImageDecodeControllerTest, |
| 517 GetDecodedImageForDrawAtRasterDecodeMultipleTimes) { |
726 auto context_provider = TestContextProvider::Create(); | 518 auto context_provider = TestContextProvider::Create(); |
727 context_provider->BindToCurrentThread(); | 519 context_provider->BindToCurrentThread(); |
728 TestGpuImageDecodeController controller(context_provider.get()); | 520 TestGpuImageDecodeController controller(context_provider.get()); |
729 bool is_decomposable = true; | 521 bool is_decomposable = true; |
730 SkMatrix matrix = CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable); | 522 SkFilterQuality quality = kHigh_SkFilterQuality; |
| 523 |
| 524 controller.SetCachedItemLimitForTesting(0); |
| 525 controller.SetCachedBytesLimitForTesting(0); |
731 | 526 |
732 sk_sp<SkImage> image = CreateImage(100, 100); | 527 sk_sp<SkImage> image = CreateImage(100, 100); |
733 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 528 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
734 kLow_SkFilterQuality, matrix); | 529 quality, |
735 scoped_refptr<TileTask> task; | 530 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
736 bool need_unref = controller.GetTaskForImageAndRef( | |
737 draw_image, ImageDecodeController::TracingInfo(), &task); | |
738 EXPECT_TRUE(need_unref); | |
739 EXPECT_TRUE(task); | |
740 | |
741 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | |
742 TestTileTaskRunner::ProcessTask(task.get()); | |
743 | |
744 DrawImage higher_quality_draw_image( | |
745 image, SkIRect::MakeWH(image->width(), image->height()), | |
746 kHigh_SkFilterQuality, matrix); | |
747 scoped_refptr<TileTask> hq_task; | |
748 bool hq_needs_unref = controller.GetTaskForImageAndRef( | |
749 higher_quality_draw_image, ImageDecodeController::TracingInfo(), | |
750 &hq_task); | |
751 EXPECT_TRUE(hq_needs_unref); | |
752 EXPECT_TRUE(hq_task); | |
753 | |
754 TestTileTaskRunner::ProcessTask(hq_task->dependencies()[0].get()); | |
755 TestTileTaskRunner::ProcessTask(hq_task.get()); | |
756 | 531 |
757 // Must hold context lock before calling GetDecodedImageForDraw / | 532 // Must hold context lock before calling GetDecodedImageForDraw / |
758 // DrawWithImageFinished. | 533 // DrawWithImageFinished. |
759 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 534 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
760 DecodedDrawImage decoded_draw_image = | 535 DecodedDrawImage decoded_draw_image = |
761 controller.GetDecodedImageForDraw(draw_image); | 536 controller.GetDecodedImageForDraw(draw_image); |
762 EXPECT_TRUE(decoded_draw_image.image()); | 537 EXPECT_TRUE(decoded_draw_image.image()); |
763 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | 538 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); |
764 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); | |
765 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | |
766 | |
767 DecodedDrawImage larger_decoded_draw_image = | |
768 controller.GetDecodedImageForDraw(higher_quality_draw_image); | |
769 EXPECT_TRUE(larger_decoded_draw_image.image()); | |
770 EXPECT_TRUE(larger_decoded_draw_image.image()->isTextureBacked()); | |
771 EXPECT_FALSE(larger_decoded_draw_image.is_at_raster_decode()); | |
772 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | |
773 | |
774 EXPECT_FALSE(decoded_draw_image.image() == larger_decoded_draw_image.image()); | |
775 | |
776 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | |
777 controller.UnrefImage(draw_image); | |
778 controller.DrawWithImageFinished(higher_quality_draw_image, | |
779 larger_decoded_draw_image); | |
780 controller.UnrefImage(higher_quality_draw_image); | |
781 } | |
782 | |
783 TEST(GpuImageDecodeControllerTest, GetDecodedImageForDrawNegative) { | |
784 auto context_provider = TestContextProvider::Create(); | |
785 context_provider->BindToCurrentThread(); | |
786 TestGpuImageDecodeController controller(context_provider.get()); | |
787 bool is_decomposable = true; | |
788 SkFilterQuality quality = kHigh_SkFilterQuality; | |
789 | |
790 sk_sp<SkImage> image = CreateImage(100, 100); | |
791 DrawImage draw_image( | |
792 image, SkIRect::MakeWH(image->width(), image->height()), quality, | |
793 CreateMatrix(SkSize::Make(-0.5f, 0.5f), is_decomposable)); | |
794 scoped_refptr<TileTask> task; | |
795 bool need_unref = controller.GetTaskForImageAndRef( | |
796 draw_image, ImageDecodeController::TracingInfo(), &task); | |
797 EXPECT_TRUE(need_unref); | |
798 EXPECT_TRUE(task); | |
799 | |
800 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | |
801 TestTileTaskRunner::ProcessTask(task.get()); | |
802 | |
803 // Must hold context lock before calling GetDecodedImageForDraw / | |
804 // DrawWithImageFinished. | |
805 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | |
806 DecodedDrawImage decoded_draw_image = | |
807 controller.GetDecodedImageForDraw(draw_image); | |
808 EXPECT_TRUE(decoded_draw_image.image()); | |
809 EXPECT_EQ(decoded_draw_image.image()->width(), 50); | |
810 EXPECT_EQ(decoded_draw_image.image()->height(), 50); | |
811 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | |
812 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); | |
813 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | |
814 | |
815 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | |
816 controller.UnrefImage(draw_image); | |
817 } | |
818 | |
819 TEST(GpuImageDecodeControllerTest, GetLargeScaledDecodedImageForDraw) { | |
820 auto context_provider = TestContextProvider::Create(); | |
821 context_provider->BindToCurrentThread(); | |
822 TestGpuImageDecodeController controller(context_provider.get()); | |
823 bool is_decomposable = true; | |
824 SkFilterQuality quality = kHigh_SkFilterQuality; | |
825 | |
826 sk_sp<SkImage> image = CreateImage(1, 48000); | |
827 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | |
828 quality, | |
829 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
830 scoped_refptr<TileTask> task; | |
831 bool need_unref = controller.GetTaskForImageAndRef( | |
832 draw_image, ImageDecodeController::TracingInfo(), &task); | |
833 EXPECT_TRUE(need_unref); | |
834 EXPECT_TRUE(task); | |
835 | |
836 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | |
837 TestTileTaskRunner::ProcessTask(task.get()); | |
838 | |
839 // Must hold context lock before calling GetDecodedImageForDraw / | |
840 // DrawWithImageFinished. | |
841 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | |
842 DecodedDrawImage decoded_draw_image = | |
843 controller.GetDecodedImageForDraw(draw_image); | |
844 EXPECT_TRUE(decoded_draw_image.image()); | |
845 // The mip level scale should never go below 0 in any dimension. | |
846 EXPECT_EQ(1, decoded_draw_image.image()->width()); | |
847 EXPECT_EQ(24000, decoded_draw_image.image()->height()); | |
848 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); | |
849 EXPECT_FALSE(decoded_draw_image.is_at_raster_decode()); | |
850 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); | |
851 | |
852 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | |
853 controller.UnrefImage(draw_image); | |
854 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | |
855 } | |
856 | |
857 TEST(GpuImageDecodeControllerTest, AtRasterUsedDirectlyIfSpaceAllows) { | |
858 auto context_provider = TestContextProvider::Create(); | |
859 context_provider->BindToCurrentThread(); | |
860 TestGpuImageDecodeController controller(context_provider.get()); | |
861 bool is_decomposable = true; | |
862 SkFilterQuality quality = kHigh_SkFilterQuality; | |
863 | |
864 controller.SetCachedItemLimitForTesting(0); | |
865 controller.SetCachedBytesLimitForTesting(0); | |
866 | |
867 sk_sp<SkImage> image = CreateImage(100, 100); | |
868 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | |
869 quality, | |
870 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
871 | |
872 scoped_refptr<TileTask> task; | |
873 bool need_unref = controller.GetTaskForImageAndRef( | |
874 draw_image, ImageDecodeController::TracingInfo(), &task); | |
875 EXPECT_FALSE(need_unref); | |
876 EXPECT_FALSE(task); | |
877 | |
878 // Must hold context lock before calling GetDecodedImageForDraw / | |
879 // DrawWithImageFinished. | |
880 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | |
881 DecodedDrawImage decoded_draw_image = | |
882 controller.GetDecodedImageForDraw(draw_image); | |
883 EXPECT_TRUE(decoded_draw_image.image()); | |
884 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | |
885 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); | |
886 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | |
887 | |
888 controller.SetCachedItemLimitForTesting(1000); | |
889 controller.SetCachedBytesLimitForTesting(96 * 1024 * 1024); | |
890 | |
891 // Finish our draw after increasing the memory limit, image should be added to | |
892 // cache. | |
893 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | |
894 | |
895 scoped_refptr<TileTask> another_task; | |
896 bool another_task_needs_unref = controller.GetTaskForImageAndRef( | |
897 draw_image, ImageDecodeController::TracingInfo(), &task); | |
898 EXPECT_TRUE(another_task_needs_unref); | |
899 EXPECT_FALSE(another_task); | |
900 controller.UnrefImage(draw_image); | |
901 } | |
902 | |
903 TEST(GpuImageDecodeControllerTest, | |
904 GetDecodedImageForDrawAtRasterDecodeMultipleTimes) { | |
905 auto context_provider = TestContextProvider::Create(); | |
906 context_provider->BindToCurrentThread(); | |
907 TestGpuImageDecodeController controller(context_provider.get()); | |
908 bool is_decomposable = true; | |
909 SkFilterQuality quality = kHigh_SkFilterQuality; | |
910 | |
911 controller.SetCachedItemLimitForTesting(0); | |
912 controller.SetCachedBytesLimitForTesting(0); | |
913 | |
914 sk_sp<SkImage> image = CreateImage(100, 100); | |
915 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | |
916 quality, | |
917 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
918 | |
919 // Must hold context lock before calling GetDecodedImageForDraw / | |
920 // DrawWithImageFinished. | |
921 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | |
922 DecodedDrawImage decoded_draw_image = | |
923 controller.GetDecodedImageForDraw(draw_image); | |
924 EXPECT_TRUE(decoded_draw_image.image()); | |
925 EXPECT_TRUE(decoded_draw_image.image()->isTextureBacked()); | |
926 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); | 539 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); |
927 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); | 540 EXPECT_FALSE(controller.DiscardableIsLockedForTesting(draw_image)); |
928 | 541 |
929 DecodedDrawImage another_decoded_draw_image = | 542 DecodedDrawImage another_decoded_draw_image = |
930 controller.GetDecodedImageForDraw(draw_image); | 543 controller.GetDecodedImageForDraw(draw_image); |
931 EXPECT_EQ(decoded_draw_image.image()->uniqueID(), | 544 EXPECT_EQ(decoded_draw_image.image()->uniqueID(), |
932 another_decoded_draw_image.image()->uniqueID()); | 545 another_decoded_draw_image.image()->uniqueID()); |
933 | 546 |
934 controller.DrawWithImageFinished(draw_image, decoded_draw_image); | 547 controller.DrawWithImageFinished(draw_image, decoded_draw_image); |
935 controller.DrawWithImageFinished(draw_image, another_decoded_draw_image); | 548 controller.DrawWithImageFinished(draw_image, another_decoded_draw_image); |
936 } | 549 } |
937 | 550 |
938 TEST(GpuImageDecodeControllerTest, | 551 TEST(GpuImageDecodeControllerTest, |
939 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { | 552 GetLargeDecodedImageForDrawAtRasterDecodeMultipleTimes) { |
940 auto context_provider = TestContextProvider::Create(); | 553 auto context_provider = TestContextProvider::Create(); |
941 context_provider->BindToCurrentThread(); | 554 context_provider->BindToCurrentThread(); |
942 TestGpuImageDecodeController controller(context_provider.get()); | 555 TestGpuImageDecodeController controller(context_provider.get()); |
943 bool is_decomposable = true; | 556 bool is_decomposable = true; |
944 SkFilterQuality quality = kHigh_SkFilterQuality; | 557 SkFilterQuality quality = kHigh_SkFilterQuality; |
945 | 558 |
946 sk_sp<SkImage> image = CreateImage(1, 24000); | 559 sk_sp<SkImage> image = CreateImage(1, 24000); |
947 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), | 560 DrawImage draw_image(image, SkIRect::MakeWH(image->width(), image->height()), |
948 quality, | 561 quality, |
949 CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); | 562 CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); |
950 | 563 |
951 // Must hold context lock before calling GetDecodedImageForDraw / | 564 // Must hold context lock before calling GetDecodedImageForDraw / |
952 // DrawWithImageFinished. | 565 // DrawWithImageFinished. |
953 ContextProvider::ScopedContextLock context_lock(context_provider.get()); | 566 ContextProvider::ScopedContextLock context_lock(context_provider.get()); |
954 DecodedDrawImage decoded_draw_image = | 567 DecodedDrawImage decoded_draw_image = |
955 controller.GetDecodedImageForDraw(draw_image); | 568 controller.GetDecodedImageForDraw(draw_image); |
956 EXPECT_TRUE(decoded_draw_image.image()); | 569 EXPECT_TRUE(decoded_draw_image.image()); |
957 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); | 570 EXPECT_FALSE(decoded_draw_image.image()->isTextureBacked()); |
958 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); | 571 EXPECT_TRUE(decoded_draw_image.is_at_raster_decode()); |
959 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); | 572 EXPECT_TRUE(controller.DiscardableIsLockedForTesting(draw_image)); |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1106 } | 719 } |
1107 | 720 |
1108 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); | 721 TestTileTaskRunner::ProcessTask(task->dependencies()[0].get()); |
1109 TestTileTaskRunner::ProcessTask(task.get()); | 722 TestTileTaskRunner::ProcessTask(task.get()); |
1110 | 723 |
1111 // The image should be in our cache after un-ref. | 724 // The image should be in our cache after un-ref. |
1112 controller.UnrefImage(draw_image); | 725 controller.UnrefImage(draw_image); |
1113 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); | 726 DCHECK_GT(controller.GetBytesUsedForTesting(), 0u); |
1114 } | 727 } |
1115 | 728 |
1116 TEST(GpuImageDecodeControllerTest, OrphanedImagesFreeOnReachingZeroRefs) { | |
1117 auto context_provider = TestContextProvider::Create(); | |
1118 context_provider->BindToCurrentThread(); | |
1119 TestGpuImageDecodeController controller(context_provider.get()); | |
1120 bool is_decomposable = true; | |
1121 SkFilterQuality quality = kHigh_SkFilterQuality; | |
1122 | |
1123 // Create a downscaled image. | |
1124 sk_sp<SkImage> first_image = CreateImage(100, 100); | |
1125 DrawImage first_draw_image( | |
1126 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
1127 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
1128 scoped_refptr<TileTask> first_task; | |
1129 bool need_unref = controller.GetTaskForImageAndRef( | |
1130 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); | |
1131 EXPECT_TRUE(need_unref); | |
1132 EXPECT_TRUE(first_task); | |
1133 | |
1134 // The budget should account for exactly one image. | |
1135 EXPECT_EQ(controller.GetBytesUsedForTesting(), | |
1136 controller.GetDrawImageSizeForTesting(first_draw_image)); | |
1137 | |
1138 // Create a larger version of |first_image|, this should immediately free the | |
1139 // memory used by |first_image| for the smaller scale. | |
1140 DrawImage second_draw_image( | |
1141 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
1142 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); | |
1143 scoped_refptr<TileTask> second_task; | |
1144 need_unref = controller.GetTaskForImageAndRef( | |
1145 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); | |
1146 EXPECT_TRUE(need_unref); | |
1147 EXPECT_TRUE(second_task); | |
1148 EXPECT_TRUE(first_task.get() != second_task.get()); | |
1149 | |
1150 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | |
1151 TestTileTaskRunner::ProcessTask(second_task.get()); | |
1152 | |
1153 controller.UnrefImage(second_draw_image); | |
1154 | |
1155 // The budget should account for both images one image. | |
1156 EXPECT_EQ(controller.GetBytesUsedForTesting(), | |
1157 controller.GetDrawImageSizeForTesting(second_draw_image) + | |
1158 controller.GetDrawImageSizeForTesting(first_draw_image)); | |
1159 | |
1160 // Unref the first image, it was orphaned, so it should be immediately | |
1161 // deleted. | |
1162 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | |
1163 TestTileTaskRunner::ProcessTask(first_task.get()); | |
1164 controller.UnrefImage(first_draw_image); | |
1165 | |
1166 // The budget should account for exactly one image. | |
1167 EXPECT_EQ(controller.GetBytesUsedForTesting(), | |
1168 controller.GetDrawImageSizeForTesting(second_draw_image)); | |
1169 } | |
1170 | |
1171 TEST(GpuImageDecodeControllerTest, OrphanedZeroRefImagesImmediatelyDeleted) { | |
1172 auto context_provider = TestContextProvider::Create(); | |
1173 context_provider->BindToCurrentThread(); | |
1174 TestGpuImageDecodeController controller(context_provider.get()); | |
1175 bool is_decomposable = true; | |
1176 SkFilterQuality quality = kHigh_SkFilterQuality; | |
1177 | |
1178 // Create a downscaled image. | |
1179 sk_sp<SkImage> first_image = CreateImage(100, 100); | |
1180 DrawImage first_draw_image( | |
1181 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
1182 quality, CreateMatrix(SkSize::Make(0.5f, 0.5f), is_decomposable)); | |
1183 scoped_refptr<TileTask> first_task; | |
1184 bool need_unref = controller.GetTaskForImageAndRef( | |
1185 first_draw_image, ImageDecodeController::TracingInfo(), &first_task); | |
1186 EXPECT_TRUE(need_unref); | |
1187 EXPECT_TRUE(first_task); | |
1188 | |
1189 TestTileTaskRunner::ProcessTask(first_task->dependencies()[0].get()); | |
1190 TestTileTaskRunner::ProcessTask(first_task.get()); | |
1191 controller.UnrefImage(first_draw_image); | |
1192 | |
1193 // The budget should account for exactly one image. | |
1194 EXPECT_EQ(controller.GetBytesUsedForTesting(), | |
1195 controller.GetDrawImageSizeForTesting(first_draw_image)); | |
1196 | |
1197 // Create a larger version of |first_image|, this should immediately free the | |
1198 // memory used by |first_image| for the smaller scale. | |
1199 DrawImage second_draw_image( | |
1200 first_image, SkIRect::MakeWH(first_image->width(), first_image->height()), | |
1201 quality, CreateMatrix(SkSize::Make(1.0f, 1.0f), is_decomposable)); | |
1202 scoped_refptr<TileTask> second_task; | |
1203 need_unref = controller.GetTaskForImageAndRef( | |
1204 second_draw_image, ImageDecodeController::TracingInfo(), &second_task); | |
1205 EXPECT_TRUE(need_unref); | |
1206 EXPECT_TRUE(second_task); | |
1207 EXPECT_TRUE(first_task.get() != second_task.get()); | |
1208 | |
1209 TestTileTaskRunner::ProcessTask(second_task->dependencies()[0].get()); | |
1210 TestTileTaskRunner::ProcessTask(second_task.get()); | |
1211 | |
1212 controller.UnrefImage(second_draw_image); | |
1213 | |
1214 // The budget should account for exactly one image. | |
1215 EXPECT_EQ(controller.GetBytesUsedForTesting(), | |
1216 controller.GetDrawImageSizeForTesting(second_draw_image)); | |
1217 } | |
1218 | |
1219 TEST(GpuImageDecodeControllerTest, QualityCappedAtMedium) { | |
1220 auto context_provider = TestContextProvider::Create(); | |
1221 context_provider->BindToCurrentThread(); | |
1222 TestGpuImageDecodeController controller(context_provider.get()); | |
1223 sk_sp<SkImage> image = CreateImage(100, 100); | |
1224 bool is_decomposable = true; | |
1225 SkMatrix matrix = CreateMatrix(SkSize::Make(0.4f, 0.4f), is_decomposable); | |
1226 | |
1227 // Create an image with kLow_FilterQuality. | |
1228 DrawImage low_draw_image(image, | |
1229 SkIRect::MakeWH(image->width(), image->height()), | |
1230 kLow_SkFilterQuality, matrix); | |
1231 scoped_refptr<TileTask> low_task; | |
1232 bool need_unref = controller.GetTaskForImageAndRef( | |
1233 low_draw_image, ImageDecodeController::TracingInfo(), &low_task); | |
1234 EXPECT_TRUE(need_unref); | |
1235 EXPECT_TRUE(low_task); | |
1236 | |
1237 // Get the same image at kMedium_FilterQuality. We can't re-use low, so we | |
1238 // should get a new task/ref. | |
1239 DrawImage medium_draw_image(image, | |
1240 SkIRect::MakeWH(image->width(), image->height()), | |
1241 kMedium_SkFilterQuality, matrix); | |
1242 scoped_refptr<TileTask> medium_task; | |
1243 need_unref = controller.GetTaskForImageAndRef( | |
1244 medium_draw_image, ImageDecodeController::TracingInfo(), &medium_task); | |
1245 EXPECT_TRUE(need_unref); | |
1246 EXPECT_TRUE(medium_task.get()); | |
1247 EXPECT_FALSE(low_task.get() == medium_task.get()); | |
1248 | |
1249 // Get the same image at kHigh_FilterQuality. We should re-use medium. | |
1250 DrawImage large_draw_image(image, | |
1251 SkIRect::MakeWH(image->width(), image->height()), | |
1252 kHigh_SkFilterQuality, matrix); | |
1253 scoped_refptr<TileTask> large_task; | |
1254 need_unref = controller.GetTaskForImageAndRef( | |
1255 large_draw_image, ImageDecodeController::TracingInfo(), &large_task); | |
1256 EXPECT_TRUE(need_unref); | |
1257 EXPECT_TRUE(medium_task.get() == large_task.get()); | |
1258 | |
1259 TestTileTaskRunner::ProcessTask(low_task->dependencies()[0].get()); | |
1260 TestTileTaskRunner::ProcessTask(low_task.get()); | |
1261 TestTileTaskRunner::ProcessTask(medium_task->dependencies()[0].get()); | |
1262 TestTileTaskRunner::ProcessTask(medium_task.get()); | |
1263 | |
1264 controller.UnrefImage(low_draw_image); | |
1265 controller.UnrefImage(medium_draw_image); | |
1266 controller.UnrefImage(large_draw_image); | |
1267 } | |
1268 | |
1269 } // namespace | 729 } // namespace |
1270 } // namespace cc | 730 } // namespace cc |
OLD | NEW |